LyoKICogRE9TIFZpcnR1YWwgTWFjaGluZQogKgogKiBDb3B5cmlnaHQgMTk5OCBPdmUgS+V2ZW4KICovCgojaWZkZWYgbGludXgKCi8qIGFwcGFyZW50bHkgRUxGIGltYWdlcyBhcmUgdXN1YWxseSBsb2FkZWQgaGlnaCBhbnl3YXkgKi8KI2lmbmRlZiBfX0VMRl9fCi8qIGlmIG5vdCwgZm9yY2UgZG9zbW9kIGF0IGhpZ2ggYWRkcmVzc2VzICovCmFzbSgiLm9yZyAweDExMDAwMCIpOwojZW5kaWYgX19FTEZfXwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiNpbmNsdWRlIDxzeXMvdm04Ni5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CiNpbmNsdWRlIDxzeXMvd2FpdC5oPgoKIC8qIEZJWE1FOiBoYWNrIGJlY2F1c2UgbGliYyB2bTg2IG1heSBiZSB0aGUgb2xkIHN5c2NhbGwgdmVyc2lvbiAqLwoKI2RlZmluZSBTWVNfdm04NiAgIDE2NgoKc3RhdGljIF9faW5saW5lX18gaW50IHZtODZwbHVzKCBpbnQgZnVuYywgc3RydWN0IHZtODZwbHVzX3N0cnVjdCAqcHRyICkKewogICAgaW50IHJlczsKI2lmZGVmIF9fUElDX18KICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCAicHVzaGwgJSVlYnhcblx0IgogICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZsICUyLCUlZWJ4XG5cdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ICQweDgwXG5cdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAicG9wbCAlJWVieCIKICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI9YSIgKHJlcykKICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIwIiAoU1lTX3ZtODYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImciIChmdW5jKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjIiAocHRyKSApOwojZWxzZQogICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImludCAkMHg4MCIKICAgICAgICAgICAgICAgICAgICAgICAgIDogIj1hIiAocmVzKQogICAgICAgICAgICAgICAgICAgICAgICAgOiAiMCIgKFNZU192bTg2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImIiIChmdW5jKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImMiIChwdHIpICk7CiNlbmRpZiAgLyogX19QSUNfXyAqLwogICAgaWYgKHJlcyA+PSAwKSByZXR1cm4gcmVzOwogICAgZXJybm8gPSAtcmVzOwogICAgcmV0dXJuIC0xOwp9CgppbnQgbWFpbihpbnQgYXJnYyxjaGFyKiphcmd2KQp7CiBpbnQgbWZkPW9wZW4oYXJndlswXSxPX1JEV1IpOwogdm9pZCppbWc7CiBzdHJ1Y3Qgdm04NnBsdXNfc3RydWN0IFZNODY7CiBpbnQgZnVuYyxyZXQ7CiBvZmZfdCBmb2ZzPTA7CiBwaWRfdCBwcGlkPWdldHBwaWQoKTsKIAovKiBmcHJpbnRmKHN0ZGVyciwibWFpbiBpcyBhdCAlMDhseCwgZmlsZSBpcyAlcywgZmQ9JWRcbiIsKHVuc2lnbmVkIGxvbmcpJm1haW4sYXJndlswXSxtZmQpOyAqLwogaWYgKG1mZDwwKSByZXR1cm4gMTsKLyogTWFwIGluIG91ciBET1MgaW1hZ2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UgKi8KIGlmIChhcmd2WzFdKSB7CiAgLyogVWxyaWNoIFdlaWdhbmQgc3VnZ2VzdGVkIG1hcHBpbmcgaW4gdGhlIERPUyBpbWFnZSBkaXJlY3RseSBmcm9tIHRoZSBXaW5lCiAgICAgYWRkcmVzcyBzcGFjZSAqLwogIGZvZnM9YXRvbChhcmd2WzFdKTsKICAvKiBsaW51eCBjdXJyZW50bHkgb25seSBhbGxvd3MgbWFwcGluZyBhIHByb2Nlc3MgbWVtb3J5IGlmIGl0J3MgYmVpbmcgcHRyYWNlZCAqLwogIC8qIExpbnVzIGRvZXNuJ3QgbGlrZSBpdCwgc28gdGhpcyBwcm9iYWJseSB3b24ndCB3b3JrIGluIHRoZSBmdXR1cmUgKi8KICAvKiBpdCBkb2Vzbid0IGV2ZW4gd29yayBmb3IgbWUgcmlnaHQgbm93ICovCiAgcHRyYWNlKFBUUkFDRV9BVFRBQ0gscHBpZCwwLDApOwogIGtpbGwocHBpZCxTSUdTVE9QKTsKICB3YWl0cGlkKHBwaWQsTlVMTCwwKTsKIH0KIGltZz1tbWFwKE5VTEwsMHgxMTAwMDAsUFJPVF9FWEVDfFBST1RfUkVBRHxQUk9UX1dSSVRFLE1BUF9GSVhFRHxNQVBfU0hBUkVELG1mZCxmb2ZzKTsKIGlmIChhcmd2WzFdKSB7CiAgcHRyYWNlKFBUUkFDRV9ERVRBQ0gscHBpZCwwLDApOwogIGtpbGwocHBpZCxTSUdDT05UKTsKIH0KIGlmIChpbWc9PSh2b2lkKiktMSkgewogIGZwcmludGYoc3RkZXJyLCJET1MgbWVtb3J5IG1hcCBmYWlsZWQsIGVycm9yPSVzXG4iLHN0cmVycm9yKGVycm5vKSk7CiAgZnByaW50ZihzdGRlcnIsImluIGF0dGVtcHQgdG8gbWFwICVzLCBvZmZzZXQgJTA4bFgsIGxlbmd0aCAxMTAwMDAsIHRvIG9mZnNldCAwXG4iLGFyZ3ZbMF0sZm9mcyk7CiAgcmV0dXJuIDE7CiB9Ci8qIGZwcmludGYoc3RkZXJyLCJTdWNjZXNzZnVsbHkgbWFwcGVkIERPUyBtZW1vcnksIGVudGVyaW5nIHZtODYgbG9vcFxuIik7ICovCi8qIHJlcG9ydCBiYWNrIHRvIHRoZSBtYWluIHByb2dyYW0gdGhhdCB3ZSdyZSByZWFkeSAqLwogcmV0PTA7CiB3cml0ZSgxLCZyZXQsc2l6ZW9mKHJldCkpOwovKiBjb250ZXh0IGV4Y2hhbmdlIGxvb3AgKi8KIGRvIHsKICBpZiAocmVhZCgwLCZmdW5jLHNpemVvZihmdW5jKSkhPXNpemVvZihmdW5jKSkgcmV0dXJuIDE7CiAgaWYgKHJlYWQoMCwmVk04NixzaXplb2YoVk04NikpIT1zaXplb2YoVk04NikpIHJldHVybiAxOwogIGlmIChmdW5jPDApIGJyZWFrOwogIHJldD12bTg2cGx1cyhmdW5jLCZWTTg2KTsKICBpZiAod3JpdGUoMSwmcmV0LHNpemVvZihyZXQpKSE9c2l6ZW9mKHJldCkpIHJldHVybiAxOwogIGlmICh3cml0ZSgxLCZWTTg2LHNpemVvZihWTTg2KSkhPXNpemVvZihWTTg2KSkgcmV0dXJuIDE7CiB9IHdoaWxlICgxKTsKIHJldHVybiAwOwp9CgojZWxzZSAvKiAhbGludXggKi8KaW50IG1haW4odm9pZCkge3JldHVybiAxO30KI2VuZGlmCg==