LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9pODI1NC5oPgojaW5jbHVkZSA8YXNtL2libXBjLmg+CiNpbmNsdWRlIDxhc20vaW50ZXJydXB0Lmg+CgojZGVmaW5lIFRJTUVSMF9WQUxVRSAweDA0YWEgLyogMWtIeiAxLjkzMThNSHogLyAxMDAwICovCiNkZWZpbmUgVElNRVIyX1ZBTFVFIDB4MGE4ZSAvKiA0NDBIeiAqLwoKc3RhdGljIGludCB0aW1lcl9pbml0X2RvbmUgPSAwOwoKaW50IHRpbWVyX2luaXQodm9pZCkKewoJLyogaW5pdGlhbGl6ZSB0aW1lciAwIGFuZCAyCgkgKgoJICogVGltZXIgMCBpcyB1c2VkIHRvIGluY3JlbWVudCBzeXN0ZW1fdGljayAxMDAwIHRpbWVzL3NlYwoJICogVGltZXIgMSB3YXMgdXNlZCBmb3IgRFJBTSByZWZyZXNoIGluIGVhcmx5IFBDJ3MKCSAqIFRpbWVyIDIgaXMgdXNlZCB0byBkcml2ZSB0aGUgc3BlYWtlcgoJICogKHRvIHN0YXNydCBhIGJlZXA6IHdyaXRlIDMgdG8gcG9ydCAweDYxLAoJICogdG8gc3RvcCBpdCBhZ2Fpbjogd3JpdGUgMCkKCSAqLwoJb3V0YiAoUElUX0NNRF9DVFIwIHwgUElUX0NNRF9CT1RIIHwgUElUX0NNRF9NT0RFMiwKCSAgICAgIFBJVF9CQVNFICsgUElUX0NPTU1BTkQpOwoJb3V0YiAoVElNRVIwX1ZBTFVFICYgMHhmZiwgUElUX0JBU0UgKyBQSVRfVDApOwoJb3V0YiAoVElNRVIwX1ZBTFVFID4+IDgsIFBJVF9CQVNFICsgUElUX1QwKTsKCglvdXRiIChQSVRfQ01EX0NUUjIgfCBQSVRfQ01EX0JPVEggfCBQSVRfQ01EX01PREUzLAoJICAgICAgUElUX0JBU0UgKyBQSVRfQ09NTUFORCk7CglvdXRiIChUSU1FUjJfVkFMVUUgJiAweGZmLCBQSVRfQkFTRSArIFBJVF9UMik7CglvdXRiIChUSU1FUjJfVkFMVUUgPj4gOCwgUElUX0JBU0UgKyBQSVRfVDIpOwoKCWlycV9pbnN0YWxsX2hhbmRsZXIgKDAsIHRpbWVyX2lzciwgTlVMTCk7Cgl1bm1hc2tfaXJxICgwKTsKCgl0aW1lcl9pbml0X2RvbmUgPSAxOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgdTE2IHJlYWRfcGl0KHZvaWQpCnsKCXU4IGxvdzsKCglvdXRiIChQSVRfQ01EX0xBVENILCBQSVRfQkFTRSArIFBJVF9DT01NQU5EKTsKCWxvdyA9IGluYiAoUElUX0JBU0UgKyBQSVRfVDApOwoKCXJldHVybiAoKGluYiAoUElUX0JBU0UgKyBQSVRfVDApIDw8IDgpIHwgbG93KTsKfQoKLyogdGhpcyBpcyBub3QgdmVyeSBleGFjdCAqLwp2b2lkIF9fdWRlbGF5ICh1bnNpZ25lZCBsb25nIHVzZWMpCnsKCWludCBjb3VudGVyOwoJaW50IHdyYXBzOwoKCWlmICh0aW1lcl9pbml0X2RvbmUpCgl7CgkJY291bnRlciA9IHJlYWRfcGl0ICgpOwoJCXdyYXBzID0gdXNlYyAvIDEwMDA7CgkJdXNlYyA9IHVzZWMgJSAxMDAwOwoKCQl1c2VjICo9IDExOTQ7CgkJdXNlYyAvPSAxMDAwOwoJCXVzZWMgKz0gY291bnRlcjsKCgkJd2hpbGUgKHVzZWMgPiAxMTk0KSB7CgkJCXVzZWMgLT0gMTE5NDsKCQkJd3JhcHMrKzsKCQl9CgoJCXdoaWxlICgxKSB7CgkJCWludCBuZXdfY291bnQgPSByZWFkX3BpdCAoKTsKCgkJCWlmICgoKG5ld19jb3VudCA8IHVzZWMpICYmICF3cmFwcykgfHwgd3JhcHMgPCAwKQoJCQkJYnJlYWs7CgoJCQlpZiAobmV3X2NvdW50ID4gY291bnRlcikKCQkJCXdyYXBzLS07CgoJCQljb3VudGVyID0gbmV3X2NvdW50OwoJCX0KCX0KCn0K