LyoKICogRE9TIFZpcnR1YWwgTWFjaGluZQogKgogKiBDb3B5cmlnaHQgMTk5OCBPdmUgS+V2ZW4KICoKICogVGhpcyBjb2RlIGhhc24ndCBiZWVuIGNvbXBsZXRlbHkgY2xlYW5lZCB1cCB5ZXQuCiAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzaWduYWwuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KCiNpbmNsdWRlICJ3aW5lL3dpbmJhc2UxNi5oIgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAid2lubnQuaCIKI2luY2x1ZGUgInNpZ19jb250ZXh0LmgiCiNpbmNsdWRlICJtc2Rvcy5oIgojaW5jbHVkZSAiZmlsZS5oIgojaW5jbHVkZSAibWlzY2VtdS5oIgojaW5jbHVkZSAiZGVidWdnZXIuaCIKI2luY2x1ZGUgIm1vZHVsZS5oIgojaW5jbHVkZSAidGFzay5oIgojaW5jbHVkZSAibGR0LmgiCiNpbmNsdWRlICJkb3NleGUuaCIKI2luY2x1ZGUgImRvc21vZC5oIgojaW5jbHVkZSAiZGVidWd0b29scy5oIgoKREVDTEFSRV9ERUJVR19DSEFOTkVMKGludCkKREVDTEFSRV9ERUJVR19DSEFOTkVMKG1vZHVsZSkKREVDTEFSRV9ERUJVR19DSEFOTkVMKHJlbGF5KQoKI2lmZGVmIE1aX1NVUFBPUlRFRAoKI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiNpbmNsdWRlIDxzeXMvdm04Ni5oPgoKI2RlZmluZSBJRl9DTFIoY3R4KSBFRkxfcmVnKGN0eCkgJj0gflZJRl9NQVNLCiNkZWZpbmUgSUZfRU5BQkxFRChjdHgpIChFRkxfcmVnKGN0eCkgJiBWSUZfTUFTSykKI2RlZmluZSBTRVRfUEVORChjdHgpIEVGTF9yZWcoY3R4KSB8PSBWSVBfTUFTSwojZGVmaW5lIENMUl9QRU5EKGN0eCkgRUZMX3JlZyhjdHgpICY9IH5WSVBfTUFTSwojZGVmaW5lIElTX1BFTkQoY3R4KSAoRUZMX3JlZyhjdHgpICYgVklQX01BU0spCgojdW5kZWYgVFJZX1BJQ1JFVFVSTgoKc3RhdGljIHZvaWQgRE9TVk1fRHVtcCggTFBET1NUQVNLIGxwRG9zVGFzaywgaW50IGZuLCBpbnQgc2lnLAogICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgdm04NnBsdXNfc3RydWN0KlZNODYgKQp7CiB1bnNpZ25lZCBpb2ZzOwogQllURSppbnN0OwogaW50IHg7Cgogc3dpdGNoIChWTTg2X1RZUEUoZm4pKSB7CiAgY2FzZSBWTTg2X1NJR05BTDoKICAgcHJpbnRmKCJUcmFwcGVkIHNpZ25hbCAlZFxuIixzaWcpOyBicmVhazsKICBjYXNlIFZNODZfVU5LTk9XTjoKICAgcHJpbnRmKCJUcmFwcGVkIHVuaGFuZGxlZCBHUEZcbiIpOyBicmVhazsKICBjYXNlIFZNODZfSU5UeDoKICAgcHJpbnRmKCJUcmFwcGVkIElOVCAlMDJ4XG4iLFZNODZfQVJHKGZuKSk7IGJyZWFrOwogIGNhc2UgVk04Nl9TVEk6CiAgIHByaW50ZigiVHJhcHBlZCBTVElcbiIpOyBicmVhazsKICBjYXNlIFZNODZfUElDUkVUVVJOOgogICBwcmludGYoIlRyYXBwZWQgZHVlIHRvIHBlbmRpbmcgUElDIHJlcXVlc3RcbiIpOyBicmVhazsKICBjYXNlIFZNODZfVFJBUDoKICAgcHJpbnRmKCJUcmFwcGVkIGRlYnVnIHJlcXVlc3RcbiIpOyBicmVhazsKICBkZWZhdWx0OgogICBwcmludGYoIlRyYXBwZWQgdW5rbm93biBWTTg2IHR5cGUgJWQgYXJnICVkXG4iLFZNODZfVFlQRShmbiksVk04Nl9BUkcoZm4pKTsgYnJlYWs7CiB9CiNkZWZpbmUgUkVHUyBWTTg2LT5yZWdzCiBmcHJpbnRmKHN0ZGVyciwiQVg9JTA0bFggQ1g9JTA0bFggRFg9JTA0bFggQlg9JTA0bFhcbiIsUkVHUy5lYXgsUkVHUy5lY3gsUkVHUy5lZHgsUkVHUy5lYngpOwogZnByaW50ZihzdGRlcnIsIlNJPSUwNGxYIERJPSUwNGxYIFNQPSUwNGxYIEJQPSUwNGxYXG4iLFJFR1MuZXNpLFJFR1MuZWRpLFJFR1MuZXNwLFJFR1MuZWJwKTsKIGZwcmludGYoc3RkZXJyLCJDUz0lMDRYIERTPSUwNFggRVM9JTA0WCBTUz0lMDRYXG4iLFJFR1MuY3MsUkVHUy5kcyxSRUdTLmVzLFJFR1Muc3MpOwogZnByaW50ZihzdGRlcnIsIklQPSUwNGxYIEVGTEFHUz0lMDhsWFxuIixSRUdTLmVpcCxSRUdTLmVmbGFncyk7CgogaW9mcz0oKERXT1JEKVJFR1MuY3M8PDQpK1JFR1MuZWlwOwojdW5kZWYgUkVHUwogaW5zdD0oQllURSopbHBEb3NUYXNrLT5pbWcraW9mczsKIHByaW50ZigiT3Bjb2RlczoiKTsKIGZvciAoeD0wOyB4PDg7IHgrKykgcHJpbnRmKCIgJTAyeCIsaW5zdFt4XSk7CiBwcmludGYoIlxuIik7Cn0KCnN0YXRpYyBpbnQgRE9TVk1fSW50KCBpbnQgdmVjdCwgUENPTlRFWFQgY29udGV4dCwgTFBET1NUQVNLIGxwRG9zVGFzayApCnsKIGV4dGVybiBVSU5UMTYgRFBNSV93cmFwX3NlZzsKCiBpZiAodmVjdD09MHgzMSkgewogIGlmIChDU19yZWcoY29udGV4dCk9PURQTUlfd3JhcF9zZWcpIHsKICAgLyogZXhpdCBmcm9tIHJlYWwtbW9kZSB3cmFwcGVyICovCiAgIHJldHVybiAtMTsKICB9CiAgLyogd2UgY291bGQgcHJvYmFibHkgbW92ZSBzb21lIG90aGVyIGRvZGd5IHN0dWZmIGhlcmUgdG9vIGZyb20gZHBtaS5jICovCiB9CiBJTlRfUmVhbE1vZGVJbnRlcnJ1cHQodmVjdCxjb250ZXh0KTsKIHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBET1NWTV9TaW11bGF0ZUludCggaW50IHZlY3QsIFBDT05URVhUIGNvbnRleHQsIExQRE9TVEFTSyBscERvc1Rhc2sgKQp7CiAgRkFSUFJPQzE2IGhhbmRsZXI9SU5UX0dldFJNSGFuZGxlcih2ZWN0KTsKCiAgaWYgKFNFTEVDVE9ST0YoaGFuZGxlcik9PTB4ZjAwMCkgewogICAgLyogaWYgaW50ZXJuYWwgaW50ZXJydXB0LCBjYWxsIGl0IGRpcmVjdGx5ICovCiAgICBJTlRfUmVhbE1vZGVJbnRlcnJ1cHQodmVjdCxjb250ZXh0KTsKICB9IGVsc2UgewogICAgV09SRCpzdGFjaz0oV09SRCopKFY4NkJBU0UoY29udGV4dCkrKCgoRFdPUkQpU1NfcmVnKGNvbnRleHQpKTw8NCkrU1BfcmVnKGNvbnRleHQpKTsKICAgIFdPUkQgZmxhZz1GTF9yZWcoY29udGV4dCk7CgogICAgaWYgKElGX0VOQUJMRUQoY29udGV4dCkpIGZsYWd8PUlGX01BU0s7CiAgICBlbHNlIGZsYWcmPX5JRl9NQVNLOwoKICAgICooLS1zdGFjayk9ZmxhZzsKICAgICooLS1zdGFjayk9Q1NfcmVnKGNvbnRleHQpOwogICAgKigtLXN0YWNrKT1JUF9yZWcoY29udGV4dCk7CiAgICBTUF9yZWcoY29udGV4dCktPTY7CiAgICBDU19yZWcoY29udGV4dCk9U0VMRUNUT1JPRihoYW5kbGVyKTsKICAgIElQX3JlZyhjb250ZXh0KT1PRkZTRVRPRihoYW5kbGVyKTsKICAgIElGX0NMUihjb250ZXh0KTsKICB9Cn0KCiNkZWZpbmUgU0hPVUxEX1BFTkQoeCkgXAogICh4ICYmICgoIWxwRG9zVGFzay0+Y3VycmVudCkgfHwgKHgtPnByaW9yaXR5IDwgbHBEb3NUYXNrLT5jdXJyZW50LT5wcmlvcml0eSkpKQoKc3RhdGljIHZvaWQgRE9TVk1fU2VuZFF1ZXVlZEV2ZW50KFBDT05URVhUIGNvbnRleHQsIExQRE9TVEFTSyBscERvc1Rhc2spCnsKICBMUERPU0VWRU5UIGV2ZW50ID0gbHBEb3NUYXNrLT5wZW5kaW5nOwoKICBpZiAoU0hPVUxEX1BFTkQoZXZlbnQpKSB7CiAgICAvKiByZW1vdmUgZnJvbSAicGVuZGluZyIgbGlzdCAqLwogICAgbHBEb3NUYXNrLT5wZW5kaW5nID0gZXZlbnQtPm5leHQ7CiAgICAvKiBwcm9jZXNzIGV2ZW50ICovCiAgICBpZiAoZXZlbnQtPmlycT49MCkgewogICAgICAvKiBpdCdzIGFuIElSUSwgbW92ZSBpdCB0byAiY3VycmVudCIgbGlzdCAqLwogICAgICBldmVudC0+bmV4dCA9IGxwRG9zVGFzay0+Y3VycmVudDsKICAgICAgbHBEb3NUYXNrLT5jdXJyZW50ID0gZXZlbnQ7CiAgICAgIFRSQUNFXyhpbnQpKCJkaXNwYXRjaGluZyBJUlEgJWRcbiIsZXZlbnQtPmlycSk7CiAgICAgIC8qIG5vdGUgdGhhdCBpZiBET1NWTV9TaW11bGF0ZUludCBjYWxscyBhbiBpbnRlcm5hbCBpbnRlcnJ1cHQgZGlyZWN0bHksCiAgICAgICAqIGxwRG9zVGFzay0+Y3VycmVudCBtaWdodCBiZSBjbGVhcmVkIChhbmQgZXZlbnQgZnJlZWQpIGluIHRoaXMgdmVyeSBjYWxsISAqLwogICAgICBET1NWTV9TaW11bGF0ZUludCgoZXZlbnQtPmlycTw4KT8oZXZlbnQtPmlycSs4KTooZXZlbnQtPmlycS04KzB4NzApLGNvbnRleHQsbHBEb3NUYXNrKTsKICAgIH0gZWxzZSB7CiAgICAgIC8qIGNhbGxiYWNrIGV2ZW50ICovCiAgICAgIFRSQUNFXyhpbnQpKCJkaXNwYXRjaGluZyBjYWxsYmFjayBldmVudFxuIik7CiAgICAgICgqZXZlbnQtPnJlbGF5KShscERvc1Rhc2ssY29udGV4dCxldmVudC0+ZGF0YSk7CiAgICAgIGZyZWUoZXZlbnQpOwogICAgfQogIH0KICBpZiAoIVNIT1VMRF9QRU5EKGxwRG9zVGFzay0+cGVuZGluZykpIHsKICAgIFRSQUNFXyhpbnQpKCJjbGVhcmluZyBQZW5kaW5nIGZsYWdcbiIpOwogICAgQ0xSX1BFTkQoY29udGV4dCk7CiAgfQp9CgpzdGF0aWMgdm9pZCBET1NWTV9TZW5kUXVldWVkRXZlbnRzKFBDT05URVhUIGNvbnRleHQsIExQRE9TVEFTSyBscERvc1Rhc2spCnsKICAvKiB3ZSB3aWxsIHNlbmQgYWxsIHF1ZXVlZCBldmVudHMgYXMgbG9uZyBhcyBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkLAogICAqIGJ1dCBJUlEgZXZlbnRzIHdpbGwgZGlzYWJsZSBpbnRlcnJ1cHRzIGFnYWluICovCiAgd2hpbGUgKElTX1BFTkQoY29udGV4dCkgJiYgSUZfRU5BQkxFRChjb250ZXh0KSkKICAgIERPU1ZNX1NlbmRRdWV1ZWRFdmVudChjb250ZXh0LGxwRG9zVGFzayk7Cn0KCnZvaWQgRE9TVk1fUXVldWVFdmVudCggaW50IGlycSwgaW50IHByaW9yaXR5LCB2b2lkICgqcmVsYXkpKExQRE9TVEFTSyxQQ09OVEVYVCx2b2lkKiksIHZvaWQgKmRhdGEpCnsKICBMUERPU1RBU0sgbHBEb3NUYXNrID0gTVpfQ3VycmVudCgpOwogIExQRE9TRVZFTlQgZXZlbnQsIGN1ciwgcHJldjsKCiAgaWYgKGxwRG9zVGFzaykgewogICAgZXZlbnQgPSBtYWxsb2Moc2l6ZW9mKERPU0VWRU5UKSk7CiAgICBpZiAoIWV2ZW50KSB7CiAgICAgIEVSUl8oaW50KSgib3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGV2ZW50IGVudHJ5XG4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZXZlbnQtPmlycSA9IGlycTsgZXZlbnQtPnByaW9yaXR5ID0gcHJpb3JpdHk7CiAgICBldmVudC0+cmVsYXkgPSByZWxheTsgZXZlbnQtPmRhdGEgPSBkYXRhOwoKICAgIC8qIGluc2VydCBldmVudCBpbnRvIGxpbmtlZCBsaXN0LCBpbiBvcmRlciAqYWZ0ZXIqCiAgICAgKiBhbGwgZWFybGllciBldmVudHMgb2YgaGlnaGVyIG9yIGVxdWFsIHByaW9yaXR5ICovCiAgICBjdXIgPSBscERvc1Rhc2stPnBlbmRpbmc7IHByZXYgPSBOVUxMOwogICAgd2hpbGUgKGN1ciAmJiBjdXItPnByaW9yaXR5PD1wcmlvcml0eSkgewogICAgICBwcmV2ID0gY3VyOwogICAgICBjdXIgPSBjdXItPm5leHQ7CiAgICB9CiAgICBldmVudC0+bmV4dCA9IGN1cjsKICAgIGlmIChwcmV2KSBwcmV2LT5uZXh0ID0gZXZlbnQ7CiAgICBlbHNlIGxwRG9zVGFzay0+cGVuZGluZyA9IGV2ZW50OwogICAgCiAgICAvKiBnZXQgZG9zbW9kJ3MgYXR0ZW50aW9uIHRvIHRoZSBuZXcgZXZlbnQsIGV4Y2VwdCBmb3IgaXJxPT0wIHdoZXJlIHdlIGFscmVhZHkgaGF2ZSBpdCAqLwogICAgaWYgKGlycSAmJiAhbHBEb3NUYXNrLT5zaWdfc2VudCkgewogICAgICBUUkFDRV8oaW50KSgibmV3IGV2ZW50IHF1ZXVlZCwgc2lnbmFsbGluZyBkb3Ntb2RcbiIpOwogICAgICBraWxsKGxwRG9zVGFzay0+dGFzayxTSUdVU1IyKTsKICAgICAgbHBEb3NUYXNrLT5zaWdfc2VudCsrOwogICAgfSBlbHNlIHsKICAgICAgVFJBQ0VfKGludCkoIm5ldyBldmVudCBxdWV1ZWRcbiIpOwogICAgfQogIH0KfQoKI2RlZmluZSBDViBDUChlYXgsRUFYKTsgQ1AoZWN4LEVDWCk7IENQKGVkeCxFRFgpOyBDUChlYngsRUJYKTsgXAogICAgICAgICAgIENQKGVzaSxFU0kpOyBDUChlZGksRURJKTsgQ1AoZXNwLEVTUCk7IENQKGVicCxFQlApOyBcCiAgICAgICAgICAgQ1AoY3MsQ1MpOyBDUChkcyxEUyk7IENQKGVzLEVTKTsgXAogICAgICAgICAgIENQKHNzLFNTKTsgQ1AoZnMsRlMpOyBDUChncyxHUyk7IFwKICAgICAgICAgICBDUChlaXAsRUlQKTsgQ1AoZWZsYWdzLEVGTCkKCnN0YXRpYyBpbnQgRE9TVk1fUHJvY2VzcyggTFBET1NUQVNLIGxwRG9zVGFzaywgaW50IGZuLCBpbnQgc2lnLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2bTg2cGx1c19zdHJ1Y3QqVk04NiApCnsKIFNJR0NPTlRFWFQgc2lnY29udGV4dDsKIENPTlRFWFQgY29udGV4dDsKIGludCByZXQ9MDsKCiBpZiAoVk04Nl9UWVBFKGZuKT09Vk04Nl9VTktOT1dOKSB7CiAgLyogSU5TVFJfRW11bGF0ZUluc3RydWN0aW9uIG5lZWRzIGEgU0lHQ09OVEVYVCwgbm90IGEgQ09OVEVYVC4uLiAqLwojZGVmaW5lIENQKHgseSkgeSMjX3NpZygmc2lnY29udGV4dCkgPSBWTTg2LT5yZWdzLngKICBDVjsKI3VuZGVmIENQCiAgaWYgKGZuSU5TVFJfRW11bGF0ZUluc3RydWN0aW9uKSByZXQ9Zm5JTlNUUl9FbXVsYXRlSW5zdHJ1Y3Rpb24oJnNpZ2NvbnRleHQpOwogIGVsc2UgRVJSXyhtb2R1bGUpKCJmbklOU1RSX0VtdWxhdGVJbnN0cnVjdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQhXG4iKTsKI2RlZmluZSBDUCh4LHkpIFZNODYtPnJlZ3MueCA9IHkjI19zaWcoJnNpZ2NvbnRleHQpCiAgQ1Y7CiN1bmRlZiBDUAogIGlmIChyZXQpIHJldHVybiAwOwogIHJldD0wOwogfQojZGVmaW5lIENQKHgseSkgeSMjX3JlZygmY29udGV4dCkgPSBWTTg2LT5yZWdzLngKIENWOwojdW5kZWYgQ1AKICh2b2lkKilWODZCQVNFKCZjb250ZXh0KT1scERvc1Rhc2stPmltZzsKI2lmZGVmIFRSWV9QSUNSRVRVUk4KIGlmIChWTTg2LT52bTg2cGx1cy5mb3JjZV9yZXR1cm5fZm9yX3BpYykgewogICBTRVRfUEVORCgmY29udGV4dCk7CiB9CiNlbHNlCiAvKiBsaW51eCBkb2Vzbid0IHByZXNlcnZlIHBlbmRpbmcgZmxhZyBvbiByZXR1cm4gKi8KIGlmIChTSE9VTERfUEVORChscERvc1Rhc2stPnBlbmRpbmcpKSB7CiAgIFNFVF9QRU5EKCZjb250ZXh0KTsKIH0KI2VuZGlmCgogc3dpdGNoIChWTTg2X1RZUEUoZm4pKSB7CiAgY2FzZSBWTTg2X1NJR05BTDoKICAgVFJBQ0VfKGludCkoIkRPUyBtb2R1bGUgY2F1Z2h0IHNpZ25hbCAlZFxuIixzaWcpOwogICBpZiAoKHNpZz09U0lHQUxSTSkgfHwgKHNpZz09U0lHVVNSMikpIHsKICAgICBpZiAoc2lnPT1TSUdBTFJNKSB7CiAgICAgICBET1NWTV9RdWV1ZUV2ZW50KDAsRE9TX1BSSU9SSVRZX1JFQUxUSU1FLE5VTEwsTlVMTCk7CiAgICAgfQogICAgIGlmIChscERvc1Rhc2stPnBlbmRpbmcpIHsKICAgICAgIFRSQUNFXyhpbnQpKCJzZXR0aW5nIFBlbmRpbmcgZmxhZywgaW50ZXJydXB0cyBhcmUgY3VycmVudGx5ICVzXG4iLAogICAgICAgICAgICAgICAgIElGX0VOQUJMRUQoJmNvbnRleHQpID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CiAgICAgICBTRVRfUEVORCgmY29udGV4dCk7CiAgICAgICBET1NWTV9TZW5kUXVldWVkRXZlbnRzKCZjb250ZXh0LGxwRG9zVGFzayk7CiAgICAgfSBlbHNlIHsKICAgICAgIFRSQUNFXyhpbnQpKCJubyBldmVudHMgYXJlIHBlbmRpbmcsIGNsZWFyaW5nIFBlbmRpbmcgZmxhZ1xuIik7CiAgICAgICBDTFJfUEVORCgmY29udGV4dCk7CiAgICAgfQogICAgIGlmIChzaWc9PVNJR1VTUjIpIGxwRG9zVGFzay0+c2lnX3NlbnQtLTsKICAgfSBlbHNlCiAgIGlmIChzaWc9PVNJR0hVUCkgewogICAgaWYgKGN0eF9kZWJ1Z19jYWxsKSBjdHhfZGVidWdfY2FsbChTSUdUUkFQLCZjb250ZXh0KTsKICAgfSBlbHNlCiAgIGlmICgoc2lnPT1TSUdJTEwpfHwoc2lnPT1TSUdTRUdWKSkgewogICAgaWYgKGN0eF9kZWJ1Z19jYWxsKSBjdHhfZGVidWdfY2FsbChTSUdJTEwsJmNvbnRleHQpOwogICB9IGVsc2UgewogICAgRE9TVk1fRHVtcChscERvc1Rhc2ssZm4sc2lnLFZNODYpOwogICAgcmV0PS0xOwogICB9CiAgIGJyZWFrOwogIGNhc2UgVk04Nl9VTktOT1dOOiAvKiB1bmhhbmRsZWQgR1BGICovCiAgIERPU1ZNX0R1bXAobHBEb3NUYXNrLGZuLHNpZyxWTTg2KTsKICAgaWYgKGN0eF9kZWJ1Z19jYWxsKSBjdHhfZGVidWdfY2FsbChTSUdTRUdWLCZjb250ZXh0KTsgZWxzZSByZXQ9LTE7CiAgIGJyZWFrOwogIGNhc2UgVk04Nl9JTlR4OgogICBpZiAoVFJBQ0VfT04ocmVsYXkpKQogICAgRFBSSU5URigiQ2FsbCBET1MgaW50IDB4JTAyeCAoRUFYPSUwOGx4KSByZXQ9JTA0bHg6JTA0bHhcbiIsVk04Nl9BUkcoZm4pLGNvbnRleHQuRWF4LGNvbnRleHQuU2VnQ3MsY29udGV4dC5FaXApOwogICByZXQ9RE9TVk1fSW50KFZNODZfQVJHKGZuKSwmY29udGV4dCxscERvc1Rhc2spOwogICBpZiAoVFJBQ0VfT04ocmVsYXkpKQogICAgRFBSSU5URigiUmV0ICBET1MgaW50IDB4JTAyeCAoRUFYPSUwOGx4KSByZXQ9JTA0bHg6JTA0bHhcbiIsVk04Nl9BUkcoZm4pLGNvbnRleHQuRWF4LGNvbnRleHQuU2VnQ3MsY29udGV4dC5FaXApOwogICBicmVhazsKICBjYXNlIFZNODZfU1RJOgogIGNhc2UgVk04Nl9QSUNSRVRVUk46CiAgICBUUkFDRV8oaW50KSgiRE9TIHRhc2sgZW5hYmxlZCBpbnRlcnJ1cHRzIHdpdGggZXZlbnRzIHBlbmRpbmcsIHNlbmRpbmcgZXZlbnRzXG4iKTsKICAgIERPU1ZNX1NlbmRRdWV1ZWRFdmVudHMoJmNvbnRleHQsbHBEb3NUYXNrKTsKICAgIGJyZWFrOwogIGNhc2UgVk04Nl9UUkFQOgogICBpZiAoY3R4X2RlYnVnX2NhbGwpIGN0eF9kZWJ1Z19jYWxsKFNJR1RSQVAsJmNvbnRleHQpOwogICBicmVhazsKICBkZWZhdWx0OgogICBET1NWTV9EdW1wKGxwRG9zVGFzayxmbixzaWcsVk04Nik7CiAgIHJldD0tMTsKIH0KCiNkZWZpbmUgQ1AoeCx5KSBWTTg2LT5yZWdzLnggPSB5IyNfcmVnKCZjb250ZXh0KQogQ1Y7CiN1bmRlZiBDUAojaWZkZWYgVFJZX1BJQ1JFVFVSTgogVk04Ni0+dm04NnBsdXMuZm9yY2VfcmV0dXJuX2Zvcl9waWMgPSBJU19QRU5EKCZjb250ZXh0KSA/IDEgOiAwOwogQ0xSX1BFTkQoJmNvbnRleHQpOwojZW5kaWYKIHJldHVybiByZXQ7Cn0KCnZvaWQgRE9TVk1fUHJvY2Vzc01lc3NhZ2UoTFBET1NUQVNLIGxwRG9zVGFzayxNU0cgKm1zZykKewogIEJZVEUgc2NhbiA9IDA7CgogIGZwcmludGYoc3RkZXJyLCJnb3QgbWVzc2FnZSAlMDR4LCB3cGFyYW09JTA4eCwgbHBhcmFtPSUwOGx4XG4iLG1zZy0+bWVzc2FnZSxtc2ctPndQYXJhbSxtc2ctPmxQYXJhbSk7CiAgaWYgKChtc2ctPm1lc3NhZ2U+PVdNX01PVVNFRklSU1QpJiYKICAgICAgKG1zZy0+bWVzc2FnZTw9V01fTU9VU0VMQVNUKSkgewogICAgSU5UX0ludDMzTWVzc2FnZShtc2ctPm1lc3NhZ2UsbXNnLT53UGFyYW0sbXNnLT5sUGFyYW0pOwogIH0gZWxzZSB7CiAgICBzd2l0Y2ggKG1zZy0+bWVzc2FnZSkgewogICAgY2FzZSBXTV9LRVlVUDoKICAgICAgc2NhbiA9IDB4ODA7CiAgICBjYXNlIFdNX0tFWURPV046CiAgICAgIHNjYW4gfD0gKG1zZy0+bFBhcmFtID4+IDE2KSAmIDB4N2Y7CgogICAgICAvKiBjaGVjayB3aGV0aGVyIGV4dGVuZGVkIGJpdCBpcyBzZXQsCiAgICAgICAqIGFuZCBpZiBzbywgcXVldWUgdGhlIGV4dGVuc2lvbiBwcmVmaXggKi8KICAgICAgaWYgKG1zZy0+bFBhcmFtICYgMHgxMDAwMDAwKSB7CgkvKiBGSVhNRTogc29tZSBrZXlzIChmdW5jdGlvbiBrZXlzKSBoYXZlCgkgKiBleHRlbmRlZCBiaXQgc2V0IGV2ZW4gd2hlbiB0aGV5IHNob3VsZG4ndCwKCSAqIHNob3VsZCBjaGVjayBmb3IgdGhlbSAqLwoJSU5UX0ludDA5U2VuZFNjYW4oMHhFMCk7CiAgICAgIH0KICAgICAgSU5UX0ludDA5U2VuZFNjYW4oc2Nhbik7CiAgICAgIGJyZWFrOwogICAgfQogIH0KfQoKdm9pZCBET1NWTV9XYWl0KCBpbnQgcmVhZF9waXBlLCBIQU5ETEUgaE9iamVjdCApCnsKICBMUERPU1RBU0sgbHBEb3NUYXNrID0gTVpfQ3VycmVudCgpOwogIE1TRyBtc2c7CiAgRFdPUkQgd2FpdHJldDsKICBCT09MIGdvdF9tc2cgPSBGQUxTRTsKCiAgZG8gewogICAgLyogY2hlY2sgZm9yIG1lc3NhZ2VzICh3YXN0ZSB0aW1lIGJlZm9yZSB0aGUgcmVzcG9uc2UgY2hlY2sgYmVsb3cpICovCiAgICB3aGlsZSAoUGVla01lc3NhZ2VBKCZtc2csMCwwLDAsUE1fUkVNT1ZFfFBNX05PWUlFTEQpKSB7CiAgICAgIC8qIGdvdCBhIG1lc3NhZ2UgKi8KICAgICAgRE9TVk1fUHJvY2Vzc01lc3NhZ2UobHBEb3NUYXNrLCZtc2cpOwogICAgICAvKiB3ZSBkb24ndCBuZWVkIGEgVHJhbnNsYXRlTWVzc2FnZSBoZXJlICovCiAgICAgIERpc3BhdGNoTWVzc2FnZUEoJm1zZyk7CiAgICAgIGdvdF9tc2cgPSBUUlVFOwogICAgfQogICAgaWYgKHJlYWRfcGlwZSA9PSAtMSkgewogICAgICBpZiAoZ290X21zZykgYnJlYWs7CiAgICB9IGVsc2UgewogICAgICBmZF9zZXQgcmVhZGZkczsKICAgICAgc3RydWN0IHRpbWV2YWwgdGltZW91dD17MCwwfTsKICAgICAgLyogcXVpY2sgY2hlY2sgZm9yIHJlc3BvbnNlIGZyb20gZG9zbW9kCiAgICAgICAqIChmYXN0ZXIgdGhhbiBkb2luZyB0aGUgZnVsbCBibG9ja2luZyB3YWl0LCBpZiBkYXRhIGFscmVhZHkgYXZhaWxhYmxlKSAqLwogICAgICBGRF9aRVJPKCZyZWFkZmRzKTsgRkRfU0VUKHJlYWRfcGlwZSwmcmVhZGZkcyk7CiAgICAgIGlmIChzZWxlY3QocmVhZF9waXBlKzEsJnJlYWRmZHMsTlVMTCxOVUxMLCZ0aW1lb3V0KT4wKQoJYnJlYWs7CiAgICB9CiAgICAvKiBjaGVjayBmb3IgZGF0YSBmcm9tIHdpbjMyIGNvbnNvbGUgZGV2aWNlICovCgogICAgLyogbm90aGluZyB5ZXQsIGJsb2NrIHdoaWxlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBkbyAqLwogICAgd2FpdHJldD1Nc2dXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKDEsJmhPYmplY3QsRkFMU0UsSU5GSU5JVEUsUVNfQUxMSU5QVVQpOwogICAgaWYgKHdhaXRyZXQ9PShEV09SRCktMSkgewogICAgICBFUlJfKG1vZHVsZSkoImRvc3ZtIHdhaXQgZXJyb3I9JWxkXG4iLEdldExhc3RFcnJvcigpKTsKICAgIH0KICAgIGlmIChyZWFkX3BpcGUgIT0gLTEpIHsKICAgICAgaWYgKHdhaXRyZXQ9PVdBSVRfT0JKRUNUXzApIGJyZWFrOwogICAgfQogIH0gd2hpbGUgKFRSVUUpOwp9CgppbnQgRE9TVk1fRW50ZXIoIFBDT05URVhUIGNvbnRleHQgKQp7CiBMUERPU1RBU0sgbHBEb3NUYXNrID0gTVpfQ3VycmVudCgpOwogc3RydWN0IHZtODZwbHVzX3N0cnVjdCBWTTg2OwogaW50IHN0YXQsbGVuLHNpZzsKCiBpZiAoIWxwRG9zVGFzaykgewogIC8qIE1aX0NyZWF0ZVByb2Nlc3Mgb3IgTVpfQWxsb2NEUE1JVGFzayBzaG91bGQgaGF2ZSBiZWVuIGNhbGxlZCBmaXJzdCAqLwogIEVSUl8obW9kdWxlKSgiZG9zbW9kIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCEiKTsKICByZXR1cm4gLTE7CiB9CgogaWYgKGNvbnRleHQpIHsKI2RlZmluZSBDUCh4LHkpIFZNODYucmVncy54ID0geSMjX3JlZyhjb250ZXh0KQogIENWOwojdW5kZWYgQ1AKICBpZiAoVk04Ni5yZWdzLmVmbGFncyAmIElGX01BU0spCiAgICBWTTg2LnJlZ3MuZWZsYWdzIHw9IFZJRl9NQVNLOwogfSBlbHNlIHsKLyogaW5pdGlhbCBzZXR1cCAqLwogIC8qIGFsbG9jYXRlIHN0YW5kYXJkIERPUyBoYW5kbGVzICovCiAgRklMRV9Jbml0UHJvY2Vzc0Rvc0hhbmRsZXMoKTsgCiAgLyogcmVnaXN0ZXJzICovCiAgbWVtc2V0KCZWTTg2LDAsc2l6ZW9mKFZNODYpKTsKICBWTTg2LnJlZ3MuY3M9bHBEb3NUYXNrLT5pbml0X2NzOwogIFZNODYucmVncy5laXA9bHBEb3NUYXNrLT5pbml0X2lwOwogIFZNODYucmVncy5zcz1scERvc1Rhc2stPmluaXRfc3M7CiAgVk04Ni5yZWdzLmVzcD1scERvc1Rhc2stPmluaXRfc3A7CiAgVk04Ni5yZWdzLmRzPWxwRG9zVGFzay0+cHNwX3NlZzsKICBWTTg2LnJlZ3MuZXM9bHBEb3NUYXNrLT5wc3Bfc2VnOwogIFZNODYucmVncy5lZmxhZ3M9VklGX01BU0s7CiAgLyogaG1tLCB3aGF0IGVsc2UgZG8gd2UgbmVlZD8gKi8KIH0KCiAvKiBtYWluIGV4Y2hhbmdlIGxvb3AgKi8KIGRvIHsKICBzdGF0ID0gVk04Nl9FTlRFUjsKICBlcnJubyA9IDA7CiAgLyogdHJhbnNtaXQgVk04NiBzdHJ1Y3R1cmUgdG8gZG9zbW9kIHRhc2sgKi8KICBpZiAod3JpdGUobHBEb3NUYXNrLT53cml0ZV9waXBlLCZzdGF0LHNpemVvZihzdGF0KSkhPXNpemVvZihzdGF0KSkgewogICBFUlJfKG1vZHVsZSkoImRvc21vZCBzeW5jIGxvc3QsIGVycm5vPSVkLCBmZD0lZCwgcGlkPSVkXG4iLGVycm5vLGxwRG9zVGFzay0+d3JpdGVfcGlwZSxnZXRwaWQoKSk7CiAgIHJldHVybiAtMTsKICB9CiAgaWYgKHdyaXRlKGxwRG9zVGFzay0+d3JpdGVfcGlwZSwmVk04NixzaXplb2YoVk04NikpIT1zaXplb2YoVk04NikpIHsKICAgRVJSXyhtb2R1bGUpKCJkb3Ntb2Qgc3luYyBsb3N0LCBlcnJubz0lZFxuIixlcnJubyk7CiAgIHJldHVybiAtMTsKICB9CiAgLyogd2FpdCBmb3IgcmVzcG9uc2UsIGRvaW5nIG90aGVyIHRoaW5ncyBpbiB0aGUgbWVhbnRpbWUgKi8KICBET1NWTV9XYWl0KGxwRG9zVGFzay0+cmVhZF9waXBlLCBscERvc1Rhc2stPmhSZWFkUGlwZSk7CiAgLyogcmVhZCByZXNwb25zZSAqLwogIHdoaWxlICgxKSB7CiAgICBpZiAoKGxlbj1yZWFkKGxwRG9zVGFzay0+cmVhZF9waXBlLCZzdGF0LHNpemVvZihzdGF0KSkpPT1zaXplb2Yoc3RhdCkpIGJyZWFrOwogICAgaWYgKCgoZXJybm89PUVJTlRSKXx8KGVycm5vPT1FQUdBSU4pKSYmKGxlbjw9MCkpIHsKICAgICBXQVJOXyhtb2R1bGUpKCJyZXJlYWRpbmcgZG9zbW9kIHJldHVybiBjb2RlIGR1ZSB0byBlcnJubz0lZCwgcmVzdWx0PSVkXG4iLGVycm5vLGxlbik7CiAgICAgY29udGludWU7CiAgICB9CiAgICBFUlJfKG1vZHVsZSkoImRvc21vZCBzeW5jIGxvc3QgcmVhZGluZyByZXR1cm4gY29kZSwgZXJybm89JWQsIHJlc3VsdD0lZFxuIixlcnJubyxsZW4pOwogICAgcmV0dXJuIC0xOwogIH0KICBUUkFDRV8obW9kdWxlKSgiZG9zbW9kIHJldHVybiBjb2RlPSVkXG4iLHN0YXQpOwogIHdoaWxlICgxKSB7CiAgICBpZiAoKGxlbj1yZWFkKGxwRG9zVGFzay0+cmVhZF9waXBlLCZWTTg2LHNpemVvZihWTTg2KSkpPT1zaXplb2YoVk04NikpIGJyZWFrOwogICAgaWYgKCgoZXJybm89PUVJTlRSKXx8KGVycm5vPT1FQUdBSU4pKSYmKGxlbjw9MCkpIHsKICAgICBXQVJOXyhtb2R1bGUpKCJyZXJlYWRpbmcgZG9zbW9kIFZNODYgc3RydWN0dXJlIGR1ZSB0byBlcnJubz0lZCwgcmVzdWx0PSVkXG4iLGVycm5vLGxlbik7CiAgICAgY29udGludWU7CiAgICB9CiAgICBFUlJfKG1vZHVsZSkoImRvc21vZCBzeW5jIGxvc3QgcmVhZGluZyBWTTg2IHN0cnVjdHVyZSwgZXJybm89JWQsIHJlc3VsdD0lZFxuIixlcnJubyxsZW4pOwogICAgcmV0dXJuIC0xOwogIH0KICBpZiAoKHN0YXQmMHhmZik9PURPU01PRF9TSUdOQUwpIHsKICAgIHdoaWxlICgxKSB7CiAgICAgIGlmICgobGVuPXJlYWQobHBEb3NUYXNrLT5yZWFkX3BpcGUsJnNpZyxzaXplb2Yoc2lnKSkpPT1zaXplb2Yoc2lnKSkgYnJlYWs7CiAgICAgIGlmICgoKGVycm5vPT1FSU5UUil8fChlcnJubz09RUFHQUlOKSkmJihsZW48PTApKSB7CglXQVJOXyhtb2R1bGUpKCJyZXJlYWRpbmcgZG9zbW9kIHNpZ25hbCBkdWUgdG8gZXJybm89JWQsIHJlc3VsdD0lZFxuIixlcnJubyxsZW4pOwoJY29udGludWU7CiAgICAgIH0KICAgICAgRVJSXyhtb2R1bGUpKCJkb3Ntb2Qgc3luYyBsb3N0IHJlYWRpbmcgc2lnbmFsLCBlcnJubz0lZCwgcmVzdWx0PSVkXG4iLGVycm5vLGxlbik7CiAgICAgIHJldHVybiAtMTsKICAgIH0gd2hpbGUgKDApOwogIH0gZWxzZSBzaWc9MDsKICAvKiBnb3QgcmVzcG9uc2UgKi8KIH0gd2hpbGUgKERPU1ZNX1Byb2Nlc3MobHBEb3NUYXNrLHN0YXQsc2lnLCZWTTg2KT49MCk7CgogaWYgKGNvbnRleHQpIHsKI2RlZmluZSBDUCh4LHkpIHkjI19yZWcoY29udGV4dCkgPSBWTTg2LnJlZ3MueAogIENWOwojdW5kZWYgQ1AKIH0KIHJldHVybiAwOwp9Cgp2b2lkIERPU1ZNX1BJQ19pb3BvcnRfb3V0KCBXT1JEIHBvcnQsIEJZVEUgdmFsKQp7CiAgTFBET1NUQVNLIGxwRG9zVGFzayA9IE1aX0N1cnJlbnQoKTsKICBMUERPU0VWRU5UIGV2ZW50OwoKICBpZiAobHBEb3NUYXNrKSB7CiAgICBpZiAoKHBvcnQ9PTB4MjApICYmICh2YWw9PTB4MjApKSB7CiAgICAgIGlmIChscERvc1Rhc2stPmN1cnJlbnQpIHsKCS8qIEVPSSAoRW5kIE9mIEludGVycnVwdCkgKi8KCVRSQUNFXyhpbnQpKCJyZWNlaXZlZCBFT0kgZm9yIGN1cnJlbnQgSVJRLCBjbGVhcmluZ1xuIik7CglldmVudCA9IGxwRG9zVGFzay0+Y3VycmVudDsKCWxwRG9zVGFzay0+Y3VycmVudCA9IGV2ZW50LT5uZXh0OwoJaWYgKGV2ZW50LT5yZWxheSkKCSgqZXZlbnQtPnJlbGF5KShscERvc1Rhc2ssTlVMTCxldmVudC0+ZGF0YSk7CglmcmVlKGV2ZW50KTsKCglpZiAobHBEb3NUYXNrLT5wZW5kaW5nICYmCgkgICAgIWxwRG9zVGFzay0+c2lnX3NlbnQpIHsKCSAgLyogYW5vdGhlciBldmVudCBpcyBwZW5kaW5nLCB3aGljaCB3ZSBzaG91bGQgcHJvYmFibHkKCSAgICogYmUgYWJsZSB0byBwcm9jZXNzIG5vdywgc28gdGVsbCBkb3Ntb2QgYWJvdXQgaXQgKi8KCSAgVFJBQ0VfKGludCkoImFub3RoZXIgZXZlbnQgcGVuZGluZywgc2lnbmFsbGluZyBkb3Ntb2RcbiIpOwoJICBraWxsKGxwRG9zVGFzay0+dGFzayxTSUdVU1IyKTsKCSAgbHBEb3NUYXNrLT5zaWdfc2VudCsrOwoJfQogICAgICB9IGVsc2UgewoJV0FSTl8oaW50KSgiRU9JIHdpdGhvdXQgYWN0aXZlIElSUVxuIik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIEZJWE1FXyhpbnQpKCJ1bnJlY29nbml6ZWQgUElDIGNvbW1hbmQgJTAyeFxuIix2YWwpOwogICAgfQogIH0KfQoKdm9pZCBET1NWTV9TZXRUaW1lciggdW5zaWduZWQgdGlja3MgKQp7CiAgTFBET1NUQVNLIGxwRG9zVGFzayA9IE1aX0N1cnJlbnQoKTsKICBpbnQgc3RhdD1ET1NNT0RfU0VUX1RJTUVSOwogIHN0cnVjdCB0aW1ldmFsIHRpbTsKCiAgaWYgKGxwRG9zVGFzaykgewogICAgLyogdGhlIFBDIGNsb2NrcyB0aWNrcyBhdCAxMTkzMTgwIEh6ICovCiAgICB0aW0udHZfc2VjPTA7CiAgICB0aW0udHZfdXNlYz0oKHVuc2lnbmVkIGxvbmcgbG9uZyl0aWNrcyoxMDAwMDAwKS8xMTkzMTgwOwogICAgLyogc2FuaXR5IGNoZWNrICovCiAgICBpZiAoIXRpbS50dl91c2VjKSB0aW0udHZfdXNlYz0xOwoKICAgIGlmICh3cml0ZShscERvc1Rhc2stPndyaXRlX3BpcGUsJnN0YXQsc2l6ZW9mKHN0YXQpKSE9c2l6ZW9mKHN0YXQpKSB7CiAgICAgIEVSUl8obW9kdWxlKSgiZG9zbW9kIHN5bmMgbG9zdCwgZXJybm89JWRcbiIsZXJybm8pOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAod3JpdGUobHBEb3NUYXNrLT53cml0ZV9waXBlLCZ0aW0sc2l6ZW9mKHRpbSkpIT1zaXplb2YodGltKSkgewogICAgICBFUlJfKG1vZHVsZSkoImRvc21vZCBzeW5jIGxvc3QsIGVycm5vPSVkXG4iLGVycm5vKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLyogdGhlcmUncyBubyByZXR1cm4gKi8KICB9Cn0KCnVuc2lnbmVkIERPU1ZNX0dldFRpbWVyKCB2b2lkICkKewogIExQRE9TVEFTSyBscERvc1Rhc2sgPSBNWl9DdXJyZW50KCk7CiAgaW50IHN0YXQ9RE9TTU9EX0dFVF9USU1FUjsKICBzdHJ1Y3QgdGltZXZhbCB0aW07CgogIGlmIChscERvc1Rhc2spIHsKICAgIGlmICh3cml0ZShscERvc1Rhc2stPndyaXRlX3BpcGUsJnN0YXQsc2l6ZW9mKHN0YXQpKSE9c2l6ZW9mKHN0YXQpKSB7CiAgICAgIEVSUl8obW9kdWxlKSgiZG9zbW9kIHN5bmMgbG9zdCwgZXJybm89JWRcbiIsZXJybm8pOwogICAgICByZXR1cm4gMDsKICAgIH0KICAgIC8qIHJlYWQgcmVzcG9uc2UgKi8KICAgIHdoaWxlICgxKSB7CiAgICAgIGlmIChyZWFkKGxwRG9zVGFzay0+cmVhZF9waXBlLCZ0aW0sc2l6ZW9mKHRpbSkpPT1zaXplb2YodGltKSkgYnJlYWs7CiAgICAgIGlmICgoZXJybm89PUVJTlRSKXx8KGVycm5vPT1FQUdBSU4pKSBjb250aW51ZTsKICAgICAgRVJSXyhtb2R1bGUpKCJkb3Ntb2Qgc3luYyBsb3N0LCBlcnJubz0lZFxuIixlcnJubyk7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgcmV0dXJuICgodW5zaWduZWQgbG9uZyBsb25nKXRpbS50dl91c2VjKjExOTMxODApLzEwMDAwMDA7CiAgfQogIHJldHVybiAwOwp9Cgp2b2lkIERPU1ZNX1NldFN5c3RlbURhdGEoIGludCBpZCwgdm9pZCAqZGF0YSApCnsKICBMUERPU1RBU0sgbHBEb3NUYXNrID0gTVpfQ3VycmVudCgpOwogIERPU1NZU1RFTSAqc3lzLCAqcHJldjsKCiAgaWYgKGxwRG9zVGFzaykgewogICAgc3lzID0gbHBEb3NUYXNrLT5zeXM7CiAgICBwcmV2ID0gTlVMTDsKICAgIHdoaWxlIChzeXMgJiYgKHN5cy0+aWQgIT0gaWQpKSB7CiAgICAgIHByZXYgPSBzeXM7CiAgICAgIHN5cyA9IHN5cy0+bmV4dDsKICAgIH0KICAgIGlmIChzeXMpIHsKICAgICAgZnJlZShzeXMtPmRhdGEpOwogICAgICBzeXMtPmRhdGEgPSBkYXRhOwogICAgfSBlbHNlIHsKICAgICAgc3lzID0gbWFsbG9jKHNpemVvZihET1NTWVNURU0pKTsKICAgICAgc3lzLT5pZCA9IGlkOwogICAgICBzeXMtPmRhdGEgPSBkYXRhOwogICAgICBzeXMtPm5leHQgPSBOVUxMOwogICAgICBpZiAocHJldikgcHJldi0+bmV4dCA9IHN5czsKICAgICAgZWxzZSBscERvc1Rhc2stPnN5cyA9IHN5czsKICAgIH0KICB9IGVsc2UgZnJlZShkYXRhKTsKfQoKdm9pZCogRE9TVk1fR2V0U3lzdGVtRGF0YSggaW50IGlkICkKewogIExQRE9TVEFTSyBscERvc1Rhc2sgPSBNWl9DdXJyZW50KCk7CiAgRE9TU1lTVEVNICpzeXM7CgogIGlmIChscERvc1Rhc2spIHsKICAgIHN5cyA9IGxwRG9zVGFzay0+c3lzOwogICAgd2hpbGUgKHN5cyAmJiAoc3lzLT5pZCAhPSBpZCkpCiAgICAgIHN5cyA9IHN5cy0+bmV4dDsKICAgIGlmIChzeXMpCiAgICAgIHJldHVybiBzeXMtPmRhdGE7CiAgfQogIHJldHVybiBOVUxMOwp9CgojZWxzZSAvKiAhTVpfU1VQUE9SVEVEICovCgppbnQgRE9TVk1fRW50ZXIoIFBDT05URVhUIGNvbnRleHQgKQp7CiBFUlJfKG1vZHVsZSkoIkRPUyByZWFsbW9kZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgYXJjaGl0ZWN0dXJlIVxuIik7CiByZXR1cm4gLTE7Cn0KCnZvaWQgRE9TVk1fV2FpdCggaW50IHJlYWRfcGlwZSwgSEFORExFIGhPYmplY3QpIHt9CnZvaWQgRE9TVk1fUElDX2lvcG9ydF9vdXQoIFdPUkQgcG9ydCwgQllURSB2YWwpIHt9CnZvaWQgRE9TVk1fU2V0VGltZXIoIHVuc2lnbmVkIHRpY2tzICkge30KdW5zaWduZWQgRE9TVk1fR2V0VGltZXIoIHZvaWQgKSB7IHJldHVybiAwOyB9CnZvaWQgRE9TVk1fU2V0U3lzdGVtRGF0YSggaW50IGlkLCB2b2lkICpkYXRhICkgeyBmcmVlKGRhdGEpOyB9CnZvaWQqIERPU1ZNX0dldFN5c3RlbURhdGEoIGludCBpZCApIHsgcmV0dXJuIE5VTEw7IH0Kdm9pZCBET1NWTV9RdWV1ZUV2ZW50KCBpbnQgaXJxLCBpbnQgcHJpb3JpdHksIHZvaWQgKCpyZWxheSkoTFBET1NUQVNLLFBDT05URVhULHZvaWQqKSwgdm9pZCAqZGF0YSkge30KCiNlbmRpZgo=