LyoKICogRE9TIFZpcnR1YWwgTWFjaGluZQogKgogKiBDb3B5cmlnaHQgMTk5OCBPdmUgS+V2ZW4KICovCgojaWYgZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChfX2kzODZfXykKCiNpbmNsdWRlICJjb25maWcuaCIKCi8qIGFwcGFyZW50bHkgRUxGIGltYWdlcyBhcmUgdXN1YWxseSBsb2FkZWQgaGlnaCBhbnl3YXkgKi8KI2lmbmRlZiBfX0VMRl9fCi8qIGlmIG5vdCwgZm9yY2UgZG9zbW9kIGF0IGhpZ2ggYWRkcmVzc2VzICovCmFzbSgiLm9yZyAweDExMDAwMCIpOwojZW5kaWYgLyogX19FTEZfXyAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2lmZGVmIEhBVkVfU1lTX01NQU5fSAojIGluY2x1ZGUgPHN5cy9tbWFuLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TWVNfVk04Nl9ICiMgaW5jbHVkZSA8c3lzL3ZtODYuaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZmRlZiBIQVZFX1NZU19QVFJBQ0VfSAojIGluY2x1ZGUgPHN5cy9wdHJhY2UuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19XQUlUX0gKIyBpbmNsdWRlIDxzeXMvd2FpdC5oPgojZW5kaWYKI2luY2x1ZGUgImRvc21vZC5oIgoKIC8qIEZJWE1FOiBoYWNrIGJlY2F1c2UgbGliYyB2bTg2IG1heSBiZSB0aGUgb2xkIHN5c2NhbGwgdmVyc2lvbiAqLwoKI2RlZmluZSBTWVNfdm04NiAgIDE2NgoKc3RhdGljIGlubGluZSBpbnQgdm04NnBsdXMoIGludCBmdW5jLCBzdHJ1Y3Qgdm04NnBsdXNfc3RydWN0ICpwdHIgKQp7CiAgICBpbnQgcmVzOwojaWZkZWYgX19QSUNfXwogICAgX19hc21fXyBfX3ZvbGF0aWxlX18oICJwdXNobCAlJWVieFxuXHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdmwgJTIsJSVlYnhcblx0IgogICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQgJDB4ODBcblx0IgogICAgICAgICAgICAgICAgICAgICAgICAgICJwb3BsICUlZWJ4IgogICAgICAgICAgICAgICAgICAgICAgICAgIDogIj1hIiAocmVzKQogICAgICAgICAgICAgICAgICAgICAgICAgIDogIjAiIChTWVNfdm04NiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZyIgKGZ1bmMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImMiIChwdHIpICk7CiNlbHNlCiAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW50ICQweDgwIgogICAgICAgICAgICAgICAgICAgICAgICAgOiAiPWEiIChyZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICA6ICIwIiAoU1lTX3ZtODYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiYiIgKGZ1bmMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiYyIgKHB0cikgKTsKI2VuZGlmICAvKiBfX1BJQ19fICovCiAgICBpZiAocmVzID49IDApIHJldHVybiByZXM7CiAgICBlcnJubyA9IC1yZXM7CiAgICByZXR1cm4gLTE7Cn0KCmludCBYUkVBRChpbnQgZmQsdm9pZCpidWYsaW50IHNpemUpIHsKIGludCByZXM7Cgogd2hpbGUgKDEpIHsKICByZXMgPSByZWFkKGZkLCBidWYsIHNpemUpOwogIGlmIChyZXM9PXNpemUpCiAgIHJldHVybiByZXM7CiAgaWYgKHJlcz09LTEpIHsKICAgaWYgKGVycm5vPT1FSU5UUikKICAgIGNvbnRpbnVlOwogICBwZXJyb3IoImRvc21vZCByZWFkIik7CiAgIHJldHVybiAtMTsKICB9CiAgaWYgKHJlcykgLyogZG9uJ3QgcHJpbnQgdGhlIEVPRiBjb25kaXRpb24gKi8KICAgZnByaW50ZihzdGRlcnIsImRvc21vZCByZWFkIG9ubHkgJWQgb2YgJWQgYnl0ZXMuXG4iLHJlcyxzaXplKTsKICByZXR1cm4gcmVzOwogfQp9CmludCBYV1JJVEUoaW50IGZkLHZvaWQqYnVmLGludCBzaXplKSB7CiBpbnQgcmVzOwoKIHdoaWxlICgxKSB7CiAgcmVzID0gd3JpdGUoZmQsIGJ1Ziwgc2l6ZSk7CiAgaWYgKHJlcz09c2l6ZSkKICAgcmV0dXJuIHJlczsKICBpZiAocmVzPT0tMSkgewogICBpZiAoZXJybm89PUVJTlRSKQogICAgY29udGludWU7CiAgIHBlcnJvcigiZG9zbW9kIHdyaXRlIik7CiAgIHJldHVybiAtMTsKICB9CiAgZnByaW50ZihzdGRlcnIsImRvc21vZCB3cml0ZSBvbmx5ICVkIG9mICVkIGJ5dGVzLlxuIixyZXMsc2l6ZSk7CiAgcmV0dXJuIHJlczsKIH0KfQoKdm9pZCBzZXRfdGltZXIoc3RydWN0IHRpbWV2YWwqdGltKQp7CiBzdHJ1Y3QgaXRpbWVydmFsIGN1cjsKCiBjdXIuaXRfaW50ZXJ2YWw9KnRpbTsKIGN1ci5pdF92YWx1ZT0qdGltOwogc2V0aXRpbWVyKElUSU1FUl9SRUFMLCZjdXIsTlVMTCk7Cn0KCnZvaWQgZ2V0X3RpbWVyKHN0cnVjdCB0aW1ldmFsKnRpbSkKewogc3RydWN0IGl0aW1lcnZhbCBjdXI7CgogZ2V0aXRpbWVyKElUSU1FUl9SRUFMLCZjdXIpOwogKnRpbT1jdXIuaXRfdmFsdWU7Cn0KCnZvbGF0aWxlIGludCBzaWdfcGVuZCxzaWdfZmF0YWw9MCxzaWdfYWxybT0wLHNpZ19jYj0wOwp2b2lkKmltZzsKc3RydWN0IHZtODZwbHVzX3N0cnVjdCBWTTg2OwoKdm9pZCBzaWdfaGFuZGxlcihpbnQgc2lnKQp7CiBpZiAoc2lnX3BlbmQpIGZwcmludGYoc3RkZXJyLCJET1NNT0QgcHJldmlvdXMgc2lnbmFsICVkIGxvc3RcbiIsc2lnX3BlbmQpOwogc2lnX3BlbmQ9c2lnOwogc2lnbmFsKHNpZyxzaWdfaGFuZGxlcik7Cn0KCnZvaWQgYmFkX2hhbmRsZXIoaW50IHNpZykKewogaWYgKHNpZyE9U0lHVEVSTSkgewogIGZwcmludGYoc3RkZXJyLCJET1NNT0QgY2F1Z2h0IGZhdGFsIHNpZ25hbCAlZFxuIixzaWcpOwogIGZwcmludGYoc3RkZXJyLCIoTGFzdCBrbm93biBWTTg2IENTOklQIHdhcyAlMDR4OiUwNGx4KVxuIixWTTg2LnJlZ3MuY3MsVk04Ni5yZWdzLmVpcCk7CiB9CiBzaWdfcGVuZD1zaWc7IHNpZ19mYXRhbCsrOwogc2lnbmFsKHNpZyxiYWRfaGFuZGxlcik7Cn0KCnZvaWQgYWxhcm1faGFuZGxlcihpbnQgc2lnKQp7CiBzaWdfYWxybSsrOwogc2lnbmFsKHNpZyxhbGFybV9oYW5kbGVyKTsKfQoKdm9pZCBjYl9oYW5kbGVyKGludCBzaWcpCnsKIHNpZ19jYisrOwogc2lnbmFsKHNpZyxjYl9oYW5kbGVyKTsKfQoKaW50IHNlbmRfc2lnbmFsKHZvaWQpCnsKIGludCByZXQ9c2lnX3BlbmQ7IHNpZ19wZW5kPTA7CiBpZiAoIXJldCkgewogIGlmIChzaWdfYWxybSkgewogICByZXQ9U0lHQUxSTTsgc2lnX2Fscm0tLTsKICB9IGVsc2UgewogICByZXQ9U0lHVVNSMjsgc2lnX2NiLS07CiAgfQogfQogaWYgKFhXUklURSgxLCZyZXQsc2l6ZW9mKHJldCkpIT1zaXplb2YocmV0KSkgcmV0dXJuIDE7CiBpZiAoc2lnX2ZhdGFsKSByZXR1cm4gMTsKIHJldHVybiAwOwp9CgppbnQgc2VuZF9lbnRlcl9yZXBseShpbnQgcmV0KQp7CiBpZiAoWFdSSVRFKDEsJnJldCxzaXplb2YocmV0KSkhPXNpemVvZihyZXQpKSByZXR1cm4gMTsKIGlmIChYV1JJVEUoMSwmVk04NixzaXplb2YoVk04NikpIT1zaXplb2YoVk04NikpIHJldHVybiAxOwogc3dpdGNoIChyZXQmMHhmZikgewogIGNhc2UgRE9TTU9EX1NJR05BTDoKICAgcmV0dXJuIHNlbmRfc2lnbmFsKCk7CiB9CiByZXR1cm4gMDsKfQoKaW50IG1haW4oaW50IGFyZ2MsY2hhcioqYXJndikKewogaW50IG1mZD1vcGVuKGFyZ3ZbMF0sT19SRFdSKTsKIHN0cnVjdCB0aW1ldmFsIHRpbTsKIG1wcm90X2luZm8gbXByOwogaW50IGZ1bmMscmV0LGlkbGU7CiBvZmZfdCBmb2ZzPTA7CiBwaWRfdCBwcGlkPWdldHBwaWQoKTsKIAovKiBmcHJpbnRmKHN0ZGVyciwibWFpbiBpcyBhdCAlMDhseCwgZmlsZSBpcyAlcywgZmQ9JWRcbiIsKHVuc2lnbmVkIGxvbmcpJm1haW4sYXJndlswXSxtZmQpOyAqLwogaWYgKG1mZDwwKSByZXR1cm4gMTsKLyogTWFwIGluIG91ciBET1MgaW1hZ2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UgKi8KIGlmIChhcmd2WzFdKSB7CiAgLyogVWxyaWNoIFdlaWdhbmQgc3VnZ2VzdGVkIG1hcHBpbmcgaW4gdGhlIERPUyBpbWFnZSBkaXJlY3RseSBmcm9tIHRoZSBXaW5lCiAgICAgYWRkcmVzcyBzcGFjZSAqLwogIGZvZnM9YXRvbChhcmd2WzFdKTsKICAvKiBsaW51eCBjdXJyZW50bHkgb25seSBhbGxvd3MgbWFwcGluZyBhIHByb2Nlc3MgbWVtb3J5IGlmIGl0J3MgYmVpbmcgcHRyYWNlZCAqLwogIC8qIExpbnVzIGRvZXNuJ3QgbGlrZSBpdCwgc28gdGhpcyBwcm9iYWJseSB3b24ndCB3b3JrIGluIHRoZSBmdXR1cmUgKi8KICAvKiBpdCBkb2Vzbid0IGV2ZW4gd29yayBmb3IgbWUgcmlnaHQgbm93ICovCiAga2lsbChwcGlkLFNJR1NUT1ApOwogIHB0cmFjZShQVFJBQ0VfQVRUQUNILHBwaWQsMCwwKTsKICB3YWl0cGlkKHBwaWQsTlVMTCwwKTsKIH0KIGltZz1tbWFwKE5VTEwsMHgxMTAwMDAsUFJPVF9FWEVDfFBST1RfUkVBRHxQUk9UX1dSSVRFLE1BUF9GSVhFRHxNQVBfU0hBUkVELG1mZCxmb2ZzKTsKIGlmIChhcmd2WzFdKSB7CiAgcHRyYWNlKFBUUkFDRV9ERVRBQ0gscHBpZCwwLDApOwogIGtpbGwocHBpZCxTSUdDT05UKTsKIH0KIGlmIChpbWc9PSh2b2lkKiktMSkgewogIGZwcmludGYoc3RkZXJyLCJET1MgbWVtb3J5IG1hcCBmYWlsZWQsIGVycm9yPSVzXG4iLHN0cmVycm9yKGVycm5vKSk7CiAgZnByaW50ZihzdGRlcnIsImluIGF0dGVtcHQgdG8gbWFwICVzLCBvZmZzZXQgJTA4bFgsIGxlbmd0aCAxMTAwMDAsIHRvIG9mZnNldCAwXG4iLGFyZ3ZbMF0sZm9mcyk7CiAgcmV0dXJuIDE7CiB9Ci8qIGluaXRpYWxpemUgc2lnbmFscyBhbmQgc3lzdGVtIHRpbWVyICovCiBzaWduYWwoU0lHSFVQLHNpZ19oYW5kbGVyKTsKIHNpZ25hbChTSUdJTlQsc2lnX2hhbmRsZXIpOwogc2lnbmFsKFNJR1VTUjEsc2lnX2hhbmRsZXIpOwogc2lnbmFsKFNJR1VTUjIsY2JfaGFuZGxlcik7CiBzaWduYWwoU0lHQUxSTSxhbGFybV9oYW5kbGVyKTsKCiBzaWduYWwoU0lHUVVJVCxiYWRfaGFuZGxlcik7CiBzaWduYWwoU0lHSUxMLGJhZF9oYW5kbGVyKTsKIHNpZ25hbChTSUdCVVMsYmFkX2hhbmRsZXIpOwogc2lnbmFsKFNJR0ZQRSxiYWRfaGFuZGxlcik7CiBzaWduYWwoU0lHU0VHVixiYWRfaGFuZGxlcik7CiBzaWduYWwoU0lHVEVSTSxiYWRfaGFuZGxlcik7CiNpZiAwCiB0aW0udHZfc2VjPTA7IHRpbS50dl91c2VjPTU0OTI1Owogc2V0X3RpbWVyKCZ0aW0pOwojZW5kaWYKLyogcmVwb3J0IGJhY2sgdG8gdGhlIG1haW4gcHJvZ3JhbSB0aGF0IHdlJ3JlIHJlYWR5ICovCiByZXQ9MzsgLyogZG9zbW9kIHByb3RvY29sIHJldmlzaW9uICovCiBYV1JJVEUoMSwmcmV0LHNpemVvZihyZXQpKTsKLyogY29udGV4dCBleGNoYW5nZSBsb29wICovCiBpZGxlPTA7CiBkbyB7CiAgaWYgKGlkbGUpIHsKICAgd2hpbGUgKDEpIHsKICAgIGludCByZXM7CiAgICAvKiBwYXJlbnQgaXMgaWRsZSwgdHJhbnNtaXQgYW55IHNpZ25hbHMgKHBhcnRpY3VsYXJseSBTSUdBTFJNKSAqLwogICAgaWYgKHNpZ19wZW5kfHxzaWdfYWxybXx8c2lnX2NiKSB7CiAgICAgcmV0PURPU01PRF9TSUdOQUw7CiAgICAgaWYgKFhXUklURSgxLCZyZXQsc2l6ZW9mKHJldCkpIT1zaXplb2YocmV0KSkgcmV0dXJuIDE7CiAgICAgcmV0PXNlbmRfc2lnbmFsKCk7CiAgICAgaWYgKHJldCkgcmV0dXJuIHJldDsKICAgICBicmVhazsKICAgIH0KICAgIHJlcyA9IHJlYWQoMCwmZnVuYyxzaXplb2YoZnVuYykpOwogICAgaWYgKHJlcz09c2l6ZW9mKGZ1bmMpKQogICAgIGJyZWFrOwogICAgaWYgKHJlcz09LTEpIHsKICAgICBpZiAoZXJybm89PUVJTlRSKQogICAgICBjb250aW51ZTsKICAgICBwZXJyb3IoImRvc21vZCByZWFkIik7CiAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBpZiAocmVzKSAvKiBkb24ndCBwcmludCB0aGUgRU9GIGNvbmRpdGlvbiAqLwogICAgIGZwcmludGYoc3RkZXJyLCJkb3Ntb2QgcmVhZCBvbmx5ICVkIG9mICVkIGJ5dGVzLlxuIixyZXMsc2l6ZW9mKGZ1bmMpKTsKICAgIHJldHVybiAxOwogICB9CiAgIHJldD1ET1NNT0RfTEVGVElETEU7CiAgIGlmIChYV1JJVEUoMSwmcmV0LHNpemVvZihyZXQpKSE9c2l6ZW9mKHJldCkpIHJldHVybiAxOwogICBpZGxlLS07CiAgfSBlbHNlCiAgIGlmIChYUkVBRCgwLCZmdW5jLHNpemVvZihmdW5jKSkhPXNpemVvZihmdW5jKSkgcmV0dXJuIDE7CiAgaWYgKGZ1bmM8MCkgYnJlYWs7CiAgc3dpdGNoIChmdW5jKSB7CiAgIGNhc2UgRE9TTU9EX1NFVF9USU1FUjogLyogcmV2IDEgKi8KICAgIGlmIChYUkVBRCgwLCZ0aW0sc2l6ZW9mKHRpbSkpIT1zaXplb2YodGltKSkgcmV0dXJuIDE7CiAgICBzZXRfdGltZXIoJnRpbSk7CiAgICAvKiBubyByZXNwb25zZSAqLwogICAgYnJlYWs7CiAgIGNhc2UgRE9TTU9EX0dFVF9USU1FUjogLyogcmV2IDEgKi8KICAgIGdldF90aW1lcigmdGltKTsKICAgIGlmIChYV1JJVEUoMSwmdGltLHNpemVvZih0aW0pKSE9c2l6ZW9mKHRpbSkpIHJldHVybiAxOwogICAgYnJlYWs7CiAgIGNhc2UgRE9TTU9EX01QUk9URUNUOiAvKiByZXYgMyAqLwogICAgaWYgKFhSRUFEKDAsJm1wcixzaXplb2YobXByKSkhPXNpemVvZihtcHIpKSByZXR1cm4gMTsKICAgIG1wcm90ZWN0KG1wci5hZGRyLG1wci5sZW4sbXByLnByb3QpOwogICAgLyogbm8gcmVzcG9uc2UgKi8KICAgIGJyZWFrOwogICBjYXNlIERPU01PRF9FTlRFUklETEU6IC8qIHJldiAzICovCiAgICBpZGxlKys7CiAgICBicmVhazsKICAgY2FzZSBET1NNT0RfTEVBVkVJRExFOiAvKiByZXYgMyAqLwogICAgYnJlYWs7CiAgIGNhc2UgRE9TTU9EX0VOVEVSOiAvKiByZXYgMCAqLwogICBkZWZhdWx0OgogICAgaWYgKFhSRUFEKDAsJlZNODYsc2l6ZW9mKFZNODYpKSE9c2l6ZW9mKFZNODYpKSByZXR1cm4gMTsKICAgIGlmIChzaWdfcGVuZHx8c2lnX2Fscm18fHNpZ19jYikgcmV0PURPU01PRF9TSUdOQUw7IGVsc2UKICAgICByZXQ9dm04NnBsdXMoZnVuYywmVk04Nik7CgogICAgcmV0PXNlbmRfZW50ZXJfcmVwbHkocmV0KTsKICAgIGlmIChyZXQpIHJldHVybiByZXQ7CiAgfQogfSB3aGlsZSAoMSk7CiByZXR1cm4gMDsKfQoKI2Vsc2UgLyogIWxpbnV4LWkzODYgKi8KaW50IG1haW4odm9pZCkge3JldHVybiAxO30KI2VuZGlmCg==