LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgogKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CiAqCiAqIChDKSBDb3B5cmlnaHQgMjAwMgogKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KICogQWxleCBadWVwa2UgPGF6dUBzeXNnby5kZT4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgovKgogKiBDUFUgc3BlY2lmaWMgY29kZQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbW1hbmQuaD4KI2luY2x1ZGUgPGFzbS9pbnRlcnJ1cHQuaD4KCmludCBjcHVfaW5pdF9mKHZvaWQpCnsKCS8qIGluaXRpYWxpemUgRlBVLCByZXNldCBFTSwgc2V0IE1QIGFuZCBORSAqLwoJYXNtICgiZm5pbml0XG4iIFwKCSAgICAgIm1vdmwgJWNyMCwgJWVheFxuIiBcCgkgICAgICJhbmRsICR+MHg0LCAlZWF4XG4iIFwKCSAgICAgIm9ybCAgJDB4MjIsICVlYXhcbiIgXAoJICAgICAibW92bCAlZWF4LCAlY3IwXG4iICk7CgoJcmV0dXJuIDA7Cn0KCmludCBjcHVfaW5pdF9yKHZvaWQpCnsKCS8qIEluaXRpYWxpemUgY29yZSBpbnRlcnJ1cHQgYW5kIGV4Y2VwdGlvbiBmdW5jdGlvbmFsaXR5IG9mIENQVSAqLwoJY3B1X2luaXRfaW50ZXJydXB0cyAoKTsKCXJldHVybiAwOwp9CgppbnQgZG9fcmVzZXQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKCXByaW50ZiAoInJlc2V0dGluZyAuLi5cbiIpOwoJdWRlbGF5KDUwMDAwKTsJCQkJLyogd2FpdCA1MCBtcyAqLwoJZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CglyZXNldF9jcHUoMCk7CgoJLypOT1RSRUFDSEVEKi8KCXJldHVybiAwOwp9Cgp2b2lkICBmbHVzaF9jYWNoZSAodW5zaWduZWQgbG9uZyBkdW1teTEsIHVuc2lnbmVkIGxvbmcgZHVtbXkyKQp7Cglhc20oIndiaW52ZFxuIik7CglyZXR1cm47Cn0KCnZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBnZW5lcmF0ZV9ncGYodm9pZCk7CgovKiBzZWdtZW50IDB4NzAgaXMgYW4gYXJiaXRyYXJ5IHNlZ21lbnQgd2hpY2ggZG9lcyBub3QgZXhpc3QgKi8KYXNtKCIuZ2xvYmwgZ2VuZXJhdGVfZ3BmXG4iCiAgICAiLmhpZGRlbiBnZW5lcmF0ZV9ncGZcbiIKICAgICIudHlwZSBnZW5lcmF0ZV9ncGYsIEBmdW5jdGlvblxuIgogICAgImdlbmVyYXRlX2dwZjpcbiIKICAgICJsam1wICAgJDB4NzAsICQweDQ3MTE0NzExXG4iKTsKCnZvaWQgX19yZXNldF9jcHUodWxvbmcgYWRkcikKewoJcHJpbnRmKCJSZXNldHRpbmcgdXNpbmcgaTM4NiBUcmlwbGUgRmF1bHRcbiIpOwoJc2V0X3ZlY3RvcigxMywgZ2VuZXJhdGVfZ3BmKTsgIC8qIGdlbmVyYWwgcHJvdGVjdGlvbiBmYXVsdCBoYW5kbGVyICovCglzZXRfdmVjdG9yKDgsIGdlbmVyYXRlX2dwZik7ICAgLyogZG91YmxlIGZhdWx0IGhhbmRsZXIgKi8KCWdlbmVyYXRlX2dwZigpOyAgICAgICAgICAgICAgICAvKiBzdGFydCB0aGUgc2hvdyAqLwp9CnZvaWQgcmVzZXRfY3B1KHVsb25nIGFkZHIpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX3Jlc2V0X2NwdSIpKSk7Cg==