LyoKICogRE9TIFZpcnR1YWwgTWFjaGluZQogKgogKiBDb3B5cmlnaHQgMTk5OCBPdmUgS+V2ZW4KICovCgojaWZkZWYgbGludXgKCi8qIGZvcmNlIGRvc21vZCBhdCBoaWdoIGFkZHJlc3NlcyAqLwphc20oIi5vcmcgMHgxMTAwMDAiKTsKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiNpbmNsdWRlIDxzeXMvdm04Ni5oPgojaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KCi8qIEZJWE1FOiBoYWNrIGJlY2F1c2UgbGliYyB2bTg2IG1heSBiZSB0aGUgb2xkIHN5c2NhbGwgdmVyc2lvbiAqLwpzdGF0aWMgX19pbmxpbmVfXyBpbnQgdm04NnBsdXMoIGludCBmdW5jLCBzdHJ1Y3Qgdm04NnBsdXNfc3RydWN0ICpwdHIgKQp7CiAgICBpbnQgcmVzOwojaWZkZWYgX19QSUNfXwogICAgX19hc21fXyBfX3ZvbGF0aWxlX18oICJwdXNobCAlJWVieFxuXHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdmwgJTIsJSVlYnhcblx0IgogICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQgJDB4ODBcblx0IgogICAgICAgICAgICAgICAgICAgICAgICAgICJwb3BsICUlZWJ4IgogICAgICAgICAgICAgICAgICAgICAgICAgIDogIj1hIiAocmVzKQogICAgICAgICAgICAgICAgICAgICAgICAgIDogIjAiIChTWVNfdm04NiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZyIgKGZ1bmMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImMiIChwdHIpICk7CiNlbHNlCiAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW50ICQweDgwIgogICAgICAgICAgICAgICAgICAgICAgICAgOiAiPWEiIChyZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICA6ICIwIiAoU1lTX3ZtODYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiYiIgKGZ1bmMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiYyIgKHB0cikgKTsKI2VuZGlmICAvKiBfX1BJQ19fICovCiAgICBpZiAocmVzID49IDApIHJldHVybiByZXM7CiAgICBlcnJubyA9IC1yZXM7CiAgICByZXR1cm4gLTE7Cn0KCmludCBtYWluKGludCBhcmdjLGNoYXIqKmFyZ3YpCnsKIGludCBtZmQ9b3Blbihhcmd2WzBdLE9fUkRXUik7CiB2b2lkKmltZzsKIHN0cnVjdCB2bTg2cGx1c19zdHJ1Y3QgVk04NjsKIGludCBmdW5jLHJldDsKIAovKiBmcHJpbnRmKHN0ZGVyciwibWFpbiBpcyBhdCAlMDhseCwgZmlsZSBpcyAlcywgZmQ9JWRcbiIsKHVuc2lnbmVkIGxvbmcpJm1haW4sYXJndlswXSxtZmQpOyAqLwogaWYgKG1mZDwwKSByZXR1cm4gMTsKLyogTWFwIGluIG91ciBET1MgaW1hZ2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UgKi8KIGltZz1tbWFwKE5VTEwsMHgxMTAwMDAsUFJPVF9FWEVDfFBST1RfUkVBRHxQUk9UX1dSSVRFLE1BUF9GSVhFRHxNQVBfU0hBUkVELG1mZCwwKTsKIGlmIChpbWc9PSh2b2lkKiktMSkgewogIGZwcmludGYoc3RkZXJyLCJET1MgbWVtb3J5IG1hcCBmYWlsZWQsIGVycm9yPSVzXG4iLHN0cmVycm9yKGVycm5vKSk7CiAgcmV0dXJuIDE7CiB9Ci8qIGZwcmludGYoc3RkZXJyLCJTdWNjZXNzZnVsbHkgbWFwcGVkIERPUyBtZW1vcnksIGVudGVyaW5nIHZtODYgbG9vcFxuIik7ICovCi8qIGNvbnRleHQgZXhjaGFuZ2UgbG9vcCAqLwogZG8gewogIGlmIChyZWFkKDAsJmZ1bmMsc2l6ZW9mKGZ1bmMpKSE9c2l6ZW9mKGZ1bmMpKSByZXR1cm4gMTsKICBpZiAocmVhZCgwLCZWTTg2LHNpemVvZihWTTg2KSkhPXNpemVvZihWTTg2KSkgcmV0dXJuIDE7CiAgaWYgKGZ1bmM8MCkgYnJlYWs7CiAgcmV0PXZtODZwbHVzKGZ1bmMsJlZNODYpOwogIGlmICh3cml0ZSgxLCZyZXQsc2l6ZW9mKHJldCkpIT1zaXplb2YocmV0KSkgcmV0dXJuIDE7CiAgaWYgKHdyaXRlKDEsJlZNODYsc2l6ZW9mKFZNODYpKSE9c2l6ZW9mKFZNODYpKSByZXR1cm4gMTsKIH0gd2hpbGUgKDEpOwogcmV0dXJuIDA7Cn0KCiNlbHNlIC8qICFsaW51eCAqLwppbnQgbWFpbih2b2lkKSB7cmV0dXJuIDE7fQojZW5kaWYK