LyoKICogRE9TIFZpcnR1YWwgTWFjaGluZQogKgogKiBDb3B5cmlnaHQgMTk5OCBPdmUgS+V2ZW4KICoKICogVGhpcyBjb2RlIGhhc24ndCBiZWVuIGNvbXBsZXRlbHkgY2xlYW5lZCB1cCB5ZXQuCiAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzaWduYWwuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KCiNpbmNsdWRlICJ3aW5lL3dpbmJhc2UxNi5oIgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAid2lubnQuaCIKI2luY2x1ZGUgIm1zZG9zLmgiCiNpbmNsdWRlICJmaWxlLmgiCiNpbmNsdWRlICJtaXNjZW11LmgiCiNpbmNsdWRlICJkb3NleGUuaCIKI2luY2x1ZGUgImRvc21vZC5oIgojaW5jbHVkZSAic3RhY2tmcmFtZS5oIgojaW5jbHVkZSAiZGVidWd0b29scy5oIgoKREVDTEFSRV9ERUJVR19DSEFOTkVMKGludCkKREVDTEFSRV9ERUJVR19DSEFOTkVMKG1vZHVsZSkKREVDTEFSRV9ERUJVR19DSEFOTkVMKHJlbGF5KQoKI2lmZGVmIE1aX1NVUFBPUlRFRAoKI2luY2x1ZGUgPHN5cy92bTg2Lmg+CiNpbmNsdWRlIDxzeXMvbW1hbi5oPgoKI2RlZmluZSBJRl9DTFIoY3R4KSBFRkxfcmVnKGN0eCkgJj0gflZJRl9NQVNLCiNkZWZpbmUgSUZfRU5BQkxFRChjdHgpIChFRkxfcmVnKGN0eCkgJiBWSUZfTUFTSykKI2RlZmluZSBTRVRfUEVORChjdHgpIEVGTF9yZWcoY3R4KSB8PSBWSVBfTUFTSwojZGVmaW5lIENMUl9QRU5EKGN0eCkgRUZMX3JlZyhjdHgpICY9IH5WSVBfTUFTSwojZGVmaW5lIElTX1BFTkQoY3R4KSAoRUZMX3JlZyhjdHgpICYgVklQX01BU0spCgojdW5kZWYgVFJZX1BJQ1JFVFVSTgoKZXh0ZXJuIHZvaWQgV0lOQVBJIFJFR1NfRlVOQyhSdGxSYWlzZUV4Y2VwdGlvbikoIEVYQ0VQVElPTl9SRUNPUkQgKnJlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgKmNvbnRleHQgKTsKCnN0YXRpYyB2b2lkIGRvX2V4Y2VwdGlvbiggaW50IHNpZ25hbCwgQ09OVEVYVDg2ICpjb250ZXh0ICkKewogICAgRVhDRVBUSU9OX1JFQ09SRCByZWM7CiAgICBpZiAoKHNpZ25hbCA9PSBTSUdUUkFQKSB8fCAoc2lnbmFsID09IFNJR0hVUCkpCiAgICB7CiAgICAgICAgcmVjLkV4Y2VwdGlvbkNvZGUgID0gRVhDRVBUSU9OX0JSRUFLUE9JTlQ7CiAgICAgICAgcmVjLkV4Y2VwdGlvbkZsYWdzID0gRVhDRVBUSU9OX0NPTlRJTlVBQkxFOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJlYy5FeGNlcHRpb25Db2RlICA9IEVYQ0VQVElPTl9JTExFR0FMX0lOU1RSVUNUSU9OOyAgLyogZ2VuZXJpYyBlcnJvciAqLwogICAgICAgIHJlYy5FeGNlcHRpb25GbGFncyA9IEVIX05PTkNPTlRJTlVBQkxFOwogICAgfQogICAgcmVjLkV4Y2VwdGlvblJlY29yZCAgPSBOVUxMOwogICAgcmVjLkV4Y2VwdGlvbkFkZHJlc3MgPSAoTFBWT0lEKUVJUF9yZWcoY29udGV4dCk7CiAgICByZWMuTnVtYmVyUGFyYW1ldGVycyA9IDA7CiAgICBSRUdTX0ZVTkMoUnRsUmFpc2VFeGNlcHRpb24pKCAmcmVjLCBjb250ZXh0ICk7Cn0KCnN0YXRpYyB2b2lkIERPU1ZNX0R1bXAoIExQRE9TVEFTSyBscERvc1Rhc2ssIGludCBmbiwgaW50IHNpZywKICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZtODZwbHVzX3N0cnVjdCpWTTg2ICkKewogdW5zaWduZWQgaW9mczsKIEJZVEUqaW5zdDsKIGludCB4OwoKIHN3aXRjaCAoVk04Nl9UWVBFKGZuKSkgewogIGNhc2UgVk04Nl9TSUdOQUw6CiAgIHByaW50ZigiVHJhcHBlZCBzaWduYWwgJWRcbiIsc2lnKTsgYnJlYWs7CiAgY2FzZSBWTTg2X1VOS05PV046CiAgIHByaW50ZigiVHJhcHBlZCB1bmhhbmRsZWQgR1BGXG4iKTsgYnJlYWs7CiAgY2FzZSBWTTg2X0lOVHg6CiAgIHByaW50ZigiVHJhcHBlZCBJTlQgJTAyeFxuIixWTTg2X0FSRyhmbikpOyBicmVhazsKICBjYXNlIFZNODZfU1RJOgogICBwcmludGYoIlRyYXBwZWQgU1RJXG4iKTsgYnJlYWs7CiAgY2FzZSBWTTg2X1BJQ1JFVFVSTjoKICAgcHJpbnRmKCJUcmFwcGVkIGR1ZSB0byBwZW5kaW5nIFBJQyByZXF1ZXN0XG4iKTsgYnJlYWs7CiAgY2FzZSBWTTg2X1RSQVA6CiAgIHByaW50ZigiVHJhcHBlZCBkZWJ1ZyByZXF1ZXN0XG4iKTsgYnJlYWs7CiAgZGVmYXVsdDoKICAgcHJpbnRmKCJUcmFwcGVkIHVua25vd24gVk04NiB0eXBlICVkIGFyZyAlZFxuIixWTTg2X1RZUEUoZm4pLFZNODZfQVJHKGZuKSk7IGJyZWFrOwogfQojZGVmaW5lIFJFR1MgVk04Ni0+cmVncwogZnByaW50ZihzdGRlcnIsIkFYPSUwNGxYIENYPSUwNGxYIERYPSUwNGxYIEJYPSUwNGxYXG4iLFJFR1MuZWF4LFJFR1MuZWN4LFJFR1MuZWR4LFJFR1MuZWJ4KTsKIGZwcmludGYoc3RkZXJyLCJTST0lMDRsWCBEST0lMDRsWCBTUD0lMDRsWCBCUD0lMDRsWFxuIixSRUdTLmVzaSxSRUdTLmVkaSxSRUdTLmVzcCxSRUdTLmVicCk7CiBmcHJpbnRmKHN0ZGVyciwiQ1M9JTA0WCBEUz0lMDRYIEVTPSUwNFggU1M9JTA0WFxuIixSRUdTLmNzLFJFR1MuZHMsUkVHUy5lcyxSRUdTLnNzKTsKIGZwcmludGYoc3RkZXJyLCJJUD0lMDRsWCBFRkxBR1M9JTA4bFhcbiIsUkVHUy5laXAsUkVHUy5lZmxhZ3MpOwoKIGlvZnM9KChEV09SRClSRUdTLmNzPDw0KStSRUdTLmVpcDsKI3VuZGVmIFJFR1MKIGluc3Q9KEJZVEUqKWxwRG9zVGFzay0+aW1nK2lvZnM7CiBwcmludGYoIk9wY29kZXM6Iik7CiBmb3IgKHg9MDsgeDw4OyB4KyspIHByaW50ZigiICUwMngiLGluc3RbeF0pOwogcHJpbnRmKCJcbiIpOwp9CgpzdGF0aWMgaW50IERPU1ZNX0ludCggaW50IHZlY3QsIENPTlRFWFQ4NiAqY29udGV4dCwgTFBET1NUQVNLIGxwRG9zVGFzayApCnsKIGV4dGVybiBVSU5UMTYgRFBNSV93cmFwX3NlZzsKCiBpZiAodmVjdD09MHgzMSkgewogIGlmIChDU19yZWcoY29udGV4dCk9PURQTUlfd3JhcF9zZWcpIHsKICAgLyogZXhpdCBmcm9tIHJlYWwtbW9kZSB3cmFwcGVyICovCiAgIHJldHVybiAtMTsKICB9CiAgLyogd2UgY291bGQgcHJvYmFibHkgbW92ZSBzb21lIG90aGVyIGRvZGd5IHN0dWZmIGhlcmUgdG9vIGZyb20gZHBtaS5jICovCiB9CiBJTlRfUmVhbE1vZGVJbnRlcnJ1cHQodmVjdCxjb250ZXh0KTsKIHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBET1NWTV9TaW11bGF0ZUludCggaW50IHZlY3QsIENPTlRFWFQ4NiAqY29udGV4dCwgTFBET1NUQVNLIGxwRG9zVGFzayApCnsKICBGQVJQUk9DMTYgaGFuZGxlcj1JTlRfR2V0Uk1IYW5kbGVyKHZlY3QpOwoKICBpZiAoU0VMRUNUT1JPRihoYW5kbGVyKT09MHhmMDAwKSB7CiAgICAvKiBpZiBpbnRlcm5hbCBpbnRlcnJ1cHQsIGNhbGwgaXQgZGlyZWN0bHkgKi8KICAgIElOVF9SZWFsTW9kZUludGVycnVwdCh2ZWN0LGNvbnRleHQpOwogIH0gZWxzZSB7CiAgICBXT1JEKnN0YWNrPShXT1JEKikoVjg2QkFTRShjb250ZXh0KSsoKChEV09SRClTU19yZWcoY29udGV4dCkpPDw0KStMT1dPUkQoRVNQX3JlZyhjb250ZXh0KSkpOwogICAgV09SRCBmbGFnPUxPV09SRChFRkxfcmVnKGNvbnRleHQpKTsKCiAgICBpZiAoSUZfRU5BQkxFRChjb250ZXh0KSkgZmxhZ3w9SUZfTUFTSzsKICAgIGVsc2UgZmxhZyY9fklGX01BU0s7CgogICAgKigtLXN0YWNrKT1mbGFnOwogICAgKigtLXN0YWNrKT1DU19yZWcoY29udGV4dCk7CiAgICAqKC0tc3RhY2spPUxPV09SRChFSVBfcmVnKGNvbnRleHQpKTsKICAgIEVTUF9yZWcoY29udGV4dCktPTY7CiAgICBDU19yZWcoY29udGV4dCk9U0VMRUNUT1JPRihoYW5kbGVyKTsKICAgIEVJUF9yZWcoY29udGV4dCk9T0ZGU0VUT0YoaGFuZGxlcik7CiAgICBJRl9DTFIoY29udGV4dCk7CiAgfQp9CgojZGVmaW5lIFNIT1VMRF9QRU5EKHgpIFwKICAoeCAmJiAoKCFscERvc1Rhc2stPmN1cnJlbnQpIHx8ICh4LT5wcmlvcml0eSA8IGxwRG9zVGFzay0+Y3VycmVudC0+cHJpb3JpdHkpKSkKCnN0YXRpYyB2b2lkIERPU1ZNX1NlbmRRdWV1ZWRFdmVudChDT05URVhUODYgKmNvbnRleHQsIExQRE9TVEFTSyBscERvc1Rhc2spCnsKICBMUERPU0VWRU5UIGV2ZW50ID0gbHBEb3NUYXNrLT5wZW5kaW5nOwoKICBpZiAoU0hPVUxEX1BFTkQoZXZlbnQpKSB7CiAgICAvKiByZW1vdmUgZnJvbSAicGVuZGluZyIgbGlzdCAqLwogICAgbHBEb3NUYXNrLT5wZW5kaW5nID0gZXZlbnQtPm5leHQ7CiAgICAvKiBwcm9jZXNzIGV2ZW50ICovCiAgICBpZiAoZXZlbnQtPmlycT49MCkgewogICAgICAvKiBpdCdzIGFuIElSUSwgbW92ZSBpdCB0byAiY3VycmVudCIgbGlzdCAqLwogICAgICBldmVudC0+bmV4dCA9IGxwRG9zVGFzay0+Y3VycmVudDsKICAgICAgbHBEb3NUYXNrLT5jdXJyZW50ID0gZXZlbnQ7CiAgICAgIFRSQUNFXyhpbnQpKCJkaXNwYXRjaGluZyBJUlEgJWRcbiIsZXZlbnQtPmlycSk7CiAgICAgIC8qIG5vdGUgdGhhdCBpZiBET1NWTV9TaW11bGF0ZUludCBjYWxscyBhbiBpbnRlcm5hbCBpbnRlcnJ1cHQgZGlyZWN0bHksCiAgICAgICAqIGxwRG9zVGFzay0+Y3VycmVudCBtaWdodCBiZSBjbGVhcmVkIChhbmQgZXZlbnQgZnJlZWQpIGluIHRoaXMgdmVyeSBjYWxsISAqLwogICAgICBET1NWTV9TaW11bGF0ZUludCgoZXZlbnQtPmlycTw4KT8oZXZlbnQtPmlycSs4KTooZXZlbnQtPmlycS04KzB4NzApLGNvbnRleHQsbHBEb3NUYXNrKTsKICAgIH0gZWxzZSB7CiAgICAgIC8qIGNhbGxiYWNrIGV2ZW50ICovCiAgICAgIFRSQUNFXyhpbnQpKCJkaXNwYXRjaGluZyBjYWxsYmFjayBldmVudFxuIik7CiAgICAgICgqZXZlbnQtPnJlbGF5KShscERvc1Rhc2ssY29udGV4dCxldmVudC0+ZGF0YSk7CiAgICAgIGZyZWUoZXZlbnQpOwogICAgfQogIH0KICBpZiAoIVNIT1VMRF9QRU5EKGxwRG9zVGFzay0+cGVuZGluZykpIHsKICAgIFRSQUNFXyhpbnQpKCJjbGVhcmluZyBQZW5kaW5nIGZsYWdcbiIpOwogICAgQ0xSX1BFTkQoY29udGV4dCk7CiAgfQp9CgpzdGF0aWMgdm9pZCBET1NWTV9TZW5kUXVldWVkRXZlbnRzKENPTlRFWFQ4NiAqY29udGV4dCwgTFBET1NUQVNLIGxwRG9zVGFzaykKewogIC8qIHdlIHdpbGwgc2VuZCBhbGwgcXVldWVkIGV2ZW50cyBhcyBsb25nIGFzIGludGVycnVwdHMgYXJlIGVuYWJsZWQsCiAgICogYnV0IElSUSBldmVudHMgd2lsbCBkaXNhYmxlIGludGVycnVwdHMgYWdhaW4gKi8KICB3aGlsZSAoSVNfUEVORChjb250ZXh0KSAmJiBJRl9FTkFCTEVEKGNvbnRleHQpKQogICAgRE9TVk1fU2VuZFF1ZXVlZEV2ZW50KGNvbnRleHQsbHBEb3NUYXNrKTsKfQoKdm9pZCBET1NWTV9RdWV1ZUV2ZW50KCBpbnQgaXJxLCBpbnQgcHJpb3JpdHksIHZvaWQgKCpyZWxheSkoTFBET1NUQVNLLENPTlRFWFQ4Niosdm9pZCopLCB2b2lkICpkYXRhKQp7CiAgTFBET1NUQVNLIGxwRG9zVGFzayA9IE1aX0N1cnJlbnQoKTsKICBMUERPU0VWRU5UIGV2ZW50LCBjdXIsIHByZXY7CgogIGlmIChscERvc1Rhc2spIHsKICAgIGV2ZW50ID0gbWFsbG9jKHNpemVvZihET1NFVkVOVCkpOwogICAgaWYgKCFldmVudCkgewogICAgICBFUlJfKGludCkoIm91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBldmVudCBlbnRyeVxuIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGV2ZW50LT5pcnEgPSBpcnE7IGV2ZW50LT5wcmlvcml0eSA9IHByaW9yaXR5OwogICAgZXZlbnQtPnJlbGF5ID0gcmVsYXk7IGV2ZW50LT5kYXRhID0gZGF0YTsKCiAgICAvKiBpbnNlcnQgZXZlbnQgaW50byBsaW5rZWQgbGlzdCwgaW4gb3JkZXIgKmFmdGVyKgogICAgICogYWxsIGVhcmxpZXIgZXZlbnRzIG9mIGhpZ2hlciBvciBlcXVhbCBwcmlvcml0eSAqLwogICAgY3VyID0gbHBEb3NUYXNrLT5wZW5kaW5nOyBwcmV2ID0gTlVMTDsKICAgIHdoaWxlIChjdXIgJiYgY3VyLT5wcmlvcml0eTw9cHJpb3JpdHkpIHsKICAgICAgcHJldiA9IGN1cjsKICAgICAgY3VyID0gY3VyLT5uZXh0OwogICAgfQogICAgZXZlbnQtPm5leHQgPSBjdXI7CiAgICBpZiAocHJldikgcHJldi0+bmV4dCA9IGV2ZW50OwogICAgZWxzZSBscERvc1Rhc2stPnBlbmRpbmcgPSBldmVudDsKICAgIAogICAgLyogZ2V0IGRvc21vZCdzIGF0dGVudGlvbiB0byB0aGUgbmV3IGV2ZW50LCBleGNlcHQgZm9yIGlycT09MCB3aGVyZSB3ZSBhbHJlYWR5IGhhdmUgaXQgKi8KICAgIGlmIChpcnEgJiYgIWxwRG9zVGFzay0+c2lnX3NlbnQpIHsKICAgICAgVFJBQ0VfKGludCkoIm5ldyBldmVudCBxdWV1ZWQsIHNpZ25hbGxpbmcgZG9zbW9kXG4iKTsKICAgICAga2lsbChscERvc1Rhc2stPnRhc2ssU0lHVVNSMik7CiAgICAgIGxwRG9zVGFzay0+c2lnX3NlbnQrKzsKICAgIH0gZWxzZSB7CiAgICAgIFRSQUNFXyhpbnQpKCJuZXcgZXZlbnQgcXVldWVkXG4iKTsKICAgIH0KICB9Cn0KCiNkZWZpbmUgQ1YgQ1AoZWF4LEVBWCk7IENQKGVjeCxFQ1gpOyBDUChlZHgsRURYKTsgQ1AoZWJ4LEVCWCk7IFwKICAgICAgICAgICBDUChlc2ksRVNJKTsgQ1AoZWRpLEVESSk7IENQKGVzcCxFU1ApOyBDUChlYnAsRUJQKTsgXAogICAgICAgICAgIENQKGNzLENTKTsgQ1AoZHMsRFMpOyBDUChlcyxFUyk7IFwKICAgICAgICAgICBDUChzcyxTUyk7IENQKGZzLEZTKTsgQ1AoZ3MsR1MpOyBcCiAgICAgICAgICAgQ1AoZWlwLEVJUCk7IENQKGVmbGFncyxFRkwpCgpzdGF0aWMgaW50IERPU1ZNX1Byb2Nlc3MoIExQRE9TVEFTSyBscERvc1Rhc2ssIGludCBmbiwgaW50IHNpZywKICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgdm04NnBsdXNfc3RydWN0KlZNODYgKQp7CiBDT05URVhUODYgY29udGV4dDsKIGludCByZXQ9MDsKCiNkZWZpbmUgQ1AoeCx5KSB5IyNfcmVnKCZjb250ZXh0KSA9IFZNODYtPnJlZ3MueAogIENWOwojdW5kZWYgQ1AKIGlmIChWTTg2X1RZUEUoZm4pPT1WTTg2X1VOS05PV04pIHsKICByZXQ9SU5TVFJfRW11bGF0ZUluc3RydWN0aW9uKCZjb250ZXh0KTsKI2RlZmluZSBDUCh4LHkpIFZNODYtPnJlZ3MueCA9IHkjI19yZWcoJmNvbnRleHQpCiAgQ1Y7CiN1bmRlZiBDUAogIGlmIChyZXQpIHJldHVybiAwOwogIHJldD0wOwogfQogKHZvaWQqKVY4NkJBU0UoJmNvbnRleHQpPWxwRG9zVGFzay0+aW1nOwojaWZkZWYgVFJZX1BJQ1JFVFVSTgogaWYgKFZNODYtPnZtODZwbHVzLmZvcmNlX3JldHVybl9mb3JfcGljKSB7CiAgIFNFVF9QRU5EKCZjb250ZXh0KTsKIH0KI2Vsc2UKIC8qIGxpbnV4IGRvZXNuJ3QgcHJlc2VydmUgcGVuZGluZyBmbGFnIG9uIHJldHVybiAqLwogaWYgKFNIT1VMRF9QRU5EKGxwRG9zVGFzay0+cGVuZGluZykpIHsKICAgU0VUX1BFTkQoJmNvbnRleHQpOwogfQojZW5kaWYKCiBzd2l0Y2ggKFZNODZfVFlQRShmbikpIHsKICBjYXNlIFZNODZfU0lHTkFMOgogICBUUkFDRV8oaW50KSgiRE9TIG1vZHVsZSBjYXVnaHQgc2lnbmFsICVkXG4iLHNpZyk7CiAgIGlmICgoc2lnPT1TSUdBTFJNKSB8fCAoc2lnPT1TSUdVU1IyKSkgewogICAgIGlmIChzaWc9PVNJR0FMUk0pIHsKICAgICAgIERPU1ZNX1F1ZXVlRXZlbnQoMCxET1NfUFJJT1JJVFlfUkVBTFRJTUUsTlVMTCxOVUxMKTsKICAgICB9CiAgICAgaWYgKGxwRG9zVGFzay0+cGVuZGluZykgewogICAgICAgVFJBQ0VfKGludCkoInNldHRpbmcgUGVuZGluZyBmbGFnLCBpbnRlcnJ1cHRzIGFyZSBjdXJyZW50bHkgJXNcbiIsCiAgICAgICAgICAgICAgICAgSUZfRU5BQkxFRCgmY29udGV4dCkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKICAgICAgIFNFVF9QRU5EKCZjb250ZXh0KTsKICAgICAgIERPU1ZNX1NlbmRRdWV1ZWRFdmVudHMoJmNvbnRleHQsbHBEb3NUYXNrKTsKICAgICB9IGVsc2UgewogICAgICAgVFJBQ0VfKGludCkoIm5vIGV2ZW50cyBhcmUgcGVuZGluZywgY2xlYXJpbmcgUGVuZGluZyBmbGFnXG4iKTsKICAgICAgIENMUl9QRU5EKCZjb250ZXh0KTsKICAgICB9CiAgICAgaWYgKHNpZz09U0lHVVNSMikgbHBEb3NUYXNrLT5zaWdfc2VudC0tOwogICB9CiAgIGVsc2UgaWYgKChzaWc9PVNJR0hVUCkgfHwgKHNpZz09U0lHSUxMKSB8fCAoc2lnPT1TSUdTRUdWKSkgewogICAgICAgZG9fZXhjZXB0aW9uKCBzaWcsICZjb250ZXh0ICk7CiAgIH0gZWxzZSB7CiAgICBET1NWTV9EdW1wKGxwRG9zVGFzayxmbixzaWcsVk04Nik7CiAgICByZXQ9LTE7CiAgIH0KICAgYnJlYWs7CiAgY2FzZSBWTTg2X1VOS05PV046IC8qIHVuaGFuZGxlZCBHUEYgKi8KICAgRE9TVk1fRHVtcChscERvc1Rhc2ssZm4sc2lnLFZNODYpOwogICBkb19leGNlcHRpb24oIFNJR1NFR1YsICZjb250ZXh0ICk7CiAgIGJyZWFrOwogIGNhc2UgVk04Nl9JTlR4OgogICBpZiAoVFJBQ0VfT04ocmVsYXkpKQogICAgRFBSSU5URigiQ2FsbCBET1MgaW50IDB4JTAyeCAoRUFYPSUwOGx4KSByZXQ9JTA0bHg6JTA0bHhcbiIsVk04Nl9BUkcoZm4pLGNvbnRleHQuRWF4LGNvbnRleHQuU2VnQ3MsY29udGV4dC5FaXApOwogICByZXQ9RE9TVk1fSW50KFZNODZfQVJHKGZuKSwmY29udGV4dCxscERvc1Rhc2spOwogICBpZiAoVFJBQ0VfT04ocmVsYXkpKQogICAgRFBSSU5URigiUmV0ICBET1MgaW50IDB4JTAyeCAoRUFYPSUwOGx4KSByZXQ9JTA0bHg6JTA0bHhcbiIsVk04Nl9BUkcoZm4pLGNvbnRleHQuRWF4LGNvbnRleHQuU2VnQ3MsY29udGV4dC5FaXApOwogICBicmVhazsKICBjYXNlIFZNODZfU1RJOgogIGNhc2UgVk04Nl9QSUNSRVRVUk46CiAgICBUUkFDRV8oaW50KSgiRE9TIHRhc2sgZW5hYmxlZCBpbnRlcnJ1cHRzIHdpdGggZXZlbnRzIHBlbmRpbmcsIHNlbmRpbmcgZXZlbnRzXG4iKTsKICAgIERPU1ZNX1NlbmRRdWV1ZWRFdmVudHMoJmNvbnRleHQsbHBEb3NUYXNrKTsKICAgIGJyZWFrOwogIGNhc2UgVk04Nl9UUkFQOgogICBkb19leGNlcHRpb24oIFNJR1RSQVAsICZjb250ZXh0ICk7CiAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgIERPU1ZNX0R1bXAobHBEb3NUYXNrLGZuLHNpZyxWTTg2KTsKICAgcmV0PS0xOwogfQoKI2RlZmluZSBDUCh4LHkpIFZNODYtPnJlZ3MueCA9IHkjI19yZWcoJmNvbnRleHQpCiBDVjsKI3VuZGVmIENQCiNpZmRlZiBUUllfUElDUkVUVVJOCiBWTTg2LT52bTg2cGx1cy5mb3JjZV9yZXR1cm5fZm9yX3BpYyA9IElTX1BFTkQoJmNvbnRleHQpID8gMSA6IDA7CiBDTFJfUEVORCgmY29udGV4dCk7CiNlbmRpZgogcmV0dXJuIHJldDsKfQoKdm9pZCBET1NWTV9Qcm9jZXNzTWVzc2FnZShMUERPU1RBU0sgbHBEb3NUYXNrLE1TRyAqbXNnKQp7CiAgQllURSBzY2FuID0gMDsKCiAgZnByaW50ZihzdGRlcnIsImdvdCBtZXNzYWdlICUwNHgsIHdwYXJhbT0lMDh4LCBscGFyYW09JTA4bHhcbiIsbXNnLT5tZXNzYWdlLG1zZy0+d1BhcmFtLG1zZy0+bFBhcmFtKTsKICBpZiAoKG1zZy0+bWVzc2FnZT49V01fTU9VU0VGSVJTVCkmJgogICAgICAobXNnLT5tZXNzYWdlPD1XTV9NT1VTRUxBU1QpKSB7CiAgICBJTlRfSW50MzNNZXNzYWdlKG1zZy0+bWVzc2FnZSxtc2ctPndQYXJhbSxtc2ctPmxQYXJhbSk7CiAgfSBlbHNlIHsKICAgIHN3aXRjaCAobXNnLT5tZXNzYWdlKSB7CiAgICBjYXNlIFdNX0tFWVVQOgogICAgICBzY2FuID0gMHg4MDsKICAgIGNhc2UgV01fS0VZRE9XTjoKICAgICAgc2NhbiB8PSAobXNnLT5sUGFyYW0gPj4gMTYpICYgMHg3ZjsKCiAgICAgIC8qIGNoZWNrIHdoZXRoZXIgZXh0ZW5kZWQgYml0IGlzIHNldCwKICAgICAgICogYW5kIGlmIHNvLCBxdWV1ZSB0aGUgZXh0ZW5zaW9uIHByZWZpeCAqLwogICAgICBpZiAobXNnLT5sUGFyYW0gJiAweDEwMDAwMDApIHsKCS8qIEZJWE1FOiBzb21lIGtleXMgKGZ1bmN0aW9uIGtleXMpIGhhdmUKCSAqIGV4dGVuZGVkIGJpdCBzZXQgZXZlbiB3aGVuIHRoZXkgc2hvdWxkbid0LAoJICogc2hvdWxkIGNoZWNrIGZvciB0aGVtICovCglJTlRfSW50MDlTZW5kU2NhbigweEUwKTsKICAgICAgfQogICAgICBJTlRfSW50MDlTZW5kU2NhbihzY2FuKTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQp9Cgp2b2lkIERPU1ZNX1dhaXQoIGludCByZWFkX3BpcGUsIEhBTkRMRSBoT2JqZWN0ICkKewogIExQRE9TVEFTSyBscERvc1Rhc2sgPSBNWl9DdXJyZW50KCk7CiAgTVNHIG1zZzsKICBEV09SRCB3YWl0cmV0OwogIEJPT0wgZ290X21zZyA9IEZBTFNFOwoKICBkbyB7CiAgICAvKiBjaGVjayBmb3IgbWVzc2FnZXMgKHdhc3RlIHRpbWUgYmVmb3JlIHRoZSByZXNwb25zZSBjaGVjayBiZWxvdykgKi8KICAgIHdoaWxlIChQZWVrTWVzc2FnZUEoJm1zZywwLDAsMCxQTV9SRU1PVkV8UE1fTk9ZSUVMRCkpIHsKICAgICAgLyogZ290IGEgbWVzc2FnZSAqLwogICAgICBET1NWTV9Qcm9jZXNzTWVzc2FnZShscERvc1Rhc2ssJm1zZyk7CiAgICAgIC8qIHdlIGRvbid0IG5lZWQgYSBUcmFuc2xhdGVNZXNzYWdlIGhlcmUgKi8KICAgICAgRGlzcGF0Y2hNZXNzYWdlQSgmbXNnKTsKICAgICAgZ290X21zZyA9IFRSVUU7CiAgICB9CiAgICBpZiAocmVhZF9waXBlID09IC0xKSB7CiAgICAgIGlmIChnb3RfbXNnKSBicmVhazsKICAgIH0gZWxzZSB7CiAgICAgIGZkX3NldCByZWFkZmRzOwogICAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0PXswLDB9OwogICAgICAvKiBxdWljayBjaGVjayBmb3IgcmVzcG9uc2UgZnJvbSBkb3Ntb2QKICAgICAgICogKGZhc3RlciB0aGFuIGRvaW5nIHRoZSBmdWxsIGJsb2NraW5nIHdhaXQsIGlmIGRhdGEgYWxyZWFkeSBhdmFpbGFibGUpICovCiAgICAgIEZEX1pFUk8oJnJlYWRmZHMpOyBGRF9TRVQocmVhZF9waXBlLCZyZWFkZmRzKTsKICAgICAgaWYgKHNlbGVjdChyZWFkX3BpcGUrMSwmcmVhZGZkcyxOVUxMLE5VTEwsJnRpbWVvdXQpPjApCglicmVhazsKICAgIH0KICAgIC8qIGNoZWNrIGZvciBkYXRhIGZyb20gd2luMzIgY29uc29sZSBkZXZpY2UgKi8KCiAgICAvKiBub3RoaW5nIHlldCwgYmxvY2sgd2hpbGUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGRvICovCiAgICB3YWl0cmV0PU1zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHMoMSwmaE9iamVjdCxGQUxTRSxJTkZJTklURSxRU19BTExJTlBVVCk7CiAgICBpZiAod2FpdHJldD09KERXT1JEKS0xKSB7CiAgICAgIEVSUl8obW9kdWxlKSgiZG9zdm0gd2FpdCBlcnJvcj0lbGRcbiIsR2V0TGFzdEVycm9yKCkpOwogICAgfQogICAgaWYgKHJlYWRfcGlwZSAhPSAtMSkgewogICAgICBpZiAod2FpdHJldD09V0FJVF9PQkpFQ1RfMCkgYnJlYWs7CiAgICB9CiAgfSB3aGlsZSAoVFJVRSk7Cn0KCmludCBET1NWTV9FbnRlciggQ09OVEVYVDg2ICpjb250ZXh0ICkKewogTFBET1NUQVNLIGxwRG9zVGFzayA9IE1aX0N1cnJlbnQoKTsKIHN0cnVjdCB2bTg2cGx1c19zdHJ1Y3QgVk04NjsKIGludCBzdGF0LGxlbixzaWc7CgogaWYgKCFscERvc1Rhc2spIHsKICAvKiBNWl9DcmVhdGVQcm9jZXNzIG9yIE1aX0FsbG9jRFBNSVRhc2sgc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQgZmlyc3QgKi8KICBFUlJfKG1vZHVsZSkoImRvc21vZCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQhIik7CiAgcmV0dXJuIC0xOwogfQoKIGlmIChjb250ZXh0KSB7CiNkZWZpbmUgQ1AoeCx5KSBWTTg2LnJlZ3MueCA9IHkjI19yZWcoY29udGV4dCkKICBDVjsKI3VuZGVmIENQCiAgaWYgKFZNODYucmVncy5lZmxhZ3MgJiBJRl9NQVNLKQogICAgVk04Ni5yZWdzLmVmbGFncyB8PSBWSUZfTUFTSzsKIH0gZWxzZSB7Ci8qIGluaXRpYWwgc2V0dXAgKi8KICAvKiBhbGxvY2F0ZSBzdGFuZGFyZCBET1MgaGFuZGxlcyAqLwogIEZJTEVfSW5pdFByb2Nlc3NEb3NIYW5kbGVzKCk7IAogIC8qIHJlZ2lzdGVycyAqLwogIG1lbXNldCgmVk04NiwwLHNpemVvZihWTTg2KSk7CiAgVk04Ni5yZWdzLmNzPWxwRG9zVGFzay0+aW5pdF9jczsKICBWTTg2LnJlZ3MuZWlwPWxwRG9zVGFzay0+aW5pdF9pcDsKICBWTTg2LnJlZ3Muc3M9bHBEb3NUYXNrLT5pbml0X3NzOwogIFZNODYucmVncy5lc3A9bHBEb3NUYXNrLT5pbml0X3NwOwogIFZNODYucmVncy5kcz1scERvc1Rhc2stPnBzcF9zZWc7CiAgVk04Ni5yZWdzLmVzPWxwRG9zVGFzay0+cHNwX3NlZzsKICBWTTg2LnJlZ3MuZWZsYWdzPVZJRl9NQVNLOwogIC8qIGhtbSwgd2hhdCBlbHNlIGRvIHdlIG5lZWQ/ICovCiB9CgogLyogbWFpbiBleGNoYW5nZSBsb29wICovCiBkbyB7CiAgc3RhdCA9IFZNODZfRU5URVI7CiAgZXJybm8gPSAwOwogIC8qIHRyYW5zbWl0IFZNODYgc3RydWN0dXJlIHRvIGRvc21vZCB0YXNrICovCiAgaWYgKHdyaXRlKGxwRG9zVGFzay0+d3JpdGVfcGlwZSwmc3RhdCxzaXplb2Yoc3RhdCkpIT1zaXplb2Yoc3RhdCkpIHsKICAgRVJSXyhtb2R1bGUpKCJkb3Ntb2Qgc3luYyBsb3N0LCBlcnJubz0lZCwgZmQ9JWQsIHBpZD0lZFxuIixlcnJubyxscERvc1Rhc2stPndyaXRlX3BpcGUsZ2V0cGlkKCkpOwogICByZXR1cm4gLTE7CiAgfQogIGlmICh3cml0ZShscERvc1Rhc2stPndyaXRlX3BpcGUsJlZNODYsc2l6ZW9mKFZNODYpKSE9c2l6ZW9mKFZNODYpKSB7CiAgIEVSUl8obW9kdWxlKSgiZG9zbW9kIHN5bmMgbG9zdCwgZXJybm89JWRcbiIsZXJybm8pOwogICByZXR1cm4gLTE7CiAgfQogIC8qIHdhaXQgZm9yIHJlc3BvbnNlLCBkb2luZyBvdGhlciB0aGluZ3MgaW4gdGhlIG1lYW50aW1lICovCiAgRE9TVk1fV2FpdChscERvc1Rhc2stPnJlYWRfcGlwZSwgbHBEb3NUYXNrLT5oUmVhZFBpcGUpOwogIC8qIHJlYWQgcmVzcG9uc2UgKi8KICB3aGlsZSAoMSkgewogICAgaWYgKChsZW49cmVhZChscERvc1Rhc2stPnJlYWRfcGlwZSwmc3RhdCxzaXplb2Yoc3RhdCkpKT09c2l6ZW9mKHN0YXQpKSBicmVhazsKICAgIGlmICgoKGVycm5vPT1FSU5UUil8fChlcnJubz09RUFHQUlOKSkmJihsZW48PTApKSB7CiAgICAgV0FSTl8obW9kdWxlKSgicmVyZWFkaW5nIGRvc21vZCByZXR1cm4gY29kZSBkdWUgdG8gZXJybm89JWQsIHJlc3VsdD0lZFxuIixlcnJubyxsZW4pOwogICAgIGNvbnRpbnVlOwogICAgfQogICAgRVJSXyhtb2R1bGUpKCJkb3Ntb2Qgc3luYyBsb3N0IHJlYWRpbmcgcmV0dXJuIGNvZGUsIGVycm5vPSVkLCByZXN1bHQ9JWRcbiIsZXJybm8sbGVuKTsKICAgIHJldHVybiAtMTsKICB9CiAgVFJBQ0VfKG1vZHVsZSkoImRvc21vZCByZXR1cm4gY29kZT0lZFxuIixzdGF0KTsKICB3aGlsZSAoMSkgewogICAgaWYgKChsZW49cmVhZChscERvc1Rhc2stPnJlYWRfcGlwZSwmVk04NixzaXplb2YoVk04NikpKT09c2l6ZW9mKFZNODYpKSBicmVhazsKICAgIGlmICgoKGVycm5vPT1FSU5UUil8fChlcnJubz09RUFHQUlOKSkmJihsZW48PTApKSB7CiAgICAgV0FSTl8obW9kdWxlKSgicmVyZWFkaW5nIGRvc21vZCBWTTg2IHN0cnVjdHVyZSBkdWUgdG8gZXJybm89JWQsIHJlc3VsdD0lZFxuIixlcnJubyxsZW4pOwogICAgIGNvbnRpbnVlOwogICAgfQogICAgRVJSXyhtb2R1bGUpKCJkb3Ntb2Qgc3luYyBsb3N0IHJlYWRpbmcgVk04NiBzdHJ1Y3R1cmUsIGVycm5vPSVkLCByZXN1bHQ9JWRcbiIsZXJybm8sbGVuKTsKICAgIHJldHVybiAtMTsKICB9CiAgaWYgKChzdGF0JjB4ZmYpPT1ET1NNT0RfU0lHTkFMKSB7CiAgICB3aGlsZSAoMSkgewogICAgICBpZiAoKGxlbj1yZWFkKGxwRG9zVGFzay0+cmVhZF9waXBlLCZzaWcsc2l6ZW9mKHNpZykpKT09c2l6ZW9mKHNpZykpIGJyZWFrOwogICAgICBpZiAoKChlcnJubz09RUlOVFIpfHwoZXJybm89PUVBR0FJTikpJiYobGVuPD0wKSkgewoJV0FSTl8obW9kdWxlKSgicmVyZWFkaW5nIGRvc21vZCBzaWduYWwgZHVlIHRvIGVycm5vPSVkLCByZXN1bHQ9JWRcbiIsZXJybm8sbGVuKTsKCWNvbnRpbnVlOwogICAgICB9CiAgICAgIEVSUl8obW9kdWxlKSgiZG9zbW9kIHN5bmMgbG9zdCByZWFkaW5nIHNpZ25hbCwgZXJybm89JWQsIHJlc3VsdD0lZFxuIixlcnJubyxsZW4pOwogICAgICByZXR1cm4gLTE7CiAgICB9IHdoaWxlICgwKTsKICB9IGVsc2Ugc2lnPTA7CiAgLyogZ290IHJlc3BvbnNlICovCiB9IHdoaWxlIChET1NWTV9Qcm9jZXNzKGxwRG9zVGFzayxzdGF0LHNpZywmVk04Nik+PTApOwoKIGlmIChjb250ZXh0KSB7CiNkZWZpbmUgQ1AoeCx5KSB5IyNfcmVnKGNvbnRleHQpID0gVk04Ni5yZWdzLngKICBDVjsKI3VuZGVmIENQCiB9CiByZXR1cm4gMDsKfQoKdm9pZCBET1NWTV9QSUNfaW9wb3J0X291dCggV09SRCBwb3J0LCBCWVRFIHZhbCkKewogIExQRE9TVEFTSyBscERvc1Rhc2sgPSBNWl9DdXJyZW50KCk7CiAgTFBET1NFVkVOVCBldmVudDsKCiAgaWYgKGxwRG9zVGFzaykgewogICAgaWYgKChwb3J0PT0weDIwKSAmJiAodmFsPT0weDIwKSkgewogICAgICBpZiAobHBEb3NUYXNrLT5jdXJyZW50KSB7CgkvKiBFT0kgKEVuZCBPZiBJbnRlcnJ1cHQpICovCglUUkFDRV8oaW50KSgicmVjZWl2ZWQgRU9JIGZvciBjdXJyZW50IElSUSwgY2xlYXJpbmdcbiIpOwoJZXZlbnQgPSBscERvc1Rhc2stPmN1cnJlbnQ7CglscERvc1Rhc2stPmN1cnJlbnQgPSBldmVudC0+bmV4dDsKCWlmIChldmVudC0+cmVsYXkpCgkoKmV2ZW50LT5yZWxheSkobHBEb3NUYXNrLE5VTEwsZXZlbnQtPmRhdGEpOwoJZnJlZShldmVudCk7CgoJaWYgKGxwRG9zVGFzay0+cGVuZGluZyAmJgoJICAgICFscERvc1Rhc2stPnNpZ19zZW50KSB7CgkgIC8qIGFub3RoZXIgZXZlbnQgaXMgcGVuZGluZywgd2hpY2ggd2Ugc2hvdWxkIHByb2JhYmx5CgkgICAqIGJlIGFibGUgdG8gcHJvY2VzcyBub3csIHNvIHRlbGwgZG9zbW9kIGFib3V0IGl0ICovCgkgIFRSQUNFXyhpbnQpKCJhbm90aGVyIGV2ZW50IHBlbmRpbmcsIHNpZ25hbGxpbmcgZG9zbW9kXG4iKTsKCSAga2lsbChscERvc1Rhc2stPnRhc2ssU0lHVVNSMik7CgkgIGxwRG9zVGFzay0+c2lnX3NlbnQrKzsKCX0KICAgICAgfSBlbHNlIHsKCVdBUk5fKGludCkoIkVPSSB3aXRob3V0IGFjdGl2ZSBJUlFcbiIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBGSVhNRV8oaW50KSgidW5yZWNvZ25pemVkIFBJQyBjb21tYW5kICUwMnhcbiIsdmFsKTsKICAgIH0KICB9Cn0KCnZvaWQgRE9TVk1fU2V0VGltZXIoIHVuc2lnbmVkIHRpY2tzICkKewogIExQRE9TVEFTSyBscERvc1Rhc2sgPSBNWl9DdXJyZW50KCk7CiAgaW50IHN0YXQ9RE9TTU9EX1NFVF9USU1FUjsKICBzdHJ1Y3QgdGltZXZhbCB0aW07CgogIGlmIChscERvc1Rhc2spIHsKICAgIC8qIHRoZSBQQyBjbG9ja3MgdGlja3MgYXQgMTE5MzE4MCBIeiAqLwogICAgdGltLnR2X3NlYz0wOwogICAgdGltLnR2X3VzZWM9KCh1bnNpZ25lZCBsb25nIGxvbmcpdGlja3MqMTAwMDAwMCkvMTE5MzE4MDsKICAgIC8qIHNhbml0eSBjaGVjayAqLwogICAgaWYgKCF0aW0udHZfdXNlYykgdGltLnR2X3VzZWM9MTsKCiAgICBpZiAod3JpdGUobHBEb3NUYXNrLT53cml0ZV9waXBlLCZzdGF0LHNpemVvZihzdGF0KSkhPXNpemVvZihzdGF0KSkgewogICAgICBFUlJfKG1vZHVsZSkoImRvc21vZCBzeW5jIGxvc3QsIGVycm5vPSVkXG4iLGVycm5vKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHdyaXRlKGxwRG9zVGFzay0+d3JpdGVfcGlwZSwmdGltLHNpemVvZih0aW0pKSE9c2l6ZW9mKHRpbSkpIHsKICAgICAgRVJSXyhtb2R1bGUpKCJkb3Ntb2Qgc3luYyBsb3N0LCBlcnJubz0lZFxuIixlcnJubyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8qIHRoZXJlJ3Mgbm8gcmV0dXJuICovCiAgfQp9Cgp1bnNpZ25lZCBET1NWTV9HZXRUaW1lciggdm9pZCApCnsKICBMUERPU1RBU0sgbHBEb3NUYXNrID0gTVpfQ3VycmVudCgpOwogIGludCBzdGF0PURPU01PRF9HRVRfVElNRVI7CiAgc3RydWN0IHRpbWV2YWwgdGltOwoKICBpZiAobHBEb3NUYXNrKSB7CiAgICBpZiAod3JpdGUobHBEb3NUYXNrLT53cml0ZV9waXBlLCZzdGF0LHNpemVvZihzdGF0KSkhPXNpemVvZihzdGF0KSkgewogICAgICBFUlJfKG1vZHVsZSkoImRvc21vZCBzeW5jIGxvc3QsIGVycm5vPSVkXG4iLGVycm5vKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICAvKiByZWFkIHJlc3BvbnNlICovCiAgICB3aGlsZSAoMSkgewogICAgICBpZiAocmVhZChscERvc1Rhc2stPnJlYWRfcGlwZSwmdGltLHNpemVvZih0aW0pKT09c2l6ZW9mKHRpbSkpIGJyZWFrOwogICAgICBpZiAoKGVycm5vPT1FSU5UUil8fChlcnJubz09RUFHQUlOKSkgY29udGludWU7CiAgICAgIEVSUl8obW9kdWxlKSgiZG9zbW9kIHN5bmMgbG9zdCwgZXJybm89JWRcbiIsZXJybm8pOwogICAgICByZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiAoKHVuc2lnbmVkIGxvbmcgbG9uZyl0aW0udHZfdXNlYyoxMTkzMTgwKS8xMDAwMDAwOwogIH0KICByZXR1cm4gMDsKfQoKdm9pZCBET1NWTV9TZXRTeXN0ZW1EYXRhKCBpbnQgaWQsIHZvaWQgKmRhdGEgKQp7CiAgTFBET1NUQVNLIGxwRG9zVGFzayA9IE1aX0N1cnJlbnQoKTsKICBET1NTWVNURU0gKnN5cywgKnByZXY7CgogIGlmIChscERvc1Rhc2spIHsKICAgIHN5cyA9IGxwRG9zVGFzay0+c3lzOwogICAgcHJldiA9IE5VTEw7CiAgICB3aGlsZSAoc3lzICYmIChzeXMtPmlkICE9IGlkKSkgewogICAgICBwcmV2ID0gc3lzOwogICAgICBzeXMgPSBzeXMtPm5leHQ7CiAgICB9CiAgICBpZiAoc3lzKSB7CiAgICAgIGZyZWUoc3lzLT5kYXRhKTsKICAgICAgc3lzLT5kYXRhID0gZGF0YTsKICAgIH0gZWxzZSB7CiAgICAgIHN5cyA9IG1hbGxvYyhzaXplb2YoRE9TU1lTVEVNKSk7CiAgICAgIHN5cy0+aWQgPSBpZDsKICAgICAgc3lzLT5kYXRhID0gZGF0YTsKICAgICAgc3lzLT5uZXh0ID0gTlVMTDsKICAgICAgaWYgKHByZXYpIHByZXYtPm5leHQgPSBzeXM7CiAgICAgIGVsc2UgbHBEb3NUYXNrLT5zeXMgPSBzeXM7CiAgICB9CiAgfSBlbHNlIGZyZWUoZGF0YSk7Cn0KCnZvaWQqIERPU1ZNX0dldFN5c3RlbURhdGEoIGludCBpZCApCnsKICBMUERPU1RBU0sgbHBEb3NUYXNrID0gTVpfQ3VycmVudCgpOwogIERPU1NZU1RFTSAqc3lzOwoKICBpZiAobHBEb3NUYXNrKSB7CiAgICBzeXMgPSBscERvc1Rhc2stPnN5czsKICAgIHdoaWxlIChzeXMgJiYgKHN5cy0+aWQgIT0gaWQpKQogICAgICBzeXMgPSBzeXMtPm5leHQ7CiAgICBpZiAoc3lzKQogICAgICByZXR1cm4gc3lzLT5kYXRhOwogIH0KICByZXR1cm4gTlVMTDsKfQoKI2Vsc2UgLyogIU1aX1NVUFBPUlRFRCAqLwoKaW50IERPU1ZNX0VudGVyKCBDT05URVhUODYgKmNvbnRleHQgKQp7CiBFUlJfKG1vZHVsZSkoIkRPUyByZWFsbW9kZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgYXJjaGl0ZWN0dXJlIVxuIik7CiByZXR1cm4gLTE7Cn0KCnZvaWQgRE9TVk1fV2FpdCggaW50IHJlYWRfcGlwZSwgSEFORExFIGhPYmplY3QpIHt9CnZvaWQgRE9TVk1fUElDX2lvcG9ydF9vdXQoIFdPUkQgcG9ydCwgQllURSB2YWwpIHt9CnZvaWQgRE9TVk1fU2V0VGltZXIoIHVuc2lnbmVkIHRpY2tzICkge30KdW5zaWduZWQgRE9TVk1fR2V0VGltZXIoIHZvaWQgKSB7IHJldHVybiAwOyB9CnZvaWQgRE9TVk1fU2V0U3lzdGVtRGF0YSggaW50IGlkLCB2b2lkICpkYXRhICkgeyBmcmVlKGRhdGEpOyB9CnZvaWQqIERPU1ZNX0dldFN5c3RlbURhdGEoIGludCBpZCApIHsgcmV0dXJuIE5VTEw7IH0Kdm9pZCBET1NWTV9RdWV1ZUV2ZW50KCBpbnQgaXJxLCBpbnQgcHJpb3JpdHksIHZvaWQgKCpyZWxheSkoTFBET1NUQVNLLENPTlRFWFQ4Niosdm9pZCopLCB2b2lkICpkYXRhKSB7fQoKI2VuZGlmCg==