LyoKICogRE9TIEVYRSBsb2FkZXIKICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqLwoKI2lmbmRlZiBfX1dJTkVfRE9TRVhFX0gKI2RlZmluZSBfX1dJTkVfRE9TRVhFX0gKCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLyogcGlkX3QgKi8KI2luY2x1ZGUgIndpbmJhc2UuaCIgICAvKiBmb3IgTFBTVEFSVFVQSU5GTzMyQSAqLwojaW5jbHVkZSAid2lubnQuaCIgICAgIC8qIGZvciBQQ09OVEVYVCAqLwoKc3RydWN0IF9ET1NFVkVOVDsKCnR5cGVkZWYgc3RydWN0IF9ET1NUQVNLIHsKIFdPUkQgcHNwX3NlZywgcmV0dmFsOwogV09SRCBkcG1pX2ZsYWc7Cn0gRE9TVEFTSywgKkxQRE9TVEFTSzsKCiNkZWZpbmUgRE9TX1BSSU9SSVRZX1JFQUxUSU1FIDAgIC8qIElSUTAgKi8KI2RlZmluZSBET1NfUFJJT1JJVFlfS0VZQk9BUkQgMSAgLyogSVJRMSAqLwojZGVmaW5lIERPU19QUklPUklUWV9WR0EgICAgICAyICAvKiBJUlE5ICovCiNkZWZpbmUgRE9TX1BSSU9SSVRZX01PVVNFICAgIDUgIC8qIElSUTEyICovCiNkZWZpbmUgRE9TX1BSSU9SSVRZX1NFUklBTCAgIDEwIC8qIElSUTQgKi8KCiNpZiBkZWZpbmVkKGxpbnV4KSAmJiBkZWZpbmVkKF9faTM4Nl9fKQojZGVmaW5lIE1aX1NVUFBPUlRFRAojZW5kaWYgLyogbGludXgtaTM4NiAqLwoKI2RlZmluZSBWODZfRkxBRyAweDAwMDIwMDAwCgpleHRlcm4gQk9PTCBNWl9Mb2FkSW1hZ2UoIEhNT0RVTEUgbW9kdWxlLCBIQU5ETEUgaEZpbGUsIExQQ1NUUiBmaWxlbmFtZSApOwpleHRlcm4gQk9PTCBNWl9FeGVjKCBDT05URVhUODYgKmNvbnRleHQsIExQQ1NUUiBmaWxlbmFtZSwgQllURSBmdW5jLCBMUFZPSUQgcGFyYW1ibGsgKTsKZXh0ZXJuIHZvaWQgTVpfRXhpdCggQ09OVEVYVDg2ICpjb250ZXh0LCBCT09MIGNzX3BzcCwgV09SRCByZXR2YWwgKTsKZXh0ZXJuIExQRE9TVEFTSyBNWl9DdXJyZW50KCB2b2lkICk7CmV4dGVybiBMUERPU1RBU0sgTVpfQWxsb2NEUE1JVGFzayggdm9pZCApOwpleHRlcm4gaW50IERPU1ZNX0VudGVyKCBDT05URVhUODYgKmNvbnRleHQgKTsKZXh0ZXJuIHZvaWQgRE9TVk1fV2FpdCggaW50IHJlYWRfcGlwZSwgSEFORExFIGhPYmplY3QgKTsKZXh0ZXJuIHZvaWQgRE9TVk1fUXVldWVFdmVudCggaW50IGlycSwgaW50IHByaW9yaXR5LCB2b2lkICgqcmVsYXkpKENPTlRFWFQ4Niosdm9pZCopLCB2b2lkICpkYXRhICk7CmV4dGVybiB2b2lkIERPU1ZNX1BJQ19pb3BvcnRfb3V0KCBXT1JEIHBvcnQsIEJZVEUgdmFsICk7CmV4dGVybiB2b2lkIERPU1ZNX1NldFRpbWVyKCB1bnNpZ25lZCB0aWNrcyApOwpleHRlcm4gdW5zaWduZWQgRE9TVk1fR2V0VGltZXIoIHZvaWQgKTsKCiNlbmRpZiAvKiBfX1dJTkVfRE9TRVhFX0ggKi8K