LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9pODI1NC5oPgojaW5jbHVkZSA8YXNtL2libXBjLmg+CgoKc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgc3lzdGVtX3RpY2tzOwpzdGF0aWMgaW50IHRpbWVyX2luaXRfZG9uZSA9MDsKCnN0YXRpYyB2b2lkIHRpbWVyX2lzcih2b2lkICp1bnVzZWQpCnsKCXN5c3RlbV90aWNrcysrOwp9Cgp1bnNpZ25lZCBsb25nIGdldF9zeXN0ZW1fdGlja3Modm9pZCkKewoJcmV0dXJuIHN5c3RlbV90aWNrczsKfQoKI2RlZmluZSBUSU1FUjBfVkFMVUUgMHgwNGFhIC8qIDFrSHogMS45MzE4TUh6IC8gMTAwMCAqLwojZGVmaW5lIFRJTUVSMl9WQUxVRSAweDBhOGUgLyogNDQwSHogKi8KCmludCB0aW1lcl9pbml0KHZvaWQpCnsKCXN5c3RlbV90aWNrcyA9IDA7CgoJaXJxX2luc3RhbGxfaGFuZGxlcigwLCB0aW1lcl9pc3IsIE5VTEwpOwoKCS8qIGluaXRpYWxpemUgdGltZXIgMCBhbmQgMgoJICoKCSAqIFRpbWVyIDAgaXMgdXNlZCB0byBpbmNyZW1lbnQgc3lzdGVtX3RpY2sgMTAwMCB0aW1lcy9zZWMKCSAqIFRpbWVyIDEgd2FzIHVzZWQgZm9yIERSQU0gcmVmcmVzaCBpbiBlYXJseSBQQydzCgkgKiBUaW1lciAyIGlzIHVzZWQgdG8gZHJpdmUgdGhlIHNwZWFrZXIKCSAqICh0byBzdGFzcnQgYSBiZWVwOiB3cml0ZSAzIHRvIHBvcnQgMHg2MSwKCSAqIHRvIHN0b3AgaXQgYWdhaW46IHdyaXRlIDApCgkgKi8KCglvdXRiKFBJVF9DTURfQ1RSMHxQSVRfQ01EX0JPVEh8UElUX0NNRF9NT0RFMiwgUElUX0JBU0UgKyBQSVRfQ09NTUFORCk7CglvdXRiKFRJTUVSMF9WQUxVRSYweGZmLCBQSVRfQkFTRSArIFBJVF9UMCk7CglvdXRiKFRJTUVSMF9WQUxVRT4+OCwgUElUX0JBU0UgKyBQSVRfVDApOwoKCW91dGIoUElUX0NNRF9DVFIyfFBJVF9DTURfQk9USHxQSVRfQ01EX01PREUzLCBQSVRfQkFTRSArIFBJVF9DT01NQU5EKTsKCW91dGIoVElNRVIyX1ZBTFVFJjB4ZmYsIFBJVF9CQVNFICsgUElUX1QyKTsKCW91dGIoVElNRVIyX1ZBTFVFPj44LCBQSVRfQkFTRSArIFBJVF9UMik7CgoJdGltZXJfaW5pdF9kb25lID0gMTsKCglyZXR1cm4gMDsKfQoKCiNpZmRlZiBDRkdfVElNRVJfR0VORVJJQwoKLyogdGhlIHVuaXQgZm9yIHRoZXNlIGlzIENGR19IWiAqLwoKLyogRml4TWU6IGltcGxlbWVudCB0aGVzZSAqLwp2b2lkIHJlc2V0X3RpbWVyICh2b2lkKQp7CglzeXN0ZW1fdGlja3MgPSAwOwp9Cgp1bG9uZyBnZXRfdGltZXIgKHVsb25nIGJhc2UpCnsKCXJldHVybiAoc3lzdGVtX3RpY2tzIC0gYmFzZSk7Cn0KCnZvaWQgc2V0X3RpbWVyICh1bG9uZyB0KQp7CglzeXN0ZW1fdGlja3MgPSB0Owp9CgpzdGF0aWMgdTE2IHJlYWRfcGl0KHZvaWQpCnsKCXU4IGxvdzsKCW91dGIoUElUX0NNRF9MQVRDSCwgUElUX0JBU0UgKyBQSVRfQ09NTUFORCk7Cglsb3cgPSBpbmIoUElUX0JBU0UgKyBQSVRfVDApOwoJcmV0dXJuICgoaW5iKFBJVF9CQVNFICsgUElUX1QwKSA8PCA4KSB8IGxvdyk7Cn0KCi8qIHRoaXMgaXMgbm90IHZlcnkgZXhhY3QgKi8Kdm9pZCB1ZGVsYXkgKHVuc2lnbmVkIGxvbmcgdXNlYykKewoJaW50IGNvdW50ZXI7CglpbnQgd3JhcHM7CgoJaWYgKCF0aW1lcl9pbml0X2RvbmUpIHsKCQlyZXR1cm47Cgl9Cgljb3VudGVyID0gcmVhZF9waXQoKTsKCXdyYXBzID0gdXNlYy8xMDAwOwoJdXNlYyA9IHVzZWMlMTAwMDsKCgl1c2VjKj0xMTk0OwoJdXNlYy89MTAwMDsKCXVzZWMrPWNvdW50ZXI7CglpZiAodXNlYyA+IDExOTQpIHsKCQl1c2VjLT0xMTk0OwoJCXdyYXBzKys7Cgl9CgoJd2hpbGUgKDEpIHsKCQlpbnQgbmV3X2NvdW50ID0gcmVhZF9waXQoKTsKCgkJaWYgKCgobmV3X2NvdW50IDwgdXNlYykgJiYgIXdyYXBzKSB8fCB3cmFwcyA8IDApIHsKCQkJYnJlYWs7CgkJfQoKCQlpZiAobmV3X2NvdW50ID4gY291bnRlcikgewoJCQl3cmFwcy0tOwoJCX0KCQljb3VudGVyID0gbmV3X2NvdW50OwoJfQoKfQoKI2lmIDAKLyogdGhpcyBpcyBhIHZlcnNpb24gd2l0aCBkZWJ1ZyBvdXRwdXQgKi8Kdm9pZCBfdWRlbGF5ICh1bnNpZ25lZCBsb25nIHVzZWMpCnsKCWludCBjb3VudGVyOwoJaW50IHdyYXBzOwoKCWludCB1c2VjMSwgdXNlYzIsIHVzZWMzOwoJaW50IHdyYXBzMSwgd3JhcHMyLCB3cmFwczMsIHdyYXBzNDsKCWludCBjdHIxLCBjdHIyLCBjdHIzLCBuY3QxLCBuY3QyOwoJaW50IGk7Cgl1c2VjMT11c2VjOwoJaWYgKCF0aW1lcl9pbml0X2RvbmUpIHsKCQlyZXR1cm47Cgl9Cgljb3VudGVyID0gcmVhZF9waXQoKTsKCWN0cjEgPSBjb3VudGVyOwoJd3JhcHMgPSB1c2VjLzEwMDA7Cgl1c2VjID0gdXNlYyUxMDAwOwoKCXVzZWMyID0gdXNlYzsKCXdyYXBzMSA9IHdyYXBzOwoKCXVzZWMqPTExOTQ7Cgl1c2VjLz0xMDAwOwoJdXNlYys9Y291bnRlcjsKCWlmICh1c2VjID4gMTE5NCkgewoJCXVzZWMtPTExOTQ7CgkJd3JhcHMrKzsKCX0KCgl1c2VjMyA9IHVzZWM7Cgl3cmFwczIgPSB3cmFwczsKCgljdHIyID0gd3JhcHMzID0gbmN0MSA9IDQ3MTE7CgljdHIzID0gd3JhcHM0ID0gbmN0MiA9IDQ3MTE7CglpPTA7Cgl3aGlsZSAoMSkgewoJCWludCBuZXdfY291bnQgPSByZWFkX3BpdCgpOwoJCWkrKzsKCQlpZiAoKG5ld19jb3VudCA8IHVzZWMgJiYgIXdyYXBzKSB8fCB3cmFwcyA8IDApIHsKCQkJYnJlYWs7CgkJfQoKCQlpZiAobmV3X2NvdW50ID4gY291bnRlcikgewoJCQl3cmFwcy0tOwoJCX0KCQlpZiAoY3RyMj09NDcxMSkgewoJCQljdHIyID0gY291bnRlcjsKCQkJd3JhcHMzID0gd3JhcHM7CgkJCW5jdDEgPSBuZXdfY291bnQ7CgkJfSBlbHNlIHsKCQkJY3RyMyA9IGNvdW50ZXI7CgkJCXdyYXBzNCA9IHdyYXBzOwoJCQluY3QyID0gbmV3X2NvdW50OwoJCX0KCgkJY291bnRlciA9IG5ld19jb3VudDsKCX0KCglwcmludGYoInVkZWxheSglZClcbiIsIHVzZWMxKTsKCXByaW50ZigiY291bnRlciAlZFxuIiwgY3RyMSk7CglwcmludGYoIjE6IHdyYXBzICVkLCB1c2VjICVkXG4iLCB3cmFwczEsIHVzZWMyKTsKCXByaW50ZigiMjogd3JhcHMgJWQsIHVzZWMgJWRcbiIsIHdyYXBzMiwgdXNlYzMpOwoJcHJpbnRmKCJuZXdfY291bnRbMF0gJWQgY291bnRlciAlZCB3cmFwcyAlZFxuIiwgbmN0MSwgY3RyMiwgd3JhcHMzKTsKCXByaW50ZigibmV3X2NvdW50WyVkXSAlZCBjb3VudGVyICVkIHdyYXBzICVkXG4iLCBpLCBuY3QyLCBjdHIzLCB3cmFwczQpOwoKCXByaW50ZigiJWQgJWQgJWQgJWQgJWRcbiIsCgkgICAgICAgcmVhZF9waXQoKSwgcmVhZF9waXQoKSwgcmVhZF9waXQoKSwKCSAgICAgICByZWFkX3BpdCgpLCByZWFkX3BpdCgpKTsKfQojZW5kaWYKI2VuZGlmCg==