ZGlmZiAtLWdpdCBhLy5lZGl0b3Jjb25maWcgYi8uZWRpdG9yY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5M2I3YmUKLS0tIC9kZXYvbnVsbAorKysgYi8uZWRpdG9yY29uZmlnCkBAIC0wLDAgKzEsMTkgQEAKKyMgVG8gdXNlIHRoaXMgY29uZmlnIHdpdGggeW91ciBlZGl0b3IsIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGF0OgorIyBodHRwOi8vZWRpdG9yY29uZmlnLm9yZworCityb290ID0gdHJ1ZQorCitbKl0KK2NoYXJzZXQgPSB1dGYtOAoraW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlCisKK1sqLntjLGh9XQoraW5kZW50X3N0eWxlID0gc3BhY2UKK2luZGVudF9zaXplID0gNAorCitbe01ha2VmaWxlLiosKi5ta31dCitpbmRlbnRfc3R5bGUgPSB0YWIKKworWyoubTRdCitpbmRlbnRfc3R5bGUgPSBzcGFjZQoraW5kZW50X3NpemUgPSAyCmRpZmYgLS1naXQgYS8uZ2l0aWdub3JlIGIvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTFlNjE5Ci0tLSAvZGV2L251bGwKKysrIGIvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDEwOCBAQAorYnNkLWNvcmUvKi9ACitic2QtY29yZS8qL21hY2hpbmUKKyp+CisqLjEKKyouMworKi41CisqLjcKKyouZmxhZ3MKKyoua28KKyoua28uY21kCisqLmxhCisqLmxvCisqLmxvZworKi5tb2QuYworKi5tb2QubworKi5vCisqLm8uY21kCisqLnN3PworKi50cnMKKy5kZXBlbmQKKy5kZXBzCisubGlicworLnRtcF92ZXJzaW9ucworLipjaGVjayoKKy4qaW5zdGFsbCoKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorVEFHUworYWNsb2NhbC5tNAorYXV0b200dGUuY2FjaGUKK2J1aWxkLWF1eAorYnVzX2lmLmgKK2NvbXBpbGUKK2NvbmZpZy5ndWVzcworY29uZmlnLmgKK2NvbmZpZy5oLmluCitjb25maWcubG9nCitjb25maWcuc3RhdHVzCitjb25maWcuc3ViCitjb25maWd1cmUKK2NvbmZpZ3VyZS5saW5lbm8KK2NzY29wZS4qCitkZXBjb21wCitkZXZpY2VfaWYuaAorZHJtLmtsZAorZHJtX3BjaWlkcy5oCitleHBvcnRfc3ltcworaTkxNS5rbGQKK2luc3RhbGwtc2gKK2xpYmRybS9jb25maWcuaC5pbgorbGliZHJtLnBjCitsaWJkcm1faW50ZWwucGMKK2xpYmRybV9ub3V2ZWF1LnBjCitsaWJkcm1fcmFkZW9uLnBjCitsaWJkcm1fb21hcC5wYworbGliZHJtX2V4eW5vcy5wYworbGliZHJtX2ZyZWVkcmVuby5wYworbGliZHJtX2FtZGdwdS5wYworbGliZHJtX3ZjNC5wYworbGliZHJtX2V0bmF2aXYucGMKK2xpYmttcy5wYworbGlidG9vbAorbHRtYWluLnNoCittYWNoNjQua2xkCittYW4vLm1hbl9maXh1cAorbWdhLmtsZAorbWlzc2luZworbWtpbnN0YWxsZGlycworb3B0X2RybS5oCitwY2lfaWYuaAorcjEyOC5rbGQKK3JhZGVvbi5rbGQKK3NhdmFnZS5rbGQKK3Npcy5rbGQKK3N0YW1wLWgxCit0ZGZ4LmtsZAordmlhLmtsZAordGVzdHMvYXV0aAordGVzdHMvYW1kZ3B1L2FtZGdwdV90ZXN0Cit0ZXN0cy9kcmlzdGF0Cit0ZXN0cy9kcm1kZXZpY2UKK3Rlc3RzL2RybXNsCit0ZXN0cy9kcm1zdGF0Cit0ZXN0cy9nZXRjbGllbnQKK3Rlc3RzL2dldHN0YXRzCit0ZXN0cy9nZXR2ZXJzaW9uCit0ZXN0cy9oYXNoCit0ZXN0cy9sb2NrCit0ZXN0cy9vcGVuY2xvc2UKK3Rlc3RzL3JhbmRvbQordGVzdHMvc2V0dmVyc2lvbgordGVzdHMvdXBkYXRlZHJhdwordGVzdHMvbW9kZXByaW50L21vZGVwcmludAordGVzdHMvbW9kZXRlc3QvbW9kZXRlc3QKK3Rlc3RzL25hbWVfZnJvbV9mZAordGVzdHMvcHJvcHRlc3QvcHJvcHRlc3QKK3Rlc3RzL2ttcy9rbXMtc3RlYWwtY3J0YwordGVzdHMva21zL2ttcy11bml2ZXJzYWwtcGxhbmVzCit0ZXN0cy9rbXN0ZXN0L2ttc3Rlc3QKK3Rlc3RzL3ZibHRlc3QvdmJsdGVzdAordGVzdHMvcmFkZW9uL3JhZGVvbl90dG0KK3Rlc3RzL2V4eW5vcy9leHlub3NfZmltZzJkX2V2ZW50Cit0ZXN0cy9leHlub3MvZXh5bm9zX2ZpbWcyZF9wZXJmCit0ZXN0cy9leHlub3MvZXh5bm9zX2ZpbWcyZF90ZXN0Cit0ZXN0cy9ldG5hdml2L2V0bmF2aXZfMmRfdGVzdAordGVzdHMvZXRuYXZpdi9ldG5hdml2X2NtZF9zdHJlYW1fdGVzdAordGVzdHMvZXRuYXZpdi9ldG5hdml2X2JvX2NhY2hlX3Rlc3QKK21hbi8qLjMKZGlmZiAtLWdpdCBhL0FuZHJvaWQuY29tbW9uLm1rIGIvQW5kcm9pZC5jb21tb24ubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ4N2FjYgotLS0gL2Rldi9udWxsCisrKyBiL0FuZHJvaWQuY29tbW9uLm1rCkBAIC0wLDAgKzEsMTcgQEAKKyMgWFhYOiBDb25zaWRlciBtb3ZpbmcgdGhlc2UgdG8gY29uZmlnLmggYW5hbG9nb3VzIHRvIGF1dG9jb25mLgorTE9DQUxfQ0ZMQUdTICs9IFwKKwktRE1BSk9SX0lOX1NZU01BQ1JPUz0xIFwKKwktREhBVkVfVklTSUJJTElUWT0xIFwKKwktREhBVkVfTElCRFJNX0FUT01JQ19QUklNSVRJVkVTPTEKKworTE9DQUxfQ0ZMQUdTICs9IFwKKwktV25vLXVudXNlZC1wYXJhbWV0ZXIgXAorCS1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgXAorCS1Xbm8tcG9pbnRlci1hcml0aCBcCisJLVduby1lbnVtLWNvbnZlcnNpb24KKworIyBRdWlldCBkb3duIHRoZSBidWlsZCBzeXN0ZW0gYW5kIHJlbW92ZSBhbnkgLmggZmlsZXMgZnJvbSB0aGUgc291cmNlcworTE9DQUxfU1JDX0ZJTEVTIDo9ICQocGF0c3Vic3QgJS5oLCAsICQoTE9DQUxfU1JDX0ZJTEVTKSkKK0xPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyArPSAkKExPQ0FMX1BBVEgpCisKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCmRpZmYgLS1naXQgYS9BbmRyb2lkLm1rIGIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTdhMjhhCi0tLSAvZGV2L251bGwKKysrIGIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDY0IEBACisjCisjIENvcHlyaWdodCDCqSAyMDExLTIwMTIgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyMgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyMgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorIyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyMgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisjIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyMgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorIyBTb2Z0d2FyZS4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyMgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorIyBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorIyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworIyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisjIElOIFRIRSBTT0ZUV0FSRS4KKyMKKworTElCRFJNX0NPTU1PTl9NSyA6PSAkKGNhbGwgbXktZGlyKS9BbmRyb2lkLmNvbW1vbi5taworCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitMSUJEUk1fVE9QIDo9ICQoTE9DQUxfUEFUSCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgSW1wb3J0IHZhcmlhYmxlcyBMSUJEUk1feyxIXyxJTkNMVURFX0hfLElOQ0xVREVfVk1XR0ZYX0hffUZJTEVTCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvTWFrZWZpbGUuc291cmNlcworCisjc3RhdGljIGxpYnJhcnkgZm9yIHRoZSBkZXZpY2UgKHJlY292ZXJ5KQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gbGliZHJtX2FuZHJvaWQKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoTElCRFJNX0ZJTEVTKQorTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9IFwKKwkkKExPQ0FMX1BBVEgpIFwKKwkkKExPQ0FMX1BBVEgpL2luY2x1ZGUvZHJtCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorCSQoTE9DQUxfUEFUSCkvaW5jbHVkZS9kcm0KKworaW5jbHVkZSAkKExJQkRSTV9DT01NT05fTUspCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKKyMgU2hhcmVkIGxpYnJhcnkgZm9yIHRoZSBkZXZpY2UKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGxpYmRybV9hbmRyb2lkCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKExJQkRSTV9GSUxFUykKK0xPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZS9kcm0KKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZS9kcm0KKworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitpbmNsdWRlICQoTElCRFJNX0NPTU1PTl9NSykKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpL3ZpdmFudGUvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyMzc4ZgotLS0gL2Rldi9udWxsCisrKyBiL0NPUFlJTkcKQEAgLTAsMCArMSwxNSBAQAorIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKKyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgpkaWZmIC0tZ2l0IGEvQ2xlYW5TcGVjLm1rIGIvQ2xlYW5TcGVjLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YTExZGIKLS0tIC9kZXYvbnVsbAorKysgYi9DbGVhblNwZWMubWsKQEAgLTAsMCArMSw0IEBACiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovaW5jbHVkZS9saWJkcm0pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovaW5jbHVkZS9mcmVlZHJlbm8pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJkcm1fKmludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU1RBVElDX0xJQlJBUklFUy9saWJkcm1fKmludGVybWVkaWF0ZXMpCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5hbSBiL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OTE2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE1MCBAQAorIyAgQ29weXJpZ2h0IDIwMDUgQWRhbSBKYWNrc29uLgorIworIyAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyMgIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisjICB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisjICBvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViCisjICBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorIyAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisjICBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisjICBTb2Z0d2FyZS4KKyMKKyMgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisjICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyMgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyMgIEFEQU0gSkFDS1NPTiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyMgIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisjICBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitpbmNsdWRlIE1ha2VmaWxlLnNvdXJjZXMKKworQUNMT0NBTF9BTUZMQUdTID0gLUkgbTQgJHtBQ0xPQ0FMX0ZMQUdTfQorCitBTV9NQUtFRkxBR1MgPSAtcworQU1fRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHUyA9IFwKKwktLWVuYWJsZS11ZGV2IFwKKwktLWVuYWJsZS1saWJrbXMgXAorCS0tZW5hYmxlLWludGVsIFwKKwktLWVuYWJsZS1yYWRlb24gXAorCS0tZW5hYmxlLWFtZGdwdSBcCisJLS1lbmFibGUtbm91dmVhdSBcCisJLS1lbmFibGUtdmM0IFwKKwktLWVuYWJsZS12bXdnZnggXAorCS0tZW5hYmxlLW9tYXAtZXhwZXJpbWVudGFsLWFwaSBcCisJLS1lbmFibGUtZXh5bm9zLWV4cGVyaW1lbnRhbC1hcGkgXAorCS0tZW5hYmxlLWZyZWVkcmVubyBcCisJLS1lbmFibGUtZnJlZWRyZW5vLWtnc2xcCisJLS1lbmFibGUtdGVncmEtZXhwZXJpbWVudGFsLWFwaSBcCisJLS1lbmFibGUtZXRuYXZpdi1leHBlcmltZW50YWwtYXBpIFwKKwktLWVuYWJsZS12aXZhbnRlLWV4cGVyaW1lbnRhbC1hcGkgXAorCS0tZW5hYmxlLWluc3RhbGwtdGVzdC1wcm9ncmFtcyBcCisJLS1lbmFibGUtY2Fpcm8tdGVzdHMgXAorCS0tZW5hYmxlLW1hbnBhZ2VzIFwKKwktLWVuYWJsZS12YWxncmluZAorCitwa2djb25maWdkaXIgPSBAcGtnY29uZmlnZGlyQAorcGtnY29uZmlnX0RBVEEgPSBsaWJkcm0ucGMKKworaWYgSEFWRV9MSUJLTVMKK0xJQktNU19TVUJESVIgPSBsaWJrbXMKK2VuZGlmCisKK2lmIEhBVkVfSU5URUwKK0lOVEVMX1NVQkRJUiA9IGludGVsCitlbmRpZgorCitpZiBIQVZFX05PVVZFQVUKK05PVVZFQVVfU1VCRElSID0gbm91dmVhdQorZW5kaWYKKworaWYgSEFWRV9SQURFT04KK1JBREVPTl9TVUJESVIgPSByYWRlb24KK2VuZGlmCisKK2lmIEhBVkVfQU1ER1BVCitBTURHUFVfU1VCRElSID0gYW1kZ3B1CitlbmRpZgorCitpZiBIQVZFX09NQVAKK09NQVBfU1VCRElSID0gb21hcAorZW5kaWYKKworaWYgSEFWRV9FWFlOT1MKK0VYWU5PU19TVUJESVIgPSBleHlub3MKK2VuZGlmCisKK2lmIEhBVkVfRlJFRURSRU5PCitGUkVFRFJFTk9fU1VCRElSID0gZnJlZWRyZW5vCitlbmRpZgorCitpZiBIQVZFX1RFR1JBCitURUdSQV9TVUJESVIgPSB0ZWdyYQorZW5kaWYKKworaWYgSEFWRV9WQzQKK1ZDNF9TVUJESVIgPSB2YzQKK2VuZGlmCisKK2lmIEhBVkVfRVROQVZJVgorRVROQVZJVl9TVUJESVIgPSBldG5hdml2CitlbmRpZgoraWYgSEFWRV9WSVZBTlRFCitWSVZBTlRFX1NVQkRJUiA9IHZpdmFudGUKK2VuZGlmCisKK2lmIEJVSUxEX01BTlBBR0VTCitpZiBIQVZFX01BTlBBR0VTX1NUWUxFU0hFRVQKK01BTl9TVUJESVIgPSBtYW4KK2VuZGlmCitlbmRpZgorCitTVUJESVJTID0gXAorCS4gXAorCSQoTElCS01TX1NVQkRJUikgXAorCSQoSU5URUxfU1VCRElSKSBcCisJJChOT1VWRUFVX1NVQkRJUikgXAorCSQoUkFERU9OX1NVQkRJUikgXAorCSQoQU1ER1BVX1NVQkRJUikgXAorCSQoT01BUF9TVUJESVIpIFwKKwkkKEVYWU5PU19TVUJESVIpIFwKKwkkKEZSRUVEUkVOT19TVUJESVIpIFwKKwkkKFRFR1JBX1NVQkRJUikgXAorCSQoVkM0X1NVQkRJUikgXAorCSQoVklWQU5URV9TVUJESVIpIFwKKwkkKEVUTkFWSVZfU1VCRElSKSBcCisJZGF0YSBcCisJdGVzdHMgXAorCSQoTUFOX1NVQkRJUikKKworbGliZHJtX2xhX0xUTElCUkFSSUVTID0gbGliZHJtLmxhCitsaWJkcm1fbGFkaXIgPSAkKGxpYmRpcikKK2xpYmRybV9sYV9MREZMQUdTID0gLXZlcnNpb24tbnVtYmVyIDI6NDowIC1uby11bmRlZmluZWQKK2xpYmRybV9sYV9MSUJBREQgPSBAQ0xPQ0tfTElCQCAtbG0KKworbGliZHJtX2xhX0NQUEZMQUdTID0gLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUvZHJtCitBTV9DRkxBR1MgPSBcCisJJChXQVJOX0NGTEFHUykgXAorCSQoVkFMR1JJTkRfQ0ZMQUdTKQorCitsaWJkcm1fbGFfU09VUkNFUyA9ICQoTElCRFJNX0ZJTEVTKQorCitsaWJkcm1pbmNsdWRlZGlyID0gJHtpbmNsdWRlZGlyfQorbGliZHJtaW5jbHVkZV9IRUFERVJTID0gJChMSUJEUk1fSF9GSUxFUykKKwora2xpYmRybWluY2x1ZGVkaXIgPSAke2luY2x1ZGVkaXJ9L2xpYmRybQora2xpYmRybWluY2x1ZGVfSEVBREVSUyA9ICQoTElCRFJNX0lOQ0xVREVfSF9GSUxFUykKKworaWYgSEFWRV9WTVdHRlgKK2tsaWJkcm1pbmNsdWRlX0hFQURFUlMgKz0gJChMSUJEUk1fSU5DTFVERV9WTVdHRlhfSF9GSUxFUykKK2VuZGlmCisKK0VYVFJBX0RJU1QgPSBpbmNsdWRlL2RybS9SRUFETUUKKworY29weS1oZWFkZXJzIDoKKwljcCAtciAkKGtlcm5lbF9zb3VyY2UpL2luY2x1ZGUvdWFwaS9kcm0vKi5oICQodG9wX3NyY2RpcikvaW5jbHVkZS9kcm0vCisKK2NvbW1pdC1oZWFkZXJzIDogY29weS1oZWFkZXJzCisJZ2l0IGFkZCBpbmNsdWRlL2RybS8qLmgKKwlnaXQgY29tbWl0IC1hbSAiQ29weSBoZWFkZXJzIGZyb20ga2VybmVsICQkKEdJVF9ESVI9JChrZXJuZWxfc291cmNlKS8uZ2l0IGdpdCBkZXNjcmliZSkiCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5zb3VyY2VzIGIvTWFrZWZpbGUuc291cmNlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGQ0Zjg2Ci0tLSAvZGV2L251bGwKKysrIGIvTWFrZWZpbGUuc291cmNlcwpAQCAtMCwwICsxLDQyIEBACitMSUJEUk1fRklMRVMgOj0gXAorCXhmODZkcm0uYyBcCisJeGY4NmRybUhhc2guYyBcCisJeGY4NmRybUhhc2guaCBcCisJeGY4NmRybVJhbmRvbS5jIFwKKwl4Zjg2ZHJtUmFuZG9tLmggXAorCXhmODZkcm1TTC5jIFwKKwl4Zjg2ZHJtTW9kZS5jIFwKKwl4Zjg2YXRvbWljLmggXAorCWxpYmRybV9tYWNyb3MuaCBcCisJbGliZHJtX2xpc3RzLmggXAorCXV0aWxfZG91YmxlX2xpc3QuaCBcCisJdXRpbF9tYXRoLmgKKworTElCRFJNX0hfRklMRVMgOj0gXAorCWxpYnN5bmMuaCBcCisJeGY4NmRybS5oIFwKKwl4Zjg2ZHJtTW9kZS5oCisKK0xJQkRSTV9JTkNMVURFX0hfRklMRVMgOj0gXAorCWluY2x1ZGUvZHJtL2RybS5oIFwKKwlpbmNsdWRlL2RybS9kcm1fZm91cmNjLmggXAorCWluY2x1ZGUvZHJtL2RybV9tb2RlLmggXAorCWluY2x1ZGUvZHJtL2RybV9zYXJlYS5oIFwKKwlpbmNsdWRlL2RybS9pOTE1X2RybS5oIFwKKwlpbmNsdWRlL2RybS9tYWNoNjRfZHJtLmggXAorCWluY2x1ZGUvZHJtL21nYV9kcm0uaCBcCisJaW5jbHVkZS9kcm0vbm91dmVhdV9kcm0uaCBcCisJaW5jbHVkZS9kcm0vcXhsX2RybS5oIFwKKwlpbmNsdWRlL2RybS9yMTI4X2RybS5oIFwKKwlpbmNsdWRlL2RybS9yYWRlb25fZHJtLmggXAorCWluY2x1ZGUvZHJtL2FtZGdwdV9kcm0uaCBcCisJaW5jbHVkZS9kcm0vc2F2YWdlX2RybS5oIFwKKwlpbmNsdWRlL2RybS9zaXNfZHJtLmggXAorCWluY2x1ZGUvZHJtL3RlZ3JhX2RybS5oIFwKKwlpbmNsdWRlL2RybS92YzRfZHJtLmggXAorCWluY2x1ZGUvZHJtL3ZpdmFudGVfZHJtLmggXAorCWluY2x1ZGUvZHJtL3ZpYV9kcm0uaCBcCisJaW5jbHVkZS9kcm0vdmlydGdwdV9kcm0uaAorCitMSUJEUk1fSU5DTFVERV9WTVdHRlhfSF9GSUxFUyA6PSBcCisJaW5jbHVkZS9kcm0vdm13Z2Z4X2RybS5oCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjYWI5ZAotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRQpAQCAtMCwwICsxLDQxIEBACitsaWJkcm0gLSB1c2Vyc3BhY2UgbGlicmFyeSBmb3IgZHJtCisKK1RoaXMgIGlzIGxpYmRybSwgIGEgdXNlcnNwYWNlICBsaWJyYXJ5IGZvciAgYWNjZXNzaW5nIHRoZSAgRFJNLCBkaXJlY3QKK3JlbmRlcmluZyAgbWFuYWdlciwgb24gIExpbnV4LCAgQlNEIGFuZCAgb3RoZXIgIG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQKK3N1cHBvcnQgdGhlICBpb2N0bCBpbnRlcmZhY2UuICBUaGUgbGlicmFyeSAgcHJvdmlkZXMgd3JhcHBlciBmdW5jdGlvbnMKK2ZvciB0aGUgIGlvY3RscyB0byBhdm9pZCAgZXhwb3NpbmcgdGhlIGtlcm5lbCBpbnRlcmZhY2UgIGRpcmVjdGx5LCBhbmQKK2ZvciBjaGlwc2V0cyB3aXRoIGRybSBtZW1vcnkgbWFuYWdlciwgc3VwcG9ydCBmb3IgdHJhY2tpbmcgcmVsb2NhdGlvbnMKK2FuZCAgYnVmZmVycy4gICBsaWJkcm0gIGlzICBhICBsb3ctbGV2ZWwgbGlicmFyeSwgIHR5cGljYWxseSAgdXNlZCAgYnkKK2dyYXBoaWNzIGRyaXZlcnMgIHN1Y2ggYXMgdGhlIE1lc2EgIERSSSBkcml2ZXJzLCB0aGUgIFggZHJpdmVycywgbGlidmEKK2FuZCAgc2ltaWxhciBwcm9qZWN0cy4gIE5ldyAgZnVuY3Rpb25hbGl0eSBpbiAgdGhlIGtlcm5lbCAgRFJNIGRyaXZlcnMKK3R5cGljYWxseSByZXF1aXJlcyAgYSBuZXcgIGxpYmRybSwgYnV0IGEgIG5ldyBsaWJkcm0gd2lsbCAgYWx3YXlzIHdvcmsKK3dpdGggYW4gb2xkZXIga2VybmVsLgorCisKK0NvbXBpbGluZworLS0tLS0tLS0tCisKK2xpYmRybSAgaXMgIGEgIHN0YW5kYXJkICBhdXRvdG9vbHMgIHBhY2thZ2UgYW5kICBmb2xsb3dzICB0aGUgIG5vcm1hbAorY29uZmlndXJlLCBidWlsZCAgYW5kIGluc3RhbGwgc3RlcHMuICAgVGhlIGZpcnN0IHN0ZXAgaXMgIHRvIGNvbmZpZ3VyZQordGhlIHBhY2thZ2UsIHdoaWNoIGlzIGRvbmUgYnkgcnVubmluZyB0aGUgY29uZmlndXJlIHNoZWxsIHNjcmlwdDoKKworCS4vY29uZmlndXJlCisKK0J5IGRlZmF1bHQsIGxpYmRybSAgd2lsbCBpbnN0YWxsIGludG8gdGhlIC91c3IvbG9jYWwvICBwcmVmaXguICBJZiB5b3UKK3dhbnQgIHRvICBpbnN0YWxsICAgdGhpcyAgRFJNICB0byAgcmVwbGFjZSAgeW91ciAgIHN5c3RlbSAgY29weSwgIHBhc3MKKy0tcHJlZml4PS91c3IgYW5kICAtLWV4ZWMtcHJlZml4PS8gdG8gY29uZmlndXJlLiAgSWYgIHlvdSBhcmUgYnVpbGRpbmcKK2xpYmRybSAgZnJvbSBhICBnaXQgY2hlY2tvdXQsICB5b3UgZmlyc3QgIG5lZWQgdG8gIHJ1biAgdGhlIGF1dG9nZW4uc2gKK3NjcmlwdC4gIFlvdSBjYW4gIHBhc3MgYW55IG9wdGlvbnMgdG8gYXV0b2dlbi5zaCAgdGhhdCB5b3Ugd291bGQgb3RoZXIKK3dpc2UgIHBhc3MgdG8gY29uZmlndXJlLCAgb3IgeW91ICBjYW4ganVzdCAgcmUtcnVuIGNvbmZpZ3VyZSAgd2l0aCB0aGUKK29wdGlvbnMgeW91IG5lZWQgb25jZSBhdXRvZ2VuLnNoIGZpbmlzaGVzLgorCitOZXh0IHN0ZXAgaXMgdG8gYnVpbGQgbGliZHJtOgorCisJbWFrZQorCithbmQgb25jZSBtYWtlIGZpbmlzaGVzIHN1Y2Nlc3NmdWxseSwgaW5zdGFsbCB0aGUgcGFja2FnZSB1c2luZworCisJbWFrZSBpbnN0YWxsCisKK0lmIHlvdSBhcmUgaW5zdGFsbGluZyBpbnRvIGEgc3lzdGVtIGxvY2F0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvIGJlIHJvb3QKK3RvIHBlcmZvcm0gdGhlIGluc3RhbGwgc3RlcC4KZGlmZiAtLWdpdCBhL1JFTEVBU0lORyBiL1JFTEVBU0lORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjJjYTA4Ci0tLSAvZGV2L251bGwKKysrIGIvUkVMRUFTSU5HCkBAIC0wLDAgKzEsNTEgQEAKK1RoZSByZWxlYXNlIGNyaXRlcmlhIGZvciBsaWJkcm0gaXMgZXNzZW50aWFsbHkgImlmIHlvdSBuZWVkIGEgcmVsZWFzZSwKK21ha2Ugb25lIi4gIFRoZXJlIGlzIG5vIGRlc2lnbmF0ZWQgcmVsZWFzZSBlbmdpbmVlciBvciBtYWludGFpbmVyLgorQW55Ym9keSBpcyBmcmVlIHRvIG1ha2UgYSByZWxlYXNlIGlmIHRoZXJlJ3MgYSBjZXJ0YWluIGZlYXR1cmUgb3IgYnVnCitmaXggdGhleSBuZWVkIGluIGEgcmVsZWFzZWQgdmVyc2lvbiBvZiBsaWJkcm0uCisKK1doZW4gbmV3IGlvY3RsIGRlZmluaXRpb25zIGFyZSBtZXJnZWQgaW50byBkcm0tbmV4dCwgd2Ugd2lsbCBhZGQKK3N1cHBvcnQgdG8gbGliZHJtLCBhdCB3aGljaCBwb2ludCB3ZSB0eXBpY2FsbHkgY3JlYXRlIGEgbmV3IHJlbGVhc2UuCitIb3dldmVyLCB0aGlzIGlzIHVwIHRvIHdob2V2ZXIgaXMgZHJpdmluZyB0aGUgZmVhdHVyZSBpbiBxdWVzdGlvbi4KKworRm9sbG93IHRoZXNlIHN0ZXBzIHRvIHJlbGVhc2UgYSBuZXcgdmVyc2lvbiBvZiBsaWJkcm06CisKKyAgMSkgQnVtcCB0aGUgdmVyc2lvbiBudW1iZXIgaW4gY29uZmlndXJlLmFjLiBXZSBzZWVtIHRvIGhhdmUgc2V0dGxlZAorICAgICBmb3IgMi40LnggYXMgdGhlIHZlcnNpb25pbmcgc2NoZW1lIGZvciBsaWJkcm0sIHNvIGp1c3QgYnVtcCB0aGUKKyAgICAgbWljcm8gdmVyc2lvbi4KKworICAyKSBSdW4gYXV0b2NvbmYgYW5kIHRoZW4gcmUtcnVuIC4vY29uZmlndXJlIHNvIHRoZSBidWlsZCBzeXN0ZW0KKyAgICAgcGlja3MgdXAgdGhlIG5ldyB2ZXJzaW9uIG51bWJlci4KKworICAzKSBWZXJpZnkgdGhhdCB0aGUgY29kZSBwYXNzZXMgIm1ha2UgZGlzdGNoZWNrIi4gIFJ1bm5pbmcgIm1ha2UKKyAgICAgZGlzdGNoZWNrIiBzaG91bGQgcmVzdWx0IGluIG5vIHdhcm5pbmdzIG9yIGVycm9ycyBhbmQgZW5kIHdpdGggYQorICAgICBtZXNzYWdlIG9mIHRoZSBmb3JtOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJbGliZHJtLVguWS5aIGFyY2hpdmVzIHJlYWR5IGZvciBkaXN0cmlidXRpb246CisJbGliZHJtLVguWS5aLnRhci5negorCWxpYmRybS1YLlkuWi50YXIuYnoyCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgTWFrZSBzdXJlIHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIHJlcG9ydGVkIGJ5IGRpc3RjaGVjayBhbmQgaW4KKyAgICAgdGhlIHRhcmJhbGwgbmFtZXMgbWF0Y2hlcyB0aGUgbnVtYmVyIHlvdSBidW1wZWQgdG8gaW4gY29uZmlndXJlLmFjLgorCisgIDQpIFB1c2ggdGhlIHVwZGF0ZWQgbWFzdGVyIGJyYW5jaCB3aXRoIHRoZSBidW1wZWQgdmVyc2lvbiBudW1iZXI6CisKKwlnaXQgcHVzaCBvcmlnaW4gbWFzdGVyCisKKyAgICAgYXNzdW1pbmcgdGhlIHJlbW90ZSBmb3IgdGhlIHVwc3RyZWFtIGxpYmRybSByZXBvIGlzIGNhbGxlZCBvcmlnaW4uCisKKyAgNSkgVXNlIHRoZSByZWxlYXNlLnNoIHNjcmlwdCBmcm9tIHRoZSB4b3JnL3V0aWwvbW9kdWxhciByZXBvIHRvCisgICAgIHVwbG9hZCB0aGUgdGFyYmFsbHMgdG8gdGhlIGZyZWVkZXNrdG9wLm9yZyBkb3dubG9hZCBhcmVhIGFuZAorICAgICBjcmVhdGUgYW4gYW5ub3VuY2UgZW1haWwgdGVtcGxhdGUuICBUaGUgc2NyaXB0IHRha2VzIG9uZSBhcmd1bWVudDoKKyAgICAgdGhlIHBhdGggdG8gdGhlIGxpYmRybSBjaGVja291dC4gU28sIGlmIGEgY2hlY2tvdXQgb2YgbW9kdWxhciBpcworICAgICBhdCB0aGUgc2FtZSBsZXZlbCB0aGFuIHRoZSBsaWJkcm0gcmVwbzoKKworCS4vbW9kdWxhci9yZWxlYXNlLnNoIGxpYmRybQorCisgICAgIFRoaXMgY29waWVzIHRoZSB0d28gdGFyYmFsbHMgdG8gZnJlZWRlc2t0b3Aub3JnIGFuZCBjcmVhdGVzCisgICAgIGxpYmRybS0yLjQuMTYuYW5ub3VuY2Ugd2hpY2ggaGFzIGEgZGV0YWlsZWQgc3VtbWFyeSBvZiB0aGUKKyAgICAgY2hhbmdlcywgbGlua3MgdG8gdGhlIHRhcmJhbGxzLCBNRDUgYW5kIFNIQTEgc3VtcyBhbmQgcHJlLWZpbGxlZAorICAgICBvdXQgZW1haWwgaGVhZGVycy4gIEZpbGwgb3V0IHRoZSBibGFuayBiZXR3ZWVuIHRoZSBlbWFpbCBoZWFkZXJzCisgICAgIGFuZCB0aGUgbGlzdCBvZiBjaGFuZ2VzIHdpdGggYSBicmllZiBtZXNzYWdlIG9mIHdoYXQgY2hhbmdlZCBvcgorICAgICB3aGF0IHByb21wdGVkIHRoaXMgcmVsZWFzZS4gIFNlbmQgb3V0IHRoZSBlbWFpbCBhbmQgeW91J3JlIGRvbmUhCmRpZmYgLS1naXQgYS9hbWRncHUvLmVkaXRvcmNvbmZpZyBiL2FtZGdwdS8uZWRpdG9yY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MjhkNjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbWRncHUvLmVkaXRvcmNvbmZpZwpAQCAtMCwwICsxLDkgQEAKKyMgVG8gdXNlIHRoaXMgY29uZmlnIHdpdGggeW91ciBlZGl0b3IsIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGF0OgorIyBodHRwOi8vZWRpdG9yY29uZmlnLm9yZworCitbKl0KK2NoYXJzZXQgPSB1dGYtOAoraW5kZW50X3N0eWxlID0gdGFiCitpbmRlbnRfc2l6ZSA9IDgKK3RhYl93aWR0aCA9IDgKK2luc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvYW1kZ3B1L0FuZHJvaWQubWsgYi9hbWRncHUvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTI3MzAxCi0tLSAvZGV2L251bGwKKysrIGIvYW1kZ3B1L0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgSW1wb3J0IHZhcmlhYmxlcyBMSUJEUk1fQU1ER1BVX0ZJTEVTLCBMSUJEUk1fQU1ER1BVX0hfRklMRVMKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9NYWtlZmlsZS5zb3VyY2VzCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJkcm1fYW1kZ3B1CisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliZHJtCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKExJQkRSTV9BTURHUFVfRklMRVMpCisKK0xPQ0FMX0NGTEFHUyA6PSBcCisJLURBTURHUFVfQVNJQ19JRF9UQUJMRT1cIi92ZW5kb3IvZXRjL2h3ZGF0YS9hbWRncHUuaWRzXCIgXAorCS1EQU1ER1BVX0FTSUNfSURfVEFCTEVfTlVNX0VOVFJJRVM9JChzaGVsbCBlZ3JlcCAtY2kgJ15bMC05YS1mXXs0fSwuKlswLTlhLWZdKywnICQoTElCRFJNX1RPUCkvZGF0YS9hbWRncHUuaWRzKQorCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IGFtZGdwdS5pZHMKKworaW5jbHVkZSAkKExJQkRSTV9DT01NT05fTUspCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9hbWRncHUvTWFrZWZpbGUuYW0gYi9hbWRncHUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZmNmY2NwotLS0gL2Rldi9udWxsCisrKyBiL2FtZGdwdS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDU0IEBACisjIENvcHlyaWdodCDCqSAyMDA4IErDqXLDtG1lIEdsaXNzZQorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorIyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorIyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisjIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorIyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyMgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorIyBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisjIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisjIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisjIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisjIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyMgSU4gVEhFIFNPRlRXQVJFLgorIworIyBBdXRob3JzOgorIyAgICBKw6lyw7RtZSBHbGlzc2UgPGdsaXNzZUBmcmVlZGVza3RvcC5vcmc+CisKK2luY2x1ZGUgTWFrZWZpbGUuc291cmNlcworCitBTV9DRkxBR1MgPSBcCisJJChXQVJOX0NGTEFHUykgXAorCS1JJCh0b3Bfc3JjZGlyKSBcCisJJChQVEhSRUFEU1RVQlNfQ0ZMQUdTKSBcCisJLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUvZHJtCisKK2xpYmRybWRhdGFkaXIgPSBAbGliZHJtZGF0YWRpckAKK0FTSUNfSURfVEFCTEVfTlVNX0VOVFJJRVMgOj0gJChzaGVsbCBlZ3JlcCAtY2kgJ15bMC05YS1mXXs0fSwuKlswLTlhLWZdKywnIFwKKwkkKHRvcF9zcmNkaXIpL2RhdGEvYW1kZ3B1LmlkcykKK0FNX0NQUEZMQUdTID0gLURBTURHUFVfQVNJQ19JRF9UQUJMRT1cIiR7bGliZHJtZGF0YWRpcn0vYW1kZ3B1Lmlkc1wiIFwKKwktREFNREdQVV9BU0lDX0lEX1RBQkxFX05VTV9FTlRSSUVTPSQoQVNJQ19JRF9UQUJMRV9OVU1fRU5UUklFUykKKworbGliZHJtX2FtZGdwdV9sYV9MVExJQlJBUklFUyA9IGxpYmRybV9hbWRncHUubGEKK2xpYmRybV9hbWRncHVfbGFkaXIgPSAkKGxpYmRpcikKK2xpYmRybV9hbWRncHVfbGFfTERGTEFHUyA9IC12ZXJzaW9uLW51bWJlciAxOjA6MCAtbm8tdW5kZWZpbmVkCitsaWJkcm1fYW1kZ3B1X2xhX0xJQkFERCA9IC4uL2xpYmRybS5sYSBAUFRIUkVBRFNUVUJTX0xJQlNACisKK2xpYmRybV9hbWRncHVfbGFfU09VUkNFUyA9ICQoTElCRFJNX0FNREdQVV9GSUxFUykKK2FtZGdwdV9hc2ljX2lkLmxvOiAkKHRvcF9zcmNkaXIpL2RhdGEvYW1kZ3B1LmlkcworCitsaWJkcm1fYW1kZ3B1aW5jbHVkZWRpciA9ICR7aW5jbHVkZWRpcn0vbGliZHJtCitsaWJkcm1fYW1kZ3B1aW5jbHVkZV9IRUFERVJTID0gJChMSUJEUk1fQU1ER1BVX0hfRklMRVMpCisKK3BrZ2NvbmZpZ2RpciA9IEBwa2djb25maWdkaXJACitwa2djb25maWdfREFUQSA9IGxpYmRybV9hbWRncHUucGMKKworVEVTVFMgPSBhbWRncHUtc3ltYm9sLWNoZWNrCitFWFRSQV9ESVNUID0gJChURVNUUykKZGlmZiAtLWdpdCBhL2FtZGdwdS9NYWtlZmlsZS5zb3VyY2VzIGIvYW1kZ3B1L01ha2VmaWxlLnNvdXJjZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMzYWJhYQotLS0gL2Rldi9udWxsCisrKyBiL2FtZGdwdS9NYWtlZmlsZS5zb3VyY2VzCkBAIC0wLDAgKzEsMTUgQEAKK0xJQkRSTV9BTURHUFVfRklMRVMgOj0gXAorCWFtZGdwdV9hc2ljX2lkLmMgXAorCWFtZGdwdV9iby5jIFwKKwlhbWRncHVfY3MuYyBcCisJYW1kZ3B1X2RldmljZS5jIFwKKwlhbWRncHVfZ3B1X2luZm8uYyBcCisJYW1kZ3B1X2ludGVybmFsLmggXAorCWFtZGdwdV92YW1nci5jIFwKKwl1dGlsX2hhc2guYyBcCisJdXRpbF9oYXNoLmggXAorCXV0aWxfaGFzaF90YWJsZS5jIFwKKwl1dGlsX2hhc2hfdGFibGUuaAorCitMSUJEUk1fQU1ER1BVX0hfRklMRVMgOj0gXAorCWFtZGdwdS5oCmRpZmYgLS1naXQgYS9hbWRncHUvYW1kZ3B1LXN5bWJvbC1jaGVjayBiL2FtZGdwdS9hbWRncHUtc3ltYm9sLWNoZWNrCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ5Zjg5ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbWRncHUvYW1kZ3B1LXN5bWJvbC1jaGVjawpAQCAtMCwwICsxLDcwIEBACisjIS9iaW4vYmFzaAorCisjIFRoZSBmb2xsb3dpbmcgc3ltYm9scyAocGFzdCB0aGUgZmlyc3QgZml2ZSkgYXJlIHRha2VuIGZyb20gdGhlIHB1YmxpYyBoZWFkZXJzLgorIyBBIGxpc3Qgb2YgdGhlIGxhdHRlciBzaG91bGQgYmUgYXZhaWxhYmxlIE1ha2VmaWxlLmFtL2xpYmRybV9hbWRncHVpbmNsdWRlX0hFQURFUlMKKworRlVOQ1M9JChubSAtRCAtLWZvcm1hdD1ic2QgLS1kZWZpbmVkLW9ubHkgJHsxLS5saWJzL2xpYmRybV9hbWRncHUuc299IHwgYXdrICd7cHJpbnQgJDN9JyB8IHdoaWxlIHJlYWQgZnVuYzsgZG8KKyggZ3JlcCAtcSAiXiRmdW5jJCIgfHwgZWNobyAkZnVuYyApICA8PEVPRgorX19ic3Nfc3RhcnQKK19lZGF0YQorX2VuZAorX2ZpbmkKK19pbml0CithbWRncHVfYm9fYWxsb2MKK2FtZGdwdV9ib19jcHVfbWFwCithbWRncHVfYm9fY3B1X3VubWFwCithbWRncHVfYm9fZXhwb3J0CithbWRncHVfYm9fZnJlZQorYW1kZ3B1X2JvX2ltcG9ydAorYW1kZ3B1X2JvX2xpc3RfY3JlYXRlCithbWRncHVfYm9fbGlzdF9kZXN0cm95CithbWRncHVfYm9fbGlzdF91cGRhdGUKK2FtZGdwdV9ib19xdWVyeV9pbmZvCithbWRncHVfYm9fc2V0X21ldGFkYXRhCithbWRncHVfYm9fdmFfb3AKK2FtZGdwdV9ib192YV9vcF9yYXcKK2FtZGdwdV9ib193YWl0X2Zvcl9pZGxlCithbWRncHVfY3JlYXRlX2JvX2Zyb21fdXNlcl9tZW0KK2FtZGdwdV9jc19jaHVua19mZW5jZV9pbmZvX3RvX2RhdGEKK2FtZGdwdV9jc19jaHVua19mZW5jZV90b19kZXAKK2FtZGdwdV9jc19jcmVhdGVfc2VtYXBob3JlCithbWRncHVfY3NfY3JlYXRlX3N5bmNvYmoKK2FtZGdwdV9jc19jdHhfY3JlYXRlCithbWRncHVfY3NfY3R4X2ZyZWUKK2FtZGdwdV9jc19kZXN0cm95X3NlbWFwaG9yZQorYW1kZ3B1X2NzX2Rlc3Ryb3lfc3luY29iagorYW1kZ3B1X2NzX2V4cG9ydF9zeW5jb2JqCithbWRncHVfY3NfZmVuY2VfdG9faGFuZGxlCithbWRncHVfY3NfaW1wb3J0X3N5bmNvYmoKK2FtZGdwdV9jc19xdWVyeV9mZW5jZV9zdGF0dXMKK2FtZGdwdV9jc19xdWVyeV9yZXNldF9zdGF0ZQorYW1kZ3B1X2NzX3NpZ25hbF9zZW1hcGhvcmUKK2FtZGdwdV9jc19zdWJtaXQKK2FtZGdwdV9jc19zdWJtaXRfcmF3CithbWRncHVfY3Nfc3luY29ial9leHBvcnRfc3luY19maWxlCithbWRncHVfY3Nfc3luY29ial9pbXBvcnRfc3luY19maWxlCithbWRncHVfY3Nfc3luY29ial93YWl0CithbWRncHVfY3Nfd2FpdF9mZW5jZXMKK2FtZGdwdV9jc193YWl0X3NlbWFwaG9yZQorYW1kZ3B1X2RldmljZV9kZWluaXRpYWxpemUKK2FtZGdwdV9kZXZpY2VfaW5pdGlhbGl6ZQorYW1kZ3B1X2dldF9tYXJrZXRpbmdfbmFtZQorYW1kZ3B1X3F1ZXJ5X2J1ZmZlcl9zaXplX2FsaWdubWVudAorYW1kZ3B1X3F1ZXJ5X2NydGNfZnJvbV9pZAorYW1kZ3B1X3F1ZXJ5X2Zpcm13YXJlX3ZlcnNpb24KK2FtZGdwdV9xdWVyeV9nZHNfaW5mbworYW1kZ3B1X3F1ZXJ5X2dwdV9pbmZvCithbWRncHVfcXVlcnlfaGVhcF9pbmZvCithbWRncHVfcXVlcnlfaHdfaXBfY291bnQKK2FtZGdwdV9xdWVyeV9od19pcF9pbmZvCithbWRncHVfcXVlcnlfaW5mbworYW1kZ3B1X3F1ZXJ5X3NlbnNvcl9pbmZvCithbWRncHVfcmVhZF9tbV9yZWdpc3RlcnMKK2FtZGdwdV92YV9yYW5nZV9hbGxvYworYW1kZ3B1X3ZhX3JhbmdlX2ZyZWUKK2FtZGdwdV92YV9yYW5nZV9xdWVyeQorRU9GCitkb25lKQorCit0ZXN0ICEgLW4gIiRGVU5DUyIgfHwgZWNobyAkRlVOQ1MKK3Rlc3QgISAtbiAiJEZVTkNTIgpkaWZmIC0tZ2l0IGEvYW1kZ3B1L2FtZGdwdS5oIGIvYW1kZ3B1L2FtZGdwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzY2RlMTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbWRncHUvYW1kZ3B1LmgKQEAgLTAsMCArMSwxNDgyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisvKioKKyAqIFxmaWxlIGFtZGdwdS5oCisgKgorICogRGVjbGFyZSBwdWJsaWMgbGliZHJtX2FtZGdwdSBBUEkKKyAqCisgKiBUaGlzIGZpbGUgZGVmaW5lIEFQSSBleHBvc2VkIGJ5IGxpYmRybV9hbWRncHUgbGlicmFyeS4KKyAqIFVzZXIgd2FudGVkIHRvIHVzZSBsaWJkcm1fYW1kZ3B1IGZ1bmN0aW9uYWxpdHkgbXVzdCBpbmNsdWRlCisgKiB0aGlzIGZpbGUuCisgKgorICovCisjaWZuZGVmIF9BTURHUFVfSF8KKyNkZWZpbmUgX0FNREdQVV9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBkcm1fYW1kZ3B1X2luZm9faHdfaXA7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBEZWZpbmUgbWF4LiBudW1iZXIgb2YgQ29tbWFuZCBCdWZmZXJzIChJQikgd2hpY2ggY291bGQgYmUgc2VudCB0byB0aGUgc2luZ2xlCisgKiBoYXJkd2FyZSBJUCB0byBhY2NvbW1vZGF0ZSBDRS9ERSByZXF1aXJlbWVudHMKKyAqCisgKiBcc2EgYW1kZ3B1X2NzX2liX2luZm8KKyovCisjZGVmaW5lIEFNREdQVV9DU19NQVhfSUJTX1BFUl9TVUJNSVQJCTQKKworLyoqCisgKiBTcGVjaWFsIHRpbWVvdXQgdmFsdWUgbWVhbmluZyB0aGF0IHRoZSB0aW1lb3V0IGlzIGluZmluaXRlLgorICovCisjZGVmaW5lIEFNREdQVV9USU1FT1VUX0lORklOSVRFCQkJMHhmZmZmZmZmZmZmZmZmZmZmdWxsCisKKy8qKgorICogVXNlZCBpbiBhbWRncHVfY3NfcXVlcnlfZmVuY2Vfc3RhdHVzKCksIG1lYW5pbmcgdGhhdCB0aGUgZ2l2ZW4gdGltZW91dAorICogaXMgYWJzb2x1dGUuCisgKi8KKyNkZWZpbmUgQU1ER1BVX1FVRVJZX0ZFTkNFX1RJTUVPVVRfSVNfQUJTT0xVVEUgICAgICgxIDw8IDApCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW51bXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBFbnVtIGRlc2NyaWJpbmcgcG9zc2libGUgaGFuZGxlIHR5cGVzCisgKgorICogXHNhIGFtZGdwdV9ib19pbXBvcnQsIGFtZGdwdV9ib19leHBvcnQKKyAqCisqLworZW51bSBhbWRncHVfYm9faGFuZGxlX3R5cGUgeworCS8qKiBHRU0gZmxpbmsgbmFtZSAobmVlZHMgRFJNIGF1dGhlbnRpY2F0aW9uLCB1c2VkIGJ5IERSSTIpICovCisJYW1kZ3B1X2JvX2hhbmRsZV90eXBlX2dlbV9mbGlua19uYW1lID0gMCwKKworCS8qKiBLTVMgaGFuZGxlIHdoaWNoIGlzIHVzZWQgYnkgYWxsIGRyaXZlciBpb2N0bHMgKi8KKwlhbWRncHVfYm9faGFuZGxlX3R5cGVfa21zID0gMSwKKworCS8qKiBETUEtYnVmIGZkIGhhbmRsZSAqLworCWFtZGdwdV9ib19oYW5kbGVfdHlwZV9kbWFfYnVmX2ZkID0gMgorfTsKKworLyoqIERlZmluZSBrbm93biB0eXBlcyBvZiBHUFUgVk0gVkEgcmFuZ2VzICovCitlbnVtIGFtZGdwdV9ncHVfdmFfcmFuZ2UKK3sKKwkvKiogQWxsb2NhdGUgZnJvbSAibm9ybWFsIi9nZW5lcmFsIHJhbmdlICovCisJYW1kZ3B1X2dwdV92YV9yYW5nZV9nZW5lcmFsID0gMAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEYXRhdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIERlZmluZSBvcGFxdWUgcG9pbnRlciB0byBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCBmZC4KKyAqIFRoaXMgY29udGV4dCB3aWxsIGJlIHJldHVybmVkIGFzIHRoZSByZXN1bHQgb2YKKyAqICJpbml0aWFsaXplIiBmdW5jdGlvbiBhbmQgc2hvdWxkIGJlIHBhc3MgYXMgdGhlIGZpcnN0CisgKiBwYXJhbWV0ZXIgdG8gYW55IEFQSSBjYWxsCisgKi8KK3R5cGVkZWYgc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFtZGdwdV9kZXZpY2VfaGFuZGxlOworCisvKioKKyAqIERlZmluZSBHUFUgQ29udGV4dCB0eXBlIGFzIHBvaW50ZXIgdG8gb3BhcXVlIHN0cnVjdHVyZQorICogRXhhbXBsZSBvZiBHUFUgQ29udGV4dCBpcyB0aGUgInJlbmRlcmluZyIgY29udGV4dCBhc3NvY2lhdGVkCisgKiB3aXRoIE9wZW5HTCBjb250ZXh0IChnbENyZWF0ZUNvbnRleHQpCisgKi8KK3R5cGVkZWYgc3RydWN0IGFtZGdwdV9jb250ZXh0ICphbWRncHVfY29udGV4dF9oYW5kbGU7CisKKy8qKgorICogRGVmaW5lIGhhbmRsZSBmb3IgYW1kZ3B1IHJlc291cmNlczogYnVmZmVyLCBHRFMsIGV0Yy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYW1kZ3B1X2JvICphbWRncHVfYm9faGFuZGxlOworCisvKioKKyAqIERlZmluZSBoYW5kbGUgZm9yIGxpc3Qgb2YgQk9zCisgKi8KK3R5cGVkZWYgc3RydWN0IGFtZGdwdV9ib19saXN0ICphbWRncHVfYm9fbGlzdF9oYW5kbGU7CisKKy8qKgorICogRGVmaW5lIGhhbmRsZSB0byBiZSB1c2VkIHRvIHdvcmsgd2l0aCBWQSBhbGxvY2F0ZWQgcmFuZ2VzCisgKi8KK3R5cGVkZWYgc3RydWN0IGFtZGdwdV92YSAqYW1kZ3B1X3ZhX2hhbmRsZTsKKworLyoqCisgKiBEZWZpbmUgaGFuZGxlIGZvciBzZW1hcGhvcmUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYW1kZ3B1X3NlbWFwaG9yZSAqYW1kZ3B1X3NlbWFwaG9yZV9oYW5kbGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3RydWN0dXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBtZW1vcnkgYWxsb2NhdGlvbiByZXF1ZXN0CisgKgorICogXHNhIGFtZGdwdV9ib19hbGxvYygpCisgKgorKi8KK3N0cnVjdCBhbWRncHVfYm9fYWxsb2NfcmVxdWVzdCB7CisJLyoqIEFsbG9jYXRpb24gcmVxdWVzdC4gSXQgbXVzdCBiZSBhbGlnbmVkIGNvcnJlY3RseS4gKi8KKwl1aW50NjRfdCBhbGxvY19zaXplOworCisJLyoqCisJICogSXQgbWF5IGJlIHJlcXVpcmVkIHRvIGhhdmUgc29tZSBzcGVjaWZpYyBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzCisJICogZm9yIHBoeXNpY2FsIGJhY2stdXAgc3RvcmFnZSAoZS5nLiBmb3IgZGlzcGxheWFibGUgc3VyZmFjZSkuCisJICogSWYgMCB0aGVyZSBpcyBubyBzcGVjaWFsIGFsaWdubWVudCByZXF1aXJlbWVudAorCSAqLworCXVpbnQ2NF90IHBoeXNfYWxpZ25tZW50OworCisJLyoqCisJICogVU1EIHNob3VsZCBzcGVjaWZ5IHdoZXJlIHRvIGFsbG9jYXRlIG1lbW9yeSBhbmQgaG93IGl0CisJICogd2lsbCBiZSBhY2Nlc3NlZCBieSB0aGUgQ1BVLgorCSAqLworCXVpbnQzMl90IHByZWZlcnJlZF9oZWFwOworCisJLyoqIEFkZGl0aW9uYWwgZmxhZ3MgcGFzc2VkIG9uIGFsbG9jYXRpb24gKi8KKwl1aW50NjRfdCBmbGFnczsKK307CisKKy8qKgorICogU3BlY2lhbCBVTUQgc3BlY2lmaWMgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGJ1ZmZlci4KKyAqCisgKiBJdCBtYXkgYmUgbmVlZCB0byBwYXNzIHNvbWUgYnVmZmVyIGNoYXJhY3RlcnNpdGljIGFzIHBhcnQKKyAqIG9mIGJ1ZmZlciBzaGFyaW5nLiBTdWNoIGluZm9ybWF0aW9uIGFyZSBkZWZpbmVkIFVNRCBhbmQKKyAqIG9wYXF1ZSBmb3IgbGliZHJtX2FtZGdwdSBhcyB3ZWxsIGZvciBrZXJuZWwgZHJpdmVyLgorICoKKyAqIFxzYSBhbWRncHVfYm9fc2V0X21ldGFkYXRhKCksIGFtZGdwdV9ib19xdWVyeV9pbmZvLAorICogICAgIGFtZGdwdV9ib19pbXBvcnQoKSwgYW1kZ3B1X2JvX2V4cG9ydAorICoKKyovCitzdHJ1Y3QgYW1kZ3B1X2JvX21ldGFkYXRhIHsKKwkvKiogU3BlY2lhbCBmbGFnIGFzc29jaWF0ZWQgd2l0aCBzdXJmYWNlICovCisJdWludDY0X3QgZmxhZ3M7CisKKwkvKioKKwkgKiBBU0lDLXNwZWNpZmljIHRpbGluZyBpbmZvcm1hdGlvbiAoYWxzbyB1c2VkIGJ5IERDRSkuCisJICogVGhlIGVuY29kaW5nIGlzIGRlZmluZWQgYnkgdGhlIEFNREdQVV9USUxJTkdfKiBkZWZpbml0aW9ucy4KKwkgKi8KKwl1aW50NjRfdCB0aWxpbmdfaW5mbzsKKworCS8qKiBTaXplIG9mIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVmZmVyLCBpbiBieXRlcy4gKi8KKwl1aW50MzJfdCBzaXplX21ldGFkYXRhOworCisJLyoqIFVNRCBzcGVjaWZpYyBtZXRhZGF0YS4gT3BhcXVlIGZvciBrZXJuZWwgKi8KKwl1aW50MzJfdCB1bWRfbWV0YWRhdGFbNjRdOworfTsKKworLyoqCisgKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhbGxvY2F0ZWQgYnVmZmVyLiBDbGllbnQgbWF5IG5lZWQKKyAqIHRvIHF1ZXJ5IHN1Y2ggaW5mb3JtYXRpb24gYXMgcGFydCBvZiAnc2hhcmluZycgYnVmZmVycyBtZWNoYW5pc20KKyAqCisgKiBcc2EgYW1kZ3B1X2JvX3NldF9tZXRhZGF0YSgpLCBhbWRncHVfYm9fcXVlcnlfaW5mbygpLAorICogICAgIGFtZGdwdV9ib19pbXBvcnQoKSwgYW1kZ3B1X2JvX2V4cG9ydCgpCisqLworc3RydWN0IGFtZGdwdV9ib19pbmZvIHsKKwkvKiogQWxsb2NhdGVkIG1lbW9yeSBzaXplICovCisJdWludDY0X3QgYWxsb2Nfc2l6ZTsKKworCS8qKgorCSAqIEl0IG1heSBiZSByZXF1aXJlZCB0byBoYXZlIHNvbWUgc3BlY2lmaWMgYWxpZ25tZW50IHJlcXVpcmVtZW50cworCSAqIGZvciBwaHlzaWNhbCBiYWNrLXVwIHN0b3JhZ2UuCisJICovCisJdWludDY0X3QgcGh5c19hbGlnbm1lbnQ7CisKKwkvKiogSGVhcCB3aGVyZSB0byBhbGxvY2F0ZSBtZW1vcnkuICovCisJdWludDMyX3QgcHJlZmVycmVkX2hlYXA7CisKKwkvKiogQWRkaXRpb25hbCBhbGxvY2F0aW9uIGZsYWdzLiAqLworCXVpbnQ2NF90IGFsbG9jX2ZsYWdzOworCisJLyoqIE1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBidWZmZXIgaWYgYW55LiAqLworCXN0cnVjdCBhbWRncHVfYm9fbWV0YWRhdGEgbWV0YWRhdGE7Cit9OworCisvKioKKyAqIFN0cnVjdHVyZSB3aXRoIGluZm9ybWF0aW9uIGFib3V0ICJpbXBvcnRlZCIgYnVmZmVyCisgKgorICogXHNhIGFtZGdwdV9ib19pbXBvcnQoKQorICoKKyAqLworc3RydWN0IGFtZGdwdV9ib19pbXBvcnRfcmVzdWx0IHsKKwkvKiogSGFuZGxlIG9mIG1lbW9yeS9idWZmZXIgdG8gdXNlICovCisJYW1kZ3B1X2JvX2hhbmRsZSBidWZfaGFuZGxlOworCisJIC8qKiBCdWZmZXIgc2l6ZSAqLworCXVpbnQ2NF90IGFsbG9jX3NpemU7Cit9OworCisvKioKKyAqCisgKiBTdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgR0RTIHBhcnRpdGlvbmluZyBpbmZvcm1hdGlvbi4KKyAqIFxub3RlIE9BIGFuZCBHV1MgcmVzb3VyY2VzIGFyZSBhc3Njb2lhdGVkIHdpdGggR0RTIHBhcnRpdGlvbgorICoKKyAqIFxzYSBhbWRncHVfZ3B1X3Jlc291cmNlX3F1ZXJ5X2dkc19pbmZvCisgKgorKi8KK3N0cnVjdCBhbWRncHVfZ2RzX3Jlc291cmNlX2luZm8geworCXVpbnQzMl90IGdkc19nZnhfcGFydGl0aW9uX3NpemU7CisJdWludDMyX3QgY29tcHV0ZV9wYXJ0aXRpb25fc2l6ZTsKKwl1aW50MzJfdCBnZHNfdG90YWxfc2l6ZTsKKwl1aW50MzJfdCBnd3NfcGVyX2dmeF9wYXJ0aXRpb247CisJdWludDMyX3QgZ3dzX3Blcl9jb21wdXRlX3BhcnRpdGlvbjsKKwl1aW50MzJfdCBvYV9wZXJfZ2Z4X3BhcnRpdGlvbjsKKwl1aW50MzJfdCBvYV9wZXJfY29tcHV0ZV9wYXJ0aXRpb247Cit9OworCisvKioKKyAqIFN0cnVjdHVyZSBkZXNjcmliaW5nIENTIGZlbmNlCisgKgorICogXHNhIGFtZGdwdV9jc19xdWVyeV9mZW5jZV9zdGF0dXMoKSwgYW1kZ3B1X2NzX3JlcXVlc3QsIGFtZGdwdV9jc19zdWJtaXQoKQorICoKKyovCitzdHJ1Y3QgYW1kZ3B1X2NzX2ZlbmNlIHsKKworCS8qKiBJbiB3aGljaCBjb250ZXh0IElCIHdhcyBzZW50IHRvIGV4ZWN1dGlvbiAqLworCWFtZGdwdV9jb250ZXh0X2hhbmRsZSBjb250ZXh0OworCisJLyoqIFRvIHdoaWNoIEhXIElQIHR5cGUgdGhlIGZlbmNlIGJlbG9uZ3MgKi8KKwl1aW50MzJfdCBpcF90eXBlOworCisJLyoqIElQIGluc3RhbmNlIGluZGV4IGlmIHRoZXJlIGFyZSBzZXZlcmFsIElQcyBvZiB0aGUgc2FtZSB0eXBlLiAqLworCXVpbnQzMl90IGlwX2luc3RhbmNlOworCisJLyoqIFJpbmcgaW5kZXggb2YgdGhlIEhXIElQICovCisJdWludDMyX3QgcmluZzsKKworCS8qKiBTcGVjaWZ5IGZlbmNlIGZvciB3aGljaCB3ZSBuZWVkIHRvIGNoZWNrIHN1Ym1pc3Npb24gc3RhdHVzLiovCisJdWludDY0X3QgZmVuY2U7Cit9OworCisvKioKKyAqIFN0cnVjdHVyZSBkZXNjcmliaW5nIElCCisgKgorICogXHNhIGFtZGdwdV9jc19yZXF1ZXN0LCBhbWRncHVfY3Nfc3VibWl0KCkKKyAqCisqLworc3RydWN0IGFtZGdwdV9jc19pYl9pbmZvIHsKKwkvKiogU3BlY2lhbCBmbGFncyAqLworCXVpbnQ2NF90IGZsYWdzOworCisJLyoqIFZpcnR1YWwgTUMgYWRkcmVzcyBvZiB0aGUgY29tbWFuZCBidWZmZXIgKi8KKwl1aW50NjRfdCBpYl9tY19hZGRyZXNzOworCisJLyoqCisJICogU2l6ZSBvZiBDb21tYW5kIEJ1ZmZlciB0byBiZSBzdWJtaXR0ZWQuCisJICogICAtIFRoZSBzaXplIGlzIGluIHVuaXRzIG9mIGR3b3JkcyAoNCBieXRlcykuCisJICogICAtIENvdWxkIGJlIDAKKwkgKi8KKwl1aW50MzJfdCBzaXplOworfTsKKworLyoqCisgKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBmZW5jZSBpbmZvcm1hdGlvbgorICoKKyAqIFxzYSBhbWRncHVfY3NfcmVxdWVzdCwgYW1kZ3B1X2NzX3F1ZXJ5X2ZlbmNlLAorICogICAgIGFtZGdwdV9jc19zdWJtaXQoKSwgYW1kZ3B1X2NzX3F1ZXJ5X2ZlbmNlX3N0YXR1cygpCisqLworc3RydWN0IGFtZGdwdV9jc19mZW5jZV9pbmZvIHsKKwkvKiogYnVmZmVyIG9iamVjdCBmb3IgdGhlIGZlbmNlICovCisJYW1kZ3B1X2JvX2hhbmRsZSBoYW5kbGU7CisKKwkvKiogZmVuY2Ugb2Zmc2V0IGluIHRoZSB1bml0IG9mIHNpemVvZih1aW50NjRfdCkgKi8KKwl1aW50NjRfdCBvZmZzZXQ7Cit9OworCisvKioKKyAqIFN0cnVjdHVyZSBkZXNjcmliaW5nIHN1Ym1pc3Npb24gcmVxdWVzdAorICoKKyAqIFxub3RlIFdlIGNvdWxkIGhhdmUgc2V2ZXJhbCBJQnMgYXMgcGFja2V0LiBlLmcuIENFLCBDRSwgREUgY2FzZSBmb3IgZ2Z4CisgKgorICogXHNhIGFtZGdwdV9jc19zdWJtaXQoKQorKi8KK3N0cnVjdCBhbWRncHVfY3NfcmVxdWVzdCB7CisJLyoqIFNwZWNpZnkgZmxhZ3Mgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICovCisJdWludDY0X3QgZmxhZ3M7CisKKwkvKiogU3BlY2lmeSBIVyBJUCBibG9jayB0eXBlIHRvIHdoaWNoIHRvIHNlbmQgdGhlIElCLiAqLworCXVuc2lnbmVkIGlwX3R5cGU7CisKKwkvKiogSVAgaW5zdGFuY2UgaW5kZXggaWYgdGhlcmUgYXJlIHNldmVyYWwgSVBzIG9mIHRoZSBzYW1lIHR5cGUuICovCisJdW5zaWduZWQgaXBfaW5zdGFuY2U7CisKKwkvKioKKwkgKiBTcGVjaWZ5IHJpbmcgaW5kZXggb2YgdGhlIElQLiBXZSBjb3VsZCBoYXZlIHNldmVyYWwgcmluZ3MKKwkgKiBpbiB0aGUgc2FtZSBJUC4gRS5nLiAwIGZvciBTRE1BMCBhbmQgMSBmb3IgU0RNQTEuCisJICovCisJdWludDMyX3QgcmluZzsKKworCS8qKgorCSAqIExpc3QgaGFuZGxlIHdpdGggcmVzb3VyY2VzIHVzZWQgYnkgdGhpcyByZXF1ZXN0LgorCSAqLworCWFtZGdwdV9ib19saXN0X2hhbmRsZSByZXNvdXJjZXM7CisKKwkvKioKKwkgKiBOdW1iZXIgb2YgZGVwZW5kZW5jaWVzIHRoaXMgQ29tbWFuZCBzdWJtaXNzaW9uIG5lZWRzIHRvCisJICogd2FpdCBmb3IgYmVmb3JlIHN0YXJ0aW5nIGV4ZWN1dGlvbi4KKwkgKi8KKwl1aW50MzJfdCBudW1iZXJfb2ZfZGVwZW5kZW5jaWVzOworCisJLyoqCisJICogQXJyYXkgb2YgZGVwZW5kZW5jaWVzIHdoaWNoIG5lZWQgdG8gYmUgbWV0IGJlZm9yZQorCSAqIGV4ZWN1dGlvbiBjYW4gc3RhcnQuCisJICovCisJc3RydWN0IGFtZGdwdV9jc19mZW5jZSAqZGVwZW5kZW5jaWVzOworCisJLyoqIE51bWJlciBvZiBJQnMgdG8gc3VibWl0IGluIHRoZSBmaWVsZCBpYnMuICovCisJdWludDMyX3QgbnVtYmVyX29mX2liczsKKworCS8qKgorCSAqIElCcyB0byBzdWJtaXQuIFRob3NlIElCcyB3aWxsIGJlIHN1Ym1pdCB0b2dldGhlciBhcyBzaW5nbGUgZW50aXR5CisJICovCisJc3RydWN0IGFtZGdwdV9jc19pYl9pbmZvICppYnM7CisKKwkvKioKKwkgKiBUaGUgcmV0dXJuZWQgc2VxdWVuY2UgbnVtYmVyIGZvciB0aGUgY29tbWFuZCBzdWJtaXNzaW9uIAorCSAqLworCXVpbnQ2NF90IHNlcV9ubzsKKworCS8qKgorCSAqIFRoZSBmZW5jZSBpbmZvcm1hdGlvbgorCSAqLworCXN0cnVjdCBhbWRncHVfY3NfZmVuY2VfaW5mbyBmZW5jZV9pbmZvOworfTsKKworLyoqCisgKiBTdHJ1Y3R1cmUgd2hpY2ggcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCBHUFUgVk0gTUMgQWRkcmVzcyBzcGFjZQorICogYWxpZ25tZW50cyByZXF1aXJlbWVudHMKKyAqCisgKiBcc2EgYW1kZ3B1X3F1ZXJ5X2J1ZmZlcl9zaXplX2FsaWdubWVudAorICovCitzdHJ1Y3QgYW1kZ3B1X2J1ZmZlcl9zaXplX2FsaWdubWVudHMgeworCS8qKiBTaXplIGFsaWdubWVudCByZXF1aXJlbWVudCBmb3IgYWxsb2NhdGlvbiBpbgorCSAqIGxvY2FsIG1lbW9yeSAqLworCXVpbnQ2NF90IHNpemVfbG9jYWw7CisKKwkvKioKKwkgKiBTaXplIGFsaWdubWVudCByZXF1aXJlbWVudCBmb3IgYWxsb2NhdGlvbiBpbiByZW1vdGUgbWVtb3J5CisJICovCisJdWludDY0X3Qgc2l6ZV9yZW1vdGU7Cit9OworCisvKioKKyAqIFN0cnVjdHVyZSB3aGljaCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IGhlYXAKKyAqCisgKiBcc2EgYW1kZ3B1X3F1ZXJ5X2hlYXBfaW5mbygpCisgKgorICovCitzdHJ1Y3QgYW1kZ3B1X2hlYXBfaW5mbyB7CisJLyoqIFRoZW9yZXRpY2FsIG1heC4gYXZhaWxhYmxlIG1lbW9yeSBpbiB0aGUgZ2l2ZW4gaGVhcCAqLworCXVpbnQ2NF90IGhlYXBfc2l6ZTsKKworCS8qKgorCSAqIE51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgaW4gdGhlIGhlYXAuIFRoaXMgaW5jbHVkZXMgYWxsIHByb2Nlc3NlcworCSAqIGFuZCBwcml2YXRlIGFsbG9jYXRpb25zIGluIHRoZSBrZXJuZWwuIEl0IGNoYW5nZXMgd2hlbiBuZXcgYnVmZmVycworCSAqIGFyZSBhbGxvY2F0ZWQsIGZyZWVkLCBhbmQgbW92ZWQuIEl0IGNhbm5vdCBiZSBsYXJnZXIgdGhhbgorCSAqIGhlYXBfc2l6ZS4KKwkgKi8KKwl1aW50NjRfdCBoZWFwX3VzYWdlOworCisJLyoqCisJICogVGhlb3JldGljYWwgcG9zc2libGUgbWF4LiBzaXplIG9mIGJ1ZmZlciB3aGljaAorCSAqIGNvdWxkIGJlIGFsbG9jYXRlZCBpbiB0aGUgZ2l2ZW4gaGVhcAorCSAqLworCXVpbnQ2NF90IG1heF9hbGxvY2F0aW9uOworfTsKKworLyoqCisgKiBEZXNjcmliZSBHUFUgaC93IGluZm8gbmVlZGVkIGZvciBVTUQgY29ycmVjdCBpbml0aWFsaXphdGlvbgorICoKKyAqIFxzYSBhbWRncHVfcXVlcnlfZ3B1X2luZm8oKQorKi8KK3N0cnVjdCBhbWRncHVfZ3B1X2luZm8geworCS8qKiBBc2ljIGlkICovCisJdWludDMyX3QgYXNpY19pZDsKKwkvKiogQ2hpcCByZXZpc2lvbiAqLworCXVpbnQzMl90IGNoaXBfcmV2OworCS8qKiBDaGlwIGV4dGVybmFsIHJldmlzaW9uICovCisJdWludDMyX3QgY2hpcF9leHRlcm5hbF9yZXY7CisJLyoqIEZhbWlseSBJRCAqLworCXVpbnQzMl90IGZhbWlseV9pZDsKKwkvKiogU3BlY2lhbCBmbGFncyAqLworCXVpbnQ2NF90IGlkc19mbGFnczsKKwkvKiogbWF4IGVuZ2luZSBjbG9jayovCisJdWludDY0X3QgbWF4X2VuZ2luZV9jbGs7CisJLyoqIG1heCBtZW1vcnkgY2xvY2sgKi8KKwl1aW50NjRfdCBtYXhfbWVtb3J5X2NsazsKKwkvKiogbnVtYmVyIG9mIHNoYWRlciBlbmdpbmVzICovCisJdWludDMyX3QgbnVtX3NoYWRlcl9lbmdpbmVzOworCS8qKiBudW1iZXIgb2Ygc2hhZGVyIGFycmF5cyBwZXIgZW5naW5lICovCisJdWludDMyX3QgbnVtX3NoYWRlcl9hcnJheXNfcGVyX2VuZ2luZTsKKwkvKiogIE51bWJlciBvZiBhdmFpbGFibGUgZ29vZCBzaGFkZXIgcGlwZXMgKi8KKwl1aW50MzJfdCBhdmFpbF9xdWFkX3NoYWRlcl9waXBlczsKKwkvKiogIE1heC4gbnVtYmVyIG9mIHNoYWRlciBwaXBlcy4oaW5jbHVkaW5nIGdvb2QgYW5kIGJhZCBwaXBlcyAgKi8KKwl1aW50MzJfdCBtYXhfcXVhZF9zaGFkZXJfcGlwZXM7CisJLyoqIE51bWJlciBvZiBwYXJhbWV0ZXIgY2FjaGUgZW50cmllcyBwZXIgc2hhZGVyIHF1YWQgcGlwZSAqLworCXVpbnQzMl90IGNhY2hlX2VudHJpZXNfcGVyX3F1YWRfcGlwZTsKKwkvKiogIE51bWJlciBvZiBhdmFpbGFibGUgZ3JhcGhpY3MgY29udGV4dCAqLworCXVpbnQzMl90IG51bV9od19nZnhfY29udGV4dHM7CisJLyoqIE51bWJlciBvZiByZW5kZXIgYmFja2VuZCBwaXBlcyAqLworCXVpbnQzMl90IHJiX3BpcGVzOworCS8qKiAgRW5hYmxlZCByZW5kZXIgYmFja2VuZCBwaXBlIG1hc2sgKi8KKwl1aW50MzJfdCBlbmFibGVkX3JiX3BpcGVzX21hc2s7CisJLyoqIEZyZXF1ZW5jeSBvZiBHUFUgQ291bnRlciAqLworCXVpbnQzMl90IGdwdV9jb3VudGVyX2ZyZXE7CisJLyoqIENDX1JCX0JBQ0tFTkRfRElTQUJMRS5CQUNLRU5EX0RJU0FCTEUgcGVyIFNFICovCisJdWludDMyX3QgYmFja2VuZF9kaXNhYmxlWzRdOworCS8qKiBWYWx1ZSBvZiBNQ19BUkJfUkFNQ0ZHIHJlZ2lzdGVyKi8KKwl1aW50MzJfdCBtY19hcmJfcmFtY2ZnOworCS8qKiBWYWx1ZSBvZiBHQl9BRERSX0NPTkZJRyAqLworCXVpbnQzMl90IGdiX2FkZHJfY2ZnOworCS8qKiBWYWx1ZXMgb2YgdGhlIEdCX1RJTEVfTU9ERTAuLjMxIHJlZ2lzdGVycyAqLworCXVpbnQzMl90IGdiX3RpbGVfbW9kZVszMl07CisJLyoqIFZhbHVlcyBvZiBHQl9NQUNST1RJTEVfTU9ERTAuLjE1IHJlZ2lzdGVycyAqLworCXVpbnQzMl90IGdiX21hY3JvX3RpbGVfbW9kZVsxNl07CisJLyoqIFZhbHVlIG9mIFBBX1NDX1JBU1RFUl9DT05GSUcgcmVnaXN0ZXIgcGVyIFNFICovCisJdWludDMyX3QgcGFfc2NfcmFzdGVyX2NmZ1s0XTsKKwkvKiogVmFsdWUgb2YgUEFfU0NfUkFTVEVSX0NPTkZJR18xIHJlZ2lzdGVyIHBlciBTRSAqLworCXVpbnQzMl90IHBhX3NjX3Jhc3Rlcl9jZmcxWzRdOworCS8qIENVIGluZm8gKi8KKwl1aW50MzJfdCBjdV9hY3RpdmVfbnVtYmVyOworCXVpbnQzMl90IGN1X2FvX21hc2s7CisJdWludDMyX3QgY3VfYml0bWFwWzRdWzRdOworCS8qIHZpZGVvIG1lbW9yeSB0eXBlIGluZm8qLworCXVpbnQzMl90IHZyYW1fdHlwZTsKKwkvKiB2aWRlbyBtZW1vcnkgYml0IHdpZHRoKi8KKwl1aW50MzJfdCB2cmFtX2JpdF93aWR0aDsKKwkvKiogY29uc3RhbnQgZW5naW5lIHJhbSBzaXplKi8KKwl1aW50MzJfdCBjZV9yYW1fc2l6ZTsKKwkvKiB2Y2UgaGFydmVzdGluZyBpbnN0YW5jZSAqLworCXVpbnQzMl90IHZjZV9oYXJ2ZXN0X2NvbmZpZzsKKwkvKiBQQ0kgcmV2aXNpb24gSUQgKi8KKwl1aW50MzJfdCBwY2lfcmV2X2lkOworfTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBJbml0aWFsaXphdGlvbiAvIENsZWFudXAKKyAqCisqLworCisvKioKKyAqCisgKiBccGFyYW0gICBmZCAgICAgICAgICAgIC0gXGMgW2luXSAgRmlsZSBkZXNjcmlwdG9yIGZvciBBTUQgR1BVIGRldmljZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkIHByZXZpb3VzbHkgYXMgdGhlIHJlc3VsdCBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy4gZHJtT3BlbigpIGNhbGwuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGxlZ2FjeSBmZCB0eXBlLCB0aGUgRFJJMi9EUkkzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb24gc2hvdWxkIGJlIGRvbmUgYmVmb3JlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICogXHBhcmFtICAgbWFqb3JfdmVyc2lvbiAtIFxjIFtvdXRdIE1ham9yIHZlcnNpb24gb2YgbGlicmFyeS4gSXQgaXMgYXNzdW1lZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgYWRkaW5nIG5ldyBmdW5jdGlvbmFsaXR5IHdpbGwgY2F1c2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZWFzZSBpbiBtYWpvciB2ZXJzaW9uCisgKiBccGFyYW0gICBtaW5vcl92ZXJzaW9uIC0gXGMgW291dF0gTWlub3IgdmVyc2lvbiBvZiBsaWJyYXJ5CisgKiBccGFyYW0gICBkZXZpY2VfaGFuZGxlIC0gXGMgW291dF0gUG9pbnRlciB0byBvcGFxdWUgY29udGV4dCB3aGljaCBzaG91bGQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciBvbiBlYWNoCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJIGNhbGwKKyAqCisgKgorICogXHJldHVybiAgIDAgb24gc3VjY2Vzc1xuCisgKiAgICAgICAgICA8MCAtIE5lZ2F0aXZlIFBPU0lYIEVycm9yIGNvZGUKKyAqCisgKgorICogXHNhIGFtZGdwdV9kZXZpY2VfZGVpbml0aWFsaXplKCkKKyovCitpbnQgYW1kZ3B1X2RldmljZV9pbml0aWFsaXplKGludCBmZCwKKwkJCSAgICAgdWludDMyX3QgKm1ham9yX3ZlcnNpb24sCisJCQkgICAgIHVpbnQzMl90ICptaW5vcl92ZXJzaW9uLAorCQkJICAgICBhbWRncHVfZGV2aWNlX2hhbmRsZSAqZGV2aWNlX2hhbmRsZSk7CisKKy8qKgorICoKKyAqIFdoZW4gYWNjZXNzIHRvIHN1Y2ggbGlicmFyeSBkb2VzIG5vdCBuZWVkZWQgYW55IG1vcmUgdGhlIHNwZWNpYWwKKyAqIGZ1bmN0aW9uIG11c3QgYmUgY2FsbCBnaXZpbmcgb3Bwb3J0dW5pdHkgdG8gY2xlYW4gdXAgYW55CisgKiByZXNvdXJjZXMgaWYgbmVlZGVkLgorICoKKyAqIFxwYXJhbSAgIGRldmljZV9oYW5kbGUgLSBcYyBbaW5dICBDb250ZXh0IGFzc29jaWF0ZWQgd2l0aCBmaWxlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciBmb3IgQU1EIEdQVSBkZXZpY2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZCBwcmV2aW91c2x5IGFzIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCBlLmcuIG9mIGRybU9wZW4oKSBjYWxsLgorICoKKyAqIFxyZXR1cm4gIDAgb24gc3VjY2Vzc1xuCisgKiAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyAqIFxzYSBhbWRncHVfZGV2aWNlX2luaXRpYWxpemUoKQorICoKKyovCitpbnQgYW1kZ3B1X2RldmljZV9kZWluaXRpYWxpemUoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2aWNlX2hhbmRsZSk7CisKKy8qCisgKiBNZW1vcnkgTWFuYWdlbWVudAorICoKKyovCisKKy8qKgorICogQWxsb2NhdGUgbWVtb3J5IHRvIGJlIHVzZWQgYnkgVU1EIGZvciBHUFUgcmVsYXRlZCBvcGVyYXRpb25zCisgKgorICogXHBhcmFtICAgZGV2CQkgLSBcYyBbaW5dIERldmljZSBoYW5kbGUuCisgKgkJCQkgICBTZWUgI2FtZGdwdV9kZXZpY2VfaW5pdGlhbGl6ZSgpCisgKiBccGFyYW0gICBhbGxvY19idWZmZXIgLSBcYyBbaW5dIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSBkZXNjcmliaW5nIGFuCisgKgkJCQkgICBhbGxvY2F0aW9uIHJlcXVlc3QKKyAqIFxwYXJhbSAgIGJ1Zl9oYW5kbGUJLSBcYyBbb3V0XSBBbGxvY2F0ZWQgYnVmZmVyIGhhbmRsZQorICoKKyAqIFxyZXR1cm4gICAwIG9uIHN1Y2Nlc3NcbgorICogICAgICAgICAgPDAgLSBOZWdhdGl2ZSBQT1NJWCBFcnJvciBjb2RlCisgKgorICogXHNhIGFtZGdwdV9ib19mcmVlKCkKKyovCitpbnQgYW1kZ3B1X2JvX2FsbG9jKGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldiwKKwkJICAgIHN0cnVjdCBhbWRncHVfYm9fYWxsb2NfcmVxdWVzdCAqYWxsb2NfYnVmZmVyLAorCQkgICAgYW1kZ3B1X2JvX2hhbmRsZSAqYnVmX2hhbmRsZSk7CisKKy8qKgorICogQXNzb2NpYXRlIG9wYXF1ZSBkYXRhIHdpdGggYnVmZmVyIHRvIGJlIHF1ZXJpZWQgYnkgYW5vdGhlciBVTUQKKyAqCisgKiBccGFyYW0gICBkZXYJICAgICAgIC0gXGMgW2luXSBEZXZpY2UgaGFuZGxlLiBTZWUgI2FtZGdwdV9kZXZpY2VfaW5pdGlhbGl6ZSgpCisgKiBccGFyYW0gICBidWZfaGFuZGxlIC0gXGMgW2luXSBCdWZmZXIgaGFuZGxlCisgKiBccGFyYW0gICBpbmZvICAgICAgIC0gXGMgW2luXSBNZXRhZGF0YSB0byBhc3NvY2lhdGVkIHdpdGggYnVmZmVyCisgKgorICogXHJldHVybiAgIDAgb24gc3VjY2Vzc1xuCisgKiAgICAgICAgICA8MCAtIE5lZ2F0aXZlIFBPU0lYIEVycm9yIGNvZGUKKyovCitpbnQgYW1kZ3B1X2JvX3NldF9tZXRhZGF0YShhbWRncHVfYm9faGFuZGxlIGJ1Zl9oYW5kbGUsCisJCQkgICBzdHJ1Y3QgYW1kZ3B1X2JvX21ldGFkYXRhICppbmZvKTsKKworLyoqCisgKiBRdWVyeSBidWZmZXIgaW5mb3JtYXRpb24gaW5jbHVkaW5nIG1ldGFkYXRhIHByZXZpdXNseSBhc3NvY2lhdGVkIHdpdGgKKyAqIGJ1ZmZlci4KKyAqCisgKiBccGFyYW0gICBkZXYJICAgICAgIC0gXGMgW2luXSBEZXZpY2UgaGFuZGxlLgorICoJCQkJIFNlZSAjYW1kZ3B1X2RldmljZV9pbml0aWFsaXplKCkKKyAqIFxwYXJhbSAgIGJ1Zl9oYW5kbGUgLSBcYyBbaW5dICAgQnVmZmVyIGhhbmRsZQorICogXHBhcmFtICAgaW5mbyAgICAgICAtIFxjIFtvdXRdICBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBidWZmZXIKKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyAqIFxzYSBhbWRncHVfYm9fc2V0X21ldGFkYXRhKCksIGFtZGdwdV9ib19hbGxvYygpCisqLworaW50IGFtZGdwdV9ib19xdWVyeV9pbmZvKGFtZGdwdV9ib19oYW5kbGUgYnVmX2hhbmRsZSwKKwkJCSBzdHJ1Y3QgYW1kZ3B1X2JvX2luZm8gKmluZm8pOworCisvKioKKyAqIEFsbG93IG90aGVycyB0byBnZXQgYWNjZXNzIHRvIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSAgIGRldgkJICAtIFxjIFtpbl0gRGV2aWNlIGhhbmRsZS4KKyAqCQkJCSAgICBTZWUgI2FtZGdwdV9kZXZpY2VfaW5pdGlhbGl6ZSgpCisgKiBccGFyYW0gICBidWZfaGFuZGxlICAgIC0gXGMgW2luXSBCdWZmZXIgaGFuZGxlCisgKiBccGFyYW0gICB0eXBlICAgICAgICAgIC0gXGMgW2luXSBUeXBlIG9mIGhhbmRsZSByZXF1ZXN0ZWQKKyAqIFxwYXJhbSAgIHNoYXJlZF9oYW5kbGUgLSBcYyBbb3V0XSBTcGVjaWFsICJzaGFyZWQiIGhhbmRsZQorICoKKyAqIFxyZXR1cm4gICAwIG9uIHN1Y2Nlc3NcbgorICogICAgICAgICAgPDAgLSBOZWdhdGl2ZSBQT1NJWCBFcnJvciBjb2RlCisgKgorICogXHNhIGFtZGdwdV9ib19pbXBvcnQoKQorICoKKyovCitpbnQgYW1kZ3B1X2JvX2V4cG9ydChhbWRncHVfYm9faGFuZGxlIGJ1Zl9oYW5kbGUsCisJCSAgICAgZW51bSBhbWRncHVfYm9faGFuZGxlX3R5cGUgdHlwZSwKKwkJICAgICB1aW50MzJfdCAqc2hhcmVkX2hhbmRsZSk7CisKKy8qKgorICogUmVxdWVzdCBhY2Nlc3MgdG8gInNoYXJlZCIgYnVmZmVyCisgKgorICogXHBhcmFtICAgZGV2CQkgIC0gXGMgW2luXSBEZXZpY2UgaGFuZGxlLgorICoJCQkJICAgIFNlZSAjYW1kZ3B1X2RldmljZV9pbml0aWFsaXplKCkKKyAqIFxwYXJhbSAgIHR5cGUJICAtIFxjIFtpbl0gVHlwZSBvZiBoYW5kbGUgcmVxdWVzdGVkCisgKiBccGFyYW0gICBzaGFyZWRfaGFuZGxlIC0gXGMgW2luXSBTaGFyZWQgaGFuZGxlIHJlY2VpdmVkIGFzIHJlc3VsdCAiaW1wb3J0IgorICoJCQkJICAgICBvcGVyYXRpb24KKyAqIFxwYXJhbSAgIG91dHB1dCAgICAgICAgLSBcYyBbb3V0XSBQb2ludGVyIHRvIHN0cnVjdHVyZSB3aXRoIGluZm9ybWF0aW9uCisgKgkJCQkgICAgIGFib3V0IGltcG9ydGVkIGJ1ZmZlcgorICoKKyAqIFxyZXR1cm4gICAwIG9uIHN1Y2Nlc3NcbgorICogICAgICAgICAgPDAgLSBOZWdhdGl2ZSBQT1NJWCBFcnJvciBjb2RlCisgKgorICogXG5vdGUgIEJ1ZmZlciBtdXN0IGJlICJpbXBvcnRlZCIgb25seSB1c2luZyBuZXcgImZkIiAoZGlmZmVyZW50IGZyb20KKyAqCSAgb25lIHVzZWQgYnkgImV4cG9ydGVyIikuCisgKgorICogXHNhIGFtZGdwdV9ib19leHBvcnQoKQorICoKKyovCitpbnQgYW1kZ3B1X2JvX2ltcG9ydChhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXYsCisJCSAgICAgZW51bSBhbWRncHVfYm9faGFuZGxlX3R5cGUgdHlwZSwKKwkJICAgICB1aW50MzJfdCBzaGFyZWRfaGFuZGxlLAorCQkgICAgIHN0cnVjdCBhbWRncHVfYm9faW1wb3J0X3Jlc3VsdCAqb3V0cHV0KTsKKworLyoqCisgKiBSZXF1ZXN0IEdQVSBhY2Nlc3MgdG8gdXNlciBhbGxvY2F0ZWQgbWVtb3J5IGUuZy4gdmlhICJtYWxsb2MiCisgKgorICogXHBhcmFtIGRldiAtIFtpbl0gRGV2aWNlIGhhbmRsZS4gU2VlICNhbWRncHVfZGV2aWNlX2luaXRpYWxpemUoKQorICogXHBhcmFtIGNwdSAtIFtpbl0gQ1BVIGFkZHJlc3Mgb2YgdXNlciBhbGxvY2F0ZWQgbWVtb3J5IHdoaWNoIHdlCisgKiB3YW50IHRvIG1hcCB0byBHUFUgYWRkcmVzcyBzcGFjZSAobWFrZSBHUFUgYWNjZXNzaWJsZSkKKyAqIChUaGlzIGFkZHJlc3MgbXVzdCBiZSBjb3JyZWN0bHkgYWxpZ25lZCkuCisgKiBccGFyYW0gc2l6ZSAtIFtpbl0gU2l6ZSBvZiBhbGxvY2F0aW9uIChtdXN0IGJlIGNvcnJlY3RseSBhbGlnbmVkKQorICogXHBhcmFtIGJ1Zl9oYW5kbGUgLSBbb3V0XSBCdWZmZXIgaGFuZGxlIGZvciB0aGUgdXNlcnB0ciBtZW1vcnkKKyAqIHJlc291cmNlIG9uIHN1Ym1pc3Npb24gYW5kIGJlIHVzZWQgaW4gb3RoZXIgb3BlcmF0aW9ucy4KKyAqCisgKgorICogXHJldHVybiAgIDAgb24gc3VjY2Vzc1xuCisgKiAgICAgICAgICA8MCAtIE5lZ2F0aXZlIFBPU0lYIEVycm9yIGNvZGUKKyAqCisgKiBcbm90ZQorICogVGhpcyBjYWxsIGRvZXNuJ3QgZ3VhcmFudGVlIHRoYXQgc3VjaCBtZW1vcnkgd2lsbCBiZSBwZXJzaXN0ZW50bHkKKyAqICJsb2NrZWQiIC8gbWFrZSBub24tcGFnZWFibGUuIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2FsbCBpcyB0byBwcm92aWRlCisgKiBvcHBvcnR1bml0eSBmb3IgR1BVIGdldCBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZSBkdXJpbmcgc3VibWlzc2lvbi4KKyAqCisgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHdoaWNoIGNvdWxkIGJlIG1hcHBlZCBpbiB0aGlzIGNhbGwgZGVwZW5kcworICogaWYgb3ZlcmNvbW1pdCBpcyBkaXNhYmxlZCBvciBub3QuIElmIG92ZXJjb21taXQgaXMgZGlzYWJsZWQgdGhhbiB0aGUgbWF4LgorICogYW1vdW50IG9mIG1lbW9yeSB0byBiZSBwaW5uZWQgd2lsbCBiZSBsaW1pdGVkIGJ5IGxlZnQgImZyZWUiIHNpemUgaW4gdG90YWwKKyAqIGFtb3VudCBvZiBtZW1vcnkgd2hpY2ggY291bGQgYmUgbG9ja2VkIHNpbXVsdGFuZW91c2x5ICgiR0FSVCIgc2l6ZSkuCisgKgorICogU3VwcG9ydGVkICh0aGVvcmV0aWNhbCkgbWF4LiBzaXplIG9mIG1hcHBpbmcgaXMgcmVzdHJpY3RlZCBvbmx5IGJ5CisgKiAiR0FSVCIgc2l6ZS4KKyAqCisgKiBJdCBpcyByZXNwb25zaWJpbGl0eSBvZiBjYWxsZXIgdG8gY29ycmVjdGx5IHNwZWNpZnkgYWNjZXNzIHJpZ2h0cworICogb24gVkEgYXNzaWdubWVudC4KKyovCitpbnQgYW1kZ3B1X2NyZWF0ZV9ib19mcm9tX3VzZXJfbWVtKGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldiwKKwkJCQkgICAgdm9pZCAqY3B1LCB1aW50NjRfdCBzaXplLAorCQkJCSAgICBhbWRncHVfYm9faGFuZGxlICpidWZfaGFuZGxlKTsKKworLyoqCisgKiBGcmVlIHByZXZpb3N1bHkgYWxsb2NhdGVkIG1lbW9yeQorICoKKyAqIFxwYXJhbSAgIGRldgkgICAgICAgLSBcYyBbaW5dIERldmljZSBoYW5kbGUuIFNlZSAjYW1kZ3B1X2RldmljZV9pbml0aWFsaXplKCkKKyAqIFxwYXJhbSAgIGJ1Zl9oYW5kbGUgLSBcYyBbaW5dICBCdWZmZXIgaGFuZGxlIHRvIGZyZWUKKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyAqIFxub3RlIEluIHRoZSBjYXNlIG9mIG1lbW9yeSBzaGFyZWQgYmV0d2VlbiBkaWZmZXJlbnQgYXBwbGljYXRpb25zIGFsbAorICoJIHJlc291cmNlcyB3aWxsIGJlIOKAnHBoeXNpY2FsbHnigJ0gZnJlZWQgb25seSBhbGwgc3VjaCBhcHBsaWNhdGlvbnMKKyAqCSB3aWxsIGJlIHRlcm1pbmF0ZWQKKyAqIFxub3RlIElmIGlzIFVNRCByZXNwb25zaWJpbGl0eSB0byDigJhmcmVl4oCZIGJ1ZmZlciBvbmx5IHdoZW4gdGhlcmUgaXMgbm8KKyAqCSBtb3JlIEdQVSBhY2Nlc3MKKyAqCisgKiBcc2EgYW1kZ3B1X2JvX3NldF9tZXRhZGF0YSgpLCBhbWRncHVfYm9fYWxsb2MoKQorICoKKyovCitpbnQgYW1kZ3B1X2JvX2ZyZWUoYW1kZ3B1X2JvX2hhbmRsZSBidWZfaGFuZGxlKTsKKworLyoqCisgKiBSZXF1ZXN0IENQVSBhY2Nlc3MgdG8gR1BVIGFjY2Vzc2libGUgbWVtb3J5CisgKgorICogXHBhcmFtICAgYnVmX2hhbmRsZSAtIFxjIFtpbl0gQnVmZmVyIGhhbmRsZQorICogXHBhcmFtICAgY3B1ICAgICAgICAtIFxjIFtvdXRdIENQVSBhZGRyZXNzIHRvIGJlIHVzZWQgZm9yIGFjY2VzcworICoKKyAqIFxyZXR1cm4gICAwIG9uIHN1Y2Nlc3NcbgorICogICAgICAgICAgPDAgLSBOZWdhdGl2ZSBQT1NJWCBFcnJvciBjb2RlCisgKgorICogXHNhIGFtZGdwdV9ib19jcHVfdW5tYXAoKQorICoKKyovCitpbnQgYW1kZ3B1X2JvX2NwdV9tYXAoYW1kZ3B1X2JvX2hhbmRsZSBidWZfaGFuZGxlLCB2b2lkICoqY3B1KTsKKworLyoqCisgKiBSZWxlYXNlIENQVSBhY2Nlc3MgdG8gR1BVIG1lbW9yeQorICoKKyAqIFxwYXJhbSAgIGJ1Zl9oYW5kbGUgIC0gXGMgW2luXSBCdWZmZXIgaGFuZGxlCisgKgorICogXHJldHVybiAgIDAgb24gc3VjY2Vzc1xuCisgKiAgICAgICAgICA8MCAtIE5lZ2F0aXZlIFBPU0lYIEVycm9yIGNvZGUKKyAqCisgKiBcc2EgYW1kZ3B1X2JvX2NwdV9tYXAoKQorICoKKyovCitpbnQgYW1kZ3B1X2JvX2NwdV91bm1hcChhbWRncHVfYm9faGFuZGxlIGJ1Zl9oYW5kbGUpOworCisvKioKKyAqIFdhaXQgdW50aWwgYSBidWZmZXIgaXMgbm90IHVzZWQgYnkgdGhlIGRldmljZS4KKyAqCisgKiBccGFyYW0gICBkZXYgICAgICAgICAgIC0gXGMgW2luXSBEZXZpY2UgaGFuZGxlLiBTZWUgI2FtZGdwdV9kZXZpY2VfaW5pdGlhbGl6ZSgpCisgKiBccGFyYW0gICBidWZfaGFuZGxlICAgIC0gXGMgW2luXSBCdWZmZXIgaGFuZGxlLgorICogXHBhcmFtICAgdGltZW91dF9ucyAgICAtIFRpbWVvdXQgaW4gbmFub3NlY29uZHMuCisgKiBccGFyYW0gICBidWZmZXJfYnVzeSAgIC0gMCBpZiBidWZmZXIgaXMgaWRsZSwgYWxsIEdQVSBhY2Nlc3Mgd2FzIGNvbXBsZXRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vIEdQVSBhY2Nlc3MgaXMgc2NoZWR1bGVkLgorICogICAgICAgICAgICAgICAgICAgICAgICAgIDEgR1BVIGFjY2VzcyBpcyBpbiBmbHkgb3Igc2NoZWR1bGVkCisgKgorICogXHJldHVybiAgIDAgLSBvbiBzdWNjZXNzCisgKiAgICAgICAgICA8MCAtIE5lZ2F0aXZlIFBPU0lYIEVycm9yIGNvZGUKKyAqLworaW50IGFtZGdwdV9ib193YWl0X2Zvcl9pZGxlKGFtZGdwdV9ib19oYW5kbGUgYnVmX2hhbmRsZSwKKwkJCSAgICB1aW50NjRfdCB0aW1lb3V0X25zLAorCQkJICAgIGJvb2wgKmJ1ZmZlcl9idXN5KTsKKworLyoqCisgKiBDcmVhdGVzIGEgQk8gbGlzdCBoYW5kbGUgZm9yIGNvbW1hbmQgc3VibWlzc2lvbi4KKyAqCisgKiBccGFyYW0gICBkZXYJCQktIFxjIFtpbl0gRGV2aWNlIGhhbmRsZS4KKyAqCQkJCSAgIFNlZSAjYW1kZ3B1X2RldmljZV9pbml0aWFsaXplKCkKKyAqIFxwYXJhbSAgIG51bWJlcl9vZl9yZXNvdXJjZXMJLSBcYyBbaW5dIE51bWJlciBvZiBCT3MgaW4gdGhlIGxpc3QKKyAqIFxwYXJhbSAgIHJlc291cmNlcwkJLSBcYyBbaW5dIExpc3Qgb2YgQk8gaGFuZGxlcworICogXHBhcmFtICAgcmVzb3VyY2VfcHJpb3MJLSBcYyBbaW5dIE9wdGlvbmFsIHByaW9yaXR5IGZvciBlYWNoIGhhbmRsZQorICogXHBhcmFtICAgcmVzdWx0CQktIFxjIFtvdXRdIENyZWF0ZWQgQk8gbGlzdCBoYW5kbGUKKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyAqIFxzYSBhbWRncHVfYm9fbGlzdF9kZXN0cm95KCkKKyovCitpbnQgYW1kZ3B1X2JvX2xpc3RfY3JlYXRlKGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldiwKKwkJCSAgdWludDMyX3QgbnVtYmVyX29mX3Jlc291cmNlcywKKwkJCSAgYW1kZ3B1X2JvX2hhbmRsZSAqcmVzb3VyY2VzLAorCQkJICB1aW50OF90ICpyZXNvdXJjZV9wcmlvcywKKwkJCSAgYW1kZ3B1X2JvX2xpc3RfaGFuZGxlICpyZXN1bHQpOworCisvKioKKyAqIERlc3Ryb3lzIGEgQk8gbGlzdCBoYW5kbGUuCisgKgorICogXHBhcmFtICAgaGFuZGxlCS0gXGMgW2luXSBCTyBsaXN0IGhhbmRsZS4KKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyAqIFxzYSBhbWRncHVfYm9fbGlzdF9jcmVhdGUoKQorKi8KK2ludCBhbWRncHVfYm9fbGlzdF9kZXN0cm95KGFtZGdwdV9ib19saXN0X2hhbmRsZSBoYW5kbGUpOworCisvKioKKyAqIFVwZGF0ZSByZXNvdXJjZXMgZm9yIGV4aXN0aW5nIEJPIGxpc3QKKyAqCisgKiBccGFyYW0gICBoYW5kbGUgICAgICAgICAgICAgIC0gXGMgW2luXSBCTyBsaXN0IGhhbmRsZQorICogXHBhcmFtICAgbnVtYmVyX29mX3Jlc291cmNlcyAtIFxjIFtpbl0gTnVtYmVyIG9mIEJPcyBpbiB0aGUgbGlzdAorICogXHBhcmFtICAgcmVzb3VyY2VzICAgICAgICAgICAtIFxjIFtpbl0gTGlzdCBvZiBCTyBoYW5kbGVzCisgKiBccGFyYW0gICByZXNvdXJjZV9wcmlvcyAgICAgIC0gXGMgW2luXSBPcHRpb25hbCBwcmlvcml0eSBmb3IgZWFjaCBoYW5kbGUKKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyAqIFxzYSBhbWRncHVfYm9fbGlzdF91cGRhdGUoKQorKi8KK2ludCBhbWRncHVfYm9fbGlzdF91cGRhdGUoYW1kZ3B1X2JvX2xpc3RfaGFuZGxlIGhhbmRsZSwKKwkJCSAgdWludDMyX3QgbnVtYmVyX29mX3Jlc291cmNlcywKKwkJCSAgYW1kZ3B1X2JvX2hhbmRsZSAqcmVzb3VyY2VzLAorCQkJICB1aW50OF90ICpyZXNvdXJjZV9wcmlvcyk7CisKKy8qCisgKiBHUFUgRXhlY3V0aW9uIGNvbnRleHQKKyAqCisqLworCisvKioKKyAqIENyZWF0ZSBHUFUgZXhlY3V0aW9uIENvbnRleHQKKyAqCisgKiBGb3IgdGhlIHB1cnBvc2Ugb2YgR1BVIFNjaGVkdWxlciBhbmQgR1BVIFJvYnVzdG5lc3MgZXh0ZW5zaW9ucyBpdCBpcworICogbmVjZXNzYXJ5IHRvIGhhdmUgaW5mb3JtYXRpb24vaWRlbnRpZnkgcmVuZGVyaW5nL2NvbXB1dGUgY29udGV4dHMuCisgKiBJdCBhbHNvIG1heSBiZSBuZWVkZWQgdG8gYXNzb2NpYXRlIHNvbWUgc3BlY2lmaWMgcmVxdWlyZW1lbnRzIHdpdGggc3VjaAorICogY29udGV4dHMuICBLZXJuZWwgZHJpdmVyIHdpbGwgZ3VhcmFudGVlIHRoYXQgc3VibWlzc2lvbiBmcm9tIHRoZSBzYW1lCisgKiBjb250ZXh0IHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGVkIGluIG9yZGVyIChmaXJzdCBjb21lLCBmaXJzdCBzZXJ2ZSkuCisgKgorICoKKyAqIFxwYXJhbSAgIGRldgkgICAgLSBcYyBbaW5dIERldmljZSBoYW5kbGUuIFNlZSAjYW1kZ3B1X2RldmljZV9pbml0aWFsaXplKCkKKyAqIFxwYXJhbSAgIGNvbnRleHQgLSBcYyBbb3V0XSBHUFUgQ29udGV4dCBoYW5kbGUKKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyAqIFxzYSBhbWRncHVfY3NfY3R4X2ZyZWUoKQorICoKKyovCitpbnQgYW1kZ3B1X2NzX2N0eF9jcmVhdGUoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LAorCQkJIGFtZGdwdV9jb250ZXh0X2hhbmRsZSAqY29udGV4dCk7CisKKy8qKgorICoKKyAqIERlc3Ryb3kgR1BVIGV4ZWN1dGlvbiBjb250ZXh0IHdoZW4gbm90IG5lZWRlZCBhbnkgbW9yZQorICoKKyAqIFxwYXJhbSAgIGNvbnRleHQgLSBcYyBbaW5dIEdQVSBDb250ZXh0IGhhbmRsZQorICoKKyAqIFxyZXR1cm4gICAwIG9uIHN1Y2Nlc3NcbgorICogICAgICAgICAgPDAgLSBOZWdhdGl2ZSBQT1NJWCBFcnJvciBjb2RlCisgKgorICogXHNhIGFtZGdwdV9jc19jdHhfY3JlYXRlKCkKKyAqCisqLworaW50IGFtZGdwdV9jc19jdHhfZnJlZShhbWRncHVfY29udGV4dF9oYW5kbGUgY29udGV4dCk7CisKKy8qKgorICogUXVlcnkgcmVzZXQgc3RhdGUgZm9yIHRoZSBzcGVjaWZpYyBHUFUgQ29udGV4dAorICoKKyAqIFxwYXJhbSAgIGNvbnRleHQgLSBcYyBbaW5dICBHUFUgQ29udGV4dCBoYW5kbGUKKyAqIFxwYXJhbSAgIHN0YXRlICAgLSBcYyBbb3V0XSBPbmUgb2YgQU1ER1BVX0NUWF8qX1JFU0VUCisgKiBccGFyYW0gICBoYW5ncyAgIC0gXGMgW291dF0gTnVtYmVyIG9mIGhhbmdzIGNhdXNlZCBieSB0aGUgY29udGV4dC4KKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyAqIFxzYSBhbWRncHVfY3NfY3R4X2NyZWF0ZSgpCisgKgorKi8KK2ludCBhbWRncHVfY3NfcXVlcnlfcmVzZXRfc3RhdGUoYW1kZ3B1X2NvbnRleHRfaGFuZGxlIGNvbnRleHQsCisJCQkJdWludDMyX3QgKnN0YXRlLCB1aW50MzJfdCAqaGFuZ3MpOworCisvKgorICogQ29tbWFuZCBCdWZmZXJzIE1hbmFnZW1lbnQKKyAqCisqLworCisvKioKKyAqIFNlbmQgcmVxdWVzdCB0byBzdWJtaXQgY29tbWFuZCBidWZmZXJzIHRvIGhhcmR3YXJlLgorICoKKyAqIEtlcm5lbCBkcml2ZXIgY291bGQgdXNlIEdQVSBTY2hlZHVsZXIgdG8gbWFrZSBkZWNpc2lvbiB3aGVuIHBoeXNpY2FsbHkKKyAqIHNlbnQgdGhpcyByZXF1ZXN0IHRvIHRoZSBoYXJkd2FyZS4gQWNjb3JkaW5nbHkgdGhpcyByZXF1ZXN0IGNvdWxkIGJlIHB1dAorICogaW4gcXVldWUgYW5kIHNlbnQgZm9yIGV4ZWN1dGlvbiBsYXRlci4gVGhlIG9ubHkgZ3VhcmFudGVlIGlzIHRoYXQgcmVxdWVzdAorICogZnJvbSB0aGUgc2FtZSBHUFUgY29udGV4dCB0byB0aGUgc2FtZSBpcDppcF9pbnN0YW5jZTpyaW5nIHdpbGwgYmUgZXhlY3V0ZWQgaW4KKyAqIG9yZGVyLgorICoKKyAqIFRoZSBjYWxsZXIgY2FuIHNwZWNpZnkgdGhlIHVzZXIgZmVuY2UgYnVmZmVyL2xvY2F0aW9uIHdpdGggdGhlIGZlbmNlX2luZm8gaW4gdGhlCisgKiBjc19yZXF1ZXN0LlRoZSBzZXF1ZW5jZSBudW1iZXIgaXMgcmV0dXJuZWQgdmlhIHRoZSAnc2VxX25vJyBwYXJhbWV0ZXIKKyAqIGluIGlic19yZXF1ZXN0IHN0cnVjdHVyZS4KKyAqCisgKgorICogXHBhcmFtICAgZGV2CQkgICAgICAgLSBcYyBbaW5dICBEZXZpY2UgaGFuZGxlLgorICoJCQkJCSAgU2VlICNhbWRncHVfZGV2aWNlX2luaXRpYWxpemUoKQorICogXHBhcmFtICAgY29udGV4dCAgICAgICAgICAgIC0gXGMgW2luXSAgR1BVIENvbnRleHQKKyAqIFxwYXJhbSAgIGZsYWdzICAgICAgICAgICAgICAtIFxjIFtpbl0gIEdsb2JhbCBzdWJtaXNzaW9uIGZsYWdzCisgKiBccGFyYW0gICBpYnNfcmVxdWVzdCAgICAgICAgLSBcYyBbaW4vb3V0XSBQb2ludGVyIHRvIHN1Ym1pc3Npb24gcmVxdWVzdHMuCisgKgkJCQkJICBXZSBjb3VsZCBzdWJtaXQgdG8gdGhlIHNldmVyYWwKKyAqCQkJCQkgIGVuZ2luZXMvcmluZ3Mgc2ltdWx0ZW5pb3VzbHkgYXMKKyAqCQkJCQkgICdhdG9taWMnIG9wZXJhdGlvbgorICogXHBhcmFtICAgbnVtYmVyX29mX3JlcXVlc3RzIC0gXGMgW2luXSAgTnVtYmVyIG9mIHN1Ym1pc3Npb24gcmVxdWVzdHMKKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyAqIFxub3RlIEl0IGlzIHJlcXVpcmVkIHRvIHBhc3MgY29ycmVjdCByZXNvdXJjZSBsaXN0IHdpdGggYnVmZmVyIGhhbmRsZXMKKyAqCSB3aGljaCB3aWxsIGJlIGFjY2Vzc2libGUgYnkgY29tbWFuZCBidWZmZXJzIGZyb20gc3VibWlzc2lvbgorICoJIFRoaXMgd2lsbCBhbGxvdyBrZXJuZWwgZHJpdmVyIHRvIGNvcnJlY3RseSBpbXBsZW1lbnQgInBhZ2luZyIuCisgKgkgRmFpbHVyZSB0byBkbyBzbyB3aWxsIGhhdmUgdW5wcmVkaWN0YWJsZSByZXN1bHRzLgorICoKKyAqIFxzYSBhbWRncHVfY29tbWFuZF9idWZmZXJfYWxsb2MoKSwgYW1kZ3B1X2NvbW1hbmRfYnVmZmVyX2ZyZWUoKSwKKyAqICAgICBhbWRncHVfY3NfcXVlcnlfZmVuY2Vfc3RhdHVzKCkKKyAqCisqLworaW50IGFtZGdwdV9jc19zdWJtaXQoYW1kZ3B1X2NvbnRleHRfaGFuZGxlIGNvbnRleHQsCisJCSAgICAgdWludDY0X3QgZmxhZ3MsCisJCSAgICAgc3RydWN0IGFtZGdwdV9jc19yZXF1ZXN0ICppYnNfcmVxdWVzdCwKKwkJICAgICB1aW50MzJfdCBudW1iZXJfb2ZfcmVxdWVzdHMpOworCisvKioKKyAqICBRdWVyeSBzdGF0dXMgb2YgQ29tbWFuZCBCdWZmZXIgU3VibWlzc2lvbgorICoKKyAqIFxwYXJhbSAgIGZlbmNlICAgLSBcYyBbaW5dIFN0cnVjdHVyZSBkZXNjcmliaW5nIGZlbmNlIHRvIHF1ZXJ5CisgKiBccGFyYW0gICB0aW1lb3V0X25zIC0gXGMgW2luXSBUaW1lb3V0IHZhbHVlIHRvIHdhaXQKKyAqIFxwYXJhbSAgIGZsYWdzICAgLSBcYyBbaW5dIEZsYWdzIGZvciB0aGUgcXVlcnkKKyAqIFxwYXJhbSAgIGV4cGlyZWQgLSBcYyBbb3V0XSBJZiBmZW5jZSBleHBpcmVkIG9yIG5vdC5cbgorICoJCQkJMCAg4oCTIGlmIGZlbmNlIGlzIG5vdCBleHBpcmVkXG4KKyAqCQkJCSEwIC0gb3RoZXJ3aXNlCisgKgorICogXHJldHVybiAgIDAgb24gc3VjY2Vzc1xuCisgKiAgICAgICAgICA8MCAtIE5lZ2F0aXZlIFBPU0lYIEVycm9yIGNvZGUKKyAqCisgKiBcbm90ZSBJZiBVTUQgd2FudHMgb25seSB0byBjaGVjayBvcGVyYXRpb24gc3RhdHVzIGFuZCByZXR1cm5lZCBpbW1lZGlhdGVseQorICoJIHRoZW4gdGltZW91dCB2YWx1ZSBhcyAwIG11c3QgYmUgcGFzc2VkLiBJbiB0aGlzIGNhc2Ugc3VjY2VzcyB3aWxsIGJlCisgKgkgcmV0dXJuZWQgaW4gdGhlIGNhc2UgaWYgc3VibWlzc2lvbiB3YXMgY29tcGxldGVkIG9yIHRpbWVvdXQgZXJyb3IKKyAqCSBjb2RlLgorICoKKyAqIFxzYSBhbWRncHVfY3Nfc3VibWl0KCkKKyovCitpbnQgYW1kZ3B1X2NzX3F1ZXJ5X2ZlbmNlX3N0YXR1cyhzdHJ1Y3QgYW1kZ3B1X2NzX2ZlbmNlICpmZW5jZSwKKwkJCQkgdWludDY0X3QgdGltZW91dF9ucywKKwkJCQkgdWludDY0X3QgZmxhZ3MsCisJCQkJIHVpbnQzMl90ICpleHBpcmVkKTsKKworLyoqCisgKiAgV2FpdCBmb3IgbXVsdGlwbGUgZmVuY2VzCisgKgorICogXHBhcmFtICAgZmVuY2VzICAgICAgLSBcYyBbaW5dIFRoZSBmZW5jZSBhcnJheSB0byB3YWl0CisgKiBccGFyYW0gICBmZW5jZV9jb3VudCAtIFxjIFtpbl0gVGhlIGZlbmNlIGNvdW50CisgKiBccGFyYW0gICB3YWl0X2FsbCAgICAtIFxjIFtpbl0gSWYgdHJ1ZSwgd2FpdCBhbGwgZmVuY2VzIHRvIGJlIHNpZ25hbGVkLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSwgd2FpdCBhdCBsZWFzdCBvbmUgZmVuY2UKKyAqIFxwYXJhbSAgIHRpbWVvdXRfbnMgIC0gXGMgW2luXSBUaGUgdGltZW91dCB0byB3YWl0LCBpbiBuYW5vc2Vjb25kcworICogXHBhcmFtICAgc3RhdHVzICAgICAgLSBcYyBbb3V0XSAnMScgZm9yIHNpZ25hbGVkLCAnMCcgZm9yIHRpbWVvdXQKKyAqIFxwYXJhbSAgIGZpcnN0ICAgICAgIC0gXGMgW291dF0gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzaWduYWxlZCBmZW5jZSBmcm9tIEBmZW5jZXMKKyAqCisgKiBccmV0dXJuICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyAqIFxub3RlICAgIEN1cnJlbnRseSBpdCBzdXBwb3J0cyBvbmx5IG9uZSBhbWRncHVfZGV2aWNlLiBBbGwgZmVuY2VzIGNvbWUgZnJvbQorICogICAgICAgICAgdGhlIHNhbWUgYW1kZ3B1X2RldmljZSB3aXRoIHRoZSBzYW1lIGZkLgorKi8KK2ludCBhbWRncHVfY3Nfd2FpdF9mZW5jZXMoc3RydWN0IGFtZGdwdV9jc19mZW5jZSAqZmVuY2VzLAorCQkJICB1aW50MzJfdCBmZW5jZV9jb3VudCwKKwkJCSAgYm9vbCB3YWl0X2FsbCwKKwkJCSAgdWludDY0X3QgdGltZW91dF9ucywKKwkJCSAgdWludDMyX3QgKnN0YXR1cywgdWludDMyX3QgKmZpcnN0KTsKKworLyoKKyAqIFF1ZXJ5IC8gSW5mbyBBUEkKKyAqCisqLworCisvKioKKyAqIFF1ZXJ5IGFsbG9jYXRpb24gc2l6ZSBhbGlnbm1lbnRzCisgKgorICogVU1EIHNob3VsZCBxdWVyeSBpbmZvcm1hdGlvbiBhYm91dCBHUFUgVk0gTUMgc2l6ZSBhbGlnbm1lbnRzIHJlcXVpcmVtZW50cworICogdG8gYmUgYWJsZSBjb3JyZWN0bHkgY2hvb3NlIHJlcXVpcmVkIGFsbG9jYXRpb24gc2l6ZSBhbmQgaW1wbGVtZW50CisgKiBpbnRlcm5hbCBvcHRpbWl6YXRpb24gaWYgbmVlZGVkLgorICoKKyAqIFxwYXJhbSAgIGRldiAgLSBcYyBbaW5dIERldmljZSBoYW5kbGUuIFNlZSAjYW1kZ3B1X2RldmljZV9pbml0aWFsaXplKCkKKyAqIFxwYXJhbSAgIGluZm8gLSBcYyBbb3V0XSBQb2ludGVyIHRvIHN0cnVjdHVyZSB0byBnZXQgc2l6ZSBhbGlnbm1lbnQKKyAqCQkJICByZXF1aXJlbWVudHMKKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyovCitpbnQgYW1kZ3B1X3F1ZXJ5X2J1ZmZlcl9zaXplX2FsaWdubWVudChhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXYsCisJCQkJICAgICAgIHN0cnVjdCBhbWRncHVfYnVmZmVyX3NpemVfYWxpZ25tZW50cworCQkJCQkJKmluZm8pOworCisvKioKKyAqIFF1ZXJ5IGZpcm13YXJlIHZlcnNpb25zCisgKgorICogXHBhcmFtICAgZGV2CSAgICAgICAgLSBcYyBbaW5dIERldmljZSBoYW5kbGUuIFNlZSAjYW1kZ3B1X2RldmljZV9pbml0aWFsaXplKCkKKyAqIFxwYXJhbSAgIGZ3X3R5cGUgICAgIC0gXGMgW2luXSBBTURHUFVfSU5GT19GV18qCisgKiBccGFyYW0gICBpcF9pbnN0YW5jZSAtIFxjIFtpbl0gSW5kZXggb2YgdGhlIElQIGJsb2NrIG9mIHRoZSBzYW1lIHR5cGUuCisgKiBccGFyYW0gICBpbmRleCAgICAgICAtIFxjIFtpbl0gSW5kZXggb2YgdGhlIGVuZ2luZS4gKGZvciBTRE1BIGFuZCBNRUMpCisgKiBccGFyYW0gICB2ZXJzaW9uICAgICAtIFxjIFtvdXRdIFBvaW50ZXIgdG8gdG8gdGhlICJ2ZXJzaW9uIiByZXR1cm4gdmFsdWUKKyAqIFxwYXJhbSAgIGZlYXR1cmUgICAgIC0gXGMgW291dF0gUG9pbnRlciB0byB0byB0aGUgImZlYXR1cmUiIHJldHVybiB2YWx1ZQorICoKKyAqIFxyZXR1cm4gICAwIG9uIHN1Y2Nlc3NcbgorICogICAgICAgICAgPDAgLSBOZWdhdGl2ZSBQT1NJWCBFcnJvciBjb2RlCisgKgorKi8KK2ludCBhbWRncHVfcXVlcnlfZmlybXdhcmVfdmVyc2lvbihhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXYsIHVuc2lnbmVkIGZ3X3R5cGUsCisJCQkJICB1bnNpZ25lZCBpcF9pbnN0YW5jZSwgdW5zaWduZWQgaW5kZXgsCisJCQkJICB1aW50MzJfdCAqdmVyc2lvbiwgdWludDMyX3QgKmZlYXR1cmUpOworCisvKioKKyAqIFF1ZXJ5IHRoZSBudW1iZXIgb2YgSFcgSVAgaW5zdGFuY2VzIG9mIGEgY2VydGFpbiB0eXBlLgorICoKKyAqIFxwYXJhbSAgIGRldiAgICAgIC0gXGMgW2luXSBEZXZpY2UgaGFuZGxlLiBTZWUgI2FtZGdwdV9kZXZpY2VfaW5pdGlhbGl6ZSgpCisgKiBccGFyYW0gICB0eXBlICAgICAtIFxjIFtpbl0gSGFyZHdhcmUgSVAgYmxvY2sgdHlwZSA9IEFNREdQVV9IV19JUF8qCisgKiBccGFyYW0gICBjb3VudCAgICAtIFxjIFtvdXRdIFBvaW50ZXIgdG8gc3RydWN0dXJlIHRvIGdldCBpbmZvcm1hdGlvbgorICoKKyAqIFxyZXR1cm4gICAwIG9uIHN1Y2Nlc3NcbgorICogICAgICAgICAgPDAgLSBOZWdhdGl2ZSBQT1NJWCBFcnJvciBjb2RlCisqLworaW50IGFtZGdwdV9xdWVyeV9od19pcF9jb3VudChhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXYsIHVuc2lnbmVkIHR5cGUsCisJCQkgICAgIHVpbnQzMl90ICpjb3VudCk7CisKKy8qKgorICogUXVlcnkgZW5naW5lIGluZm9ybWF0aW9uCisgKgorICogVGhpcyBxdWVyeSBhbGxvd3MgVU1EIHRvIHF1ZXJ5IGluZm9ybWF0aW9uIGRpZmZlcmVudCBlbmdpbmVzIGFuZCB0aGVpcgorICogY2FwYWJpbGl0aWVzLgorICoKKyAqIFxwYXJhbSAgIGRldiAgICAgICAgIC0gXGMgW2luXSBEZXZpY2UgaGFuZGxlLiBTZWUgI2FtZGdwdV9kZXZpY2VfaW5pdGlhbGl6ZSgpCisgKiBccGFyYW0gICB0eXBlICAgICAgICAtIFxjIFtpbl0gSGFyZHdhcmUgSVAgYmxvY2sgdHlwZSA9IEFNREdQVV9IV19JUF8qCisgKiBccGFyYW0gICBpcF9pbnN0YW5jZSAtIFxjIFtpbl0gSW5kZXggb2YgdGhlIElQIGJsb2NrIG9mIHRoZSBzYW1lIHR5cGUuCisgKiBccGFyYW0gICBpbmZvICAgICAgICAtIFxjIFtvdXRdIFBvaW50ZXIgdG8gc3RydWN0dXJlIHRvIGdldCBpbmZvcm1hdGlvbgorICoKKyAqIFxyZXR1cm4gICAwIG9uIHN1Y2Nlc3NcbgorICogICAgICAgICAgPDAgLSBOZWdhdGl2ZSBQT1NJWCBFcnJvciBjb2RlCisqLworaW50IGFtZGdwdV9xdWVyeV9od19pcF9pbmZvKGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldiwgdW5zaWduZWQgdHlwZSwKKwkJCSAgICB1bnNpZ25lZCBpcF9pbnN0YW5jZSwKKwkJCSAgICBzdHJ1Y3QgZHJtX2FtZGdwdV9pbmZvX2h3X2lwICppbmZvKTsKKworLyoqCisgKiBRdWVyeSBoZWFwIGluZm9ybWF0aW9uCisgKgorICogVGhpcyBxdWVyeSBhbGxvd3MgVU1EIHRvIHF1ZXJ5IHBvdGVudGlhbGx5IGF2YWlsYWJsZSBtZW1vcnkgcmVzb3VyY2VzIGFuZAorICogYWRqdXN0IHRoZWlyIGxvZ2ljIGlmIG5lY2Vzc2FyeS4KKyAqCisgKiBccGFyYW0gICBkZXYgIC0gXGMgW2luXSBEZXZpY2UgaGFuZGxlLiBTZWUgI2FtZGdwdV9kZXZpY2VfaW5pdGlhbGl6ZSgpCisgKiBccGFyYW0gICBoZWFwIC0gXGMgW2luXSBIZWFwIHR5cGUKKyAqIFxwYXJhbSAgIGluZm8gLSBcYyBbaW5dIFBvaW50ZXIgdG8gc3RydWN0dXJlIHRvIGdldCBuZWVkZWQgaW5mb3JtYXRpb24KKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyovCitpbnQgYW1kZ3B1X3F1ZXJ5X2hlYXBfaW5mbyhhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXYsIHVpbnQzMl90IGhlYXAsCisJCQkgICB1aW50MzJfdCBmbGFncywgc3RydWN0IGFtZGdwdV9oZWFwX2luZm8gKmluZm8pOworCisvKioKKyAqIEdldCB0aGUgQ1JUQyBJRCBmcm9tIHRoZSBtb2RlIG9iamVjdCBJRAorICoKKyAqIFxwYXJhbSAgIGRldiAgICAtIFxjIFtpbl0gRGV2aWNlIGhhbmRsZS4gU2VlICNhbWRncHVfZGV2aWNlX2luaXRpYWxpemUoKQorICogXHBhcmFtICAgaWQgICAgIC0gXGMgW2luXSBNb2RlIG9iamVjdCBJRAorICogXHBhcmFtICAgcmVzdWx0IC0gXGMgW2luXSBQb2ludGVyIHRvIHRoZSBDUlRDIElECisgKgorICogXHJldHVybiAgIDAgb24gc3VjY2Vzc1xuCisgKiAgICAgICAgICA8MCAtIE5lZ2F0aXZlIFBPU0lYIEVycm9yIGNvZGUKKyAqCisqLworaW50IGFtZGdwdV9xdWVyeV9jcnRjX2Zyb21faWQoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LCB1bnNpZ25lZCBpZCwKKwkJCSAgICAgIGludDMyX3QgKnJlc3VsdCk7CisKKy8qKgorICogUXVlcnkgR1BVIEgvdyBJbmZvCisgKgorICogUXVlcnkgaGFyZHdhcmUgc3BlY2lmaWMgaW5mb3JtYXRpb24KKyAqCisgKiBccGFyYW0gICBkZXYgIC0gXGMgW2luXSBEZXZpY2UgaGFuZGxlLiBTZWUgI2FtZGdwdV9kZXZpY2VfaW5pdGlhbGl6ZSgpCisgKiBccGFyYW0gICBoZWFwIC0gXGMgW2luXSBIZWFwIHR5cGUKKyAqIFxwYXJhbSAgIGluZm8gLSBcYyBbaW5dIFBvaW50ZXIgdG8gc3RydWN0dXJlIHRvIGdldCBuZWVkZWQgaW5mb3JtYXRpb24KKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyovCitpbnQgYW1kZ3B1X3F1ZXJ5X2dwdV9pbmZvKGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldiwKKwkJCSAgIHN0cnVjdCBhbWRncHVfZ3B1X2luZm8gKmluZm8pOworCisvKioKKyAqIFF1ZXJ5IGhhcmR3YXJlIG9yIGRyaXZlciBpbmZvcm1hdGlvbi4KKyAqCisgKiBUaGUgcmV0dXJuIHNpemUgaXMgcXVlcnktc3BlY2lmaWMgYW5kIGRlcGVuZHMgb24gdGhlICJpbmZvX2lkIiBwYXJhbWV0ZXIuCisgKiBObyBtb3JlIHRoYW4gInNpemUiIGJ5dGVzIGlzIHJldHVybmVkLgorICoKKyAqIFxwYXJhbSAgIGRldiAgICAgLSBcYyBbaW5dIERldmljZSBoYW5kbGUuIFNlZSAjYW1kZ3B1X2RldmljZV9pbml0aWFsaXplKCkKKyAqIFxwYXJhbSAgIGluZm9faWQgLSBcYyBbaW5dIEFNREdQVV9JTkZPXyoKKyAqIFxwYXJhbSAgIHNpemUgICAgLSBcYyBbaW5dIFNpemUgb2YgdGhlIHJldHVybmVkIHZhbHVlLgorICogXHBhcmFtICAgdmFsdWUgICAtIFxjIFtvdXRdIFBvaW50ZXIgdG8gdGhlIHJldHVybiB2YWx1ZS4KKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggZXJyb3IgY29kZQorICoKKyovCitpbnQgYW1kZ3B1X3F1ZXJ5X2luZm8oYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LCB1bnNpZ25lZCBpbmZvX2lkLAorCQkgICAgICB1bnNpZ25lZCBzaXplLCB2b2lkICp2YWx1ZSk7CisKKy8qKgorICogUXVlcnkgaW5mb3JtYXRpb24gYWJvdXQgR0RTCisgKgorICogXHBhcmFtICAgZGV2CSAgICAgLSBcYyBbaW5dIERldmljZSBoYW5kbGUuIFNlZSAjYW1kZ3B1X2RldmljZV9pbml0aWFsaXplKCkKKyAqIFxwYXJhbSAgIGdkc19pbmZvIC0gXGMgW291dF0gUG9pbnRlciB0byBzdHJ1Y3R1cmUgdG8gZ2V0IEdEUyBpbmZvcm1hdGlvbgorICoKKyAqIFxyZXR1cm4gICAwIG9uIHN1Y2Nlc3NcbgorICogICAgICAgICAgPDAgLSBOZWdhdGl2ZSBQT1NJWCBFcnJvciBjb2RlCisgKgorKi8KK2ludCBhbWRncHVfcXVlcnlfZ2RzX2luZm8oYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LAorCQkJc3RydWN0IGFtZGdwdV9nZHNfcmVzb3VyY2VfaW5mbyAqZ2RzX2luZm8pOworCisvKioKKyAqIFF1ZXJ5IGluZm9ybWF0aW9uIGFib3V0IHNlbnNvci4KKyAqCisgKiBUaGUgcmV0dXJuIHNpemUgaXMgcXVlcnktc3BlY2lmaWMgYW5kIGRlcGVuZHMgb24gdGhlICJzZW5zb3JfdHlwZSIKKyAqIHBhcmFtZXRlci4gTm8gbW9yZSB0aGFuICJzaXplIiBieXRlcyBpcyByZXR1cm5lZC4KKyAqCisgKiBccGFyYW0gICBkZXYgICAgICAgICAtIFxjIFtpbl0gRGV2aWNlIGhhbmRsZS4gU2VlICNhbWRncHVfZGV2aWNlX2luaXRpYWxpemUoKQorICogXHBhcmFtICAgc2Vuc29yX3R5cGUgLSBcYyBbaW5dIEFNREdQVV9JTkZPX1NFTlNPUl8qCisgKiBccGFyYW0gICBzaXplICAgICAgICAtIFxjIFtpbl0gU2l6ZSBvZiB0aGUgcmV0dXJuZWQgdmFsdWUuCisgKiBccGFyYW0gICB2YWx1ZSAgICAgICAtIFxjIFtvdXRdIFBvaW50ZXIgdG8gdGhlIHJldHVybiB2YWx1ZS4KKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyovCitpbnQgYW1kZ3B1X3F1ZXJ5X3NlbnNvcl9pbmZvKGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldiwgdW5zaWduZWQgc2Vuc29yX3R5cGUsCisJCQkgICAgIHVuc2lnbmVkIHNpemUsIHZvaWQgKnZhbHVlKTsKKworLyoqCisgKiBSZWFkIGEgc2V0IG9mIGNvbnNlY3V0aXZlIG1lbW9yeS1tYXBwZWQgcmVnaXN0ZXJzLgorICogTm90IGFsbCByZWdpc3RlcnMgYXJlIGFsbG93ZWQgdG8gYmUgcmVhZCBieSB1c2Vyc3BhY2UuCisgKgorICogXHBhcmFtICAgZGV2ICAgICAgICAgIC0gXGMgW2luXSBEZXZpY2UgaGFuZGxlLiBTZWUgI2FtZGdwdV9kZXZpY2VfaW5pdGlhbGl6ZSgKKyAqIFxwYXJhbSAgIGR3b3JkX29mZnNldCAtIFxjIFtpbl0gUmVnaXN0ZXIgb2Zmc2V0IGluIGR3b3JkcworICogXHBhcmFtICAgY291bnQgICAgICAgIC0gXGMgW2luXSBUaGUgbnVtYmVyIG9mIHJlZ2lzdGVycyB0byByZWFkIHN0YXJ0aW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIG9mZnNldAorICogXHBhcmFtICAgaW5zdGFuY2UgICAgIC0gXGMgW2luXSBHUkJNX0dGWF9JTkRFWCBzZWxlY3Rvci4gSXQgbWF5IGhhdmUgb3RoZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcy4gU2V0IGl0IHRvIDB4ZmZmZmZmZmYgaWYgdW5zdXJlLgorICogXHBhcmFtICAgZmxhZ3MgICAgICAgIC0gXGMgW2luXSBGbGFncyB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCisgKiBccGFyYW0gICB2YWx1ZXMgICAgICAgLSBcYyBbb3V0XSBUaGUgcG9pbnRlciB0byByZXR1cm4gdmFsdWVzLgorICoKKyAqIFxyZXR1cm4gICAwIG9uIHN1Y2Nlc3NcbgorICogICAgICAgICAgPDAgLSBOZWdhdGl2ZSBQT1NJWCBlcnJvciBjb2RlCisgKgorKi8KK2ludCBhbWRncHVfcmVhZF9tbV9yZWdpc3RlcnMoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LCB1bnNpZ25lZCBkd29yZF9vZmZzZXQsCisJCQkgICAgIHVuc2lnbmVkIGNvdW50LCB1aW50MzJfdCBpbnN0YW5jZSwgdWludDMyX3QgZmxhZ3MsCisJCQkgICAgIHVpbnQzMl90ICp2YWx1ZXMpOworCisvKioKKyAqIEZsYWcgdG8gcmVxdWVzdCBWQSBhZGRyZXNzIHJhbmdlIGluIHRoZSAzMmJpdCBhZGRyZXNzIHNwYWNlCisqLworI2RlZmluZSBBTURHUFVfVkFfUkFOR0VfMzJfQklUCQkweDEKKworLyoqCisgKiBBbGxvY2F0ZSB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UKKyAqCisgKiBccGFyYW0gZGV2IC0gW2luXSBEZXZpY2UgaGFuZGxlLiBTZWUgI2FtZGdwdV9kZXZpY2VfaW5pdGlhbGl6ZSgpCisgKiBccGFyYW0gdmFfcmFuZ2VfdHlwZSAtIFxjIFtpbl0gVHlwZSBvZiBNQyB2YSByYW5nZSBmcm9tIHdoaWNoIHRvIGFsbG9jYXRlCisgKiBccGFyYW0gc2l6ZSAtIFxjIFtpbl0gU2l6ZSBvZiByYW5nZS4gU2l6ZSBtdXN0IGJlIGNvcnJlY3RseSogYWxpZ25lZC4KKyAqIEl0IGlzIGNsaWVudCByZXNwb25zaWJpbGl0eSB0byBjb3JyZWN0bHkgYWxpZ25lZCBzaXplIGJhc2VkIG9uIHRoZSBmdXR1cmUKKyAqIHVzYWdlIG9mIGFsbG9jYXRlZCByYW5nZS4KKyAqIFxwYXJhbSB2YV9iYXNlX2FsaWdubWVudCAtIFxjIFtpbl0gT3ZlcndyaXRlIGJhc2UgYWRkcmVzcyBhbGlnbm1lbnQKKyAqIHJlcXVpcmVtZW50IGZvciBHUFUgVk0gTUMgdmlydHVhbAorICogYWRkcmVzcyBhc3NpZ25tZW50LiBNdXN0IGJlIG11bHRpcGxlIG9mIHNpemUgYWxpZ25tZW50cyByZWNlaXZlZCBhcworICogJ2FtZGdwdV9idWZmZXJfc2l6ZV9hbGlnbm1lbnRzJy4KKyAqIElmIDAgdXNlIHRoZSBkZWZhdWx0IG9uZS4KKyAqIFxwYXJhbSB2YV9iYXNlX3JlcXVpcmVkIC0gXGMgW2luXSBTcGVjaWZpZWQgcmVxdWlyZWQgdmEgYmFzZSBhZGRyZXNzLgorICogSWYgMCB0aGVuIGxpYnJhcnkgY2hvb3NlIGF2YWlsYWJsZSBvbmUuCisgKiBJZiAhMCB2YWx1ZSB3aWxsIGJlIHBhc3NlZCBhbmQgdGhvc2UgdmFsdWUgYWxyZWFkeSAiaW4gdXNlIiB0aGVuCisgKiBjb3JyZXNwb25kaW5nIGVycm9yIHN0YXR1cyB3aWxsIGJlIHJldHVybmVkLgorICogXHBhcmFtIHZhX2Jhc2VfYWxsb2NhdGVkIC0gXGMgW291dF0gT24gcmV0dXJuOiBBbGxvY2F0ZWQgVkEgYmFzZSB0byBiZSB1c2VkCisgKiBieSBjbGllbnQuCisgKiBccGFyYW0gdmFfcmFuZ2VfaGFuZGxlIC0gXGMgW291dF0gT24gcmV0dXJuOiBIYW5kbGUgYXNzaWduZWQgdG8gYWxsb2NhdGlvbgorICogXHBhcmFtIGZsYWdzIC0gXGMgW2luXSBmbGFncyBmb3Igc3BlY2lhbCBWQSByYW5nZQorICoKKyAqIFxyZXR1cm4gMCBvbiBzdWNjZXNzXG4KKyAqID4wIC0gQU1EIHNwZWNpZmljIGVycm9yIGNvZGVcbgorICogPDAgLSBOZWdhdGl2ZSBQT1NJWCBFcnJvciBjb2RlCisgKgorICogXG5vdGVzIFxuCisgKiBJdCBpcyBjbGllbnQgcmVzcG9uc2liaWxpdHkgdG8gY29ycmVjdGx5IGhhbmRsZSBWQSBhc3NpZ25tZW50cyBhbmQgdXNhZ2UuCisgKiBOZWl0aGVyIGtlcm5lbCBkcml2ZXIgbm9yIGxpYmRybV9hbWRwZ3UgYXJlIGFibGUgdG8gcHJldmVudCBhbmQKKyAqIGRldGVjdCB3cm9uZyB2YSBhc3NpZ25lbW50LgorICoKKyAqIEl0IGlzIGNsaWVudCByZXNwb25zaWJpbGl0eSB0byBjb3JyZWN0bHkgaGFuZGxlIG11bHRpLUdQVSBjYXNlcyBhbmQgdG8gcGFzcworICogdGhlIGNvcnJlc3BvbmRpbmcgYXJyYXlzIG9mIGFsbCBkZXZpY2VzIGhhbmRsZXMgd2hlcmUgY29ycmVzcG9uZGluZyBWQSB3aWxsCisgKiBiZSB1c2VkLgorICoKKyovCitpbnQgYW1kZ3B1X3ZhX3JhbmdlX2FsbG9jKGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldiwKKwkJCSAgIGVudW0gYW1kZ3B1X2dwdV92YV9yYW5nZSB2YV9yYW5nZV90eXBlLAorCQkJICAgdWludDY0X3Qgc2l6ZSwKKwkJCSAgIHVpbnQ2NF90IHZhX2Jhc2VfYWxpZ25tZW50LAorCQkJICAgdWludDY0X3QgdmFfYmFzZV9yZXF1aXJlZCwKKwkJCSAgIHVpbnQ2NF90ICp2YV9iYXNlX2FsbG9jYXRlZCwKKwkJCSAgIGFtZGdwdV92YV9oYW5kbGUgKnZhX3JhbmdlX2hhbmRsZSwKKwkJCSAgIHVpbnQ2NF90IGZsYWdzKTsKKworLyoqCisgKiBGcmVlIHByZXZpb3VzbHkgYWxsb2NhdGVkIHZpcnR1YWwgYWRkcmVzcyByYW5nZQorICoKKyAqCisgKiBccGFyYW0gdmFfcmFuZ2VfaGFuZGxlIC0gXGMgW2luXSBIYW5kbGUgYXNzaWduZWQgdG8gVkEgYWxsb2NhdGlvbgorICoKKyAqIFxyZXR1cm4gMCBvbiBzdWNjZXNzXG4KKyAqID4wIC0gQU1EIHNwZWNpZmljIGVycm9yIGNvZGVcbgorICogPDAgLSBOZWdhdGl2ZSBQT1NJWCBFcnJvciBjb2RlCisgKgorKi8KK2ludCBhbWRncHVfdmFfcmFuZ2VfZnJlZShhbWRncHVfdmFfaGFuZGxlIHZhX3JhbmdlX2hhbmRsZSk7CisKKy8qKgorKiBRdWVyeSB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UKKyoKKyogVU1EIGNhbiBxdWVyeSBHUFUgVk0gcmFuZ2Ugc3VwcG9ydGVkIGJ5IGVhY2ggZGV2aWNlCisqIHRvIGluaXRpYWxpemUgaXRzIG93biBWQU0gYWNjb3JkaW5nbHkuCisqCisqIFxwYXJhbSAgIGRldiAgICAtIFtpbl0gRGV2aWNlIGhhbmRsZS4gU2VlICNhbWRncHVfZGV2aWNlX2luaXRpYWxpemUoKQorKiBccGFyYW0gICB0eXBlICAgLSBcYyBbaW5dIFR5cGUgb2YgdmlydHVhbCBhZGRyZXNzIHJhbmdlCisqIFxwYXJhbSAgIG9mZnNldCAtIFxjIFtvdXRdIFN0YXJ0IG9mZnNldCBvZiB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UKKyogXHBhcmFtICAgc2l6ZSAgIC0gXGMgW291dF0gU2l6ZSBvZiB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UKKyoKKyogXHJldHVybiAgIDAgb24gc3VjY2Vzc1xuCisqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorKgorKi8KKworaW50IGFtZGdwdV92YV9yYW5nZV9xdWVyeShhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXYsCisJCQkgIGVudW0gYW1kZ3B1X2dwdV92YV9yYW5nZSB0eXBlLAorCQkJICB1aW50NjRfdCAqc3RhcnQsCisJCQkgIHVpbnQ2NF90ICplbmQpOworCisvKioKKyAqICBWQSBtYXBwaW5nL3VubWFwcGluZyBmb3IgdGhlIGJ1ZmZlciBvYmplY3QKKyAqCisgKiBccGFyYW0gIGJvCQktIFxjIFtpbl0gQk8gaGFuZGxlCisgKiBccGFyYW0gIG9mZnNldAktIFxjIFtpbl0gU3RhcnQgb2Zmc2V0IHRvIG1hcAorICogXHBhcmFtICBzaXplCQktIFxjIFtpbl0gU2l6ZSB0byBtYXAKKyAqIFxwYXJhbSAgYWRkcgkJLSBcYyBbaW5dIFN0YXJ0IHZpcnR1YWwgYWRkcmVzcy4KKyAqIFxwYXJhbSAgZmxhZ3MJLSBcYyBbaW5dIFN1cHBvcnRlZCBmbGFncyBmb3IgbWFwcGluZy91bm1hcHBpbmcKKyAqIFxwYXJhbSAgb3BzCQktIFxjIFtpbl0gQU1ER1BVX1ZBX09QX01BUCBvciBBTURHUFVfVkFfT1BfVU5NQVAKKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyovCisKK2ludCBhbWRncHVfYm9fdmFfb3AoYW1kZ3B1X2JvX2hhbmRsZSBibywKKwkJICAgIHVpbnQ2NF90IG9mZnNldCwKKwkJICAgIHVpbnQ2NF90IHNpemUsCisJCSAgICB1aW50NjRfdCBhZGRyLAorCQkgICAgdWludDY0X3QgZmxhZ3MsCisJCSAgICB1aW50MzJfdCBvcHMpOworCisvKioKKyAqICBWQSBtYXBwaW5nL3VubWFwcGluZyBmb3IgYSBidWZmZXIgb2JqZWN0IG9yIFBSVCByZWdpb24uCisgKgorICogVGhpcyBpcyBub3QgYSBzaW1wbGUgZHJvcC1pbiBleHRlbnNpb24gZm9yIGFtZGdwdV9ib192YV9vcDsgaW5zdGVhZCwgYWxsCisgKiBwYXJhbWV0ZXJzIGFyZSB0cmVhdGVkICJyYXciLCBpLmUuIHNpemUgaXMgbm90IGF1dG9tYXRpY2FsbHkgYWxpZ25lZCwgYW5kCisgKiBhbGwgZmxhZ3MgbXVzdCBiZSBzcGVjaWZpZWQgZXhwbGljaXRseS4KKyAqCisgKiBccGFyYW0gIGRldgkJLSBcYyBbaW5dIGRldmljZSBoYW5kbGUKKyAqIFxwYXJhbSAgYm8JCS0gXGMgW2luXSBCTyBoYW5kbGUgKG1heSBiZSBOVUxMKQorICogXHBhcmFtICBvZmZzZXQJLSBcYyBbaW5dIFN0YXJ0IG9mZnNldCB0byBtYXAKKyAqIFxwYXJhbSAgc2l6ZQkJLSBcYyBbaW5dIFNpemUgdG8gbWFwCisgKiBccGFyYW0gIGFkZHIJCS0gXGMgW2luXSBTdGFydCB2aXJ0dWFsIGFkZHJlc3MuCisgKiBccGFyYW0gIGZsYWdzCS0gXGMgW2luXSBTdXBwb3J0ZWQgZmxhZ3MgZm9yIG1hcHBpbmcvdW5tYXBwaW5nCisgKiBccGFyYW0gIG9wcwkJLSBcYyBbaW5dIEFNREdQVV9WQV9PUF9NQVAgb3IgQU1ER1BVX1ZBX09QX1VOTUFQCisgKgorICogXHJldHVybiAgIDAgb24gc3VjY2Vzc1xuCisgKiAgICAgICAgICA8MCAtIE5lZ2F0aXZlIFBPU0lYIEVycm9yIGNvZGUKKyAqCisqLworCitpbnQgYW1kZ3B1X2JvX3ZhX29wX3JhdyhhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXYsCisJCQlhbWRncHVfYm9faGFuZGxlIGJvLAorCQkJdWludDY0X3Qgb2Zmc2V0LAorCQkJdWludDY0X3Qgc2l6ZSwKKwkJCXVpbnQ2NF90IGFkZHIsCisJCQl1aW50NjRfdCBmbGFncywKKwkJCXVpbnQzMl90IG9wcyk7CisKKy8qKgorICogIGNyZWF0ZSBzZW1hcGhvcmUKKyAqCisgKiBccGFyYW0gICBzZW0JICAgLSBcYyBbb3V0XSBzZW1hcGhvcmUgaGFuZGxlCisgKgorICogXHJldHVybiAgIDAgb24gc3VjY2Vzc1xuCisgKiAgICAgICAgICA8MCAtIE5lZ2F0aXZlIFBPU0lYIEVycm9yIGNvZGUKKyAqCisqLworaW50IGFtZGdwdV9jc19jcmVhdGVfc2VtYXBob3JlKGFtZGdwdV9zZW1hcGhvcmVfaGFuZGxlICpzZW0pOworCisvKioKKyAqICBzaWduYWwgc2VtYXBob3JlCisgKgorICogXHBhcmFtICAgY29udGV4dCAgICAgICAgLSBcYyBbaW5dIEdQVSBDb250ZXh0CisgKiBccGFyYW0gICBpcF90eXBlICAgICAgICAtIFxjIFtpbl0gSGFyZHdhcmUgSVAgYmxvY2sgdHlwZSA9IEFNREdQVV9IV19JUF8qCisgKiBccGFyYW0gICBpcF9pbnN0YW5jZSAgICAtIFxjIFtpbl0gSW5kZXggb2YgdGhlIElQIGJsb2NrIG9mIHRoZSBzYW1lIHR5cGUKKyAqIFxwYXJhbSAgIHJpbmcgICAgICAgICAgIC0gXGMgW2luXSBTcGVjaWZ5IHJpbmcgaW5kZXggb2YgdGhlIElQCisgKiBccGFyYW0gICBzZW0JICAgICAgICAgICAtIFxjIFtpbl0gc2VtYXBob3JlIGhhbmRsZQorICoKKyAqIFxyZXR1cm4gICAwIG9uIHN1Y2Nlc3NcbgorICogICAgICAgICAgPDAgLSBOZWdhdGl2ZSBQT1NJWCBFcnJvciBjb2RlCisgKgorKi8KK2ludCBhbWRncHVfY3Nfc2lnbmFsX3NlbWFwaG9yZShhbWRncHVfY29udGV4dF9oYW5kbGUgY3R4LAorCQkJICAgICAgIHVpbnQzMl90IGlwX3R5cGUsCisJCQkgICAgICAgdWludDMyX3QgaXBfaW5zdGFuY2UsCisJCQkgICAgICAgdWludDMyX3QgcmluZywKKwkJCSAgICAgICBhbWRncHVfc2VtYXBob3JlX2hhbmRsZSBzZW0pOworCisvKioKKyAqICB3YWl0IHNlbWFwaG9yZQorICoKKyAqIFxwYXJhbSAgIGNvbnRleHQgICAgICAgIC0gXGMgW2luXSBHUFUgQ29udGV4dAorICogXHBhcmFtICAgaXBfdHlwZSAgICAgICAgLSBcYyBbaW5dIEhhcmR3YXJlIElQIGJsb2NrIHR5cGUgPSBBTURHUFVfSFdfSVBfKgorICogXHBhcmFtICAgaXBfaW5zdGFuY2UgICAgLSBcYyBbaW5dIEluZGV4IG9mIHRoZSBJUCBibG9jayBvZiB0aGUgc2FtZSB0eXBlCisgKiBccGFyYW0gICByaW5nICAgICAgICAgICAtIFxjIFtpbl0gU3BlY2lmeSByaW5nIGluZGV4IG9mIHRoZSBJUAorICogXHBhcmFtICAgc2VtCSAgICAgICAgICAgLSBcYyBbaW5dIHNlbWFwaG9yZSBoYW5kbGUKKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyovCitpbnQgYW1kZ3B1X2NzX3dhaXRfc2VtYXBob3JlKGFtZGdwdV9jb250ZXh0X2hhbmRsZSBjdHgsCisJCQkgICAgIHVpbnQzMl90IGlwX3R5cGUsCisJCQkgICAgIHVpbnQzMl90IGlwX2luc3RhbmNlLAorCQkJICAgICB1aW50MzJfdCByaW5nLAorCQkJICAgICBhbWRncHVfc2VtYXBob3JlX2hhbmRsZSBzZW0pOworCisvKioKKyAqICBkZXN0cm95IHNlbWFwaG9yZQorICoKKyAqIFxwYXJhbSAgIHNlbQkgICAgLSBcYyBbaW5dIHNlbWFwaG9yZSBoYW5kbGUKKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyovCitpbnQgYW1kZ3B1X2NzX2Rlc3Ryb3lfc2VtYXBob3JlKGFtZGdwdV9zZW1hcGhvcmVfaGFuZGxlIHNlbSk7CisKKy8qKgorICogIEdldCB0aGUgQVNJQyBtYXJrZXRpbmcgbmFtZQorICoKKyAqIFxwYXJhbSAgIGRldiAgICAgICAgIC0gXGMgW2luXSBEZXZpY2UgaGFuZGxlLiBTZWUgI2FtZGdwdV9kZXZpY2VfaW5pdGlhbGl6ZSgpCisgKgorICogXHJldHVybiAgdGhlIGNvbnN0YW50IHN0cmluZyBvZiB0aGUgbWFya2V0aW5nIG5hbWUKKyAqICAgICAgICAgICJOVUxMIiBtZWFucyB0aGUgQVNJQyBpcyBub3QgZm91bmQKKyovCitjb25zdCBjaGFyICphbWRncHVfZ2V0X21hcmtldGluZ19uYW1lKGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldik7CisKKy8qKgorICogIENyZWF0ZSBrZXJuZWwgc3luYyBvYmplY3QKKyAqCisgKiBccGFyYW0gICBkZXYJICAgICAgLSBcYyBbaW5dICBkZXZpY2UgaGFuZGxlCisgKiBccGFyYW0gICBzeW5jb2JqICAgLSBcYyBbb3V0XSBzeW5jIG9iamVjdCBoYW5kbGUKKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyovCitpbnQgYW1kZ3B1X2NzX2NyZWF0ZV9zeW5jb2JqKGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldiwKKwkJCSAgICAgdWludDMyX3QgKnN5bmNvYmopOworLyoqCisgKiAgRGVzdHJveSBrZXJuZWwgc3luYyBvYmplY3QKKyAqCisgKiBccGFyYW0gICBkZXYJICAgIC0gXGMgW2luXSBkZXZpY2UgaGFuZGxlCisgKiBccGFyYW0gICBzeW5jb2JqIC0gXGMgW2luXSBzeW5jIG9iamVjdCBoYW5kbGUKKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyovCitpbnQgYW1kZ3B1X2NzX2Rlc3Ryb3lfc3luY29iaihhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXYsCisJCQkgICAgICB1aW50MzJfdCBzeW5jb2JqKTsKKworLyoqCisgKiAgV2FpdCBmb3Igb25lIG9yIGFsbCBzeW5jIG9iamVjdHMgdG8gc2lnbmFsLgorICoKKyAqIFxwYXJhbSAgIGRldgkgICAgLSBcYyBbaW5dIHNlbGYtZXhwbGFuYXRvcnkKKyAqIFxwYXJhbSAgIGhhbmRsZXMgLSBcYyBbaW5dIGFycmF5IG9mIHN5bmMgb2JqZWN0IGhhbmRsZXMKKyAqIFxwYXJhbSAgIG51bV9oYW5kbGVzIC0gXGMgW2luXSBzZWxmLWV4cGxhbmF0b3J5CisgKiBccGFyYW0gICB0aW1lb3V0X25zZWMgLSBcYyBbaW5dIHNlbGYtZXhwbGFuYXRvcnkKKyAqIFxwYXJhbSAgIGZsYWdzICAgLSBcYyBbaW5dIGEgYml0bWFzayBvZiBEUk1fU1lOQ09CSl9XQUlUX0ZMQUdTXyoKKyAqIFxwYXJhbSAgIGZpcnN0X3NpZ25hbGVkIC0gXGMgW2luXSBzZWxmLWV4cGxhbmF0b3J5CisgKgorICogXHJldHVybiAgIDAgb24gc3VjY2Vzc1xuCisgKiAgICAgICAgICAtRVRJTUUgLSBUaW1lb3V0CisgKiAgICAgICAgICA8MCAtIE5lZ2F0aXZlIFBPU0lYIEVycm9yIGNvZGUKKyAqCisgKi8KK2ludCBhbWRncHVfY3Nfc3luY29ial93YWl0KGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldiwKKwkJCSAgIHVpbnQzMl90ICpoYW5kbGVzLCB1bnNpZ25lZCBudW1faGFuZGxlcywKKwkJCSAgIGludDY0X3QgdGltZW91dF9uc2VjLCB1bnNpZ25lZCBmbGFncywKKwkJCSAgIHVpbnQzMl90ICpmaXJzdF9zaWduYWxlZCk7CisKKy8qKgorICogIEV4cG9ydCBrZXJuZWwgc3luYyBvYmplY3QgdG8gc2hhcmVhYmxlIGZkLgorICoKKyAqIFxwYXJhbSAgIGRldgkgICAgICAgLSBcYyBbaW5dIGRldmljZSBoYW5kbGUKKyAqIFxwYXJhbSAgIHN5bmNvYmogICAgLSBcYyBbaW5dIHN5bmMgb2JqZWN0IGhhbmRsZQorICogXHBhcmFtICAgc2hhcmVkX2ZkICAtIFxjIFtvdXRdIHNoYXJlZCBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogXHJldHVybiAgIDAgb24gc3VjY2Vzc1xuCisgKiAgICAgICAgICA8MCAtIE5lZ2F0aXZlIFBPU0lYIEVycm9yIGNvZGUKKyAqCisqLworaW50IGFtZGdwdV9jc19leHBvcnRfc3luY29iaihhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXYsCisJCQkgICAgIHVpbnQzMl90IHN5bmNvYmosCisJCQkgICAgIGludCAqc2hhcmVkX2ZkKTsKKy8qKgorICogIEltcG9ydCBrZXJuZWwgc3luYyBvYmplY3QgZnJvbSBzaGFyZWFibGUgZmQuCisgKgorICogXHBhcmFtICAgZGV2CSAgICAgICAtIFxjIFtpbl0gZGV2aWNlIGhhbmRsZQorICogXHBhcmFtICAgc2hhcmVkX2ZkICAtIFxjIFtpbl0gc2hhcmVkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSAgIHN5bmNvYmogICAgLSBcYyBbb3V0XSBzeW5jIG9iamVjdCBoYW5kbGUKKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyovCitpbnQgYW1kZ3B1X2NzX2ltcG9ydF9zeW5jb2JqKGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldiwKKwkJCSAgICAgaW50IHNoYXJlZF9mZCwKKwkJCSAgICAgdWludDMyX3QgKnN5bmNvYmopOworCisvKioKKyAqICBFeHBvcnQga2VybmVsIHN5bmMgb2JqZWN0IHRvIGEgc3luY19maWxlLgorICoKKyAqIFxwYXJhbSAgIGRldgkgICAgICAgLSBcYyBbaW5dIGRldmljZSBoYW5kbGUKKyAqIFxwYXJhbSAgIHN5bmNvYmogICAgLSBcYyBbaW5dIHN5bmMgb2JqZWN0IGhhbmRsZQorICogXHBhcmFtICAgc3luY19maWxlX2ZkIC0gXGMgW291dF0gc3luY19maWxlIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyAqLworaW50IGFtZGdwdV9jc19zeW5jb2JqX2V4cG9ydF9zeW5jX2ZpbGUoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LAorCQkJCSAgICAgICB1aW50MzJfdCBzeW5jb2JqLAorCQkJCSAgICAgICBpbnQgKnN5bmNfZmlsZV9mZCk7CisKKy8qKgorICogIEltcG9ydCBrZXJuZWwgc3luYyBvYmplY3QgZnJvbSBhIHN5bmNfZmlsZS4KKyAqCisgKiBccGFyYW0gICBkZXYJICAgICAgIC0gXGMgW2luXSBkZXZpY2UgaGFuZGxlCisgKiBccGFyYW0gICBzeW5jb2JqICAgIC0gXGMgW2luXSBzeW5jIG9iamVjdCBoYW5kbGUKKyAqIFxwYXJhbSAgIHN5bmNfZmlsZV9mZCAtIFxjIFtpbl0gc3luY19maWxlIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyAqLworaW50IGFtZGdwdV9jc19zeW5jb2JqX2ltcG9ydF9zeW5jX2ZpbGUoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LAorCQkJCSAgICAgICB1aW50MzJfdCBzeW5jb2JqLAorCQkJCSAgICAgICBpbnQgc3luY19maWxlX2ZkKTsKKworLyoqCisgKiBFeHBvcnQgYW4gYW1kZ3B1IGZlbmNlIGFzIGEgaGFuZGxlIChzeW5jb2JqIG9yIGZkKS4KKyAqCisgKiBccGFyYW0gd2hhdAkJQU1ER1BVX0ZFTkNFX1RPX0hBTkRMRV9HRVRfe1NZTkNPQkosIEZEfQorICogXHBhcmFtIG91dF9oYW5kbGUJcmV0dXJuZWQgaGFuZGxlCisgKgorICogXHJldHVybiAgIDAgb24gc3VjY2Vzc1xuCisgKiAgICAgICAgICA8MCAtIE5lZ2F0aXZlIFBPU0lYIEVycm9yIGNvZGUKKyAqLworaW50IGFtZGdwdV9jc19mZW5jZV90b19oYW5kbGUoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LAorCQkJICAgICAgc3RydWN0IGFtZGdwdV9jc19mZW5jZSAqZmVuY2UsCisJCQkgICAgICB1aW50MzJfdCB3aGF0LAorCQkJICAgICAgdWludDMyX3QgKm91dF9oYW5kbGUpOworCisvKioKKyAqICBTdWJtaXQgcmF3IGNvbW1hbmQgc3VibWlzc2lvbiB0byBrZXJuZWwKKyAqCisgKiBccGFyYW0gICBkZXYJICAgICAgIC0gXGMgW2luXSBkZXZpY2UgaGFuZGxlCisgKiBccGFyYW0gICBjb250ZXh0ICAgIC0gXGMgW2luXSBjb250ZXh0IGhhbmRsZSBmb3IgY29udGV4dCBpZAorICogXHBhcmFtICAgYm9fbGlzdF9oYW5kbGUgLSBcYyBbaW5dIHJlcXVlc3QgYm8gbGlzdCBoYW5kbGUgKDAgZm9yIG5vbmUpCisgKiBccGFyYW0gICBudW1fY2h1bmtzIC0gXGMgW2luXSBudW1iZXIgb2YgQ1MgY2h1bmtzIHRvIHN1Ym1pdAorICogXHBhcmFtICAgY2h1bmtzICAgICAtIFxjIFtpbl0gYXJyYXkgb2YgQ1MgY2h1bmtzCisgKiBccGFyYW0gICBzZXFfbm8gICAgIC0gXGMgW291dF0gb3V0cHV0IHNlcXVlbmNlIG51bWJlciBmb3Igc3VibWlzc2lvbi4KKyAqCisgKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyAqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorICoKKyAqLworc3RydWN0IGRybV9hbWRncHVfY3NfY2h1bms7CitzdHJ1Y3QgZHJtX2FtZGdwdV9jc19jaHVua19kZXA7CitzdHJ1Y3QgZHJtX2FtZGdwdV9jc19jaHVua19kYXRhOworCitpbnQgYW1kZ3B1X2NzX3N1Ym1pdF9yYXcoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LAorCQkJIGFtZGdwdV9jb250ZXh0X2hhbmRsZSBjb250ZXh0LAorCQkJIGFtZGdwdV9ib19saXN0X2hhbmRsZSBib19saXN0X2hhbmRsZSwKKwkJCSBpbnQgbnVtX2NodW5rcywKKwkJCSBzdHJ1Y3QgZHJtX2FtZGdwdV9jc19jaHVuayAqY2h1bmtzLAorCQkJIHVpbnQ2NF90ICpzZXFfbm8pOworCit2b2lkIGFtZGdwdV9jc19jaHVua19mZW5jZV90b19kZXAoc3RydWN0IGFtZGdwdV9jc19mZW5jZSAqZmVuY2UsCisJCQkJICBzdHJ1Y3QgZHJtX2FtZGdwdV9jc19jaHVua19kZXAgKmRlcCk7Cit2b2lkIGFtZGdwdV9jc19jaHVua19mZW5jZV9pbmZvX3RvX2RhdGEoc3RydWN0IGFtZGdwdV9jc19mZW5jZV9pbmZvICpmZW5jZV9pbmZvLAorCQkJCQlzdHJ1Y3QgZHJtX2FtZGdwdV9jc19jaHVua19kYXRhICpkYXRhKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAjaWZkZWYgX0FNREdQVV9IXyAqLwpkaWZmIC0tZ2l0IGEvYW1kZ3B1L2FtZGdwdV9hc2ljX2lkLmMgYi9hbWRncHUvYW1kZ3B1X2FzaWNfaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODIxODk3Ci0tLSAvZGV2L251bGwKKysrIGIvYW1kZ3B1L2FtZGdwdV9hc2ljX2lkLmMKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNyBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgInhmODZkcm0uaCIKKyNpbmNsdWRlICJhbWRncHVfZHJtLmgiCisjaW5jbHVkZSAiYW1kZ3B1X2ludGVybmFsLmgiCisKK3N0YXRpYyBpbnQgcGFyc2Vfb25lX2xpbmUoY29uc3QgY2hhciAqbGluZSwgc3RydWN0IGFtZGdwdV9hc2ljX2lkICppZCkKK3sKKwljaGFyICpidWYsICpzYXZlcHRyOworCWNoYXIgKnNfZGlkOworCWNoYXIgKnNfcmlkOworCWNoYXIgKnNfbmFtZTsKKwljaGFyICplbmRwdHI7CisJaW50IHIgPSAwOworCisJYnVmID0gc3RyZHVwKGxpbmUpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGlnbm9yZSBlbXB0eSBsaW5lIGFuZCBjb21tZW50ZWQgbGluZSAqLworCWlmIChzdHJsZW4obGluZSkgPT0gMCB8fCBsaW5lWzBdID09ICcjJykgeworCQlyID0gLUVBR0FJTjsKKwkJZ290byBvdXQ7CisJfQorCisJLyogZGV2aWNlIGlkICovCisJc19kaWQgPSBzdHJ0b2tfcihidWYsICIsIiwgJnNhdmVwdHIpOworCWlmICghc19kaWQpIHsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlkLT5kaWQgPSBzdHJ0b2woc19kaWQsICZlbmRwdHIsIDE2KTsKKwlpZiAoKmVuZHB0cikgeworCQlyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogcmV2aXNpb24gaWQgKi8KKwlzX3JpZCA9IHN0cnRva19yKE5VTEwsICIsIiwgJnNhdmVwdHIpOworCWlmICghc19yaWQpIHsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlkLT5yaWQgPSBzdHJ0b2woc19yaWQsICZlbmRwdHIsIDE2KTsKKwlpZiAoKmVuZHB0cikgeworCQlyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogbWFya2V0aW5nIG5hbWUgKi8KKwlzX25hbWUgPSBzdHJ0b2tfcihOVUxMLCAiLCIsICZzYXZlcHRyKTsKKwlpZiAoIXNfbmFtZSkgeworCQlyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCS8qIHRyaW0gbGVhZGluZyB3aGl0ZXNwYWNlcyBvciB0YWJzICovCisJd2hpbGUgKGlzYmxhbmsoKnNfbmFtZSkpCisJCXNfbmFtZSsrOworCWlmIChzdHJsZW4oc19uYW1lKSA9PSAwKSB7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZC0+bWFya2V0aW5nX25hbWUgPSBzdHJkdXAoc19uYW1lKTsKKwlpZiAoaWQtPm1hcmtldGluZ19uYW1lID09IE5VTEwpIHsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworb3V0OgorCWZyZWUoYnVmKTsKKworCXJldHVybiByOworfQorCitpbnQgYW1kZ3B1X3BhcnNlX2FzaWNfaWRzKHN0cnVjdCBhbWRncHVfYXNpY19pZCAqKnBfYXNpY19pZF90YWJsZSkKK3sKKwlzdHJ1Y3QgYW1kZ3B1X2FzaWNfaWQgKmFzaWNfaWRfdGFibGU7CisJc3RydWN0IGFtZGdwdV9hc2ljX2lkICppZDsKKwlGSUxFICpmcDsKKwljaGFyICpsaW5lID0gTlVMTDsKKwlzaXplX3QgbGVuID0gMDsKKwlzc2l6ZV90IG47CisJaW50IGxpbmVfbnVtID0gMTsKKwlzaXplX3QgdGFibGVfc2l6ZSA9IDA7CisJc2l6ZV90IHRhYmxlX21heF9zaXplID0gQU1ER1BVX0FTSUNfSURfVEFCTEVfTlVNX0VOVFJJRVM7CisJaW50IHIgPSAwOworCisJZnAgPSBmb3BlbihBTURHUFVfQVNJQ19JRF9UQUJMRSwgInIiKTsKKwlpZiAoIWZwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzXG4iLCBBTURHUFVfQVNJQ19JRF9UQUJMRSwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWFzaWNfaWRfdGFibGUgPSBjYWxsb2ModGFibGVfbWF4X3NpemUgKyAxLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYW1kZ3B1X2FzaWNfaWQpKTsKKwlpZiAoIWFzaWNfaWRfdGFibGUpIHsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gY2xvc2U7CisJfQorCisJLyogMXN0IHZhbGlkIGxpbmUgaXMgZmlsZSB2ZXJzaW9uICovCisJd2hpbGUgKChuID0gZ2V0bGluZSgmbGluZSwgJmxlbiwgZnApKSAhPSAtMSkgeworCQkvKiB0cmltIHRyYWlsaW5nIG5ld2xpbmUgKi8KKwkJaWYgKGxpbmVbbiAtIDFdID09ICdcbicpCisJCQlsaW5lW24gLSAxXSA9ICdcMCc7CisKKwkJLyogaWdub3JlIGVtcHR5IGxpbmUgYW5kIGNvbW1lbnRlZCBsaW5lICovCisJCWlmIChzdHJsZW4obGluZSkgPT0gMCB8fCBsaW5lWzBdID09ICcjJykgeworCQkJbGluZV9udW0rKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZHJtTXNnKCIlcyB2ZXJzaW9uOiAlc1xuIiwgQU1ER1BVX0FTSUNfSURfVEFCTEUsIGxpbmUpOworCQlicmVhazsKKwl9CisKKwl3aGlsZSAoKG4gPSBnZXRsaW5lKCZsaW5lLCAmbGVuLCBmcCkpICE9IC0xKSB7CisJCWlmICh0YWJsZV9zaXplID4gdGFibGVfbWF4X3NpemUpIHsKKwkJCS8qIGRvdWJsZSB0YWJsZSBzaXplICovCisJCQl0YWJsZV9tYXhfc2l6ZSAqPSAyOworCQkJaWQgPSByZWFsbG9jKGFzaWNfaWRfdGFibGUsICh0YWJsZV9tYXhfc2l6ZSArIDEpICoKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgYW1kZ3B1X2FzaWNfaWQpKTsKKwkJCWlmICghaWQpIHsKKwkJCQlyID0gLUVOT01FTTsKKwkJCQlnb3RvIGZyZWU7CisJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICBhc2ljX2lkX3RhYmxlID0gaWQ7CisJCX0KKworCQlpZCA9IGFzaWNfaWRfdGFibGUgKyB0YWJsZV9zaXplOworCisJCS8qIHRyaW0gdHJhaWxpbmcgbmV3bGluZSAqLworCQlpZiAobGluZVtuIC0gMV0gPT0gJ1xuJykKKwkJCWxpbmVbbiAtIDFdID0gJ1wwJzsKKworCQlyID0gcGFyc2Vfb25lX2xpbmUobGluZSwgaWQpOworCQlpZiAocikgeworCQkJaWYgKHIgPT0gLUVBR0FJTikgeworCQkJCWxpbmVfbnVtKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgZm9ybWF0OiAlczogbGluZSAlZDogJXNcbiIsCisJCQkJQU1ER1BVX0FTSUNfSURfVEFCTEUsIGxpbmVfbnVtLCBsaW5lKTsKKwkJCWdvdG8gZnJlZTsKKwkJfQorCisJCWxpbmVfbnVtKys7CisJCXRhYmxlX3NpemUrKzsKKwl9CisKKwlpZiAodGFibGVfc2l6ZSAhPSB0YWJsZV9tYXhfc2l6ZSkgeworCQlpZCA9IHJlYWxsb2MoYXNpY19pZF90YWJsZSwgKHRhYmxlX3NpemUgKyAxKSAqCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgYW1kZ3B1X2FzaWNfaWQpKTsKKwkJaWYgKCFpZCkgeworCQkJciA9IC1FTk9NRU07CisJCQlnb3RvIGZyZWU7CisJCX0KKwkJYXNpY19pZF90YWJsZSA9IGlkOworICAgICAgICB9CisKKwkvKiBlbmQgb2YgdGFibGUgKi8KKwlpZCA9IGFzaWNfaWRfdGFibGUgKyB0YWJsZV9zaXplOworCW1lbXNldChpZCwgMCwgc2l6ZW9mKHN0cnVjdCBhbWRncHVfYXNpY19pZCkpOworCitmcmVlOgorCWZyZWUobGluZSk7CisKKwlpZiAociAmJiBhc2ljX2lkX3RhYmxlKSB7CisJCXdoaWxlICh0YWJsZV9zaXplLS0pIHsKKwkJCWlkID0gYXNpY19pZF90YWJsZSArIHRhYmxlX3NpemU7CisJCQlmcmVlKGlkLT5tYXJrZXRpbmdfbmFtZSk7CisJCX0KKwkJZnJlZShhc2ljX2lkX3RhYmxlKTsKKwkJYXNpY19pZF90YWJsZSA9IE5VTEw7CisJfQorY2xvc2U6CisJZmNsb3NlKGZwKTsKKworCSpwX2FzaWNfaWRfdGFibGUgPSBhc2ljX2lkX3RhYmxlOworCisJcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS9hbWRncHUvYW1kZ3B1X2JvLmMgYi9hbWRncHUvYW1kZ3B1X2JvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1M2ZkMAotLS0gL2Rldi9udWxsCisrKyBiL2FtZGdwdS9hbWRncHVfYm8uYwpAQCAtMCwwICsxLDcyNSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDE0IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgImxpYmRybV9tYWNyb3MuaCIKKyNpbmNsdWRlICJ4Zjg2ZHJtLmgiCisjaW5jbHVkZSAiYW1kZ3B1X2RybS5oIgorI2luY2x1ZGUgImFtZGdwdV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInV0aWxfaGFzaF90YWJsZS5oIgorI2luY2x1ZGUgInV0aWxfbWF0aC5oIgorCitzdGF0aWMgdm9pZCBhbWRncHVfY2xvc2Vfa21zX2hhbmRsZShhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXYsCisJCQkJICAgICB1aW50MzJfdCBoYW5kbGUpCit7CisJc3RydWN0IGRybV9nZW1fY2xvc2UgYXJncyA9IHt9OworCisJYXJncy5oYW5kbGUgPSBoYW5kbGU7CisJZHJtSW9jdGwoZGV2LT5mZCwgRFJNX0lPQ1RMX0dFTV9DTE9TRSwgJmFyZ3MpOworfQorCitpbnQgYW1kZ3B1X2JvX2FsbG9jKGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldiwKKwkJICAgIHN0cnVjdCBhbWRncHVfYm9fYWxsb2NfcmVxdWVzdCAqYWxsb2NfYnVmZmVyLAorCQkgICAgYW1kZ3B1X2JvX2hhbmRsZSAqYnVmX2hhbmRsZSkKK3sKKwlzdHJ1Y3QgYW1kZ3B1X2JvICpibzsKKwl1bmlvbiBkcm1fYW1kZ3B1X2dlbV9jcmVhdGUgYXJnczsKKwl1bnNpZ25lZCBoZWFwID0gYWxsb2NfYnVmZmVyLT5wcmVmZXJyZWRfaGVhcDsKKwlpbnQgciA9IDA7CisKKwkvKiBJdCdzIGFuIGVycm9yIGlmIHRoZSBoZWFwIGlzIG5vdCBzcGVjaWZpZWQgKi8KKwlpZiAoIShoZWFwICYgKEFNREdQVV9HRU1fRE9NQUlOX0dUVCB8IEFNREdQVV9HRU1fRE9NQUlOX1ZSQU0pKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlibyA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGFtZGdwdV9ibykpOworCWlmICghYm8pCisJCXJldHVybiAtRU5PTUVNOworCisJYXRvbWljX3NldCgmYm8tPnJlZmNvdW50LCAxKTsKKwliby0+ZGV2ID0gZGV2OworCWJvLT5hbGxvY19zaXplID0gYWxsb2NfYnVmZmVyLT5hbGxvY19zaXplOworCisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCWFyZ3MuaW4uYm9fc2l6ZSA9IGFsbG9jX2J1ZmZlci0+YWxsb2Nfc2l6ZTsKKwlhcmdzLmluLmFsaWdubWVudCA9IGFsbG9jX2J1ZmZlci0+cGh5c19hbGlnbm1lbnQ7CisKKwkvKiBTZXQgdGhlIHBsYWNlbWVudC4gKi8KKwlhcmdzLmluLmRvbWFpbnMgPSBoZWFwOworCWFyZ3MuaW4uZG9tYWluX2ZsYWdzID0gYWxsb2NfYnVmZmVyLT5mbGFnczsKKworCS8qIEFsbG9jYXRlIHRoZSBidWZmZXIgd2l0aCB0aGUgcHJlZmVycmVkIGhlYXAuICovCisJciA9IGRybUNvbW1hbmRXcml0ZVJlYWQoZGV2LT5mZCwgRFJNX0FNREdQVV9HRU1fQ1JFQVRFLAorCQkJCSZhcmdzLCBzaXplb2YoYXJncykpOworCWlmIChyKSB7CisJCWZyZWUoYm8pOworCQlyZXR1cm4gcjsKKwl9CisKKwliby0+aGFuZGxlID0gYXJncy5vdXQuaGFuZGxlOworCisJcHRocmVhZF9tdXRleF9pbml0KCZiby0+Y3B1X2FjY2Vzc19tdXRleCwgTlVMTCk7CisKKwkqYnVmX2hhbmRsZSA9IGJvOworCXJldHVybiAwOworfQorCitpbnQgYW1kZ3B1X2JvX3NldF9tZXRhZGF0YShhbWRncHVfYm9faGFuZGxlIGJvLAorCQkJICAgc3RydWN0IGFtZGdwdV9ib19tZXRhZGF0YSAqaW5mbykKK3sKKwlzdHJ1Y3QgZHJtX2FtZGdwdV9nZW1fbWV0YWRhdGEgYXJncyA9IHt9OworCisJYXJncy5oYW5kbGUgPSBiby0+aGFuZGxlOworCWFyZ3Mub3AgPSBBTURHUFVfR0VNX01FVEFEQVRBX09QX1NFVF9NRVRBREFUQTsKKwlhcmdzLmRhdGEuZmxhZ3MgPSBpbmZvLT5mbGFnczsKKwlhcmdzLmRhdGEudGlsaW5nX2luZm8gPSBpbmZvLT50aWxpbmdfaW5mbzsKKworCWlmIChpbmZvLT5zaXplX21ldGFkYXRhID4gc2l6ZW9mKGFyZ3MuZGF0YS5kYXRhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaW5mby0+c2l6ZV9tZXRhZGF0YSkgeworCQlhcmdzLmRhdGEuZGF0YV9zaXplX2J5dGVzID0gaW5mby0+c2l6ZV9tZXRhZGF0YTsKKwkJbWVtY3B5KGFyZ3MuZGF0YS5kYXRhLCBpbmZvLT51bWRfbWV0YWRhdGEsIGluZm8tPnNpemVfbWV0YWRhdGEpOworCX0KKworCXJldHVybiBkcm1Db21tYW5kV3JpdGVSZWFkKGJvLT5kZXYtPmZkLAorCQkJCSAgIERSTV9BTURHUFVfR0VNX01FVEFEQVRBLAorCQkJCSAgICZhcmdzLCBzaXplb2YoYXJncykpOworfQorCitpbnQgYW1kZ3B1X2JvX3F1ZXJ5X2luZm8oYW1kZ3B1X2JvX2hhbmRsZSBibywKKwkJCSBzdHJ1Y3QgYW1kZ3B1X2JvX2luZm8gKmluZm8pCit7CisJc3RydWN0IGRybV9hbWRncHVfZ2VtX21ldGFkYXRhIG1ldGFkYXRhID0ge307CisJc3RydWN0IGRybV9hbWRncHVfZ2VtX2NyZWF0ZV9pbiBib19pbmZvID0ge307CisJc3RydWN0IGRybV9hbWRncHVfZ2VtX29wIGdlbV9vcCA9IHt9OworCWludCByOworCisJLyogVmFsaWRhdGUgdGhlIEJPIHBhc3NlZCBpbiAqLworCWlmICghYm8tPmhhbmRsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBRdWVyeSBtZXRhZGF0YS4gKi8KKwltZXRhZGF0YS5oYW5kbGUgPSBiby0+aGFuZGxlOworCW1ldGFkYXRhLm9wID0gQU1ER1BVX0dFTV9NRVRBREFUQV9PUF9HRVRfTUVUQURBVEE7CisKKwlyID0gZHJtQ29tbWFuZFdyaXRlUmVhZChiby0+ZGV2LT5mZCwgRFJNX0FNREdQVV9HRU1fTUVUQURBVEEsCisJCQkJJm1ldGFkYXRhLCBzaXplb2YobWV0YWRhdGEpKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpZiAobWV0YWRhdGEuZGF0YS5kYXRhX3NpemVfYnl0ZXMgPgorCSAgICBzaXplb2YoaW5mby0+bWV0YWRhdGEudW1kX21ldGFkYXRhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBRdWVyeSBidWZmZXIgaW5mby4gKi8KKwlnZW1fb3AuaGFuZGxlID0gYm8tPmhhbmRsZTsKKwlnZW1fb3Aub3AgPSBBTURHUFVfR0VNX09QX0dFVF9HRU1fQ1JFQVRFX0lORk87CisJZ2VtX29wLnZhbHVlID0gKHVpbnRwdHJfdCkmYm9faW5mbzsKKworCXIgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGJvLT5kZXYtPmZkLCBEUk1fQU1ER1BVX0dFTV9PUCwKKwkJCQkmZ2VtX29wLCBzaXplb2YoZ2VtX29wKSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCWluZm8tPmFsbG9jX3NpemUgPSBib19pbmZvLmJvX3NpemU7CisJaW5mby0+cGh5c19hbGlnbm1lbnQgPSBib19pbmZvLmFsaWdubWVudDsKKwlpbmZvLT5wcmVmZXJyZWRfaGVhcCA9IGJvX2luZm8uZG9tYWluczsKKwlpbmZvLT5hbGxvY19mbGFncyA9IGJvX2luZm8uZG9tYWluX2ZsYWdzOworCWluZm8tPm1ldGFkYXRhLmZsYWdzID0gbWV0YWRhdGEuZGF0YS5mbGFnczsKKwlpbmZvLT5tZXRhZGF0YS50aWxpbmdfaW5mbyA9IG1ldGFkYXRhLmRhdGEudGlsaW5nX2luZm87CisKKwlpbmZvLT5tZXRhZGF0YS5zaXplX21ldGFkYXRhID0gbWV0YWRhdGEuZGF0YS5kYXRhX3NpemVfYnl0ZXM7CisJaWYgKG1ldGFkYXRhLmRhdGEuZGF0YV9zaXplX2J5dGVzID4gMCkKKwkJbWVtY3B5KGluZm8tPm1ldGFkYXRhLnVtZF9tZXRhZGF0YSwgbWV0YWRhdGEuZGF0YS5kYXRhLAorCQkgICAgICAgbWV0YWRhdGEuZGF0YS5kYXRhX3NpemVfYnl0ZXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9hZGRfaGFuZGxlX3RvX3RhYmxlKGFtZGdwdV9ib19oYW5kbGUgYm8pCit7CisJcHRocmVhZF9tdXRleF9sb2NrKCZiby0+ZGV2LT5ib190YWJsZV9tdXRleCk7CisJdXRpbF9oYXNoX3RhYmxlX3NldChiby0+ZGV2LT5ib19oYW5kbGVzLAorCQkJICAgICh2b2lkKikodWludHB0cl90KWJvLT5oYW5kbGUsIGJvKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmYm8tPmRldi0+Ym9fdGFibGVfbXV0ZXgpOworfQorCitzdGF0aWMgaW50IGFtZGdwdV9ib19leHBvcnRfZmxpbmsoYW1kZ3B1X2JvX2hhbmRsZSBibykKK3sKKwlzdHJ1Y3QgZHJtX2dlbV9mbGluayBmbGluazsKKwlpbnQgZmQsIGRtYV9mZDsKKwl1aW50MzJfdCBoYW5kbGU7CisJaW50IHI7CisKKwlmZCA9IGJvLT5kZXYtPmZkOworCWhhbmRsZSA9IGJvLT5oYW5kbGU7CisJaWYgKGJvLT5mbGlua19uYW1lKQorCQlyZXR1cm4gMDsKKworCisJaWYgKGJvLT5kZXYtPmZsaW5rX2ZkICE9IGJvLT5kZXYtPmZkKSB7CisJCXIgPSBkcm1QcmltZUhhbmRsZVRvRkQoYm8tPmRldi0+ZmQsIGJvLT5oYW5kbGUsIERSTV9DTE9FWEVDLAorCQkJCSAgICAgICAmZG1hX2ZkKTsKKwkJaWYgKCFyKSB7CisJCQlyID0gZHJtUHJpbWVGRFRvSGFuZGxlKGJvLT5kZXYtPmZsaW5rX2ZkLCBkbWFfZmQsICZoYW5kbGUpOworCQkJY2xvc2UoZG1hX2ZkKTsKKwkJfQorCQlpZiAocikKKwkJCXJldHVybiByOworCQlmZCA9IGJvLT5kZXYtPmZsaW5rX2ZkOworCX0KKwltZW1zZXQoJmZsaW5rLCAwLCBzaXplb2YoZmxpbmspKTsKKwlmbGluay5oYW5kbGUgPSBoYW5kbGU7CisKKwlyID0gZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9HRU1fRkxJTkssICZmbGluayk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJYm8tPmZsaW5rX25hbWUgPSBmbGluay5uYW1lOworCisJaWYgKGJvLT5kZXYtPmZsaW5rX2ZkICE9IGJvLT5kZXYtPmZkKSB7CisJCXN0cnVjdCBkcm1fZ2VtX2Nsb3NlIGFyZ3MgPSB7fTsKKwkJYXJncy5oYW5kbGUgPSBoYW5kbGU7CisJCWRybUlvY3RsKGJvLT5kZXYtPmZsaW5rX2ZkLCBEUk1fSU9DVExfR0VNX0NMT1NFLCAmYXJncyk7CisJfQorCisJcHRocmVhZF9tdXRleF9sb2NrKCZiby0+ZGV2LT5ib190YWJsZV9tdXRleCk7CisJdXRpbF9oYXNoX3RhYmxlX3NldChiby0+ZGV2LT5ib19mbGlua19uYW1lcywKKwkJCSAgICAodm9pZCopKHVpbnRwdHJfdCliby0+ZmxpbmtfbmFtZSwKKwkJCSAgICBibyk7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmJvLT5kZXYtPmJvX3RhYmxlX211dGV4KTsKKworCXJldHVybiAwOworfQorCitpbnQgYW1kZ3B1X2JvX2V4cG9ydChhbWRncHVfYm9faGFuZGxlIGJvLAorCQkgICAgIGVudW0gYW1kZ3B1X2JvX2hhbmRsZV90eXBlIHR5cGUsCisJCSAgICAgdWludDMyX3QgKnNoYXJlZF9oYW5kbGUpCit7CisJaW50IHI7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGFtZGdwdV9ib19oYW5kbGVfdHlwZV9nZW1fZmxpbmtfbmFtZToKKwkJciA9IGFtZGdwdV9ib19leHBvcnRfZmxpbmsoYm8pOworCQlpZiAocikKKwkJCXJldHVybiByOworCisJCSpzaGFyZWRfaGFuZGxlID0gYm8tPmZsaW5rX25hbWU7CisJCXJldHVybiAwOworCisJY2FzZSBhbWRncHVfYm9faGFuZGxlX3R5cGVfa21zOgorCQlhbWRncHVfYWRkX2hhbmRsZV90b190YWJsZShibyk7CisJCSpzaGFyZWRfaGFuZGxlID0gYm8tPmhhbmRsZTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIGFtZGdwdV9ib19oYW5kbGVfdHlwZV9kbWFfYnVmX2ZkOgorCQlhbWRncHVfYWRkX2hhbmRsZV90b190YWJsZShibyk7CisJCXJldHVybiBkcm1QcmltZUhhbmRsZVRvRkQoYm8tPmRldi0+ZmQsIGJvLT5oYW5kbGUsIERSTV9DTE9FWEVDLAorCQkJCSAgICAgICAoaW50KilzaGFyZWRfaGFuZGxlKTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBhbWRncHVfYm9faW1wb3J0KGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldiwKKwkJICAgICBlbnVtIGFtZGdwdV9ib19oYW5kbGVfdHlwZSB0eXBlLAorCQkgICAgIHVpbnQzMl90IHNoYXJlZF9oYW5kbGUsCisJCSAgICAgc3RydWN0IGFtZGdwdV9ib19pbXBvcnRfcmVzdWx0ICpvdXRwdXQpCit7CisJc3RydWN0IGRybV9nZW1fb3BlbiBvcGVuX2FyZyA9IHt9OworCXN0cnVjdCBhbWRncHVfYm8gKmJvID0gTlVMTDsKKwlpbnQgcjsKKwlpbnQgZG1hX2ZkOworCXVpbnQ2NF90IGRtYV9idWZfc2l6ZSA9IDA7CisKKwkvKiBXZSBtdXN0IG1haW50YWluIGEgbGlzdCBvZiBwYWlycyA8aGFuZGxlLCBibz4sIHNvIHRoYXQgd2UgYWx3YXlzCisJICogcmV0dXJuIHRoZSBzYW1lIGFtZGdwdV9ibyBpbnN0YW5jZSBmb3IgdGhlIHNhbWUgaGFuZGxlLiAqLworCXB0aHJlYWRfbXV0ZXhfbG9jaygmZGV2LT5ib190YWJsZV9tdXRleCk7CisKKwkvKiBDb252ZXJ0IGEgRE1BIGJ1ZiBoYW5kbGUgdG8gYSBLTVMgaGFuZGxlIG5vdy4gKi8KKwlpZiAodHlwZSA9PSBhbWRncHVfYm9faGFuZGxlX3R5cGVfZG1hX2J1Zl9mZCkgeworCQl1aW50MzJfdCBoYW5kbGU7CisJCW9mZl90IHNpemU7CisKKwkJLyogR2V0IGEgS01TIGhhbmRsZS4gKi8KKwkJciA9IGRybVByaW1lRkRUb0hhbmRsZShkZXYtPmZkLCBzaGFyZWRfaGFuZGxlLCAmaGFuZGxlKTsKKwkJaWYgKHIpIHsKKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZkZXYtPmJvX3RhYmxlX211dGV4KTsKKwkJCXJldHVybiByOworCQl9CisKKwkJLyogUXVlcnkgdGhlIGJ1ZmZlciBzaXplLiAqLworCQlzaXplID0gbHNlZWsoc2hhcmVkX2hhbmRsZSwgMCwgU0VFS19FTkQpOworCQlpZiAoc2l6ZSA9PSAob2ZmX3QpLTEpIHsKKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZkZXYtPmJvX3RhYmxlX211dGV4KTsKKwkJCWFtZGdwdV9jbG9zZV9rbXNfaGFuZGxlKGRldiwgaGFuZGxlKTsKKwkJCXJldHVybiAtZXJybm87CisJCX0KKwkJbHNlZWsoc2hhcmVkX2hhbmRsZSwgMCwgU0VFS19TRVQpOworCisJCWRtYV9idWZfc2l6ZSA9IHNpemU7CisJCXNoYXJlZF9oYW5kbGUgPSBoYW5kbGU7CisJfQorCisJLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQgYSBidWZmZXIgd2l0aCB0aGlzIGhhbmRsZSwgZmluZCBpdC4gKi8KKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGFtZGdwdV9ib19oYW5kbGVfdHlwZV9nZW1fZmxpbmtfbmFtZToKKwkJYm8gPSB1dGlsX2hhc2hfdGFibGVfZ2V0KGRldi0+Ym9fZmxpbmtfbmFtZXMsCisJCQkJCSAodm9pZCopKHVpbnRwdHJfdClzaGFyZWRfaGFuZGxlKTsKKwkJYnJlYWs7CisKKwljYXNlIGFtZGdwdV9ib19oYW5kbGVfdHlwZV9kbWFfYnVmX2ZkOgorCQlibyA9IHV0aWxfaGFzaF90YWJsZV9nZXQoZGV2LT5ib19oYW5kbGVzLAorCQkJCQkgKHZvaWQqKSh1aW50cHRyX3Qpc2hhcmVkX2hhbmRsZSk7CisJCWJyZWFrOworCisJY2FzZSBhbWRncHVfYm9faGFuZGxlX3R5cGVfa21zOgorCQkvKiBJbXBvcnRpbmcgYSBLTVMgaGFuZGxlIGluIG5vdCBhbGxvd2VkLiAqLworCQlwdGhyZWFkX211dGV4X3VubG9jaygmZGV2LT5ib190YWJsZV9tdXRleCk7CisJCXJldHVybiAtRVBFUk07CisKKwlkZWZhdWx0OgorCQlwdGhyZWFkX211dGV4X3VubG9jaygmZGV2LT5ib190YWJsZV9tdXRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChibykgeworCQkvKiBUaGUgYnVmZmVyIGFscmVhZHkgZXhpc3RzLCBqdXN0IGJ1bXAgdGhlIHJlZmNvdW50LiAqLworCQlhdG9taWNfaW5jKCZiby0+cmVmY291bnQpOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmZGV2LT5ib190YWJsZV9tdXRleCk7CisKKwkJb3V0cHV0LT5idWZfaGFuZGxlID0gYm87CisJCW91dHB1dC0+YWxsb2Nfc2l6ZSA9IGJvLT5hbGxvY19zaXplOworCQlyZXR1cm4gMDsKKwl9CisKKwlibyA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGFtZGdwdV9ibykpOworCWlmICghYm8pIHsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJmRldi0+Ym9fdGFibGVfbXV0ZXgpOworCQlpZiAodHlwZSA9PSBhbWRncHVfYm9faGFuZGxlX3R5cGVfZG1hX2J1Zl9mZCkgeworCQkJYW1kZ3B1X2Nsb3NlX2ttc19oYW5kbGUoZGV2LCBzaGFyZWRfaGFuZGxlKTsKKwkJfQorCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBPcGVuIHRoZSBoYW5kbGUuICovCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBhbWRncHVfYm9faGFuZGxlX3R5cGVfZ2VtX2ZsaW5rX25hbWU6CisJCW9wZW5fYXJnLm5hbWUgPSBzaGFyZWRfaGFuZGxlOworCQlyID0gZHJtSW9jdGwoZGV2LT5mbGlua19mZCwgRFJNX0lPQ1RMX0dFTV9PUEVOLCAmb3Blbl9hcmcpOworCQlpZiAocikgeworCQkJZnJlZShibyk7CisJCQlwdGhyZWFkX211dGV4X3VubG9jaygmZGV2LT5ib190YWJsZV9tdXRleCk7CisJCQlyZXR1cm4gcjsKKwkJfQorCisJCWJvLT5oYW5kbGUgPSBvcGVuX2FyZy5oYW5kbGU7CisJCWlmIChkZXYtPmZsaW5rX2ZkICE9IGRldi0+ZmQpIHsKKwkJCXIgPSBkcm1QcmltZUhhbmRsZVRvRkQoZGV2LT5mbGlua19mZCwgYm8tPmhhbmRsZSwgRFJNX0NMT0VYRUMsICZkbWFfZmQpOworCQkJaWYgKHIpIHsKKwkJCQlmcmVlKGJvKTsKKwkJCQlwdGhyZWFkX211dGV4X3VubG9jaygmZGV2LT5ib190YWJsZV9tdXRleCk7CisJCQkJcmV0dXJuIHI7CisJCQl9CisJCQlyID0gZHJtUHJpbWVGRFRvSGFuZGxlKGRldi0+ZmQsIGRtYV9mZCwgJmJvLT5oYW5kbGUgKTsKKworCQkJY2xvc2UoZG1hX2ZkKTsKKworCQkJaWYgKHIpIHsKKwkJCQlmcmVlKGJvKTsKKwkJCQlwdGhyZWFkX211dGV4X3VubG9jaygmZGV2LT5ib190YWJsZV9tdXRleCk7CisJCQkJcmV0dXJuIHI7CisJCQl9CisJCX0KKwkJYm8tPmZsaW5rX25hbWUgPSBzaGFyZWRfaGFuZGxlOworCQliby0+YWxsb2Nfc2l6ZSA9IG9wZW5fYXJnLnNpemU7CisJCXV0aWxfaGFzaF90YWJsZV9zZXQoZGV2LT5ib19mbGlua19uYW1lcywKKwkJCQkgICAgKHZvaWQqKSh1aW50cHRyX3QpYm8tPmZsaW5rX25hbWUsIGJvKTsKKwkJYnJlYWs7CisKKwljYXNlIGFtZGdwdV9ib19oYW5kbGVfdHlwZV9kbWFfYnVmX2ZkOgorCQliby0+aGFuZGxlID0gc2hhcmVkX2hhbmRsZTsKKwkJYm8tPmFsbG9jX3NpemUgPSBkbWFfYnVmX3NpemU7CisJCWJyZWFrOworCisJY2FzZSBhbWRncHVfYm9faGFuZGxlX3R5cGVfa21zOgorCQlhc3NlcnQoMCk7IC8qIHVucmVhY2hhYmxlICovCisJfQorCisJLyogSW5pdGlhbGl6ZSBpdC4gKi8KKwlhdG9taWNfc2V0KCZiby0+cmVmY291bnQsIDEpOworCWJvLT5kZXYgPSBkZXY7CisJcHRocmVhZF9tdXRleF9pbml0KCZiby0+Y3B1X2FjY2Vzc19tdXRleCwgTlVMTCk7CisKKwl1dGlsX2hhc2hfdGFibGVfc2V0KGRldi0+Ym9faGFuZGxlcywgKHZvaWQqKSh1aW50cHRyX3QpYm8tPmhhbmRsZSwgYm8pOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZkZXYtPmJvX3RhYmxlX211dGV4KTsKKworCW91dHB1dC0+YnVmX2hhbmRsZSA9IGJvOworCW91dHB1dC0+YWxsb2Nfc2l6ZSA9IGJvLT5hbGxvY19zaXplOworCXJldHVybiAwOworfQorCitpbnQgYW1kZ3B1X2JvX2ZyZWUoYW1kZ3B1X2JvX2hhbmRsZSBidWZfaGFuZGxlKQoreworCXN0cnVjdCBhbWRncHVfZGV2aWNlICpkZXY7CisJc3RydWN0IGFtZGdwdV9ibyAqYm8gPSBidWZfaGFuZGxlOworCisJYXNzZXJ0KGJvICE9IE5VTEwpOworCWRldiA9IGJvLT5kZXY7CisJcHRocmVhZF9tdXRleF9sb2NrKCZkZXYtPmJvX3RhYmxlX211dGV4KTsKKworCWlmICh1cGRhdGVfcmVmZXJlbmNlcygmYm8tPnJlZmNvdW50LCBOVUxMKSkgeworCQkvKiBSZW1vdmUgdGhlIGJ1ZmZlciBmcm9tIHRoZSBoYXNoIHRhYmxlcy4gKi8KKwkJdXRpbF9oYXNoX3RhYmxlX3JlbW92ZShkZXYtPmJvX2hhbmRsZXMsCisJCQkJCSh2b2lkKikodWludHB0cl90KWJvLT5oYW5kbGUpOworCisJCWlmIChiby0+ZmxpbmtfbmFtZSkgeworCQkJdXRpbF9oYXNoX3RhYmxlX3JlbW92ZShkZXYtPmJvX2ZsaW5rX25hbWVzLAorCQkJCQkJKHZvaWQqKSh1aW50cHRyX3QpYm8tPmZsaW5rX25hbWUpOworCQl9CisKKwkJLyogUmVsZWFzZSBDUFUgYWNjZXNzLiAqLworCQlpZiAoYm8tPmNwdV9tYXBfY291bnQgPiAwKSB7CisJCQliby0+Y3B1X21hcF9jb3VudCA9IDE7CisJCQlhbWRncHVfYm9fY3B1X3VubWFwKGJvKTsKKwkJfQorCisJCWFtZGdwdV9jbG9zZV9rbXNfaGFuZGxlKGRldiwgYm8tPmhhbmRsZSk7CisJCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmYm8tPmNwdV9hY2Nlc3NfbXV0ZXgpOworCQlmcmVlKGJvKTsKKwl9CisKKwlwdGhyZWFkX211dGV4X3VubG9jaygmZGV2LT5ib190YWJsZV9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhbWRncHVfYm9fY3B1X21hcChhbWRncHVfYm9faGFuZGxlIGJvLCB2b2lkICoqY3B1KQoreworCXVuaW9uIGRybV9hbWRncHVfZ2VtX21tYXAgYXJnczsKKwl2b2lkICpwdHI7CisJaW50IHI7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmJvLT5jcHVfYWNjZXNzX211dGV4KTsKKworCWlmIChiby0+Y3B1X3B0cikgeworCQkvKiBhbHJlYWR5IG1hcHBlZCAqLworCQlhc3NlcnQoYm8tPmNwdV9tYXBfY291bnQgPiAwKTsKKwkJYm8tPmNwdV9tYXBfY291bnQrKzsKKwkJKmNwdSA9IGJvLT5jcHVfcHRyOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmYm8tPmNwdV9hY2Nlc3NfbXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlhc3NlcnQoYm8tPmNwdV9tYXBfY291bnQgPT0gMCk7CisKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisKKwkvKiBRdWVyeSB0aGUgYnVmZmVyIGFkZHJlc3MgKGFyZ3MuYWRkcl9wdHIpLgorCSAqIFRoZSBrZXJuZWwgZHJpdmVyIGlnbm9yZXMgdGhlIG9mZnNldCBhbmQgc2l6ZSBwYXJhbWV0ZXJzLiAqLworCWFyZ3MuaW4uaGFuZGxlID0gYm8tPmhhbmRsZTsKKworCXIgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGJvLT5kZXYtPmZkLCBEUk1fQU1ER1BVX0dFTV9NTUFQLCAmYXJncywKKwkJCQlzaXplb2YoYXJncykpOworCWlmIChyKSB7CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZiby0+Y3B1X2FjY2Vzc19tdXRleCk7CisJCXJldHVybiByOworCX0KKworCS8qIE1hcCB0aGUgYnVmZmVyLiAqLworCXB0ciA9IGRybV9tbWFwKE5VTEwsIGJvLT5hbGxvY19zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELAorCQkgICAgICAgYm8tPmRldi0+ZmQsIGFyZ3Mub3V0LmFkZHJfcHRyKTsKKwlpZiAocHRyID09IE1BUF9GQUlMRUQpIHsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJmJvLT5jcHVfYWNjZXNzX211dGV4KTsKKwkJcmV0dXJuIC1lcnJubzsKKwl9CisKKwliby0+Y3B1X3B0ciA9IHB0cjsKKwliby0+Y3B1X21hcF9jb3VudCA9IDE7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmJvLT5jcHVfYWNjZXNzX211dGV4KTsKKworCSpjcHUgPSBwdHI7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhbWRncHVfYm9fY3B1X3VubWFwKGFtZGdwdV9ib19oYW5kbGUgYm8pCit7CisJaW50IHI7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmJvLT5jcHVfYWNjZXNzX211dGV4KTsKKwlhc3NlcnQoYm8tPmNwdV9tYXBfY291bnQgPj0gMCk7CisKKwlpZiAoYm8tPmNwdV9tYXBfY291bnQgPT0gMCkgeworCQkvKiBub3QgbWFwcGVkICovCisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZiby0+Y3B1X2FjY2Vzc19tdXRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJvLT5jcHVfbWFwX2NvdW50LS07CisJaWYgKGJvLT5jcHVfbWFwX2NvdW50ID4gMCkgeworCQkvKiBtYXBwZWQgbXVsdGlwbGUgdGltZXMgKi8KKwkJcHRocmVhZF9tdXRleF91bmxvY2soJmJvLT5jcHVfYWNjZXNzX211dGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJciA9IGRybV9tdW5tYXAoYm8tPmNwdV9wdHIsIGJvLT5hbGxvY19zaXplKSA9PSAwID8gMCA6IC1lcnJubzsKKwliby0+Y3B1X3B0ciA9IE5VTEw7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmJvLT5jcHVfYWNjZXNzX211dGV4KTsKKwlyZXR1cm4gcjsKK30KKworaW50IGFtZGdwdV9xdWVyeV9idWZmZXJfc2l6ZV9hbGlnbm1lbnQoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LAorCQkJCXN0cnVjdCBhbWRncHVfYnVmZmVyX3NpemVfYWxpZ25tZW50cyAqaW5mbykKK3sKKwlpbmZvLT5zaXplX2xvY2FsID0gZGV2LT5kZXZfaW5mby5wdGVfZnJhZ21lbnRfc2l6ZTsKKwlpbmZvLT5zaXplX3JlbW90ZSA9IGRldi0+ZGV2X2luZm8uZ2FydF9wYWdlX3NpemU7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhbWRncHVfYm9fd2FpdF9mb3JfaWRsZShhbWRncHVfYm9faGFuZGxlIGJvLAorCQkJICAgIHVpbnQ2NF90IHRpbWVvdXRfbnMsCisJCQkgICAgYm9vbCAqYnVzeSkKK3sKKwl1bmlvbiBkcm1fYW1kZ3B1X2dlbV93YWl0X2lkbGUgYXJnczsKKwlpbnQgcjsKKworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKwlhcmdzLmluLmhhbmRsZSA9IGJvLT5oYW5kbGU7CisJYXJncy5pbi50aW1lb3V0ID0gYW1kZ3B1X2NzX2NhbGN1bGF0ZV90aW1lb3V0KHRpbWVvdXRfbnMpOworCisJciA9IGRybUNvbW1hbmRXcml0ZVJlYWQoYm8tPmRldi0+ZmQsIERSTV9BTURHUFVfR0VNX1dBSVRfSURMRSwKKwkJCQkmYXJncywgc2l6ZW9mKGFyZ3MpKTsKKworCWlmIChyID09IDApIHsKKwkJKmJ1c3kgPSBhcmdzLm91dC5zdGF0dXM7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiYW1kZ3B1OiBHRU1fV0FJVF9JRExFIGZhaWxlZCB3aXRoICVpXG4iLCByKTsKKwkJcmV0dXJuIHI7CisJfQorfQorCitpbnQgYW1kZ3B1X2NyZWF0ZV9ib19mcm9tX3VzZXJfbWVtKGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldiwKKwkJCQkgICAgdm9pZCAqY3B1LAorCQkJCSAgICB1aW50NjRfdCBzaXplLAorCQkJCSAgICBhbWRncHVfYm9faGFuZGxlICpidWZfaGFuZGxlKQoreworCWludCByOworCXN0cnVjdCBhbWRncHVfYm8gKmJvOworCXN0cnVjdCBkcm1fYW1kZ3B1X2dlbV91c2VycHRyIGFyZ3M7CisKKwlhcmdzLmFkZHIgPSAodWludHB0cl90KWNwdTsKKwlhcmdzLmZsYWdzID0gQU1ER1BVX0dFTV9VU0VSUFRSX0FOT05PTkxZIHwgQU1ER1BVX0dFTV9VU0VSUFRSX1JFR0lTVEVSIHwKKwkJQU1ER1BVX0dFTV9VU0VSUFRSX1ZBTElEQVRFOworCWFyZ3Muc2l6ZSA9IHNpemU7CisJciA9IGRybUNvbW1hbmRXcml0ZVJlYWQoZGV2LT5mZCwgRFJNX0FNREdQVV9HRU1fVVNFUlBUUiwKKwkJCQkmYXJncywgc2l6ZW9mKGFyZ3MpKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlibyA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGFtZGdwdV9ibykpOworCWlmICghYm8pCisJCXJldHVybiAtRU5PTUVNOworCisJYXRvbWljX3NldCgmYm8tPnJlZmNvdW50LCAxKTsKKwliby0+ZGV2ID0gZGV2OworCWJvLT5hbGxvY19zaXplID0gc2l6ZTsKKwliby0+aGFuZGxlID0gYXJncy5oYW5kbGU7CisKKwkqYnVmX2hhbmRsZSA9IGJvOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBhbWRncHVfYm9fbGlzdF9jcmVhdGUoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LAorCQkJICB1aW50MzJfdCBudW1iZXJfb2ZfcmVzb3VyY2VzLAorCQkJICBhbWRncHVfYm9faGFuZGxlICpyZXNvdXJjZXMsCisJCQkgIHVpbnQ4X3QgKnJlc291cmNlX3ByaW9zLAorCQkJICBhbWRncHVfYm9fbGlzdF9oYW5kbGUgKnJlc3VsdCkKK3sKKwlzdHJ1Y3QgZHJtX2FtZGdwdV9ib19saXN0X2VudHJ5ICpsaXN0OworCXVuaW9uIGRybV9hbWRncHVfYm9fbGlzdCBhcmdzOworCXVuc2lnbmVkIGk7CisJaW50IHI7CisKKwlpZiAoIW51bWJlcl9vZl9yZXNvdXJjZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogb3ZlcmZsb3cgY2hlY2sgZm9yIG11bHRpcGxpY2F0aW9uICovCisJaWYgKG51bWJlcl9vZl9yZXNvdXJjZXMgPiBVSU5UMzJfTUFYIC8gc2l6ZW9mKHN0cnVjdCBkcm1fYW1kZ3B1X2JvX2xpc3RfZW50cnkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxpc3QgPSBtYWxsb2MobnVtYmVyX29mX3Jlc291cmNlcyAqIHNpemVvZihzdHJ1Y3QgZHJtX2FtZGdwdV9ib19saXN0X2VudHJ5KSk7CisJaWYgKCFsaXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCSpyZXN1bHQgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhbWRncHVfYm9fbGlzdCkpOworCWlmICghKnJlc3VsdCkgeworCQlmcmVlKGxpc3QpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisJYXJncy5pbi5vcGVyYXRpb24gPSBBTURHUFVfQk9fTElTVF9PUF9DUkVBVEU7CisJYXJncy5pbi5ib19udW1iZXIgPSBudW1iZXJfb2ZfcmVzb3VyY2VzOworCWFyZ3MuaW4uYm9faW5mb19zaXplID0gc2l6ZW9mKHN0cnVjdCBkcm1fYW1kZ3B1X2JvX2xpc3RfZW50cnkpOworCWFyZ3MuaW4uYm9faW5mb19wdHIgPSAodWludDY0X3QpKHVpbnRwdHJfdClsaXN0OworCisJZm9yIChpID0gMDsgaSA8IG51bWJlcl9vZl9yZXNvdXJjZXM7IGkrKykgeworCQlsaXN0W2ldLmJvX2hhbmRsZSA9IHJlc291cmNlc1tpXS0+aGFuZGxlOworCQlpZiAocmVzb3VyY2VfcHJpb3MpCisJCQlsaXN0W2ldLmJvX3ByaW9yaXR5ID0gcmVzb3VyY2VfcHJpb3NbaV07CisJCWVsc2UKKwkJCWxpc3RbaV0uYm9fcHJpb3JpdHkgPSAwOworCX0KKworCXIgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGRldi0+ZmQsIERSTV9BTURHUFVfQk9fTElTVCwKKwkJCQkmYXJncywgc2l6ZW9mKGFyZ3MpKTsKKwlmcmVlKGxpc3QpOworCWlmIChyKSB7CisJCWZyZWUoKnJlc3VsdCk7CisJCXJldHVybiByOworCX0KKworCSgqcmVzdWx0KS0+ZGV2ID0gZGV2OworCSgqcmVzdWx0KS0+aGFuZGxlID0gYXJncy5vdXQubGlzdF9oYW5kbGU7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhbWRncHVfYm9fbGlzdF9kZXN0cm95KGFtZGdwdV9ib19saXN0X2hhbmRsZSBsaXN0KQoreworCXVuaW9uIGRybV9hbWRncHVfYm9fbGlzdCBhcmdzOworCWludCByOworCisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCWFyZ3MuaW4ub3BlcmF0aW9uID0gQU1ER1BVX0JPX0xJU1RfT1BfREVTVFJPWTsKKwlhcmdzLmluLmxpc3RfaGFuZGxlID0gbGlzdC0+aGFuZGxlOworCisJciA9IGRybUNvbW1hbmRXcml0ZVJlYWQobGlzdC0+ZGV2LT5mZCwgRFJNX0FNREdQVV9CT19MSVNULAorCQkJCSZhcmdzLCBzaXplb2YoYXJncykpOworCisJaWYgKCFyKQorCQlmcmVlKGxpc3QpOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBhbWRncHVfYm9fbGlzdF91cGRhdGUoYW1kZ3B1X2JvX2xpc3RfaGFuZGxlIGhhbmRsZSwKKwkJCSAgdWludDMyX3QgbnVtYmVyX29mX3Jlc291cmNlcywKKwkJCSAgYW1kZ3B1X2JvX2hhbmRsZSAqcmVzb3VyY2VzLAorCQkJICB1aW50OF90ICpyZXNvdXJjZV9wcmlvcykKK3sKKwlzdHJ1Y3QgZHJtX2FtZGdwdV9ib19saXN0X2VudHJ5ICpsaXN0OworCXVuaW9uIGRybV9hbWRncHVfYm9fbGlzdCBhcmdzOworCXVuc2lnbmVkIGk7CisJaW50IHI7CisKKwlpZiAoIW51bWJlcl9vZl9yZXNvdXJjZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogb3ZlcmZsb3cgY2hlY2sgZm9yIG11bHRpcGxpY2F0aW9uICovCisJaWYgKG51bWJlcl9vZl9yZXNvdXJjZXMgPiBVSU5UMzJfTUFYIC8gc2l6ZW9mKHN0cnVjdCBkcm1fYW1kZ3B1X2JvX2xpc3RfZW50cnkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxpc3QgPSBtYWxsb2MobnVtYmVyX29mX3Jlc291cmNlcyAqIHNpemVvZihzdHJ1Y3QgZHJtX2FtZGdwdV9ib19saXN0X2VudHJ5KSk7CisJaWYgKCFsaXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWFyZ3MuaW4ub3BlcmF0aW9uID0gQU1ER1BVX0JPX0xJU1RfT1BfVVBEQVRFOworCWFyZ3MuaW4ubGlzdF9oYW5kbGUgPSBoYW5kbGUtPmhhbmRsZTsKKwlhcmdzLmluLmJvX251bWJlciA9IG51bWJlcl9vZl9yZXNvdXJjZXM7CisJYXJncy5pbi5ib19pbmZvX3NpemUgPSBzaXplb2Yoc3RydWN0IGRybV9hbWRncHVfYm9fbGlzdF9lbnRyeSk7CisJYXJncy5pbi5ib19pbmZvX3B0ciA9ICh1aW50cHRyX3QpbGlzdDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1iZXJfb2ZfcmVzb3VyY2VzOyBpKyspIHsKKwkJbGlzdFtpXS5ib19oYW5kbGUgPSByZXNvdXJjZXNbaV0tPmhhbmRsZTsKKwkJaWYgKHJlc291cmNlX3ByaW9zKQorCQkJbGlzdFtpXS5ib19wcmlvcml0eSA9IHJlc291cmNlX3ByaW9zW2ldOworCQllbHNlCisJCQlsaXN0W2ldLmJvX3ByaW9yaXR5ID0gMDsKKwl9CisKKwlyID0gZHJtQ29tbWFuZFdyaXRlUmVhZChoYW5kbGUtPmRldi0+ZmQsIERSTV9BTURHUFVfQk9fTElTVCwKKwkJCQkmYXJncywgc2l6ZW9mKGFyZ3MpKTsKKwlmcmVlKGxpc3QpOworCXJldHVybiByOworfQorCitpbnQgYW1kZ3B1X2JvX3ZhX29wKGFtZGdwdV9ib19oYW5kbGUgYm8sCisJCSAgICAgdWludDY0X3Qgb2Zmc2V0LAorCQkgICAgIHVpbnQ2NF90IHNpemUsCisJCSAgICAgdWludDY0X3QgYWRkciwKKwkJICAgICB1aW50NjRfdCBmbGFncywKKwkJICAgICB1aW50MzJfdCBvcHMpCit7CisJYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2ID0gYm8tPmRldjsKKworCXNpemUgPSBBTElHTihzaXplLCBnZXRwYWdlc2l6ZSgpKTsKKworCXJldHVybiBhbWRncHVfYm9fdmFfb3BfcmF3KGRldiwgYm8sIG9mZnNldCwgc2l6ZSwgYWRkciwKKwkJCQkgICBBTURHUFVfVk1fUEFHRV9SRUFEQUJMRSB8CisJCQkJICAgQU1ER1BVX1ZNX1BBR0VfV1JJVEVBQkxFIHwKKwkJCQkgICBBTURHUFVfVk1fUEFHRV9FWEVDVVRBQkxFLCBvcHMpOworfQorCitpbnQgYW1kZ3B1X2JvX3ZhX29wX3JhdyhhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXYsCisJCQlhbWRncHVfYm9faGFuZGxlIGJvLAorCQkJdWludDY0X3Qgb2Zmc2V0LAorCQkJdWludDY0X3Qgc2l6ZSwKKwkJCXVpbnQ2NF90IGFkZHIsCisJCQl1aW50NjRfdCBmbGFncywKKwkJCXVpbnQzMl90IG9wcykKK3sKKwlzdHJ1Y3QgZHJtX2FtZGdwdV9nZW1fdmEgdmE7CisJaW50IHI7CisKKwlpZiAob3BzICE9IEFNREdQVV9WQV9PUF9NQVAgJiYgb3BzICE9IEFNREdQVV9WQV9PUF9VTk1BUCAmJgorCSAgICBvcHMgIT0gQU1ER1BVX1ZBX09QX1JFUExBQ0UgJiYgb3BzICE9IEFNREdQVV9WQV9PUF9DTEVBUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoJnZhLCAwLCBzaXplb2YodmEpKTsKKwl2YS5oYW5kbGUgPSBibyA/IGJvLT5oYW5kbGUgOiAwOworCXZhLm9wZXJhdGlvbiA9IG9wczsKKwl2YS5mbGFncyA9IGZsYWdzOworCXZhLnZhX2FkZHJlc3MgPSBhZGRyOworCXZhLm9mZnNldF9pbl9ibyA9IG9mZnNldDsKKwl2YS5tYXBfc2l6ZSA9IHNpemU7CisKKwlyID0gZHJtQ29tbWFuZFdyaXRlUmVhZChkZXYtPmZkLCBEUk1fQU1ER1BVX0dFTV9WQSwgJnZhLCBzaXplb2YodmEpKTsKKworCXJldHVybiByOworfQpkaWZmIC0tZ2l0IGEvYW1kZ3B1L2FtZGdwdV9jcy5jIGIvYW1kZ3B1L2FtZGdwdV9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NzdkNWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbWRncHUvYW1kZ3B1X2NzLmMKQEAgLTAsMCArMSw3MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpZmRlZiBIQVZFX0FMTE9DQV9ICisjIGluY2x1ZGUgPGFsbG9jYS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJ4Zjg2ZHJtLmgiCisjaW5jbHVkZSAiYW1kZ3B1X2RybS5oIgorI2luY2x1ZGUgImFtZGdwdV9pbnRlcm5hbC5oIgorCitzdGF0aWMgaW50IGFtZGdwdV9jc191bnJlZmVyZW5jZV9zZW0oYW1kZ3B1X3NlbWFwaG9yZV9oYW5kbGUgc2VtKTsKK3N0YXRpYyBpbnQgYW1kZ3B1X2NzX3Jlc2V0X3NlbShhbWRncHVfc2VtYXBob3JlX2hhbmRsZSBzZW0pOworCisvKioKKyAqIENyZWF0ZSBjb21tYW5kIHN1Ym1pc3Npb24gY29udGV4dAorICoKKyAqIFxwYXJhbSAgIGRldiAtIFxjIFtpbl0gYW1kZ3B1IGRldmljZSBoYW5kbGUKKyAqIFxwYXJhbSAgIGNvbnRleHQgLSBcYyBbb3V0XSBhbWRncHUgY29udGV4dCBoYW5kbGUKKyAqCisgKiBccmV0dXJuICAwIG9uIHN1Y2Nlc3Mgb3RoZXJ3aXNlIFBPU0lYIEVycm9yIGNvZGUKKyovCitpbnQgYW1kZ3B1X2NzX2N0eF9jcmVhdGUoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LAorCQkJIGFtZGdwdV9jb250ZXh0X2hhbmRsZSAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgYW1kZ3B1X2NvbnRleHQgKmdwdV9jb250ZXh0OworCXVuaW9uIGRybV9hbWRncHVfY3R4IGFyZ3M7CisJaW50IGksIGosIGs7CisJaW50IHI7CisKKwlpZiAoIWRldiB8fCAhY29udGV4dCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlncHVfY29udGV4dCA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGFtZGdwdV9jb250ZXh0KSk7CisJaWYgKCFncHVfY29udGV4dCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlncHVfY29udGV4dC0+ZGV2ID0gZGV2OworCisJciA9IHB0aHJlYWRfbXV0ZXhfaW5pdCgmZ3B1X2NvbnRleHQtPnNlcXVlbmNlX211dGV4LCBOVUxMKTsKKwlpZiAocikKKwkJZ290byBlcnJvcjsKKworCS8qIENyZWF0ZSB0aGUgY29udGV4dCAqLworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKwlhcmdzLmluLm9wID0gQU1ER1BVX0NUWF9PUF9BTExPQ19DVFg7CisJciA9IGRybUNvbW1hbmRXcml0ZVJlYWQoZGV2LT5mZCwgRFJNX0FNREdQVV9DVFgsICZhcmdzLCBzaXplb2YoYXJncykpOworCWlmIChyKQorCQlnb3RvIGVycm9yOworCisJZ3B1X2NvbnRleHQtPmlkID0gYXJncy5vdXQuYWxsb2MuY3R4X2lkOworCWZvciAoaSA9IDA7IGkgPCBBTURHUFVfSFdfSVBfTlVNOyBpKyspCisJCWZvciAoaiA9IDA7IGogPCBBTURHUFVfSFdfSVBfSU5TVEFOQ0VfTUFYX0NPVU5UOyBqKyspCisJCQlmb3IgKGsgPSAwOyBrIDwgQU1ER1BVX0NTX01BWF9SSU5HUzsgaysrKQorCQkJCWxpc3RfaW5pdGhlYWQoJmdwdV9jb250ZXh0LT5zZW1fbGlzdFtpXVtqXVtrXSk7CisJKmNvbnRleHQgPSAoYW1kZ3B1X2NvbnRleHRfaGFuZGxlKWdwdV9jb250ZXh0OworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmZ3B1X2NvbnRleHQtPnNlcXVlbmNlX211dGV4KTsKKwlmcmVlKGdwdV9jb250ZXh0KTsKKwlyZXR1cm4gcjsKK30KKworLyoqCisgKiBSZWxlYXNlIGNvbW1hbmQgc3VibWlzc2lvbiBjb250ZXh0CisgKgorICogXHBhcmFtICAgZGV2IC0gXGMgW2luXSBhbWRncHUgZGV2aWNlIGhhbmRsZQorICogXHBhcmFtICAgY29udGV4dCAtIFxjIFtpbl0gYW1kZ3B1IGNvbnRleHQgaGFuZGxlCisgKgorICogXHJldHVybiAgMCBvbiBzdWNjZXNzIG90aGVyd2lzZSBQT1NJWCBFcnJvciBjb2RlCisqLworaW50IGFtZGdwdV9jc19jdHhfZnJlZShhbWRncHVfY29udGV4dF9oYW5kbGUgY29udGV4dCkKK3sKKwl1bmlvbiBkcm1fYW1kZ3B1X2N0eCBhcmdzOworCWludCBpLCBqLCBrOworCWludCByOworCisJaWYgKCFjb250ZXh0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmY29udGV4dC0+c2VxdWVuY2VfbXV0ZXgpOworCisJLyogbm93IGRlYWwgd2l0aCBrZXJuZWwgc2lkZSAqLworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKwlhcmdzLmluLm9wID0gQU1ER1BVX0NUWF9PUF9GUkVFX0NUWDsKKwlhcmdzLmluLmN0eF9pZCA9IGNvbnRleHQtPmlkOworCXIgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGNvbnRleHQtPmRldi0+ZmQsIERSTV9BTURHUFVfQ1RYLAorCQkJCSZhcmdzLCBzaXplb2YoYXJncykpOworCWZvciAoaSA9IDA7IGkgPCBBTURHUFVfSFdfSVBfTlVNOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IEFNREdQVV9IV19JUF9JTlNUQU5DRV9NQVhfQ09VTlQ7IGorKykgeworCQkJZm9yIChrID0gMDsgayA8IEFNREdQVV9DU19NQVhfUklOR1M7IGsrKykgeworCQkJCWFtZGdwdV9zZW1hcGhvcmVfaGFuZGxlIHNlbTsKKwkJCQlMSVNUX0ZPUl9FQUNIX0VOVFJZKHNlbSwgJmNvbnRleHQtPnNlbV9saXN0W2ldW2pdW2tdLCBsaXN0KSB7CisJCQkJCWxpc3RfZGVsKCZzZW0tPmxpc3QpOworCQkJCQlhbWRncHVfY3NfcmVzZXRfc2VtKHNlbSk7CisJCQkJCWFtZGdwdV9jc191bnJlZmVyZW5jZV9zZW0oc2VtKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZnJlZShjb250ZXh0KTsKKworCXJldHVybiByOworfQorCitpbnQgYW1kZ3B1X2NzX3F1ZXJ5X3Jlc2V0X3N0YXRlKGFtZGdwdV9jb250ZXh0X2hhbmRsZSBjb250ZXh0LAorCQkJCXVpbnQzMl90ICpzdGF0ZSwgdWludDMyX3QgKmhhbmdzKQoreworCXVuaW9uIGRybV9hbWRncHVfY3R4IGFyZ3M7CisJaW50IHI7CisKKwlpZiAoIWNvbnRleHQpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCWFyZ3MuaW4ub3AgPSBBTURHUFVfQ1RYX09QX1FVRVJZX1NUQVRFOworCWFyZ3MuaW4uY3R4X2lkID0gY29udGV4dC0+aWQ7CisJciA9IGRybUNvbW1hbmRXcml0ZVJlYWQoY29udGV4dC0+ZGV2LT5mZCwgRFJNX0FNREdQVV9DVFgsCisJCQkJJmFyZ3MsIHNpemVvZihhcmdzKSk7CisJaWYgKCFyKSB7CisJCSpzdGF0ZSA9IGFyZ3Mub3V0LnN0YXRlLnJlc2V0X3N0YXR1czsKKwkJKmhhbmdzID0gYXJncy5vdXQuc3RhdGUuaGFuZ3M7CisJfQorCXJldHVybiByOworfQorCisvKioKKyAqIFN1Ym1pdCBjb21tYW5kIHRvIGtlcm5lbCBEUk0KKyAqIFxwYXJhbSAgIGRldiAtIFxjIFtpbl0gIERldmljZSBoYW5kbGUKKyAqIFxwYXJhbSAgIGNvbnRleHQgLSBcYyBbaW5dICBHUFUgQ29udGV4dAorICogXHBhcmFtICAgaWJzX3JlcXVlc3QgLSBcYyBbaW5dICBQb2ludGVyIHRvIHN1Ym1pc3Npb24gcmVxdWVzdHMKKyAqIFxwYXJhbSAgIGZlbmNlIC0gXGMgW291dF0gcmV0dXJuIGZlbmNlIGZvciB0aGlzIHN1Ym1pc3Npb24KKyAqCisgKiBccmV0dXJuICAwIG9uIHN1Y2Nlc3Mgb3RoZXJ3aXNlIFBPU0lYIEVycm9yIGNvZGUKKyAqIFxzYSBhbWRncHVfY3Nfc3VibWl0KCkKKyovCitzdGF0aWMgaW50IGFtZGdwdV9jc19zdWJtaXRfb25lKGFtZGdwdV9jb250ZXh0X2hhbmRsZSBjb250ZXh0LAorCQkJCXN0cnVjdCBhbWRncHVfY3NfcmVxdWVzdCAqaWJzX3JlcXVlc3QpCit7CisJdW5pb24gZHJtX2FtZGdwdV9jcyBjczsKKwl1aW50NjRfdCAqY2h1bmtfYXJyYXk7CisJc3RydWN0IGRybV9hbWRncHVfY3NfY2h1bmsgKmNodW5rczsKKwlzdHJ1Y3QgZHJtX2FtZGdwdV9jc19jaHVua19kYXRhICpjaHVua19kYXRhOworCXN0cnVjdCBkcm1fYW1kZ3B1X2NzX2NodW5rX2RlcCAqZGVwZW5kZW5jaWVzID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2FtZGdwdV9jc19jaHVua19kZXAgKnNlbV9kZXBlbmRlbmNpZXMgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnNlbV9saXN0OworCWFtZGdwdV9zZW1hcGhvcmVfaGFuZGxlIHNlbSwgdG1wOworCXVpbnQzMl90IGksIHNpemUsIHNlbV9jb3VudCA9IDA7CisJYm9vbCB1c2VyX2ZlbmNlOworCWludCByID0gMDsKKworCWlmIChpYnNfcmVxdWVzdC0+aXBfdHlwZSA+PSBBTURHUFVfSFdfSVBfTlVNKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaWJzX3JlcXVlc3QtPnJpbmcgPj0gQU1ER1BVX0NTX01BWF9SSU5HUykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGlic19yZXF1ZXN0LT5udW1iZXJfb2ZfaWJzID4gQU1ER1BVX0NTX01BWF9JQlNfUEVSX1NVQk1JVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGlic19yZXF1ZXN0LT5udW1iZXJfb2ZfaWJzID09IDApIHsKKwkJaWJzX3JlcXVlc3QtPnNlcV9ubyA9IEFNREdQVV9OVUxMX1NVQk1JVF9TRVE7CisJCXJldHVybiAwOworCX0KKwl1c2VyX2ZlbmNlID0gKGlic19yZXF1ZXN0LT5mZW5jZV9pbmZvLmhhbmRsZSAhPSBOVUxMKTsKKworCXNpemUgPSBpYnNfcmVxdWVzdC0+bnVtYmVyX29mX2licyArICh1c2VyX2ZlbmNlID8gMiA6IDEpICsgMTsKKworCWNodW5rX2FycmF5ID0gYWxsb2NhKHNpemVvZih1aW50NjRfdCkgKiBzaXplKTsKKwljaHVua3MgPSBhbGxvY2Eoc2l6ZW9mKHN0cnVjdCBkcm1fYW1kZ3B1X2NzX2NodW5rKSAqIHNpemUpOworCisJc2l6ZSA9IGlic19yZXF1ZXN0LT5udW1iZXJfb2ZfaWJzICsgKHVzZXJfZmVuY2UgPyAxIDogMCk7CisKKwljaHVua19kYXRhID0gYWxsb2NhKHNpemVvZihzdHJ1Y3QgZHJtX2FtZGdwdV9jc19jaHVua19kYXRhKSAqIHNpemUpOworCisJbWVtc2V0KCZjcywgMCwgc2l6ZW9mKGNzKSk7CisJY3MuaW4uY2h1bmtzID0gKHVpbnQ2NF90KSh1aW50cHRyX3QpY2h1bmtfYXJyYXk7CisJY3MuaW4uY3R4X2lkID0gY29udGV4dC0+aWQ7CisJaWYgKGlic19yZXF1ZXN0LT5yZXNvdXJjZXMpCisJCWNzLmluLmJvX2xpc3RfaGFuZGxlID0gaWJzX3JlcXVlc3QtPnJlc291cmNlcy0+aGFuZGxlOworCWNzLmluLm51bV9jaHVua3MgPSBpYnNfcmVxdWVzdC0+bnVtYmVyX29mX2liczsKKwkvKiBJQiBjaHVua3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaWJzX3JlcXVlc3QtPm51bWJlcl9vZl9pYnM7IGkrKykgeworCQlzdHJ1Y3QgYW1kZ3B1X2NzX2liX2luZm8gKmliOworCQljaHVua19hcnJheVtpXSA9ICh1aW50NjRfdCkodWludHB0cl90KSZjaHVua3NbaV07CisJCWNodW5rc1tpXS5jaHVua19pZCA9IEFNREdQVV9DSFVOS19JRF9JQjsKKwkJY2h1bmtzW2ldLmxlbmd0aF9kdyA9IHNpemVvZihzdHJ1Y3QgZHJtX2FtZGdwdV9jc19jaHVua19pYikgLyA0OworCQljaHVua3NbaV0uY2h1bmtfZGF0YSA9ICh1aW50NjRfdCkodWludHB0cl90KSZjaHVua19kYXRhW2ldOworCisJCWliID0gJmlic19yZXF1ZXN0LT5pYnNbaV07CisKKwkJY2h1bmtfZGF0YVtpXS5pYl9kYXRhLl9wYWQgPSAwOworCQljaHVua19kYXRhW2ldLmliX2RhdGEudmFfc3RhcnQgPSBpYi0+aWJfbWNfYWRkcmVzczsKKwkJY2h1bmtfZGF0YVtpXS5pYl9kYXRhLmliX2J5dGVzID0gaWItPnNpemUgKiA0OworCQljaHVua19kYXRhW2ldLmliX2RhdGEuaXBfdHlwZSA9IGlic19yZXF1ZXN0LT5pcF90eXBlOworCQljaHVua19kYXRhW2ldLmliX2RhdGEuaXBfaW5zdGFuY2UgPSBpYnNfcmVxdWVzdC0+aXBfaW5zdGFuY2U7CisJCWNodW5rX2RhdGFbaV0uaWJfZGF0YS5yaW5nID0gaWJzX3JlcXVlc3QtPnJpbmc7CisJCWNodW5rX2RhdGFbaV0uaWJfZGF0YS5mbGFncyA9IGliLT5mbGFnczsKKwl9CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmNvbnRleHQtPnNlcXVlbmNlX211dGV4KTsKKworCWlmICh1c2VyX2ZlbmNlKSB7CisJCWkgPSBjcy5pbi5udW1fY2h1bmtzKys7CisKKwkJLyogZmVuY2UgY2h1bmsgKi8KKwkJY2h1bmtfYXJyYXlbaV0gPSAodWludDY0X3QpKHVpbnRwdHJfdCkmY2h1bmtzW2ldOworCQljaHVua3NbaV0uY2h1bmtfaWQgPSBBTURHUFVfQ0hVTktfSURfRkVOQ0U7CisJCWNodW5rc1tpXS5sZW5ndGhfZHcgPSBzaXplb2Yoc3RydWN0IGRybV9hbWRncHVfY3NfY2h1bmtfZmVuY2UpIC8gNDsKKwkJY2h1bmtzW2ldLmNodW5rX2RhdGEgPSAodWludDY0X3QpKHVpbnRwdHJfdCkmY2h1bmtfZGF0YVtpXTsKKworCQkvKiBmZW5jZSBibyBoYW5kbGUgKi8KKwkJY2h1bmtfZGF0YVtpXS5mZW5jZV9kYXRhLmhhbmRsZSA9IGlic19yZXF1ZXN0LT5mZW5jZV9pbmZvLmhhbmRsZS0+aGFuZGxlOworCQkvKiBvZmZzZXQgKi8KKwkJY2h1bmtfZGF0YVtpXS5mZW5jZV9kYXRhLm9mZnNldCA9IAorCQkJaWJzX3JlcXVlc3QtPmZlbmNlX2luZm8ub2Zmc2V0ICogc2l6ZW9mKHVpbnQ2NF90KTsKKwl9CisKKwlpZiAoaWJzX3JlcXVlc3QtPm51bWJlcl9vZl9kZXBlbmRlbmNpZXMpIHsKKwkJZGVwZW5kZW5jaWVzID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgZHJtX2FtZGdwdV9jc19jaHVua19kZXApICoKKwkJCWlic19yZXF1ZXN0LT5udW1iZXJfb2ZfZGVwZW5kZW5jaWVzKTsKKwkJaWYgKCFkZXBlbmRlbmNpZXMpIHsKKwkJCXIgPSAtRU5PTUVNOworCQkJZ290byBlcnJvcl91bmxvY2s7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgaWJzX3JlcXVlc3QtPm51bWJlcl9vZl9kZXBlbmRlbmNpZXM7ICsraSkgeworCQkJc3RydWN0IGFtZGdwdV9jc19mZW5jZSAqaW5mbyA9ICZpYnNfcmVxdWVzdC0+ZGVwZW5kZW5jaWVzW2ldOworCQkJc3RydWN0IGRybV9hbWRncHVfY3NfY2h1bmtfZGVwICpkZXAgPSAmZGVwZW5kZW5jaWVzW2ldOworCQkJZGVwLT5pcF90eXBlID0gaW5mby0+aXBfdHlwZTsKKwkJCWRlcC0+aXBfaW5zdGFuY2UgPSBpbmZvLT5pcF9pbnN0YW5jZTsKKwkJCWRlcC0+cmluZyA9IGluZm8tPnJpbmc7CisJCQlkZXAtPmN0eF9pZCA9IGluZm8tPmNvbnRleHQtPmlkOworCQkJZGVwLT5oYW5kbGUgPSBpbmZvLT5mZW5jZTsKKwkJfQorCisJCWkgPSBjcy5pbi5udW1fY2h1bmtzKys7CisKKwkJLyogZGVwZW5kZW5jaWVzIGNodW5rICovCisJCWNodW5rX2FycmF5W2ldID0gKHVpbnQ2NF90KSh1aW50cHRyX3QpJmNodW5rc1tpXTsKKwkJY2h1bmtzW2ldLmNodW5rX2lkID0gQU1ER1BVX0NIVU5LX0lEX0RFUEVOREVOQ0lFUzsKKwkJY2h1bmtzW2ldLmxlbmd0aF9kdyA9IHNpemVvZihzdHJ1Y3QgZHJtX2FtZGdwdV9jc19jaHVua19kZXApIC8gNAorCQkJKiBpYnNfcmVxdWVzdC0+bnVtYmVyX29mX2RlcGVuZGVuY2llczsKKwkJY2h1bmtzW2ldLmNodW5rX2RhdGEgPSAodWludDY0X3QpKHVpbnRwdHJfdClkZXBlbmRlbmNpZXM7CisJfQorCisJc2VtX2xpc3QgPSAmY29udGV4dC0+c2VtX2xpc3RbaWJzX3JlcXVlc3QtPmlwX3R5cGVdW2lic19yZXF1ZXN0LT5pcF9pbnN0YW5jZV1baWJzX3JlcXVlc3QtPnJpbmddOworCUxJU1RfRk9SX0VBQ0hfRU5UUlkoc2VtLCBzZW1fbGlzdCwgbGlzdCkKKwkJc2VtX2NvdW50Kys7CisJaWYgKHNlbV9jb3VudCkgeworCQlzZW1fZGVwZW5kZW5jaWVzID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgZHJtX2FtZGdwdV9jc19jaHVua19kZXApICogc2VtX2NvdW50KTsKKwkJaWYgKCFzZW1fZGVwZW5kZW5jaWVzKSB7CisJCQlyID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyb3JfdW5sb2NrOworCQl9CisJCXNlbV9jb3VudCA9IDA7CisJCUxJU1RfRk9SX0VBQ0hfRU5UUllfU0FGRShzZW0sIHRtcCwgc2VtX2xpc3QsIGxpc3QpIHsKKwkJCXN0cnVjdCBhbWRncHVfY3NfZmVuY2UgKmluZm8gPSAmc2VtLT5zaWduYWxfZmVuY2U7CisJCQlzdHJ1Y3QgZHJtX2FtZGdwdV9jc19jaHVua19kZXAgKmRlcCA9ICZzZW1fZGVwZW5kZW5jaWVzW3NlbV9jb3VudCsrXTsKKwkJCWRlcC0+aXBfdHlwZSA9IGluZm8tPmlwX3R5cGU7CisJCQlkZXAtPmlwX2luc3RhbmNlID0gaW5mby0+aXBfaW5zdGFuY2U7CisJCQlkZXAtPnJpbmcgPSBpbmZvLT5yaW5nOworCQkJZGVwLT5jdHhfaWQgPSBpbmZvLT5jb250ZXh0LT5pZDsKKwkJCWRlcC0+aGFuZGxlID0gaW5mby0+ZmVuY2U7CisKKwkJCWxpc3RfZGVsKCZzZW0tPmxpc3QpOworCQkJYW1kZ3B1X2NzX3Jlc2V0X3NlbShzZW0pOworCQkJYW1kZ3B1X2NzX3VucmVmZXJlbmNlX3NlbShzZW0pOworCQl9CisJCWkgPSBjcy5pbi5udW1fY2h1bmtzKys7CisKKwkJLyogZGVwZW5kZW5jaWVzIGNodW5rICovCisJCWNodW5rX2FycmF5W2ldID0gKHVpbnQ2NF90KSh1aW50cHRyX3QpJmNodW5rc1tpXTsKKwkJY2h1bmtzW2ldLmNodW5rX2lkID0gQU1ER1BVX0NIVU5LX0lEX0RFUEVOREVOQ0lFUzsKKwkJY2h1bmtzW2ldLmxlbmd0aF9kdyA9IHNpemVvZihzdHJ1Y3QgZHJtX2FtZGdwdV9jc19jaHVua19kZXApIC8gNCAqIHNlbV9jb3VudDsKKwkJY2h1bmtzW2ldLmNodW5rX2RhdGEgPSAodWludDY0X3QpKHVpbnRwdHJfdClzZW1fZGVwZW5kZW5jaWVzOworCX0KKworCXIgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGNvbnRleHQtPmRldi0+ZmQsIERSTV9BTURHUFVfQ1MsCisJCQkJJmNzLCBzaXplb2YoY3MpKTsKKwlpZiAocikKKwkJZ290byBlcnJvcl91bmxvY2s7CisKKwlpYnNfcmVxdWVzdC0+c2VxX25vID0gY3Mub3V0LmhhbmRsZTsKKwljb250ZXh0LT5sYXN0X3NlcVtpYnNfcmVxdWVzdC0+aXBfdHlwZV1baWJzX3JlcXVlc3QtPmlwX2luc3RhbmNlXVtpYnNfcmVxdWVzdC0+cmluZ10gPSBpYnNfcmVxdWVzdC0+c2VxX25vOworZXJyb3JfdW5sb2NrOgorCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjb250ZXh0LT5zZXF1ZW5jZV9tdXRleCk7CisJZnJlZShkZXBlbmRlbmNpZXMpOworCWZyZWUoc2VtX2RlcGVuZGVuY2llcyk7CisJcmV0dXJuIHI7Cit9CisKK2ludCBhbWRncHVfY3Nfc3VibWl0KGFtZGdwdV9jb250ZXh0X2hhbmRsZSBjb250ZXh0LAorCQkgICAgIHVpbnQ2NF90IGZsYWdzLAorCQkgICAgIHN0cnVjdCBhbWRncHVfY3NfcmVxdWVzdCAqaWJzX3JlcXVlc3QsCisJCSAgICAgdWludDMyX3QgbnVtYmVyX29mX3JlcXVlc3RzKQoreworCXVpbnQzMl90IGk7CisJaW50IHI7CisKKwlpZiAoIWNvbnRleHQgfHwgIWlic19yZXF1ZXN0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXIgPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1iZXJfb2ZfcmVxdWVzdHM7IGkrKykgeworCQlyID0gYW1kZ3B1X2NzX3N1Ym1pdF9vbmUoY29udGV4dCwgaWJzX3JlcXVlc3QpOworCQlpZiAocikKKwkJCWJyZWFrOworCQlpYnNfcmVxdWVzdCsrOworCX0KKworCXJldHVybiByOworfQorCisvKioKKyAqIENhbGN1bGF0ZSBhYnNvbHV0ZSB0aW1lb3V0LgorICoKKyAqIFxwYXJhbSAgIHRpbWVvdXQgLSBcYyBbaW5dIHRpbWVvdXQgaW4gbmFub3NlY29uZHMuCisgKgorICogXHJldHVybiAgYWJzb2x1dGUgdGltZW91dCBpbiBuYW5vc2Vjb25kcworKi8KK2RybV9wcml2YXRlIHVpbnQ2NF90IGFtZGdwdV9jc19jYWxjdWxhdGVfdGltZW91dCh1aW50NjRfdCB0aW1lb3V0KQoreworCWludCByOworCisJaWYgKHRpbWVvdXQgIT0gQU1ER1BVX1RJTUVPVVRfSU5GSU5JVEUpIHsKKwkJc3RydWN0IHRpbWVzcGVjIGN1cnJlbnQ7CisJCXVpbnQ2NF90IGN1cnJlbnRfbnM7CisJCXIgPSBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmN1cnJlbnQpOworCQlpZiAocikgeworCQkJZnByaW50ZihzdGRlcnIsICJjbG9ja19nZXR0aW1lKCkgcmV0dXJuZWQgZXJyb3IgKCVkKSEiLCBlcnJubyk7CisJCQlyZXR1cm4gQU1ER1BVX1RJTUVPVVRfSU5GSU5JVEU7CisJCX0KKworCQljdXJyZW50X25zID0gKCh1aW50NjRfdCljdXJyZW50LnR2X3NlYykgKiAxMDAwMDAwMDAwdWxsOworCQljdXJyZW50X25zICs9IGN1cnJlbnQudHZfbnNlYzsKKwkJdGltZW91dCArPSBjdXJyZW50X25zOworCQlpZiAodGltZW91dCA8IGN1cnJlbnRfbnMpCisJCQl0aW1lb3V0ID0gQU1ER1BVX1RJTUVPVVRfSU5GSU5JVEU7CisJfQorCXJldHVybiB0aW1lb3V0OworfQorCitzdGF0aWMgaW50IGFtZGdwdV9pb2N0bF93YWl0X2NzKGFtZGdwdV9jb250ZXh0X2hhbmRsZSBjb250ZXh0LAorCQkJCXVuc2lnbmVkIGlwLAorCQkJCXVuc2lnbmVkIGlwX2luc3RhbmNlLAorCQkJCXVpbnQzMl90IHJpbmcsCisJCQkJdWludDY0X3QgaGFuZGxlLAorCQkJCXVpbnQ2NF90IHRpbWVvdXRfbnMsCisJCQkJdWludDY0X3QgZmxhZ3MsCisJCQkJYm9vbCAqYnVzeSkKK3sKKwlhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXYgPSBjb250ZXh0LT5kZXY7CisJdW5pb24gZHJtX2FtZGdwdV93YWl0X2NzIGFyZ3M7CisJaW50IHI7CisKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisJYXJncy5pbi5oYW5kbGUgPSBoYW5kbGU7CisJYXJncy5pbi5pcF90eXBlID0gaXA7CisJYXJncy5pbi5pcF9pbnN0YW5jZSA9IGlwX2luc3RhbmNlOworCWFyZ3MuaW4ucmluZyA9IHJpbmc7CisJYXJncy5pbi5jdHhfaWQgPSBjb250ZXh0LT5pZDsKKworCWlmIChmbGFncyAmIEFNREdQVV9RVUVSWV9GRU5DRV9USU1FT1VUX0lTX0FCU09MVVRFKQorCQlhcmdzLmluLnRpbWVvdXQgPSB0aW1lb3V0X25zOworCWVsc2UKKwkJYXJncy5pbi50aW1lb3V0ID0gYW1kZ3B1X2NzX2NhbGN1bGF0ZV90aW1lb3V0KHRpbWVvdXRfbnMpOworCisJciA9IGRybUlvY3RsKGRldi0+ZmQsIERSTV9JT0NUTF9BTURHUFVfV0FJVF9DUywgJmFyZ3MpOworCWlmIChyKQorCQlyZXR1cm4gLWVycm5vOworCisJKmJ1c3kgPSBhcmdzLm91dC5zdGF0dXM7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhbWRncHVfY3NfcXVlcnlfZmVuY2Vfc3RhdHVzKHN0cnVjdCBhbWRncHVfY3NfZmVuY2UgKmZlbmNlLAorCQkJCSB1aW50NjRfdCB0aW1lb3V0X25zLAorCQkJCSB1aW50NjRfdCBmbGFncywKKwkJCQkgdWludDMyX3QgKmV4cGlyZWQpCit7CisJYm9vbCBidXN5ID0gdHJ1ZTsKKwlpbnQgcjsKKworCWlmICghZmVuY2UgfHwgIWV4cGlyZWQgfHwgIWZlbmNlLT5jb250ZXh0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZmVuY2UtPmlwX3R5cGUgPj0gQU1ER1BVX0hXX0lQX05VTSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGZlbmNlLT5yaW5nID49IEFNREdQVV9DU19NQVhfUklOR1MpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChmZW5jZS0+ZmVuY2UgPT0gQU1ER1BVX05VTExfU1VCTUlUX1NFUSkgeworCQkqZXhwaXJlZCA9IHRydWU7CisJCXJldHVybiAwOworCX0KKworCSpleHBpcmVkID0gZmFsc2U7CisKKwlyID0gYW1kZ3B1X2lvY3RsX3dhaXRfY3MoZmVuY2UtPmNvbnRleHQsIGZlbmNlLT5pcF90eXBlLAorCQkJCWZlbmNlLT5pcF9pbnN0YW5jZSwgZmVuY2UtPnJpbmcsCisJCQkgICAgICAgCWZlbmNlLT5mZW5jZSwgdGltZW91dF9ucywgZmxhZ3MsICZidXN5KTsKKworCWlmICghciAmJiAhYnVzeSkKKwkJKmV4cGlyZWQgPSB0cnVlOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgYW1kZ3B1X2lvY3RsX3dhaXRfZmVuY2VzKHN0cnVjdCBhbWRncHVfY3NfZmVuY2UgKmZlbmNlcywKKwkJCQkgICAgdWludDMyX3QgZmVuY2VfY291bnQsCisJCQkJICAgIGJvb2wgd2FpdF9hbGwsCisJCQkJICAgIHVpbnQ2NF90IHRpbWVvdXRfbnMsCisJCQkJICAgIHVpbnQzMl90ICpzdGF0dXMsCisJCQkJICAgIHVpbnQzMl90ICpmaXJzdCkKK3sKKwlzdHJ1Y3QgZHJtX2FtZGdwdV9mZW5jZSAqZHJtX2ZlbmNlczsKKwlhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXYgPSBmZW5jZXNbMF0uY29udGV4dC0+ZGV2OworCXVuaW9uIGRybV9hbWRncHVfd2FpdF9mZW5jZXMgYXJnczsKKwlpbnQgcjsKKwl1aW50MzJfdCBpOworCisJZHJtX2ZlbmNlcyA9IGFsbG9jYShzaXplb2Yoc3RydWN0IGRybV9hbWRncHVfZmVuY2UpICogZmVuY2VfY291bnQpOworCWZvciAoaSA9IDA7IGkgPCBmZW5jZV9jb3VudDsgaSsrKSB7CisJCWRybV9mZW5jZXNbaV0uY3R4X2lkID0gZmVuY2VzW2ldLmNvbnRleHQtPmlkOworCQlkcm1fZmVuY2VzW2ldLmlwX3R5cGUgPSBmZW5jZXNbaV0uaXBfdHlwZTsKKwkJZHJtX2ZlbmNlc1tpXS5pcF9pbnN0YW5jZSA9IGZlbmNlc1tpXS5pcF9pbnN0YW5jZTsKKwkJZHJtX2ZlbmNlc1tpXS5yaW5nID0gZmVuY2VzW2ldLnJpbmc7CisJCWRybV9mZW5jZXNbaV0uc2VxX25vID0gZmVuY2VzW2ldLmZlbmNlOworCX0KKworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKwlhcmdzLmluLmZlbmNlcyA9ICh1aW50NjRfdCkodWludHB0cl90KWRybV9mZW5jZXM7CisJYXJncy5pbi5mZW5jZV9jb3VudCA9IGZlbmNlX2NvdW50OworCWFyZ3MuaW4ud2FpdF9hbGwgPSB3YWl0X2FsbDsKKwlhcmdzLmluLnRpbWVvdXRfbnMgPSBhbWRncHVfY3NfY2FsY3VsYXRlX3RpbWVvdXQodGltZW91dF9ucyk7CisKKwlyID0gZHJtSW9jdGwoZGV2LT5mZCwgRFJNX0lPQ1RMX0FNREdQVV9XQUlUX0ZFTkNFUywgJmFyZ3MpOworCWlmIChyKQorCQlyZXR1cm4gLWVycm5vOworCisJKnN0YXR1cyA9IGFyZ3Mub3V0LnN0YXR1czsKKworCWlmIChmaXJzdCkKKwkJKmZpcnN0ID0gYXJncy5vdXQuZmlyc3Rfc2lnbmFsZWQ7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGFtZGdwdV9jc193YWl0X2ZlbmNlcyhzdHJ1Y3QgYW1kZ3B1X2NzX2ZlbmNlICpmZW5jZXMsCisJCQkgIHVpbnQzMl90IGZlbmNlX2NvdW50LAorCQkJICBib29sIHdhaXRfYWxsLAorCQkJICB1aW50NjRfdCB0aW1lb3V0X25zLAorCQkJICB1aW50MzJfdCAqc3RhdHVzLAorCQkJICB1aW50MzJfdCAqZmlyc3QpCit7CisJdWludDMyX3QgaTsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICghZmVuY2VzIHx8ICFzdGF0dXMgfHwgIWZlbmNlX2NvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBmZW5jZV9jb3VudDsgaSsrKSB7CisJCWlmIChOVUxMID09IGZlbmNlc1tpXS5jb250ZXh0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChmZW5jZXNbaV0uaXBfdHlwZSA+PSBBTURHUFVfSFdfSVBfTlVNKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChmZW5jZXNbaV0ucmluZyA+PSBBTURHUFVfQ1NfTUFYX1JJTkdTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJKnN0YXR1cyA9IDA7CisKKwlyZXR1cm4gYW1kZ3B1X2lvY3RsX3dhaXRfZmVuY2VzKGZlbmNlcywgZmVuY2VfY291bnQsIHdhaXRfYWxsLAorCQkJCQl0aW1lb3V0X25zLCBzdGF0dXMsIGZpcnN0KTsKK30KKworaW50IGFtZGdwdV9jc19jcmVhdGVfc2VtYXBob3JlKGFtZGdwdV9zZW1hcGhvcmVfaGFuZGxlICpzZW0pCit7CisJc3RydWN0IGFtZGdwdV9zZW1hcGhvcmUgKmdwdV9zZW1hcGhvcmU7CisKKwlpZiAoIXNlbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlncHVfc2VtYXBob3JlID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgYW1kZ3B1X3NlbWFwaG9yZSkpOworCWlmICghZ3B1X3NlbWFwaG9yZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhdG9taWNfc2V0KCZncHVfc2VtYXBob3JlLT5yZWZjb3VudCwgMSk7CisJKnNlbSA9IGdwdV9zZW1hcGhvcmU7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGFtZGdwdV9jc19zaWduYWxfc2VtYXBob3JlKGFtZGdwdV9jb250ZXh0X2hhbmRsZSBjdHgsCisJCQkgICAgICAgdWludDMyX3QgaXBfdHlwZSwKKwkJCSAgICAgICB1aW50MzJfdCBpcF9pbnN0YW5jZSwKKwkJCSAgICAgICB1aW50MzJfdCByaW5nLAorCQkJICAgICAgIGFtZGdwdV9zZW1hcGhvcmVfaGFuZGxlIHNlbSkKK3sKKwlpZiAoIWN0eCB8fCAhc2VtKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaXBfdHlwZSA+PSBBTURHUFVfSFdfSVBfTlVNKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocmluZyA+PSBBTURHUFVfQ1NfTUFYX1JJTkdTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBzZW0gaGFzIGJlZW4gc2lnbmFsZWQgKi8KKwlpZiAoc2VtLT5zaWduYWxfZmVuY2UuY29udGV4dCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHRocmVhZF9tdXRleF9sb2NrKCZjdHgtPnNlcXVlbmNlX211dGV4KTsKKwlzZW0tPnNpZ25hbF9mZW5jZS5jb250ZXh0ID0gY3R4OworCXNlbS0+c2lnbmFsX2ZlbmNlLmlwX3R5cGUgPSBpcF90eXBlOworCXNlbS0+c2lnbmFsX2ZlbmNlLmlwX2luc3RhbmNlID0gaXBfaW5zdGFuY2U7CisJc2VtLT5zaWduYWxfZmVuY2UucmluZyA9IHJpbmc7CisJc2VtLT5zaWduYWxfZmVuY2UuZmVuY2UgPSBjdHgtPmxhc3Rfc2VxW2lwX3R5cGVdW2lwX2luc3RhbmNlXVtyaW5nXTsKKwl1cGRhdGVfcmVmZXJlbmNlcyhOVUxMLCAmc2VtLT5yZWZjb3VudCk7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmN0eC0+c2VxdWVuY2VfbXV0ZXgpOworCXJldHVybiAwOworfQorCitpbnQgYW1kZ3B1X2NzX3dhaXRfc2VtYXBob3JlKGFtZGdwdV9jb250ZXh0X2hhbmRsZSBjdHgsCisJCQkgICAgIHVpbnQzMl90IGlwX3R5cGUsCisJCQkgICAgIHVpbnQzMl90IGlwX2luc3RhbmNlLAorCQkJICAgICB1aW50MzJfdCByaW5nLAorCQkJICAgICBhbWRncHVfc2VtYXBob3JlX2hhbmRsZSBzZW0pCit7CisJaWYgKCFjdHggfHwgIXNlbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGlwX3R5cGUgPj0gQU1ER1BVX0hXX0lQX05VTSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJpbmcgPj0gQU1ER1BVX0NTX01BWF9SSU5HUykKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogbXVzdCBzaWduYWwgZmlyc3QgKi8KKwlpZiAoIXNlbS0+c2lnbmFsX2ZlbmNlLmNvbnRleHQpCisJCXJldHVybiAtRUlOVkFMOworCisJcHRocmVhZF9tdXRleF9sb2NrKCZjdHgtPnNlcXVlbmNlX211dGV4KTsKKwlsaXN0X2FkZCgmc2VtLT5saXN0LCAmY3R4LT5zZW1fbGlzdFtpcF90eXBlXVtpcF9pbnN0YW5jZV1bcmluZ10pOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjdHgtPnNlcXVlbmNlX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWRncHVfY3NfcmVzZXRfc2VtKGFtZGdwdV9zZW1hcGhvcmVfaGFuZGxlIHNlbSkKK3sKKwlpZiAoIXNlbSB8fCAhc2VtLT5zaWduYWxfZmVuY2UuY29udGV4dCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzZW0tPnNpZ25hbF9mZW5jZS5jb250ZXh0ID0gTlVMTDs7CisJc2VtLT5zaWduYWxfZmVuY2UuaXBfdHlwZSA9IDA7CisJc2VtLT5zaWduYWxfZmVuY2UuaXBfaW5zdGFuY2UgPSAwOworCXNlbS0+c2lnbmFsX2ZlbmNlLnJpbmcgPSAwOworCXNlbS0+c2lnbmFsX2ZlbmNlLmZlbmNlID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtZGdwdV9jc191bnJlZmVyZW5jZV9zZW0oYW1kZ3B1X3NlbWFwaG9yZV9oYW5kbGUgc2VtKQoreworCWlmICghc2VtKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh1cGRhdGVfcmVmZXJlbmNlcygmc2VtLT5yZWZjb3VudCwgTlVMTCkpCisJCWZyZWUoc2VtKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGFtZGdwdV9jc19kZXN0cm95X3NlbWFwaG9yZShhbWRncHVfc2VtYXBob3JlX2hhbmRsZSBzZW0pCit7CisJcmV0dXJuIGFtZGdwdV9jc191bnJlZmVyZW5jZV9zZW0oc2VtKTsKK30KKworaW50IGFtZGdwdV9jc19jcmVhdGVfc3luY29iaihhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXYsCisJCQkgICAgIHVpbnQzMl90ICpoYW5kbGUpCit7CisJaWYgKE5VTEwgPT0gZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBkcm1TeW5jb2JqQ3JlYXRlKGRldi0+ZmQsIDAsIGhhbmRsZSk7Cit9CisKK2ludCBhbWRncHVfY3NfZGVzdHJveV9zeW5jb2JqKGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldiwKKwkJCSAgICAgIHVpbnQzMl90IGhhbmRsZSkKK3sKKwlpZiAoTlVMTCA9PSBkZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGRybVN5bmNvYmpEZXN0cm95KGRldi0+ZmQsIGhhbmRsZSk7Cit9CisKK2ludCBhbWRncHVfY3Nfc3luY29ial93YWl0KGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldiwKKwkJCSAgIHVpbnQzMl90ICpoYW5kbGVzLCB1bnNpZ25lZCBudW1faGFuZGxlcywKKwkJCSAgIGludDY0X3QgdGltZW91dF9uc2VjLCB1bnNpZ25lZCBmbGFncywKKwkJCSAgIHVpbnQzMl90ICpmaXJzdF9zaWduYWxlZCkKK3sKKwlpZiAoTlVMTCA9PSBkZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGRybVN5bmNvYmpXYWl0KGRldi0+ZmQsIGhhbmRsZXMsIG51bV9oYW5kbGVzLCB0aW1lb3V0X25zZWMsCisJCQkgICAgICBmbGFncywgZmlyc3Rfc2lnbmFsZWQpOworfQorCitpbnQgYW1kZ3B1X2NzX2V4cG9ydF9zeW5jb2JqKGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldiwKKwkJCSAgICAgdWludDMyX3QgaGFuZGxlLAorCQkJICAgICBpbnQgKnNoYXJlZF9mZCkKK3sKKwlpZiAoTlVMTCA9PSBkZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGRybVN5bmNvYmpIYW5kbGVUb0ZEKGRldi0+ZmQsIGhhbmRsZSwgc2hhcmVkX2ZkKTsKK30KKworaW50IGFtZGdwdV9jc19pbXBvcnRfc3luY29iaihhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXYsCisJCQkgICAgIGludCBzaGFyZWRfZmQsCisJCQkgICAgIHVpbnQzMl90ICpoYW5kbGUpCit7CisJaWYgKE5VTEwgPT0gZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBkcm1TeW5jb2JqRkRUb0hhbmRsZShkZXYtPmZkLCBzaGFyZWRfZmQsIGhhbmRsZSk7Cit9CisKK2ludCBhbWRncHVfY3Nfc3luY29ial9leHBvcnRfc3luY19maWxlKGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldiwKKwkJCQkgICAgICAgdWludDMyX3Qgc3luY29iaiwKKwkJCQkgICAgICAgaW50ICpzeW5jX2ZpbGVfZmQpCit7CisJaWYgKE5VTEwgPT0gZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBkcm1TeW5jb2JqRXhwb3J0U3luY0ZpbGUoZGV2LT5mZCwgc3luY29iaiwgc3luY19maWxlX2ZkKTsKK30KKworaW50IGFtZGdwdV9jc19zeW5jb2JqX2ltcG9ydF9zeW5jX2ZpbGUoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LAorCQkJCSAgICAgICB1aW50MzJfdCBzeW5jb2JqLAorCQkJCSAgICAgICBpbnQgc3luY19maWxlX2ZkKQoreworCWlmIChOVUxMID09IGRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gZHJtU3luY29iakltcG9ydFN5bmNGaWxlKGRldi0+ZmQsIHN5bmNvYmosIHN5bmNfZmlsZV9mZCk7Cit9CisKK2ludCBhbWRncHVfY3Nfc3VibWl0X3JhdyhhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXYsCisJCQkgYW1kZ3B1X2NvbnRleHRfaGFuZGxlIGNvbnRleHQsCisJCQkgYW1kZ3B1X2JvX2xpc3RfaGFuZGxlIGJvX2xpc3RfaGFuZGxlLAorCQkJIGludCBudW1fY2h1bmtzLAorCQkJIHN0cnVjdCBkcm1fYW1kZ3B1X2NzX2NodW5rICpjaHVua3MsCisJCQkgdWludDY0X3QgKnNlcV9ubykKK3sKKwl1bmlvbiBkcm1fYW1kZ3B1X2NzIGNzID0gezB9OworCXVpbnQ2NF90ICpjaHVua19hcnJheTsKKwlpbnQgaSwgcjsKKwlpZiAobnVtX2NodW5rcyA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNodW5rX2FycmF5ID0gYWxsb2NhKHNpemVvZih1aW50NjRfdCkgKiBudW1fY2h1bmtzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NodW5rczsgaSsrKQorCQljaHVua19hcnJheVtpXSA9ICh1aW50NjRfdCkodWludHB0cl90KSZjaHVua3NbaV07CisJY3MuaW4uY2h1bmtzID0gKHVpbnQ2NF90KSh1aW50cHRyX3QpY2h1bmtfYXJyYXk7CisJY3MuaW4uY3R4X2lkID0gY29udGV4dC0+aWQ7CisJY3MuaW4uYm9fbGlzdF9oYW5kbGUgPSBib19saXN0X2hhbmRsZSA/IGJvX2xpc3RfaGFuZGxlLT5oYW5kbGUgOiAwOworCWNzLmluLm51bV9jaHVua3MgPSBudW1fY2h1bmtzOworCXIgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGRldi0+ZmQsIERSTV9BTURHUFVfQ1MsCisJCQkJJmNzLCBzaXplb2YoY3MpKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpZiAoc2VxX25vKQorCQkqc2VxX25vID0gY3Mub3V0LmhhbmRsZTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBhbWRncHVfY3NfY2h1bmtfZmVuY2VfaW5mb190b19kYXRhKHN0cnVjdCBhbWRncHVfY3NfZmVuY2VfaW5mbyAqZmVuY2VfaW5mbywKKwkJCQkJc3RydWN0IGRybV9hbWRncHVfY3NfY2h1bmtfZGF0YSAqZGF0YSkKK3sKKwlkYXRhLT5mZW5jZV9kYXRhLmhhbmRsZSA9IGZlbmNlX2luZm8tPmhhbmRsZS0+aGFuZGxlOworCWRhdGEtPmZlbmNlX2RhdGEub2Zmc2V0ID0gZmVuY2VfaW5mby0+b2Zmc2V0ICogc2l6ZW9mKHVpbnQ2NF90KTsKK30KKwordm9pZCBhbWRncHVfY3NfY2h1bmtfZmVuY2VfdG9fZGVwKHN0cnVjdCBhbWRncHVfY3NfZmVuY2UgKmZlbmNlLAorCQkJCSAgc3RydWN0IGRybV9hbWRncHVfY3NfY2h1bmtfZGVwICpkZXApCit7CisJZGVwLT5pcF90eXBlID0gZmVuY2UtPmlwX3R5cGU7CisJZGVwLT5pcF9pbnN0YW5jZSA9IGZlbmNlLT5pcF9pbnN0YW5jZTsKKwlkZXAtPnJpbmcgPSBmZW5jZS0+cmluZzsKKwlkZXAtPmN0eF9pZCA9IGZlbmNlLT5jb250ZXh0LT5pZDsKKwlkZXAtPmhhbmRsZSA9IGZlbmNlLT5mZW5jZTsKK30KKworaW50IGFtZGdwdV9jc19mZW5jZV90b19oYW5kbGUoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LAorCQkJICAgICAgc3RydWN0IGFtZGdwdV9jc19mZW5jZSAqZmVuY2UsCisJCQkgICAgICB1aW50MzJfdCB3aGF0LAorCQkJICAgICAgdWludDMyX3QgKm91dF9oYW5kbGUpCit7CisJdW5pb24gZHJtX2FtZGdwdV9mZW5jZV90b19oYW5kbGUgZnRoID0gezB9OworCWludCByOworCisJZnRoLmluLmZlbmNlLmN0eF9pZCA9IGZlbmNlLT5jb250ZXh0LT5pZDsKKwlmdGguaW4uZmVuY2UuaXBfdHlwZSA9IGZlbmNlLT5pcF90eXBlOworCWZ0aC5pbi5mZW5jZS5pcF9pbnN0YW5jZSA9IGZlbmNlLT5pcF9pbnN0YW5jZTsKKwlmdGguaW4uZmVuY2UucmluZyA9IGZlbmNlLT5yaW5nOworCWZ0aC5pbi5mZW5jZS5zZXFfbm8gPSBmZW5jZS0+ZmVuY2U7CisJZnRoLmluLndoYXQgPSB3aGF0OworCisJciA9IGRybUNvbW1hbmRXcml0ZVJlYWQoZGV2LT5mZCwgRFJNX0FNREdQVV9GRU5DRV9UT19IQU5ETEUsCisJCQkJJmZ0aCwgc2l6ZW9mKGZ0aCkpOworCWlmIChyID09IDApCisJCSpvdXRfaGFuZGxlID0gZnRoLm91dC5oYW5kbGU7CisJcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS9hbWRncHUvYW1kZ3B1X2RldmljZS5jIGIvYW1kZ3B1L2FtZGdwdV9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjMxYzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW1kZ3B1L2FtZGdwdV9kZXZpY2UuYwpAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworLyoqCisgKiBcZmlsZSBhbWRncHVfZGV2aWNlLmMKKyAqCisgKiAgSW1wbGVtZW50YXRpb24gb2YgZnVuY3Rpb25zIGZvciBBTUQgR1BVIGRldmljZQorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgInhmODZkcm0uaCIKKyNpbmNsdWRlICJhbWRncHVfZHJtLmgiCisjaW5jbHVkZSAiYW1kZ3B1X2ludGVybmFsLmgiCisjaW5jbHVkZSAidXRpbF9oYXNoX3RhYmxlLmgiCisjaW5jbHVkZSAidXRpbF9tYXRoLmgiCisKKyNkZWZpbmUgUFRSX1RPX1VJTlQoeCkgKCh1bnNpZ25lZCkoKGludHB0cl90KSh4KSkpCisjZGVmaW5lIFVJTlRfVE9fUFRSKHgpICgodm9pZCAqKSgoaW50cHRyX3QpKHgpKSkKKworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBmZF9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CitzdGF0aWMgc3RydWN0IHV0aWxfaGFzaF90YWJsZSAqZmRfdGFiOworCitzdGF0aWMgdW5zaWduZWQgaGFuZGxlX2hhc2godm9pZCAqa2V5KQoreworCXJldHVybiBQVFJfVE9fVUlOVChrZXkpOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9jb21wYXJlKHZvaWQgKmtleTEsIHZvaWQgKmtleTIpCit7CisJcmV0dXJuIFBUUl9UT19VSU5UKGtleTEpICE9IFBUUl9UT19VSU5UKGtleTIpOworfQorCitzdGF0aWMgdW5zaWduZWQgZmRfaGFzaCh2b2lkICprZXkpCit7CisJaW50IGZkID0gUFRSX1RPX1VJTlQoa2V5KTsKKwljaGFyICpuYW1lID0gZHJtR2V0UHJpbWFyeURldmljZU5hbWVGcm9tRmQoZmQpOworCXVuc2lnbmVkIHJlc3VsdCA9IDA7CisJY2hhciAqYzsKKworCWlmIChuYW1lID09IE5VTEwpCisJCXJldHVybiAwOworCisJZm9yIChjID0gbmFtZTsgKmM7ICsrYykKKwkJcmVzdWx0ICs9ICpjOworCisJZnJlZShuYW1lKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZmRfY29tcGFyZSh2b2lkICprZXkxLCB2b2lkICprZXkyKQoreworCWludCBmZDEgPSBQVFJfVE9fVUlOVChrZXkxKTsKKwlpbnQgZmQyID0gUFRSX1RPX1VJTlQoa2V5Mik7CisJY2hhciAqbmFtZTEgPSBkcm1HZXRQcmltYXJ5RGV2aWNlTmFtZUZyb21GZChmZDEpOworCWNoYXIgKm5hbWUyID0gZHJtR2V0UHJpbWFyeURldmljZU5hbWVGcm9tRmQoZmQyKTsKKwlpbnQgcmVzdWx0OworCisJaWYgKG5hbWUxID09IE5VTEwgfHwgbmFtZTIgPT0gTlVMTCkgeworCQlmcmVlKG5hbWUxKTsKKwkJZnJlZShuYW1lMik7CisJCXJldHVybiAwOworCX0KKworCXJlc3VsdCA9IHN0cmNtcChuYW1lMSwgbmFtZTIpOworCWZyZWUobmFtZTEpOworCWZyZWUobmFtZTIpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisqIEdldCB0aGUgYXV0aGVudGljYXRlZCBmb3JtIGZkLAorKgorKiBccGFyYW0gICBmZCAgIC0gXGMgW2luXSAgRmlsZSBkZXNjcmlwdG9yIGZvciBBTUQgR1BVIGRldmljZQorKiBccGFyYW0gICBhdXRoIC0gXGMgW291dF0gUG9pbnRlciB0byBvdXRwdXQgdGhlIGZkIGlzIGF1dGhlbnRpY2F0ZWQgb3Igbm90CisqICAgICAgICAgICAgICAgICAgICAgICAgICBBIHJlbmRlciBub2RlIGZkLCBvdXRwdXQgYXV0aCA9IDAKKyogICAgICAgICAgICAgICAgICAgICAgICAgIEEgbGVnYWN5IGZkLCBnZXQgdGhlIGF1dGhlbnRpY2F0ZWQgZm9yIGNvbXBhdGliaWxpdHkgcm9vdAorKgorKiBccmV0dXJuICAgMCBvbiBzdWNjZXNzXG4KKyogICAgICAgICAgPjAgLSBBTUQgc3BlY2lmaWMgZXJyb3IgY29kZVxuCisqICAgICAgICAgIDwwIC0gTmVnYXRpdmUgUE9TSVggRXJyb3IgY29kZQorKi8KK3N0YXRpYyBpbnQgYW1kZ3B1X2dldF9hdXRoKGludCBmZCwgaW50ICphdXRoKQoreworCWludCByID0gMDsKKwlkcm1fY2xpZW50X3QgY2xpZW50ID0ge307CisKKwlpZiAoZHJtR2V0Tm9kZVR5cGVGcm9tRmQoZmQpID09IERSTV9OT0RFX1JFTkRFUikKKwkJKmF1dGggPSAwOworCWVsc2UgeworCQljbGllbnQuaWR4ID0gMDsKKwkJciA9IGRybUlvY3RsKGZkLCBEUk1fSU9DVExfR0VUX0NMSUVOVCwgJmNsaWVudCk7CisJCWlmICghcikKKwkJCSphdXRoID0gY2xpZW50LmF1dGg7CisJfQorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBhbWRncHVfZGV2aWNlX2ZyZWVfaW50ZXJuYWwoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2KQoreworCWNvbnN0IHN0cnVjdCBhbWRncHVfYXNpY19pZCAqaWQ7CisJYW1kZ3B1X3ZhbWdyX2RlaW5pdCgmZGV2LT52YW1ncl8zMik7CisJYW1kZ3B1X3ZhbWdyX2RlaW5pdCgmZGV2LT52YW1ncik7CisJdXRpbF9oYXNoX3RhYmxlX2Rlc3Ryb3koZGV2LT5ib19mbGlua19uYW1lcyk7CisJdXRpbF9oYXNoX3RhYmxlX2Rlc3Ryb3koZGV2LT5ib19oYW5kbGVzKTsKKwlwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmRldi0+Ym9fdGFibGVfbXV0ZXgpOworCXV0aWxfaGFzaF90YWJsZV9yZW1vdmUoZmRfdGFiLCBVSU5UX1RPX1BUUihkZXYtPmZkKSk7CisJY2xvc2UoZGV2LT5mZCk7CisJaWYgKChkZXYtPmZsaW5rX2ZkID49IDApICYmIChkZXYtPmZkICE9IGRldi0+ZmxpbmtfZmQpKQorCQljbG9zZShkZXYtPmZsaW5rX2ZkKTsKKwlpZiAoZGV2LT5hc2ljX2lkcykgeworCQlmb3IgKGlkID0gZGV2LT5hc2ljX2lkczsgaWQtPmRpZDsgaWQrKykKKwkJCWZyZWUoaWQtPm1hcmtldGluZ19uYW1lKTsKKworCQlmcmVlKGRldi0+YXNpY19pZHMpOworCX0KKwlmcmVlKGRldik7Cit9CisKKy8qKgorICogQXNzaWdubWVudCBiZXR3ZWVuIHR3byBhbWRncHVfZGV2aWNlIHBvaW50ZXJzIHdpdGggcmVmZXJlbmNlIGNvdW50aW5nLgorICoKKyAqIFVzYWdlOgorICogICAgc3RydWN0IGFtZGdwdV9kZXZpY2UgKmRzdCA9IC4uLiAsICpzcmMgPSAuLi47CisgKgorICogICAgZHN0ID0gc3JjOworICogICAgLy8gTm8gcmVmZXJlbmNlIGNvdW50aW5nLiBPbmx5IHVzZSB0aGlzIHdoZW4geW91IG5lZWQgdG8gbW92ZQorICogICAgLy8gYSByZWZlcmVuY2UgZnJvbSBvbmUgcG9pbnRlciB0byBhbm90aGVyLgorICoKKyAqICAgIGFtZGdwdV9kZXZpY2VfcmVmZXJlbmNlKCZkc3QsIHNyYyk7CisgKiAgICAvLyBSZWZlcmVuY2UgY291bnRlcnMgYXJlIHVwZGF0ZWQuIGRzdCBpcyBkZWNyZW1lbnRlZCBhbmQgc3JjIGlzCisgKiAgICAvLyBpbmNyZW1lbnRlZC4gZHN0IGlzIGZyZWVkIGlmIGl0cyByZWZlcmVuY2UgY291bnRlciBpcyAwLgorICovCitzdGF0aWMgdm9pZCBhbWRncHVfZGV2aWNlX3JlZmVyZW5jZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqKmRzdCwKKwkJCSAgICAgc3RydWN0IGFtZGdwdV9kZXZpY2UgKnNyYykKK3sKKwlpZiAodXBkYXRlX3JlZmVyZW5jZXMoJigqZHN0KS0+cmVmY291bnQsICZzcmMtPnJlZmNvdW50KSkKKwkJYW1kZ3B1X2RldmljZV9mcmVlX2ludGVybmFsKCpkc3QpOworCSpkc3QgPSBzcmM7Cit9CisKK2ludCBhbWRncHVfZGV2aWNlX2luaXRpYWxpemUoaW50IGZkLAorCQkJICAgICB1aW50MzJfdCAqbWFqb3JfdmVyc2lvbiwKKwkJCSAgICAgdWludDMyX3QgKm1pbm9yX3ZlcnNpb24sCisJCQkgICAgIGFtZGdwdV9kZXZpY2VfaGFuZGxlICpkZXZpY2VfaGFuZGxlKQoreworCXN0cnVjdCBhbWRncHVfZGV2aWNlICpkZXY7CisJZHJtVmVyc2lvblB0ciB2ZXJzaW9uOworCWludCByOworCWludCBmbGFnX2F1dGggPSAwOworCWludCBmbGFnX2F1dGhleGlzdD0wOworCXVpbnQzMl90IGFjY2VsX3dvcmtpbmcgPSAwOworCXVpbnQ2NF90IHN0YXJ0LCBtYXg7CisKKwkqZGV2aWNlX2hhbmRsZSA9IE5VTEw7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmZkX211dGV4KTsKKwlpZiAoIWZkX3RhYikKKwkJZmRfdGFiID0gdXRpbF9oYXNoX3RhYmxlX2NyZWF0ZShmZF9oYXNoLCBmZF9jb21wYXJlKTsKKwlyID0gYW1kZ3B1X2dldF9hdXRoKGZkLCAmZmxhZ19hdXRoKTsKKwlpZiAocikgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBhbWRncHVfZ2V0X2F1dGggKDEpIGZhaWxlZCAoJWkpXG4iLAorCQkJX19mdW5jX18sIHIpOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmZmRfbXV0ZXgpOworCQlyZXR1cm4gcjsKKwl9CisJZGV2ID0gdXRpbF9oYXNoX3RhYmxlX2dldChmZF90YWIsIFVJTlRfVE9fUFRSKGZkKSk7CisJaWYgKGRldikgeworCQlyID0gYW1kZ3B1X2dldF9hdXRoKGRldi0+ZmQsICZmbGFnX2F1dGhleGlzdCk7CisJCWlmIChyKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBhbWRncHVfZ2V0X2F1dGggKDIpIGZhaWxlZCAoJWkpXG4iLAorCQkJCV9fZnVuY19fLCByKTsKKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZmZF9tdXRleCk7CisJCQlyZXR1cm4gcjsKKwkJfQorCQlpZiAoKGZsYWdfYXV0aCkgJiYgKCFmbGFnX2F1dGhleGlzdCkpIHsKKwkJCWRldi0+ZmxpbmtfZmQgPSBkdXAoZmQpOworCQl9CisJCSptYWpvcl92ZXJzaW9uID0gZGV2LT5tYWpvcl92ZXJzaW9uOworCQkqbWlub3JfdmVyc2lvbiA9IGRldi0+bWlub3JfdmVyc2lvbjsKKwkJYW1kZ3B1X2RldmljZV9yZWZlcmVuY2UoZGV2aWNlX2hhbmRsZSwgZGV2KTsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJmZkX211dGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJZGV2ID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgYW1kZ3B1X2RldmljZSkpOworCWlmICghZGV2KSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGNhbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJmZkX211dGV4KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZGV2LT5mZCA9IC0xOworCWRldi0+ZmxpbmtfZmQgPSAtMTsKKworCWF0b21pY19zZXQoJmRldi0+cmVmY291bnQsIDEpOworCisJdmVyc2lvbiA9IGRybUdldFZlcnNpb24oZmQpOworCWlmICh2ZXJzaW9uLT52ZXJzaW9uX21ham9yICE9IDMpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogRFJNIHZlcnNpb24gaXMgJWQuJWQuJWQgYnV0IHRoaXMgZHJpdmVyIGlzICIKKwkJCSJvbmx5IGNvbXBhdGlibGUgd2l0aCAzLngueC5cbiIsCisJCQlfX2Z1bmNfXywKKwkJCXZlcnNpb24tPnZlcnNpb25fbWFqb3IsCisJCQl2ZXJzaW9uLT52ZXJzaW9uX21pbm9yLAorCQkJdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsKTsKKwkJZHJtRnJlZVZlcnNpb24odmVyc2lvbik7CisJCXIgPSAtRUJBREY7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlkZXYtPmZkID0gZHVwKGZkKTsKKwlkZXYtPmZsaW5rX2ZkID0gZGV2LT5mZDsKKwlkZXYtPm1ham9yX3ZlcnNpb24gPSB2ZXJzaW9uLT52ZXJzaW9uX21ham9yOworCWRldi0+bWlub3JfdmVyc2lvbiA9IHZlcnNpb24tPnZlcnNpb25fbWlub3I7CisJZHJtRnJlZVZlcnNpb24odmVyc2lvbik7CisKKwlkZXYtPmJvX2ZsaW5rX25hbWVzID0gdXRpbF9oYXNoX3RhYmxlX2NyZWF0ZShoYW5kbGVfaGFzaCwKKwkJCQkJCSAgICAgaGFuZGxlX2NvbXBhcmUpOworCWRldi0+Ym9faGFuZGxlcyA9IHV0aWxfaGFzaF90YWJsZV9jcmVhdGUoaGFuZGxlX2hhc2gsIGhhbmRsZV9jb21wYXJlKTsKKwlwdGhyZWFkX211dGV4X2luaXQoJmRldi0+Ym9fdGFibGVfbXV0ZXgsIE5VTEwpOworCisJLyogQ2hlY2sgaWYgYWNjZWxlcmF0aW9uIGlzIHdvcmtpbmcuICovCisJciA9IGFtZGdwdV9xdWVyeV9pbmZvKGRldiwgQU1ER1BVX0lORk9fQUNDRUxfV09SS0lORywgNCwgJmFjY2VsX3dvcmtpbmcpOworCWlmIChyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGFtZGdwdV9xdWVyeV9pbmZvKEFDQ0VMX1dPUktJTkcpIGZhaWxlZCAoJWkpXG4iLAorCQkJX19mdW5jX18sIHIpOworCQlnb3RvIGNsZWFudXA7CisJfQorCWlmICghYWNjZWxfd29ya2luZykgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBBTURHUFVfSU5GT19BQ0NFTF9XT1JLSU5HID0gMFxuIiwgX19mdW5jX18pOworCQlyID0gLUVCQURGOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJciA9IGFtZGdwdV9xdWVyeV9ncHVfaW5mb19pbml0KGRldik7CisJaWYgKHIpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogYW1kZ3B1X3F1ZXJ5X2dwdV9pbmZvX2luaXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlhbWRncHVfdmFtZ3JfaW5pdCgmZGV2LT52YW1nciwgZGV2LT5kZXZfaW5mby52aXJ0dWFsX2FkZHJlc3Nfb2Zmc2V0LAorCQkJICBkZXYtPmRldl9pbmZvLnZpcnR1YWxfYWRkcmVzc19tYXgsCisJCQkgIGRldi0+ZGV2X2luZm8udmlydHVhbF9hZGRyZXNzX2FsaWdubWVudCk7CisKKwltYXggPSBNSU4yKGRldi0+ZGV2X2luZm8udmlydHVhbF9hZGRyZXNzX21heCwgMHhmZmZmZmZmZik7CisJc3RhcnQgPSBhbWRncHVfdmFtZ3JfZmluZF92YSgmZGV2LT52YW1nciwKKwkJCQkgICAgIG1heCAtIGRldi0+ZGV2X2luZm8udmlydHVhbF9hZGRyZXNzX29mZnNldCwKKwkJCQkgICAgIGRldi0+ZGV2X2luZm8udmlydHVhbF9hZGRyZXNzX2FsaWdubWVudCwgMCk7CisJaWYgKHN0YXJ0ID4gMHhmZmZmZmZmZikgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBhbWRncHVfdmFtZ3JfZmluZF92YSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBmcmVlX3ZhOyAvKiBzaG91bGRuJ3QgZ2V0IGhlcmUgKi8KKwl9CisKKwlhbWRncHVfdmFtZ3JfaW5pdCgmZGV2LT52YW1ncl8zMiwgc3RhcnQsIG1heCwKKwkJCSAgZGV2LT5kZXZfaW5mby52aXJ0dWFsX2FkZHJlc3NfYWxpZ25tZW50KTsKKworCXIgPSBhbWRncHVfcGFyc2VfYXNpY19pZHMoJmRldi0+YXNpY19pZHMpOworCWlmIChyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IENhbm5vdCBwYXJzZSBBU0lDIElEcywgMHgleC4iLAorCQkJX19mdW5jX18sIHIpOworCX0KKworCSptYWpvcl92ZXJzaW9uID0gZGV2LT5tYWpvcl92ZXJzaW9uOworCSptaW5vcl92ZXJzaW9uID0gZGV2LT5taW5vcl92ZXJzaW9uOworCSpkZXZpY2VfaGFuZGxlID0gZGV2OworCXV0aWxfaGFzaF90YWJsZV9zZXQoZmRfdGFiLCBVSU5UX1RPX1BUUihkZXYtPmZkKSwgZGV2KTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmZmRfbXV0ZXgpOworCisJcmV0dXJuIDA7CisKK2ZyZWVfdmE6CisJciA9IC1FTk9NRU07CisJYW1kZ3B1X3ZhbWdyX2ZyZWVfdmEoJmRldi0+dmFtZ3IsIHN0YXJ0LAorCQkJICAgICBtYXggLSBkZXYtPmRldl9pbmZvLnZpcnR1YWxfYWRkcmVzc19vZmZzZXQpOworCWFtZGdwdV92YW1ncl9kZWluaXQoJmRldi0+dmFtZ3IpOworCitjbGVhbnVwOgorCWlmIChkZXYtPmZkID49IDApCisJCWNsb3NlKGRldi0+ZmQpOworCWZyZWUoZGV2KTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmZmRfbXV0ZXgpOworCXJldHVybiByOworfQorCitpbnQgYW1kZ3B1X2RldmljZV9kZWluaXRpYWxpemUoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2KQoreworCWFtZGdwdV9kZXZpY2VfcmVmZXJlbmNlKCZkZXYsIE5VTEwpOworCXJldHVybiAwOworfQorCitjb25zdCBjaGFyICphbWRncHVfZ2V0X21hcmtldGluZ19uYW1lKGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldikKK3sKKwljb25zdCBzdHJ1Y3QgYW1kZ3B1X2FzaWNfaWQgKmlkOworCisJaWYgKCFkZXYtPmFzaWNfaWRzKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaWQgPSBkZXYtPmFzaWNfaWRzOyBpZC0+ZGlkOyBpZCsrKSB7CisJCWlmICgoaWQtPmRpZCA9PSBkZXYtPmluZm8uYXNpY19pZCkgJiYKKwkJICAgIChpZC0+cmlkID09IGRldi0+aW5mby5wY2lfcmV2X2lkKSkKKwkJCXJldHVybiBpZC0+bWFya2V0aW5nX25hbWU7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9hbWRncHUvYW1kZ3B1X2dwdV9pbmZvLmMgYi9hbWRncHUvYW1kZ3B1X2dwdV9pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVmZmZjNgotLS0gL2Rldi9udWxsCisrKyBiL2FtZGdwdS9hbWRncHVfZ3B1X2luZm8uYwpAQCAtMCwwICsxLDMzNiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDE0IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJhbWRncHUuaCIKKyNpbmNsdWRlICJhbWRncHVfZHJtLmgiCisjaW5jbHVkZSAiYW1kZ3B1X2ludGVybmFsLmgiCisjaW5jbHVkZSAieGY4NmRybS5oIgorCitpbnQgYW1kZ3B1X3F1ZXJ5X2luZm8oYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LCB1bnNpZ25lZCBpbmZvX2lkLAorCQkgICAgICB1bnNpZ25lZCBzaXplLCB2b2lkICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgZHJtX2FtZGdwdV9pbmZvIHJlcXVlc3Q7CisKKwltZW1zZXQoJnJlcXVlc3QsIDAsIHNpemVvZihyZXF1ZXN0KSk7CisJcmVxdWVzdC5yZXR1cm5fcG9pbnRlciA9ICh1aW50cHRyX3QpdmFsdWU7CisJcmVxdWVzdC5yZXR1cm5fc2l6ZSA9IHNpemU7CisJcmVxdWVzdC5xdWVyeSA9IGluZm9faWQ7CisKKwlyZXR1cm4gZHJtQ29tbWFuZFdyaXRlKGRldi0+ZmQsIERSTV9BTURHUFVfSU5GTywgJnJlcXVlc3QsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkcm1fYW1kZ3B1X2luZm8pKTsKK30KKworaW50IGFtZGdwdV9xdWVyeV9jcnRjX2Zyb21faWQoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LCB1bnNpZ25lZCBpZCwKKwkJCSAgICAgIGludDMyX3QgKnJlc3VsdCkKK3sKKwlzdHJ1Y3QgZHJtX2FtZGdwdV9pbmZvIHJlcXVlc3Q7CisKKwltZW1zZXQoJnJlcXVlc3QsIDAsIHNpemVvZihyZXF1ZXN0KSk7CisJcmVxdWVzdC5yZXR1cm5fcG9pbnRlciA9ICh1aW50cHRyX3QpcmVzdWx0OworCXJlcXVlc3QucmV0dXJuX3NpemUgPSBzaXplb2YoKnJlc3VsdCk7CisJcmVxdWVzdC5xdWVyeSA9IEFNREdQVV9JTkZPX0NSVENfRlJPTV9JRDsKKwlyZXF1ZXN0Lm1vZGVfY3J0Yy5pZCA9IGlkOworCisJcmV0dXJuIGRybUNvbW1hbmRXcml0ZShkZXYtPmZkLCBEUk1fQU1ER1BVX0lORk8sICZyZXF1ZXN0LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZHJtX2FtZGdwdV9pbmZvKSk7Cit9CisKK2ludCBhbWRncHVfcmVhZF9tbV9yZWdpc3RlcnMoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LCB1bnNpZ25lZCBkd29yZF9vZmZzZXQsCisJCQkgICAgIHVuc2lnbmVkIGNvdW50LCB1aW50MzJfdCBpbnN0YW5jZSwgdWludDMyX3QgZmxhZ3MsCisJCQkgICAgIHVpbnQzMl90ICp2YWx1ZXMpCit7CisJc3RydWN0IGRybV9hbWRncHVfaW5mbyByZXF1ZXN0OworCisJbWVtc2V0KCZyZXF1ZXN0LCAwLCBzaXplb2YocmVxdWVzdCkpOworCXJlcXVlc3QucmV0dXJuX3BvaW50ZXIgPSAodWludHB0cl90KXZhbHVlczsKKwlyZXF1ZXN0LnJldHVybl9zaXplID0gY291bnQgKiBzaXplb2YodWludDMyX3QpOworCXJlcXVlc3QucXVlcnkgPSBBTURHUFVfSU5GT19SRUFEX01NUl9SRUc7CisJcmVxdWVzdC5yZWFkX21tcl9yZWcuZHdvcmRfb2Zmc2V0ID0gZHdvcmRfb2Zmc2V0OworCXJlcXVlc3QucmVhZF9tbXJfcmVnLmNvdW50ID0gY291bnQ7CisJcmVxdWVzdC5yZWFkX21tcl9yZWcuaW5zdGFuY2UgPSBpbnN0YW5jZTsKKwlyZXF1ZXN0LnJlYWRfbW1yX3JlZy5mbGFncyA9IGZsYWdzOworCisJcmV0dXJuIGRybUNvbW1hbmRXcml0ZShkZXYtPmZkLCBEUk1fQU1ER1BVX0lORk8sICZyZXF1ZXN0LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZHJtX2FtZGdwdV9pbmZvKSk7Cit9CisKK2ludCBhbWRncHVfcXVlcnlfaHdfaXBfY291bnQoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LCB1bnNpZ25lZCB0eXBlLAorCQkJICAgICB1aW50MzJfdCAqY291bnQpCit7CisJc3RydWN0IGRybV9hbWRncHVfaW5mbyByZXF1ZXN0OworCisJbWVtc2V0KCZyZXF1ZXN0LCAwLCBzaXplb2YocmVxdWVzdCkpOworCXJlcXVlc3QucmV0dXJuX3BvaW50ZXIgPSAodWludHB0cl90KWNvdW50OworCXJlcXVlc3QucmV0dXJuX3NpemUgPSBzaXplb2YoKmNvdW50KTsKKwlyZXF1ZXN0LnF1ZXJ5ID0gQU1ER1BVX0lORk9fSFdfSVBfQ09VTlQ7CisJcmVxdWVzdC5xdWVyeV9od19pcC50eXBlID0gdHlwZTsKKworCXJldHVybiBkcm1Db21tYW5kV3JpdGUoZGV2LT5mZCwgRFJNX0FNREdQVV9JTkZPLCAmcmVxdWVzdCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGRybV9hbWRncHVfaW5mbykpOworfQorCitpbnQgYW1kZ3B1X3F1ZXJ5X2h3X2lwX2luZm8oYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LCB1bnNpZ25lZCB0eXBlLAorCQkJICAgIHVuc2lnbmVkIGlwX2luc3RhbmNlLAorCQkJICAgIHN0cnVjdCBkcm1fYW1kZ3B1X2luZm9faHdfaXAgKmluZm8pCit7CisJc3RydWN0IGRybV9hbWRncHVfaW5mbyByZXF1ZXN0OworCisJbWVtc2V0KCZyZXF1ZXN0LCAwLCBzaXplb2YocmVxdWVzdCkpOworCXJlcXVlc3QucmV0dXJuX3BvaW50ZXIgPSAodWludHB0cl90KWluZm87CisJcmVxdWVzdC5yZXR1cm5fc2l6ZSA9IHNpemVvZigqaW5mbyk7CisJcmVxdWVzdC5xdWVyeSA9IEFNREdQVV9JTkZPX0hXX0lQX0lORk87CisJcmVxdWVzdC5xdWVyeV9od19pcC50eXBlID0gdHlwZTsKKwlyZXF1ZXN0LnF1ZXJ5X2h3X2lwLmlwX2luc3RhbmNlID0gaXBfaW5zdGFuY2U7CisKKwlyZXR1cm4gZHJtQ29tbWFuZFdyaXRlKGRldi0+ZmQsIERSTV9BTURHUFVfSU5GTywgJnJlcXVlc3QsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkcm1fYW1kZ3B1X2luZm8pKTsKK30KKworaW50IGFtZGdwdV9xdWVyeV9maXJtd2FyZV92ZXJzaW9uKGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldiwgdW5zaWduZWQgZndfdHlwZSwKKwkJCQkgIHVuc2lnbmVkIGlwX2luc3RhbmNlLCB1bnNpZ25lZCBpbmRleCwKKwkJCQkgIHVpbnQzMl90ICp2ZXJzaW9uLCB1aW50MzJfdCAqZmVhdHVyZSkKK3sKKwlzdHJ1Y3QgZHJtX2FtZGdwdV9pbmZvIHJlcXVlc3Q7CisJc3RydWN0IGRybV9hbWRncHVfaW5mb19maXJtd2FyZSBmaXJtd2FyZSA9IHt9OworCWludCByOworCisJbWVtc2V0KCZyZXF1ZXN0LCAwLCBzaXplb2YocmVxdWVzdCkpOworCXJlcXVlc3QucmV0dXJuX3BvaW50ZXIgPSAodWludHB0cl90KSZmaXJtd2FyZTsKKwlyZXF1ZXN0LnJldHVybl9zaXplID0gc2l6ZW9mKGZpcm13YXJlKTsKKwlyZXF1ZXN0LnF1ZXJ5ID0gQU1ER1BVX0lORk9fRldfVkVSU0lPTjsKKwlyZXF1ZXN0LnF1ZXJ5X2Z3LmZ3X3R5cGUgPSBmd190eXBlOworCXJlcXVlc3QucXVlcnlfZncuaXBfaW5zdGFuY2UgPSBpcF9pbnN0YW5jZTsKKwlyZXF1ZXN0LnF1ZXJ5X2Z3LmluZGV4ID0gaW5kZXg7CisKKwlyID0gZHJtQ29tbWFuZFdyaXRlKGRldi0+ZmQsIERSTV9BTURHUFVfSU5GTywgJnJlcXVlc3QsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBkcm1fYW1kZ3B1X2luZm8pKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwkqdmVyc2lvbiA9IGZpcm13YXJlLnZlcjsKKwkqZmVhdHVyZSA9IGZpcm13YXJlLmZlYXR1cmU7CisJcmV0dXJuIDA7Cit9CisKK2RybV9wcml2YXRlIGludCBhbWRncHVfcXVlcnlfZ3B1X2luZm9faW5pdChhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXYpCit7CisJaW50IHIsIGk7CisKKwlyID0gYW1kZ3B1X3F1ZXJ5X2luZm8oZGV2LCBBTURHUFVfSU5GT19ERVZfSU5GTywgc2l6ZW9mKGRldi0+ZGV2X2luZm8pLAorCQkJICAgICAgJmRldi0+ZGV2X2luZm8pOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWRldi0+aW5mby5hc2ljX2lkID0gZGV2LT5kZXZfaW5mby5kZXZpY2VfaWQ7CisJZGV2LT5pbmZvLmNoaXBfcmV2ID0gZGV2LT5kZXZfaW5mby5jaGlwX3JldjsKKwlkZXYtPmluZm8uY2hpcF9leHRlcm5hbF9yZXYgPSBkZXYtPmRldl9pbmZvLmV4dGVybmFsX3JldjsKKwlkZXYtPmluZm8uZmFtaWx5X2lkID0gZGV2LT5kZXZfaW5mby5mYW1pbHk7CisJZGV2LT5pbmZvLm1heF9lbmdpbmVfY2xrID0gZGV2LT5kZXZfaW5mby5tYXhfZW5naW5lX2Nsb2NrOworCWRldi0+aW5mby5tYXhfbWVtb3J5X2NsayA9IGRldi0+ZGV2X2luZm8ubWF4X21lbW9yeV9jbG9jazsKKwlkZXYtPmluZm8uZ3B1X2NvdW50ZXJfZnJlcSA9IGRldi0+ZGV2X2luZm8uZ3B1X2NvdW50ZXJfZnJlcTsKKwlkZXYtPmluZm8uZW5hYmxlZF9yYl9waXBlc19tYXNrID0gZGV2LT5kZXZfaW5mby5lbmFibGVkX3JiX3BpcGVzX21hc2s7CisJZGV2LT5pbmZvLnJiX3BpcGVzID0gZGV2LT5kZXZfaW5mby5udW1fcmJfcGlwZXM7CisJZGV2LT5pbmZvLmlkc19mbGFncyA9IGRldi0+ZGV2X2luZm8uaWRzX2ZsYWdzOworCWRldi0+aW5mby5udW1faHdfZ2Z4X2NvbnRleHRzID0gZGV2LT5kZXZfaW5mby5udW1faHdfZ2Z4X2NvbnRleHRzOworCWRldi0+aW5mby5udW1fc2hhZGVyX2VuZ2luZXMgPSBkZXYtPmRldl9pbmZvLm51bV9zaGFkZXJfZW5naW5lczsKKwlkZXYtPmluZm8ubnVtX3NoYWRlcl9hcnJheXNfcGVyX2VuZ2luZSA9CisJCWRldi0+ZGV2X2luZm8ubnVtX3NoYWRlcl9hcnJheXNfcGVyX2VuZ2luZTsKKwlkZXYtPmluZm8udnJhbV90eXBlID0gZGV2LT5kZXZfaW5mby52cmFtX3R5cGU7CisJZGV2LT5pbmZvLnZyYW1fYml0X3dpZHRoID0gZGV2LT5kZXZfaW5mby52cmFtX2JpdF93aWR0aDsKKwlkZXYtPmluZm8uY2VfcmFtX3NpemUgPSBkZXYtPmRldl9pbmZvLmNlX3JhbV9zaXplOworCWRldi0+aW5mby52Y2VfaGFydmVzdF9jb25maWcgPSBkZXYtPmRldl9pbmZvLnZjZV9oYXJ2ZXN0X2NvbmZpZzsKKwlkZXYtPmluZm8ucGNpX3Jldl9pZCA9IGRldi0+ZGV2X2luZm8ucGNpX3JldjsKKworCWlmIChkZXYtPmluZm8uZmFtaWx5X2lkIDwgQU1ER1BVX0ZBTUlMWV9BSSkgeworCQlmb3IgKGkgPSAwOyBpIDwgKGludClkZXYtPmluZm8ubnVtX3NoYWRlcl9lbmdpbmVzOyBpKyspIHsKKwkJCXVuc2lnbmVkIGluc3RhbmNlID0gKGkgPDwgQU1ER1BVX0lORk9fTU1SX1NFX0lOREVYX1NISUZUKSB8CisJCQkJCSAgICAoQU1ER1BVX0lORk9fTU1SX1NIX0lOREVYX01BU0sgPDwKKwkJCQkJICAgICBBTURHUFVfSU5GT19NTVJfU0hfSU5ERVhfU0hJRlQpOworCisJCQlyID0gYW1kZ3B1X3JlYWRfbW1fcmVnaXN0ZXJzKGRldiwgMHgyNjNkLCAxLCBpbnN0YW5jZSwgMCwKKwkJCQkJCSAgICAgJmRldi0+aW5mby5iYWNrZW5kX2Rpc2FibGVbaV0pOworCQkJaWYgKHIpCisJCQkJcmV0dXJuIHI7CisJCQkvKiBleHRyYWN0IGJpdGZpZWxkIENDX1JCX0JBQ0tFTkRfRElTQUJMRS5CQUNLRU5EX0RJU0FCTEUgKi8KKwkJCWRldi0+aW5mby5iYWNrZW5kX2Rpc2FibGVbaV0gPQorCQkJCShkZXYtPmluZm8uYmFja2VuZF9kaXNhYmxlW2ldID4+IDE2KSAmIDB4ZmY7CisKKwkJCXIgPSBhbWRncHVfcmVhZF9tbV9yZWdpc3RlcnMoZGV2LCAweGEwZDQsIDEsIGluc3RhbmNlLCAwLAorCQkJCQkJICAgICAmZGV2LT5pbmZvLnBhX3NjX3Jhc3Rlcl9jZmdbaV0pOworCQkJaWYgKHIpCisJCQkJcmV0dXJuIHI7CisKKwkJCWlmIChkZXYtPmluZm8uZmFtaWx5X2lkID49IEFNREdQVV9GQU1JTFlfQ0kpIHsKKwkJCQlyID0gYW1kZ3B1X3JlYWRfbW1fcmVnaXN0ZXJzKGRldiwgMHhhMGQ1LCAxLCBpbnN0YW5jZSwgMCwKKwkJCQkJCSAgICAgJmRldi0+aW5mby5wYV9zY19yYXN0ZXJfY2ZnMVtpXSk7CisJCQkJaWYgKHIpCisJCQkJCXJldHVybiByOworCQkJfQorCQl9CisJfQorCisJciA9IGFtZGdwdV9yZWFkX21tX3JlZ2lzdGVycyhkZXYsIDB4MjYzZSwgMSwgMHhmZmZmZmZmZiwgMCwKKwkJCQkJICAgICAmZGV2LT5pbmZvLmdiX2FkZHJfY2ZnKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpZiAoZGV2LT5pbmZvLmZhbWlseV9pZCA8IEFNREdQVV9GQU1JTFlfQUkpIHsKKwkJciA9IGFtZGdwdV9yZWFkX21tX3JlZ2lzdGVycyhkZXYsIDB4MjY0NCwgMzIsIDB4ZmZmZmZmZmYsIDAsCisJCQkJCSAgICAgZGV2LT5pbmZvLmdiX3RpbGVfbW9kZSk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisKKwkJaWYgKGRldi0+aW5mby5mYW1pbHlfaWQgPj0gQU1ER1BVX0ZBTUlMWV9DSSkgeworCQkJciA9IGFtZGdwdV9yZWFkX21tX3JlZ2lzdGVycyhkZXYsIDB4MjY2NCwgMTYsIDB4ZmZmZmZmZmYsIDAsCisJCQkJCQkgICAgIGRldi0+aW5mby5nYl9tYWNyb190aWxlX21vZGUpOworCQkJaWYgKHIpCisJCQkJcmV0dXJuIHI7CisJCX0KKworCQlyID0gYW1kZ3B1X3JlYWRfbW1fcmVnaXN0ZXJzKGRldiwgMHg5ZDgsIDEsIDB4ZmZmZmZmZmYsIDAsCisJCQkJCSAgICAgJmRldi0+aW5mby5tY19hcmJfcmFtY2ZnKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwl9CisKKwlkZXYtPmluZm8uY3VfYWN0aXZlX251bWJlciA9IGRldi0+ZGV2X2luZm8uY3VfYWN0aXZlX251bWJlcjsKKwlkZXYtPmluZm8uY3VfYW9fbWFzayA9IGRldi0+ZGV2X2luZm8uY3VfYW9fbWFzazsKKwltZW1jcHkoJmRldi0+aW5mby5jdV9iaXRtYXBbMF1bMF0sICZkZXYtPmRldl9pbmZvLmN1X2JpdG1hcFswXVswXSwgc2l6ZW9mKGRldi0+aW5mby5jdV9iaXRtYXApKTsKKworCS8qIFRPRE86IGluZm8tPm1heF9xdWFkX3NoYWRlcl9waXBlcyBpcyBub3Qgc2V0ICovCisJLyogVE9ETzogaW5mby0+YXZhaWxfcXVhZF9zaGFkZXJfcGlwZXMgaXMgbm90IHNldCAqLworCS8qIFRPRE86IGluZm8tPmNhY2hlX2VudHJpZXNfcGVyX3F1YWRfcGlwZSBpcyBub3Qgc2V0ICovCisJcmV0dXJuIDA7Cit9CisKK2ludCBhbWRncHVfcXVlcnlfZ3B1X2luZm8oYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LAorCQkJc3RydWN0IGFtZGdwdV9ncHVfaW5mbyAqaW5mbykKK3sKKwlpZiAoIWRldiB8fCAhaW5mbykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBHZXQgQVNJQyBpbmZvKi8KKwkqaW5mbyA9IGRldi0+aW5mbzsKKworCXJldHVybiAwOworfQorCitpbnQgYW1kZ3B1X3F1ZXJ5X2hlYXBfaW5mbyhhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXYsCisJCQl1aW50MzJfdCBoZWFwLAorCQkJdWludDMyX3QgZmxhZ3MsCisJCQlzdHJ1Y3QgYW1kZ3B1X2hlYXBfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZHJtX2FtZGdwdV9pbmZvX3ZyYW1fZ3R0IHZyYW1fZ3R0X2luZm8gPSB7fTsKKwlpbnQgcjsKKworCXIgPSBhbWRncHVfcXVlcnlfaW5mbyhkZXYsIEFNREdQVV9JTkZPX1ZSQU1fR1RULAorCQkJICAgICAgc2l6ZW9mKHZyYW1fZ3R0X2luZm8pLCAmdnJhbV9ndHRfaW5mbyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJLyogR2V0IGhlYXAgaW5mb3JtYXRpb24gKi8KKwlzd2l0Y2ggKGhlYXApIHsKKwljYXNlIEFNREdQVV9HRU1fRE9NQUlOX1ZSQU06CisJCS8qIHF1ZXJ5IHZpc2libGUgb25seSB2cmFtIGhlYXAgKi8KKwkJaWYgKGZsYWdzICYgQU1ER1BVX0dFTV9DUkVBVEVfQ1BVX0FDQ0VTU19SRVFVSVJFRCkKKwkJCWluZm8tPmhlYXBfc2l6ZSA9IHZyYW1fZ3R0X2luZm8udnJhbV9jcHVfYWNjZXNzaWJsZV9zaXplOworCQllbHNlIC8qIHF1ZXJ5IHRvdGFsIHZyYW0gaGVhcCAqLworCQkJaW5mby0+aGVhcF9zaXplID0gdnJhbV9ndHRfaW5mby52cmFtX3NpemU7CisKKwkJaW5mby0+bWF4X2FsbG9jYXRpb24gPSB2cmFtX2d0dF9pbmZvLnZyYW1fY3B1X2FjY2Vzc2libGVfc2l6ZTsKKworCQlpZiAoZmxhZ3MgJiBBTURHUFVfR0VNX0NSRUFURV9DUFVfQUNDRVNTX1JFUVVJUkVEKQorCQkJciA9IGFtZGdwdV9xdWVyeV9pbmZvKGRldiwgQU1ER1BVX0lORk9fVklTX1ZSQU1fVVNBR0UsCisJCQkJCSAgICAgIHNpemVvZihpbmZvLT5oZWFwX3VzYWdlKSwKKwkJCQkJICAgICAgJmluZm8tPmhlYXBfdXNhZ2UpOworCQllbHNlCisJCQlyID0gYW1kZ3B1X3F1ZXJ5X2luZm8oZGV2LCBBTURHUFVfSU5GT19WUkFNX1VTQUdFLAorCQkJCQkgICAgICBzaXplb2YoaW5mby0+aGVhcF91c2FnZSksCisJCQkJCSAgICAgICZpbmZvLT5oZWFwX3VzYWdlKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwkJYnJlYWs7CisJY2FzZSBBTURHUFVfR0VNX0RPTUFJTl9HVFQ6CisJCWluZm8tPmhlYXBfc2l6ZSA9IHZyYW1fZ3R0X2luZm8uZ3R0X3NpemU7CisJCWluZm8tPm1heF9hbGxvY2F0aW9uID0gdnJhbV9ndHRfaW5mby52cmFtX2NwdV9hY2Nlc3NpYmxlX3NpemU7CisKKwkJciA9IGFtZGdwdV9xdWVyeV9pbmZvKGRldiwgQU1ER1BVX0lORk9fR1RUX1VTQUdFLAorCQkJCSAgICAgIHNpemVvZihpbmZvLT5oZWFwX3VzYWdlKSwKKwkJCQkgICAgICAmaW5mby0+aGVhcF91c2FnZSk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgYW1kZ3B1X3F1ZXJ5X2dkc19pbmZvKGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldiwKKwkJCXN0cnVjdCBhbWRncHVfZ2RzX3Jlc291cmNlX2luZm8gKmdkc19pbmZvKQoreworCXN0cnVjdCBkcm1fYW1kZ3B1X2luZm9fZ2RzIGdkc19jb25maWcgPSB7fTsKKyAgICAgICAgaW50IHI7CisKKwlpZiAoIWdkc19pbmZvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworICAgICAgICByID0gYW1kZ3B1X3F1ZXJ5X2luZm8oZGV2LCBBTURHUFVfSU5GT19HRFNfQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdkc19jb25maWcpLCAmZ2RzX2NvbmZpZyk7CisgICAgICAgIGlmIChyKQorICAgICAgICAgICAgICAgIHJldHVybiByOworCisJZ2RzX2luZm8tPmdkc19nZnhfcGFydGl0aW9uX3NpemUgPSBnZHNfY29uZmlnLmdkc19nZnhfcGFydGl0aW9uX3NpemU7CisJZ2RzX2luZm8tPmNvbXB1dGVfcGFydGl0aW9uX3NpemUgPSBnZHNfY29uZmlnLmNvbXB1dGVfcGFydGl0aW9uX3NpemU7CisJZ2RzX2luZm8tPmdkc190b3RhbF9zaXplID0gZ2RzX2NvbmZpZy5nZHNfdG90YWxfc2l6ZTsKKwlnZHNfaW5mby0+Z3dzX3Blcl9nZnhfcGFydGl0aW9uID0gZ2RzX2NvbmZpZy5nd3NfcGVyX2dmeF9wYXJ0aXRpb247CisJZ2RzX2luZm8tPmd3c19wZXJfY29tcHV0ZV9wYXJ0aXRpb24gPSBnZHNfY29uZmlnLmd3c19wZXJfY29tcHV0ZV9wYXJ0aXRpb247CisJZ2RzX2luZm8tPm9hX3Blcl9nZnhfcGFydGl0aW9uID0gZ2RzX2NvbmZpZy5vYV9wZXJfZ2Z4X3BhcnRpdGlvbjsKKwlnZHNfaW5mby0+b2FfcGVyX2NvbXB1dGVfcGFydGl0aW9uID0gZ2RzX2NvbmZpZy5vYV9wZXJfY29tcHV0ZV9wYXJ0aXRpb247CisKKwlyZXR1cm4gMDsKK30KKworaW50IGFtZGdwdV9xdWVyeV9zZW5zb3JfaW5mbyhhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXYsIHVuc2lnbmVkIHNlbnNvcl90eXBlLAorCQkJICAgICB1bnNpZ25lZCBzaXplLCB2b2lkICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgZHJtX2FtZGdwdV9pbmZvIHJlcXVlc3Q7CisKKwltZW1zZXQoJnJlcXVlc3QsIDAsIHNpemVvZihyZXF1ZXN0KSk7CisJcmVxdWVzdC5yZXR1cm5fcG9pbnRlciA9ICh1aW50cHRyX3QpdmFsdWU7CisJcmVxdWVzdC5yZXR1cm5fc2l6ZSA9IHNpemU7CisJcmVxdWVzdC5xdWVyeSA9IEFNREdQVV9JTkZPX1NFTlNPUjsKKwlyZXF1ZXN0LnNlbnNvcl9pbmZvLnR5cGUgPSBzZW5zb3JfdHlwZTsKKworCXJldHVybiBkcm1Db21tYW5kV3JpdGUoZGV2LT5mZCwgRFJNX0FNREdQVV9JTkZPLCAmcmVxdWVzdCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGRybV9hbWRncHVfaW5mbykpOworfQpkaWZmIC0tZ2l0IGEvYW1kZ3B1L2FtZGdwdV9pbnRlcm5hbC5oIGIvYW1kZ3B1L2FtZGdwdV9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZDE1MTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbWRncHUvYW1kZ3B1X2ludGVybmFsLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9BTURHUFVfSU5URVJOQUxfSF8KKyNkZWZpbmUgX0FNREdQVV9JTlRFUk5BTF9IXworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlICJsaWJkcm1fbWFjcm9zLmgiCisjaW5jbHVkZSAieGY4NmF0b21pYy5oIgorI2luY2x1ZGUgImFtZGdwdS5oIgorI2luY2x1ZGUgInV0aWxfZG91YmxlX2xpc3QuaCIKKworI2RlZmluZSBBTURHUFVfQ1NfTUFYX1JJTkdTIDgKKy8qIGRvIG5vdCB1c2UgYmVsb3cgbWFjcm8gaWYgYiBpcyBub3QgcG93ZXIgb2YgMiBhbGlnbmVkIHZhbHVlICovCisjZGVmaW5lIF9fcm91bmRfbWFzayh4LCB5KSAoKF9fdHlwZW9mX18oeCkpKCh5KS0xKSkKKyNkZWZpbmUgUk9VTkRfVVAoeCwgeSkgKCgoKHgpLTEpIHwgX19yb3VuZF9tYXNrKHgsIHkpKSsxKQorI2RlZmluZSBST1VORF9ET1dOKHgsIHkpICgoeCkgJiB+X19yb3VuZF9tYXNrKHgsIHkpKQorCisjZGVmaW5lIEFNREdQVV9JTlZBTElEX1ZBX0FERFJFU1MJMHhmZmZmZmZmZmZmZmZmZmZmCisjZGVmaW5lIEFNREdQVV9OVUxMX1NVQk1JVF9TRVEJCTAKKworc3RydWN0IGFtZGdwdV9ib192YV9ob2xlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdWludDY0X3Qgb2Zmc2V0OworCXVpbnQ2NF90IHNpemU7Cit9OworCitzdHJ1Y3QgYW1kZ3B1X2JvX3ZhX21nciB7CisJLyogdGhlIHN0YXJ0IHZpcnR1YWwgYWRkcmVzcyAqLworCXVpbnQ2NF90IHZhX29mZnNldDsKKwl1aW50NjRfdCB2YV9tYXg7CisJc3RydWN0IGxpc3RfaGVhZCB2YV9ob2xlczsKKwlwdGhyZWFkX211dGV4X3QgYm9fdmFfbXV0ZXg7CisJdWludDMyX3QgdmFfYWxpZ25tZW50OworfTsKKworc3RydWN0IGFtZGdwdV92YSB7CisJYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2OworCXVpbnQ2NF90IGFkZHJlc3M7CisJdWludDY0X3Qgc2l6ZTsKKwllbnVtIGFtZGdwdV9ncHVfdmFfcmFuZ2UgcmFuZ2U7CisJc3RydWN0IGFtZGdwdV9ib192YV9tZ3IgKnZhbWdyOworfTsKKworc3RydWN0IGFtZGdwdV9hc2ljX2lkIHsKKwl1aW50MzJfdCBkaWQ7CisJdWludDMyX3QgcmlkOworCWNoYXIgKm1hcmtldGluZ19uYW1lOworfTsKKworc3RydWN0IGFtZGdwdV9kZXZpY2UgeworCWF0b21pY190IHJlZmNvdW50OworCWludCBmZDsKKwlpbnQgZmxpbmtfZmQ7CisJdW5zaWduZWQgbWFqb3JfdmVyc2lvbjsKKwl1bnNpZ25lZCBtaW5vcl92ZXJzaW9uOworCisJLyoqIExvb2t1cCB0YWJsZSBvZiBhc2ljIGRldmljZSBpZCwgcmV2aXNpb24gaWQgYW5kIG1hcmtldGluZyBuYW1lICovCisJc3RydWN0IGFtZGdwdV9hc2ljX2lkICphc2ljX2lkczsKKwkvKiogTGlzdCBvZiBidWZmZXIgaGFuZGxlcy4gUHJvdGVjdGVkIGJ5IGJvX3RhYmxlX211dGV4LiAqLworCXN0cnVjdCB1dGlsX2hhc2hfdGFibGUgKmJvX2hhbmRsZXM7CisJLyoqIExpc3Qgb2YgYnVmZmVyIEdFTSBmbGluayBuYW1lcy4gUHJvdGVjdGVkIGJ5IGJvX3RhYmxlX211dGV4LiAqLworCXN0cnVjdCB1dGlsX2hhc2hfdGFibGUgKmJvX2ZsaW5rX25hbWVzOworCS8qKiBUaGlzIHByb3RlY3RzIGFsbCBoYXNoIHRhYmxlcy4gKi8KKwlwdGhyZWFkX211dGV4X3QgYm9fdGFibGVfbXV0ZXg7CisJc3RydWN0IGRybV9hbWRncHVfaW5mb19kZXZpY2UgZGV2X2luZm87CisJc3RydWN0IGFtZGdwdV9ncHVfaW5mbyBpbmZvOworCS8qKiBUaGUgZ2xvYmFsIFZBIG1hbmFnZXIgZm9yIHRoZSB3aG9sZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi8KKwlzdHJ1Y3QgYW1kZ3B1X2JvX3ZhX21nciB2YW1ncjsKKwkvKiogVGhlIFZBIG1hbmFnZXIgZm9yIHRoZSAzMmJpdCBhZGRyZXNzIHNwYWNlICovCisJc3RydWN0IGFtZGdwdV9ib192YV9tZ3IgdmFtZ3JfMzI7Cit9OworCitzdHJ1Y3QgYW1kZ3B1X2JvIHsKKwlhdG9taWNfdCByZWZjb3VudDsKKwlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqZGV2OworCisJdWludDY0X3QgYWxsb2Nfc2l6ZTsKKworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCBmbGlua19uYW1lOworCisJcHRocmVhZF9tdXRleF90IGNwdV9hY2Nlc3NfbXV0ZXg7CisJdm9pZCAqY3B1X3B0cjsKKwlpbnQgY3B1X21hcF9jb3VudDsKK307CisKK3N0cnVjdCBhbWRncHVfYm9fbGlzdCB7CisJc3RydWN0IGFtZGdwdV9kZXZpY2UgKmRldjsKKworCXVpbnQzMl90IGhhbmRsZTsKK307CisKK3N0cnVjdCBhbWRncHVfY29udGV4dCB7CisJc3RydWN0IGFtZGdwdV9kZXZpY2UgKmRldjsKKwkvKiogTXV0ZXggZm9yIGFjY2Vzc2luZyBmZW5jZXMgYW5kIHRvIG1haW50YWluIGNvbW1hbmQgc3VibWlzc2lvbnMKKwkgICAgaW4gZ29vZCBzZXF1ZW5jZS4gKi8KKwlwdGhyZWFkX211dGV4X3Qgc2VxdWVuY2VfbXV0ZXg7CisJLyogY29udGV4dCBpZCovCisJdWludDMyX3QgaWQ7CisJdWludDY0X3QgbGFzdF9zZXFbQU1ER1BVX0hXX0lQX05VTV1bQU1ER1BVX0hXX0lQX0lOU1RBTkNFX01BWF9DT1VOVF1bQU1ER1BVX0NTX01BWF9SSU5HU107CisJc3RydWN0IGxpc3RfaGVhZCBzZW1fbGlzdFtBTURHUFVfSFdfSVBfTlVNXVtBTURHUFVfSFdfSVBfSU5TVEFOQ0VfTUFYX0NPVU5UXVtBTURHUFVfQ1NfTUFYX1JJTkdTXTsKK307CisKKy8qKgorICogU3RydWN0dXJlIGRlc2NyaWJpbmcgc3cgc2VtYXBob3JlIGJhc2VkIG9uIHNjaGVkdWxlcgorICoKKyAqLworc3RydWN0IGFtZGdwdV9zZW1hcGhvcmUgeworCWF0b21pY190IHJlZmNvdW50OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgYW1kZ3B1X2NzX2ZlbmNlIHNpZ25hbF9mZW5jZTsKK307CisKKy8qKgorICogRnVuY3Rpb25zLgorICovCisKK2RybV9wcml2YXRlIHZvaWQgYW1kZ3B1X3ZhbWdyX2luaXQoc3RydWN0IGFtZGdwdV9ib192YV9tZ3IgKm1nciwgdWludDY0X3Qgc3RhcnQsCisJCSAgICAgICB1aW50NjRfdCBtYXgsIHVpbnQ2NF90IGFsaWdubWVudCk7CisKK2RybV9wcml2YXRlIHZvaWQgYW1kZ3B1X3ZhbWdyX2RlaW5pdChzdHJ1Y3QgYW1kZ3B1X2JvX3ZhX21nciAqbWdyKTsKKworZHJtX3ByaXZhdGUgdWludDY0X3QKK2FtZGdwdV92YW1ncl9maW5kX3ZhKHN0cnVjdCBhbWRncHVfYm9fdmFfbWdyICptZ3IsIHVpbnQ2NF90IHNpemUsCisJCSAgICAgdWludDY0X3QgYWxpZ25tZW50LCB1aW50NjRfdCBiYXNlX3JlcXVpcmVkKTsKKworZHJtX3ByaXZhdGUgdm9pZAorYW1kZ3B1X3ZhbWdyX2ZyZWVfdmEoc3RydWN0IGFtZGdwdV9ib192YV9tZ3IgKm1nciwgdWludDY0X3QgdmEsIHVpbnQ2NF90IHNpemUpOworCitkcm1fcHJpdmF0ZSBpbnQgYW1kZ3B1X3BhcnNlX2FzaWNfaWRzKHN0cnVjdCBhbWRncHVfYXNpY19pZCAqKmFzaWNfaWRzKTsKKworZHJtX3ByaXZhdGUgaW50IGFtZGdwdV9xdWVyeV9ncHVfaW5mb19pbml0KGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldik7CisKK2RybV9wcml2YXRlIHVpbnQ2NF90IGFtZGdwdV9jc19jYWxjdWxhdGVfdGltZW91dCh1aW50NjRfdCB0aW1lb3V0KTsKKworLyoqCisgKiBJbmxpbmUgZnVuY3Rpb25zLgorICovCisKKy8qKgorICogSW5jcmVtZW50IHNyYyBhbmQgZGVjcmVtZW50IGRzdCBhcyBpZiB3ZSB3ZXJlIHVwZGF0aW5nIHJlZmVyZW5jZXMKKyAqIGZvciBhbiBhc3NpZ25tZW50IGJldHdlZW4gMiBwb2ludGVycyBvZiBzb21lIG9iamVjdHMuCisgKgorICogXHJldHVybiAgdHJ1ZSBpZiBkc3QgaXMgMAorICovCitzdGF0aWMgaW5saW5lIGJvb2wgdXBkYXRlX3JlZmVyZW5jZXMoYXRvbWljX3QgKmRzdCwgYXRvbWljX3QgKnNyYykKK3sKKwlpZiAoZHN0ICE9IHNyYykgeworCQkvKiBidW1wIHNyYyBmaXJzdCAqLworCQlpZiAoc3JjKSB7CisJCQlhc3NlcnQoYXRvbWljX3JlYWQoc3JjKSA+IDApOworCQkJYXRvbWljX2luYyhzcmMpOworCQl9CisJCWlmIChkc3QpIHsKKwkJCWFzc2VydChhdG9taWNfcmVhZChkc3QpID4gMCk7CisJCQlyZXR1cm4gYXRvbWljX2RlY19hbmRfdGVzdChkc3QpOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbWRncHUvYW1kZ3B1X3ZhbWdyLmMgYi9hbWRncHUvYW1kZ3B1X3ZhbWdyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIxMzg4ZQotLS0gL2Rldi9udWxsCisrKyBiL2FtZGdwdS9hbWRncHVfdmFtZ3IuYwpAQCAtMCwwICsxLDI4NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlICJhbWRncHUuaCIKKyNpbmNsdWRlICJhbWRncHVfZHJtLmgiCisjaW5jbHVkZSAiYW1kZ3B1X2ludGVybmFsLmgiCisjaW5jbHVkZSAidXRpbF9tYXRoLmgiCisKK2ludCBhbWRncHVfdmFfcmFuZ2VfcXVlcnkoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LAorCQkJICBlbnVtIGFtZGdwdV9ncHVfdmFfcmFuZ2UgdHlwZSwgdWludDY0X3QgKnN0YXJ0LCB1aW50NjRfdCAqZW5kKQoreworCWlmICh0eXBlID09IGFtZGdwdV9ncHVfdmFfcmFuZ2VfZ2VuZXJhbCkgeworCQkqc3RhcnQgPSBkZXYtPmRldl9pbmZvLnZpcnR1YWxfYWRkcmVzc19vZmZzZXQ7CisJCSplbmQgPSBkZXYtPmRldl9pbmZvLnZpcnR1YWxfYWRkcmVzc19tYXg7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworZHJtX3ByaXZhdGUgdm9pZCBhbWRncHVfdmFtZ3JfaW5pdChzdHJ1Y3QgYW1kZ3B1X2JvX3ZhX21nciAqbWdyLCB1aW50NjRfdCBzdGFydCwKKwkJCSAgICAgIHVpbnQ2NF90IG1heCwgdWludDY0X3QgYWxpZ25tZW50KQoreworCW1nci0+dmFfb2Zmc2V0ID0gc3RhcnQ7CisJbWdyLT52YV9tYXggPSBtYXg7CisJbWdyLT52YV9hbGlnbm1lbnQgPSBhbGlnbm1lbnQ7CisKKwlsaXN0X2luaXRoZWFkKCZtZ3ItPnZhX2hvbGVzKTsKKwlwdGhyZWFkX211dGV4X2luaXQoJm1nci0+Ym9fdmFfbXV0ZXgsIE5VTEwpOworfQorCitkcm1fcHJpdmF0ZSB2b2lkIGFtZGdwdV92YW1ncl9kZWluaXQoc3RydWN0IGFtZGdwdV9ib192YV9tZ3IgKm1ncikKK3sKKwlzdHJ1Y3QgYW1kZ3B1X2JvX3ZhX2hvbGUgKmhvbGUsICp0bXA7CisJTElTVF9GT1JfRUFDSF9FTlRSWV9TQUZFKGhvbGUsIHRtcCwgJm1nci0+dmFfaG9sZXMsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmhvbGUtPmxpc3QpOworCQlmcmVlKGhvbGUpOworCX0KKwlwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1nci0+Ym9fdmFfbXV0ZXgpOworfQorCitkcm1fcHJpdmF0ZSB1aW50NjRfdAorYW1kZ3B1X3ZhbWdyX2ZpbmRfdmEoc3RydWN0IGFtZGdwdV9ib192YV9tZ3IgKm1nciwgdWludDY0X3Qgc2l6ZSwKKwkJICAgICB1aW50NjRfdCBhbGlnbm1lbnQsIHVpbnQ2NF90IGJhc2VfcmVxdWlyZWQpCit7CisJc3RydWN0IGFtZGdwdV9ib192YV9ob2xlICpob2xlLCAqbjsKKwl1aW50NjRfdCBvZmZzZXQgPSAwLCB3YXN0ZSA9IDA7CisKKwlhbGlnbm1lbnQgPSBNQVgyKGFsaWdubWVudCwgbWdyLT52YV9hbGlnbm1lbnQpOworCXNpemUgPSBBTElHTihzaXplLCBtZ3ItPnZhX2FsaWdubWVudCk7CisKKwlpZiAoYmFzZV9yZXF1aXJlZCAlIGFsaWdubWVudCkKKwkJcmV0dXJuIEFNREdQVV9JTlZBTElEX1ZBX0FERFJFU1M7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJm1nci0+Ym9fdmFfbXV0ZXgpOworCS8qIFRPRE86IHVzaW5nIG1vcmUgYXBwcm9wcmlhdGUgd2F5IHRvIHRyYWNrIHRoZSBob2xlcyAqLworCS8qIGZpcnN0IGxvb2sgZm9yIGEgaG9sZSAqLworCUxJU1RfRk9SX0VBQ0hfRU5UUllfU0FGRShob2xlLCBuLCAmbWdyLT52YV9ob2xlcywgbGlzdCkgeworCQlpZiAoYmFzZV9yZXF1aXJlZCkgeworCQkJaWYoaG9sZS0+b2Zmc2V0ID4gYmFzZV9yZXF1aXJlZCB8fAorCQkJCShob2xlLT5vZmZzZXQgKyBob2xlLT5zaXplKSA8IChiYXNlX3JlcXVpcmVkICsgc2l6ZSkpCisJCQkJY29udGludWU7CisJCQl3YXN0ZSA9IGJhc2VfcmVxdWlyZWQgLSBob2xlLT5vZmZzZXQ7CisJCQlvZmZzZXQgPSBiYXNlX3JlcXVpcmVkOworCQl9IGVsc2UgeworCQkJb2Zmc2V0ID0gaG9sZS0+b2Zmc2V0OworCQkJd2FzdGUgPSBvZmZzZXQgJSBhbGlnbm1lbnQ7CisJCQl3YXN0ZSA9IHdhc3RlID8gYWxpZ25tZW50IC0gd2FzdGUgOiAwOworCQkJb2Zmc2V0ICs9IHdhc3RlOworCQkJaWYgKG9mZnNldCA+PSAoaG9sZS0+b2Zmc2V0ICsgaG9sZS0+c2l6ZSkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlpZiAoIXdhc3RlICYmIGhvbGUtPnNpemUgPT0gc2l6ZSkgeworCQkJb2Zmc2V0ID0gaG9sZS0+b2Zmc2V0OworCQkJbGlzdF9kZWwoJmhvbGUtPmxpc3QpOworCQkJZnJlZShob2xlKTsKKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtZ3ItPmJvX3ZhX211dGV4KTsKKwkJCXJldHVybiBvZmZzZXQ7CisJCX0KKwkJaWYgKChob2xlLT5zaXplIC0gd2FzdGUpID4gc2l6ZSkgeworCQkJaWYgKHdhc3RlKSB7CisJCQkJbiA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGFtZGdwdV9ib192YV9ob2xlKSk7CisJCQkJbi0+c2l6ZSA9IHdhc3RlOworCQkJCW4tPm9mZnNldCA9IGhvbGUtPm9mZnNldDsKKwkJCQlsaXN0X2FkZCgmbi0+bGlzdCwgJmhvbGUtPmxpc3QpOworCQkJfQorCQkJaG9sZS0+c2l6ZSAtPSAoc2l6ZSArIHdhc3RlKTsKKwkJCWhvbGUtPm9mZnNldCArPSBzaXplICsgd2FzdGU7CisJCQlwdGhyZWFkX211dGV4X3VubG9jaygmbWdyLT5ib192YV9tdXRleCk7CisJCQlyZXR1cm4gb2Zmc2V0OworCQl9CisJCWlmICgoaG9sZS0+c2l6ZSAtIHdhc3RlKSA9PSBzaXplKSB7CisJCQlob2xlLT5zaXplID0gd2FzdGU7CisJCQlwdGhyZWFkX211dGV4X3VubG9jaygmbWdyLT5ib192YV9tdXRleCk7CisJCQlyZXR1cm4gb2Zmc2V0OworCQl9CisJfQorCisJaWYgKGJhc2VfcmVxdWlyZWQpIHsKKwkJaWYgKGJhc2VfcmVxdWlyZWQgPCBtZ3ItPnZhX29mZnNldCkgeworCQkJcHRocmVhZF9tdXRleF91bmxvY2soJm1nci0+Ym9fdmFfbXV0ZXgpOworCQkJcmV0dXJuIEFNREdQVV9JTlZBTElEX1ZBX0FERFJFU1M7CisJCX0KKwkJb2Zmc2V0ID0gbWdyLT52YV9vZmZzZXQ7CisJCXdhc3RlID0gYmFzZV9yZXF1aXJlZCAtIG1nci0+dmFfb2Zmc2V0OworCX0gZWxzZSB7CisJCW9mZnNldCA9IG1nci0+dmFfb2Zmc2V0OworCQl3YXN0ZSA9IG9mZnNldCAlIGFsaWdubWVudDsKKwkJd2FzdGUgPSB3YXN0ZSA/IGFsaWdubWVudCAtIHdhc3RlIDogMDsKKwl9CisKKwlpZiAob2Zmc2V0ICsgd2FzdGUgKyBzaXplID4gbWdyLT52YV9tYXgpIHsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJm1nci0+Ym9fdmFfbXV0ZXgpOworCQlyZXR1cm4gQU1ER1BVX0lOVkFMSURfVkFfQUREUkVTUzsKKwl9CisKKwlpZiAod2FzdGUpIHsKKwkJbiA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGFtZGdwdV9ib192YV9ob2xlKSk7CisJCW4tPnNpemUgPSB3YXN0ZTsKKwkJbi0+b2Zmc2V0ID0gb2Zmc2V0OworCQlsaXN0X2FkZCgmbi0+bGlzdCwgJm1nci0+dmFfaG9sZXMpOworCX0KKworCW9mZnNldCArPSB3YXN0ZTsKKwltZ3ItPnZhX29mZnNldCArPSBzaXplICsgd2FzdGU7CisJcHRocmVhZF9tdXRleF91bmxvY2soJm1nci0+Ym9fdmFfbXV0ZXgpOworCXJldHVybiBvZmZzZXQ7Cit9CisKK2RybV9wcml2YXRlIHZvaWQKK2FtZGdwdV92YW1ncl9mcmVlX3ZhKHN0cnVjdCBhbWRncHVfYm9fdmFfbWdyICptZ3IsIHVpbnQ2NF90IHZhLCB1aW50NjRfdCBzaXplKQoreworCXN0cnVjdCBhbWRncHVfYm9fdmFfaG9sZSAqaG9sZTsKKworCWlmICh2YSA9PSBBTURHUFVfSU5WQUxJRF9WQV9BRERSRVNTKQorCQlyZXR1cm47CisKKwlzaXplID0gQUxJR04oc2l6ZSwgbWdyLT52YV9hbGlnbm1lbnQpOworCisJcHRocmVhZF9tdXRleF9sb2NrKCZtZ3ItPmJvX3ZhX211dGV4KTsKKwlpZiAoKHZhICsgc2l6ZSkgPT0gbWdyLT52YV9vZmZzZXQpIHsKKwkJbWdyLT52YV9vZmZzZXQgPSB2YTsKKwkJLyogRGVsZXRlIHVwcGVybW9zdCBob2xlIGlmIGl0IHJlYWNoZXMgdGhlIG5ldyB0b3AgKi8KKwkJaWYgKCFMSVNUX0lTX0VNUFRZKCZtZ3ItPnZhX2hvbGVzKSkgeworCQkJaG9sZSA9IGNvbnRhaW5lcl9vZihtZ3ItPnZhX2hvbGVzLm5leHQsIGhvbGUsIGxpc3QpOworCQkJaWYgKChob2xlLT5vZmZzZXQgKyBob2xlLT5zaXplKSA9PSB2YSkgeworCQkJCW1nci0+dmFfb2Zmc2V0ID0gaG9sZS0+b2Zmc2V0OworCQkJCWxpc3RfZGVsKCZob2xlLT5saXN0KTsKKwkJCQlmcmVlKGhvbGUpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJc3RydWN0IGFtZGdwdV9ib192YV9ob2xlICpuZXh0OworCisJCWhvbGUgPSBjb250YWluZXJfb2YoJm1nci0+dmFfaG9sZXMsIGhvbGUsIGxpc3QpOworCQlMSVNUX0ZPUl9FQUNIX0VOVFJZKG5leHQsICZtZ3ItPnZhX2hvbGVzLCBsaXN0KSB7CisJCQlpZiAobmV4dC0+b2Zmc2V0IDwgdmEpCisJCQkJYnJlYWs7CisJCQlob2xlID0gbmV4dDsKKwkJfQorCisJCWlmICgmaG9sZS0+bGlzdCAhPSAmbWdyLT52YV9ob2xlcykgeworCQkJLyogR3JvdyB1cHBlciBob2xlIGlmIGl0J3MgYWRqYWNlbnQgKi8KKwkJCWlmIChob2xlLT5vZmZzZXQgPT0gKHZhICsgc2l6ZSkpIHsKKwkJCQlob2xlLT5vZmZzZXQgPSB2YTsKKwkJCQlob2xlLT5zaXplICs9IHNpemU7CisJCQkJLyogTWVyZ2UgbG93ZXIgaG9sZSBpZiBpdCdzIGFkamFjZW50ICovCisJCQkJaWYgKG5leHQgIT0gaG9sZQorCQkJCQkJJiYgJm5leHQtPmxpc3QgIT0gJm1nci0+dmFfaG9sZXMKKwkJCQkJCSYmIChuZXh0LT5vZmZzZXQgKyBuZXh0LT5zaXplKSA9PSB2YSkgeworCQkJCQluZXh0LT5zaXplICs9IGhvbGUtPnNpemU7CisJCQkJCWxpc3RfZGVsKCZob2xlLT5saXN0KTsKKwkJCQkJZnJlZShob2xlKTsKKwkJCQl9CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCQkvKiBHcm93IGxvd2VyIGhvbGUgaWYgaXQncyBhZGphY2VudCAqLworCQlpZiAobmV4dCAhPSBob2xlICYmICZuZXh0LT5saXN0ICE9ICZtZ3ItPnZhX2hvbGVzICYmCisJCQkJKG5leHQtPm9mZnNldCArIG5leHQtPnNpemUpID09IHZhKSB7CisJCQluZXh0LT5zaXplICs9IHNpemU7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIEZJWE1FIG9uIGFsbG9jYXRpb24gZmFpbHVyZSB3ZSBqdXN0IGxvc2UgdmlydHVhbCBhZGRyZXNzIHNwYWNlCisJCSAqIG1heWJlIHByaW50IGEgd2FybmluZworCQkgKi8KKwkJbmV4dCA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGFtZGdwdV9ib192YV9ob2xlKSk7CisJCWlmIChuZXh0KSB7CisJCQluZXh0LT5zaXplID0gc2l6ZTsKKwkJCW5leHQtPm9mZnNldCA9IHZhOworCQkJbGlzdF9hZGQoJm5leHQtPmxpc3QsICZob2xlLT5saXN0KTsKKwkJfQorCX0KK291dDoKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbWdyLT5ib192YV9tdXRleCk7Cit9CisKK2ludCBhbWRncHVfdmFfcmFuZ2VfYWxsb2MoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LAorCQkJICBlbnVtIGFtZGdwdV9ncHVfdmFfcmFuZ2UgdmFfcmFuZ2VfdHlwZSwKKwkJCSAgdWludDY0X3Qgc2l6ZSwKKwkJCSAgdWludDY0X3QgdmFfYmFzZV9hbGlnbm1lbnQsCisJCQkgIHVpbnQ2NF90IHZhX2Jhc2VfcmVxdWlyZWQsCisJCQkgIHVpbnQ2NF90ICp2YV9iYXNlX2FsbG9jYXRlZCwKKwkJCSAgYW1kZ3B1X3ZhX2hhbmRsZSAqdmFfcmFuZ2VfaGFuZGxlLAorCQkJICB1aW50NjRfdCBmbGFncykKK3sKKwlzdHJ1Y3QgYW1kZ3B1X2JvX3ZhX21nciAqdmFtZ3I7CisKKwlpZiAoZmxhZ3MgJiBBTURHUFVfVkFfUkFOR0VfMzJfQklUKQorCQl2YW1nciA9ICZkZXYtPnZhbWdyXzMyOworCWVsc2UKKwkJdmFtZ3IgPSAmZGV2LT52YW1ncjsKKworCXZhX2Jhc2VfYWxpZ25tZW50ID0gTUFYMih2YV9iYXNlX2FsaWdubWVudCwgdmFtZ3ItPnZhX2FsaWdubWVudCk7CisJc2l6ZSA9IEFMSUdOKHNpemUsIHZhbWdyLT52YV9hbGlnbm1lbnQpOworCisJKnZhX2Jhc2VfYWxsb2NhdGVkID0gYW1kZ3B1X3ZhbWdyX2ZpbmRfdmEodmFtZ3IsIHNpemUsCisJCQkJCXZhX2Jhc2VfYWxpZ25tZW50LCB2YV9iYXNlX3JlcXVpcmVkKTsKKworCWlmICghKGZsYWdzICYgQU1ER1BVX1ZBX1JBTkdFXzMyX0JJVCkgJiYKKwkgICAgKCp2YV9iYXNlX2FsbG9jYXRlZCA9PSBBTURHUFVfSU5WQUxJRF9WQV9BRERSRVNTKSkgeworCQkvKiBmYWxsYmFjayB0byAzMmJpdCBhZGRyZXNzICovCisJCXZhbWdyID0gJmRldi0+dmFtZ3JfMzI7CisJCSp2YV9iYXNlX2FsbG9jYXRlZCA9IGFtZGdwdV92YW1ncl9maW5kX3ZhKHZhbWdyLCBzaXplLAorCQkJCQl2YV9iYXNlX2FsaWdubWVudCwgdmFfYmFzZV9yZXF1aXJlZCk7CisJfQorCisJaWYgKCp2YV9iYXNlX2FsbG9jYXRlZCAhPSBBTURHUFVfSU5WQUxJRF9WQV9BRERSRVNTKSB7CisJCXN0cnVjdCBhbWRncHVfdmEqIHZhOworCQl2YSA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGFtZGdwdV92YSkpOworCQlpZighdmEpeworCQkJYW1kZ3B1X3ZhbWdyX2ZyZWVfdmEodmFtZ3IsICp2YV9iYXNlX2FsbG9jYXRlZCwgc2l6ZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQl2YS0+ZGV2ID0gZGV2OworCQl2YS0+YWRkcmVzcyA9ICp2YV9iYXNlX2FsbG9jYXRlZDsKKwkJdmEtPnNpemUgPSBzaXplOworCQl2YS0+cmFuZ2UgPSB2YV9yYW5nZV90eXBlOworCQl2YS0+dmFtZ3IgPSB2YW1ncjsKKwkJKnZhX3JhbmdlX2hhbmRsZSA9IHZhOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgYW1kZ3B1X3ZhX3JhbmdlX2ZyZWUoYW1kZ3B1X3ZhX2hhbmRsZSB2YV9yYW5nZV9oYW5kbGUpCit7CisJaWYoIXZhX3JhbmdlX2hhbmRsZSB8fCAhdmFfcmFuZ2VfaGFuZGxlLT5hZGRyZXNzKQorCQlyZXR1cm4gMDsKKworCWFtZGdwdV92YW1ncl9mcmVlX3ZhKHZhX3JhbmdlX2hhbmRsZS0+dmFtZ3IsCisJCQl2YV9yYW5nZV9oYW5kbGUtPmFkZHJlc3MsCisJCQl2YV9yYW5nZV9oYW5kbGUtPnNpemUpOworCWZyZWUodmFfcmFuZ2VfaGFuZGxlKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FtZGdwdS9saWJkcm1fYW1kZ3B1LnBjLmluIGIvYW1kZ3B1L2xpYmRybV9hbWRncHUucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjNTUyYQotLS0gL2Rldi9udWxsCisrKyBiL2FtZGdwdS9saWJkcm1fYW1kZ3B1LnBjLmluCkBAIC0wLDAgKzEsMTEgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiBsaWJkcm1fYW1kZ3B1CitEZXNjcmlwdGlvbjogVXNlcnNwYWNlIGludGVyZmFjZSB0byBrZXJuZWwgRFJNIHNlcnZpY2VzIGZvciBhbWRncHUKK1ZlcnNpb246IEBQQUNLQUdFX1ZFUlNJT05ACitMaWJzOiAtTCR7bGliZGlyfSAtbGRybV9hbWRncHUKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9IC1JJHtpbmNsdWRlZGlyfS9saWJkcm0KK1JlcXVpcmVzLnByaXZhdGU6IGxpYmRybQpkaWZmIC0tZ2l0IGEvYW1kZ3B1L3V0aWxfaGFzaC5jIGIvYW1kZ3B1L3V0aWxfaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3Y2I2NzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbWRncHUvdXRpbF9oYXNoLmMKQEAgLTAsMCArMSwzODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDA3IFZNd2FyZSwgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBWTVdBUkUgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgLyoKKyAgKiBBdXRob3JzOgorICAqICAgWmFjayBSdXNpbiA8emFja3JAdm13YXJlLmNvbT4KKyAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAidXRpbF9oYXNoLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2RlZmluZSBNQVgoYSwgYikgKChhID4gYikgPyAoYSkgOiAoYikpCisKK3N0YXRpYyBjb25zdCBpbnQgTWluTnVtQml0cyA9IDQ7CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHByaW1lX2RlbHRhc1tdID0geworCTAsICAwLCAgMSwgIDMsICAxLCAgNSwgIDMsICAzLCAgMSwgIDksICA3LCAgNSwgIDMsICA5LCAyNSwgIDMsCisJMSwgMjEsICAzLCAyMSwgIDcsIDE1LCAgOSwgIDUsICAzLCAyOSwgMTUsICAwLCAgMCwgIDAsICAwLCAgMAorfTsKKworc3RhdGljIGludCBwcmltZUZvck51bUJpdHMoaW50IG51bUJpdHMpCit7CisJcmV0dXJuICgxIDw8IG51bUJpdHMpICsgcHJpbWVfZGVsdGFzW251bUJpdHNdOworfQorCisvKiBSZXR1cm5zIHRoZSBzbWFsbGVzdCBpbnRlZ2VyIG4gc3VjaCB0aGF0CisgICBwcmltZUZvck51bUJpdHMobikgPj0gaGludC4KKyovCitzdGF0aWMgaW50IGNvdW50Qml0cyhpbnQgaGludCkKK3sKKwlpbnQgbnVtQml0cyA9IDA7CisJaW50IGJpdHMgPSBoaW50OworCisJd2hpbGUgKGJpdHMgPiAxKSB7CisJCWJpdHMgPj49IDE7CisJCW51bUJpdHMrKzsKKwl9CisKKwlpZiAobnVtQml0cyA+PSAoaW50KXNpemVvZihwcmltZV9kZWx0YXMpKSB7CisJCW51bUJpdHMgPSBzaXplb2YocHJpbWVfZGVsdGFzKSAtIDE7CisJfSBlbHNlIGlmIChwcmltZUZvck51bUJpdHMobnVtQml0cykgPCBoaW50KSB7CisJCSsrbnVtQml0czsKKwl9CisJcmV0dXJuIG51bUJpdHM7Cit9CisKK3N0cnVjdCB1dGlsX25vZGUgeworICAgc3RydWN0IHV0aWxfbm9kZSAqbmV4dDsKKyAgIHVuc2lnbmVkIGtleTsKKyAgIHZvaWQgKnZhbHVlOworfTsKKworc3RydWN0IHV0aWxfaGFzaF9kYXRhIHsKKyAgIHN0cnVjdCB1dGlsX25vZGUgKmZha2VOZXh0OworICAgc3RydWN0IHV0aWxfbm9kZSAqKmJ1Y2tldHM7CisgICBpbnQgc2l6ZTsKKyAgIGludCBub2RlU2l6ZTsKKyAgIHNob3J0IHVzZXJOdW1CaXRzOworICAgc2hvcnQgbnVtQml0czsKKyAgIGludCBudW1CdWNrZXRzOworfTsKKworc3RydWN0IHV0aWxfaGFzaCB7CisgICB1bmlvbiB7CisgICAgICBzdHJ1Y3QgdXRpbF9oYXNoX2RhdGEgKmQ7CisgICAgICBzdHJ1Y3QgdXRpbF9ub2RlICAgICAgKmU7CisgICB9IGRhdGE7Cit9OworCitzdGF0aWMgdm9pZCAqdXRpbF9kYXRhX2FsbG9jYXRlX25vZGUoc3RydWN0IHV0aWxfaGFzaF9kYXRhICpoYXNoKQoreworICAgcmV0dXJuIG1hbGxvYyhoYXNoLT5ub2RlU2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHV0aWxfZnJlZV9ub2RlKHN0cnVjdCB1dGlsX25vZGUgKm5vZGUpCit7CisgICBmcmVlKG5vZGUpOworfQorCitzdGF0aWMgc3RydWN0IHV0aWxfbm9kZSAqCit1dGlsX2hhc2hfY3JlYXRlX25vZGUoc3RydWN0IHV0aWxfaGFzaCAqaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBha2V5LCB2b2lkICphdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHV0aWxfbm9kZSAqKmFuZXh0Tm9kZSkKK3sKKyAgIHN0cnVjdCB1dGlsX25vZGUgKm5vZGUgPSB1dGlsX2RhdGFfYWxsb2NhdGVfbm9kZShoYXNoLT5kYXRhLmQpOworCisgICBpZiAoIW5vZGUpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgbm9kZS0+a2V5ID0gYWtleTsKKyAgIG5vZGUtPnZhbHVlID0gYXZhbHVlOworCisgICBub2RlLT5uZXh0ID0gKHN0cnVjdCB1dGlsX25vZGUqKSgqYW5leHROb2RlKTsKKyAgICphbmV4dE5vZGUgPSBub2RlOworICAgKytoYXNoLT5kYXRhLmQtPnNpemU7CisgICByZXR1cm4gbm9kZTsKK30KKworc3RhdGljIHZvaWQgdXRpbF9kYXRhX3JlaGFzaChzdHJ1Y3QgdXRpbF9oYXNoX2RhdGEgKmhhc2gsIGludCBoaW50KQoreworICAgaWYgKGhpbnQgPCAwKSB7CisgICAgICBoaW50ID0gY291bnRCaXRzKC1oaW50KTsKKyAgICAgIGlmIChoaW50IDwgTWluTnVtQml0cykKKyAgICAgICAgIGhpbnQgPSBNaW5OdW1CaXRzOworICAgICAgaGFzaC0+dXNlck51bUJpdHMgPSAoc2hvcnQpaGludDsKKyAgICAgIHdoaWxlIChwcmltZUZvck51bUJpdHMoaGludCkgPCAoaGFzaC0+c2l6ZSA+PiAxKSkKKyAgICAgICAgICsraGludDsKKyAgIH0gZWxzZSBpZiAoaGludCA8IE1pbk51bUJpdHMpIHsKKyAgICAgIGhpbnQgPSBNaW5OdW1CaXRzOworICAgfQorCisgICBpZiAoaGFzaC0+bnVtQml0cyAhPSBoaW50KSB7CisgICAgICBzdHJ1Y3QgdXRpbF9ub2RlICplID0gKHN0cnVjdCB1dGlsX25vZGUgKikoaGFzaCk7CisgICAgICBzdHJ1Y3QgdXRpbF9ub2RlICoqb2xkQnVja2V0cyA9IGhhc2gtPmJ1Y2tldHM7CisgICAgICBpbnQgb2xkTnVtQnVja2V0cyA9IGhhc2gtPm51bUJ1Y2tldHM7CisgICAgICBpbnQgIGkgPSAwOworCisgICAgICBoYXNoLT5udW1CaXRzID0gKHNob3J0KWhpbnQ7CisgICAgICBoYXNoLT5udW1CdWNrZXRzID0gcHJpbWVGb3JOdW1CaXRzKGhpbnQpOworICAgICAgaGFzaC0+YnVja2V0cyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHV0aWxfbm9kZSopICogaGFzaC0+bnVtQnVja2V0cyk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgaGFzaC0+bnVtQnVja2V0czsgKytpKQorICAgICAgICAgaGFzaC0+YnVja2V0c1tpXSA9IGU7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBvbGROdW1CdWNrZXRzOyArK2kpIHsKKyAgICAgICAgIHN0cnVjdCB1dGlsX25vZGUgKmZpcnN0Tm9kZSA9IG9sZEJ1Y2tldHNbaV07CisgICAgICAgICB3aGlsZSAoZmlyc3ROb2RlICE9IGUpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGggPSBmaXJzdE5vZGUtPmtleTsKKyAgICAgICAgICAgIHN0cnVjdCB1dGlsX25vZGUgKmxhc3ROb2RlID0gZmlyc3ROb2RlOworICAgICAgICAgICAgc3RydWN0IHV0aWxfbm9kZSAqYWZ0ZXJMYXN0Tm9kZTsKKyAgICAgICAgICAgIHN0cnVjdCB1dGlsX25vZGUgKipiZWZvcmVGaXJzdE5vZGU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHdoaWxlIChsYXN0Tm9kZS0+bmV4dCAhPSBlICYmIGxhc3ROb2RlLT5uZXh0LT5rZXkgPT0gaCkKKyAgICAgICAgICAgICAgIGxhc3ROb2RlID0gbGFzdE5vZGUtPm5leHQ7CisKKyAgICAgICAgICAgIGFmdGVyTGFzdE5vZGUgPSBsYXN0Tm9kZS0+bmV4dDsKKyAgICAgICAgICAgIGJlZm9yZUZpcnN0Tm9kZSA9ICZoYXNoLT5idWNrZXRzW2ggJSBoYXNoLT5udW1CdWNrZXRzXTsKKyAgICAgICAgICAgIHdoaWxlICgqYmVmb3JlRmlyc3ROb2RlICE9IGUpCisgICAgICAgICAgICAgICBiZWZvcmVGaXJzdE5vZGUgPSAmKCpiZWZvcmVGaXJzdE5vZGUpLT5uZXh0OworICAgICAgICAgICAgbGFzdE5vZGUtPm5leHQgPSAqYmVmb3JlRmlyc3ROb2RlOworICAgICAgICAgICAgKmJlZm9yZUZpcnN0Tm9kZSA9IGZpcnN0Tm9kZTsKKyAgICAgICAgICAgIGZpcnN0Tm9kZSA9IGFmdGVyTGFzdE5vZGU7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBmcmVlKG9sZEJ1Y2tldHMpOworICAgfQorfQorCitzdGF0aWMgdm9pZCB1dGlsX2RhdGFfbWlnaHRfZ3JvdyhzdHJ1Y3QgdXRpbF9oYXNoX2RhdGEgKmhhc2gpCit7CisgICBpZiAoaGFzaC0+c2l6ZSA+PSBoYXNoLT5udW1CdWNrZXRzKQorICAgICAgdXRpbF9kYXRhX3JlaGFzaChoYXNoLCBoYXNoLT5udW1CaXRzICsgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHV0aWxfZGF0YV9oYXNfc2hydW5rKHN0cnVjdCB1dGlsX2hhc2hfZGF0YSAqaGFzaCkKK3sKKyAgIGlmIChoYXNoLT5zaXplIDw9IChoYXNoLT5udW1CdWNrZXRzID4+IDMpICYmCisgICAgICAgaGFzaC0+bnVtQml0cyA+IGhhc2gtPnVzZXJOdW1CaXRzKSB7CisgICAgICBpbnQgbWF4ID0gTUFYKGhhc2gtPm51bUJpdHMtMiwgaGFzaC0+dXNlck51bUJpdHMpOworICAgICAgdXRpbF9kYXRhX3JlaGFzaChoYXNoLCAgbWF4KTsKKyAgIH0KK30KKworc3RhdGljIHN0cnVjdCB1dGlsX25vZGUgKnV0aWxfZGF0YV9maXJzdF9ub2RlKHN0cnVjdCB1dGlsX2hhc2hfZGF0YSAqaGFzaCkKK3sKKyAgIHN0cnVjdCB1dGlsX25vZGUgKmUgPSAoc3RydWN0IHV0aWxfbm9kZSAqKShoYXNoKTsKKyAgIHN0cnVjdCB1dGlsX25vZGUgKipidWNrZXQgPSBoYXNoLT5idWNrZXRzOworICAgaW50IG4gPSBoYXNoLT5udW1CdWNrZXRzOworICAgd2hpbGUgKG4tLSkgeworICAgICAgaWYgKCpidWNrZXQgIT0gZSkKKyAgICAgICAgIHJldHVybiAqYnVja2V0OworICAgICAgKytidWNrZXQ7CisgICB9CisgICByZXR1cm4gZTsKK30KKworc3RhdGljIHN0cnVjdCB1dGlsX25vZGUgKip1dGlsX2hhc2hfZmluZF9ub2RlKHN0cnVjdCB1dGlsX2hhc2ggKmhhc2gsIHVuc2lnbmVkIGFrZXkpCit7CisgICBzdHJ1Y3QgdXRpbF9ub2RlICoqbm9kZTsKKworICAgaWYgKGhhc2gtPmRhdGEuZC0+bnVtQnVja2V0cykgeworICAgICAgbm9kZSA9IChzdHJ1Y3QgdXRpbF9ub2RlICoqKSgmaGFzaC0+ZGF0YS5kLT5idWNrZXRzW2FrZXkgJSBoYXNoLT5kYXRhLmQtPm51bUJ1Y2tldHNdKTsKKyAgICAgIGFzc2VydCgqbm9kZSA9PSBoYXNoLT5kYXRhLmUgfHwgKCpub2RlKS0+bmV4dCk7CisgICAgICB3aGlsZSAoKm5vZGUgIT0gaGFzaC0+ZGF0YS5lICYmICgqbm9kZSktPmtleSAhPSBha2V5KQorICAgICAgICAgbm9kZSA9ICYoKm5vZGUpLT5uZXh0OworICAgfSBlbHNlIHsKKyAgICAgIG5vZGUgPSAoc3RydWN0IHV0aWxfbm9kZSAqKikoKGNvbnN0IHN0cnVjdCB1dGlsX25vZGUgKiBjb25zdCAqKSgmaGFzaC0+ZGF0YS5lKSk7CisgICB9CisgICByZXR1cm4gbm9kZTsKK30KKworZHJtX3ByaXZhdGUgc3RydWN0IHV0aWxfaGFzaF9pdGVyCit1dGlsX2hhc2hfaW5zZXJ0KHN0cnVjdCB1dGlsX2hhc2ggKmhhc2gsIHVuc2lnbmVkIGtleSwgdm9pZCAqZGF0YSkKK3sKKyAgIHV0aWxfZGF0YV9taWdodF9ncm93KGhhc2gtPmRhdGEuZCk7CisKKyAgIHsKKyAgICAgIHN0cnVjdCB1dGlsX25vZGUgKipuZXh0Tm9kZSA9IHV0aWxfaGFzaF9maW5kX25vZGUoaGFzaCwga2V5KTsKKyAgICAgIHN0cnVjdCB1dGlsX25vZGUgKm5vZGUgPSB1dGlsX2hhc2hfY3JlYXRlX25vZGUoaGFzaCwga2V5LCBkYXRhLCBuZXh0Tm9kZSk7CisgICAgICBpZiAoIW5vZGUpIHsKKyAgICAgICAgIHN0cnVjdCB1dGlsX2hhc2hfaXRlciBudWxsX2l0ZXIgPSB7aGFzaCwgMH07CisgICAgICAgICByZXR1cm4gbnVsbF9pdGVyOworICAgICAgfQorCisgICAgICB7CisgICAgICAgICBzdHJ1Y3QgdXRpbF9oYXNoX2l0ZXIgaXRlciA9IHtoYXNoLCBub2RlfTsKKyAgICAgICAgIHJldHVybiBpdGVyOworICAgICAgfQorICAgfQorfQorCitkcm1fcHJpdmF0ZSBzdHJ1Y3QgdXRpbF9oYXNoICp1dGlsX2hhc2hfY3JlYXRlKHZvaWQpCit7CisgICBzdHJ1Y3QgdXRpbF9oYXNoICpoYXNoID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXRpbF9oYXNoKSk7CisgICBpZiAoIWhhc2gpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgaGFzaC0+ZGF0YS5kID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXRpbF9oYXNoX2RhdGEpKTsKKyAgIGlmICghaGFzaC0+ZGF0YS5kKSB7CisgICAgICBmcmVlKGhhc2gpOworICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgIGhhc2gtPmRhdGEuZC0+ZmFrZU5leHQgPSAwOworICAgaGFzaC0+ZGF0YS5kLT5idWNrZXRzID0gMDsKKyAgIGhhc2gtPmRhdGEuZC0+c2l6ZSA9IDA7CisgICBoYXNoLT5kYXRhLmQtPm5vZGVTaXplID0gc2l6ZW9mKHN0cnVjdCB1dGlsX25vZGUpOworICAgaGFzaC0+ZGF0YS5kLT51c2VyTnVtQml0cyA9IChzaG9ydClNaW5OdW1CaXRzOworICAgaGFzaC0+ZGF0YS5kLT5udW1CaXRzID0gMDsKKyAgIGhhc2gtPmRhdGEuZC0+bnVtQnVja2V0cyA9IDA7CisKKyAgIHJldHVybiBoYXNoOworfQorCitkcm1fcHJpdmF0ZSB2b2lkIHV0aWxfaGFzaF9kZWxldGUoc3RydWN0IHV0aWxfaGFzaCAqaGFzaCkKK3sKKyAgIHN0cnVjdCB1dGlsX25vZGUgKmVfZm9yX3ggPSAoc3RydWN0IHV0aWxfbm9kZSAqKShoYXNoLT5kYXRhLmQpOworICAgc3RydWN0IHV0aWxfbm9kZSAqKmJ1Y2tldCA9IChzdHJ1Y3QgdXRpbF9ub2RlICoqKShoYXNoLT5kYXRhLmQtPmJ1Y2tldHMpOworICAgaW50IG4gPSBoYXNoLT5kYXRhLmQtPm51bUJ1Y2tldHM7CisgICB3aGlsZSAobi0tKSB7CisgICAgICBzdHJ1Y3QgdXRpbF9ub2RlICpjdXIgPSAqYnVja2V0Kys7CisgICAgICB3aGlsZSAoY3VyICE9IGVfZm9yX3gpIHsKKyAgICAgICAgIHN0cnVjdCB1dGlsX25vZGUgKm5leHQgPSBjdXItPm5leHQ7CisgICAgICAgICB1dGlsX2ZyZWVfbm9kZShjdXIpOworICAgICAgICAgY3VyID0gbmV4dDsKKyAgICAgIH0KKyAgIH0KKyAgIGZyZWUoaGFzaC0+ZGF0YS5kLT5idWNrZXRzKTsKKyAgIGZyZWUoaGFzaC0+ZGF0YS5kKTsKKyAgIGZyZWUoaGFzaCk7Cit9CisKK2RybV9wcml2YXRlIHN0cnVjdCB1dGlsX2hhc2hfaXRlcgordXRpbF9oYXNoX2ZpbmQoc3RydWN0IHV0aWxfaGFzaCAqaGFzaCwgdW5zaWduZWQga2V5KQoreworICAgc3RydWN0IHV0aWxfbm9kZSAqKm5leHROb2RlID0gdXRpbF9oYXNoX2ZpbmRfbm9kZShoYXNoLCBrZXkpOworICAgc3RydWN0IHV0aWxfaGFzaF9pdGVyIGl0ZXIgPSB7aGFzaCwgKm5leHROb2RlfTsKKyAgIHJldHVybiBpdGVyOworfQorCitkcm1fcHJpdmF0ZSB1bnNpZ25lZCB1dGlsX2hhc2hfaXRlcl9rZXkoc3RydWN0IHV0aWxfaGFzaF9pdGVyIGl0ZXIpCit7CisgICBpZiAoIWl0ZXIubm9kZSB8fCBpdGVyLmhhc2gtPmRhdGEuZSA9PSBpdGVyLm5vZGUpCisgICAgICByZXR1cm4gMDsKKyAgIHJldHVybiBpdGVyLm5vZGUtPmtleTsKK30KKworZHJtX3ByaXZhdGUgdm9pZCAqdXRpbF9oYXNoX2l0ZXJfZGF0YShzdHJ1Y3QgdXRpbF9oYXNoX2l0ZXIgaXRlcikKK3sKKyAgIGlmICghaXRlci5ub2RlIHx8IGl0ZXIuaGFzaC0+ZGF0YS5lID09IGl0ZXIubm9kZSkKKyAgICAgIHJldHVybiAwOworICAgcmV0dXJuIGl0ZXIubm9kZS0+dmFsdWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXRpbF9ub2RlICp1dGlsX2hhc2hfZGF0YV9uZXh0KHN0cnVjdCB1dGlsX25vZGUgKm5vZGUpCit7CisgICB1bmlvbiB7CisgICAgICBzdHJ1Y3QgdXRpbF9ub2RlICpuZXh0OworICAgICAgc3RydWN0IHV0aWxfbm9kZSAqZTsKKyAgICAgIHN0cnVjdCB1dGlsX2hhc2hfZGF0YSAqZDsKKyAgIH0gYTsKKyAgIGludCBzdGFydDsKKyAgIHN0cnVjdCB1dGlsX25vZGUgKipidWNrZXQ7CisgICBpbnQgbjsKKworICAgYS5uZXh0ID0gbm9kZS0+bmV4dDsKKyAgIGlmICghYS5uZXh0KSB7CisgICAgICAvKiBpdGVyYXRpbmcgYmV5b25kIHRoZSBsYXN0IGVsZW1lbnQgKi8KKyAgICAgIHJldHVybiAwOworICAgfQorICAgaWYgKGEubmV4dC0+bmV4dCkKKyAgICAgIHJldHVybiBhLm5leHQ7CisKKyAgIHN0YXJ0ID0gKG5vZGUtPmtleSAlIGEuZC0+bnVtQnVja2V0cykgKyAxOworICAgYnVja2V0ID0gYS5kLT5idWNrZXRzICsgc3RhcnQ7CisgICBuID0gYS5kLT5udW1CdWNrZXRzIC0gc3RhcnQ7CisgICB3aGlsZSAobi0tKSB7CisgICAgICBpZiAoKmJ1Y2tldCAhPSBhLmUpCisgICAgICAgICByZXR1cm4gKmJ1Y2tldDsKKyAgICAgICsrYnVja2V0OworICAgfQorICAgcmV0dXJuIGEuZTsKK30KKworZHJtX3ByaXZhdGUgc3RydWN0IHV0aWxfaGFzaF9pdGVyCit1dGlsX2hhc2hfaXRlcl9uZXh0KHN0cnVjdCB1dGlsX2hhc2hfaXRlciBpdGVyKQoreworICAgc3RydWN0IHV0aWxfaGFzaF9pdGVyIG5leHQgPSB7aXRlci5oYXNoLCB1dGlsX2hhc2hfZGF0YV9uZXh0KGl0ZXIubm9kZSl9OworICAgcmV0dXJuIG5leHQ7Cit9CisKK2RybV9wcml2YXRlIGludCB1dGlsX2hhc2hfaXRlcl9pc19udWxsKHN0cnVjdCB1dGlsX2hhc2hfaXRlciBpdGVyKQoreworICAgaWYgKCFpdGVyLm5vZGUgfHwgaXRlci5ub2RlID09IGl0ZXIuaGFzaC0+ZGF0YS5lKQorICAgICAgcmV0dXJuIDE7CisgICByZXR1cm4gMDsKK30KKworZHJtX3ByaXZhdGUgdm9pZCAqdXRpbF9oYXNoX3Rha2Uoc3RydWN0IHV0aWxfaGFzaCAqaGFzaCwgdW5zaWduZWQgYWtleSkKK3sKKyAgIHN0cnVjdCB1dGlsX25vZGUgKipub2RlID0gdXRpbF9oYXNoX2ZpbmRfbm9kZShoYXNoLCBha2V5KTsKKyAgIGlmICgqbm9kZSAhPSBoYXNoLT5kYXRhLmUpIHsKKyAgICAgIHZvaWQgKnQgPSAoKm5vZGUpLT52YWx1ZTsKKyAgICAgIHN0cnVjdCB1dGlsX25vZGUgKm5leHQgPSAoKm5vZGUpLT5uZXh0OworICAgICAgdXRpbF9mcmVlX25vZGUoKm5vZGUpOworICAgICAgKm5vZGUgPSBuZXh0OworICAgICAgLS1oYXNoLT5kYXRhLmQtPnNpemU7CisgICAgICB1dGlsX2RhdGFfaGFzX3NocnVuayhoYXNoLT5kYXRhLmQpOworICAgICAgcmV0dXJuIHQ7CisgICB9CisgICByZXR1cm4gMDsKK30KKworZHJtX3ByaXZhdGUgc3RydWN0IHV0aWxfaGFzaF9pdGVyIHV0aWxfaGFzaF9maXJzdF9ub2RlKHN0cnVjdCB1dGlsX2hhc2ggKmhhc2gpCit7CisgICBzdHJ1Y3QgdXRpbF9oYXNoX2l0ZXIgaXRlciA9IHtoYXNoLCB1dGlsX2RhdGFfZmlyc3Rfbm9kZShoYXNoLT5kYXRhLmQpfTsKKyAgIHJldHVybiBpdGVyOworfQorCitkcm1fcHJpdmF0ZSBzdHJ1Y3QgdXRpbF9oYXNoX2l0ZXIKK3V0aWxfaGFzaF9lcmFzZShzdHJ1Y3QgdXRpbF9oYXNoICpoYXNoLCBzdHJ1Y3QgdXRpbF9oYXNoX2l0ZXIgaXRlcikKK3sKKyAgIHN0cnVjdCB1dGlsX2hhc2hfaXRlciByZXQgPSBpdGVyOworICAgc3RydWN0IHV0aWxfbm9kZSAqbm9kZSA9IGl0ZXIubm9kZTsKKyAgIHN0cnVjdCB1dGlsX25vZGUgKipub2RlX3B0cjsKKworICAgaWYgKG5vZGUgPT0gaGFzaC0+ZGF0YS5lKQorICAgICAgcmV0dXJuIGl0ZXI7CisKKyAgIHJldCA9IHV0aWxfaGFzaF9pdGVyX25leHQocmV0KTsKKyAgIG5vZGVfcHRyID0gKHN0cnVjdCB1dGlsX25vZGUqKikoJmhhc2gtPmRhdGEuZC0+YnVja2V0c1tub2RlLT5rZXkgJSBoYXNoLT5kYXRhLmQtPm51bUJ1Y2tldHNdKTsKKyAgIHdoaWxlICgqbm9kZV9wdHIgIT0gbm9kZSkKKyAgICAgIG5vZGVfcHRyID0gJigqbm9kZV9wdHIpLT5uZXh0OworICAgKm5vZGVfcHRyID0gbm9kZS0+bmV4dDsKKyAgIHV0aWxfZnJlZV9ub2RlKG5vZGUpOworICAgLS1oYXNoLT5kYXRhLmQtPnNpemU7CisgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYW1kZ3B1L3V0aWxfaGFzaC5oIGIvYW1kZ3B1L3V0aWxfaGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYTQ3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbWRncHUvdXRpbF9oYXNoLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDA3IFZNd2FyZSwgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBWTVdBUkUgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEBmaWxlCisgKiBIYXNoIGltcGxlbWVudGF0aW9uLgorICogCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgYSBoYXNoIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgY2FwYWJsZSBvZiBkZWFsaW5nCisgKiB3aXRoIGNvbGxpc2lvbnMuIEl0IHN0b3JlcyBjb2xsaWRpbmcgZW50cmllcyBpbiBsaW5rZWQgbGlzdC4gQWxsCisgKiBmdW5jdGlvbnMgb3BlcmF0aW5nIG9uIHRoZSBoYXNoIHJldHVybiBhbiBpdGVyYXRvci4gVGhlIGl0ZXJhdG9yCisgKiBpdHNlbGYgcG9pbnRzIHRvIHRoZSBjb2xsaXNpb24gbGlzdC4gSWYgdGhlcmUgd2Fzbid0IGFueSBjb2xsaXNpb24KKyAqIHRoZSBsaXN0IHdpbGwgaGF2ZSBqdXN0IG9uZSBlbnRyeSwgb3RoZXJ3aXNlIGNsaWVudCBjb2RlIHNob3VsZAorICogaXRlcmF0ZSBvdmVyIHRoZSBlbnRyaWVzIHRvIGZpbmQgdGhlIGV4YWN0IGVudHJ5IGFtb25nIG9uZXMgdGhhdAorICogaGFkIHRoZSBzYW1lIGtleSAoZS5nLiBtZW1jbXAgY291bGQgYmUgdXNlZCBvbiB0aGUgZGF0YSB0byBjaGVjaworICogdGhhdCkKKyAqIAorICogQGF1dGhvciBaYWNrIFJ1c2luIDx6YWNrckB2bXdhcmUuY29tPgorICovCisKKyNpZm5kZWYgVVRJTF9IQVNIX0gKKyNkZWZpbmUgVVRJTF9IQVNIX0gKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjaW5jbHVkZSAibGliZHJtX21hY3Jvcy5oIgorCitzdHJ1Y3QgdXRpbF9oYXNoOworc3RydWN0IHV0aWxfbm9kZTsKKworc3RydWN0IHV0aWxfaGFzaF9pdGVyIHsKKwlzdHJ1Y3QgdXRpbF9oYXNoICpoYXNoOworCXN0cnVjdCB1dGlsX25vZGUgKm5vZGU7Cit9OworCisKK2RybV9wcml2YXRlIHN0cnVjdCB1dGlsX2hhc2ggKnV0aWxfaGFzaF9jcmVhdGUodm9pZCk7Citkcm1fcHJpdmF0ZSB2b2lkIHV0aWxfaGFzaF9kZWxldGUoc3RydWN0IHV0aWxfaGFzaCAqaGFzaCk7CisKKworLyoqCisgKiBBZGRzIGEgZGF0YSB3aXRoIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGhhc2guIElmIGVudHJ5IHdpdGggdGhlIGdpdmVuCisgKiBrZXkgaXMgYWxyZWFkeSBpbiB0aGUgaGFzaCwgdGhpcyBjdXJyZW50IGVudHJ5IGlzIGluc3RlcmVkIGJlZm9yZSBpdAorICogaW4gdGhlIGNvbGxpc2lvbiBsaXN0LgorICogRnVuY3Rpb24gcmV0dXJucyBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgaW5zZXJ0ZWQgaXRlbSBpbiB0aGUgaGFzaC4KKyAqLworZHJtX3ByaXZhdGUgc3RydWN0IHV0aWxfaGFzaF9pdGVyCit1dGlsX2hhc2hfaW5zZXJ0KHN0cnVjdCB1dGlsX2hhc2ggKmhhc2gsIHVuc2lnbmVkIGtleSwgdm9pZCAqZGF0YSk7CisKKy8qKgorICogUmVtb3ZlcyB0aGUgaXRlbSBwb2ludGVkIHRvIGJ5IHRoZSBjdXJyZW50IGl0ZXJhdG9yIGZyb20gdGhlIGhhc2guCisgKiBOb3RlIHRoYXQgdGhlIGRhdGEgaXRzZWxmIGlzIG5vdCBlcmFzZWQgYW5kIGlmIGl0IHdhcyBhIG1hbGxvYydlZCBwb2ludGVyCisgKiBpdCB3aWxsIGhhdmUgdG8gYmUgZnJlZWQgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGJ5IHRoZSBjYWxsZWUuCisgKiBGdW5jdGlvbiByZXR1cm5zIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBpdGVtIGFmdGVyIHRoZSByZW1vdmVkIG9uZSBpbgorICogdGhlIGhhc2guCisgKi8KK2RybV9wcml2YXRlIHN0cnVjdCB1dGlsX2hhc2hfaXRlcgordXRpbF9oYXNoX2VyYXNlKHN0cnVjdCB1dGlsX2hhc2ggKmhhc2gsIHN0cnVjdCB1dGlsX2hhc2hfaXRlciBpdGVyKTsKKworZHJtX3ByaXZhdGUgdm9pZCAqdXRpbF9oYXNoX3Rha2Uoc3RydWN0IHV0aWxfaGFzaCAqaGFzaCwgdW5zaWduZWQga2V5KTsKKworCitkcm1fcHJpdmF0ZSBzdHJ1Y3QgdXRpbF9oYXNoX2l0ZXIgdXRpbF9oYXNoX2ZpcnN0X25vZGUoc3RydWN0IHV0aWxfaGFzaCAqaGFzaCk7CisKKy8qKgorICogUmV0dXJuIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgY29sbGlzaW9uIGxpc3QuCisgKi8KK2RybV9wcml2YXRlIHN0cnVjdCB1dGlsX2hhc2hfaXRlcgordXRpbF9oYXNoX2ZpbmQoc3RydWN0IHV0aWxfaGFzaCAqaGFzaCwgdW5zaWduZWQga2V5KTsKKworCitkcm1fcHJpdmF0ZSBpbnQgdXRpbF9oYXNoX2l0ZXJfaXNfbnVsbChzdHJ1Y3QgdXRpbF9oYXNoX2l0ZXIgaXRlcik7Citkcm1fcHJpdmF0ZSB1bnNpZ25lZCB1dGlsX2hhc2hfaXRlcl9rZXkoc3RydWN0IHV0aWxfaGFzaF9pdGVyIGl0ZXIpOworZHJtX3ByaXZhdGUgdm9pZCAqdXRpbF9oYXNoX2l0ZXJfZGF0YShzdHJ1Y3QgdXRpbF9oYXNoX2l0ZXIgaXRlcik7CisKKworZHJtX3ByaXZhdGUgc3RydWN0IHV0aWxfaGFzaF9pdGVyCit1dGlsX2hhc2hfaXRlcl9uZXh0KHN0cnVjdCB1dGlsX2hhc2hfaXRlciBpdGVyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbWRncHUvdXRpbF9oYXNoX3RhYmxlLmMgYi9hbWRncHUvdXRpbF9oYXNoX3RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE3ZjZlYQotLS0gL2Rldi9udWxsCisrKyBiL2FtZGdwdS91dGlsX2hhc2hfdGFibGUuYwpAQCAtMCwwICsxLDI2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMDggVk13YXJlLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFZNV0FSRSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogQGZpbGUKKyAqIEdlbmVyYWwgcHVycG9zZSBoYXNoIHRhYmxlIGltcGxlbWVudGF0aW9uLgorICogCisgKiBKdXN0IHVzZXMgdGhlIHV0aWxfaGFzaCBmb3Igbm93LCBidXQgaXQgbWlnaHQgYmUgYmV0dGVyIHN3aXRjaCB0byBhIGxpbmVhcgorICogcHJvYmluZyBoYXNoIHRhYmxlIGltcGxlbWVudGF0aW9uIGF0IHNvbWUgcG9pbnQgLS0gYXMgaXQgaXMgc2FpZCB0aGV5IGhhdmUgCisgKiBiZXR0ZXIgbG9va3VwIGFuZCBjYWNoZSBwZXJmb3JtYW5jZSBhbmQgaXQgYXBwZWFycyB0byBiZSBwb3NzaWJsZSB0byB3cml0ZSAKKyAqIGEgbG9jay1mcmVlIGltcGxlbWVudGF0aW9uIG9mIHN1Y2ggaGFzaCB0YWJsZXMgLiAKKyAqIAorICogQGF1dGhvciBKb3PDqSBGb25zZWNhIDxqZm9uc2VjYUB2bXdhcmUuY29tPgorICovCisKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAidXRpbF9oYXNoX3RhYmxlLmgiCisjaW5jbHVkZSAidXRpbF9oYXNoLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworc3RydWN0IHV0aWxfaGFzaF90YWJsZQoreworCXN0cnVjdCB1dGlsX2hhc2ggKmhlYWQ7CisKKwkvKiogSGFzaCBmdW5jdGlvbiAqLworCXVuc2lnbmVkICgqbWFrZV9oYXNoKSh2b2lkICprZXkpOworCisJLyoqIENvbXBhcmUgdHdvIGtleXMgKi8KKwlpbnQgKCpjb21wYXJlKSh2b2lkICprZXkxLCB2b2lkICprZXkyKTsKK307CisKK3N0cnVjdCB1dGlsX2hhc2hfdGFibGVfaXRlbQoreworCXZvaWQgKmtleTsKKwl2b2lkICp2YWx1ZTsKK307CisKKworc3RhdGljIHN0cnVjdCB1dGlsX2hhc2hfdGFibGVfaXRlbSAqCit1dGlsX2hhc2hfdGFibGVfaXRlbShzdHJ1Y3QgdXRpbF9oYXNoX2l0ZXIgaXRlcikKK3sKKwlyZXR1cm4gKHN0cnVjdCB1dGlsX2hhc2hfdGFibGVfaXRlbSAqKXV0aWxfaGFzaF9pdGVyX2RhdGEoaXRlcik7Cit9CisKK2RybV9wcml2YXRlIHN0cnVjdCB1dGlsX2hhc2hfdGFibGUgKgordXRpbF9oYXNoX3RhYmxlX2NyZWF0ZSh1bnNpZ25lZCAoKmhhc2gpKHZvaWQgKmtleSksCisJCSAgICAgICBpbnQgKCpjb21wYXJlKSh2b2lkICprZXkxLCB2b2lkICprZXkyKSkKK3sKKwlzdHJ1Y3QgdXRpbF9oYXNoX3RhYmxlICpodDsKKworCWh0ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXRpbF9oYXNoX3RhYmxlKSk7CisJaWYoIWh0KQorCQlyZXR1cm4gTlVMTDsKKworCWh0LT5oZWFkID0gdXRpbF9oYXNoX2NyZWF0ZSgpOworCWlmKCFodC0+aGVhZCkgeworCQlmcmVlKGh0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaHQtPm1ha2VfaGFzaCA9IGhhc2g7CisJaHQtPmNvbXBhcmUgPSBjb21wYXJlOworCisJcmV0dXJuIGh0OworfQorCitzdGF0aWMgc3RydWN0IHV0aWxfaGFzaF9pdGVyCit1dGlsX2hhc2hfdGFibGVfZmluZF9pdGVyKHN0cnVjdCB1dGlsX2hhc2hfdGFibGUgKmh0LAorCQkJICB2b2lkICprZXksIHVuc2lnbmVkIGtleV9oYXNoKQoreworCXN0cnVjdCB1dGlsX2hhc2hfaXRlciBpdGVyOworCXN0cnVjdCB1dGlsX2hhc2hfdGFibGVfaXRlbSAqaXRlbTsKKworCWl0ZXIgPSB1dGlsX2hhc2hfZmluZChodC0+aGVhZCwga2V5X2hhc2gpOworCXdoaWxlICghdXRpbF9oYXNoX2l0ZXJfaXNfbnVsbChpdGVyKSkgeworCQlpdGVtID0gKHN0cnVjdCB1dGlsX2hhc2hfdGFibGVfaXRlbSAqKXV0aWxfaGFzaF9pdGVyX2RhdGEoaXRlcik7CisJCWlmICghaHQtPmNvbXBhcmUoaXRlbS0+a2V5LCBrZXkpKQorCQkJYnJlYWs7CisJCWl0ZXIgPSB1dGlsX2hhc2hfaXRlcl9uZXh0KGl0ZXIpOworCX0KKworCXJldHVybiBpdGVyOworfQorCitzdGF0aWMgc3RydWN0IHV0aWxfaGFzaF90YWJsZV9pdGVtICoKK3V0aWxfaGFzaF90YWJsZV9maW5kX2l0ZW0oc3RydWN0IHV0aWxfaGFzaF90YWJsZSAqaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmtleSwgdW5zaWduZWQga2V5X2hhc2gpCit7CisJc3RydWN0IHV0aWxfaGFzaF9pdGVyIGl0ZXI7CisJc3RydWN0IHV0aWxfaGFzaF90YWJsZV9pdGVtICppdGVtOworCisJaXRlciA9IHV0aWxfaGFzaF9maW5kKGh0LT5oZWFkLCBrZXlfaGFzaCk7CisJd2hpbGUgKCF1dGlsX2hhc2hfaXRlcl9pc19udWxsKGl0ZXIpKSB7CisJCWl0ZW0gPSAoc3RydWN0IHV0aWxfaGFzaF90YWJsZV9pdGVtICopdXRpbF9oYXNoX2l0ZXJfZGF0YShpdGVyKTsKKwkJaWYgKCFodC0+Y29tcGFyZShpdGVtLT5rZXksIGtleSkpCisJCQlyZXR1cm4gaXRlbTsKKwkJaXRlciA9IHV0aWxfaGFzaF9pdGVyX25leHQoaXRlcik7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2RybV9wcml2YXRlIHZvaWQKK3V0aWxfaGFzaF90YWJsZV9zZXQoc3RydWN0IHV0aWxfaGFzaF90YWJsZSAqaHQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUpCit7CisJdW5zaWduZWQga2V5X2hhc2g7CisJc3RydWN0IHV0aWxfaGFzaF90YWJsZV9pdGVtICppdGVtOworCXN0cnVjdCB1dGlsX2hhc2hfaXRlciBpdGVyOworCisJYXNzZXJ0KGh0KTsKKwlpZiAoIWh0KQorCQlyZXR1cm47CisKKwlrZXlfaGFzaCA9IGh0LT5tYWtlX2hhc2goa2V5KTsKKworCWl0ZW0gPSB1dGlsX2hhc2hfdGFibGVfZmluZF9pdGVtKGh0LCBrZXksIGtleV9oYXNoKTsKKwlpZihpdGVtKSB7CisJCS8qIFRPRE86IGtleS92YWx1ZSBkZXN0cnVjdGlvbj8gKi8KKwkJaXRlbS0+dmFsdWUgPSB2YWx1ZTsKKwkJcmV0dXJuOworCX0KKworCWl0ZW0gPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB1dGlsX2hhc2hfdGFibGVfaXRlbSkpOworCWlmKCFpdGVtKQorCQlyZXR1cm47CisKKwlpdGVtLT5rZXkgPSBrZXk7CisJaXRlbS0+dmFsdWUgPSB2YWx1ZTsKKworCWl0ZXIgPSB1dGlsX2hhc2hfaW5zZXJ0KGh0LT5oZWFkLCBrZXlfaGFzaCwgaXRlbSk7CisJaWYodXRpbF9oYXNoX2l0ZXJfaXNfbnVsbChpdGVyKSkgeworCQlmcmVlKGl0ZW0pOworCQlyZXR1cm47CisJfQorfQorCitkcm1fcHJpdmF0ZSB2b2lkICp1dGlsX2hhc2hfdGFibGVfZ2V0KHN0cnVjdCB1dGlsX2hhc2hfdGFibGUgKmh0LCB2b2lkICprZXkpCit7CisJdW5zaWduZWQga2V5X2hhc2g7CisJc3RydWN0IHV0aWxfaGFzaF90YWJsZV9pdGVtICppdGVtOworCisJYXNzZXJ0KGh0KTsKKwlpZiAoIWh0KQorCQlyZXR1cm4gTlVMTDsKKworCWtleV9oYXNoID0gaHQtPm1ha2VfaGFzaChrZXkpOworCisJaXRlbSA9IHV0aWxfaGFzaF90YWJsZV9maW5kX2l0ZW0oaHQsIGtleSwga2V5X2hhc2gpOworCWlmKCFpdGVtKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBpdGVtLT52YWx1ZTsKK30KKworZHJtX3ByaXZhdGUgdm9pZCB1dGlsX2hhc2hfdGFibGVfcmVtb3ZlKHN0cnVjdCB1dGlsX2hhc2hfdGFibGUgKmh0LCB2b2lkICprZXkpCit7CisJdW5zaWduZWQga2V5X2hhc2g7CisJc3RydWN0IHV0aWxfaGFzaF9pdGVyIGl0ZXI7CisJc3RydWN0IHV0aWxfaGFzaF90YWJsZV9pdGVtICppdGVtOworCisJYXNzZXJ0KGh0KTsKKwlpZiAoIWh0KQorCQlyZXR1cm47CisKKwlrZXlfaGFzaCA9IGh0LT5tYWtlX2hhc2goa2V5KTsKKworCWl0ZXIgPSB1dGlsX2hhc2hfdGFibGVfZmluZF9pdGVyKGh0LCBrZXksIGtleV9oYXNoKTsKKwlpZih1dGlsX2hhc2hfaXRlcl9pc19udWxsKGl0ZXIpKQorCQlyZXR1cm47CisKKwlpdGVtID0gdXRpbF9oYXNoX3RhYmxlX2l0ZW0oaXRlcik7CisJYXNzZXJ0KGl0ZW0pOworCWZyZWUoaXRlbSk7CisKKwl1dGlsX2hhc2hfZXJhc2UoaHQtPmhlYWQsIGl0ZXIpOworfQorCitkcm1fcHJpdmF0ZSB2b2lkIHV0aWxfaGFzaF90YWJsZV9jbGVhcihzdHJ1Y3QgdXRpbF9oYXNoX3RhYmxlICpodCkKK3sKKwlzdHJ1Y3QgdXRpbF9oYXNoX2l0ZXIgaXRlcjsKKwlzdHJ1Y3QgdXRpbF9oYXNoX3RhYmxlX2l0ZW0gKml0ZW07CisKKwlhc3NlcnQoaHQpOworCWlmICghaHQpCisJCXJldHVybjsKKworCWl0ZXIgPSB1dGlsX2hhc2hfZmlyc3Rfbm9kZShodC0+aGVhZCk7CisJd2hpbGUgKCF1dGlsX2hhc2hfaXRlcl9pc19udWxsKGl0ZXIpKSB7CisJCWl0ZW0gPSAoc3RydWN0IHV0aWxfaGFzaF90YWJsZV9pdGVtICopdXRpbF9oYXNoX3Rha2UoaHQtPmhlYWQsIHV0aWxfaGFzaF9pdGVyX2tleShpdGVyKSk7CisJCWZyZWUoaXRlbSk7CisJCWl0ZXIgPSB1dGlsX2hhc2hfZmlyc3Rfbm9kZShodC0+aGVhZCk7CisJfQorfQorCitkcm1fcHJpdmF0ZSB2b2lkIHV0aWxfaGFzaF90YWJsZV9mb3JlYWNoKHN0cnVjdCB1dGlsX2hhc2hfdGFibGUgKmh0LAorCQkJdm9pZCAoKmNhbGxiYWNrKSh2b2lkICprZXksIHZvaWQgKnZhbHVlLCB2b2lkICpkYXRhKSwKKwkJCXZvaWQgKmRhdGEpCit7CisJc3RydWN0IHV0aWxfaGFzaF9pdGVyIGl0ZXI7CisJc3RydWN0IHV0aWxfaGFzaF90YWJsZV9pdGVtICppdGVtOworCisJYXNzZXJ0KGh0KTsKKwlpZiAoIWh0KQorCQlyZXR1cm47CisKKwlpdGVyID0gdXRpbF9oYXNoX2ZpcnN0X25vZGUoaHQtPmhlYWQpOworCXdoaWxlICghdXRpbF9oYXNoX2l0ZXJfaXNfbnVsbChpdGVyKSkgeworCQlpdGVtID0gKHN0cnVjdCB1dGlsX2hhc2hfdGFibGVfaXRlbSAqKXV0aWxfaGFzaF9pdGVyX2RhdGEoaXRlcik7CisJCWNhbGxiYWNrKGl0ZW0tPmtleSwgaXRlbS0+dmFsdWUsIGRhdGEpOworCQlpdGVyID0gdXRpbF9oYXNoX2l0ZXJfbmV4dChpdGVyKTsKKwl9Cit9CisKK2RybV9wcml2YXRlIHZvaWQgdXRpbF9oYXNoX3RhYmxlX2Rlc3Ryb3koc3RydWN0IHV0aWxfaGFzaF90YWJsZSAqaHQpCit7CisJc3RydWN0IHV0aWxfaGFzaF9pdGVyIGl0ZXI7CisJc3RydWN0IHV0aWxfaGFzaF90YWJsZV9pdGVtICppdGVtOworCisJYXNzZXJ0KGh0KTsKKwlpZiAoIWh0KQorCQlyZXR1cm47CisKKwlpdGVyID0gdXRpbF9oYXNoX2ZpcnN0X25vZGUoaHQtPmhlYWQpOworCXdoaWxlICghdXRpbF9oYXNoX2l0ZXJfaXNfbnVsbChpdGVyKSkgeworCQlpdGVtID0gKHN0cnVjdCB1dGlsX2hhc2hfdGFibGVfaXRlbSAqKXV0aWxfaGFzaF9pdGVyX2RhdGEoaXRlcik7CisJCWZyZWUoaXRlbSk7CisJCWl0ZXIgPSB1dGlsX2hhc2hfaXRlcl9uZXh0KGl0ZXIpOworCX0KKworCXV0aWxfaGFzaF9kZWxldGUoaHQtPmhlYWQpOworCWZyZWUoaHQpOworfQpkaWZmIC0tZ2l0IGEvYW1kZ3B1L3V0aWxfaGFzaF90YWJsZS5oIGIvYW1kZ3B1L3V0aWxfaGFzaF90YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMDAxMjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbWRncHUvdXRpbF9oYXNoX3RhYmxlLmgKQEAgLTAsMCArMSw3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMDggVk13YXJlLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFZNV0FSRSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogR2VuZXJhbCBwdXJwb3NlIGhhc2ggdGFibGUuCisgKiAgCisgKiBAYXV0aG9yIEpvc8OpIEZvbnNlY2EgPGpmb25zZWNhQHZtd2FyZS5jb20+CisgKi8KKworI2lmbmRlZiBVX0hBU0hfVEFCTEVfSF8KKyNkZWZpbmUgVV9IQVNIX1RBQkxFX0hfCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImxpYmRybV9tYWNyb3MuaCIKKworLyoqCisgKiBHZW5lcmljIHB1cnBvc2UgaGFzaCB0YWJsZS4KKyAqLworc3RydWN0IHV0aWxfaGFzaF90YWJsZTsKKworLyoqCisgKiBDcmVhdGUgYW4gaGFzaCB0YWJsZS4KKyAqIAorICogQHBhcmFtIGhhc2ggaGFzaCBmdW5jdGlvbgorICogQHBhcmFtIGNvbXBhcmUgc2hvdWxkIHJldHVybiAwIGZvciB0d28gZXF1YWwga2V5cy4KKyAqLworZHJtX3ByaXZhdGUgc3RydWN0IHV0aWxfaGFzaF90YWJsZSAqCit1dGlsX2hhc2hfdGFibGVfY3JlYXRlKHVuc2lnbmVkICgqaGFzaCkodm9pZCAqa2V5KSwKKwkJICAgICAgIGludCAoKmNvbXBhcmUpKHZvaWQgKmtleTEsIHZvaWQgKmtleTIpKTsKKworZHJtX3ByaXZhdGUgdm9pZAordXRpbF9oYXNoX3RhYmxlX3NldChzdHJ1Y3QgdXRpbF9oYXNoX3RhYmxlICpodCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSk7CisKK2RybV9wcml2YXRlIHZvaWQgKnV0aWxfaGFzaF90YWJsZV9nZXQoc3RydWN0IHV0aWxfaGFzaF90YWJsZSAqaHQsIHZvaWQgKmtleSk7CisKK2RybV9wcml2YXRlIHZvaWQgdXRpbF9oYXNoX3RhYmxlX3JlbW92ZShzdHJ1Y3QgdXRpbF9oYXNoX3RhYmxlICpodCwgdm9pZCAqa2V5KTsKKworZHJtX3ByaXZhdGUgdm9pZCB1dGlsX2hhc2hfdGFibGVfY2xlYXIoc3RydWN0IHV0aWxfaGFzaF90YWJsZSAqaHQpOworCitkcm1fcHJpdmF0ZSB2b2lkIHV0aWxfaGFzaF90YWJsZV9mb3JlYWNoKHN0cnVjdCB1dGlsX2hhc2hfdGFibGUgKmh0LAorCQkJdm9pZCAoKmNhbGxiYWNrKSh2b2lkICprZXksIHZvaWQgKnZhbHVlLCB2b2lkICpkYXRhKSwKKwkJCXZvaWQgKmRhdGEpOworCitkcm1fcHJpdmF0ZSB2b2lkIHV0aWxfaGFzaF90YWJsZV9kZXN0cm95KHN0cnVjdCB1dGlsX2hhc2hfdGFibGUgKmh0KTsKKworI2VuZGlmIC8qIFVfSEFTSF9UQUJMRV9IXyAqLwpkaWZmIC0tZ2l0IGEvYXV0b2dlbi5zaCBiL2F1dG9nZW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTNkNjk5MQotLS0gL2Rldi9udWxsCisrKyBiL2F1dG9nZW4uc2gKQEAgLTAsMCArMSwyMCBAQAorIyEgL2Jpbi9zaAorCitzcmNkaXI9YGRpcm5hbWUgIiQwImAKK3Rlc3QgLXogIiRzcmNkaXIiICYmIHNyY2Rpcj0uCisKK09SSUdESVI9YHB3ZGAKK2NkICIkc3JjZGlyIgorCitnaXQgY29uZmlnIC0tbG9jYWwgLS1nZXQgZm9ybWF0LnN1YmplY3RQcmVmaXggPi9kZXYvbnVsbCB8fAorICAgIGdpdCBjb25maWcgLS1sb2NhbCBmb3JtYXQuc3ViamVjdFByZWZpeCAiUEFUQ0ggbGliZHJtIiAyPi9kZXYvbnVsbAorCitnaXQgY29uZmlnIC0tbG9jYWwgLS1nZXQgc2VuZGVtYWlsLnRvID4vZGV2L251bGwgfHwKKyAgICBnaXQgY29uZmlnIC0tbG9jYWwgc2VuZGVtYWlsLnRvICJkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnIiAyPi9kZXYvbnVsbAorCithdXRvcmVjb25mIC0tZm9yY2UgLS12ZXJib3NlIC0taW5zdGFsbCB8fCBleGl0IDEKK2NkICIkT1JJR0RJUiIgfHwgZXhpdCAkPworCitpZiB0ZXN0IC16ICIkTk9DT05GSUdVUkUiOyB0aGVuCisgICAgIiRzcmNkaXIiL2NvbmZpZ3VyZSAiJEAiCitmaQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmFjIGIvY29uZmlndXJlLmFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNTlhOGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWd1cmUuYWMKQEAgLTAsMCArMSw2MDMgQEAKKyMgIENvcHlyaWdodCAyMDA1IEFkYW0gSmFja3Nvbi4KKyMKKyMgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisjICBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorIyAgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorIyAgb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YgorIyAgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyMgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIworIyAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorIyAgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorIyAgU29mdHdhcmUuCisjCisjICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorIyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisjICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisjICBBREFNIEpBQ0tTT04gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisjICBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorIyAgQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworQUNfUFJFUkVRKFsyLjYzXSkKK0FDX0lOSVQoW2xpYmRybV0sCisgICAgICAgIFsyLjQuODRdLAorICAgICAgICBbaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9lbnRlcl9idWcuY2dpP3Byb2R1Y3Q9RFJJXSwKKyAgICAgICAgW2xpYmRybV0pCisKK0FDX0NPTkZJR19IRUFERVJTKFtjb25maWcuaF0pCitBQ19DT05GSUdfU1JDRElSKFtNYWtlZmlsZS5hbV0pCitBQ19DT05GSUdfTUFDUk9fRElSKFttNF0pCitBQ19DT05GSUdfQVVYX0RJUihbYnVpbGQtYXV4XSkKK1BLR19QUk9HX1BLR19DT05GSUcKKworIyBSZXF1aXJlIHhvcmctbWFjcm9zIG1pbmltdW0gb2YgMS4xMiBmb3IgWE9SR19XSVRIX1hTTFRQUk9DCittNF9pZm5kZWYoW1hPUkdfTUFDUk9TX1ZFUlNJT05dLAorICAgICAgICAgIFttNF9mYXRhbChbbXVzdCBpbnN0YWxsIHhvcmctbWFjcm9zIDEuMTIgb3IgbGF0ZXIgYmVmb3JlIHJ1bm5pbmcgYXV0b2NvbmYvYXV0b2dlbl0pXSkKK1hPUkdfTUFDUk9TX1ZFUlNJT04oMS4xMikKK1hPUkdfV0lUSF9YU0xUUFJPQworWE9SR19NQU5QQUdFX1NFQ1RJT05TCisKK0FNX0lOSVRfQVVUT01BS0UoWzEuMTAgZm9yZWlnbiBkaXN0LWJ6aXAyXSkKKworIyBFbmFibGUgcXVpZXQgY29tcGlsZXMgb24gYXV0b21ha2UgMS4xMS4KK200X2lmZGVmKFtBTV9TSUxFTlRfUlVMRVNdLCBbQU1fU0lMRU5UX1JVTEVTKFt5ZXNdKV0pCisKKyMgQ2hlY2sgZm9yIHByb2dyYW1zCitBQ19QUk9HX0NDCitBQ19QUk9HX0NDX0M5OQorCitpZiB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzk5IiA9IHhubzsgdGhlbgorCUFDX01TR19FUlJPUihbQnVpbGRpbmcgbGliZHJtIHJlcXVpcmVzIEM5OSBlbmFibGVkIGNvbXBpbGVyXSkKK2ZpCisKK0FDX1VTRV9TWVNURU1fRVhURU5TSU9OUworQUNfU1lTX0xBUkdFRklMRQorQUNfRlVOQ19BTExPQ0EKKworc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitleHBvcnQgQ0ZMQUdTPSIkQ0ZMQUdTIC1XZXJyb3IiCitBQ19IRUFERVJfTUFKT1IKK0NGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCitBQ19DSEVDS19IRUFERVJTKFtzeXMvc3lzY3RsLmggc3lzL3NlbGVjdC5oXSkKKworIyBJbml0aWFsaXplIGxpYnRvb2wKK0xUX1BSRVJFUShbMi4yXSkKK0xUX0lOSVQoW2Rpc2FibGUtc3RhdGljXSkKKworZG5sIHB0aHJlYWQtc3R1YnMgaXMgbWFuZGF0b3J5IG9uIEJTRCBwbGF0Zm9ybXMsIGR1ZSB0byB0aGUgbmF0dXJlIG9mIHRoZQorZG5sIHByb2plY3QuIEV2ZW4gdGhlbiB0aGVyZSdzIGEgbm90YWJsZSBpc3N1ZSBhcyBkZXNjcmliZWQgaW4gdGhlIHByb2plY3QgUkVBRE1FCitjYXNlICIkaG9zdF9vcyIgaW4KK2xpbnV4KiB8IGN5Z3dpbiogfCBkYXJ3aW4qIHwgc29sYXJpcyogfCAqLWdudSogfCBnbnUqKQorICAgIHB0aHJlYWRfc3R1YnNfcG9zc2libGU9Im5vIgorICAgIDs7CisqICkKKyAgICBwdGhyZWFkX3N0dWJzX3Bvc3NpYmxlPSJ5ZXMiCisgICAgOzsKK2VzYWMKKworaWYgdGVzdCAieCRwdGhyZWFkX3N0dWJzX3Bvc3NpYmxlIiA9IHh5ZXM7IHRoZW4KKyAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhQVEhSRUFEU1RVQlMsIHB0aHJlYWQtc3R1YnMgPj0gMC40KQorICAgIEFDX1NVQlNUKFBUSFJFQURTVFVCU19DRkxBR1MpCisgICAgQUNfU1VCU1QoUFRIUkVBRFNUVUJTX0xJQlMpCitmaQorCitwa2djb25maWdkaXI9JHtsaWJkaXJ9L3BrZ2NvbmZpZworQUNfU1VCU1QocGtnY29uZmlnZGlyKQorbGliZHJtZGF0YWRpcj0ke2RhdGFkaXJ9L2xpYmRybQorQUNfU1VCU1QobGliZHJtZGF0YWRpcikKKworQUNfQVJHX0VOQUJMRShbdWRldl0sCisgICAgICAgICAgICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtdWRldl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRW5hYmxlIHN1cHBvcnQgZm9yIHVzaW5nIHVkZXYgaW5zdGVhZCBvZiBta25vZCAoZGVmYXVsdDogZGlzYWJsZWQpXSldLAorICAgICAgICAgICAgICBbVURFVj0kZW5hYmxldmFsXSwgW1VERVY9bm9dKQorCitBQ19BUkdfRU5BQkxFKGxpYmttcywKKwkgICAgICBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWxpYmttc10sCisJICAgICAgW0Rpc2FibGUgS01TIG1tIGFic3RyYWN0aW9uIGxpYnJhcnkgKGRlZmF1bHQ6IGF1dG8sIGVuYWJsZWQgb24gc3VwcG9ydGVkIHBsYXRmb3JtcyldKSwKKwkgICAgICBbTElCS01TPSRlbmFibGV2YWxdLCBbTElCS01TPWF1dG9dKQorCitBQ19BUkdfRU5BQkxFKGludGVsLAorCSAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtaW50ZWxdLAorCSAgICAgIFtFbmFibGUgc3VwcG9ydCBmb3IgaW50ZWwncyBLTVMgQVBJIChkZWZhdWx0OiBhdXRvLCBlbmFibGVkIG9uIHg4NildKSwKKwkgICAgICBbSU5URUw9JGVuYWJsZXZhbF0sIFtJTlRFTD1hdXRvXSkKKworQUNfQVJHX0VOQUJMRShyYWRlb24sCisJICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1yYWRlb25dLAorCSAgICAgIFtFbmFibGUgc3VwcG9ydCBmb3IgcmFkZW9uJ3MgS01TIEFQSSAoZGVmYXVsdDogYXV0byldKSwKKwkgICAgICBbUkFERU9OPSRlbmFibGV2YWxdLCBbUkFERU9OPWF1dG9dKQorCitBQ19BUkdfRU5BQkxFKGFtZGdwdSwKKwkgICAgICBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWFtZGdwdV0sCisJICAgICAgW0VuYWJsZSBzdXBwb3J0IGZvciBhbWRncHUncyBLTVMgQVBJIChkZWZhdWx0OiBhdXRvKV0pLAorCSAgICAgIFtBTURHUFU9JGVuYWJsZXZhbF0sIFtBTURHUFU9YXV0b10pCisKK0FDX0FSR19FTkFCTEUobm91dmVhdSwKKwkgICAgICBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLW5vdXZlYXVdLAorCSAgICAgIFtFbmFibGUgc3VwcG9ydCBmb3Igbm91dmVhdSdzIEtNUyBBUEkgKGRlZmF1bHQ6IGF1dG8pXSksCisJICAgICAgW05PVVZFQVU9JGVuYWJsZXZhbF0sIFtOT1VWRUFVPWF1dG9dKQorCitBQ19BUkdfRU5BQkxFKHZtd2dmeCwKKwkgICAgICBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXZtd2dmeF0sCisJICAgICAgW0VuYWJsZSBzdXBwb3J0IGZvciB2bXdnZngncyBLTVMgQVBJIChkZWZhdWx0OiB5ZXMpXSksCisJICAgICAgW1ZNV0dGWD0kZW5hYmxldmFsXSwgW1ZNV0dGWD15ZXNdKQorCitBQ19BUkdfRU5BQkxFKG9tYXAtZXhwZXJpbWVudGFsLWFwaSwKKwkgICAgICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtb21hcC1leHBlcmltZW50YWwtYXBpXSwKKwkgICAgICBbRW5hYmxlIHN1cHBvcnQgZm9yIE9NQVAncyBleHBlcmltZW50YWwgQVBJIChkZWZhdWx0OiBkaXNhYmxlZCldKSwKKwkgICAgICBbT01BUD0kZW5hYmxldmFsXSwgW09NQVA9bm9dKQorCitBQ19BUkdfRU5BQkxFKGV4eW5vcy1leHBlcmltZW50YWwtYXBpLAorCSAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1leHlub3MtZXhwZXJpbWVudGFsLWFwaV0sCisJICAgICAgW0VuYWJsZSBzdXBwb3J0IGZvciBFWFlOT1MncyBleHBlcmltZW50YWwgQVBJIChkZWZhdWx0OiBkaXNhYmxlZCldKSwKKwkgICAgICBbRVhZTk9TPSRlbmFibGV2YWxdLCBbRVhZTk9TPW5vXSkKKworQUNfQVJHX0VOQUJMRShmcmVlZHJlbm8sCisJICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1mcmVlZHJlbm9dLAorCSAgICAgIFtFbmFibGUgc3VwcG9ydCBmb3IgZnJlZWRyZW5vJ3MgS01TIEFQSSAoZGVmYXVsdDogYXV0bywgZW5hYmxlZCBvbiBhcm0pXSksCisJICAgICAgW0ZSRUVEUkVOTz0kZW5hYmxldmFsXSwgW0ZSRUVEUkVOTz1hdXRvXSkKKworQUNfQVJHX0VOQUJMRShmcmVlZHJlbm8ta2dzbCwKKwkgICAgICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtZnJlZWRyZW5vLWtnc2xdLAorCSAgICAgIFtFbmFibGUgc3VwcG9ydCBmb3IgZnJlZWRyZW5vJ3MgdG8gdXNlIGRvd25zdHJlYW0gYW5kcm9pZCBrZXJuZWwgQVBJIChkZWZhdWx0OiBkaXNhYmxlZCldKSwKKwkgICAgICBbRlJFRURSRU5PX0tHU0w9JGVuYWJsZXZhbF0sIFtGUkVFRFJFTk9fS0dTTD1ub10pCisKK0FDX0FSR19FTkFCTEUodGVncmEtZXhwZXJpbWVudGFsLWFwaSwKKwkgICAgICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtdGVncmEtZXhwZXJpbWVudGFsLWFwaV0sCisJICAgICAgW0VuYWJsZSBzdXBwb3J0IGZvciBUZWdyYSdzIGV4cGVyaW1lbnRhbCBBUEkgKGRlZmF1bHQ6IGRpc2FibGVkKV0pLAorCSAgICAgIFtURUdSQT0kZW5hYmxldmFsXSwgW1RFR1JBPW5vXSkKKworQUNfQVJHX0VOQUJMRSh2aXZhbnRlLWV4cGVyaW1lbnRhbC1hcGksCisJICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXZpdmFudGUtZXhwZXJpbWVudGFsLWFwaV0sCisJICAgICAgW0VuYWJsZSBzdXBwb3J0IGZvciB2aXZhbnRlJ3MgZXhwZXJpbWVudGFsIEFQSSAoZGVmYXVsdDogZGlzYWJsZWQpXSksCisJICAgICAgW1ZJVkFOVEU9JGVuYWJsZXZhbF0sIFtWSVZBTlRFPW5vXSkKKworQUNfQVJHX0VOQUJMRSh2YzQsCisJICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS12YzRdLAorCSAgICAgIFtFbmFibGUgc3VwcG9ydCBmb3IgdmM0J3MgQVBJIChkZWZhdWx0OiBhdXRvLCBlbmFibGVkIG9uIGFybSldKSwKKwkgICAgICBbVkM0PSRlbmFibGV2YWxdLCBbVkM0PWF1dG9dKQorCitBQ19BUkdfRU5BQkxFKGV0bmF2aXYtZXhwZXJpbWVudGFsLWFwaSwKKwkgICAgICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtZXRuYXZpdi1leHBlcmltZW50YWwtYXBpXSwKKwkgICAgICBbRW5hYmxlIHN1cHBvcnQgZm9yIGV0bmF2aXYncyBleHBlcmltZW50YWwgQVBJIChkZWZhdWx0OiBkaXNhYmxlZCldKSwKKwkgICAgICBbRVROQVZJVj0kZW5hYmxldmFsXSwgW0VUTkFWSVY9bm9dKQorCitBQ19BUkdfRU5BQkxFKGluc3RhbGwtdGVzdC1wcm9ncmFtcywKKwkJICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtaW5zdGFsbC10ZXN0LXByb2dyYW1zXSwKKwkJICBbSW5zdGFsbCB0ZXN0IHByb2dyYW1zIChkZWZhdWx0OiBubyldKSwKKwkJICBbSU5TVEFMTF9URVNUUz0kZW5hYmxldmFsXSwgW0lOU1RBTExfVEVTVFM9bm9dKQorCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgY2hlY2sgY29tcGlsZXIgZmxhZ3MKK0FDX0RFRlVOKFtMSUJEUk1fQ0NfVFJZX0ZMQUddLCBbCisgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAkQ0Mgc3VwcG9ydHMgJDFdKQorCisgIGxpYmRybV9zYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgQ0ZMQUdTPSIkQ0ZMQUdTICQxIgorCisgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbIF0pXSwgW2xpYmRybV9jY19mbGFnPXllc10sIFtsaWJkcm1fY2NfZmxhZz1ub10pCisgIENGTEFHUz0iJGxpYmRybV9zYXZlX0NGTEFHUyIKKworICBpZiB0ZXN0ICJ4JGxpYmRybV9jY19mbGFnIiA9ICJ4eWVzIjsgdGhlbgorICAgIGlmZWxzZShbJDJdLCAsIDosIFskMl0pCisgIGVsc2UKKyAgICBpZmVsc2UoWyQzXSwgLCA6LCBbJDNdKQorICBmaQorICBBQ19NU0dfUkVTVUxUKFskbGliZHJtX2NjX2ZsYWddKQorXSkKKworZG5sIFdlIHVzZSBjbG9ja19nZXR0aW1lIHRvIGNoZWNrIGZvciB0aW1lb3V0cyBpbiBkcm1XYWl0VkJsYW5rCisKK0FDX0NIRUNLX0ZVTkNTKFtjbG9ja19nZXR0aW1lXSwgW0NMT0NLX0xJQj1dLAorICAgICAgICAgICAgICAgW0FDX0NIRUNLX0xJQihbcnRdLCBbY2xvY2tfZ2V0dGltZV0sIFtDTE9DS19MSUI9LWxydF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBQ19NU0dfRVJST1IoW0NvdWxkbid0IGZpbmQgY2xvY2tfZ2V0dGltZV0pXSldKQorQUNfU1VCU1QoW0NMT0NLX0xJQl0pCisKK0FDX0NIRUNLX0ZVTkNTKFtvcGVuX21lbXN0cmVhbV0sIFtIQVZFX09QRU5fTUVNU1RSRUFNPXllc10pCisKK2RubCBVc2UgbG90cyBvZiB3YXJuaW5nIGZsYWdzIHdpdGggd2l0aCBnY2MgYW5kIGNvbXBhdGlibGUgY29tcGlsZXJzCisKK2RubCBOb3RlOiBpZiB5b3UgY2hhbmdlIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUsIHRoZSBjYWNoZSBpcyBhdXRvbWF0aWNhbGx5Citkbmwgc2tpcHBlZCBhbmQgYWxsIGZsYWdzIHJlY2hlY2tlZC4gIFNvIHRoZXJlJ3Mgbm8gbmVlZCB0byBkbyBhbnl0aGluZworZG5sIGVsc2UuICBJZiBmb3IgYW55IHJlYXNvbiB5b3UgbmVlZCB0byBmb3JjZSBhIHJlY2hlY2ssIGp1c3QgY2hhbmdlCitkbmwgTUFZQkVfV0FSTiBpbiBhbiBpZ25vcmFibGUgd2F5IChsaWtlIGFkZGluZyB3aGl0ZXNwYWNlKQorCitNQVlCRV9XQVJOPSItV2FsbCAtV2V4dHJhIFwKKy1Xc2lnbi1jb21wYXJlIC1XZXJyb3ItaW1wbGljaXQtZnVuY3Rpb24tZGVjbGFyYXRpb24gXAorLVdwb2ludGVyLWFyaXRoIC1Xd3JpdGUtc3RyaW5ncyAtV3N0cmljdC1wcm90b3R5cGVzIFwKKy1XbWlzc2luZy1wcm90b3R5cGVzIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVduZXN0ZWQtZXh0ZXJucyBcCistV3BhY2tlZCAtV3N3aXRjaC1lbnVtIC1XbWlzc2luZy1mb3JtYXQtYXR0cmlidXRlIFwKKy1Xc3RyaWN0LWFsaWFzaW5nPTIgLVdpbml0LXNlbGYgXAorLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgLVdvbGQtc3R5bGUtZGVmaW5pdGlvbiBcCistV25vLXVudXNlZC1wYXJhbWV0ZXIgXAorLVduby1hdHRyaWJ1dGVzIC1Xbm8tbG9uZy1sb25nIC1XaW5saW5lIC1Xc2hhZG93IFwKKy1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMiCisKKyMgaW52YWxpZGF0ZSBjYWNoZWQgdmFsdWUgaWYgTUFZQkVfV0FSTiBoYXMgY2hhbmdlZAoraWYgdGVzdCAieCRsaWJkcm1fY3Zfd2Fybl9tYXliZSIgIT0gIngkTUFZQkVfV0FSTiI7IHRoZW4KKwl1bnNldCBsaWJkcm1fY3Zfd2Fybl9jZmxhZ3MKK2ZpCitBQ19DQUNIRV9DSEVDSyhbZm9yIHN1cHBvcnRlZCB3YXJuaW5nIGZsYWdzXSwgbGliZHJtX2N2X3dhcm5fY2ZsYWdzLCBbCisJZWNobworCVdBUk5fQ0ZMQUdTPSIiCisKKwkjIFNvbWUgd2FybmluZyBvcHRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IGFsbCB2ZXJzaW9ucyBvZgorCSMgZ2NjLCBzbyB0ZXN0IGFsbCBkZXNpcmVkIG9wdGlvbnMgYWdhaW5zdCB0aGUgY3VycmVudAorCSMgY29tcGlsZXIuCisJIworCSMgTm90ZSB0aGF0IHRoZXJlIGFyZSBzb21lIG9yZGVyIGRlcGVuZGVuY2llcworCSMgaGVyZS4gU3BlY2lmaWNhbGx5LCBhbiBvcHRpb24gdGhhdCBkaXNhYmxlcyBhIHdhcm5pbmcgd2lsbAorCSMgaGF2ZSBubyBuZXQgZWZmZWN0IGlmIGEgbGF0ZXIgb3B0aW9uIHRoZW4gZW5hYmxlcyB0aGF0CisJIyB3YXJuaW5ncywgKHBlcmhhcHMgaW1wbGljaXRseSkuIFNvIHdlIHB1dCBzb21lIGdyb3VwZWQKKwkjIG9wdGlvbnMgKC1XYWxsIGFuZCAtV2V4dHJhKSB1cCBmcm9udCBhbmQgdGhlIC1Xbm8gb3B0aW9ucworCSMgbGFzdC4KKworCWZvciBXIGluICRNQVlCRV9XQVJOOyBkbworCQlMSUJEUk1fQ0NfVFJZX0ZMQUcoWyRXXSwgW1dBUk5fQ0ZMQUdTPSIkV0FSTl9DRkxBR1MgJFciXSkKKwlkb25lCisKKwlsaWJkcm1fY3Zfd2Fybl9jZmxhZ3M9JFdBUk5fQ0ZMQUdTCisJbGliZHJtX2N2X3dhcm5fbWF5YmU9JE1BWUJFX1dBUk4KKworCUFDX01TR19DSEVDS0lORyhbd2hpY2ggd2FybmluZyBmbGFncyB3ZXJlIHN1cHBvcnRlZF0pXSkKK1dBUk5fQ0ZMQUdTPSIkbGliZHJtX2N2X3dhcm5fY2ZsYWdzIgorCisjIENoZWNrIGZvciBhdG9taWMgaW50cmluc2ljcworQUNfQ0FDSEVfQ0hFQ0soW2ZvciBuYXRpdmUgYXRvbWljIHByaW1pdGl2ZXNdLCBkcm1fY3ZfYXRvbWljX3ByaW1pdGl2ZXMsIFsKKwlkcm1fY3ZfYXRvbWljX3ByaW1pdGl2ZXM9Im5vbmUiCisKKwlBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisJaW50IGF0b21pY19hZGQoaW50ICppKSB7IHJldHVybiBfX3N5bmNfYWRkX2FuZF9mZXRjaCAoaSwgMSk7IH0KKwlpbnQgYXRvbWljX2NtcHhjaGcoaW50ICppLCBpbnQgaiwgaW50IGspIHsgcmV0dXJuIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCAoaSwgaiwgayk7IH0KKwkJCQkJICBdXSxbW11dKV0sIFtkcm1fY3ZfYXRvbWljX3ByaW1pdGl2ZXM9IkludGVsIl0sW10pCisKKwlpZiB0ZXN0ICJ4JGRybV9jdl9hdG9taWNfcHJpbWl0aXZlcyIgPSAieG5vbmUiOyB0aGVuCisJCUFDX0NIRUNLX0hFQURFUihbYXRvbWljX29wcy5oXSwgZHJtX2N2X2F0b21pY19wcmltaXRpdmVzPSJsaWJhdG9taWMtb3BzIikKKwlmaQorCisJIyBhdG9taWMgZnVuY3Rpb25zIGRlZmluZWQgaW4gPGF0b21pYy5oPiAmIGxpYmMgb24gU29sYXJpcworCWlmIHRlc3QgIngkZHJtX2N2X2F0b21pY19wcmltaXRpdmVzIiA9ICJ4bm9uZSI7IHRoZW4KKwkJQUNfQ0hFQ0tfRlVOQyhbYXRvbWljX2Nhc191aW50XSwgZHJtX2N2X2F0b21pY19wcmltaXRpdmVzPSJTb2xhcmlzIikKKwlmaQorXSkKKworaWYgdGVzdCAieCRkcm1fY3ZfYXRvbWljX3ByaW1pdGl2ZXMiID0geEludGVsOyB0aGVuCisJQUNfREVGSU5FKEhBVkVfTElCRFJNX0FUT01JQ19QUklNSVRJVkVTLCAxLAorCQlbRW5hYmxlIGlmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgdGhlIEludGVsIF9fc3luY18qIGF0b21pYyBwcmltaXRpdmVzXSkKK2ZpCitpZiB0ZXN0ICJ4JGRybV9jdl9hdG9taWNfcHJpbWl0aXZlcyIgPSAieGxpYmF0b21pYy1vcHMiOyB0aGVuCisJQUNfREVGSU5FKEhBVkVfTElCX0FUT01JQ19PUFMsIDEsIFtFbmFibGUgaWYgeW91IGhhdmUgbGliYXRvbWljLW9wcy1kZXYgaW5zdGFsbGVkXSkKK2ZpCisKK2RubCBQcmludCBvdXQgdGhlIGFwcHJvYXByaWF0ZSBtZXNzYWdlIGNvbnNpZGVyaW5nIHRoZSB2YWx1ZSBzZXQgYmUgdGhlCitkbmwgcmVzcGVjdGl2ZSBpbiAkMS4KK2RubCAkMSAtIHZhbHVlIHRvIGJlIGV2YWx1YXRlZC4gRWcuICRJTlRFTCwgJE5PVVZFQVUsIC4uLgorZG5sICQyIC0gbGliZHJtIHNob3J0bmFtZS4gRWcuIGludGVsLCBmcmVlZHJlbm8sIC4uLgorZG5sICQzIC0gR1BVIG5hbWUvYnJhbmQuIEVnLiBJbnRlbCwgTlZJRElBIFRlZ3JhLCAuLi4KK2RubCAkNCAtIENvbmZpZ3VyZSBzd2l0Y2guIEVnLiBpbnRlbCwgb21hcC1leHBlcmltZW50YWwtYXBpLCAuLi4KK0FDX0RFRlVOKFtMSUJEUk1fQVRPTUlDU19OT1RfRk9VTkRfTVNHXSwgWworCWNhc2UgIngkMSIgaW4KKwkJeHllcykJQUNfTVNHX0VSUk9SKFtsaWJkcm1fJDIgZGVwZW5kcyB1cG9uIGF0b21pYyBvcGVyYXRpb25zLCB3aGljaCB3ZXJlIG5vdCBmb3VuZCBmb3IgeW91ciBjb21waWxlci9jcHUuIFRyeSBjb21waWxpbmcgd2l0aCAtbWFyY2g9bmF0aXZlLCBvciBpbnN0YWxsIHRoZSBsaWJhdG9taWNzLW9wLWRldiBwYWNrYWdlLCBvciwgZmFpbGluZyBib3RoIG9mIHRob3NlLCBkaXNhYmxlIHN1cHBvcnQgZm9yICQzIEdQVXMgYnkgcGFzc2luZyAtLWRpc2FibGUtJDQgdG8gLi9jb25maWd1cmVdKSA7OworCQl4YXV0bykJQUNfTVNHX1dBUk4oW0Rpc2FibGluZyAkMi4gSXQgZGVwZW5kcyBvbiBhdG9taWMgb3BlcmF0aW9ucywgd2hpY2ggd2VyZSBub3QgZm91bmQgZm9yIHlvdXIgY29tcGlsZXIvY3B1LiBUcnkgY29tcGlsaW5nIHdpdGggLW1hcmNoPW5hdGl2ZSwgb3IgaW5zdGFsbCB0aGUgbGliYXRvbWljcy1vcC1kZXYgcGFja2FnZS5dKSA7OworCQkqKQk7OworCWVzYWMKK10pCisKK2lmIHRlc3QgIngkZHJtX2N2X2F0b21pY19wcmltaXRpdmVzIiA9ICJ4bm9uZSI7IHRoZW4KKwlMSUJEUk1fQVRPTUlDU19OT1RfRk9VTkRfTVNHKCRJTlRFTCwgaW50ZWwsIEludGVsLCBpbnRlbCkKKwlJTlRFTD1ubworCisJTElCRFJNX0FUT01JQ1NfTk9UX0ZPVU5EX01TRygkUkFERU9OLCByYWRlb24sIFJhZGVvbiwgcmFkZW9uKQorCVJBREVPTj1ubworCisJTElCRFJNX0FUT01JQ1NfTk9UX0ZPVU5EX01TRygkQU1ER1BVLCBhbWRncHUsIEFNRCwgYW1kZ3B1KQorCUFNREdQVT1ubworCisJTElCRFJNX0FUT01JQ1NfTk9UX0ZPVU5EX01TRygkTk9VVkVBVSwgbm91dmVhdSwgTlZJRElBLCBub3V2ZWF1KQorCU5PVVZFQVU9bm8KKworCUxJQkRSTV9BVE9NSUNTX05PVF9GT1VORF9NU0coJE9NQVAsIG9tYXAsIE9NQVAsIG9tYXAtZXhwZXJpbWVudGFsLWFwaSkKKwlPTUFQPW5vCisKKwlMSUJEUk1fQVRPTUlDU19OT1RfRk9VTkRfTVNHKCRGUkVFRFJFTk8sIGZyZWVkcmVubywgUXVhbGNvbW0gQWRyZW5vLCBmcmVlZHJlbm8pCisJRlJFRURSRU5PPW5vCisKKwlMSUJEUk1fQVRPTUlDU19OT1RfRk9VTkRfTVNHKCRURUdSQSwgdGVncmEsIE5WSURJQSBUZWdyYSwgdGVncmEtZXhwZXJpbWVudGFsLWFwaSkKKwlURUdSQT1ubworCisJTElCRFJNX0FUT01JQ1NfTk9UX0ZPVU5EX01TRygkRVROQVZJViwgZXRuYXZpdiwgVml2YW50ZSwgZXRuYXZpdi1leHBlcmltZW50YWwtYXBpKQorCUVUTkFWSVY9bm8KK2Vsc2UKKwlpZiB0ZXN0ICJ4JElOVEVMIiA9IHhhdXRvOyB0aGVuCisJCWNhc2UgJGhvc3RfY3B1IGluCisJCQlpPzg2fHg4Nl82NCkJSU5URUw9eWVzIDs7CisJCQkqKQkJSU5URUw9bm8gOzsKKwkJZXNhYworCWZpCisJaWYgdGVzdCAieCRSQURFT04iID0geGF1dG87IHRoZW4KKwkJUkFERU9OPXllcworCWZpCisJaWYgdGVzdCAieCRBTURHUFUiID0geGF1dG87IHRoZW4KKwkJQU1ER1BVPXllcworCWZpCisJaWYgdGVzdCAieCROT1VWRUFVIiA9IHhhdXRvOyB0aGVuCisJCU5PVVZFQVU9eWVzCisJZmkKKwlpZiB0ZXN0ICJ4JEZSRUVEUkVOTyIgPSB4YXV0bzsgdGhlbgorCQljYXNlICRob3N0X2NwdSBpbgorCQkJYXJtKnxhYXJjaDY0KQlGUkVFRFJFTk89eWVzIDs7CisJCQkqKQkJRlJFRURSRU5PPW5vIDs7CisJCWVzYWMKKwlmaQorCWlmIHRlc3QgIngkVkM0IiA9IHhhdXRvOyB0aGVuCisJCWNhc2UgJGhvc3RfY3B1IGluCisJCQlhcm0qfGFhcmNoNjQpCVZDND15ZXMgOzsKKwkJCSopCQlWQzQ9bm8gOzsKKwkJZXNhYworCWZpCitmaQorCitpZiB0ZXN0ICJ4JElOVEVMIiAhPSAieG5vIjsgdGhlbgorCVBLR19DSEVDS19NT0RVTEVTKFBDSUFDQ0VTUywgW3BjaWFjY2VzcyA+PSAwLjEwXSkKK2ZpCitBQ19TVUJTVChQQ0lBQ0NFU1NfQ0ZMQUdTKQorQUNfU1VCU1QoUENJQUNDRVNTX0xJQlMpCisKK2lmIHRlc3QgIngkVURFViIgPSB4eWVzOyB0aGVuCisJQUNfREVGSU5FKFVERVYsIDEsIFtIYXZlIFVERVYgc3VwcG9ydF0pCitmaQorCitBQ19DQU5PTklDQUxfSE9TVAoraWYgdGVzdCAieCRMSUJLTVMiID0geGF1dG8gOyB0aGVuCisJY2FzZSAkaG9zdF9vcyBpbgorCQlsaW51eCopCQlMSUJLTVM9InllcyIgOzsKKwkJZnJlZWJzZCogfCBrZnJlZWJzZCotZ251KQorCQkJCUxJQktNUz0ieWVzIiA7OworCQlkcmFnb25mbHkqKQlMSUJLTVM9InllcyIgOzsKKwkJKikJCUxJQktNUz0ibm8iIDs7CisJZXNhYworZmkKKworQU1fQ09ORElUSU9OQUwoSEFWRV9MSUJLTVMsIFt0ZXN0ICJ4JExJQktNUyIgPSB4eWVzXSkKKworQU1fQ09ORElUSU9OQUwoSEFWRV9JTlRFTCwgW3Rlc3QgIngkSU5URUwiID0geHllc10pCitpZiB0ZXN0ICJ4JElOVEVMIiA9IHh5ZXM7IHRoZW4KKwlBQ19ERUZJTkUoSEFWRV9JTlRFTCwgMSwgW0hhdmUgaW50ZWwgc3VwcG9ydF0pCitmaQorCitBTV9DT05ESVRJT05BTChIQVZFX1ZNV0dGWCwgW3Rlc3QgIngkVk1XR0ZYIiA9IHh5ZXNdKQoraWYgdGVzdCAieCRWTVdHRlgiID0geHllczsgdGhlbgorCUFDX0RFRklORShIQVZFX1ZNV0dGWCwgMSwgW0hhdmUgdm13Z2Z4IGtlcm5lbCBoZWFkZXJzXSkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKEhBVkVfTk9VVkVBVSwgW3Rlc3QgIngkTk9VVkVBVSIgPSB4eWVzXSkKK2lmIHRlc3QgIngkTk9VVkVBVSIgPSB4eWVzOyB0aGVuCisJQUNfREVGSU5FKEhBVkVfTk9VVkVBVSwgMSwgW0hhdmUgbm91dmVhdSAobnZpZGlhKSBzdXBwb3J0XSkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKEhBVkVfT01BUCwgW3Rlc3QgIngkT01BUCIgPSB4eWVzXSkKK2lmIHRlc3QgIngkT01BUCIgPSB4eWVzOyB0aGVuCisJQUNfREVGSU5FKEhBVkVfT01BUCwgMSwgW0hhdmUgT01BUCBzdXBwb3J0XSkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKEhBVkVfRVhZTk9TLCBbdGVzdCAieCRFWFlOT1MiID0geHllc10pCitpZiB0ZXN0ICJ4JEVYWU5PUyIgPSB4eWVzOyB0aGVuCisJQUNfREVGSU5FKEhBVkVfRVhZTk9TLCAxLCBbSGF2ZSBFWFlOT1Mgc3VwcG9ydF0pCitmaQorCitBTV9DT05ESVRJT05BTChIQVZFX0ZSRUVEUkVOTywgW3Rlc3QgIngkRlJFRURSRU5PIiA9IHh5ZXNdKQoraWYgdGVzdCAieCRGUkVFRFJFTk8iID0geHllczsgdGhlbgorCUFDX0RFRklORShIQVZFX0ZSRUVEUkVOTywgMSwgW0hhdmUgZnJlZWRyZW5vIHN1cHBvcnRdKQorZmkKKworaWYgdGVzdCAieCRGUkVFRFJFTk9fS0dTTCIgPSB4eWVzOyB0aGVuCisJaWYgdGVzdCAieCRGUkVFRFJFTk8iICE9IHh5ZXM7IHRoZW4KKwkJQUNfTVNHX0VSUk9SKFtDYW5ub3QgZW5hYmxlIGZyZWVkcmVubyBLR1NMIGludGVyZmFjZSBpZiBmcmVlZHJlbm8gaXMgZGlzYWJsZWRdKQorCWZpCitmaQorQU1fQ09ORElUSU9OQUwoSEFWRV9GUkVFRFJFTk9fS0dTTCwgW3Rlc3QgIngkRlJFRURSRU5PX0tHU0wiID0geHllc10pCitpZiB0ZXN0ICJ4JEZSRUVEUkVOT19LR1NMIiA9IHh5ZXM7IHRoZW4KKwlBQ19ERUZJTkUoSEFWRV9GUkVFRFJFTk9fS0dTTCwgMSwgW0hhdmUgZnJlZWRyZW5vIHN1cHBvcnQgZm9yIEtHU0wga2VybmVsIGludGVyZmFjZV0pCitmaQorCitBTV9DT05ESVRJT05BTChIQVZFX1JBREVPTiwgW3Rlc3QgIngkUkFERU9OIiA9IHh5ZXNdKQoraWYgdGVzdCAieCRSQURFT04iID0geHllczsgdGhlbgorCUFDX0RFRklORShIQVZFX1JBREVPTiwgMSwgW0hhdmUgcmFkZW9uIHN1cHBvcnRdKQorZmkKKworaWYgdGVzdCAieCRBTURHUFUiICE9IHhubzsgdGhlbgorCSMgRGV0ZWN0IGN1bml0IGxpYnJhcnkKKwlQS0dfQ0hFQ0tfTU9EVUxFUyhbQ1VOSVRdLCBbY3VuaXQgPj0gMi4xXSwgW2hhdmVfY3VuaXQ9eWVzXSwgW2hhdmVfY3VuaXQ9bm9dKQorCSMgSWYgcGtnLWNvbmZpZyBkb2VzIG5vdCBmaW5kIGN1bml0LCBjaGVjayBpdCB1c2luZyBBQ19DSEVDS19MSUIuICBXZQorCSMgZG8gdGhpcyBiZWNhdXNlIERlYmlhbiAoVWJ1bnR1KSBsYWNrcyBwa2ctY29uZmlnIGZpbGUgZm9yIGN1bml0LgorCSMgZml4ZWQgaW4gMi4xLTIuZGZzZy0zOiBodHRwOi8vYW5vbnNjbS5kZWJpYW4ub3JnL2NnaXQvY29sbGFiLW1haW50L2N1bml0LmdpdC9jb21taXQvP2g9ZGViaWFuCisJaWYgdGVzdCAieCR7aGF2ZV9jdW5pdH0iID0gInhubyI7IHRoZW4KKwkJQUNfQ0hFQ0tfTElCKFtjdW5pdF0sIFtDVV9pbml0aWFsaXplX3JlZ2lzdHJ5XSwgW2hhdmVfY3VuaXQ9eWVzXSwgW2hhdmVfY3VuaXQ9bm9dKQorCQlpZiB0ZXN0ICJ4JHtoYXZlX2N1bml0fSIgPSAieHllcyI7IHRoZW4KKwkJCUNVTklUX0xJQlM9Ii1sY3VuaXQiCisJCQlDVU5JVF9DRkxBR1M9IiIKKwkJCUFDX1NVQlNUKFtDVU5JVF9MSUJTXSkKKwkJCUFDX1NVQlNUKFtDVU5JVF9DRkxBR1NdKQorCQlmaQorCWZpCitlbHNlCisJaGF2ZV9jdW5pdD1ubworZmkKK0FNX0NPTkRJVElPTkFMKEhBVkVfQ1VOSVQsIFt0ZXN0ICJ4JGhhdmVfY3VuaXQiICE9ICJ4bm8iXSkKKworQU1fQ09ORElUSU9OQUwoSEFWRV9BTURHUFUsIFt0ZXN0ICJ4JEFNREdQVSIgPSB4eWVzXSkKK2lmIHRlc3QgIngkQU1ER1BVIiA9IHh5ZXM7IHRoZW4KKwlBQ19ERUZJTkUoSEFWRV9BTURHUFUsIDEsIFtIYXZlIGFtZGdwdSBzdXBwb3J0XSkKKworCUFDX0RFRklORShIQVZFX0NVTklULCBbdGVzdCAieCRoYXZlX2N1bml0IiAhPSAieG5vIl0sIFtFbmFibGUgQ1VOSVQgSGF2ZSBhbWRncHUgc3VwcG9ydF0pCisKKwlpZiB0ZXN0ICJ4JGhhdmVfY3VuaXQiID0gInhubyI7IHRoZW4KKwkJQUNfTVNHX1dBUk4oW0NvdWxkIG5vdCBmaW5kIGN1bml0IGxpYnJhcnkuIERpc2FibGluZyBhbWRncHUgdGVzdHNdKQorCWZpCitmaQorCitBTV9DT05ESVRJT05BTChIQVZFX1RFR1JBLCBbdGVzdCAieCRURUdSQSIgPSB4eWVzXSkKK2lmIHRlc3QgIngkVEVHUkEiID0geHllczsgdGhlbgorCUFDX0RFRklORShIQVZFX1RFR1JBLCAxLCBbSGF2ZSBUZWdyYSBzdXBwb3J0XSkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKEhBVkVfVklWQU5URSwgW3Rlc3QgIngkVklWQU5URSIgPSB4eWVzXSkKK2lmIHRlc3QgIngkVklWQU5URSIgPSB4eWVzOyB0aGVuCisJQUNfREVGSU5FKEhBVkVfVklWQU5URSwgMSwgW0hhdmUgdml2YW50ZSBzdXBwb3J0XSkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKEhBVkVfVkM0LCBbdGVzdCAieCRWQzQiID0geHllc10pCitpZiB0ZXN0ICJ4JFZDNCIgPSB4eWVzOyB0aGVuCisJQUNfREVGSU5FKEhBVkVfVkM0LCAxLCBbSGF2ZSBWQzQgc3VwcG9ydF0pCitmaQorCitBTV9DT05ESVRJT05BTChIQVZFX0VUTkFWSVYsIFt0ZXN0ICJ4JEVUTkFWSVYiID0geHllc10pCitpZiB0ZXN0ICJ4JEVUTkFWSVYiID0geHllczsgdGhlbgorCUFDX0RFRklORShIQVZFX0VUTkFWSVYsIDEsIFtIYXZlIGV0bmF2aXYgc3VwcG9ydF0pCitmaQorCitBTV9DT05ESVRJT05BTChIQVZFX0lOU1RBTExfVEVTVFMsIFt0ZXN0ICJ4JElOU1RBTExfVEVTVFMiID0geHllc10pCitpZiB0ZXN0ICJ4JElOU1RBTExfVEVTVFMiID0geHllczsgdGhlbgorCUFDX0RFRklORShIQVZFX0lOU1RBTExfVEVTVFMsIDEsIFtJbnN0YWxsIHRlc3QgcHJvZ3JhbXNdKQorZmkKKworQUNfQVJHX0VOQUJMRShbY2Fpcm8tdGVzdHNdLAorICAgICAgICAgICAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWNhaXJvLXRlc3RzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtFbmFibGUgc3VwcG9ydCBmb3IgQ2Fpcm8gcmVuZGVyaW5nIGluIHRlc3RzIChkZWZhdWx0OiBhdXRvKV0pXSwKKyAgICAgICAgICAgICAgW0NBSVJPPSRlbmFibGV2YWxdLCBbQ0FJUk89YXV0b10pCitpZiB0ZXN0ICJ4JENBSVJPIiAhPSB4bm87IHRoZW4KKwlQS0dfQ0hFQ0tfTU9EVUxFUyhDQUlSTywgY2Fpcm8sIFtIQVZFX0NBSVJPPXllc10sIFtIQVZFX0NBSVJPPW5vXSkKK2ZpCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIENhaXJvIHRlc3RzXSkKK2lmIHRlc3QgIngkQ0FJUk8iID0geGF1dG87IHRoZW4KKwlDQUlSTz0iJEhBVkVfQ0FJUk8iCitmaQoraWYgdGVzdCAieCRDQUlSTyIgPSB4eWVzOyB0aGVuCisJaWYgISB0ZXN0ICJ4JEhBVkVfQ0FJUk8iID0geHllczsgdGhlbgorCQlBQ19NU0dfRVJST1IoW0NhaXJvIHN1cHBvcnQgcmVxdWlyZWQgYnV0IG5vdCBwcmVzZW50XSkKKwlmaQorCUFDX0RFRklORShIQVZFX0NBSVJPLCAxLCBbSGF2ZSBDYWlybyBzdXBwb3J0XSkKK2ZpCitBQ19NU0dfUkVTVUxUKFskQ0FJUk9dKQorQU1fQ09ORElUSU9OQUwoSEFWRV9DQUlSTywgW3Rlc3QgIngkQ0FJUk8iID0geHllc10pCisKKyMgeHNsdHByb2MgZm9yIGRvY2Jvb2sgbWFucGFnZXMKK0FDX0FSR19FTkFCTEUoW21hbnBhZ2VzXSwKKyAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLW1hbnBhZ2VzXSwgW2VuYWJsZSBtYW5wYWdlcyBAPDpAZGVmYXVsdD1hdXRvQDo+QF0pLAorICAgICAgICAgICAgICBbTUFOUz0kZW5hYmxldmFsXSwgW01BTlM9YXV0b10pCitBTV9DT05ESVRJT05BTChbQlVJTERfTUFOUEFHRVNdLCBbdGVzdCAieCRYU0xUUFJPQyIgIT0gIngiIC1hICJ4JE1BTlMiICE9ICJ4bm8iXSkKKworIyBjaGVjayBmb3Igb2ZmbGluZSBtYW4tcGFnZXMgc3R5bGVzaGVldAorQUNfTVNHX0NIRUNLSU5HKFtmb3IgZG9jYm9vayBtYW5wYWdlcyBzdHlsZXNoZWV0XSkKK01BTlBBR0VTX1NUWUxFU0hFRVQ9Imh0dHA6Ly9kb2Nib29rLnNvdXJjZWZvcmdlLm5ldC9yZWxlYXNlL3hzbC9jdXJyZW50L21hbnBhZ2VzL2RvY2Jvb2sueHNsIgorQUNfUEFUSF9QUk9HU19GRUFUVVJFX0NIRUNLKFtYU0xUUFJPQ19UTVBdLCBbeHNsdHByb2NdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTX0lGKFtgIiRhY19wYXRoX1hTTFRQUk9DX1RNUCIgLS1ub25ldCAiJE1BTlBBR0VTX1NUWUxFU0hFRVQiID4gL2Rldi9udWxsIDI+JjFgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSEFWRV9NQU5QQUdFU19TVFlMRVNIRUVUPXllc10pKQoraWYgdGVzdCAieCRIQVZFX01BTlBBR0VTX1NUWUxFU0hFRVQiID0gInh5ZXMiOyB0aGVuCisgICAgICAgIEFDX1NVQlNUKE1BTlBBR0VTX1NUWUxFU0hFRVQpCisgICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCitlbHNlCisgICAgICAgIEFDX01TR19SRVNVTFQoW25vXSkKK2ZpCitBTV9DT05ESVRJT05BTChbSEFWRV9NQU5QQUdFU19TVFlMRVNIRUVUXSwgW3Rlc3QgIngkSEFWRV9NQU5QQUdFU19TVFlMRVNIRUVUIiA9ICJ4eWVzIl0pCisKK0FDX0FSR19FTkFCTEUodmFsZ3JpbmQsCisgICAgICAgICAgICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtdmFsZ3JpbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQnVpbGQgbGliZHJtIHdpdGggIHZhbGdyaW5kIHN1cHBvcnQgKGRlZmF1bHQ6IGF1dG8pXSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbVkFMR1JJTkQ9JGVuYWJsZXZhbF0sIFtWQUxHUklORD1hdXRvXSkKK2lmIHRlc3QgIngkVkFMR1JJTkQiICE9IHhubzsgdGhlbgorCVBLR19DSEVDS19NT0RVTEVTKFZBTEdSSU5ELCBbdmFsZ3JpbmRdLCBbaGF2ZV92YWxncmluZD15ZXNdLCBbaGF2ZV92YWxncmluZD1ub10pCitmaQorQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBWYWxncmluZCBzdXBwb3J0XSkKK2lmIHRlc3QgIngkVkFMR1JJTkQiID0geGF1dG87IHRoZW4KKwlWQUxHUklORD0iJGhhdmVfdmFsZ3JpbmQiCitmaQorCitpZiB0ZXN0ICJ4JFZBTEdSSU5EIiA9ICJ4eWVzIjsgdGhlbgorCWlmICEgdGVzdCAieCRoYXZlX3ZhbGdyaW5kIiA9IHh5ZXM7IHRoZW4KKwkJQUNfTVNHX0VSUk9SKFtWYWxncmluZCBzdXBwb3J0IHJlcXVpcmVkIGJ1dCBub3QgcHJlc2VudF0pCisJZmkKKwlBQ19ERUZJTkUoW0hBVkVfVkFMR1JJTkRdLCAxLCBbVXNlIHZhbGdyaW5kIGludHJpbnNpY3MgdG8gc3VwcHJlc3MgZmFsc2Ugd2FybmluZ3NdKQorZmkKKworQUNfTVNHX1JFU1VMVChbJFZBTEdSSU5EXSkKKworQUNfQVJHX1dJVEgoW2tlcm5lbC1zb3VyY2VdLAorICAgICAgICAgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgta2VybmVsLXNvdXJjZV0sCisgICAgICAgICAgICAgIFtzcGVjaWZ5IHBhdGggdG8gbGludXgga2VybmVsIHNvdXJjZV0pXSwKKwkgICAgW2tlcm5lbF9zb3VyY2U9IiR3aXRoX2tlcm5lbF9zb3VyY2UiXSkKK0FDX1NVQlNUKGtlcm5lbF9zb3VyY2UpCisKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciAkQ0Mgc3VwcG9ydHMgX19hdHRyaWJ1dGVfXygoImhpZGRlbiIpKV0pCitBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFsKKyAgICBpbnQgZm9vX2hpZGRlbiggdm9pZCApIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSk7CitdKV0sIEhBVkVfQVRUUklCVVRFX1ZJU0lCSUxJVFk9InllcyI7IEFDX01TR19SRVNVTFQoW3llc10pLCBBQ19NU0dfUkVTVUxUKFtub10pKTsKKworaWYgdGVzdCAieCRIQVZFX0FUVFJJQlVURV9WSVNJQklMSVRZIiA9IHh5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9WSVNJQklMSVRZLCAxLCBbQ29tcGlsZXIgc3VwcG9ydHMgX19hdHRyaWJ1dGVfXygoImhpZGRlbiIpKV0pCitmaQorCitBQ19TVUJTVChXQVJOX0NGTEFHUykKK0FDX0NPTkZJR19GSUxFUyhbCisJTWFrZWZpbGUKKwlkYXRhL01ha2VmaWxlCisJbGlia21zL01ha2VmaWxlCisJbGlia21zL2xpYmttcy5wYworCWludGVsL01ha2VmaWxlCisJaW50ZWwvbGliZHJtX2ludGVsLnBjCisJcmFkZW9uL01ha2VmaWxlCisJcmFkZW9uL2xpYmRybV9yYWRlb24ucGMKKwlhbWRncHUvTWFrZWZpbGUKKwlhbWRncHUvbGliZHJtX2FtZGdwdS5wYworCW5vdXZlYXUvTWFrZWZpbGUKKwlub3V2ZWF1L2xpYmRybV9ub3V2ZWF1LnBjCisJb21hcC9NYWtlZmlsZQorCW9tYXAvbGliZHJtX29tYXAucGMKKwlleHlub3MvTWFrZWZpbGUKKwlleHlub3MvbGliZHJtX2V4eW5vcy5wYworCWZyZWVkcmVuby9NYWtlZmlsZQorCWZyZWVkcmVuby9saWJkcm1fZnJlZWRyZW5vLnBjCisJdGVncmEvTWFrZWZpbGUKKwl0ZWdyYS9saWJkcm1fdGVncmEucGMKKwl2aXZhbnRlL01ha2VmaWxlCisJdml2YW50ZS9saWJkcm1fdml2YW50ZS5wYworCXZjNC9NYWtlZmlsZQorCXZjNC9saWJkcm1fdmM0LnBjCisJZXRuYXZpdi9NYWtlZmlsZQorCWV0bmF2aXYvbGliZHJtX2V0bmF2aXYucGMKKwl0ZXN0cy9NYWtlZmlsZQorCXRlc3RzL21vZGVwcmludC9NYWtlZmlsZQorCXRlc3RzL21vZGV0ZXN0L01ha2VmaWxlCisJdGVzdHMva21zL01ha2VmaWxlCisJdGVzdHMva21zdGVzdC9NYWtlZmlsZQorCXRlc3RzL3Byb3B0ZXN0L01ha2VmaWxlCisJdGVzdHMvcmFkZW9uL01ha2VmaWxlCisJdGVzdHMvYW1kZ3B1L01ha2VmaWxlCisJdGVzdHMvdmJsdGVzdC9NYWtlZmlsZQorCXRlc3RzL2V4eW5vcy9NYWtlZmlsZQorCXRlc3RzL3RlZ3JhL01ha2VmaWxlCisJdGVzdHMvdml2YW50ZS9NYWtlZmlsZQorCXRlc3RzL25vdXZlYXUvTWFrZWZpbGUKKwl0ZXN0cy9ldG5hdml2L01ha2VmaWxlCisJdGVzdHMvdXRpbC9NYWtlZmlsZQorCW1hbi9NYWtlZmlsZQorCWxpYmRybS5wY10pCitBQ19PVVRQVVQKKworZWNobyAiIgorZWNobyAiJFBBQ0tBR0VfU1RSSU5HIHdpbGwgYmUgY29tcGlsZWQgd2l0aDoiCitlY2hvICIiCitlY2hvICIgIGxpYmttcyAgICAgICAgICRMSUJLTVMiCitlY2hvICIgIEludGVsIEFQSSAgICAgICRJTlRFTCIKK2VjaG8gIiAgdm13Z2Z4IEFQSSAgICAgJFZNV0dGWCIKK2VjaG8gIiAgUmFkZW9uIEFQSSAgICAgJFJBREVPTiIKK2VjaG8gIiAgQU1ER1BVIEFQSSAgICAgJEFNREdQVSIKK2VjaG8gIiAgTm91dmVhdSBBUEkgICAgJE5PVVZFQVUiCitlY2hvICIgIE9NQVAgQVBJICAgICAgICRPTUFQIgorZWNobyAiICBFWFlOT1MgQVBJICAgICAkRVhZTk9TIgorZWNobyAiICBGcmVlZHJlbm8gQVBJICAkRlJFRURSRU5PIChrZ3NsOiAkRlJFRURSRU5PX0tHU0wpIgorZWNobyAiICBUZWdyYSBBUEkgICAgICAkVEVHUkEiCitlY2hvICIgIFZpdmFudGUgQVBJICAgICRWSVZBTlRFIgorZWNobyAiICBWQzQgQVBJICAgICAgICAkVkM0IgorZWNobyAiICBFdG5hdml2IEFQSSAgICAkRVROQVZJViIKK2VjaG8gIiIKZGlmZiAtLWdpdCBhL2RhdGEvQW5kcm9pZC5tayBiL2RhdGEvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjAxM2YwCi0tLSAvZGV2L251bGwKKysrIGIvZGF0YS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTAgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYW1kZ3B1LmlkcworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBod2RhdGEKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKZGlmZiAtLWdpdCBhL2RhdGEvTWFrZWZpbGUuYW0gYi9kYXRhL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYTkxNWQKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRhL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjMgQEAKKyMgIENvcHlyaWdodCDCqSAyMDE3IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyMgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorIyAgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyMgIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyMgIG9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIKKyMgIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisjICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyMgIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyMgIFNvZnR3YXJlLgorIworIyAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyMgIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorIyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorIyAgQURBTSBKQUNLU09OIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorIyAgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyMgIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK2xpYmRybWRhdGFkaXIgPSBAbGliZHJtZGF0YWRpckAKK2Rpc3RfbGliZHJtZGF0YV9EQVRBID0gYW1kZ3B1LmlkcwpkaWZmIC0tZ2l0IGEvZGF0YS9hbWRncHUuaWRzIGIvZGF0YS9hbWRncHUuaWRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YzY1ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRhL2FtZGdwdS5pZHMKQEAgLTAsMCArMSwxNjAgQEAKKyMgTGlzdCBvZiBBTURHUFUgSURzCisjCisjIFN5bnRheDoKKyMgZGV2aWNlX2lkLAlyZXZpc2lvbl9pZCwJcHJvZHVjdF9uYW1lICAgICAgICA8LS0gc2luZ2xlIHRhYiBhZnRlciBjb21tYQorCisxLjAuMAorNjYwMCwJMCwJQU1EIFJhZGVvbiBIRCA4NjAwLzg3MDBNCis2NjAwLAk4MSwJQU1EIFJhZGVvbiAoVE0pIFI3IE0zNzAKKzY2MDEsCTAsCUFNRCBSYWRlb24gKFRNKSBIRCA4NTAwTS84NzAwTQorNjYwNCwJMCwJQU1EIFJhZGVvbiBSNyBNMjY1IFNlcmllcworNjYwNCwJODEsCUFNRCBSYWRlb24gKFRNKSBSNyBNMzUwCis2NjA1LAkwLAlBTUQgUmFkZW9uIFI3IE0yNjAgU2VyaWVzCis2NjA1LAk4MSwJQU1EIFJhZGVvbiAoVE0pIFI3IE0zNDAKKzY2MDYsCTAsCUFNRCBSYWRlb24gSEQgODc5ME0KKzY2MDcsCTAsCUFNRCBSYWRlb24gKFRNKSBIRDg1MzBNCis2NjA4LAkwLAlBTUQgRmlyZVBybyBXMjEwMAorNjYxMCwJMCwJQU1EIFJhZGVvbiBIRCA4NjAwIFNlcmllcworNjYxMCwJODEsCUFNRCBSYWRlb24gKFRNKSBSNyAzNTAKKzY2MTAsCTgzLAlBTUQgUmFkZW9uIChUTSkgUjUgMzQwCis2NjExLAkwLAlBTUQgUmFkZW9uIEhEIDg1MDAgU2VyaWVzCis2NjEzLAkwLAlBTUQgUmFkZW9uIEhEIDg1MDAgc2VyaWVzCis2NjE3LAlDNywJQU1EIFJhZGVvbiBSNyAyNDAgU2VyaWVzCis2NjQwLAkwLAlBTUQgUmFkZW9uIEhEIDg5NTAKKzY2NDAsCTgwLAlBTUQgUmFkZW9uIChUTSkgUjkgTTM4MAorNjY0NiwJMCwJQU1EIFJhZGVvbiBSOSBNMjgwWAorNjY0NiwJODAsCUFNRCBSYWRlb24gKFRNKSBSOSBNNDcwWAorNjY0NywJMCwJQU1EIFJhZGVvbiBSOSBNMjcwWAorNjY0NywJODAsCUFNRCBSYWRlb24gKFRNKSBSOSBNMzgwCis2NjQ5LAkwLAlBTUQgRmlyZVBybyBXNTEwMAorNjY1OCwJMCwJQU1EIFJhZGVvbiBSNyAyMDAgU2VyaWVzCis2NjVDLAkwLAlBTUQgUmFkZW9uIEhEIDc3MDAgU2VyaWVzCis2NjVELAkwLAlBTUQgUmFkZW9uIFI3IDIwMCBTZXJpZXMKKzY2NUYsCTgxLAlBTUQgUmFkZW9uIChUTSkgUjcgMzAwIFNlcmllcworNjY2MCwJMCwJQU1EIFJhZGVvbiBIRCA4NjAwTSBTZXJpZXMKKzY2NjAsCTgxLAlBTUQgUmFkZW9uIChUTSkgUjUgTTMzNQorNjY2MCwJODMsCUFNRCBSYWRlb24gKFRNKSBSNSBNMzMwCis2NjYzLAkwLAlBTUQgUmFkZW9uIEhEIDg1MDBNIFNlcmllcworNjY2MywJODMsCUFNRCBSYWRlb24gKFRNKSBSNSBNMzIwCis2NjY0LAkwLAlBTUQgUmFkZW9uIFI1IE0yMDAgU2VyaWVzCis2NjY1LAkwLAlBTUQgUmFkZW9uIFI1IE0yMDAgU2VyaWVzCis2NjY1LAk4MywJQU1EIFJhZGVvbiAoVE0pIFI1IE0zMjAKKzY2NjcsCTAsCUFNRCBSYWRlb24gUjUgTTIwMCBTZXJpZXMKKzY2NkYsCTAsCUFNRCBSYWRlb24gSEQgODUwME0KKzY3ODAsCTAsCUFUSSBGaXJlUHJvIFYgKEZpcmVHTCBWKSBHcmFwaGljcyBBZGFwdGVyCis2NzhBLAkwLAlBVEkgRmlyZVBybyBWIChGaXJlR0wgVikgR3JhcGhpY3MgQWRhcHRlcgorNjc5OCwJMCwJQU1EIFJhZGVvbiBIRCA3OTAwIFNlcmllcworNjc5QSwJMCwJQU1EIFJhZGVvbiBIRCA3OTAwIFNlcmllcworNjc5QiwJMCwJQU1EIFJhZGVvbiBIRCA3OTAwIFNlcmllcworNjc5RSwJMCwJQU1EIFJhZGVvbiBIRCA3ODAwIFNlcmllcworNjdBMCwJMCwJQU1EIFJhZGVvbiBGaXJlUHJvIFc5MTAwCis2N0ExLAkwLAlBTUQgUmFkZW9uIEZpcmVQcm8gVzgxMDAKKzY3QjAsCTAsCUFNRCBSYWRlb24gUjkgMjAwIFNlcmllcworNjdCMCwJODAsCUFNRCBSYWRlb24gKFRNKSBSOSAzOTAgU2VyaWVzCis2N0IxLAkwLAlBTUQgUmFkZW9uIFI5IDIwMCBTZXJpZXMKKzY3QjEsCTgwLAlBTUQgUmFkZW9uIChUTSkgUjkgMzkwIFNlcmllcworNjdCOSwJMCwJQU1EIFJhZGVvbiBSOSAyMDAgU2VyaWVzCis2N0RGLAlDMSwJUmFkZW9uIFJYIDU4MCBTZXJpZXMKKzY3REYsCUMyLAlSYWRlb24gUlggNTcwIFNlcmllcworNjdERiwJQzMsCVJhZGVvbiBSWCA1ODAgU2VyaWVzCis2N0RGLAlDNCwJQU1EIFJhZGVvbiAoVE0pIFJYIDQ4MCBHcmFwaGljcworNjdERiwJQzUsCUFNRCBSYWRlb24gKFRNKSBSWCA0NzAgR3JhcGhpY3MKKzY3REYsCUM2LAlSYWRlb24gUlggNTcwIFNlcmllcworNjdERiwJQzcsCUFNRCBSYWRlb24gKFRNKSBSWCA0ODAgR3JhcGhpY3MKKzY3REYsCUNGLAlBTUQgUmFkZW9uIChUTSkgUlggNDcwIEdyYXBoaWNzCis2N0RGLAlFMywJUmFkZW9uIFJYIFNlcmllcworNjdERiwJRTcsCVJhZGVvbiBSWCA1ODAgU2VyaWVzCis2N0RGLAlFRiwJUmFkZW9uIFJYIDU3MCBTZXJpZXMKKzY3QzIsCTAxLAlBTUQgUmFkZW9uIChUTSkgUHJvIFY3MzUweDIKKzY3QzIsCTAyLAlBTUQgUmFkZW9uIChUTSkgUHJvIFY3MzAwWAorNjdDNCwJMDAsCUFNRCBSYWRlb24gKFRNKSBQcm8gV1ggNzEwMCBHcmFwaGljcworNjdDNywJMDAsCUFNRCBSYWRlb24gKFRNKSBQcm8gV1ggNTEwMCBHcmFwaGljcworNjdDMCwJMDAsCUFNRCBSYWRlb24gKFRNKSBQcm8gV1ggNzEwMCBHcmFwaGljcworNjdEMCwJMDEsCUFNRCBSYWRlb24gKFRNKSBQcm8gVjczNTB4MgorNjdEMCwJMDIsCUFNRCBSYWRlb24gKFRNKSBQcm8gVjczMDBYCis2N0UwLAkwMCwJQU1EIFJhZGVvbiAoVE0pIFBybyBXWCBTZXJpZXMKKzY3RTMsCTAwLAlBTUQgUmFkZW9uIChUTSkgUHJvIFdYIDQxMDAKKzY3RTgsCTAwLAlBTUQgUmFkZW9uIChUTSkgUHJvIFdYIFNlcmllcworNjdFOCwJMDEsCUFNRCBSYWRlb24gKFRNKSBQcm8gV1ggU2VyaWVzCis2N0U4LAk4MCwJQU1EIFJhZGVvbiAoVE0pIEU5MjYwIEdyYXBoaWNzCis2N0VCLAkwMCwJQU1EIFJhZGVvbiAoVE0pIFBybyBWNTMwMFgKKzY3RUYsCUMwLAlBTUQgUmFkZW9uIChUTSkgUlggR3JhcGhpY3MKKzY3RUYsCUMxLAlBTUQgUmFkZW9uIChUTSkgUlggNDYwIEdyYXBoaWNzCis2N0VGLAlDMywJUmFkZW9uIFJYIFNlcmllcworNjdFRiwJQzUsCUFNRCBSYWRlb24gKFRNKSBSWCA0NjAgR3JhcGhpY3MKKzY3RUYsCUM3LAlBTUQgUmFkZW9uIChUTSkgUlggR3JhcGhpY3MKKzY3RUYsCUNGLAlBTUQgUmFkZW9uIChUTSkgUlggNDYwIEdyYXBoaWNzCis2N0VGLAlFMSwJUmFkZW9uIFJYIFNlcmllcworNjdFRiwJRTMsCVJhZGVvbiBSWCBTZXJpZXMKKzY3RUYsCUU3LAlSYWRlb24gUlggU2VyaWVzCis2N0VGLAlFRiwJQU1EIFJhZGVvbiAoVE0pIFJYIEdyYXBoaWNzCis2N0VGLAlGRiwJUmFkZW9uIFJYIFNlcmllcworNjdGRiwJQzAsCUFNRCBSYWRlb24gKFRNKSBSWCBHcmFwaGljcworNjdGRiwJQzEsCUFNRCBSYWRlb24gKFRNKSBSWCBHcmFwaGljcworNjdGRiwJRkYsCVJhZGVvbiBSWCA1NTAgU2VyaWVzCis2ODAwLAkwLAlBTUQgUmFkZW9uIEhEIDc5NzBNCis2ODAxLAkwLAlBTUQgUmFkZW9uKFRNKSBIRDg5NzBNCis2ODA4LAkwLAlBVEkgRmlyZVBybyBWKEZpcmVHTCBWKSBHcmFwaGljcyBBZGFwdGVyCis2ODA5LAkwLAlBVEkgRmlyZVBybyBWKEZpcmVHTCBWKSBHcmFwaGljcyBBZGFwdGVyCis2ODEwLAkwLAlBTUQgUmFkZW9uKFRNKSBIRCA4ODAwIFNlcmllcworNjgxMCwJODEsCUFNRCBSYWRlb24gKFRNKSBSNyAzNzAgU2VyaWVzCis2ODExLAkwLAlBTUQgUmFkZW9uKFRNKSBIRDg4MDAgU2VyaWVzCis2ODExLAk4MSwJQU1EIFJhZGVvbiAoVE0pIFI3IDMwMCBTZXJpZXMKKzY4MTgsCTAsCUFNRCBSYWRlb24gSEQgNzgwMCBTZXJpZXMKKzY4MTksCTAsCUFNRCBSYWRlb24gSEQgNzgwMCBTZXJpZXMKKzY4MjAsCTAsCUFNRCBSYWRlb24gSEQgODgwME0gU2VyaWVzCis2ODIwLAk4MSwJQU1EIFJhZGVvbiAoVE0pIFI5IE0zNzUKKzY4MjAsCTgzLAlBTUQgUmFkZW9uIChUTSkgUjkgTTM3NVgKKzY4MjEsCTAsCUFNRCBSYWRlb24gSEQgODgwME0gU2VyaWVzCis2ODIxLAk4NywJQU1EIFJhZGVvbiAoVE0pIFI3IE0zODAKKzY4MjEsCTgzLAlBTUQgUmFkZW9uIFI5IChUTSkgTTM3MFgKKzY4MjIsCTAsCUFNRCBSYWRlb24gRTg4NjAKKzY4MjMsCTAsCUFNRCBSYWRlb24gSEQgODgwME0gU2VyaWVzCis2ODI1LAkwLAlBTUQgUmFkZW9uIEhEIDc4MDBNIFNlcmllcworNjgyNywJMCwJQU1EIFJhZGVvbiBIRCA3ODAwTSBTZXJpZXMKKzY4MjgsCTAsCUFUSSBGaXJlUHJvIFYoRmlyZUdMIFYpIEdyYXBoaWNzIEFkYXB0ZXIKKzY4MkIsCTAsCUFNRCBSYWRlb24gSEQgODgwME0gU2VyaWVzCis2ODJCLAk4NywJQU1EIFJhZGVvbiAoVE0pIFI5IE0zNjAKKzY4MkMsCTAsCUFNRCBGaXJlUHJvIFc0MTAwCis2ODJELAkwLAlBTUQgUmFkZW9uIEhEIDc3MDBNIFNlcmllcworNjgyRiwJMCwJQU1EIFJhZGVvbiBIRCA3NzAwTSBTZXJpZXMKKzY4MzUsCTAsCUFNRCBSYWRlb24gUjcgU2VyaWVzIC8gSEQgOTAwMCBTZXJpZXMKKzY4MzcsCTAsCUFNRCBSYWRlb24gSEQ3NzAwIFNlcmllcworNjgzRCwJMCwJQU1EIFJhZGVvbiBIRCA3NzAwIFNlcmllcworNjgzRiwJMCwJQU1EIFJhZGVvbiBIRCA3NzAwIFNlcmllcworNjkwMCwJMCwJQU1EIFJhZGVvbiBSNyBNMjYwCis2OTAwLAk4MSwJQU1EIFJhZGVvbiAoVE0pIFI3IE0zNjAKKzY5MDAsCTgzLAlBTUQgUmFkZW9uIChUTSkgUjcgTTM0MAorNjkwMSwJMCwJQU1EIFJhZGVvbiBSNSBNMjU1Cis2OTA3LAkwLAlBTUQgUmFkZW9uIFI1IE0yNTUKKzY5MDcsCTg3LAlBTUQgUmFkZW9uIChUTSkgUjUgTTMxNQorNjkyMCwJMCwJQU1EIFJBREVPTiBSOSBNMzk1WAorNjkyMCwJMSwJQU1EIFJBREVPTiBSOSBNMzkwWAorNjkyMSwJMCwJQU1EIFJhZGVvbiBSOSBNMjk1WAorNjkyOSwJMCwJQU1EIEZpcmVQcm8gUzcxNTAKKzY5MkIsCTAsCUFNRCBGaXJlUHJvIFc3MTAwCis2OTM4LAkwLAlBTUQgUmFkZW9uIFI5IDIwMCBTZXJpZXMKKzY5MzgsCUYwLAlBTUQgUmFkZW9uIFI5IDIwMCBTZXJpZXMKKzY5MzgsCUYxLAlBTUQgUmFkZW9uIChUTSkgUjkgMzgwIFNlcmllcworNjkzOSwJRjAsCUFNRCBSYWRlb24gUjkgMjAwIFNlcmllcworNjkzOSwJMCwJQU1EIFJhZGVvbiBSOSAyMDAgU2VyaWVzCis2OTM5LAlGMSwJQU1EIFJhZGVvbiAoVE0pIFI5IDM4MCBTZXJpZXMKKzY5ODUsCTAwLAlBTUQgUmFkZW9uIFBybyBXWDMxMDAKKzY5OTUsCTAwLAlBTUQgUmFkZW9uIFBybyBXWDIxMDAKKzY5OUYsCUMwLAlSYWRlb24gNTAwIFNlcmllcworNjk5RiwJQzMsCVJhZGVvbiA1MDAgU2VyaWVzCis2OTlGLAlDNywJUmFkZW9uIFJYIDU1MCBTZXJpZXMKKzczMDAsCUMxLAlBTUQgRmlyZVBybyAoVE0pIFM5MzAwIHgyCis3MzAwLAlDOCwJQU1EIFJhZGVvbiAoVE0pIFI5IEZ1cnkgU2VyaWVzCis3MzAwLAlDOSwJUmFkZW9uIChUTSkgUHJvIER1bworNzMwMCwJQ0IsCUFNRCBSYWRlb24gKFRNKSBSOSBGdXJ5IFNlcmllcworNzMwMCwJQ0EsCUFNRCBSYWRlb24gKFRNKSBSOSBGdXJ5IFNlcmllcworOTg3NCwJQzQsCUFNRCBSYWRlb24gUjcgR3JhcGhpY3MKKzk4NzQsCUM1LAlBTUQgUmFkZW9uIFI2IEdyYXBoaWNzCis5ODc0LAlDNiwJQU1EIFJhZGVvbiBSNiBHcmFwaGljcworOTg3NCwJQzcsCUFNRCBSYWRlb24gUjUgR3JhcGhpY3MKKzk4NzQsCUM4LAlBTUQgUmFkZW9uIFI3IEdyYXBoaWNzCis5ODc0LAk4MSwJQU1EIFJhZGVvbiBSNiBHcmFwaGljcworOTg3NCwJODcsCUFNRCBSYWRlb24gUjUgR3JhcGhpY3MKKzk4NzQsCTg1LAlBTUQgUmFkZW9uIFI2IEdyYXBoaWNzCis5ODc0LAk4NCwJQU1EIFJhZGVvbiBSNyBHcmFwaGljcwpkaWZmIC0tZ2l0IGEvZXRuYXZpdi9BbmRyb2lkLm1rIGIvZXRuYXZpdi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MGY5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9ldG5hdml2L0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgSW1wb3J0IHZhcmlhYmxlcyBMSUJEUk1fRVROQVZJVl9GSUxFUywgTElCRFJNX0VUTkFWSVZfSF9GSUxFUworaW5jbHVkZSAkKExPQ0FMX1BBVEgpL01ha2VmaWxlLnNvdXJjZXMKKworTE9DQUxfTU9EVUxFIDo9IGxpYmRybV9ldG5hdml2CisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliZHJtCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKExJQkRSTV9FVE5BVklWX0ZJTEVTKQorCitpbmNsdWRlICQoTElCRFJNX0NPTU1PTl9NSykKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2V0bmF2aXYvTWFrZWZpbGUuYW0gYi9ldG5hdml2L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOTZiYTgKLS0tIC9kZXYvbnVsbAorKysgYi9ldG5hdml2L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjYgQEAKK2luY2x1ZGUgTWFrZWZpbGUuc291cmNlcworCitBTV9DRkxBR1MgPSBcCisJJChXQVJOX0NGTEFHUykgXAorCS1JJCh0b3Bfc3JjZGlyKSBcCisJJChQVEhSRUFEU1RVQlNfQ0ZMQUdTKSBcCisJLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUvZHJtCisKK2xpYmRybV9ldG5hdml2X2xhZGlyID0gJChsaWJkaXIpCitsaWJkcm1fZXRuYXZpdl9sYV9MVExJQlJBUklFUyA9IGxpYmRybV9ldG5hdml2LmxhCitsaWJkcm1fZXRuYXZpdl9sYV9MREZMQUdTID0gLXZlcnNpb24tbnVtYmVyIDE6MDowIC1uby11bmRlZmluZWQKK2xpYmRybV9ldG5hdml2X2xhX0xJQkFERCA9IFwKKwkuLi9saWJkcm0ubGEgXAorCUBQVEhSRUFEU1RVQlNfTElCU0AgXAorCUBDTE9DS19MSUJACisKK2xpYmRybV9ldG5hdml2X2xhX1NPVVJDRVMgPSAkKExJQkRSTV9FVE5BVklWX0ZJTEVTKQorCitsaWJkcm1fZXRuYXZpdmluY2x1ZGVkaXIgPSAke2luY2x1ZGVkaXJ9L2xpYmRybQorbGliZHJtX2V0bmF2aXZpbmNsdWRlX0hFQURFUlMgPSAkKExJQkRSTV9FVE5BVklWX0hfRklMRVMpCisKK3BrZ2NvbmZpZ2RpciA9IEBwa2djb25maWdkaXJACitwa2djb25maWdfREFUQSA9IGxpYmRybV9ldG5hdml2LnBjCisKK1RFU1RTID0gZXRuYXZpdi1zeW1ib2wtY2hlY2sKK0VYVFJBX0RJU1QgPSAkKFRFU1RTKQpkaWZmIC0tZ2l0IGEvZXRuYXZpdi9NYWtlZmlsZS5zb3VyY2VzIGIvZXRuYXZpdi9NYWtlZmlsZS5zb3VyY2VzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNTgwNTYKLS0tIC9kZXYvbnVsbAorKysgYi9ldG5hdml2L01ha2VmaWxlLnNvdXJjZXMKQEAgLTAsMCArMSwxMiBAQAorTElCRFJNX0VUTkFWSVZfRklMRVMgOj0gXAorCWV0bmF2aXZfZGV2aWNlLmMgXAorCWV0bmF2aXZfZ3B1LmMgXAorCWV0bmF2aXZfYm8uYyBcCisJZXRuYXZpdl9ib19jYWNoZS5jIFwKKwlldG5hdml2X3BpcGUuYyBcCisJZXRuYXZpdl9jbWRfc3RyZWFtLmMgXAorCWV0bmF2aXZfZHJtLmggXAorCWV0bmF2aXZfcHJpdi5oCisKK0xJQkRSTV9FVE5BVklWX0hfRklMRVMgOj0gXAorCWV0bmF2aXZfZHJtaWYuaApkaWZmIC0tZ2l0IGEvZXRuYXZpdi9ldG5hdml2LXN5bWJvbC1jaGVjayBiL2V0bmF2aXYvZXRuYXZpdi1zeW1ib2wtY2hlY2sKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGUyMDMwZQotLS0gL2Rldi9udWxsCisrKyBiL2V0bmF2aXYvZXRuYXZpdi1zeW1ib2wtY2hlY2sKQEAgLTAsMCArMSw0OSBAQAorIyEvYmluL2Jhc2gKKworIyBUaGUgZm9sbG93aW5nIHN5bWJvbHMgKHBhc3QgdGhlIGZpcnN0IGZpdmUpIGFyZSB0YWtlbiBmcm9tIHRoZSBwdWJsaWMgaGVhZGVycy4KKyMgQSBsaXN0IG9mIHRoZSBsYXR0ZXIgc2hvdWxkIGJlIGF2YWlsYWJsZSBNYWtlZmlsZS5zb3VyY2VzL0xJQkRSTV9FVE5BVklWX0hfRklMRVMKKworRlVOQ1M9JChubSAtRCAtLWZvcm1hdD1ic2QgLS1kZWZpbmVkLW9ubHkgJHsxLS5saWJzL2xpYmRybV9ldG5hdml2LnNvfSB8IGF3ayAne3ByaW50ICQzfSd8IHdoaWxlIHJlYWQgZnVuYzsgZG8KKyggZ3JlcCAtcSAiXiRmdW5jJCIgfHwgZWNobyAkZnVuYyApICA8PEVPRgorX19ic3Nfc3RhcnQKK19lZGF0YQorX2VuZAorX2ZpbmkKK19pbml0CitldG5hX2RldmljZV9uZXcKK2V0bmFfZGV2aWNlX25ld19kdXAKK2V0bmFfZGV2aWNlX3JlZgorZXRuYV9kZXZpY2VfZGVsCitldG5hX2RldmljZV9mZAorZXRuYV9ncHVfbmV3CitldG5hX2dwdV9kZWwKK2V0bmFfZ3B1X2dldF9wYXJhbQorZXRuYV9waXBlX25ldworZXRuYV9waXBlX2RlbAorZXRuYV9waXBlX3dhaXQKK2V0bmFfcGlwZV93YWl0X25zCitldG5hX2JvX25ldworZXRuYV9ib19mcm9tX2hhbmRsZQorZXRuYV9ib19mcm9tX25hbWUKK2V0bmFfYm9fZnJvbV9kbWFidWYKK2V0bmFfYm9fcmVmCitldG5hX2JvX2RlbAorZXRuYV9ib19nZXRfbmFtZQorZXRuYV9ib19oYW5kbGUKK2V0bmFfYm9fZG1hYnVmCitldG5hX2JvX3NpemUKK2V0bmFfYm9fbWFwCitldG5hX2JvX2NwdV9wcmVwCitldG5hX2JvX2NwdV9maW5pCitldG5hX2NtZF9zdHJlYW1fbmV3CitldG5hX2NtZF9zdHJlYW1fZGVsCitldG5hX2NtZF9zdHJlYW1fdGltZXN0YW1wCitldG5hX2NtZF9zdHJlYW1fZmx1c2gKK2V0bmFfY21kX3N0cmVhbV9mbHVzaDIKK2V0bmFfY21kX3N0cmVhbV9maW5pc2gKK2V0bmFfY21kX3N0cmVhbV9yZWxvYworRU9GCitkb25lKQorCit0ZXN0ICEgLW4gIiRGVU5DUyIgfHwgZWNobyAkRlVOQ1MKK3Rlc3QgISAtbiAiJEZVTkNTIgpkaWZmIC0tZ2l0IGEvZXRuYXZpdi9ldG5hdml2X2JvLmMgYi9ldG5hdml2L2V0bmF2aXZfYm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGI5Y2QyCi0tLSAvZGV2L251bGwKKysrIGIvZXRuYXZpdi9ldG5hdml2X2JvLmMKQEAgLTAsMCArMSwzNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgRXRuYXZpdiBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBDaHJpc3RpYW4gR21laW5lciA8Y2hyaXN0aWFuLmdtZWluZXJAZ21haWwuY29tPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJldG5hdml2X3ByaXYuaCIKKyNpbmNsdWRlICJldG5hdml2X2RybWlmLmgiCisKK2RybV9wcml2YXRlIHB0aHJlYWRfbXV0ZXhfdCB0YWJsZV9sb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKK2RybV9wcml2YXRlIHZvaWQgYm9fZGVsKHN0cnVjdCBldG5hX2JvICpibyk7CisKKy8qIHNldCBidWZmZXIgbmFtZSwgYW5kIGFkZCB0byB0YWJsZSwgY2FsbCB3LyB0YWJsZV9sb2NrIGhlbGQ6ICovCitzdGF0aWMgdm9pZCBzZXRfbmFtZShzdHJ1Y3QgZXRuYV9ibyAqYm8sIHVpbnQzMl90IG5hbWUpCit7CisJYm8tPm5hbWUgPSBuYW1lOworCS8qIGFkZCBvdXJzZWxmIGludG8gdGhlIG5hbWUgdGFibGU6ICovCisJZHJtSGFzaEluc2VydChiby0+ZGV2LT5uYW1lX3RhYmxlLCBuYW1lLCBibyk7Cit9CisKKy8qIENhbGxlZCB1bmRlciB0YWJsZV9sb2NrICovCitkcm1fcHJpdmF0ZSB2b2lkIGJvX2RlbChzdHJ1Y3QgZXRuYV9ibyAqYm8pCit7CisJaWYgKGJvLT5tYXApCisJCWRybV9tdW5tYXAoYm8tPm1hcCwgYm8tPnNpemUpOworCisJaWYgKGJvLT5uYW1lKQorCQlkcm1IYXNoRGVsZXRlKGJvLT5kZXYtPm5hbWVfdGFibGUsIGJvLT5uYW1lKTsKKworCWlmIChiby0+aGFuZGxlKSB7CisJCXN0cnVjdCBkcm1fZ2VtX2Nsb3NlIHJlcSA9IHsKKwkJCS5oYW5kbGUgPSBiby0+aGFuZGxlLAorCQl9OworCisJCWRybUhhc2hEZWxldGUoYm8tPmRldi0+aGFuZGxlX3RhYmxlLCBiby0+aGFuZGxlKTsKKwkJZHJtSW9jdGwoYm8tPmRldi0+ZmQsIERSTV9JT0NUTF9HRU1fQ0xPU0UsICZyZXEpOworCX0KKworCWZyZWUoYm8pOworfQorCisvKiBsb29rdXAgYSBidWZmZXIgZnJvbSBpdCdzIGhhbmRsZSwgY2FsbCB3LyB0YWJsZV9sb2NrIGhlbGQ6ICovCitzdGF0aWMgc3RydWN0IGV0bmFfYm8gKmxvb2t1cF9ibyh2b2lkICp0YmwsIHVpbnQzMl90IGhhbmRsZSkKK3sKKwlzdHJ1Y3QgZXRuYV9ibyAqYm8gPSBOVUxMOworCisJaWYgKCFkcm1IYXNoTG9va3VwKHRibCwgaGFuZGxlLCAodm9pZCAqKikmYm8pKSB7CisJCS8qIGZvdW5kLCBpbmNyIHJlZmNudCBhbmQgcmV0dXJuOiAqLworCQlibyA9IGV0bmFfYm9fcmVmKGJvKTsKKworCQkvKiBkb24ndCBicmVhayB0aGUgYnVja2V0IGlmIHRoaXMgYm8gd2FzIGZvdW5kIGluIG9uZSAqLworCQlsaXN0X2RlbGluaXQoJmJvLT5saXN0KTsKKwl9CisKKwlyZXR1cm4gYm87Cit9CisKKy8qIGFsbG9jYXRlIGEgbmV3IGJ1ZmZlciBvYmplY3QsIGNhbGwgdy8gdGFibGVfbG9jayBoZWxkICovCitzdGF0aWMgc3RydWN0IGV0bmFfYm8gKmJvX2Zyb21faGFuZGxlKHN0cnVjdCBldG5hX2RldmljZSAqZGV2LAorCQl1aW50MzJfdCBzaXplLCB1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IGZsYWdzKQoreworCXN0cnVjdCBldG5hX2JvICpibyA9IGNhbGxvYyhzaXplb2YoKmJvKSwgMSk7CisKKwlpZiAoIWJvKSB7CisJCXN0cnVjdCBkcm1fZ2VtX2Nsb3NlIHJlcSA9IHsKKwkJCS5oYW5kbGUgPSBoYW5kbGUsCisJCX07CisKKwkJZHJtSW9jdGwoZGV2LT5mZCwgRFJNX0lPQ1RMX0dFTV9DTE9TRSwgJnJlcSk7CisKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYm8tPmRldiA9IGV0bmFfZGV2aWNlX3JlZihkZXYpOworCWJvLT5zaXplID0gc2l6ZTsKKwliby0+aGFuZGxlID0gaGFuZGxlOworCWJvLT5mbGFncyA9IGZsYWdzOworCWF0b21pY19zZXQoJmJvLT5yZWZjbnQsIDEpOworCWxpc3RfaW5pdGhlYWQoJmJvLT5saXN0KTsKKwkvKiBhZGQgb3Vyc2VsdmVzIHRvIHRoZSBoYW5kbGUgdGFibGU6ICovCisJZHJtSGFzaEluc2VydChkZXYtPmhhbmRsZV90YWJsZSwgaGFuZGxlLCBibyk7CisKKwlyZXR1cm4gYm87Cit9CisKKy8qIGFsbG9jYXRlIGEgbmV3ICh1bi10aWxlZCkgYnVmZmVyIG9iamVjdCAqLworc3RydWN0IGV0bmFfYm8gKmV0bmFfYm9fbmV3KHN0cnVjdCBldG5hX2RldmljZSAqZGV2LCB1aW50MzJfdCBzaXplLAorCQl1aW50MzJfdCBmbGFncykKK3sKKwlzdHJ1Y3QgZXRuYV9ibyAqYm87CisJaW50IHJldDsKKwlzdHJ1Y3QgZHJtX2V0bmF2aXZfZ2VtX25ldyByZXEgPSB7CisJCQkuZmxhZ3MgPSBmbGFncywKKwl9OworCisJYm8gPSBldG5hX2JvX2NhY2hlX2FsbG9jKCZkZXYtPmJvX2NhY2hlLCAmc2l6ZSwgZmxhZ3MpOworCWlmIChibykKKwkJcmV0dXJuIGJvOworCisJcmVxLnNpemUgPSBzaXplOworCXJldCA9IGRybUNvbW1hbmRXcml0ZVJlYWQoZGV2LT5mZCwgRFJNX0VUTkFWSVZfR0VNX05FVywKKwkJCSZyZXEsIHNpemVvZihyZXEpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gTlVMTDsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmdGFibGVfbG9jayk7CisJYm8gPSBib19mcm9tX2hhbmRsZShkZXYsIHNpemUsIHJlcS5oYW5kbGUsIGZsYWdzKTsKKwliby0+cmV1c2UgPSAxOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0YWJsZV9sb2NrKTsKKworCXJldHVybiBibzsKK30KKworc3RydWN0IGV0bmFfYm8gKmV0bmFfYm9fcmVmKHN0cnVjdCBldG5hX2JvICpibykKK3sKKwlhdG9taWNfaW5jKCZiby0+cmVmY250KTsKKworCXJldHVybiBibzsKK30KKworLyogZ2V0IGJ1ZmZlciBpbmZvICovCitzdGF0aWMgaW50IGdldF9idWZmZXJfaW5mbyhzdHJ1Y3QgZXRuYV9ibyAqYm8pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZHJtX2V0bmF2aXZfZ2VtX2luZm8gcmVxID0geworCQkuaGFuZGxlID0gYm8tPmhhbmRsZSwKKwl9OworCisJcmV0ID0gZHJtQ29tbWFuZFdyaXRlUmVhZChiby0+ZGV2LT5mZCwgRFJNX0VUTkFWSVZfR0VNX0lORk8sCisJCQkmcmVxLCBzaXplb2YocmVxKSk7CisJaWYgKHJldCkgeworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIHJlYWxseSBhbGwgd2UgbmVlZCBmb3Igbm93IGlzIG1tYXAgb2Zmc2V0ICovCisJYm8tPm9mZnNldCA9IHJlcS5vZmZzZXQ7CisKKwlyZXR1cm4gMDsKK30KKworLyogaW1wb3J0IGEgYnVmZmVyIG9iamVjdCBmcm9tIERSSTIgbmFtZSAqLworc3RydWN0IGV0bmFfYm8gKmV0bmFfYm9fZnJvbV9uYW1lKHN0cnVjdCBldG5hX2RldmljZSAqZGV2LCB1aW50MzJfdCBuYW1lKQoreworCXN0cnVjdCBldG5hX2JvICpibzsKKwlzdHJ1Y3QgZHJtX2dlbV9vcGVuIHJlcSA9IHsKKwkJLm5hbWUgPSBuYW1lLAorCX07CisKKwlwdGhyZWFkX211dGV4X2xvY2soJnRhYmxlX2xvY2spOworCisJLyogY2hlY2sgbmFtZSB0YWJsZSBmaXJzdCwgdG8gc2VlIGlmIGJvIGlzIGFscmVhZHkgb3BlbjogKi8KKwlibyA9IGxvb2t1cF9ibyhkZXYtPm5hbWVfdGFibGUsIG5hbWUpOworCWlmIChibykKKwkJZ290byBvdXRfdW5sb2NrOworCisJaWYgKGRybUlvY3RsKGRldi0+ZmQsIERSTV9JT0NUTF9HRU1fT1BFTiwgJnJlcSkpIHsKKwkJRVJST1JfTVNHKCJnZW0tb3BlbiBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWJvID0gbG9va3VwX2JvKGRldi0+aGFuZGxlX3RhYmxlLCByZXEuaGFuZGxlKTsKKwlpZiAoYm8pCisJCWdvdG8gb3V0X3VubG9jazsKKworCWJvID0gYm9fZnJvbV9oYW5kbGUoZGV2LCByZXEuc2l6ZSwgcmVxLmhhbmRsZSwgMCk7CisJaWYgKGJvKQorCQlzZXRfbmFtZShibywgbmFtZSk7CisKK291dF91bmxvY2s6CisJcHRocmVhZF9tdXRleF91bmxvY2soJnRhYmxlX2xvY2spOworCisJcmV0dXJuIGJvOworfQorCisvKiBpbXBvcnQgYSBidWZmZXIgZnJvbSBkbWFidWYgZmQsIGRvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIHRoZQorICogZmQgc28gY2FsbGVyIHNob3VsZCBjbG9zZSgpIHRoZSBmZCB3aGVuIGl0IGlzIG90aGVyd2lzZSBkb25lCisgKiB3aXRoIGl0IChldmVuIGlmIGl0IGlzIHN0aWxsIHVzaW5nIHRoZSAnc3RydWN0IGV0bmFfYm8gKicpCisgKi8KK3N0cnVjdCBldG5hX2JvICpldG5hX2JvX2Zyb21fZG1hYnVmKHN0cnVjdCBldG5hX2RldmljZSAqZGV2LCBpbnQgZmQpCit7CisJc3RydWN0IGV0bmFfYm8gKmJvOworCWludCByZXQsIHNpemU7CisJdWludDMyX3QgaGFuZGxlOworCisJLyogdGFrZSB0aGUgbG9jayBiZWZvcmUgY2FsbGluZyBkcm1QcmltZUZEVG9IYW5kbGUgdG8gYXZvaWQKKwkgKiByYWNpbmcgYWdhaW5zdCBldG5hX2JvX2RlbCwgd2hpY2ggbWlnaHQgaW52YWxpZGF0ZSB0aGUKKwkgKiByZXR1cm5lZCBoYW5kbGUuCisJICovCisJcHRocmVhZF9tdXRleF9sb2NrKCZ0YWJsZV9sb2NrKTsKKworCXJldCA9IGRybVByaW1lRkRUb0hhbmRsZShkZXYtPmZkLCBmZCwgJmhhbmRsZSk7CisJaWYgKHJldCkgeworCQlwdGhyZWFkX211dGV4X3VubG9jaygmdGFibGVfbG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKworCWJvID0gbG9va3VwX2JvKGRldi0+aGFuZGxlX3RhYmxlLCBoYW5kbGUpOworCWlmIChibykKKwkJZ290byBvdXRfdW5sb2NrOworCisJLyogbHNlZWsoKSB0byBnZXQgYm8gc2l6ZSAqLworCXNpemUgPSBsc2VlayhmZCwgMCwgU0VFS19FTkQpOworCWxzZWVrKGZkLCAwLCBTRUVLX0NVUik7CisKKwlibyA9IGJvX2Zyb21faGFuZGxlKGRldiwgc2l6ZSwgaGFuZGxlLCAwKTsKKworb3V0X3VubG9jazoKKwlwdGhyZWFkX211dGV4X3VubG9jaygmdGFibGVfbG9jayk7CisKKwlyZXR1cm4gYm87Cit9CisKKy8qIGRlc3Ryb3kgYSBidWZmZXIgb2JqZWN0ICovCit2b2lkIGV0bmFfYm9fZGVsKHN0cnVjdCBldG5hX2JvICpibykKK3sKKwlzdHJ1Y3QgZXRuYV9kZXZpY2UgKmRldiA9IGJvLT5kZXY7CisKKwlpZiAoIWJvKQorCQlyZXR1cm47CisKKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmJvLT5yZWZjbnQpKQorCQlyZXR1cm47CisKKwlwdGhyZWFkX211dGV4X2xvY2soJnRhYmxlX2xvY2spOworCisJaWYgKGJvLT5yZXVzZSAmJiAoZXRuYV9ib19jYWNoZV9mcmVlKCZkZXYtPmJvX2NhY2hlLCBibykgPT0gMCkpCisJCWdvdG8gb3V0OworCisJYm9fZGVsKGJvKTsKKwlldG5hX2RldmljZV9kZWxfbG9ja2VkKGRldik7CitvdXQ6CisJcHRocmVhZF9tdXRleF91bmxvY2soJnRhYmxlX2xvY2spOworfQorCisvKiBnZXQgdGhlIGdsb2JhbCBmbGluay9EUkkyIGJ1ZmZlciBuYW1lICovCitpbnQgZXRuYV9ib19nZXRfbmFtZShzdHJ1Y3QgZXRuYV9ibyAqYm8sIHVpbnQzMl90ICpuYW1lKQoreworCWlmICghYm8tPm5hbWUpIHsKKwkJc3RydWN0IGRybV9nZW1fZmxpbmsgcmVxID0geworCQkJLmhhbmRsZSA9IGJvLT5oYW5kbGUsCisJCX07CisJCWludCByZXQ7CisKKwkJcmV0ID0gZHJtSW9jdGwoYm8tPmRldi0+ZmQsIERSTV9JT0NUTF9HRU1fRkxJTkssICZyZXEpOworCQlpZiAocmV0KSB7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcHRocmVhZF9tdXRleF9sb2NrKCZ0YWJsZV9sb2NrKTsKKwkJc2V0X25hbWUoYm8sIHJlcS5uYW1lKTsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJnRhYmxlX2xvY2spOworCQliby0+cmV1c2UgPSAwOworCX0KKworCSpuYW1lID0gYm8tPm5hbWU7CisKKwlyZXR1cm4gMDsKK30KKwordWludDMyX3QgZXRuYV9ib19oYW5kbGUoc3RydWN0IGV0bmFfYm8gKmJvKQoreworCXJldHVybiBiby0+aGFuZGxlOworfQorCisvKiBjYWxsZXIgb3ducyB0aGUgZG1hYnVmIGZkIHRoYXQgaXMgcmV0dXJuZWQgYW5kIGlzIHJlc3BvbnNpYmxlCisgKiB0byBjbG9zZSgpIGl0IHdoZW4gZG9uZQorICovCitpbnQgZXRuYV9ib19kbWFidWYoc3RydWN0IGV0bmFfYm8gKmJvKQoreworCWludCByZXQsIHByaW1lX2ZkOworCisJcmV0ID0gZHJtUHJpbWVIYW5kbGVUb0ZEKGJvLT5kZXYtPmZkLCBiby0+aGFuZGxlLCBEUk1fQ0xPRVhFQywKKwkJCQkmcHJpbWVfZmQpOworCWlmIChyZXQpIHsKKwkJRVJST1JfTVNHKCJmYWlsZWQgdG8gZ2V0IGRtYWJ1ZiBmZDogJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWJvLT5yZXVzZSA9IDA7CisKKwlyZXR1cm4gcHJpbWVfZmQ7Cit9CisKK3VpbnQzMl90IGV0bmFfYm9fc2l6ZShzdHJ1Y3QgZXRuYV9ibyAqYm8pCit7CisJcmV0dXJuIGJvLT5zaXplOworfQorCit2b2lkICpldG5hX2JvX21hcChzdHJ1Y3QgZXRuYV9ibyAqYm8pCit7CisJaWYgKCFiby0+bWFwKSB7CisJCWlmICghYm8tPm9mZnNldCkgeworCQkJZ2V0X2J1ZmZlcl9pbmZvKGJvKTsKKwkJfQorCisJCWJvLT5tYXAgPSBkcm1fbW1hcCgwLCBiby0+c2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkJCQlNQVBfU0hBUkVELCBiby0+ZGV2LT5mZCwgYm8tPm9mZnNldCk7CisJCWlmIChiby0+bWFwID09IE1BUF9GQUlMRUQpIHsKKwkJCUVSUk9SX01TRygibW1hcCBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWJvLT5tYXAgPSBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIGJvLT5tYXA7Cit9CisKK2ludCBldG5hX2JvX2NwdV9wcmVwKHN0cnVjdCBldG5hX2JvICpibywgdWludDMyX3Qgb3ApCit7CisJc3RydWN0IGRybV9ldG5hdml2X2dlbV9jcHVfcHJlcCByZXEgPSB7CisJCS5oYW5kbGUgPSBiby0+aGFuZGxlLAorCQkub3AgPSBvcCwKKwl9OworCisJZ2V0X2Fic190aW1lb3V0KCZyZXEudGltZW91dCwgNTAwMDAwMDAwMCk7CisKKwlyZXR1cm4gZHJtQ29tbWFuZFdyaXRlKGJvLT5kZXYtPmZkLCBEUk1fRVROQVZJVl9HRU1fQ1BVX1BSRVAsCisJCQkmcmVxLCBzaXplb2YocmVxKSk7Cit9CisKK3ZvaWQgZXRuYV9ib19jcHVfZmluaShzdHJ1Y3QgZXRuYV9ibyAqYm8pCit7CisJc3RydWN0IGRybV9ldG5hdml2X2dlbV9jcHVfZmluaSByZXEgPSB7CisJCS5oYW5kbGUgPSBiby0+aGFuZGxlLAorCX07CisKKwlkcm1Db21tYW5kV3JpdGUoYm8tPmRldi0+ZmQsIERSTV9FVE5BVklWX0dFTV9DUFVfRklOSSwKKwkJCSZyZXEsIHNpemVvZihyZXEpKTsKK30KZGlmZiAtLWdpdCBhL2V0bmF2aXYvZXRuYXZpdl9ib19jYWNoZS5jIGIvZXRuYXZpdi9ldG5hdml2X2JvX2NhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkyNDY1MQotLS0gL2Rldi9udWxsCisrKyBiL2V0bmF2aXYvZXRuYXZpdl9ib19jYWNoZS5jCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEV0bmF2aXYgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgQ2hyaXN0aWFuIEdtZWluZXIgPGNocmlzdGlhbi5nbWVpbmVyQGdtYWlsLmNvbT4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXRuYXZpdl9wcml2LmgiCisjaW5jbHVkZSAiZXRuYXZpdl9kcm1pZi5oIgorCitkcm1fcHJpdmF0ZSB2b2lkIGJvX2RlbChzdHJ1Y3QgZXRuYV9ibyAqYm8pOworZHJtX3ByaXZhdGUgZXh0ZXJuIHB0aHJlYWRfbXV0ZXhfdCB0YWJsZV9sb2NrOworCitzdGF0aWMgdm9pZCBhZGRfYnVja2V0KHN0cnVjdCBldG5hX2JvX2NhY2hlICpjYWNoZSwgaW50IHNpemUpCit7CisJdW5zaWduZWQgaSA9IGNhY2hlLT5udW1fYnVja2V0czsKKworCWFzc2VydChpIDwgQVJSQVlfU0laRShjYWNoZS0+Y2FjaGVfYnVja2V0KSk7CisKKwlsaXN0X2luaXRoZWFkKCZjYWNoZS0+Y2FjaGVfYnVja2V0W2ldLmxpc3QpOworCWNhY2hlLT5jYWNoZV9idWNrZXRbaV0uc2l6ZSA9IHNpemU7CisJY2FjaGUtPm51bV9idWNrZXRzKys7Cit9CisKK2RybV9wcml2YXRlIHZvaWQgZXRuYV9ib19jYWNoZV9pbml0KHN0cnVjdCBldG5hX2JvX2NhY2hlICpjYWNoZSkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUsIGNhY2hlX21heF9zaXplID0gNjQgKiAxMDI0ICogMTAyNDsKKworCS8qIE9LLCBzbyBwb3dlciBvZiB0d28gYnVja2V0cyB3YXMgdG9vIHdhc3RlZnVsIG9mIG1lbW9yeS4KKwkgKiBHaXZlIDMgb3RoZXIgc2l6ZXMgYmV0d2VlbiBlYWNoIHBvd2VyIG9mIHR3bywgdG8gaG9wZWZ1bGx5CisJICogY292ZXIgdGhpbmdzIGFjY3VyYXRlbHkgZW5vdWdoLiAgKFRoZSBhbHRlcm5hdGl2ZSBpcworCSAqIHByb2JhYmx5IHRvIGp1c3QgZ28gZm9yIGV4YWN0IG1hdGNoaW5nIG9mIHNpemVzLCBhbmQgYXNzdW1lCisJICogdGhhdCBmb3IgdGhpbmdzIGxpa2UgY29tcG9zaXRlZCB3aW5kb3cgcmVzaXplIHRoZSB0aWxlZAorCSAqIHdpZHRoL2hlaWdodCBhbGlnbm1lbnQgYW5kIHJvdW5kaW5nIG9mIHNpemVzIHRvIHBhZ2VzIHdpbGwKKwkgKiBnZXQgdXMgdXNlZnVsIGNhY2hlIGhpdCByYXRlcyBhbnl3YXkpCisJICovCisJYWRkX2J1Y2tldChjYWNoZSwgNDA5Nik7CisJYWRkX2J1Y2tldChjYWNoZSwgNDA5NiAqIDIpOworCWFkZF9idWNrZXQoY2FjaGUsIDQwOTYgKiAzKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGxpbmtlZCBsaXN0cyBmb3IgQk8gcmV1c2UgY2FjaGUuICovCisJZm9yIChzaXplID0gNCAqIDQwOTY7IHNpemUgPD0gY2FjaGVfbWF4X3NpemU7IHNpemUgKj0gMikgeworCQlhZGRfYnVja2V0KGNhY2hlLCBzaXplKTsKKwkJYWRkX2J1Y2tldChjYWNoZSwgc2l6ZSArIHNpemUgKiAxIC8gNCk7CisJCWFkZF9idWNrZXQoY2FjaGUsIHNpemUgKyBzaXplICogMiAvIDQpOworCQlhZGRfYnVja2V0KGNhY2hlLCBzaXplICsgc2l6ZSAqIDMgLyA0KTsKKwl9Cit9CisKKy8qIEZyZWVzIG9sZGVyIGNhY2hlZCBidWZmZXJzLiAgQ2FsbGVkIHVuZGVyIHRhYmxlX2xvY2sgKi8KK2RybV9wcml2YXRlIHZvaWQgZXRuYV9ib19jYWNoZV9jbGVhbnVwKHN0cnVjdCBldG5hX2JvX2NhY2hlICpjYWNoZSwgdGltZV90IHRpbWUpCit7CisJdW5zaWduZWQgaTsKKworCWlmIChjYWNoZS0+dGltZSA9PSB0aW1lKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgY2FjaGUtPm51bV9idWNrZXRzOyBpKyspIHsKKwkJc3RydWN0IGV0bmFfYm9fYnVja2V0ICpidWNrZXQgPSAmY2FjaGUtPmNhY2hlX2J1Y2tldFtpXTsKKwkJc3RydWN0IGV0bmFfYm8gKmJvOworCisJCXdoaWxlICghTElTVF9JU19FTVBUWSgmYnVja2V0LT5saXN0KSkgeworCQkJYm8gPSBMSVNUX0VOVFJZKHN0cnVjdCBldG5hX2JvLCBidWNrZXQtPmxpc3QubmV4dCwgbGlzdCk7CisKKwkJCS8qIGtlZXAgdGhpbmdzIGluIGNhY2hlIGZvciBhdCBsZWFzdCAxIHNlY29uZDogKi8KKwkJCWlmICh0aW1lICYmICgodGltZSAtIGJvLT5mcmVlX3RpbWUpIDw9IDEpKQorCQkJCWJyZWFrOworCisJCQlsaXN0X2RlbCgmYm8tPmxpc3QpOworCQkJYm9fZGVsKGJvKTsKKwkJfQorCX0KKworCWNhY2hlLT50aW1lID0gdGltZTsKK30KKworc3RhdGljIHN0cnVjdCBldG5hX2JvX2J1Y2tldCAqZ2V0X2J1Y2tldChzdHJ1Y3QgZXRuYV9ib19jYWNoZSAqY2FjaGUsIHVpbnQzMl90IHNpemUpCit7CisJdW5zaWduZWQgaTsKKworCS8qIGhtbSwgdGhpcyBpcyB3aGF0IGludGVsIGRvZXMsIGJ1dCBJIHN1cHBvc2Ugd2UgY291bGQgY2FsY3VsYXRlIG91cgorCSAqIHdheSB0byB0aGUgY29ycmVjdCBidWNrZXQgc2l6ZSByYXRoZXIgdGhhbiBsb29waW5nLi4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY2FjaGUtPm51bV9idWNrZXRzOyBpKyspIHsKKwkJc3RydWN0IGV0bmFfYm9fYnVja2V0ICpidWNrZXQgPSAmY2FjaGUtPmNhY2hlX2J1Y2tldFtpXTsKKwkJaWYgKGJ1Y2tldC0+c2l6ZSA+PSBzaXplKSB7CisJCQlyZXR1cm4gYnVja2V0OworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgaXNfaWRsZShzdHJ1Y3QgZXRuYV9ibyAqYm8pCit7CisJcmV0dXJuIGV0bmFfYm9fY3B1X3ByZXAoYm8sCisJCQlEUk1fRVROQV9QUkVQX1JFQUQgfAorCQkJRFJNX0VUTkFfUFJFUF9XUklURSB8CisJCQlEUk1fRVROQV9QUkVQX05PU1lOQykgPT0gMDsKK30KKworc3RhdGljIHN0cnVjdCBldG5hX2JvICpmaW5kX2luX2J1Y2tldChzdHJ1Y3QgZXRuYV9ib19idWNrZXQgKmJ1Y2tldCwgdWludDMyX3QgZmxhZ3MpCit7CisJc3RydWN0IGV0bmFfYm8gKmJvID0gTlVMTDsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmdGFibGVfbG9jayk7CisJd2hpbGUgKCFMSVNUX0lTX0VNUFRZKCZidWNrZXQtPmxpc3QpKSB7CisJCWJvID0gTElTVF9FTlRSWShzdHJ1Y3QgZXRuYV9ibywgYnVja2V0LT5saXN0Lm5leHQsIGxpc3QpOworCisJCWlmIChiby0+ZmxhZ3MgPT0gZmxhZ3MgJiYgaXNfaWRsZShibykpIHsKKwkJCWxpc3RfZGVsKCZiby0+bGlzdCk7CisJCQlicmVhazsKKwkJfQorCisJCWJvID0gTlVMTDsKKwkJYnJlYWs7CisJfQorCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0YWJsZV9sb2NrKTsKKworCXJldHVybiBibzsKK30KKworLyogYWxsb2NhdGUgYSBuZXcgKHVuLXRpbGVkKSBidWZmZXIgb2JqZWN0CisgKgorICogTk9URTogc2l6ZSBpcyBwb3RlbnRpYWxseSByb3VuZGVkIHVwIHRvIGJ1Y2tldCBzaXplCisgKi8KK2RybV9wcml2YXRlIHN0cnVjdCBldG5hX2JvICpldG5hX2JvX2NhY2hlX2FsbG9jKHN0cnVjdCBldG5hX2JvX2NhY2hlICpjYWNoZSwgdWludDMyX3QgKnNpemUsCisgICAgdWludDMyX3QgZmxhZ3MpCit7CisJc3RydWN0IGV0bmFfYm8gKmJvOworCXN0cnVjdCBldG5hX2JvX2J1Y2tldCAqYnVja2V0OworCisJKnNpemUgPSBBTElHTigqc2l6ZSwgNDA5Nik7CisJYnVja2V0ID0gZ2V0X2J1Y2tldChjYWNoZSwgKnNpemUpOworCisJLyogc2VlIGlmIHdlIGNhbiBiZSBncmVlbiBhbmQgcmVjeWNsZTogKi8KKwlpZiAoYnVja2V0KSB7CisJCSpzaXplID0gYnVja2V0LT5zaXplOworCQlibyA9IGZpbmRfaW5fYnVja2V0KGJ1Y2tldCwgZmxhZ3MpOworCQlpZiAoYm8pIHsKKwkJCWF0b21pY19zZXQoJmJvLT5yZWZjbnQsIDEpOworCQkJZXRuYV9kZXZpY2VfcmVmKGJvLT5kZXYpOworCQkJcmV0dXJuIGJvOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2RybV9wcml2YXRlIGludCBldG5hX2JvX2NhY2hlX2ZyZWUoc3RydWN0IGV0bmFfYm9fY2FjaGUgKmNhY2hlLCBzdHJ1Y3QgZXRuYV9ibyAqYm8pCit7CisJc3RydWN0IGV0bmFfYm9fYnVja2V0ICpidWNrZXQgPSBnZXRfYnVja2V0KGNhY2hlLCBiby0+c2l6ZSk7CisKKwkvKiBzZWUgaWYgd2UgY2FuIGJlIGdyZWVuIGFuZCByZWN5Y2xlOiAqLworCWlmIChidWNrZXQpIHsKKwkJc3RydWN0IHRpbWVzcGVjIHRpbWU7CisKKwkJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0aW1lKTsKKworCQliby0+ZnJlZV90aW1lID0gdGltZS50dl9zZWM7CisJCWxpc3RfYWRkdGFpbCgmYm8tPmxpc3QsICZidWNrZXQtPmxpc3QpOworCQlldG5hX2JvX2NhY2hlX2NsZWFudXAoY2FjaGUsIHRpbWUudHZfc2VjKTsKKworCQkvKiBibydzIGluIHRoZSBidWNrZXQgY2FjaGUgZG9uJ3QgaGF2ZSBhIHJlZiBhbmQKKwkJICogZG9uJ3QgaG9sZCBhIHJlZiB0byB0aGUgZGV2OgorCQkgKi8KKwkJZXRuYV9kZXZpY2VfZGVsX2xvY2tlZChiby0+ZGV2KTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9ldG5hdml2L2V0bmF2aXZfY21kX3N0cmVhbS5jIGIvZXRuYXZpdi9ldG5hdml2X2NtZF9zdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDBlODEzCi0tLSAvZGV2L251bGwKKysrIGIvZXRuYXZpdi9ldG5hdml2X2NtZF9zdHJlYW0uYwpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IEV0bmF2aXYgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgQ2hyaXN0aWFuIEdtZWluZXIgPGNocmlzdGlhbi5nbWVpbmVyQGdtYWlsLmNvbT4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJldG5hdml2X2RybWlmLmgiCisjaW5jbHVkZSAiZXRuYXZpdl9wcml2LmgiCisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgaWR4X2xvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworCitzdGF0aWMgdm9pZCAqZ3Jvdyh2b2lkICpwdHIsIHVpbnQzMl90IG5yLCB1aW50MzJfdCAqbWF4LCB1aW50MzJfdCBzeikKK3sKKwlpZiAoKG5yICsgMSkgPiAqbWF4KSB7CisJCWlmICgoKm1heCAqIDIpIDwgKG5yICsgMSkpCisJCQkqbWF4ID0gbnIgKyA1OworCQllbHNlCisJCQkqbWF4ID0gKm1heCAqIDI7CisJCXB0ciA9IHJlYWxsb2MocHRyLCAqbWF4ICogc3opOworCX0KKworCXJldHVybiBwdHI7Cit9CisKKyNkZWZpbmUgQVBQRU5EKHgsIG5hbWUpICh7IFwKKwkoeCktPm5hbWUgPSBncm93KCh4KS0+bmFtZSwgKHgpLT5ucl8gIyMgbmFtZSwgJih4KS0+bWF4XyAjIyBuYW1lLCBzaXplb2YoKHgpLT5uYW1lWzBdKSk7IFwKKwkoeCktPm5yXyAjIyBuYW1lICsrOyBcCit9KQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBldG5hX2NtZF9zdHJlYW1fcHJpdiAqCitldG5hX2NtZF9zdHJlYW1fcHJpdihzdHJ1Y3QgZXRuYV9jbWRfc3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIChzdHJ1Y3QgZXRuYV9jbWRfc3RyZWFtX3ByaXYgKilzdHJlYW07Cit9CisKK3N0cnVjdCBldG5hX2NtZF9zdHJlYW0gKmV0bmFfY21kX3N0cmVhbV9uZXcoc3RydWN0IGV0bmFfcGlwZSAqcGlwZSwgdWludDMyX3Qgc2l6ZSwKKwkJdm9pZCAoKnJlc2V0X25vdGlmeSkoc3RydWN0IGV0bmFfY21kX3N0cmVhbSAqc3RyZWFtLCB2b2lkICpwcml2KSwKKwkJdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgZXRuYV9jbWRfc3RyZWFtX3ByaXYgKnN0cmVhbSA9IE5VTEw7CisKKwlpZiAoc2l6ZSA9PSAwKSB7CisJCUVSUk9SX01TRygiaW52YWxpZCBzaXplIG9mIDAiKTsKKwkJZ290byBmYWlsOworCX0KKworCXN0cmVhbSA9IGNhbGxvYygxLCBzaXplb2YoKnN0cmVhbSkpOworCWlmICghc3RyZWFtKSB7CisJCUVSUk9SX01TRygiYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIGFsbG9jYXRlIGV2ZW4gbnVtYmVyIG9mIDMyLWJpdCB3b3JkcyAqLworCXNpemUgPSBBTElHTihzaXplLCAyKTsKKworCXN0cmVhbS0+YmFzZS5idWZmZXIgPSBtYWxsb2Moc2l6ZSAqIHNpemVvZih1aW50MzJfdCkpOworCWlmICghc3RyZWFtLT5iYXNlLmJ1ZmZlcikgeworCQlFUlJPUl9NU0coImFsbG9jYXRpb24gZmFpbGVkIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlzdHJlYW0tPmJhc2Uuc2l6ZSA9IHNpemU7CisJc3RyZWFtLT5waXBlID0gcGlwZTsKKwlzdHJlYW0tPnJlc2V0X25vdGlmeSA9IHJlc2V0X25vdGlmeTsKKwlzdHJlYW0tPnJlc2V0X25vdGlmeV9wcml2ID0gcHJpdjsKKworCXJldHVybiAmc3RyZWFtLT5iYXNlOworCitmYWlsOgorCWlmIChzdHJlYW0pCisJCWV0bmFfY21kX3N0cmVhbV9kZWwoJnN0cmVhbS0+YmFzZSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBldG5hX2NtZF9zdHJlYW1fZGVsKHN0cnVjdCBldG5hX2NtZF9zdHJlYW0gKnN0cmVhbSkKK3sKKwlzdHJ1Y3QgZXRuYV9jbWRfc3RyZWFtX3ByaXYgKnByaXYgPSBldG5hX2NtZF9zdHJlYW1fcHJpdihzdHJlYW0pOworCisJZnJlZShzdHJlYW0tPmJ1ZmZlcik7CisJZnJlZShwcml2LT5zdWJtaXQucmVsb2NzKTsKKwlmcmVlKHByaXYpOworfQorCitzdGF0aWMgdm9pZCByZXNldF9idWZmZXIoc3RydWN0IGV0bmFfY21kX3N0cmVhbSAqc3RyZWFtKQoreworCXN0cnVjdCBldG5hX2NtZF9zdHJlYW1fcHJpdiAqcHJpdiA9IGV0bmFfY21kX3N0cmVhbV9wcml2KHN0cmVhbSk7CisKKwlzdHJlYW0tPm9mZnNldCA9IDA7CisJcHJpdi0+c3VibWl0Lm5yX2JvcyA9IDA7CisJcHJpdi0+c3VibWl0Lm5yX3JlbG9jcyA9IDA7CisJcHJpdi0+bnJfYm9zID0gMDsKKworCWlmIChwcml2LT5yZXNldF9ub3RpZnkpCisJCXByaXYtPnJlc2V0X25vdGlmeShzdHJlYW0sIHByaXYtPnJlc2V0X25vdGlmeV9wcml2KTsKK30KKwordWludDMyX3QgZXRuYV9jbWRfc3RyZWFtX3RpbWVzdGFtcChzdHJ1Y3QgZXRuYV9jbWRfc3RyZWFtICpzdHJlYW0pCit7CisJcmV0dXJuIGV0bmFfY21kX3N0cmVhbV9wcml2KHN0cmVhbSktPmxhc3RfdGltZXN0YW1wOworfQorCitzdGF0aWMgdWludDMyX3QgYXBwZW5kX2JvKHN0cnVjdCBldG5hX2NtZF9zdHJlYW0gKnN0cmVhbSwgc3RydWN0IGV0bmFfYm8gKmJvKQoreworCXN0cnVjdCBldG5hX2NtZF9zdHJlYW1fcHJpdiAqcHJpdiA9IGV0bmFfY21kX3N0cmVhbV9wcml2KHN0cmVhbSk7CisJdWludDMyX3QgaWR4OworCisJaWR4ID0gQVBQRU5EKCZwcml2LT5zdWJtaXQsIGJvcyk7CisJaWR4ID0gQVBQRU5EKHByaXYsIGJvcyk7CisKKwlwcml2LT5zdWJtaXQuYm9zW2lkeF0uZmxhZ3MgPSAwOworCXByaXYtPnN1Ym1pdC5ib3NbaWR4XS5oYW5kbGUgPSBiby0+aGFuZGxlOworCisJcHJpdi0+Ym9zW2lkeF0gPSBldG5hX2JvX3JlZihibyk7CisKKwlyZXR1cm4gaWR4OworfQorCisvKiBhZGQgKGlmIG5lZWRlZCkgYm8sIHJldHVybiBpZHg6ICovCitzdGF0aWMgdWludDMyX3QgYm8yaWR4KHN0cnVjdCBldG5hX2NtZF9zdHJlYW0gKnN0cmVhbSwgc3RydWN0IGV0bmFfYm8gKmJvLAorCQl1aW50MzJfdCBmbGFncykKK3sKKwlzdHJ1Y3QgZXRuYV9jbWRfc3RyZWFtX3ByaXYgKnByaXYgPSBldG5hX2NtZF9zdHJlYW1fcHJpdihzdHJlYW0pOworCXVpbnQzMl90IGlkeDsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmaWR4X2xvY2spOworCisJaWYgKCFiby0+Y3VycmVudF9zdHJlYW0pIHsKKwkJaWR4ID0gYXBwZW5kX2JvKHN0cmVhbSwgYm8pOworCQliby0+Y3VycmVudF9zdHJlYW0gPSBzdHJlYW07CisJCWJvLT5pZHggPSBpZHg7CisJfSBlbHNlIGlmIChiby0+Y3VycmVudF9zdHJlYW0gPT0gc3RyZWFtKSB7CisJCWlkeCA9IGJvLT5pZHg7CisJfSBlbHNlIHsKKwkJLyogc2xvdy1wYXRoOiAqLworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IHByaXYtPm5yX2JvczsgaWR4KyspCisJCQlpZiAocHJpdi0+Ym9zW2lkeF0gPT0gYm8pCisJCQkJYnJlYWs7CisJCWlmIChpZHggPT0gcHJpdi0+bnJfYm9zKSB7CisJCQkvKiBub3QgZm91bmQgKi8KKwkJCWlkeCA9IGFwcGVuZF9ibyhzdHJlYW0sIGJvKTsKKwkJfQorCX0KKwlwdGhyZWFkX211dGV4X3VubG9jaygmaWR4X2xvY2spOworCisJaWYgKGZsYWdzICYgRVROQV9SRUxPQ19SRUFEKQorCQlwcml2LT5zdWJtaXQuYm9zW2lkeF0uZmxhZ3MgfD0gRVROQV9TVUJNSVRfQk9fUkVBRDsKKwlpZiAoZmxhZ3MgJiBFVE5BX1JFTE9DX1dSSVRFKQorCQlwcml2LT5zdWJtaXQuYm9zW2lkeF0uZmxhZ3MgfD0gRVROQV9TVUJNSVRfQk9fV1JJVEU7CisKKwlyZXR1cm4gaWR4OworfQorCitzdGF0aWMgdm9pZCBmbHVzaChzdHJ1Y3QgZXRuYV9jbWRfc3RyZWFtICpzdHJlYW0sIGludCBpbl9mZW5jZV9mZCwKKwkJICBpbnQgKm91dF9mZW5jZV9mZCkKK3sKKwlzdHJ1Y3QgZXRuYV9jbWRfc3RyZWFtX3ByaXYgKnByaXYgPSBldG5hX2NtZF9zdHJlYW1fcHJpdihzdHJlYW0pOworCWludCByZXQsIGlkID0gcHJpdi0+cGlwZS0+aWQ7CisJc3RydWN0IGV0bmFfZ3B1ICpncHUgPSBwcml2LT5waXBlLT5ncHU7CisKKwlzdHJ1Y3QgZHJtX2V0bmF2aXZfZ2VtX3N1Ym1pdCByZXEgPSB7CisJCS5waXBlID0gZ3B1LT5jb3JlLAorCQkuZXhlY19zdGF0ZSA9IGlkLAorCQkuYm9zID0gVk9JRDJVNjQocHJpdi0+c3VibWl0LmJvcyksCisJCS5ucl9ib3MgPSBwcml2LT5zdWJtaXQubnJfYm9zLAorCQkucmVsb2NzID0gVk9JRDJVNjQocHJpdi0+c3VibWl0LnJlbG9jcyksCisJCS5ucl9yZWxvY3MgPSBwcml2LT5zdWJtaXQubnJfcmVsb2NzLAorCQkuc3RyZWFtID0gVk9JRDJVNjQoc3RyZWFtLT5idWZmZXIpLAorCQkuc3RyZWFtX3NpemUgPSBzdHJlYW0tPm9mZnNldCAqIDQsIC8qIGluIGJ5dGVzICovCisJfTsKKworCWlmIChpbl9mZW5jZV9mZCAhPSAtMSkgeworCQlyZXEuZmxhZ3MgfD0gRVROQV9TVUJNSVRfRkVOQ0VfRkRfSU4gfCBFVE5BX1NVQk1JVF9OT19JTVBMSUNJVDsKKwkJcmVxLmZlbmNlX2ZkID0gaW5fZmVuY2VfZmQ7CisJfQorCisJaWYgKG91dF9mZW5jZV9mZCkKKwkJcmVxLmZsYWdzIHw9IEVUTkFfU1VCTUlUX0ZFTkNFX0ZEX09VVDsKKworCXJldCA9IGRybUNvbW1hbmRXcml0ZVJlYWQoZ3B1LT5kZXYtPmZkLCBEUk1fRVROQVZJVl9HRU1fU1VCTUlULAorCQkJJnJlcSwgc2l6ZW9mKHJlcSkpOworCisJaWYgKHJldCkKKwkJRVJST1JfTVNHKCJzdWJtaXQgZmFpbGVkOiAlZCAoJXMpIiwgcmV0LCBzdHJlcnJvcihlcnJubykpOworCWVsc2UKKwkJcHJpdi0+bGFzdF90aW1lc3RhbXAgPSByZXEuZmVuY2U7CisKKwlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcHJpdi0+bnJfYm9zOyBpKyspIHsKKwkJc3RydWN0IGV0bmFfYm8gKmJvID0gcHJpdi0+Ym9zW2ldOworCisJCWJvLT5jdXJyZW50X3N0cmVhbSA9IE5VTEw7CisJCWV0bmFfYm9fZGVsKGJvKTsKKwl9CisKKwlpZiAob3V0X2ZlbmNlX2ZkKQorCQkqb3V0X2ZlbmNlX2ZkID0gcmVxLmZlbmNlX2ZkOworfQorCit2b2lkIGV0bmFfY21kX3N0cmVhbV9mbHVzaChzdHJ1Y3QgZXRuYV9jbWRfc3RyZWFtICpzdHJlYW0pCit7CisJZmx1c2goc3RyZWFtLCAtMSwgTlVMTCk7CisJcmVzZXRfYnVmZmVyKHN0cmVhbSk7Cit9CisKK3ZvaWQgZXRuYV9jbWRfc3RyZWFtX2ZsdXNoMihzdHJ1Y3QgZXRuYV9jbWRfc3RyZWFtICpzdHJlYW0sIGludCBpbl9mZW5jZV9mZCwKKwkJCSAgICBpbnQgKm91dF9mZW5jZV9mZCkKK3sKKwlmbHVzaChzdHJlYW0sIGluX2ZlbmNlX2ZkLCBvdXRfZmVuY2VfZmQpOworCXJlc2V0X2J1ZmZlcihzdHJlYW0pOworfQorCit2b2lkIGV0bmFfY21kX3N0cmVhbV9maW5pc2goc3RydWN0IGV0bmFfY21kX3N0cmVhbSAqc3RyZWFtKQoreworCXN0cnVjdCBldG5hX2NtZF9zdHJlYW1fcHJpdiAqcHJpdiA9IGV0bmFfY21kX3N0cmVhbV9wcml2KHN0cmVhbSk7CisKKwlmbHVzaChzdHJlYW0sIC0xLCBOVUxMKTsKKwlldG5hX3BpcGVfd2FpdChwcml2LT5waXBlLCBwcml2LT5sYXN0X3RpbWVzdGFtcCwgNTAwMCk7CisJcmVzZXRfYnVmZmVyKHN0cmVhbSk7Cit9CisKK3ZvaWQgZXRuYV9jbWRfc3RyZWFtX3JlbG9jKHN0cnVjdCBldG5hX2NtZF9zdHJlYW0gKnN0cmVhbSwgY29uc3Qgc3RydWN0IGV0bmFfcmVsb2MgKnIpCit7CisJc3RydWN0IGV0bmFfY21kX3N0cmVhbV9wcml2ICpwcml2ID0gZXRuYV9jbWRfc3RyZWFtX3ByaXYoc3RyZWFtKTsKKwlzdHJ1Y3QgZHJtX2V0bmF2aXZfZ2VtX3N1Ym1pdF9yZWxvYyAqcmVsb2M7CisJdWludDMyX3QgaWR4ID0gQVBQRU5EKCZwcml2LT5zdWJtaXQsIHJlbG9jcyk7CisJdWludDMyX3QgYWRkciA9IDA7CisKKwlyZWxvYyA9ICZwcml2LT5zdWJtaXQucmVsb2NzW2lkeF07CisKKwlyZWxvYy0+cmVsb2NfaWR4ID0gYm8yaWR4KHN0cmVhbSwgci0+Ym8sIHItPmZsYWdzKTsKKwlyZWxvYy0+cmVsb2Nfb2Zmc2V0ID0gci0+b2Zmc2V0OworCXJlbG9jLT5zdWJtaXRfb2Zmc2V0ID0gc3RyZWFtLT5vZmZzZXQgKiA0OyAvKiBpbiBieXRlcyAqLworCXJlbG9jLT5mbGFncyA9IDA7CisKKwlldG5hX2NtZF9zdHJlYW1fZW1pdChzdHJlYW0sIGFkZHIpOworfQpkaWZmIC0tZ2l0IGEvZXRuYXZpdi9ldG5hdml2X2RldmljZS5jIGIvZXRuYXZpdi9ldG5hdml2X2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZTkyMDMKLS0tIC9kZXYvbnVsbAorKysgYi9ldG5hdml2L2V0bmF2aXZfZGV2aWNlLmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgRXRuYXZpdiBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBDaHJpc3RpYW4gR21laW5lciA8Y2hyaXN0aWFuLmdtZWluZXJAZ21haWwuY29tPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSA8eGY4NmRybS5oPgorI2luY2x1ZGUgPHhmODZhdG9taWMuaD4KKworI2luY2x1ZGUgImV0bmF2aXZfcHJpdi5oIgorI2luY2x1ZGUgImV0bmF2aXZfZHJtaWYuaCIKKworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCB0YWJsZV9sb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworc3RydWN0IGV0bmFfZGV2aWNlICpldG5hX2RldmljZV9uZXcoaW50IGZkKQoreworCXN0cnVjdCBldG5hX2RldmljZSAqZGV2ID0gY2FsbG9jKHNpemVvZigqZGV2KSwgMSk7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIE5VTEw7CisKKwlhdG9taWNfc2V0KCZkZXYtPnJlZmNudCwgMSk7CisJZGV2LT5mZCA9IGZkOworCWRldi0+aGFuZGxlX3RhYmxlID0gZHJtSGFzaENyZWF0ZSgpOworCWRldi0+bmFtZV90YWJsZSA9IGRybUhhc2hDcmVhdGUoKTsKKwlldG5hX2JvX2NhY2hlX2luaXQoJmRldi0+Ym9fY2FjaGUpOworCisJcmV0dXJuIGRldjsKK30KKworLyogbGlrZSBldG5hX2RldmljZV9uZXcoKSBidXQgY3JlYXRlcyBpdCdzIG93biBwcml2YXRlIGR1cCgpIG9mIHRoZSBmZAorICogd2hpY2ggaXMgY2xvc2UoKWQgd2hlbiB0aGUgZGV2aWNlIGlzIGZpbmFsaXplZC4gKi8KK3N0cnVjdCBldG5hX2RldmljZSAqZXRuYV9kZXZpY2VfbmV3X2R1cChpbnQgZmQpCit7CisJaW50IGR1cF9mZCA9IGR1cChmZCk7CisJc3RydWN0IGV0bmFfZGV2aWNlICpkZXYgPSBldG5hX2RldmljZV9uZXcoZHVwX2ZkKTsKKworCWlmIChkZXYpCisJCWRldi0+Y2xvc2VmZCA9IDE7CisJZWxzZQorCQljbG9zZShkdXBfZmQpOworCisJcmV0dXJuIGRldjsKK30KKworc3RydWN0IGV0bmFfZGV2aWNlICpldG5hX2RldmljZV9yZWYoc3RydWN0IGV0bmFfZGV2aWNlICpkZXYpCit7CisJYXRvbWljX2luYygmZGV2LT5yZWZjbnQpOworCisJcmV0dXJuIGRldjsKK30KKworc3RhdGljIHZvaWQgZXRuYV9kZXZpY2VfZGVsX2ltcGwoc3RydWN0IGV0bmFfZGV2aWNlICpkZXYpCit7CisJZXRuYV9ib19jYWNoZV9jbGVhbnVwKCZkZXYtPmJvX2NhY2hlLCAwKTsKKwlkcm1IYXNoRGVzdHJveShkZXYtPmhhbmRsZV90YWJsZSk7CisJZHJtSGFzaERlc3Ryb3koZGV2LT5uYW1lX3RhYmxlKTsKKworCWlmIChkZXYtPmNsb3NlZmQpCisJCWNsb3NlKGRldi0+ZmQpOworCisJZnJlZShkZXYpOworfQorCitkcm1fcHJpdmF0ZSB2b2lkIGV0bmFfZGV2aWNlX2RlbF9sb2NrZWQoc3RydWN0IGV0bmFfZGV2aWNlICpkZXYpCit7CisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXYtPnJlZmNudCkpCisJCXJldHVybjsKKworCWV0bmFfZGV2aWNlX2RlbF9pbXBsKGRldik7Cit9CisKK3ZvaWQgZXRuYV9kZXZpY2VfZGVsKHN0cnVjdCBldG5hX2RldmljZSAqZGV2KQoreworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmZGV2LT5yZWZjbnQpKQorCQlyZXR1cm47CisKKwlwdGhyZWFkX211dGV4X2xvY2soJnRhYmxlX2xvY2spOworCWV0bmFfZGV2aWNlX2RlbF9pbXBsKGRldik7CisJcHRocmVhZF9tdXRleF91bmxvY2soJnRhYmxlX2xvY2spOworfQorCitpbnQgZXRuYV9kZXZpY2VfZmQoc3RydWN0IGV0bmFfZGV2aWNlICpkZXYpCit7CisgICByZXR1cm4gZGV2LT5mZDsKK30KZGlmZiAtLWdpdCBhL2V0bmF2aXYvZXRuYXZpdl9kcm0uaCBiL2V0bmF2aXYvZXRuYXZpdl9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmY2Zjc4Ci0tLSAvZGV2L251bGwKKysrIGIvZXRuYXZpdi9ldG5hdml2X2RybS5oCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEV0bmF2aXYgUHJvamVjdAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX0VUTkFWSVZfRFJNX0hfXworI2RlZmluZSBfX0VUTkFWSVZfRFJNX0hfXworCisjaW5jbHVkZSAiZHJtLmgiCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogUGxlYXNlIG5vdGUgdGhhdCBtb2RpZmljYXRpb25zIHRvIGFsbCBzdHJ1Y3RzIGRlZmluZWQgaGVyZSBhcmUKKyAqIHN1YmplY3QgdG8gYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgY29uc3RyYWludHM6CisgKiAgMSkgRG8gbm90IHVzZSBwb2ludGVycywgdXNlIF9fdTY0IGluc3RlYWQgZm9yIDMyIGJpdCAvIDY0IGJpdAorICogICAgIHVzZXIva2VybmVsIGNvbXBhdGliaWxpdHkKKyAqICAyKSBLZWVwIGZpZWxkcyBhbGlnbmVkIHRvIHRoZWlyIHNpemUKKyAqICAzKSBCZWNhdXNlIG9mIGhvdyBkcm1faW9jdGwoKSB3b3Jrcywgd2UgY2FuIGFkZCBuZXcgZmllbGRzIGF0CisgKiAgICAgdGhlIGVuZCBvZiBhbiBpb2N0bCBpZiBzb21lIGNhcmUgaXMgdGFrZW46IGRybV9pb2N0bCgpIHdpbGwKKyAqICAgICB6ZXJvIG91dCB0aGUgbmV3IGZpZWxkcyBhdCB0aGUgdGFpbCBvZiB0aGUgaW9jdGwsIHNvIGEgemVybworICogICAgIHZhbHVlIHNob3VsZCBoYXZlIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgbWVhbmluZy4gIEFuZCBmb3IKKyAqICAgICBvdXRwdXQgcGFyYW1zLCB1c2Vyc3BhY2Ugd29uJ3Qgc2VlIHRoZSBuZXdseSBhZGRlZCBvdXRwdXQKKyAqICAgICBmaWVsZHMuLiBzbyB0aGF0IGhhcyB0byBiZSBzb21laG93IG9rLgorICovCisKKy8qIHRpbWVvdXRzIGFyZSBzcGVjaWZpZWQgaW4gY2xvY2stbW9ub3RvbmljIGFic29sdXRlIHRpbWVzICh0byBzaW1wbGlmeQorICogcmVzdGFydGluZyBpbnRlcnJ1cHRlZCBpb2N0bHMpLiAgVGhlIGZvbGxvd2luZyBzdHJ1Y3QgaXMgbG9naWNhbGx5IHRoZQorICogc2FtZSBhcyAnc3RydWN0IHRpbWVzcGVjJyBidXQgMzIvNjRiIEFCSSBzYWZlLgorICovCitzdHJ1Y3QgZHJtX2V0bmF2aXZfdGltZXNwZWMgeworCV9fczY0IHR2X3NlYzsgICAgICAgICAgLyogc2Vjb25kcyAqLworCV9fczY0IHR2X25zZWM7ICAgICAgICAgLyogbmFub3NlY29uZHMgKi8KK307CisKKyNkZWZpbmUgRVROQVZJVl9QQVJBTV9HUFVfTU9ERUwgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEVUTkFWSVZfUEFSQU1fR1BVX1JFVklTSU9OICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBFVE5BVklWX1BBUkFNX0dQVV9GRUFUVVJFU18wICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgRVROQVZJVl9QQVJBTV9HUFVfRkVBVFVSRVNfMSAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIEVUTkFWSVZfUEFSQU1fR1BVX0ZFQVRVUkVTXzIgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBFVE5BVklWX1BBUkFNX0dQVV9GRUFUVVJFU18zICAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgRVROQVZJVl9QQVJBTV9HUFVfRkVBVFVSRVNfNCAgICAgICAgICAgICAgICAweDA3CisjZGVmaW5lIEVUTkFWSVZfUEFSQU1fR1BVX0ZFQVRVUkVTXzUgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBFVE5BVklWX1BBUkFNX0dQVV9GRUFUVVJFU182ICAgICAgICAgICAgICAgIDB4MDkKKworI2RlZmluZSBFVE5BVklWX1BBUkFNX0dQVV9TVFJFQU1fQ09VTlQgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgRVROQVZJVl9QQVJBTV9HUFVfUkVHSVNURVJfTUFYICAgICAgICAgICAgICAweDExCisjZGVmaW5lIEVUTkFWSVZfUEFSQU1fR1BVX1RIUkVBRF9DT1VOVCAgICAgICAgICAgICAgMHgxMgorI2RlZmluZSBFVE5BVklWX1BBUkFNX0dQVV9WRVJURVhfQ0FDSEVfU0laRSAgICAgICAgIDB4MTMKKyNkZWZpbmUgRVROQVZJVl9QQVJBTV9HUFVfU0hBREVSX0NPUkVfQ09VTlQgICAgICAgICAweDE0CisjZGVmaW5lIEVUTkFWSVZfUEFSQU1fR1BVX1BJWEVMX1BJUEVTICAgICAgICAgICAgICAgMHgxNQorI2RlZmluZSBFVE5BVklWX1BBUkFNX0dQVV9WRVJURVhfT1VUUFVUX0JVRkZFUl9TSVpFIDB4MTYKKyNkZWZpbmUgRVROQVZJVl9QQVJBTV9HUFVfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAweDE3CisjZGVmaW5lIEVUTkFWSVZfUEFSQU1fR1BVX0lOU1RSVUNUSU9OX0NPVU5UICAgICAgICAgMHgxOAorI2RlZmluZSBFVE5BVklWX1BBUkFNX0dQVV9OVU1fQ09OU1RBTlRTICAgICAgICAgICAgIDB4MTkKKyNkZWZpbmUgRVROQVZJVl9QQVJBTV9HUFVfTlVNX1ZBUllJTkdTICAgICAgICAgICAgICAweDFhCisKKyNkZWZpbmUgRVROQV9NQVhfUElQRVMgNAorCitzdHJ1Y3QgZHJtX2V0bmF2aXZfcGFyYW0geworCV9fdTMyIHBpcGU7ICAgICAgICAgICAvKiBpbiAqLworCV9fdTMyIHBhcmFtOyAgICAgICAgICAvKiBpbiwgRVROQVZJVl9QQVJBTV94ICovCisJX191NjQgdmFsdWU7ICAgICAgICAgIC8qIG91dCAoZ2V0X3BhcmFtKSBvciBpbiAoc2V0X3BhcmFtKSAqLworfTsKKworLyoKKyAqIEdFTSBidWZmZXJzOgorICovCisKKyNkZWZpbmUgRVROQV9CT19DQUNIRV9NQVNLICAgMHgwMDBmMDAwMAorLyogY2FjaGUgbW9kZXMgKi8KKyNkZWZpbmUgRVROQV9CT19DQUNIRUQgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBFVE5BX0JPX1dDICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIEVUTkFfQk9fVU5DQUNIRUQgICAgIDB4MDAwNDAwMDAKKy8qIG1hcCBmbGFncyAqLworI2RlZmluZSBFVE5BX0JPX0ZPUkNFX01NVSAgICAweDAwMTAwMDAwCisKK3N0cnVjdCBkcm1fZXRuYXZpdl9nZW1fbmV3IHsKKwlfX3U2NCBzaXplOyAgICAgICAgICAgLyogaW4gKi8KKwlfX3UzMiBmbGFnczsgICAgICAgICAgLyogaW4sIG1hc2sgb2YgRVROQV9CT194ICovCisJX191MzIgaGFuZGxlOyAgICAgICAgIC8qIG91dCAqLworfTsKKworc3RydWN0IGRybV9ldG5hdml2X2dlbV9pbmZvIHsKKwlfX3UzMiBoYW5kbGU7ICAgICAgICAgLyogaW4gKi8KKwlfX3UzMiBwYWQ7CisJX191NjQgb2Zmc2V0OyAgICAgICAgIC8qIG91dCwgb2Zmc2V0IHRvIHBhc3MgdG8gbW1hcCgpICovCit9OworCisjZGVmaW5lIEVUTkFfUFJFUF9SRUFEICAgICAgICAweDAxCisjZGVmaW5lIEVUTkFfUFJFUF9XUklURSAgICAgICAweDAyCisjZGVmaW5lIEVUTkFfUFJFUF9OT1NZTkMgICAgICAweDA0CisKK3N0cnVjdCBkcm1fZXRuYXZpdl9nZW1fY3B1X3ByZXAgeworCV9fdTMyIGhhbmRsZTsgICAgICAgICAvKiBpbiAqLworCV9fdTMyIG9wOyAgICAgICAgICAgICAvKiBpbiwgbWFzayBvZiBFVE5BX1BSRVBfeCAqLworCXN0cnVjdCBkcm1fZXRuYXZpdl90aW1lc3BlYyB0aW1lb3V0OyAgIC8qIGluICovCit9OworCitzdHJ1Y3QgZHJtX2V0bmF2aXZfZ2VtX2NwdV9maW5pIHsKKwlfX3UzMiBoYW5kbGU7ICAgICAgICAgLyogaW4gKi8KKwlfX3UzMiBmbGFnczsgICAgICAgICAgLyogaW4sIHBsYWNlaG9sZGVyIGZvciBub3csIG5vIGRlZmluZWQgdmFsdWVzICovCit9OworCisvKgorICogQ21kc3RyZWFtIFN1Ym1pc3Npb246CisgKi8KKworLyogVGhlIHZhbHVlIHdyaXR0ZW4gaW50byB0aGUgY21kc3RyZWFtIGlzIGxvZ2ljYWxseToKKyAqIHJlbG9jYnVmLT5ncHVhZGRyICsgcmVsb2Nfb2Zmc2V0CisgKgorICogTk9URSB0aGF0IHJlbG9jJ3MgbXVzdCBiZSBzb3J0ZWQgYnkgb3JkZXIgb2YgaW5jcmVhc2luZyBzdWJtaXRfb2Zmc2V0LAorICogb3RoZXJ3aXNlIEVJTlZBTC4KKyAqLworc3RydWN0IGRybV9ldG5hdml2X2dlbV9zdWJtaXRfcmVsb2MgeworCV9fdTMyIHN1Ym1pdF9vZmZzZXQ7ICAvKiBpbiwgb2Zmc2V0IGZyb20gc3VibWl0X2JvICovCisJX191MzIgcmVsb2NfaWR4OyAgICAgIC8qIGluLCBpbmRleCBvZiByZWxvY19ibyBidWZmZXIgKi8KKwlfX3U2NCByZWxvY19vZmZzZXQ7ICAgLyogaW4sIG9mZnNldCBmcm9tIHN0YXJ0IG9mIHJlbG9jX2JvICovCisJX191MzIgZmxhZ3M7ICAgICAgICAgIC8qIGluLCBwbGFjZWhvbGRlciBmb3Igbm93LCBubyBkZWZpbmVkIHZhbHVlcyAqLworfTsKKworLyogRWFjaCBidWZmZXIgcmVmZXJlbmNlZCBlbHNld2hlcmUgaW4gdGhlIGNtZHN0cmVhbSBzdWJtaXQgKGllLiB0aGUKKyAqIGNtZHN0cmVhbSBidWZmZXIocykgdGhlbXNlbHZlcyBvciByZWxvYyBlbnRyaWVzKSBoYXMgb25lIChhbmQgb25seQorICogb25lKSBlbnRyeSBpbiB0aGUgc3VibWl0LT5ib3NbXSB0YWJsZS4KKyAqCisgKiBBcyBhIG9wdGltaXphdGlvbiwgdGhlIGN1cnJlbnQgYnVmZmVyIChncHUgdmlydHVhbCBhZGRyZXNzKSBjYW4gYmUKKyAqIHBhc3NlZCBiYWNrIHRocm91Z2ggdGhlICdwcmVzdW1lZCcgZmllbGQuICBJZiBvbiBhIHN1YnNlcXVlbnQgcmVsb2MsCisgKiB1c2Vyc3BhY2UgcGFzc2VzIGJhY2sgYSAncHJlc3VtZWQnIGFkZHJlc3MgdGhhdCBpcyBzdGlsbCB2YWxpZCwKKyAqIHRoZW4gcGF0Y2hpbmcgdGhlIGNtZHN0cmVhbSBmb3IgdGhpcyBlbnRyeSBpcyBza2lwcGVkLiAgVGhpcyBjYW4KKyAqIGF2b2lkIGtlcm5lbCBuZWVkaW5nIHRvIG1hcC9hY2Nlc3MgdGhlIGNtZHN0cmVhbSBibyBpbiB0aGUgY29tbW9uCisgKiBjYXNlLgorICovCisjZGVmaW5lIEVUTkFfU1VCTUlUX0JPX1JFQUQgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEVUTkFfU1VCTUlUX0JPX1dSSVRFICAgICAgICAgICAgMHgwMDAyCitzdHJ1Y3QgZHJtX2V0bmF2aXZfZ2VtX3N1Ym1pdF9ibyB7CisJX191MzIgZmxhZ3M7ICAgICAgICAgIC8qIGluLCBtYXNrIG9mIEVUTkFfU1VCTUlUX0JPX3ggKi8KKwlfX3UzMiBoYW5kbGU7ICAgICAgICAgLyogaW4sIEdFTSBoYW5kbGUgKi8KKwlfX3U2NCBwcmVzdW1lZDsgICAgICAgLyogaW4vb3V0LCBwcmVzdW1lZCBidWZmZXIgYWRkcmVzcyAqLworfTsKKworLyogRWFjaCBjbWRzdHJlYW0gc3VibWl0IGNvbnNpc3RzIG9mIGEgdGFibGUgb2YgYnVmZmVycyBpbnZvbHZlZCwgYW5kCisgKiBvbmUgb3IgbW9yZSBjbWRzdHJlYW0gYnVmZmVycy4gIFRoaXMgYWxsb3dzIGZvciBjb25kaXRpb25hbCBleGVjdXRpb24KKyAqIChjb250ZXh0LXJlc3RvcmUpLCBhbmQgSUIgYnVmZmVycyBuZWVkZWQgZm9yIHBlciB0aWxlL2JpbiBkcmF3IGNtZHMuCisgKi8KKyNkZWZpbmUgRVROQV9TVUJNSVRfTk9fSU1QTElDSVQgICAgICAgICAweDAwMDEKKyNkZWZpbmUgRVROQV9TVUJNSVRfRkVOQ0VfRkRfSU4gICAgICAgICAweDAwMDIKKyNkZWZpbmUgRVROQV9TVUJNSVRfRkVOQ0VfRkRfT1VUICAgICAgICAweDAwMDQKKyNkZWZpbmUgRVROQV9TVUJNSVRfRkxBR1MJCShFVE5BX1NVQk1JVF9OT19JTVBMSUNJVCB8IFwKKwkJCQkJIEVUTkFfU1VCTUlUX0ZFTkNFX0ZEX0lOIHwgXAorCQkJCQkgRVROQV9TVUJNSVRfRkVOQ0VfRkRfT1VUKQorI2RlZmluZSBFVE5BX1BJUEVfM0QgICAgICAweDAwCisjZGVmaW5lIEVUTkFfUElQRV8yRCAgICAgIDB4MDEKKyNkZWZpbmUgRVROQV9QSVBFX1ZHICAgICAgMHgwMgorc3RydWN0IGRybV9ldG5hdml2X2dlbV9zdWJtaXQgeworCV9fdTMyIGZlbmNlOyAgICAgICAgICAvKiBvdXQgKi8KKwlfX3UzMiBwaXBlOyAgICAgICAgICAgLyogaW4gKi8KKwlfX3UzMiBleGVjX3N0YXRlOyAgICAgLyogaW4sIGluaXRpYWwgZXhlY3V0aW9uIHN0YXRlIChFVE5BX1BJUEVfeCkgKi8KKwlfX3UzMiBucl9ib3M7ICAgICAgICAgLyogaW4sIG51bWJlciBvZiBzdWJtaXRfYm8ncyAqLworCV9fdTMyIG5yX3JlbG9jczsgICAgICAvKiBpbiwgbnVtYmVyIG9mIHN1Ym1pdF9yZWxvYydzICovCisJX191MzIgc3RyZWFtX3NpemU7ICAgIC8qIGluLCBjbWRzdHJlYW0gc2l6ZSAqLworCV9fdTY0IGJvczsgICAgICAgICAgICAvKiBpbiwgcHRyIHRvIGFycmF5IG9mIHN1Ym1pdF9ibydzICovCisJX191NjQgcmVsb2NzOyAgICAgICAgIC8qIGluLCBwdHIgdG8gYXJyYXkgb2Ygc3VibWl0X3JlbG9jJ3MgKi8KKwlfX3U2NCBzdHJlYW07ICAgICAgICAgLyogaW4sIHB0ciB0byBjbWRzdHJlYW0gKi8KKwlfX3UzMiBmbGFnczsgICAgICAgICAgLyogaW4sIG1hc2sgb2YgRVROQV9TVUJNSVRfeCAqLworCV9fczMyIGZlbmNlX2ZkOyAgICAgICAvKiBpbi9vdXQsIGZlbmNlIGZkIChzZWUgRVROQV9TVUJNSVRfRkVOQ0VfRkRfeCkgKi8KK307CisKKy8qIFRoZSBub3JtYWwgd2F5IHRvIHN5bmNocm9uaXplIHdpdGggdGhlIEdQVSBpcyBqdXN0IHRvIENQVV9QUkVQIG9uCisgKiBhIGJ1ZmZlciBpZiB5b3UgbmVlZCB0byBhY2Nlc3MgaXQgZnJvbSB0aGUgQ1BVIChvdGhlciBjbWRzdHJlYW0KKyAqIHN1Ym1pc3Npb24gZnJvbSBzYW1lIG9yIG90aGVyIGNvbnRleHRzLCBQQUdFX0ZMSVAgaW9jdGwsIGV0YywgYWxsCisgKiBoYW5kbGUgdGhlIHJlcXVpcmVkIHN5bmNocm9uaXphdGlvbiB1bmRlciB0aGUgaG9vZCkuICBUaGlzIGlvY3RsCisgKiBtYWlubHkganVzdCBleGlzdHMgYXMgYSB3YXkgdG8gaW1wbGVtZW50IHRoZSBnYWxsaXVtIHBpcGVfZmVuY2UKKyAqIEFQSXMgd2l0aG91dCByZXF1aXJpbmcgYSBkdW1teSBibyB0byBzeW5jaHJvbml6ZSBvbi4KKyAqLworI2RlZmluZSBFVE5BX1dBSVRfTk9OQkxPQ0sgICAgICAweDAxCitzdHJ1Y3QgZHJtX2V0bmF2aXZfd2FpdF9mZW5jZSB7CisJX191MzIgcGlwZTsgICAgICAgICAgIC8qIGluICovCisJX191MzIgZmVuY2U7ICAgICAgICAgIC8qIGluICovCisJX191MzIgZmxhZ3M7ICAgICAgICAgIC8qIGluLCBtYXNrIG9mIEVUTkFfV0FJVF94ICovCisJX191MzIgcGFkOworCXN0cnVjdCBkcm1fZXRuYXZpdl90aW1lc3BlYyB0aW1lb3V0OyAgIC8qIGluICovCit9OworCisjZGVmaW5lIEVUTkFfVVNFUlBUUl9SRUFECTB4MDEKKyNkZWZpbmUgRVROQV9VU0VSUFRSX1dSSVRFCTB4MDIKK3N0cnVjdCBkcm1fZXRuYXZpdl9nZW1fdXNlcnB0ciB7CisJX191NjQgdXNlcl9wdHI7CS8qIGluLCBwYWdlIGFsaWduZWQgdXNlciBwb2ludGVyICovCisJX191NjQgdXNlcl9zaXplOwkvKiBpbiwgcGFnZSBhbGlnbmVkIHVzZXIgc2l6ZSAqLworCV9fdTMyIGZsYWdzOwkJLyogaW4sIGZsYWdzICovCisJX191MzIgaGFuZGxlOwkvKiBvdXQsIG5vbi16ZXJvIGhhbmRsZSAqLworfTsKKworc3RydWN0IGRybV9ldG5hdml2X2dlbV93YWl0IHsKKwlfX3UzMiBwaXBlOwkJCQkvKiBpbiAqLworCV9fdTMyIGhhbmRsZTsJCQkJLyogaW4sIGJvIHRvIGJlIHdhaXRlZCBmb3IgKi8KKwlfX3UzMiBmbGFnczsJCQkJLyogaW4sIG1hc2sgb2YgRVROQV9XQUlUX3ggICovCisJX191MzIgcGFkOworCXN0cnVjdCBkcm1fZXRuYXZpdl90aW1lc3BlYyB0aW1lb3V0OwkvKiBpbiAqLworfTsKKworI2RlZmluZSBEUk1fRVROQVZJVl9HRVRfUEFSQU0gICAgICAgICAgMHgwMAorLyogcGxhY2Vob2xkZXI6CisjZGVmaW5lIERSTV9FVE5BVklWX1NFVF9QQVJBTSAgICAgICAgICAweDAxCisgKi8KKyNkZWZpbmUgRFJNX0VUTkFWSVZfR0VNX05FVyAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgRFJNX0VUTkFWSVZfR0VNX0lORk8gICAgICAgICAgIDB4MDMKKyNkZWZpbmUgRFJNX0VUTkFWSVZfR0VNX0NQVV9QUkVQICAgICAgIDB4MDQKKyNkZWZpbmUgRFJNX0VUTkFWSVZfR0VNX0NQVV9GSU5JICAgICAgIDB4MDUKKyNkZWZpbmUgRFJNX0VUTkFWSVZfR0VNX1NVQk1JVCAgICAgICAgIDB4MDYKKyNkZWZpbmUgRFJNX0VUTkFWSVZfV0FJVF9GRU5DRSAgICAgICAgIDB4MDcKKyNkZWZpbmUgRFJNX0VUTkFWSVZfR0VNX1VTRVJQVFIgICAgICAgIDB4MDgKKyNkZWZpbmUgRFJNX0VUTkFWSVZfR0VNX1dBSVQgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgRFJNX0VUTkFWSVZfTlVNX0lPQ1RMUyAgICAgICAgIDB4MGEKKworI2RlZmluZSBEUk1fSU9DVExfRVROQVZJVl9HRVRfUEFSQU0gICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9FVE5BVklWX0dFVF9QQVJBTSwgc3RydWN0IGRybV9ldG5hdml2X3BhcmFtKQorI2RlZmluZSBEUk1fSU9DVExfRVROQVZJVl9HRU1fTkVXICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9FVE5BVklWX0dFTV9ORVcsIHN0cnVjdCBkcm1fZXRuYXZpdl9nZW1fbmV3KQorI2RlZmluZSBEUk1fSU9DVExfRVROQVZJVl9HRU1fSU5GTyAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9FVE5BVklWX0dFTV9JTkZPLCBzdHJ1Y3QgZHJtX2V0bmF2aXZfZ2VtX2luZm8pCisjZGVmaW5lIERSTV9JT0NUTF9FVE5BVklWX0dFTV9DUFVfUFJFUCBEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fRVROQVZJVl9HRU1fQ1BVX1BSRVAsIHN0cnVjdCBkcm1fZXRuYXZpdl9nZW1fY3B1X3ByZXApCisjZGVmaW5lIERSTV9JT0NUTF9FVE5BVklWX0dFTV9DUFVfRklOSSBEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fRVROQVZJVl9HRU1fQ1BVX0ZJTkksIHN0cnVjdCBkcm1fZXRuYXZpdl9nZW1fY3B1X2ZpbmkpCisjZGVmaW5lIERSTV9JT0NUTF9FVE5BVklWX0dFTV9TVUJNSVQgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0VUTkFWSVZfR0VNX1NVQk1JVCwgc3RydWN0IGRybV9ldG5hdml2X2dlbV9zdWJtaXQpCisjZGVmaW5lIERSTV9JT0NUTF9FVE5BVklWX1dBSVRfRkVOQ0UgICBEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fRVROQVZJVl9XQUlUX0ZFTkNFLCBzdHJ1Y3QgZHJtX2V0bmF2aXZfd2FpdF9mZW5jZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0VUTkFWSVZfR0VNX1VTRVJQVFIgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fRVROQVZJVl9HRU1fVVNFUlBUUiwgc3RydWN0IGRybV9ldG5hdml2X2dlbV91c2VycHRyKQorI2RlZmluZSBEUk1fSU9DVExfRVROQVZJVl9HRU1fV0FJVCAgICAgRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX0VUTkFWSVZfR0VNX1dBSVQsIHN0cnVjdCBkcm1fZXRuYXZpdl9nZW1fd2FpdCkKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fRVROQVZJVl9EUk1fSF9fICovCmRpZmYgLS1naXQgYS9ldG5hdml2L2V0bmF2aXZfZHJtaWYuaCBiL2V0bmF2aXYvZXRuYXZpdl9kcm1pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NzA0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9ldG5hdml2L2V0bmF2aXZfZHJtaWYuaApAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IEV0bmF2aXYgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgQ2hyaXN0aWFuIEdtZWluZXIgPGNocmlzdGlhbi5nbWVpbmVyQGdtYWlsLmNvbT4KKyAqLworCisjaWZuZGVmIEVUTkFWSVZfRFJNSUZfSF8KKyNkZWZpbmUgRVROQVZJVl9EUk1JRl9IXworCisjaW5jbHVkZSA8eGY4NmRybS5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCitzdHJ1Y3QgZXRuYV9ibzsKK3N0cnVjdCBldG5hX3BpcGU7CitzdHJ1Y3QgZXRuYV9ncHU7CitzdHJ1Y3QgZXRuYV9kZXZpY2U7CitzdHJ1Y3QgZXRuYV9jbWRfc3RyZWFtOworCitlbnVtIGV0bmFfcGlwZV9pZCB7CisJRVROQV9QSVBFXzNEID0gMCwKKwlFVE5BX1BJUEVfMkQgPSAxLAorCUVUTkFfUElQRV9WRyA9IDIsCisJRVROQV9QSVBFX01BWAorfTsKKworZW51bSBldG5hX3BhcmFtX2lkIHsKKwlFVE5BX0dQVV9NT0RFTCAgICAgICAgICAgICAgICAgICAgID0gMHgxLAorCUVUTkFfR1BVX1JFVklTSU9OICAgICAgICAgICAgICAgICAgPSAweDIsCisJRVROQV9HUFVfRkVBVFVSRVNfMCAgICAgICAgICAgICAgICA9IDB4MywKKwlFVE5BX0dQVV9GRUFUVVJFU18xICAgICAgICAgICAgICAgID0gMHg0LAorCUVUTkFfR1BVX0ZFQVRVUkVTXzIgICAgICAgICAgICAgICAgPSAweDUsCisJRVROQV9HUFVfRkVBVFVSRVNfMyAgICAgICAgICAgICAgICA9IDB4NiwKKwlFVE5BX0dQVV9GRUFUVVJFU180ICAgICAgICAgICAgICAgID0gMHg3LAorCUVUTkFfR1BVX0ZFQVRVUkVTXzUgICAgICAgICAgICAgICAgPSAweDgsCisJRVROQV9HUFVfRkVBVFVSRVNfNiAgICAgICAgICAgICAgICA9IDB4OSwKKworCUVUTkFfR1BVX1NUUkVBTV9DT1VOVCAgICAgICAgICAgICAgPSAweDEwLAorCUVUTkFfR1BVX1JFR0lTVEVSX01BWCAgICAgICAgICAgICAgPSAweDExLAorCUVUTkFfR1BVX1RIUkVBRF9DT1VOVCAgICAgICAgICAgICAgPSAweDEyLAorCUVUTkFfR1BVX1ZFUlRFWF9DQUNIRV9TSVpFICAgICAgICAgPSAweDEzLAorCUVUTkFfR1BVX1NIQURFUl9DT1JFX0NPVU5UICAgICAgICAgPSAweDE0LAorCUVUTkFfR1BVX1BJWEVMX1BJUEVTICAgICAgICAgICAgICAgPSAweDE1LAorCUVUTkFfR1BVX1ZFUlRFWF9PVVRQVVRfQlVGRkVSX1NJWkUgPSAweDE2LAorCUVUTkFfR1BVX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgPSAweDE3LAorCUVUTkFfR1BVX0lOU1RSVUNUSU9OX0NPVU5UICAgICAgICAgPSAweDE4LAorCUVUTkFfR1BVX05VTV9DT05TVEFOVFMgICAgICAgICAgICAgPSAweDE5LAorCUVUTkFfR1BVX05VTV9WQVJZSU5HUyAgICAgICAgICAgICAgPSAweDFhCit9OworCisvKiBibyBmbGFnczogKi8KKyNkZWZpbmUgRFJNX0VUTkFfR0VNX0NBQ0hFX0NBQ0hFRCAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIERSTV9FVE5BX0dFTV9DQUNIRV9XQyAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBEUk1fRVROQV9HRU1fQ0FDSEVfVU5DQUNIRUQgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgRFJNX0VUTkFfR0VNX0NBQ0hFX01BU0sgICAgICAgICAweDAwMGYwMDAwCisvKiBtYXAgZmxhZ3MgKi8KKyNkZWZpbmUgRFJNX0VUTkFfR0VNX0ZPUkNFX01NVSAgICAgICAgICAweDAwMTAwMDAwCisKKy8qIGJvIGFjY2VzcyBmbGFnczogKGtlZXAgYWxpZ25lZCB0byBFVE5BX1BSRVBfeCkgKi8KKyNkZWZpbmUgRFJNX0VUTkFfUFJFUF9SRUFEICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIERSTV9FVE5BX1BSRVBfV1JJVEUgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBEUk1fRVROQV9QUkVQX05PU1lOQyAgICAgICAgICAgIDB4MDQKKworLyogZGV2aWNlIGZ1bmN0aW9uczoKKyAqLworCitzdHJ1Y3QgZXRuYV9kZXZpY2UgKmV0bmFfZGV2aWNlX25ldyhpbnQgZmQpOworc3RydWN0IGV0bmFfZGV2aWNlICpldG5hX2RldmljZV9uZXdfZHVwKGludCBmZCk7CitzdHJ1Y3QgZXRuYV9kZXZpY2UgKmV0bmFfZGV2aWNlX3JlZihzdHJ1Y3QgZXRuYV9kZXZpY2UgKmRldik7Cit2b2lkIGV0bmFfZGV2aWNlX2RlbChzdHJ1Y3QgZXRuYV9kZXZpY2UgKmRldik7CitpbnQgZXRuYV9kZXZpY2VfZmQoc3RydWN0IGV0bmFfZGV2aWNlICpkZXYpOworCisvKiBncHUgZnVuY3Rpb25zOgorICovCisKK3N0cnVjdCBldG5hX2dwdSAqZXRuYV9ncHVfbmV3KHN0cnVjdCBldG5hX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY29yZSk7Cit2b2lkIGV0bmFfZ3B1X2RlbChzdHJ1Y3QgZXRuYV9ncHUgKmdwdSk7CitpbnQgZXRuYV9ncHVfZ2V0X3BhcmFtKHN0cnVjdCBldG5hX2dwdSAqZ3B1LCBlbnVtIGV0bmFfcGFyYW1faWQgcGFyYW0sCisJCXVpbnQ2NF90ICp2YWx1ZSk7CisKKworLyogcGlwZSBmdW5jdGlvbnM6CisgKi8KKworc3RydWN0IGV0bmFfcGlwZSAqZXRuYV9waXBlX25ldyhzdHJ1Y3QgZXRuYV9ncHUgKmdwdSwgZW51bSBldG5hX3BpcGVfaWQgaWQpOwordm9pZCBldG5hX3BpcGVfZGVsKHN0cnVjdCBldG5hX3BpcGUgKnBpcGUpOworaW50IGV0bmFfcGlwZV93YWl0KHN0cnVjdCBldG5hX3BpcGUgKnBpcGUsIHVpbnQzMl90IHRpbWVzdGFtcCwgdWludDMyX3QgbXMpOworaW50IGV0bmFfcGlwZV93YWl0X25zKHN0cnVjdCBldG5hX3BpcGUgKnBpcGUsIHVpbnQzMl90IHRpbWVzdGFtcCwgdWludDY0X3QgbnMpOworCisKKy8qIGJ1ZmZlci1vYmplY3QgZnVuY3Rpb25zOgorICovCisKK3N0cnVjdCBldG5hX2JvICpldG5hX2JvX25ldyhzdHJ1Y3QgZXRuYV9kZXZpY2UgKmRldiwKKwkJdWludDMyX3Qgc2l6ZSwgdWludDMyX3QgZmxhZ3MpOworc3RydWN0IGV0bmFfYm8gKmV0bmFfYm9fZnJvbV9oYW5kbGUoc3RydWN0IGV0bmFfZGV2aWNlICpkZXYsCisJCXVpbnQzMl90IGhhbmRsZSwgdWludDMyX3Qgc2l6ZSk7CitzdHJ1Y3QgZXRuYV9ibyAqZXRuYV9ib19mcm9tX25hbWUoc3RydWN0IGV0bmFfZGV2aWNlICpkZXYsIHVpbnQzMl90IG5hbWUpOworc3RydWN0IGV0bmFfYm8gKmV0bmFfYm9fZnJvbV9kbWFidWYoc3RydWN0IGV0bmFfZGV2aWNlICpkZXYsIGludCBmZCk7CitzdHJ1Y3QgZXRuYV9ibyAqZXRuYV9ib19yZWYoc3RydWN0IGV0bmFfYm8gKmJvKTsKK3ZvaWQgZXRuYV9ib19kZWwoc3RydWN0IGV0bmFfYm8gKmJvKTsKK2ludCBldG5hX2JvX2dldF9uYW1lKHN0cnVjdCBldG5hX2JvICpibywgdWludDMyX3QgKm5hbWUpOwordWludDMyX3QgZXRuYV9ib19oYW5kbGUoc3RydWN0IGV0bmFfYm8gKmJvKTsKK2ludCBldG5hX2JvX2RtYWJ1ZihzdHJ1Y3QgZXRuYV9ibyAqYm8pOwordWludDMyX3QgZXRuYV9ib19zaXplKHN0cnVjdCBldG5hX2JvICpibyk7Cit2b2lkICogZXRuYV9ib19tYXAoc3RydWN0IGV0bmFfYm8gKmJvKTsKK2ludCBldG5hX2JvX2NwdV9wcmVwKHN0cnVjdCBldG5hX2JvICpibywgdWludDMyX3Qgb3ApOwordm9pZCBldG5hX2JvX2NwdV9maW5pKHN0cnVjdCBldG5hX2JvICpibyk7CisKKworLyogY21kIHN0cmVhbSBmdW5jdGlvbnM6CisgKi8KKworc3RydWN0IGV0bmFfY21kX3N0cmVhbSB7CisJdWludDMyX3QgKmJ1ZmZlcjsKKwl1aW50MzJfdCBvZmZzZXQ7CS8qIGluIDMyLWJpdCB3b3JkcyAqLworCXVpbnQzMl90IHNpemU7CQkvKiBpbiAzMi1iaXQgd29yZHMgKi8KK307CisKK3N0cnVjdCBldG5hX2NtZF9zdHJlYW0gKmV0bmFfY21kX3N0cmVhbV9uZXcoc3RydWN0IGV0bmFfcGlwZSAqcGlwZSwgdWludDMyX3Qgc2l6ZSwKKwkJdm9pZCAoKnJlc2V0X25vdGlmeSkoc3RydWN0IGV0bmFfY21kX3N0cmVhbSAqc3RyZWFtLCB2b2lkICpwcml2KSwKKwkJdm9pZCAqcHJpdik7Cit2b2lkIGV0bmFfY21kX3N0cmVhbV9kZWwoc3RydWN0IGV0bmFfY21kX3N0cmVhbSAqc3RyZWFtKTsKK3VpbnQzMl90IGV0bmFfY21kX3N0cmVhbV90aW1lc3RhbXAoc3RydWN0IGV0bmFfY21kX3N0cmVhbSAqc3RyZWFtKTsKK3ZvaWQgZXRuYV9jbWRfc3RyZWFtX2ZsdXNoKHN0cnVjdCBldG5hX2NtZF9zdHJlYW0gKnN0cmVhbSk7Cit2b2lkIGV0bmFfY21kX3N0cmVhbV9mbHVzaDIoc3RydWN0IGV0bmFfY21kX3N0cmVhbSAqc3RyZWFtLCBpbnQgaW5fZmVuY2VfZmQsCisJCQkgICAgaW50ICpvdXRfZmVuY2VfZmQpOwordm9pZCBldG5hX2NtZF9zdHJlYW1fZmluaXNoKHN0cnVjdCBldG5hX2NtZF9zdHJlYW0gKnN0cmVhbSk7CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgZXRuYV9jbWRfc3RyZWFtX2F2YWlsKHN0cnVjdCBldG5hX2NtZF9zdHJlYW0gKnN0cmVhbSkKK3sKKwlzdGF0aWMgY29uc3QgdWludDMyX3QgRU5EX0NMRUFSQU5DRSA9IDI7IC8qIExJTksgb3AgY29kZSAqLworCisJcmV0dXJuIHN0cmVhbS0+c2l6ZSAtIHN0cmVhbS0+b2Zmc2V0IC0gRU5EX0NMRUFSQU5DRTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV0bmFfY21kX3N0cmVhbV9yZXNlcnZlKHN0cnVjdCBldG5hX2NtZF9zdHJlYW0gKnN0cmVhbSwgc2l6ZV90IG4pCit7CisJaWYgKGV0bmFfY21kX3N0cmVhbV9hdmFpbChzdHJlYW0pIDwgbikKKwkJZXRuYV9jbWRfc3RyZWFtX2ZsdXNoKHN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBldG5hX2NtZF9zdHJlYW1fZW1pdChzdHJ1Y3QgZXRuYV9jbWRfc3RyZWFtICpzdHJlYW0sIHVpbnQzMl90IGRhdGEpCit7CisJc3RyZWFtLT5idWZmZXJbc3RyZWFtLT5vZmZzZXQrK10gPSBkYXRhOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGV0bmFfY21kX3N0cmVhbV9nZXQoc3RydWN0IGV0bmFfY21kX3N0cmVhbSAqc3RyZWFtLCB1aW50MzJfdCBvZmZzZXQpCit7CisJcmV0dXJuIHN0cmVhbS0+YnVmZmVyW29mZnNldF07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBldG5hX2NtZF9zdHJlYW1fc2V0KHN0cnVjdCBldG5hX2NtZF9zdHJlYW0gKnN0cmVhbSwgdWludDMyX3Qgb2Zmc2V0LAorCQl1aW50MzJfdCBkYXRhKQoreworCXN0cmVhbS0+YnVmZmVyW29mZnNldF0gPSBkYXRhOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGV0bmFfY21kX3N0cmVhbV9vZmZzZXQoc3RydWN0IGV0bmFfY21kX3N0cmVhbSAqc3RyZWFtKQoreworCXJldHVybiBzdHJlYW0tPm9mZnNldDsKK30KKworc3RydWN0IGV0bmFfcmVsb2MgeworCXN0cnVjdCBldG5hX2JvICpibzsKKyNkZWZpbmUgRVROQV9SRUxPQ19SRUFEICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBFVE5BX1JFTE9DX1dSSVRFICAgICAgICAgICAgMHgwMDAyCisJdWludDMyX3QgZmxhZ3M7CisJdWludDMyX3Qgb2Zmc2V0OworfTsKKwordm9pZCBldG5hX2NtZF9zdHJlYW1fcmVsb2Moc3RydWN0IGV0bmFfY21kX3N0cmVhbSAqc3RyZWFtLCBjb25zdCBzdHJ1Y3QgZXRuYV9yZWxvYyAqcik7CisKKyNlbmRpZiAvKiBFVE5BVklWX0RSTUlGX0hfICovCmRpZmYgLS1naXQgYS9ldG5hdml2L2V0bmF2aXZfZ3B1LmMgYi9ldG5hdml2L2V0bmF2aXZfZ3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMzNTVlOAotLS0gL2Rldi9udWxsCisrKyBiL2V0bmF2aXYvZXRuYXZpdl9ncHUuYwpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBFdG5hdml2IFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIENocmlzdGlhbiBHbWVpbmVyIDxjaHJpc3RpYW4uZ21laW5lckBnbWFpbC5jb20+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV0bmF2aXZfcHJpdi5oIgorI2luY2x1ZGUgImV0bmF2aXZfZHJtaWYuaCIKKworc3RhdGljIHVpbnQ2NF90IGdldF9wYXJhbShzdHJ1Y3QgZXRuYV9kZXZpY2UgKmRldiwgdWludDMyX3QgY29yZSwgdWludDMyX3QgcGFyYW0pCit7CisJc3RydWN0IGRybV9ldG5hdml2X3BhcmFtIHJlcSA9IHsKKwkJLnBpcGUgPSBjb3JlLAorCQkucGFyYW0gPSBwYXJhbSwKKwl9OworCWludCByZXQ7CisKKwlyZXQgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGRldi0+ZmQsIERSTV9FVE5BVklWX0dFVF9QQVJBTSwgJnJlcSwgc2l6ZW9mKHJlcSkpOworCWlmIChyZXQpIHsKKwkJRVJST1JfTVNHKCJnZXQtcGFyYW0gKCV4KSBmYWlsZWQhICVkICglcykiLCBwYXJhbSwgcmV0LCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gcmVxLnZhbHVlOworfQorCitzdHJ1Y3QgZXRuYV9ncHUgKmV0bmFfZ3B1X25ldyhzdHJ1Y3QgZXRuYV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNvcmUpCit7CisJc3RydWN0IGV0bmFfZ3B1ICpncHU7CisKKwlncHUgPSBjYWxsb2MoMSwgc2l6ZW9mKCpncHUpKTsKKwlpZiAoIWdwdSkgeworCQlFUlJPUl9NU0coImFsbG9jYXRpb24gZmFpbGVkIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlncHUtPmRldiA9IGRldjsKKwlncHUtPmNvcmUgPSBjb3JlOworCisJZ3B1LT5tb2RlbCAgICAJPSBnZXRfcGFyYW0oZGV2LCBjb3JlLCBFVE5BVklWX1BBUkFNX0dQVV9NT0RFTCk7CisJZ3B1LT5yZXZpc2lvbiAJPSBnZXRfcGFyYW0oZGV2LCBjb3JlLCBFVE5BVklWX1BBUkFNX0dQVV9SRVZJU0lPTik7CisKKwlpZiAoIWdwdS0+bW9kZWwpCisJCWdvdG8gZmFpbDsKKworCUlORk9fTVNHKCIgR1BVIG1vZGVsOiAgICAgICAgICAweCV4IChyZXYgJXgpIiwgZ3B1LT5tb2RlbCwgZ3B1LT5yZXZpc2lvbik7CisKKwlyZXR1cm4gZ3B1OworZmFpbDoKKwlpZiAoZ3B1KQorCQlldG5hX2dwdV9kZWwoZ3B1KTsKKworCXJldHVybiBOVUxMOworfQorCit2b2lkIGV0bmFfZ3B1X2RlbChzdHJ1Y3QgZXRuYV9ncHUgKmdwdSkKK3sKKwlmcmVlKGdwdSk7Cit9CisKK2ludCBldG5hX2dwdV9nZXRfcGFyYW0oc3RydWN0IGV0bmFfZ3B1ICpncHUsIGVudW0gZXRuYV9wYXJhbV9pZCBwYXJhbSwKKwkJdWludDY0X3QgKnZhbHVlKQoreworCXN0cnVjdCBldG5hX2RldmljZSAqZGV2ID0gZ3B1LT5kZXY7CisJdW5zaWduZWQgaW50IGNvcmUgPSBncHUtPmNvcmU7CisKKwlzd2l0Y2gocGFyYW0pIHsKKwljYXNlIEVUTkFfR1BVX01PREVMOgorCQkqdmFsdWUgPSBncHUtPm1vZGVsOworCQlyZXR1cm4gMDsKKwljYXNlIEVUTkFfR1BVX1JFVklTSU9OOgorCQkqdmFsdWUgPSBncHUtPnJldmlzaW9uOworCQlyZXR1cm4gMDsKKwljYXNlIEVUTkFfR1BVX0ZFQVRVUkVTXzA6CisJCSp2YWx1ZSA9IGdldF9wYXJhbShkZXYsIGNvcmUsIEVUTkFWSVZfUEFSQU1fR1BVX0ZFQVRVUkVTXzApOworCQlyZXR1cm4gMDsKKwljYXNlIEVUTkFfR1BVX0ZFQVRVUkVTXzE6CisJCSp2YWx1ZSA9IGdldF9wYXJhbShkZXYsIGNvcmUsIEVUTkFWSVZfUEFSQU1fR1BVX0ZFQVRVUkVTXzEpOworCQlyZXR1cm4gMDsKKwljYXNlIEVUTkFfR1BVX0ZFQVRVUkVTXzI6CisJCSp2YWx1ZSA9IGdldF9wYXJhbShkZXYsIGNvcmUsIEVUTkFWSVZfUEFSQU1fR1BVX0ZFQVRVUkVTXzIpOworCQlyZXR1cm4gMDsKKwljYXNlIEVUTkFfR1BVX0ZFQVRVUkVTXzM6CisJCSp2YWx1ZSA9IGdldF9wYXJhbShkZXYsIGNvcmUsIEVUTkFWSVZfUEFSQU1fR1BVX0ZFQVRVUkVTXzMpOworCQlyZXR1cm4gMDsKKwljYXNlIEVUTkFfR1BVX0ZFQVRVUkVTXzQ6CisJCSp2YWx1ZSA9IGdldF9wYXJhbShkZXYsIGNvcmUsIEVUTkFWSVZfUEFSQU1fR1BVX0ZFQVRVUkVTXzQpOworCQlyZXR1cm4gMDsKKwljYXNlIEVUTkFfR1BVX0ZFQVRVUkVTXzU6CisJCSp2YWx1ZSA9IGdldF9wYXJhbShkZXYsIGNvcmUsIEVUTkFWSVZfUEFSQU1fR1BVX0ZFQVRVUkVTXzUpOworCQlyZXR1cm4gMDsKKwljYXNlIEVUTkFfR1BVX0ZFQVRVUkVTXzY6CisJCSp2YWx1ZSA9IGdldF9wYXJhbShkZXYsIGNvcmUsIEVUTkFWSVZfUEFSQU1fR1BVX0ZFQVRVUkVTXzYpOworCQlyZXR1cm4gMDsKKwljYXNlIEVUTkFfR1BVX1NUUkVBTV9DT1VOVDoKKwkJKnZhbHVlID0gZ2V0X3BhcmFtKGRldiwgY29yZSwgRVROQV9HUFVfU1RSRUFNX0NPVU5UKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBFVE5BX0dQVV9SRUdJU1RFUl9NQVg6CisJCSp2YWx1ZSA9IGdldF9wYXJhbShkZXYsIGNvcmUsIEVUTkFfR1BVX1JFR0lTVEVSX01BWCk7CisJCXJldHVybiAwOworCWNhc2UgRVROQV9HUFVfVEhSRUFEX0NPVU5UOgorCQkqdmFsdWUgPSBnZXRfcGFyYW0oZGV2LCBjb3JlLCBFVE5BX0dQVV9USFJFQURfQ09VTlQpOworCQlyZXR1cm4gMDsKKwljYXNlIEVUTkFfR1BVX1ZFUlRFWF9DQUNIRV9TSVpFOgorCQkqdmFsdWUgPSBnZXRfcGFyYW0oZGV2LCBjb3JlLCBFVE5BX0dQVV9WRVJURVhfQ0FDSEVfU0laRSk7CisJCXJldHVybiAwOworCWNhc2UgRVROQV9HUFVfU0hBREVSX0NPUkVfQ09VTlQ6CisJCSp2YWx1ZSA9IGdldF9wYXJhbShkZXYsIGNvcmUsIEVUTkFfR1BVX1NIQURFUl9DT1JFX0NPVU5UKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBFVE5BX0dQVV9QSVhFTF9QSVBFUzoKKwkJKnZhbHVlID0gZ2V0X3BhcmFtKGRldiwgY29yZSwgRVROQV9HUFVfUElYRUxfUElQRVMpOworCQlyZXR1cm4gMDsKKwljYXNlIEVUTkFfR1BVX1ZFUlRFWF9PVVRQVVRfQlVGRkVSX1NJWkU6CisJCSp2YWx1ZSA9IGdldF9wYXJhbShkZXYsIGNvcmUsIEVUTkFfR1BVX1ZFUlRFWF9PVVRQVVRfQlVGRkVSX1NJWkUpOworCQlyZXR1cm4gMDsKKwljYXNlIEVUTkFfR1BVX0JVRkZFUl9TSVpFOgorCQkqdmFsdWUgPSBnZXRfcGFyYW0oZGV2LCBjb3JlLCBFVE5BX0dQVV9CVUZGRVJfU0laRSk7CisJCXJldHVybiAwOworCWNhc2UgRVROQV9HUFVfSU5TVFJVQ1RJT05fQ09VTlQ6CisJCSp2YWx1ZSA9IGdldF9wYXJhbShkZXYsIGNvcmUsIEVUTkFfR1BVX0lOU1RSVUNUSU9OX0NPVU5UKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBFVE5BX0dQVV9OVU1fQ09OU1RBTlRTOgorCQkqdmFsdWUgPSBnZXRfcGFyYW0oZGV2LCBjb3JlLCBFVE5BX0dQVV9OVU1fQ09OU1RBTlRTKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBFVE5BX0dQVV9OVU1fVkFSWUlOR1M6CisJCSp2YWx1ZSA9IGdldF9wYXJhbShkZXYsIGNvcmUsIEVUTkFfR1BVX05VTV9WQVJZSU5HUyk7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJRVJST1JfTVNHKCJpbnZhbGlkIHBhcmFtIGlkOiAlZCIsIHBhcmFtKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZXRuYXZpdi9ldG5hdml2X3BpcGUuYyBiL2V0bmF2aXYvZXRuYXZpdl9waXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRjNWQzNwotLS0gL2Rldi9udWxsCisrKyBiL2V0bmF2aXYvZXRuYXZpdl9waXBlLmMKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IEV0bmF2aXYgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgQ2hyaXN0aWFuIEdtZWluZXIgPGNocmlzdGlhbi5nbWVpbmVyQGdtYWlsLmNvbT4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXRuYXZpdl9wcml2LmgiCisKK2ludCBldG5hX3BpcGVfd2FpdChzdHJ1Y3QgZXRuYV9waXBlICpwaXBlLCB1aW50MzJfdCB0aW1lc3RhbXAsIHVpbnQzMl90IG1zKQoreworCXJldHVybiBldG5hX3BpcGVfd2FpdF9ucyhwaXBlLCB0aW1lc3RhbXAsIG1zICogMTAwMDAwMCk7Cit9CisKK2ludCBldG5hX3BpcGVfd2FpdF9ucyhzdHJ1Y3QgZXRuYV9waXBlICpwaXBlLCB1aW50MzJfdCB0aW1lc3RhbXAsIHVpbnQ2NF90IG5zKQoreworCXN0cnVjdCBldG5hX2RldmljZSAqZGV2ID0gcGlwZS0+Z3B1LT5kZXY7CisJaW50IHJldDsKKworCXN0cnVjdCBkcm1fZXRuYXZpdl93YWl0X2ZlbmNlIHJlcSA9IHsKKwkJLnBpcGUgPSBwaXBlLT5ncHUtPmNvcmUsCisJCS5mZW5jZSA9IHRpbWVzdGFtcCwKKwl9OworCisJaWYgKG5zID09IDApCisJCXJlcS5mbGFncyB8PSBFVE5BX1dBSVRfTk9OQkxPQ0s7CisKKwlnZXRfYWJzX3RpbWVvdXQoJnJlcS50aW1lb3V0LCBucyk7CisKKwlyZXQgPSBkcm1Db21tYW5kV3JpdGUoZGV2LT5mZCwgRFJNX0VUTkFWSVZfV0FJVF9GRU5DRSwgJnJlcSwgc2l6ZW9mKHJlcSkpOworCWlmIChyZXQpIHsKKwkJRVJST1JfTVNHKCJ3YWl0LWZlbmNlIGZhaWxlZCEgJWQgKCVzKSIsIHJldCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBldG5hX3BpcGVfZGVsKHN0cnVjdCBldG5hX3BpcGUgKnBpcGUpCit7CisJZnJlZShwaXBlKTsKK30KKworc3RydWN0IGV0bmFfcGlwZSAqZXRuYV9waXBlX25ldyhzdHJ1Y3QgZXRuYV9ncHUgKmdwdSwgZW51bSBldG5hX3BpcGVfaWQgaWQpCit7CisJc3RydWN0IGV0bmFfcGlwZSAqcGlwZTsKKworCXBpcGUgPSBjYWxsb2MoMSwgc2l6ZW9mKCpwaXBlKSk7CisJaWYgKCFwaXBlKSB7CisJCUVSUk9SX01TRygiYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJZ290byBmYWlsOworCX0KKworCXBpcGUtPmlkID0gaWQ7CisJcGlwZS0+Z3B1ID0gZ3B1OworCisJcmV0dXJuIHBpcGU7CitmYWlsOgorCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZXRuYXZpdi9ldG5hdml2X3ByaXYuaCBiL2V0bmF2aXYvZXRuYXZpdl9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzNGJhMwotLS0gL2Rldi9udWxsCisrKyBiL2V0bmF2aXYvZXRuYXZpdl9wcml2LmgKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBFdG5hdml2IFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIENocmlzdGlhbiBHbWVpbmVyIDxjaHJpc3RpYW4uZ21laW5lckBnbWFpbC5jb20+CisgKi8KKworI2lmbmRlZiBFVE5BVklWX1BSSVZfSF8KKyNkZWZpbmUgRVROQVZJVl9QUklWX0hfCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgImxpYmRybV9tYWNyb3MuaCIKKyNpbmNsdWRlICJ4Zjg2ZHJtLmgiCisjaW5jbHVkZSAieGY4NmF0b21pYy5oIgorCisjaW5jbHVkZSAidXRpbF9kb3VibGVfbGlzdC5oIgorCisjaW5jbHVkZSAiZXRuYXZpdl9kcm1pZi5oIgorI2luY2x1ZGUgImV0bmF2aXZfZHJtLmgiCisKK3N0cnVjdCBldG5hX2JvX2J1Y2tldCB7CisJdWludDMyX3Qgc2l6ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3QgZXRuYV9ib19jYWNoZSB7CisJc3RydWN0IGV0bmFfYm9fYnVja2V0IGNhY2hlX2J1Y2tldFsxNCAqIDRdOworCXVuc2lnbmVkIG51bV9idWNrZXRzOworCXRpbWVfdCB0aW1lOworfTsKKworc3RydWN0IGV0bmFfZGV2aWNlIHsKKwlpbnQgZmQ7CisJYXRvbWljX3QgcmVmY250OworCisJLyogdGFibGVzIHRvIGtlZXAgdHJhY2sgb2YgYm8ncywgdG8gYXZvaWQgImV2aWwtdHdpbiIgZXRuYV9ibyBvYmplY3RzOgorCSAqCisJICogICBoYW5kbGVfdGFibGU6IG1hcHMgaGFuZGxlIHRvIGV0bmFfYm8KKwkgKiAgIG5hbWVfdGFibGU6IG1hcHMgZmxpbmsgbmFtZSB0byBldG5hX2JvCisJICoKKwkgKiBXZSBlbmQgdXAgbmVlZGluZyB0d28gdGFibGVzLCBiZWNhdXNlIERSTV9JT0NUTF9HRU1fT1BFTiBhbHdheXMKKwkgKiByZXR1cm5zIGEgbmV3IGhhbmRsZS4gIFNvIHdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgYm8gaXMgYWxyZWFkeQorCSAqIG9wZW4gaW4gdGhlIHByb2Nlc3MgZmlyc3QsIGJlZm9yZSBjYWxsaW5nIGdlbS1vcGVuLgorCSAqLworCXZvaWQgKmhhbmRsZV90YWJsZSwgKm5hbWVfdGFibGU7CisKKwlzdHJ1Y3QgZXRuYV9ib19jYWNoZSBib19jYWNoZTsKKworCWludCBjbG9zZWZkOyAgICAgICAgLyogY2FsbCBjbG9zZShmZCkgdXBvbiBkZXN0cnVjdGlvbiAqLworfTsKKworZHJtX3ByaXZhdGUgdm9pZCBldG5hX2JvX2NhY2hlX2luaXQoc3RydWN0IGV0bmFfYm9fY2FjaGUgKmNhY2hlKTsKK2RybV9wcml2YXRlIHZvaWQgZXRuYV9ib19jYWNoZV9jbGVhbnVwKHN0cnVjdCBldG5hX2JvX2NhY2hlICpjYWNoZSwgdGltZV90IHRpbWUpOworZHJtX3ByaXZhdGUgc3RydWN0IGV0bmFfYm8gKmV0bmFfYm9fY2FjaGVfYWxsb2Moc3RydWN0IGV0bmFfYm9fY2FjaGUgKmNhY2hlLAorCQl1aW50MzJfdCAqc2l6ZSwgdWludDMyX3QgZmxhZ3MpOworZHJtX3ByaXZhdGUgaW50IGV0bmFfYm9fY2FjaGVfZnJlZShzdHJ1Y3QgZXRuYV9ib19jYWNoZSAqY2FjaGUsIHN0cnVjdCBldG5hX2JvICpibyk7CisKKy8qIGZvciB3aGVyZSBAdGFibGVfbG9jayBpcyBhbHJlYWR5IGhlbGQ6ICovCitkcm1fcHJpdmF0ZSB2b2lkIGV0bmFfZGV2aWNlX2RlbF9sb2NrZWQoc3RydWN0IGV0bmFfZGV2aWNlICpkZXYpOworCisvKiBhIEdFTSBidWZmZXIgb2JqZWN0IGFsbG9jYXRlZCBmcm9tIHRoZSBEUk0gZGV2aWNlICovCitzdHJ1Y3QgZXRuYV9ibyB7CisJc3RydWN0IGV0bmFfZGV2aWNlICAgICAgKmRldjsKKwl2b2lkICAgICAgICAgICAgKm1hcDsgICAgICAgICAgIC8qIHVzZXJzcGFjZSBtbWFwJ2luZyAoaWYgdGhlcmUgaXMgb25lKSAqLworCXVpbnQzMl90ICAgICAgICBzaXplOworCXVpbnQzMl90ICAgICAgICBoYW5kbGU7CisJdWludDMyX3QgICAgICAgIGZsYWdzOworCXVpbnQzMl90ICAgICAgICBuYW1lOyAgICAgICAgICAgLyogZmxpbmsgZ2xvYmFsIGhhbmRsZSAoRFJJMiBuYW1lKSAqLworCXVpbnQ2NF90ICAgICAgICBvZmZzZXQ7ICAgICAgICAgLyogb2Zmc2V0IHRvIG1tYXAoKSAqLworCWF0b21pY190ICAgICAgICByZWZjbnQ7CisKKwkvKiBpbiB0aGUgY29tbW9uIGNhc2UsIGEgYm8gd29uJ3QgYmUgcmVmZXJlbmNlZCBieSBtb3JlIHRoYW4gYSBzaW5nbGUKKwkgKiBjb21tYW5kIHN0cmVhbS4gIFNvIHRvIGF2b2lkIGxvb3Bpbmcgb3ZlciBhbGwgdGhlIGJvJ3MgaW4gdGhlCisJICogcmVsb2MgdGFibGUgdG8gZmluZCB0aGUgaWR4IG9mIGEgYm8gdGhhdCBtaWdodCBhbHJlYWR5IGJlIGluIHRoZQorCSAqIHRhYmxlLCB3ZSBjYWNoZSB0aGUgaWR4IGluIHRoZSBiby4gIEJ1dCBpbiBvcmRlciB0byBkZXRlY3QgdGhlCisJICogc2xvdy1wYXRoIHdoZXJlIGJvIGlzIHJlZidkIGluIG11bHRpcGxlIHN0cmVhbXMsIHdlIGFsc28gbXVzdCB0cmFjaworCSAqIHRoZSBjdXJyZW50X3N0cmVhbSBmb3Igd2hpY2ggdGhlIGlkeCBpcyB2YWxpZC4gIFNlZSBibzJpZHgoKS4KKwkgKi8KKwlzdHJ1Y3QgZXRuYV9jbWRfc3RyZWFtICpjdXJyZW50X3N0cmVhbTsKKwl1aW50MzJfdCBpZHg7CisKKwlpbnQgcmV1c2U7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAgIC8qIGJ1Y2tldC1saXN0IGVudHJ5ICovCisJdGltZV90IGZyZWVfdGltZTsgICAgICAgIC8qIHRpbWUgd2hlbiBhZGRlZCB0byBidWNrZXQtbGlzdCAqLworfTsKKworc3RydWN0IGV0bmFfZ3B1IHsKKwlzdHJ1Y3QgZXRuYV9kZXZpY2UgKmRldjsKKwl1aW50MzJfdCBjb3JlOworCXVpbnQzMl90IG1vZGVsOworCXVpbnQzMl90IHJldmlzaW9uOworfTsKKworc3RydWN0IGV0bmFfcGlwZSB7CisJZW51bSBldG5hX3BpcGVfaWQgaWQ7CisJc3RydWN0IGV0bmFfZ3B1ICpncHU7Cit9OworCitzdHJ1Y3QgZXRuYV9jbWRfc3RyZWFtX3ByaXYgeworCXN0cnVjdCBldG5hX2NtZF9zdHJlYW0gYmFzZTsKKwlzdHJ1Y3QgZXRuYV9waXBlICpwaXBlOworCisJdWludDMyX3QgbGFzdF90aW1lc3RhbXA7CisKKwkvKiBzdWJtaXQgaW9jdGwgcmVsYXRlZCB0YWJsZXM6ICovCisJc3RydWN0IHsKKwkJLyogYm8ncyB0YWJsZTogKi8KKwkJc3RydWN0IGRybV9ldG5hdml2X2dlbV9zdWJtaXRfYm8gKmJvczsKKwkJdWludDMyX3QgbnJfYm9zLCBtYXhfYm9zOworCisJCS8qIHJlbG9jJ3MgdGFibGU6ICovCisJCXN0cnVjdCBkcm1fZXRuYXZpdl9nZW1fc3VibWl0X3JlbG9jICpyZWxvY3M7CisJCXVpbnQzMl90IG5yX3JlbG9jcywgbWF4X3JlbG9jczsKKwl9IHN1Ym1pdDsKKworCS8qIHNob3VsZCBoYXZlIG1hdGNoaW5nIGVudHJpZXMgaW4gc3VibWl0LmJvczogKi8KKwlzdHJ1Y3QgZXRuYV9ibyAqKmJvczsKKwl1aW50MzJfdCBucl9ib3MsIG1heF9ib3M7CisKKwkvKiBub3RpZnkgY2FsbGJhY2sgaWYgYnVmZmVyIHJlc2V0IGhhcHBlbmQgKi8KKwl2b2lkICgqcmVzZXRfbm90aWZ5KShzdHJ1Y3QgZXRuYV9jbWRfc3RyZWFtICpzdHJlYW0sIHZvaWQgKnByaXYpOworCXZvaWQgKnJlc2V0X25vdGlmeV9wcml2OworfTsKKworI2RlZmluZSBBTElHTih2LGEpICgoKHYpICsgKGEpIC0gMSkgJiB+KChhKSAtIDEpKQorI2RlZmluZSBBUlJBWV9TSVpFKGFycikgKHNpemVvZihhcnIpIC8gc2l6ZW9mKChhcnIpWzBdKSkKKworI2RlZmluZSBlbmFibGVfZGVidWcgMSAgLyogVE9ETyBtYWtlIGR5bmFtaWMgKi8KKworI2RlZmluZSBJTkZPX01TRyhmbXQsIC4uLikgXAorCQlkbyB7IGRybU1zZygiW0ldICJmbXQgIiAoJXM6JWQpXG4iLCBcCisJCQkJIyNfX1ZBX0FSR1NfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IH0gd2hpbGUgKDApCisjZGVmaW5lIERFQlVHX01TRyhmbXQsIC4uLikgXAorCQlkbyBpZiAoZW5hYmxlX2RlYnVnKSB7IGRybU1zZygiW0RdICJmbXQgIiAoJXM6JWQpXG4iLCBcCisJCQkJIyNfX1ZBX0FSR1NfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IH0gd2hpbGUgKDApCisjZGVmaW5lIFdBUk5fTVNHKGZtdCwgLi4uKSBcCisJCWRvIHsgZHJtTXNnKCJbV10gImZtdCAiICglczolZClcbiIsIFwKKwkJCQkjI19fVkFfQVJHU19fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgRVJST1JfTVNHKGZtdCwgLi4uKSBcCisJCWRvIHsgZHJtTXNnKCJbRV0gIiBmbXQgIiAoJXM6JWQpXG4iLCBcCisJCQkJIyNfX1ZBX0FSR1NfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVk9JRDJVNjQoeCkgKCh1aW50NjRfdCkodW5zaWduZWQgbG9uZykoeCkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfYWJzX3RpbWVvdXQoc3RydWN0IGRybV9ldG5hdml2X3RpbWVzcGVjICp0diwgdWludDY0X3QgbnMpCit7CisJc3RydWN0IHRpbWVzcGVjIHQ7CisJdWludDMyX3QgcyA9IG5zIC8gMTAwMDAwMDAwMDsKKwljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnQpOworCXR2LT50dl9zZWMgPSB0LnR2X3NlYyArIHM7CisJdHYtPnR2X25zZWMgPSB0LnR2X25zZWMgKyBucyAtIChzICogMTAwMDAwMDAwMCk7Cit9CisKKyNlbmRpZiAvKiBFVE5BVklWX1BSSVZfSF8gKi8KZGlmZiAtLWdpdCBhL2V0bmF2aXYvbGliZHJtX2V0bmF2aXYucGMuaW4gYi9ldG5hdml2L2xpYmRybV9ldG5hdml2LnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZmVkMDEKLS0tIC9kZXYvbnVsbAorKysgYi9ldG5hdml2L2xpYmRybV9ldG5hdml2LnBjLmluCkBAIC0wLDAgKzEsMTEgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiBsaWJkcm1fZXRuYXZpdgorRGVzY3JpcHRpb246IFVzZXJzcGFjZSBpbnRlcmZhY2UgdG8gZXRuYXZpdiBrZXJuZWwgRFJNIHNlcnZpY2VzCitWZXJzaW9uOiBAUEFDS0FHRV9WRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWxkcm1fZXRuYXZpdgorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0gLUkke2luY2x1ZGVkaXJ9L2xpYmRybQorUmVxdWlyZXMucHJpdmF0ZTogbGliZHJtCmRpZmYgLS1naXQgYS9leHlub3MvTWFrZWZpbGUuYW0gYi9leHlub3MvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk5Zjg5OAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI3IEBACitBTV9DRkxBR1MgPSBcCisJJChXQVJOX0NGTEFHUykgXAorCS1JJCh0b3Bfc3JjZGlyKSBcCisJJChQVEhSRUFEU1RVQlNfQ0ZMQUdTKSBcCisJLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUvZHJtCisKK2xpYmRybV9leHlub3NfbGFfTFRMSUJSQVJJRVMgPSBsaWJkcm1fZXh5bm9zLmxhCitsaWJkcm1fZXh5bm9zX2xhZGlyID0gJChsaWJkaXIpCitsaWJkcm1fZXh5bm9zX2xhX0xERkxBR1MgPSAtdmVyc2lvbi1udW1iZXIgMTowOjAgLW5vLXVuZGVmaW5lZAorbGliZHJtX2V4eW5vc19sYV9MSUJBREQgPSAuLi9saWJkcm0ubGEgQFBUSFJFQURTVFVCU19MSUJTQAorCitsaWJkcm1fZXh5bm9zX2xhX1NPVVJDRVMgPSBcCisJZXh5bm9zX2RybS5jIFwKKwlleHlub3NfZmltZzJkLmMgXAorCWZpbWcyZF9yZWcuaAorCitsaWJkcm1fZXh5bm9zY29tbW9uaW5jbHVkZWRpciA9ICR7aW5jbHVkZWRpcn0vZXh5bm9zCitsaWJkcm1fZXh5bm9zY29tbW9uaW5jbHVkZV9IRUFERVJTID0gZXh5bm9zX2RybS5oIGV4eW5vc19maW1nMmQuaAorCitsaWJkcm1fZXh5bm9zaW5jbHVkZWRpciA9ICR7aW5jbHVkZWRpcn0vbGliZHJtCitsaWJkcm1fZXh5bm9zaW5jbHVkZV9IRUFERVJTID0gZXh5bm9zX2RybWlmLmgKKworcGtnY29uZmlnZGlyID0gQHBrZ2NvbmZpZ2RpckAKK3BrZ2NvbmZpZ19EQVRBID0gbGliZHJtX2V4eW5vcy5wYworCitURVNUUyA9IGV4eW5vcy1zeW1ib2wtY2hlY2sKK0VYVFJBX0RJU1QgPSAkKFRFU1RTKQpkaWZmIC0tZ2l0IGEvZXh5bm9zL2V4eW5vcy1zeW1ib2wtY2hlY2sgYi9leHlub3MvZXh5bm9zLXN5bWJvbC1jaGVjawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NjkyY2FhCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zL2V4eW5vcy1zeW1ib2wtY2hlY2sKQEAgLTAsMCArMSw0MCBAQAorIyEvYmluL2Jhc2gKKworIyBUaGUgZm9sbG93aW5nIHN5bWJvbHMgKHBhc3QgdGhlIGZpcnN0IGZpdmUpIGFyZSB0YWtlbiBmcm9tIHRoZSBwdWJsaWMgaGVhZGVycy4KKyMgQSBsaXN0IG9mIHRoZSBsYXR0ZXIgc2hvdWxkIGJlIGF2YWlsYWJsZSBNYWtlZmlsZS5hbS9saWJkcm1fZXh5bm9zKl9IRUFERVJTCisKK0ZVTkNTPSQobm0gLUQgLS1mb3JtYXQ9YnNkIC0tZGVmaW5lZC1vbmx5ICR7MS0ubGlicy9saWJkcm1fZXh5bm9zLnNvfSB8IGF3ayAne3ByaW50ICQzfSd8IHdoaWxlIHJlYWQgZnVuYzsgZG8KKyggZ3JlcCAtcSAiXiRmdW5jJCIgfHwgZWNobyAkZnVuYyApICA8PEVPRgorX19ic3Nfc3RhcnQKK19lZGF0YQorX2VuZAorX2ZpbmkKK19pbml0CitleHlub3NfYm9fY3JlYXRlCitleHlub3NfYm9fZGVzdHJveQorZXh5bm9zX2JvX2Zyb21fbmFtZQorZXh5bm9zX2JvX2dldF9pbmZvCitleHlub3NfYm9fZ2V0X25hbWUKK2V4eW5vc19ib19oYW5kbGUKK2V4eW5vc19ib19tYXAKK2V4eW5vc19kZXZpY2VfY3JlYXRlCitleHlub3NfZGV2aWNlX2Rlc3Ryb3kKK2V4eW5vc19wcmltZV9mZF90b19oYW5kbGUKK2V4eW5vc19wcmltZV9oYW5kbGVfdG9fZmQKK2V4eW5vc192aWRpX2Nvbm5lY3Rpb24KK2V4eW5vc19oYW5kbGVfZXZlbnQKK2cyZF9ibGVuZAorZzJkX2NvcHkKK2cyZF9jb3B5X3dpdGhfc2NhbGUKK2cyZF9leGVjCitnMmRfY29uZmlnX2V2ZW50CitnMmRfZmluaQorZzJkX2luaXQKK2cyZF9tb3ZlCitnMmRfc2NhbGVfYW5kX2JsZW5kCitnMmRfc29saWRfZmlsbAorRU9GCitkb25lKQorCit0ZXN0ICEgLW4gIiRGVU5DUyIgfHwgZWNobyAkRlVOQ1MKK3Rlc3QgISAtbiAiJEZVTkNTIgpkaWZmIC0tZ2l0IGEvZXh5bm9zL2V4eW5vc19kcm0uYyBiL2V4eW5vcy9leHlub3NfZHJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYyMDRmMQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vcy9leHlub3NfZHJtLmMKQEAgLTAsMCArMSw0NTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIElua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorCisjaW5jbHVkZSA8eGY4NmRybS5oPgorCisjaW5jbHVkZSAibGliZHJtX21hY3Jvcy5oIgorI2luY2x1ZGUgImV4eW5vc19kcm0uaCIKKyNpbmNsdWRlICJleHlub3NfZHJtaWYuaCIKKworI2RlZmluZSBVNjQyVk9JRCh4KSAoKHZvaWQgKikodW5zaWduZWQgbG9uZykoeCkpCisKKy8qCisgKiBDcmVhdGUgZXh5bm9zIGRybSBkZXZpY2Ugb2JqZWN0LgorICoKKyAqIEBmZDogZmlsZSBkZXNjcmlwdG9yIHRvIGV4eW5vcyBkcm0gZHJpdmVyIG9wZW5lZC4KKyAqCisgKiBpZiB0cnVlLCByZXR1cm4gdGhlIGRldmljZSBvYmplY3QgZWxzZSBOVUxMLgorICovCitzdHJ1Y3QgZXh5bm9zX2RldmljZSAqIGV4eW5vc19kZXZpY2VfY3JlYXRlKGludCBmZCkKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RldmljZSAqZGV2OworCisJZGV2ID0gY2FsbG9jKHNpemVvZigqZGV2KSwgMSk7CisJaWYgKCFkZXYpIHsKKwkJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gY3JlYXRlIGRldmljZVslc10uXG4iLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWRldi0+ZmQgPSBmZDsKKworCXJldHVybiBkZXY7Cit9CisKKy8qCisgKiBEZXN0cm95IGV4eW5vcyBkcm0gZGV2aWNlIG9iamVjdAorICoKKyAqIEBkZXY6IGV4eW5vcyBkcm0gZGV2aWNlIG9iamVjdC4KKyAqLwordm9pZCBleHlub3NfZGV2aWNlX2Rlc3Ryb3koc3RydWN0IGV4eW5vc19kZXZpY2UgKmRldikKK3sKKwlmcmVlKGRldik7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBleHlub3MgYnVmZmVyIG9iamVjdCB0byBleHlub3MgZHJtIGRldmljZS4KKyAqCisgKiBAZGV2OiBleHlub3MgZHJtIGRldmljZSBvYmplY3QuCisgKiBAc2l6ZTogdXNlci1kZXNpcmVkIHNpemUuCisgKiBmbGFnczogdXNlci1kZXNpcmVkIG1lbW9yeSB0eXBlLgorICoJdXNlciBjYW4gc2V0IG9uZSBvciBtb3JlIHR5cGVzIGFtb25nIHNldmVyYWwgdHlwZXMgdG8gbWVtb3J5CisgKglhbGxvY2F0aW9uIGFuZCBjYWNoZSBhdHRyaWJ1dGUgdHlwZXMuIGFuZCBhcyBkZWZhdWx0LAorICoJRVhZTk9TX0JPX05PTkNPTlRJRyBhbmQgRVhZTk9TLUJPX05PTkNBQ0hBQkxFIHR5cGVzIHdvdWxkCisgKgliZSB1c2VkLgorICoKKyAqIGlmIHRydWUsIHJldHVybiBhIGV4eW5vcyBidWZmZXIgb2JqZWN0IGVsc2UgTlVMTC4KKyAqLworc3RydWN0IGV4eW5vc19ibyAqIGV4eW5vc19ib19jcmVhdGUoc3RydWN0IGV4eW5vc19kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgIHNpemVfdCBzaXplLCB1aW50MzJfdCBmbGFncykKK3sKKwlzdHJ1Y3QgZXh5bm9zX2JvICpibzsKKwlzdHJ1Y3QgZHJtX2V4eW5vc19nZW1fY3JlYXRlIHJlcSA9IHsKKwkJLnNpemUgPSBzaXplLAorCQkuZmxhZ3MgPSBmbGFncywKKwl9OworCisJaWYgKHNpemUgPT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgc2l6ZS5cbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJYm8gPSBjYWxsb2Moc2l6ZW9mKCpibyksIDEpOworCWlmICghYm8pIHsKKwkJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gY3JlYXRlIGJvWyVzXS5cbiIsCisJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBlcnJfZnJlZV9ibzsKKwl9CisKKwliby0+ZGV2ID0gZGV2OworCisJaWYgKGRybUlvY3RsKGRldi0+ZmQsIERSTV9JT0NUTF9FWFlOT1NfR0VNX0NSRUFURSwgJnJlcSkpeworCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBjcmVhdGUgZ2VtIG9iamVjdFslc10uXG4iLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gZXJyX2ZyZWVfYm87CisJfQorCisJYm8tPmhhbmRsZSA9IHJlcS5oYW5kbGU7CisJYm8tPnNpemUgPSBzaXplOworCWJvLT5mbGFncyA9IGZsYWdzOworCisJcmV0dXJuIGJvOworCitlcnJfZnJlZV9ibzoKKwlmcmVlKGJvKTsKK2ZhaWw6CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBHZXQgaW5mb3JtYXRpb24gdG8gZ2VtIHJlZ2lvbiBhbGxvY2F0ZWQuCisgKgorICogQGRldjogZXh5bm9zIGRybSBkZXZpY2Ugb2JqZWN0LgorICogQGhhbmRsZTogZ2VtIGhhbmRsZSB0byByZXF1ZXN0IGdlbSBpbmZvLgorICogQHNpemU6IHNpemUgdG8gZ2VtIG9iamVjdCBhbmQgcmV0dXJuZWQgYnkga2VybmVsIHNpZGUuCisgKiBAZmxhZ3M6IGdlbSBmbGFncyB0byBnZW0gb2JqZWN0IGFuZCByZXR1cm5lZCBieSBrZXJuZWwgc2lkZS4KKyAqCisgKiB3aXRoIHRoaXMgZnVuY3Rpb24gY2FsbCwgeW91IGNhbiBnZXQgZmxhZ3MgYW5kIHNpemUgdG8gZ2VtIGhhbmRsZQorICogdGhyb3VnaCBibyBvYmplY3QuCisgKgorICogaWYgdHJ1ZSwgcmV0dXJuIDAgZWxzZSBuZWdhdGl2ZS4KKyAqLworaW50IGV4eW5vc19ib19nZXRfaW5mbyhzdHJ1Y3QgZXh5bm9zX2RldmljZSAqZGV2LCB1aW50MzJfdCBoYW5kbGUsCisJCQkJICBzaXplX3QgKnNpemUsIHVpbnQzMl90ICpmbGFncykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkcm1fZXh5bm9zX2dlbV9pbmZvIHJlcSA9IHsKKwkJLmhhbmRsZSA9IGhhbmRsZSwKKwl9OworCisJcmV0ID0gZHJtSW9jdGwoZGV2LT5mZCwgRFJNX0lPQ1RMX0VYWU5PU19HRU1fR0VULCAmcmVxKTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBnZXQgZ2VtIG9iamVjdCBpbmZvcm1hdGlvblslc10uXG4iLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJKnNpemUgPSByZXEuc2l6ZTsKKwkqZmxhZ3MgPSByZXEuZmxhZ3M7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlc3Ryb3kgYSBleHlub3MgYnVmZmVyIG9iamVjdC4KKyAqCisgKiBAYm86IGEgZXh5bm9zIGJ1ZmZlciBvYmplY3QgdG8gYmUgZGVzdHJveWVkLgorICovCit2b2lkIGV4eW5vc19ib19kZXN0cm95KHN0cnVjdCBleHlub3NfYm8gKmJvKQoreworCWlmICghYm8pCisJCXJldHVybjsKKworCWlmIChiby0+dmFkZHIpCisJCW11bm1hcChiby0+dmFkZHIsIGJvLT5zaXplKTsKKworCWlmIChiby0+aGFuZGxlKSB7CisJCXN0cnVjdCBkcm1fZ2VtX2Nsb3NlIHJlcSA9IHsKKwkJCS5oYW5kbGUgPSBiby0+aGFuZGxlLAorCQl9OworCisJCWRybUlvY3RsKGJvLT5kZXYtPmZkLCBEUk1fSU9DVExfR0VNX0NMT1NFLCAmcmVxKTsKKwl9CisKKwlmcmVlKGJvKTsKK30KKworCisvKgorICogR2V0IGEgZXh5bm9zIGJ1ZmZlciBvYmplY3QgZnJvbSBhIGdlbSBnbG9iYWwgb2JqZWN0IG5hbWUuCisgKgorICogQGRldjogYSBleHlub3MgZGV2aWNlIG9iamVjdC4KKyAqIEBuYW1lOiBhIGdlbSBnbG9iYWwgb2JqZWN0IG5hbWUgZXhwb3J0ZWQgYnkgYW5vdGhlciBwcm9jZXNzLgorICoKKyAqIHRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gZ2V0IGEgZXh5bm9zIGJ1ZmZlciBvYmplY3QgZnJvbSBhIGdlbQorICogZ2xvYmFsIG9iamVjdCBuYW1lIHNlbnQgYnkgYW5vdGhlciBwcm9jZXNzIGZvciBidWZmZXIgc2hhcmluZy4KKyAqCisgKiBpZiB0cnVlLCByZXR1cm4gYSBleHlub3MgYnVmZmVyIG9iamVjdCBlbHNlIE5VTEwuCisgKgorICovCitzdHJ1Y3QgZXh5bm9zX2JvICoKK2V4eW5vc19ib19mcm9tX25hbWUoc3RydWN0IGV4eW5vc19kZXZpY2UgKmRldiwgdWludDMyX3QgbmFtZSkKK3sKKwlzdHJ1Y3QgZXh5bm9zX2JvICpibzsKKwlzdHJ1Y3QgZHJtX2dlbV9vcGVuIHJlcSA9IHsKKwkJLm5hbWUgPSBuYW1lLAorCX07CisKKwlibyA9IGNhbGxvYyhzaXplb2YoKmJvKSwgMSk7CisJaWYgKCFibykgeworCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBhbGxvY2F0ZSBib1slc10uXG4iLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChkcm1Jb2N0bChkZXYtPmZkLCBEUk1fSU9DVExfR0VNX09QRU4sICZyZXEpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIG9wZW4gZ2VtIG9iamVjdFslc10uXG4iLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gZXJyX2ZyZWVfYm87CisJfQorCisJYm8tPmRldiA9IGRldjsKKwliby0+bmFtZSA9IG5hbWU7CisJYm8tPmhhbmRsZSA9IHJlcS5oYW5kbGU7CisKKwlyZXR1cm4gYm87CisKK2Vycl9mcmVlX2JvOgorCWZyZWUoYm8pOworCXJldHVybiBOVUxMOworfQorCisvKgorICogR2V0IGEgZ2VtIGdsb2JhbCBvYmplY3QgbmFtZSBmcm9tIGEgZ2VtIG9iamVjdCBoYW5kbGUuCisgKgorICogQGJvOiBhIGV4eW5vcyBidWZmZXIgb2JqZWN0IGluY2x1ZGluZyBnZW0gaGFuZGxlLgorICogQG5hbWU6IGEgZ2VtIGdsb2JhbCBvYmplY3QgbmFtZSB0byBiZSBnb3QgYnkga2VybmVsIGRyaXZlci4KKyAqCisgKiB0aGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGdldCBhIGdlbSBnbG9iYWwgb2JqZWN0IG5hbWUgZnJvbSBhIGdlbSBvYmplY3QKKyAqIGhhbmRsZSB0byBhIGJ1ZmZlciB0aGF0IHdhbnRzIHRvIHNoYXJlIGl0IHdpdGggYW5vdGhlciBwcm9jZXNzLgorICoKKyAqIGlmIHRydWUsIHJldHVybiAwIGVsc2UgbmVnYXRpdmUuCisgKi8KK2ludCBleHlub3NfYm9fZ2V0X25hbWUoc3RydWN0IGV4eW5vc19ibyAqYm8sIHVpbnQzMl90ICpuYW1lKQoreworCWlmICghYm8tPm5hbWUpIHsKKwkJc3RydWN0IGRybV9nZW1fZmxpbmsgcmVxID0geworCQkJLmhhbmRsZSA9IGJvLT5oYW5kbGUsCisJCX07CisJCWludCByZXQ7CisKKwkJcmV0ID0gZHJtSW9jdGwoYm8tPmRldi0+ZmQsIERSTV9JT0NUTF9HRU1fRkxJTkssICZyZXEpOworCQlpZiAocmV0KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBnZXQgZ2VtIGdsb2JhbCBuYW1lWyVzXS5cbiIsCisJCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJYm8tPm5hbWUgPSByZXEubmFtZTsKKwl9CisKKwkqbmFtZSA9IGJvLT5uYW1lOworCisJcmV0dXJuIDA7Cit9CisKK3VpbnQzMl90IGV4eW5vc19ib19oYW5kbGUoc3RydWN0IGV4eW5vc19ibyAqYm8pCit7CisJcmV0dXJuIGJvLT5oYW5kbGU7Cit9CisKKy8qCisgKiBNbWFwIGEgYnVmZmVyIHRvIHVzZXIgc3BhY2UuCisgKgorICogQGJvOiBhIGV4eW5vcyBidWZmZXIgb2JqZWN0IGluY2x1ZGluZyBhIGdlbSBvYmplY3QgaGFuZGxlIHRvIGJlIG1tYXBwZWQKKyAqCXRvIHVzZXIgc3BhY2UuCisgKgorICogaWYgdHJ1ZSwgdXNlciBwb2ludGVyIG1tYXBlZCBlbHNlIE5VTEwuCisgKi8KK3ZvaWQgKmV4eW5vc19ib19tYXAoc3RydWN0IGV4eW5vc19ibyAqYm8pCit7CisJaWYgKCFiby0+dmFkZHIpIHsKKwkJc3RydWN0IGV4eW5vc19kZXZpY2UgKmRldiA9IGJvLT5kZXY7CisJCXN0cnVjdCBkcm1fbW9kZV9tYXBfZHVtYiBhcmc7CisJCXZvaWQgKm1hcCA9IE5VTEw7CisJCWludCByZXQ7CisKKwkJbWVtc2V0KCZhcmcsIDAsIHNpemVvZihhcmcpKTsKKwkJYXJnLmhhbmRsZSA9IGJvLT5oYW5kbGU7CisKKwkJcmV0ID0gZHJtSW9jdGwoZGV2LT5mZCwgRFJNX0lPQ1RMX01PREVfTUFQX0RVTUIsICZhcmcpOworCQlpZiAocmV0KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBtYXAgZHVtYiBidWZmZXJbJXNdLlxuIiwKKwkJCQlzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltYXAgPSBkcm1fbW1hcCgwLCBiby0+c2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwKKwkJCQlkZXYtPmZkLCBhcmcub2Zmc2V0KTsKKworCQlpZiAobWFwICE9IE1BUF9GQUlMRUQpCisJCQliby0+dmFkZHIgPSBtYXA7CisJfQorCisJcmV0dXJuIGJvLT52YWRkcjsKK30KKworLyoKKyAqIEV4cG9ydCBnZW0gb2JqZWN0IHRvIGRtYWJ1ZiBhcyBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogQGRldjogZXh5bm9zIGRldmljZSBvYmplY3QKKyAqIEBoYW5kbGU6IGdlbSBoYW5kbGUgdG8gZXhwb3J0IGFzIGZpbGUgZGVzY3JpcHRvciBvZiBkbWFidWYKKyAqIEBmZDogZmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGZyb20ga2VybmVsCisgKgorICogQHJldHVybjogMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciwgYW5kIGVycm5vIHdpbGwgYmUgc2V0CisgKi8KK2ludAorZXh5bm9zX3ByaW1lX2hhbmRsZV90b19mZChzdHJ1Y3QgZXh5bm9zX2RldmljZSAqZGV2LCB1aW50MzJfdCBoYW5kbGUsIGludCAqZmQpCit7CisJcmV0dXJuIGRybVByaW1lSGFuZGxlVG9GRChkZXYtPmZkLCBoYW5kbGUsIDAsIGZkKTsKK30KKworLyoKKyAqIEltcG9ydCBmaWxlIGRlc2NyaXB0b3IgaW50byBnZW0gaGFuZGxlLgorICoKKyAqIEBkZXY6IGV4eW5vcyBkZXZpY2Ugb2JqZWN0CisgKiBAZmQ6IGZpbGUgZGVzY3JpcHRvciBvZiBkbWFidWYgdG8gaW1wb3J0CisgKiBAaGFuZGxlOiBnZW0gaGFuZGxlIHJldHVybmVkIGZyb20ga2VybmVsCisgKgorICogQHJldHVybjogMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciwgYW5kIGVycm5vIHdpbGwgYmUgc2V0CisgKi8KK2ludAorZXh5bm9zX3ByaW1lX2ZkX3RvX2hhbmRsZShzdHJ1Y3QgZXh5bm9zX2RldmljZSAqZGV2LCBpbnQgZmQsIHVpbnQzMl90ICpoYW5kbGUpCit7CisJcmV0dXJuIGRybVByaW1lRkRUb0hhbmRsZShkZXYtPmZkLCBmZCwgaGFuZGxlKTsKK30KKworCisKKy8qCisgKiBSZXF1ZXN0IFdpcmVsZXNzIERpc3BsYXkgY29ubmVjdGlvbiBvciBkaXNjb25uZWN0aW9uLgorICoKKyAqIEBkZXY6IGEgZXh5bm9zIGRldmljZSBvYmplY3QuCisgKiBAY29ubmVjdDogaW5kaWNhdGUgd2hldGhlciBjb25uZWN0b2luIG9yIGRpc2Nvbm5lY3Rpb24gcmVxdWVzdC4KKyAqIEBleHQ6IGluZGljYXRlIHdoZXRoZXIgZWRpZCBkYXRhIGluY2x1ZGVzIGV4dGVuc2lvbnMgZGF0YSBvciBub3QuCisgKiBAZWRpZDogYSBwb2ludGVyIHRvIGVkaWQgZGF0YSBmcm9tIFdpcmVsZXNzIERpc3BsYXkgZGV2aWNlLgorICoKKyAqIHRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gcmVxdWVzdCBWaXJ0dWFsIERpc3BsYXkgZHJpdmVyIGNvbm5lY3Rpb24gb3IKKyAqIGRpc2Nvbm5lY3Rpb24uIGZvciB0aGlzLCB1c2VyIHNob3VsZCBnZXQgYSBlZGlkIGRhdGEgZnJvbSB0aGUgV2lyZWxlc3MKKyAqIERpc3BsYXkgZGV2aWNlIGFuZCB0aGVuIHNlbmQgdGhhdCBkYXRhIHRvIGtlcm5lbCBkcml2ZXIgd2l0aCBjb25uZWN0aW9uCisgKiByZXF1ZXN0CisgKgorICogaWYgdHJ1ZSwgcmV0dXJuIDAgZWxzZSBuZWdhdGl2ZS4KKyAqLworaW50CitleHlub3NfdmlkaV9jb25uZWN0aW9uKHN0cnVjdCBleHlub3NfZGV2aWNlICpkZXYsIHVpbnQzMl90IGNvbm5lY3QsCisJCSAgICAgICB1aW50MzJfdCBleHQsIHZvaWQgKmVkaWQpCit7CisJc3RydWN0IGRybV9leHlub3NfdmlkaV9jb25uZWN0aW9uIHJlcSA9IHsKKwkJLmNvbm5lY3Rpb24JPSBjb25uZWN0LAorCQkuZXh0ZW5zaW9ucwk9IGV4dCwKKwkJLmVkaWQJCT0gKHVpbnQ2NF90KSh1aW50cHRyX3QpZWRpZCwKKwl9OworCWludCByZXQ7CisKKwlyZXQgPSBkcm1Jb2N0bChkZXYtPmZkLCBEUk1fSU9DVExfRVhZTk9TX1ZJRElfQ09OTkVDVElPTiwgJnJlcSk7CisJaWYgKHJldCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byByZXF1ZXN0IHZpZGkgY29ubmVjdGlvblslc10uXG4iLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitleHlub3NfaGFuZGxlX3ZlbmRvcihpbnQgZmQsIHN0cnVjdCBkcm1fZXZlbnQgKmUsIHZvaWQgKmN0eCkKK3sKKwlzdHJ1Y3QgZHJtX2V4eW5vc19nMmRfZXZlbnQgKmcyZDsKKwlzdHJ1Y3QgZXh5bm9zX2V2ZW50X2NvbnRleHQgKmVjdHggPSBjdHg7CisKKwlzd2l0Y2ggKGUtPnR5cGUpIHsKKwkJY2FzZSBEUk1fRVhZTk9TX0cyRF9FVkVOVDoKKwkJCWlmIChlY3R4LT52ZXJzaW9uIDwgMSB8fCBlY3R4LT5nMmRfZXZlbnRfaGFuZGxlciA9PSBOVUxMKQorCQkJCWJyZWFrOworCQkJZzJkID0gKHN0cnVjdCBkcm1fZXh5bm9zX2cyZF9ldmVudCAqKWU7CisJCQllY3R4LT5nMmRfZXZlbnRfaGFuZGxlcihmZCwgZzJkLT5jbWRsaXN0X25vLCBnMmQtPnR2X3NlYywKKwkJCQkJCWcyZC0+dHZfdXNlYywgVTY0MlZPSUQoZzJkLT51c2VyX2RhdGEpKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9Cit9CisKK2ludAorZXh5bm9zX2hhbmRsZV9ldmVudChzdHJ1Y3QgZXh5bm9zX2RldmljZSAqZGV2LCBzdHJ1Y3QgZXh5bm9zX2V2ZW50X2NvbnRleHQgKmN0eCkKK3sKKwljaGFyIGJ1ZmZlclsxMDI0XTsKKwlpbnQgbGVuLCBpOworCXN0cnVjdCBkcm1fZXZlbnQgKmU7CisJc3RydWN0IGRybV9ldmVudF92YmxhbmsgKnZibGFuazsKKwlkcm1FdmVudENvbnRleHRQdHIgZXZjdHggPSAmY3R4LT5iYXNlOworCisJLyogVGhlIERSTSByZWFkIHNlbWFudGljcyBndWFyYW50ZWVzIHRoYXQgd2UgYWx3YXlzIGdldCBvbmx5CisJICogY29tcGxldGUgZXZlbnRzLiAqLworCWxlbiA9IHJlYWQoZGV2LT5mZCwgYnVmZmVyLCBzaXplb2YgYnVmZmVyKTsKKwlpZiAobGVuID09IDApCisJCXJldHVybiAwOworCWlmIChsZW4gPCAoaW50KXNpemVvZiAqZSkKKwkJcmV0dXJuIC0xOworCisJaSA9IDA7CisJd2hpbGUgKGkgPCBsZW4pIHsKKwkJZSA9IChzdHJ1Y3QgZHJtX2V2ZW50ICopKGJ1ZmZlciArIGkpOworCQlzd2l0Y2ggKGUtPnR5cGUpIHsKKwkJY2FzZSBEUk1fRVZFTlRfVkJMQU5LOgorCQkJaWYgKGV2Y3R4LT52ZXJzaW9uIDwgMSB8fAorCQkJICAgIGV2Y3R4LT52YmxhbmtfaGFuZGxlciA9PSBOVUxMKQorCQkJCWJyZWFrOworCQkJdmJsYW5rID0gKHN0cnVjdCBkcm1fZXZlbnRfdmJsYW5rICopIGU7CisJCQlldmN0eC0+dmJsYW5rX2hhbmRsZXIoZGV2LT5mZCwKKwkJCQkJICAgICAgdmJsYW5rLT5zZXF1ZW5jZSwKKwkJCQkJICAgICAgdmJsYW5rLT50dl9zZWMsCisJCQkJCSAgICAgIHZibGFuay0+dHZfdXNlYywKKwkJCQkJICAgICAgVTY0MlZPSUQgKHZibGFuay0+dXNlcl9kYXRhKSk7CisJCQlicmVhazsKKwkJY2FzZSBEUk1fRVZFTlRfRkxJUF9DT01QTEVURToKKwkJCWlmIChldmN0eC0+dmVyc2lvbiA8IDIgfHwKKwkJCSAgICBldmN0eC0+cGFnZV9mbGlwX2hhbmRsZXIgPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCXZibGFuayA9IChzdHJ1Y3QgZHJtX2V2ZW50X3ZibGFuayAqKSBlOworCQkJZXZjdHgtPnBhZ2VfZmxpcF9oYW5kbGVyKGRldi0+ZmQsCisJCQkJCQkgdmJsYW5rLT5zZXF1ZW5jZSwKKwkJCQkJCSB2YmxhbmstPnR2X3NlYywKKwkJCQkJCSB2YmxhbmstPnR2X3VzZWMsCisJCQkJCQkgVTY0MlZPSUQgKHZibGFuay0+dXNlcl9kYXRhKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWV4eW5vc19oYW5kbGVfdmVuZG9yKGRldi0+ZmQsIGUsIGV2Y3R4KTsKKwkJCWJyZWFrOworCQl9CisJCWkgKz0gZS0+bGVuZ3RoOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zL2V4eW5vc19kcm0uaCBiL2V4eW5vcy9leHlub3NfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNhZjBhYwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vcy9leHlub3NfZHJtLmgKQEAgLTAsMCArMSwxNzIgQEAKKy8qIGV4eW5vc19kcm0uaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogQXV0aG9yczoKKyAqCUlua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4KKyAqCUpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4KKyAqCVNldW5nLVdvbyBLaW0gPHN3MDMxMi5raW1Ac2Ftc3VuZy5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRVhZTk9TX0RSTV9IXworI2RlZmluZSBfRVhZTk9TX0RSTV9IXworCisjaW5jbHVkZSAiZHJtLmgiCisKKy8qKgorICogVXNlci1kZXNpcmVkIGJ1ZmZlciBjcmVhdGlvbiBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisgKgorICogQHNpemU6IHVzZXItZGVzaXJlZCBtZW1vcnkgYWxsb2NhdGlvbiBzaXplLgorICoJLSB0aGlzIHNpemUgdmFsdWUgd291bGQgYmUgcGFnZS1hbGlnbmVkIGludGVybmFsbHkuCisgKiBAZmxhZ3M6IHVzZXIgcmVxdWVzdCBmb3Igc2V0dGluZyBtZW1vcnkgdHlwZSBvciBjYWNoZSBhdHRyaWJ1dGVzLgorICogQGhhbmRsZTogcmV0dXJuZWQgYSBoYW5kbGUgdG8gY3JlYXRlZCBnZW0gb2JqZWN0LgorICoJLSB0aGlzIGhhbmRsZSB3aWxsIGJlIHNldCBieSBnZW0gbW9kdWxlIG9mIGtlcm5lbCBzaWRlLgorICovCitzdHJ1Y3QgZHJtX2V4eW5vc19nZW1fY3JlYXRlIHsKKwl1aW50NjRfdCBzaXplOworCXVuc2lnbmVkIGludCBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlOworfTsKKworLyoqCisgKiBBIHN0cnVjdHVyZSB0byBnZW0gaW5mb3JtYXRpb24uCisgKgorICogQGhhbmRsZTogYSBoYW5kbGUgdG8gZ2VtIG9iamVjdCBjcmVhdGVkLgorICogQGZsYWdzOiBmbGFnIHZhbHVlIGluY2x1ZGluZyBtZW1vcnkgdHlwZSBhbmQgY2FjaGUgYXR0cmlidXRlIGFuZAorICoJdGhpcyB2YWx1ZSB3b3VsZCBiZSBzZXQgYnkgZHJpdmVyLgorICogQHNpemU6IHNpemUgdG8gbWVtb3J5IHJlZ2lvbiBhbGxvY2F0ZWQgYnkgZ2VtIGFuZCB0aGlzIHNpemUgd291bGQKKyAqCWJlIHNldCBieSBkcml2ZXIuCisgKi8KK3N0cnVjdCBkcm1fZXh5bm9zX2dlbV9pbmZvIHsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlOworCXVuc2lnbmVkIGludCBmbGFnczsKKwl1aW50NjRfdCBzaXplOworfTsKKworLyoqCisgKiBBIHN0cnVjdHVyZSBmb3IgdXNlciBjb25uZWN0aW9uIHJlcXVlc3Qgb2YgdmlydHVhbCBkaXNwbGF5LgorICoKKyAqIEBjb25uZWN0aW9uOiBpbmRpY2F0ZSB3aGV0aGVyIGRvaW5nIGNvbm5ldGlvbiBvciBub3QgYnkgdXNlci4KKyAqIEBleHRlbnNpb25zOiBpZiB0aGlzIHZhbHVlIGlzIDEgdGhlbiB0aGUgdmlkaSBkcml2ZXIgd291bGQgbmVlZCBhZGRpdGlvbmFsCisgKgkxMjhieXRlcyBlZGlkIGRhdGEuCisgKiBAZWRpZDogdGhlIGVkaWQgZGF0YSBwb2ludGVyIGZyb20gdXNlciBzaWRlLgorICovCitzdHJ1Y3QgZHJtX2V4eW5vc192aWRpX2Nvbm5lY3Rpb24geworCXVuc2lnbmVkIGludCBjb25uZWN0aW9uOworCXVuc2lnbmVkIGludCBleHRlbnNpb25zOworCXVpbnQ2NF90IGVkaWQ7Cit9OworCisvKiBtZW1vcnkgdHlwZSBkZWZpbml0aW9ucy4gKi8KK2VudW0gZV9kcm1fZXh5bm9zX2dlbV9tZW1fdHlwZSB7CisJLyogUGh5c2ljYWxseSBDb250aW51b3VzIG1lbW9yeSBhbmQgdXNlZCBhcyBkZWZhdWx0LiAqLworCUVYWU5PU19CT19DT05USUcJPSAwIDw8IDAsCisJLyogUGh5c2ljYWxseSBOb24tQ29udGludW91cyBtZW1vcnkuICovCisJRVhZTk9TX0JPX05PTkNPTlRJRwk9IDEgPDwgMCwKKwkvKiBub24tY2FjaGFibGUgbWFwcGluZyBhbmQgdXNlZCBhcyBkZWZhdWx0LiAqLworCUVYWU5PU19CT19OT05DQUNIQUJMRQk9IDAgPDwgMSwKKwkvKiBjYWNoYWJsZSBtYXBwaW5nLiAqLworCUVYWU5PU19CT19DQUNIQUJMRQk9IDEgPDwgMSwKKwkvKiB3cml0ZS1jb21iaW5lIG1hcHBpbmcuICovCisJRVhZTk9TX0JPX1dDCQk9IDEgPDwgMiwKKwlFWFlOT1NfQk9fTUFTSwkJPSBFWFlOT1NfQk9fTk9OQ09OVElHIHwgRVhZTk9TX0JPX0NBQ0hBQkxFIHwKKwkJCQkJRVhZTk9TX0JPX1dDCit9OworCitzdHJ1Y3QgZHJtX2V4eW5vc19nMmRfZ2V0X3ZlciB7CisJX191MzIJbWFqb3I7CisJX191MzIJbWlub3I7Cit9OworCitzdHJ1Y3QgZHJtX2V4eW5vc19nMmRfY21kIHsKKwlfX3UzMglvZmZzZXQ7CisJX191MzIJZGF0YTsKK307CisKK2VudW0gZHJtX2V4eW5vc19nMmRfYnVmX3R5cGUgeworCUcyRF9CVUZfVVNFUlBUUiA9IDEgPDwgMzEsCit9OworCitlbnVtIGRybV9leHlub3NfZzJkX2V2ZW50X3R5cGUgeworCUcyRF9FVkVOVF9OT1QsCisJRzJEX0VWRU5UX05PTlNUT1AsCisJRzJEX0VWRU5UX1NUT1AsCQkvKiBub3QgeWV0ICovCit9OworCitzdHJ1Y3QgZHJtX2V4eW5vc19nMmRfdXNlcnB0ciB7CisJdW5zaWduZWQgbG9uZyB1c2VycHRyOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKK307CisKK3N0cnVjdCBkcm1fZXh5bm9zX2cyZF9zZXRfY21kbGlzdCB7CisJX191NjQJCQkJCWNtZDsKKwlfX3U2NAkJCQkJY21kX2J1ZjsKKwlfX3UzMgkJCQkJY21kX25yOworCV9fdTMyCQkJCQljbWRfYnVmX25yOworCisJLyogZm9yIGcyZCBldmVudCAqLworCV9fdTY0CQkJCQlldmVudF90eXBlOworCV9fdTY0CQkJCQl1c2VyX2RhdGE7Cit9OworCitzdHJ1Y3QgZHJtX2V4eW5vc19nMmRfZXhlYyB7CisJX191NjQJCQkJCWFzeW5jOworfTsKKworI2RlZmluZSBEUk1fRVhZTk9TX0dFTV9DUkVBVEUJCTB4MDAKKy8qIFJlc2VydmVkIDB4MDQgfiAweDA1IGZvciBleHlub3Mgc3BlY2lmaWMgZ2VtIGlvY3RsICovCisjZGVmaW5lIERSTV9FWFlOT1NfR0VNX0dFVAkJMHgwNAorI2RlZmluZSBEUk1fRVhZTk9TX1ZJRElfQ09OTkVDVElPTgkweDA3CisKKy8qIEcyRCAqLworI2RlZmluZSBEUk1fRVhZTk9TX0cyRF9HRVRfVkVSCQkweDIwCisjZGVmaW5lIERSTV9FWFlOT1NfRzJEX1NFVF9DTURMSVNUCTB4MjEKKyNkZWZpbmUgRFJNX0VYWU5PU19HMkRfRVhFQwkJMHgyMgorCisjZGVmaW5lIERSTV9JT0NUTF9FWFlOT1NfR0VNX0NSRUFURQkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIFwKKwkJRFJNX0VYWU5PU19HRU1fQ1JFQVRFLCBzdHJ1Y3QgZHJtX2V4eW5vc19nZW1fY3JlYXRlKQorCisjZGVmaW5lIERSTV9JT0NUTF9FWFlOT1NfR0VNX0dFVAlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgXAorCQlEUk1fRVhZTk9TX0dFTV9HRVQsCXN0cnVjdCBkcm1fZXh5bm9zX2dlbV9pbmZvKQorCisjZGVmaW5lIERSTV9JT0NUTF9FWFlOT1NfVklESV9DT05ORUNUSU9OCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBcCisJCURSTV9FWFlOT1NfVklESV9DT05ORUNUSU9OLCBzdHJ1Y3QgZHJtX2V4eW5vc192aWRpX2Nvbm5lY3Rpb24pCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0VYWU5PU19HMkRfR0VUX1ZFUgkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIFwKKwkJRFJNX0VYWU5PU19HMkRfR0VUX1ZFUiwgc3RydWN0IGRybV9leHlub3NfZzJkX2dldF92ZXIpCisjZGVmaW5lIERSTV9JT0NUTF9FWFlOT1NfRzJEX1NFVF9DTURMSVNUCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBcCisJCURSTV9FWFlOT1NfRzJEX1NFVF9DTURMSVNULCBzdHJ1Y3QgZHJtX2V4eW5vc19nMmRfc2V0X2NtZGxpc3QpCisjZGVmaW5lIERSTV9JT0NUTF9FWFlOT1NfRzJEX0VYRUMJCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBcCisJCURSTV9FWFlOT1NfRzJEX0VYRUMsIHN0cnVjdCBkcm1fZXh5bm9zX2cyZF9leGVjKQorCisvKiBFWFlOT1Mgc3BlY2lmaWMgZXZlbnRzICovCisjZGVmaW5lIERSTV9FWFlOT1NfRzJEX0VWRU5UCQkweDgwMDAwMDAwCisKK3N0cnVjdCBkcm1fZXh5bm9zX2cyZF9ldmVudCB7CisJc3RydWN0IGRybV9ldmVudAliYXNlOworCV9fdTY0CQkJCXVzZXJfZGF0YTsKKwlfX3UzMgkJCQl0dl9zZWM7CisJX191MzIJCQkJdHZfdXNlYzsKKwlfX3UzMgkJCQljbWRsaXN0X25vOworCV9fdTMyCQkJCXJlc2VydmVkOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3MvZXh5bm9zX2RybWlmLmggYi9leHlub3MvZXh5bm9zX2RybWlmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0NDM5YgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vcy9leHlub3NfZHJtaWYuaApAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgSW5raSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPgorICovCisKKyNpZm5kZWYgRVhZTk9TX0RSTUlGX0hfCisjZGVmaW5lIEVYWU5PU19EUk1JRl9IXworCisjaW5jbHVkZSA8eGY4NmRybS5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImV4eW5vc19kcm0uaCIKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgZXh5bm9zX2RldmljZSB7CisJaW50IGZkOworfTsKKworLyoKKyAqIEV4eW5vcyBCdWZmZXIgT2JqZWN0IHN0cnVjdHVyZS4KKyAqCisgKiBAZGV2OiBleHlub3MgZGV2aWNlIG9iamVjdCBhbGxvY2F0ZWQuCisgKiBAaGFuZGxlOiBhIGdlbSBoYW5kbGUgdG8gZ2VtIG9iamVjdCBjcmVhdGVkLgorICogQGZsYWdzOiBpbmRpY2F0ZSBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgY2FjaGUgYXR0cmlidXRlIHR5cGVzLgorICogQHNpemU6IHNpemUgdG8gdGhlIGJ1ZmZlciBjcmVhdGVkLgorICogQHZhZGRyOiB1c2VyIHNwYWNlIGFkZHJlc3MgdG8gYSBnZW0gYnVmZmVyIG1tYXBlZC4KKyAqIEBuYW1lOiBhIGdlbSBnbG9iYWwgaGFuZGxlIGZyb20gZmxpbmsgcmVxdWVzdC4KKyAqLworc3RydWN0IGV4eW5vc19ibyB7CisJc3RydWN0IGV4eW5vc19kZXZpY2UJKmRldjsKKwl1aW50MzJfdAkJaGFuZGxlOworCXVpbnQzMl90CQlmbGFnczsKKwlzaXplX3QJCQlzaXplOworCXZvaWQJCQkqdmFkZHI7CisJdWludDMyX3QJCW5hbWU7Cit9OworCisjZGVmaW5lIEVYWU5PU19FVkVOVF9DT05URVhUX1ZFUlNJT04gMQorCisvKgorICogRXh5bm9zIEV2ZW50IENvbnRleHQgc3RydWN0dXJlLgorICoKKyAqIEBiYXNlOiBiYXNlIGNvbnRleHQgKGZvciBjb3JlIGV2ZW50cykuCisgKiBAdmVyc2lvbjogdmVyc2lvbiBpbmZvIHNpbWlsYXIgdG8gdGhlIG9uZSBpbiAnZHJtRXZlbnRDb250ZXh0Jy4KKyAqIEBnMmRfZXZlbnRfaGFuZGxlcjogaGFuZGxlciBmb3IgRzJEIGV2ZW50cy4KKyAqLworc3RydWN0IGV4eW5vc19ldmVudF9jb250ZXh0IHsKKwlkcm1FdmVudENvbnRleHQgYmFzZTsKKworCWludCB2ZXJzaW9uOworCisJdm9pZCAoKmcyZF9ldmVudF9oYW5kbGVyKShpbnQgZmQsIHVuc2lnbmVkIGludCBjbWRsaXN0X25vLAorCQkJCQkJCSAgdW5zaWduZWQgaW50IHR2X3NlYywgdW5zaWduZWQgaW50IHR2X3VzZWMsCisJCQkJCQkJICB2b2lkICp1c2VyX2RhdGEpOworfTsKKworLyoKKyAqIGRldmljZSByZWxhdGVkIGZ1bmN0aW9uczoKKyAqLworc3RydWN0IGV4eW5vc19kZXZpY2UgKiBleHlub3NfZGV2aWNlX2NyZWF0ZShpbnQgZmQpOwordm9pZCBleHlub3NfZGV2aWNlX2Rlc3Ryb3koc3RydWN0IGV4eW5vc19kZXZpY2UgKmRldik7CisKKy8qCisgKiBidWZmZXItb2JqZWN0IHJlbGF0ZWQgZnVuY3Rpb25zOgorICovCitzdHJ1Y3QgZXh5bm9zX2JvICogZXh5bm9zX2JvX2NyZWF0ZShzdHJ1Y3QgZXh5bm9zX2RldmljZSAqZGV2LAorCQlzaXplX3Qgc2l6ZSwgdWludDMyX3QgZmxhZ3MpOworaW50IGV4eW5vc19ib19nZXRfaW5mbyhzdHJ1Y3QgZXh5bm9zX2RldmljZSAqZGV2LCB1aW50MzJfdCBoYW5kbGUsCisJCQlzaXplX3QgKnNpemUsIHVpbnQzMl90ICpmbGFncyk7Cit2b2lkIGV4eW5vc19ib19kZXN0cm95KHN0cnVjdCBleHlub3NfYm8gKmJvKTsKK3N0cnVjdCBleHlub3NfYm8gKiBleHlub3NfYm9fZnJvbV9uYW1lKHN0cnVjdCBleHlub3NfZGV2aWNlICpkZXYsIHVpbnQzMl90IG5hbWUpOworaW50IGV4eW5vc19ib19nZXRfbmFtZShzdHJ1Y3QgZXh5bm9zX2JvICpibywgdWludDMyX3QgKm5hbWUpOwordWludDMyX3QgZXh5bm9zX2JvX2hhbmRsZShzdHJ1Y3QgZXh5bm9zX2JvICpibyk7Cit2b2lkICogZXh5bm9zX2JvX21hcChzdHJ1Y3QgZXh5bm9zX2JvICpibyk7CitpbnQgZXh5bm9zX3ByaW1lX2hhbmRsZV90b19mZChzdHJ1Y3QgZXh5bm9zX2RldmljZSAqZGV2LCB1aW50MzJfdCBoYW5kbGUsCisJCQkJCWludCAqZmQpOworaW50IGV4eW5vc19wcmltZV9mZF90b19oYW5kbGUoc3RydWN0IGV4eW5vc19kZXZpY2UgKmRldiwgaW50IGZkLAorCQkJCQl1aW50MzJfdCAqaGFuZGxlKTsKKworLyoKKyAqIFZpcnR1YWwgRGlzcGxheSByZWxhdGVkIGZ1bmN0aW9uczoKKyAqLworaW50IGV4eW5vc192aWRpX2Nvbm5lY3Rpb24oc3RydWN0IGV4eW5vc19kZXZpY2UgKmRldiwgdWludDMyX3QgY29ubmVjdCwKKwkJCQl1aW50MzJfdCBleHQsIHZvaWQgKmVkaWQpOworCisvKgorICogZXZlbnQgaGFuZGxpbmcgcmVsYXRlZCBmdW5jdGlvbnM6CisgKi8KK2ludCBleHlub3NfaGFuZGxlX2V2ZW50KHN0cnVjdCBleHlub3NfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGV4eW5vc19ldmVudF9jb250ZXh0ICpjdHgpOworCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZiAvKiBFWFlOT1NfRFJNSUZfSF8gKi8KZGlmZiAtLWdpdCBhL2V4eW5vcy9leHlub3NfZmltZzJkLmMgYi9leHlub3MvZXh5bm9zX2ZpbWcyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMzQwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MvZXh5bm9zX2ZpbWcyZC5jCkBAIC0wLDAgKzEsMTAwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLkx0ZAorICogQXV0aG9yczoKKyAqCUlua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorCisjaW5jbHVkZSA8eGY4NmRybS5oPgorCisjaW5jbHVkZSAibGliZHJtX21hY3Jvcy5oIgorI2luY2x1ZGUgImV4eW5vc19kcm0uaCIKKyNpbmNsdWRlICJmaW1nMmRfcmVnLmgiCisjaW5jbHVkZSAiZXh5bm9zX2ZpbWcyZC5oIgorCisjZGVmaW5lCQlTRVRfQkYodmFsLCBzYywgc2ksIHNjc2EsIHNjZGEsIGRjLCBkaSwgZGNzYSwgZGNkYSkgXAorCQkJdmFsLmRhdGEuc3JjX2NvZWZmID0gc2M7CQlcCisJCQl2YWwuZGF0YS5pbnZfc3JjX2NvbG9yX2NvZWZmID0gc2k7CVwKKwkJCXZhbC5kYXRhLnNyY19jb2VmZl9zcmNfYSA9IHNjc2E7CVwKKwkJCXZhbC5kYXRhLnNyY19jb2VmZl9kc3RfYSA9IHNjZGE7CVwKKwkJCXZhbC5kYXRhLmRzdF9jb2VmZiA9IGRjOwkJXAorCQkJdmFsLmRhdGEuaW52X2RzdF9jb2xvcl9jb2VmZiA9IGRpOwlcCisJCQl2YWwuZGF0YS5kc3RfY29lZmZfc3JjX2EgPSBkY3NhOwlcCisJCQl2YWwuZGF0YS5kc3RfY29lZmZfZHN0X2EgPSBkY2RhOworCisjZGVmaW5lIE1JTihhLCBiKQkoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorCisjZGVmaW5lIE1TR19QUkVGSVggImV4eW5vcy9maW1nMmQ6ICIKKworI2RlZmluZSBHMkRfTUFYX0NNRF9OUgkJNjQKKyNkZWZpbmUgRzJEX01BWF9HRU1fQ01EX05SCTY0CisjZGVmaW5lIEcyRF9NQVhfQ01EX0xJU1RfTlIJNjQKKworc3RydWN0IGcyZF9jb250ZXh0IHsKKwlpbnQJCQkJZmQ7CisJdW5zaWduZWQgaW50CQkJbWFqb3I7CisJdW5zaWduZWQgaW50CQkJbWlub3I7CisJc3RydWN0IGRybV9leHlub3NfZzJkX2NtZAljbWRbRzJEX01BWF9DTURfTlJdOworCXN0cnVjdCBkcm1fZXh5bm9zX2cyZF9jbWQJY21kX2J1ZltHMkRfTUFYX0dFTV9DTURfTlJdOworCXVuc2lnbmVkIGludAkJCWNtZF9ucjsKKwl1bnNpZ25lZCBpbnQJCQljbWRfYnVmX25yOworCXVuc2lnbmVkIGludAkJCWNtZGxpc3RfbnI7CisJdm9pZAkJCQkqZXZlbnRfdXNlcmRhdGE7Cit9OworCitlbnVtIGcyZF9iYXNlX2FkZHJfcmVnIHsKKwlnMmRfZHN0ID0gMCwKKwlnMmRfc3JjCit9OworCitlbnVtIGVfZzJkX2Rpcl9tb2RlIHsKKwlHMkRfRElSX01PREVfUE9TSVRJVkUgPSAwLAorCUcyRF9ESVJfTU9ERV9ORUdBVElWRSA9IDEKK307CisKK3VuaW9uIGcyZF9kaXJlY3Rpb25fdmFsIHsKKwl1bnNpZ25lZCBpbnQgdmFsWzJdOworCXN0cnVjdCB7CisJCS8qIFNSQ19NU0tfRElSRUNUX1JFRyBbMDoxXSAoc291cmNlKSAqLworCQllbnVtIGVfZzJkX2Rpcl9tb2RlCQlzcmNfeF9kaXJlY3Rpb246MTsKKwkJZW51bSBlX2cyZF9kaXJfbW9kZQkJc3JjX3lfZGlyZWN0aW9uOjE7CisKKwkJLyogU1JDX01TS19ESVJFQ1RfUkVHIFsyOjNdICovCisJCXVuc2lnbmVkIGludAkJCXJldmVyc2VkMToyOworCisJCS8qIFNSQ19NU0tfRElSRUNUX1JFRyBbNDo1XSAobWFzaykgKi8KKwkJZW51bSBlX2cyZF9kaXJfbW9kZQkJbWFza194X2RpcmVjdGlvbjoxOworCQllbnVtIGVfZzJkX2Rpcl9tb2RlCQltYXNrX3lfZGlyZWN0aW9uOjE7CisKKwkJLyogU1JDX01TS19ESVJFQ1RfUkVHIFs2OjMxXSAqLworCQl1bnNpZ25lZCBpbnQJCQlwYWRkaW5nMToyNjsKKworCQkvKiBEU1RfUEFUX0RJUkVDVF9SRUcgWzA6MV0gKGRlc3RpbmF0aW9uKSAqLworCQllbnVtIGVfZzJkX2Rpcl9tb2RlCQlkc3RfeF9kaXJlY3Rpb246MTsKKwkJZW51bSBlX2cyZF9kaXJfbW9kZQkJZHN0X3lfZGlyZWN0aW9uOjE7CisKKwkJLyogRFNUX1BBVF9ESVJFQ1RfUkVHIFsyOjNdICovCisJCXVuc2lnbmVkIGludAkJCXJldmVyc2VkMjoyOworCisJCS8qIERTVF9QQVRfRElSRUNUX1JFRyBbNDo1XSAocGF0dGVybikgKi8KKwkJZW51bSBlX2cyZF9kaXJfbW9kZQkJcGF0X3hfZGlyZWN0aW9uOjE7CisJCWVudW0gZV9nMmRfZGlyX21vZGUJCXBhdF95X2RpcmVjdGlvbjoxOworCisJCS8qIERTVF9QQVRfRElSRUNUX1JFRyBbNjozMV0gKi8KKwkJdW5zaWduZWQgaW50CQkJcGFkZGluZzI6MjY7CisJfSBkYXRhOworfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBnMmRfZ2V0X3NjYWxpbmcodW5zaWduZWQgaW50IHNyYywgdW5zaWduZWQgaW50IGRzdCkKK3sKKwkvKgorCSAqIFRoZSBHMkQgaHcgc2NhbGluZyBmYWN0b3IgaXMgYSBub3JtYWxpemVkIGludmVyc2Ugb2YgdGhlIHNjYWxpbmcgZmFjdG9yLgorCSAqIEZvciBleGFtcGxlOiBXaGVuIHNvdXJjZSB3aWR0aCBpcyAxMDAgYW5kIGRlc3RpbmF0aW9uIHdpZHRoIGlzIDIwMAorCSAqIChzY2FsaW5nIG9mIDJ4KSwgdGhlbiB0aGUgaHcgZmFjdG9yIGlzIE5DICogMTAwIC8gMjAwLgorCSAqIFRoZSBub3JtYWxpemF0aW9uIGZhY3RvciAoTkMpIGlzIDJeMTYgPSAweDEwMDAwLgorCSAqLworCisJcmV0dXJuICgoc3JjIDw8IDE2KSAvIGRzdCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZzJkX2dldF9ibGVuZF9vcChlbnVtIGVfZzJkX29wIG9wKQoreworCXVuaW9uIGcyZF9ibGVuZF9mdW5jX3ZhbCB2YWw7CisKKwl2YWwudmFsID0gMDsKKworCS8qCisJICogVGhlIHN3aXRjaCBzdGF0ZW1lbnQgaXMgbWlzc2luZyB0aGUgZGVmYXVsdCBicmFuY2ggc2luY2UKKwkgKiB3ZSBhc3N1bWUgdGhhdCB0aGUgY2FsbGVyIGNoZWNrcyB0aGUgYmxlbmRpbmcgb3BlcmF0aW9uCisJICogdmlhIGcyZF92YWxpZGF0ZV9ibGVuZGluZ19vcCgpIGZpcnN0LgorCSAqLworCXN3aXRjaCAob3ApIHsKKwljYXNlIEcyRF9PUF9DTEVBUjoKKwljYXNlIEcyRF9PUF9ESVNKT0lOVF9DTEVBUjoKKwljYXNlIEcyRF9PUF9DT05KT0lOVF9DTEVBUjoKKwkJU0VUX0JGKHZhbCwgRzJEX0NPRUZGX01PREVfWkVSTywgMCwgMCwgMCwgRzJEX0NPRUZGX01PREVfWkVSTywKKwkJCQkwLCAwLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBHMkRfT1BfU1JDOgorCWNhc2UgRzJEX09QX0RJU0pPSU5UX1NSQzoKKwljYXNlIEcyRF9PUF9DT05KT0lOVF9TUkM6CisJCVNFVF9CRih2YWwsIEcyRF9DT0VGRl9NT0RFX09ORSwgMCwgMCwgMCwgRzJEX0NPRUZGX01PREVfWkVSTywKKwkJCQkwLCAwLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBHMkRfT1BfRFNUOgorCWNhc2UgRzJEX09QX0RJU0pPSU5UX0RTVDoKKwljYXNlIEcyRF9PUF9DT05KT0lOVF9EU1Q6CisJCVNFVF9CRih2YWwsIEcyRF9DT0VGRl9NT0RFX1pFUk8sIDAsIDAsIDAsIEcyRF9DT0VGRl9NT0RFX09ORSwKKwkJCQkwLCAwLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBHMkRfT1BfT1ZFUjoKKwkJU0VUX0JGKHZhbCwgRzJEX0NPRUZGX01PREVfT05FLCAwLCAwLCAwLAorCQkJCUcyRF9DT0VGRl9NT0RFX1NSQ19BTFBIQSwgMSwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgRzJEX09QX0lOVEVSUE9MQVRFOgorCQlTRVRfQkYodmFsLCBHMkRfQ09FRkZfTU9ERV9TUkNfQUxQSEEsIDAsIDAsIDAsCisJCQkJRzJEX0NPRUZGX01PREVfU1JDX0FMUEhBLCAxLCAwLCAwKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHZhbC52YWw7Cit9CisKKy8qCisgKiBnMmRfY2hlY2tfc3BhY2UgLSBjaGVjayBpZiBjb21tYW5kIGJ1ZmZlcnMgaGF2ZSBlbm91Z2ggc3BhY2UgbGVmdC4KKyAqCisgKiBAY3R4OiBhIHBvaW50ZXIgdG8gZzJkX2NvbnRleHQgc3RydWN0dXJlLgorICogQG51bV9jbWRzOiBudW1iZXIgb2YgKHJlZ3VsYXIpIGNvbW1hbmRzLgorICogQG51bV9nZW1fY21kczogbnVtYmVyIG9mIEdFTSBjb21tYW5kcy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBnMmRfY2hlY2tfc3BhY2UoY29uc3Qgc3RydWN0IGcyZF9jb250ZXh0ICpjdHgsCisJdW5zaWduZWQgaW50IG51bV9jbWRzLCB1bnNpZ25lZCBpbnQgbnVtX2dlbV9jbWRzKQoreworCWlmIChjdHgtPmNtZF9uciArIG51bV9jbWRzID49IEcyRF9NQVhfQ01EX05SIHx8CisJICAgIGN0eC0+Y21kX2J1Zl9uciArIG51bV9nZW1fY21kcyA+PSBHMkRfTUFYX0dFTV9DTURfTlIpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBnMmRfdmFsaWRhdGVfc2VsZWN0X21vZGUgLSB2YWxpZGF0ZSBzZWxlY3QgbW9kZS4KKyAqCisgKiBAbW9kZTogdGhlIG1vZGUgdG8gdmFsaWRhdGUKKyAqCisgKiBSZXR1cm5zIHplcm8gZm9yIGFuIGludmFsaWQgbW9kZSBhbmQgb25lIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBnMmRfdmFsaWRhdGVfc2VsZWN0X21vZGUoCisJZW51bSBlX2cyZF9zZWxlY3RfbW9kZSBtb2RlKQoreworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgRzJEX1NFTEVDVF9NT0RFX05PUk1BTDoKKwljYXNlIEcyRF9TRUxFQ1RfTU9ERV9GR0NPTE9SOgorCWNhc2UgRzJEX1NFTEVDVF9NT0RFX0JHQ09MT1I6CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogZzJkX3ZhbGlkYXRlX2JsZW5kaW5nX29wIC0gdmFsaWRhdGUgYmxlbmRpbmcgb3BlcmF0aW9uLgorICoKKyAqIEBvcGVyYXRpb246IHRoZSBvcGVyYXRpb24gdG8gdmFsaWRhdGUKKyAqCisgKiBSZXR1cm5zIHplcm8gZm9yIGFuIGludmFsaWQgbW9kZSBhbmQgb25lIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBnMmRfdmFsaWRhdGVfYmxlbmRpbmdfb3AoCisJZW51bSBlX2cyZF9vcCBvcGVyYXRpb24pCit7CisJc3dpdGNoIChvcGVyYXRpb24pIHsKKwljYXNlIEcyRF9PUF9DTEVBUjoKKwljYXNlIEcyRF9PUF9TUkM6CisJY2FzZSBHMkRfT1BfRFNUOgorCWNhc2UgRzJEX09QX09WRVI6CisJY2FzZSBHMkRfT1BfSU5URVJQT0xBVEU6CisJY2FzZSBHMkRfT1BfRElTSk9JTlRfQ0xFQVI6CisJY2FzZSBHMkRfT1BfRElTSk9JTlRfU1JDOgorCWNhc2UgRzJEX09QX0RJU0pPSU5UX0RTVDoKKwljYXNlIEcyRF9PUF9DT05KT0lOVF9DTEVBUjoKKwljYXNlIEcyRF9PUF9DT05KT0lOVF9TUkM6CisJY2FzZSBHMkRfT1BfQ09OSk9JTlRfRFNUOgorCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGcyZF9hZGRfY21kIC0gc2V0IGdpdmVuIGNvbW1hbmQgYW5kIHZhbHVlIHRvIHVzZXIgc2lkZSBjb21tYW5kIGJ1ZmZlci4KKyAqCisgKiBAY3R4OiBhIHBvaW50ZXIgdG8gZzJkX2NvbnRleHQgc3RydWN0dXJlLgorICogQGNtZDogY29tbWFuZCBkYXRhLgorICogQHZhbHVlOiB2YWx1ZSBkYXRhLgorICoKKyAqIFRoZSBjYWxsZXIgaGFzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb21tYW5kcyBidWZmZXJzIGhhdmUgZW5vdWdoIHNwYWNlCisgKiBsZWZ0IHRvIGhvbGQgdGhlIGNvbW1hbmQuIFVzZSBnMmRfY2hlY2tfc3BhY2UoKSB0byBlbnN1cmUgdGhpcy4KKyAqLworc3RhdGljIHZvaWQgZzJkX2FkZF9jbWQoc3RydWN0IGcyZF9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGxvbmcgY21kLAorCQkJdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKwlzd2l0Y2ggKGNtZCAmIH4oRzJEX0JVRl9VU0VSUFRSKSkgeworCWNhc2UgU1JDX0JBU0VfQUREUl9SRUc6CisJY2FzZSBTUkNfUExBTkUyX0JBU0VfQUREUl9SRUc6CisJY2FzZSBEU1RfQkFTRV9BRERSX1JFRzoKKwljYXNlIERTVF9QTEFORTJfQkFTRV9BRERSX1JFRzoKKwljYXNlIFBBVF9CQVNFX0FERFJfUkVHOgorCWNhc2UgTUFTS19CQVNFX0FERFJfUkVHOgorCQlhc3NlcnQoY3R4LT5jbWRfYnVmX25yIDwgRzJEX01BWF9HRU1fQ01EX05SKTsKKworCQljdHgtPmNtZF9idWZbY3R4LT5jbWRfYnVmX25yXS5vZmZzZXQgPSBjbWQ7CisJCWN0eC0+Y21kX2J1ZltjdHgtPmNtZF9idWZfbnJdLmRhdGEgPSB2YWx1ZTsKKwkJY3R4LT5jbWRfYnVmX25yKys7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFzc2VydChjdHgtPmNtZF9uciA8IEcyRF9NQVhfQ01EX05SKTsKKworCQljdHgtPmNtZFtjdHgtPmNtZF9ucl0ub2Zmc2V0ID0gY21kOworCQljdHgtPmNtZFtjdHgtPmNtZF9ucl0uZGF0YSA9IHZhbHVlOworCQljdHgtPmNtZF9ucisrOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBnMmRfYWRkX2Jhc2VfYWRkciAtIGhlbHBlciBmdW5jdGlvbiB0byBzZXQgZHN0L3NyYyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIuCisgKgorICogQGN0eDogYSBwb2ludGVyIHRvIGcyZF9jb250ZXh0IHN0cnVjdHVyZS4KKyAqIEBpbWc6IGEgcG9pbnRlciB0byB0aGUgZHN0L3NyYyBnMmRfaW1hZ2Ugc3RydWN0dXJlLgorICogQHJlZzogdGhlIHJlZ2lzdGVyIHRoYXQgc2hvdWxkIGJlIHNldC4KKyAqLworc3RhdGljIHZvaWQgZzJkX2FkZF9iYXNlX2FkZHIoc3RydWN0IGcyZF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnMmRfaW1hZ2UgKmltZywKKwkJCWVudW0gZzJkX2Jhc2VfYWRkcl9yZWcgcmVnKQoreworCWNvbnN0IHVuc2lnbmVkIGxvbmcgY21kID0gKHJlZyA9PSBnMmRfZHN0KSA/CisJCURTVF9CQVNFX0FERFJfUkVHIDogU1JDX0JBU0VfQUREUl9SRUc7CisKKwlpZiAoaW1nLT5idWZfdHlwZSA9PSBHMkRfSU1HQlVGX1VTRVJQVFIpCisJCWcyZF9hZGRfY21kKGN0eCwgY21kIHwgRzJEX0JVRl9VU0VSUFRSLAorCQkJCSh1bnNpZ25lZCBsb25nKSZpbWctPnVzZXJfcHRyWzBdKTsKKwllbHNlCisJCWcyZF9hZGRfY21kKGN0eCwgY21kLCBpbWctPmJvWzBdKTsKK30KKworLyoKKyAqIGcyZF9zZXRfZGlyZWN0aW9uIC0gc2V0dXAgZGlyZWN0aW9uIHJlZ2lzdGVyICh1c2VmdWwgZm9yIG92ZXJsYXBwaW5nIGJsaXRzKS4KKyAqCisgKiBAY3R4OiBhIHBvaW50ZXIgdG8gZzJkX2NvbnRleHQgc3RydWN0dXJlLgorICogQGRpcjogYSBwb2ludGVyIHRvIHRoZSBnMmRfZGlyZWN0aW9uX3ZhbCBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkIGcyZF9zZXRfZGlyZWN0aW9uKHN0cnVjdCBnMmRfY29udGV4dCAqY3R4LAorCQkJY29uc3QgdW5pb24gZzJkX2RpcmVjdGlvbl92YWwgKmRpcikKK3sKKwlnMmRfYWRkX2NtZChjdHgsIFNSQ19NQVNLX0RJUkVDVF9SRUcsIGRpci0+dmFsWzBdKTsKKwlnMmRfYWRkX2NtZChjdHgsIERTVF9QQVRfRElSRUNUX1JFRywgZGlyLT52YWxbMV0pOworfQorCisvKgorICogZzJkX2ZsdXNoIC0gc3VibWl0IGFsbCBjb21tYW5kcyBhbmQgdmFsdWVzIGluIHVzZXIgc2lkZSBjb21tYW5kIGJ1ZmZlcgorICoJCXRvIGNvbW1hbmQgcXVldWUgYXdhcmUgb2YgZmltZzJkIGRtYS4KKyAqCisgKiBAY3R4OiBhIHBvaW50ZXIgdG8gZzJkX2NvbnRleHQgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBhbGwgY29tbWFuZHMgYW5kIHZhbHVlcyB0byB1c2VyCisgKiBzaWRlIGNvbW1hbmQgYnVmZmVyIGFyZSBzZXQuIEl0IHN1Ym1pdHMgdGhhdCBidWZmZXIgdG8gdGhlIGtlcm5lbCBzaWRlIGRyaXZlci4KKyAqLworc3RhdGljIGludCBnMmRfZmx1c2goc3RydWN0IGcyZF9jb250ZXh0ICpjdHgpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZHJtX2V4eW5vc19nMmRfc2V0X2NtZGxpc3QgY21kbGlzdCA9IHswfTsKKworCWlmIChjdHgtPmNtZF9uciA9PSAwICYmIGN0eC0+Y21kX2J1Zl9uciA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChjdHgtPmNtZGxpc3RfbnIgPj0gRzJEX01BWF9DTURfTElTVF9OUikgeworCQlmcHJpbnRmKHN0ZGVyciwgTVNHX1BSRUZJWCAiY29tbWFuZCBsaXN0IG92ZXJmbG93LlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNtZGxpc3QuY21kID0gKHVpbnQ2NF90KSh1aW50cHRyX3QpJmN0eC0+Y21kWzBdOworCWNtZGxpc3QuY21kX2J1ZiA9ICh1aW50NjRfdCkodWludHB0cl90KSZjdHgtPmNtZF9idWZbMF07CisJY21kbGlzdC5jbWRfbnIgPSBjdHgtPmNtZF9ucjsKKwljbWRsaXN0LmNtZF9idWZfbnIgPSBjdHgtPmNtZF9idWZfbnI7CisKKwlpZiAoY3R4LT5ldmVudF91c2VyZGF0YSkgeworCQljbWRsaXN0LmV2ZW50X3R5cGUgPSBHMkRfRVZFTlRfTk9OU1RPUDsKKwkJY21kbGlzdC51c2VyX2RhdGEgPSAodWludDY0X3QpKHVpbnRwdHJfdCkoY3R4LT5ldmVudF91c2VyZGF0YSk7CisJCWN0eC0+ZXZlbnRfdXNlcmRhdGEgPSBOVUxMOworCX0gZWxzZSB7CisJCWNtZGxpc3QuZXZlbnRfdHlwZSA9IEcyRF9FVkVOVF9OT1Q7CisJCWNtZGxpc3QudXNlcl9kYXRhID0gMDsKKwl9CisKKwljdHgtPmNtZF9uciA9IDA7CisJY3R4LT5jbWRfYnVmX25yID0gMDsKKworCXJldCA9IGRybUlvY3RsKGN0eC0+ZmQsIERSTV9JT0NUTF9FWFlOT1NfRzJEX1NFVF9DTURMSVNULCAmY21kbGlzdCk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsIE1TR19QUkVGSVggImZhaWxlZCB0byBzZXQgY21kbGlzdC5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWN0eC0+Y21kbGlzdF9ucisrOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBnMmRfaW5pdCAtIGNyZWF0ZSBhIG5ldyBnMmQgY29udGV4dCBhbmQgZ2V0IGhhcmR3YXJlIHZlcnNpb24uCisgKgorICogZmQ6IGEgZmlsZSBkZXNjcmlwdG9yIHRvIGFuIG9wZW5lZCBkcm0gZGV2aWNlLgorICovCitzdHJ1Y3QgZzJkX2NvbnRleHQgKmcyZF9pbml0KGludCBmZCkKK3sKKwlzdHJ1Y3QgZHJtX2V4eW5vc19nMmRfZ2V0X3ZlciB2ZXI7CisJc3RydWN0IGcyZF9jb250ZXh0ICpjdHg7CisJaW50IHJldDsKKworCWN0eCA9IGNhbGxvYygxLCBzaXplb2YoKmN0eCkpOworCWlmICghY3R4KSB7CisJCWZwcmludGYoc3RkZXJyLCBNU0dfUFJFRklYICJmYWlsZWQgdG8gYWxsb2NhdGUgY29udGV4dC5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljdHgtPmZkID0gZmQ7CisKKwlyZXQgPSBkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0VYWU5PU19HMkRfR0VUX1ZFUiwgJnZlcik7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsIE1TR19QUkVGSVggImZhaWxlZCB0byBnZXQgdmVyc2lvbi5cbiIpOworCQlmcmVlKGN0eCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWN0eC0+bWFqb3IgPSB2ZXIubWFqb3I7CisJY3R4LT5taW5vciA9IHZlci5taW5vcjsKKworCXByaW50ZihNU0dfUFJFRklYICJHMkQgdmVyc2lvbiAoJWQuJWQpLlxuIiwgY3R4LT5tYWpvciwgY3R4LT5taW5vcik7CisJcmV0dXJuIGN0eDsKK30KKwordm9pZCBnMmRfZmluaShzdHJ1Y3QgZzJkX2NvbnRleHQgKmN0eCkKK3sKKwlmcmVlKGN0eCk7Cit9CisKKy8qKgorICogZzJkX2NvbmZpZ19ldmVudCAtIHNldHVwIHVzZXJkYXRhIGNvbmZpZ3VyYXRpb24gZm9yIGEgZzJkIGV2ZW50LgorICoJCVRoZSBuZXh0IGludm9jYXRpb24gb2YgYSBnMmQgY2FsbCAoZS5nLiBnMmRfc29saWRfZmlsbCkgaXMKKyAqCQl0aGVuIGdvaW5nIHRvIGZsYWcgdGhlIGNvbW1hbmQgYnVmZmVyIGFzICdub25zdG9wJy4KKyAqCQlDb21wbGV0aW9uIG9mIHRoZSBjb21tYW5kIGJ1ZmZlciBleGVjdXRpb24gY2FuIHRoZW4gYmUKKyAqCQlkZXRlcm1pbmVkIGJ5IHVzaW5nIGRybUhhbmRsZUV2ZW50IG9uIHRoZSBEUk0gZmQuCisgKgkJVGhlIHVzZXJkYXRhIGlzICdjb25zdW1lZCcgaW4gdGhlIHByb2Nlc3MuCisgKgorICogQGN0eDogYSBwb2ludGVyIHRvIGcyZF9jb250ZXh0IHN0cnVjdHVyZS4KKyAqIEB1c2VyZGF0YTogYSBwb2ludGVyIHRvIHRoZSB1c2VyIGRhdGEKKyAqLwordm9pZCBnMmRfY29uZmlnX2V2ZW50KHN0cnVjdCBnMmRfY29udGV4dCAqY3R4LCB2b2lkICp1c2VyZGF0YSkKK3sKKwljdHgtPmV2ZW50X3VzZXJkYXRhID0gdXNlcmRhdGE7Cit9CisKKy8qKgorICogZzJkX2V4ZWMgLSBzdGFydCB0aGUgZG1hIHRvIHByb2Nlc3MgYWxsIGNvbW1hbmRzIHN1bW1pdGVkIGJ5IGcyZF9mbHVzaCgpLgorICoKKyAqIEBjdHg6IGEgcG9pbnRlciB0byBnMmRfY29udGV4dCBzdHJ1Y3R1cmUuCisgKi8KK2ludCBnMmRfZXhlYyhzdHJ1Y3QgZzJkX2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3QgZHJtX2V4eW5vc19nMmRfZXhlYyBleGVjOworCWludCByZXQ7CisKKwlpZiAoY3R4LT5jbWRsaXN0X25yID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZXhlYy5hc3luYyA9IDA7CisKKwlyZXQgPSBkcm1Jb2N0bChjdHgtPmZkLCBEUk1fSU9DVExfRVhZTk9TX0cyRF9FWEVDLCAmZXhlYyk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsIE1TR19QUkVGSVggImZhaWxlZCB0byBleGVjdXRlLlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJY3R4LT5jbWRsaXN0X25yID0gMDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZzJkX3NvbGlkX2ZpbGwgLSBmaWxsIGdpdmVuIGJ1ZmZlciB3aXRoIGdpdmVuIGNvbG9yIGRhdGEuCisgKgorICogQGN0eDogYSBwb2ludGVyIHRvIGcyZF9jb250ZXh0IHN0cnVjdHVyZS4KKyAqIEBpbWc6IGEgcG9pbnRlciB0byBnMmRfaW1hZ2Ugc3RydWN0dXJlIGluY2x1ZGluZyBpbWFnZSBhbmQgYnVmZmVyCisgKglpbmZvcm1hdGlvbi4KKyAqIEB4OiB4IHN0YXJ0IHBvc2l0aW9uIHRvIGJ1ZmZlciBmaWxsZWQgd2l0aCBnaXZlbiBjb2xvciBkYXRhLgorICogQHk6IHkgc3RhcnQgcG9zaXRpb24gdG8gYnVmZmVyIGZpbGxlZCB3aXRoIGdpdmVuIGNvbG9yIGRhdGEuCisgKiBAdzogd2lkdGggdmFsdWUgdG8gYnVmZmVyIGZpbGxlZCB3aXRoIGdpdmVuIGNvbG9yIGRhdGEuCisgKiBAaDogaGVpZ2h0IHZhbHVlIHRvIGJ1ZmZlciBmaWxsZWQgd2l0aCBnaXZlbiBjb2xvciBkYXRhLgorICovCitpbnQKK2cyZF9zb2xpZF9maWxsKHN0cnVjdCBnMmRfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZzJkX2ltYWdlICppbWcsCisJCQl1bnNpZ25lZCBpbnQgeCwgdW5zaWduZWQgaW50IHksIHVuc2lnbmVkIGludCB3LAorCQkJdW5zaWduZWQgaW50IGgpCit7CisJdW5pb24gZzJkX2JpdGJsdF9jbWRfdmFsIGJpdGJsdDsKKwl1bmlvbiBnMmRfcG9pbnRfdmFsIHB0OworCisJaWYgKGcyZF9jaGVja19zcGFjZShjdHgsIDcsIDEpKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWcyZF9hZGRfY21kKGN0eCwgRFNUX1NFTEVDVF9SRUcsIEcyRF9TRUxFQ1RfTU9ERV9OT1JNQUwpOworCWcyZF9hZGRfY21kKGN0eCwgRFNUX0NPTE9SX01PREVfUkVHLCBpbWctPmNvbG9yX21vZGUpOworCWcyZF9hZGRfYmFzZV9hZGRyKGN0eCwgaW1nLCBnMmRfZHN0KTsKKwlnMmRfYWRkX2NtZChjdHgsIERTVF9TVFJJREVfUkVHLCBpbWctPnN0cmlkZSk7CisKKwlpZiAoeCArIHcgPiBpbWctPndpZHRoKQorCQl3ID0gaW1nLT53aWR0aCAtIHg7CisJaWYgKHkgKyBoID4gaW1nLT5oZWlnaHQpCisJCWggPSBpbWctPmhlaWdodCAtIHk7CisKKwlwdC5kYXRhLnggPSB4OworCXB0LmRhdGEueSA9IHk7CisJZzJkX2FkZF9jbWQoY3R4LCBEU1RfTEVGVF9UT1BfUkVHLCBwdC52YWwpOworCisJcHQuZGF0YS54ID0geCArIHc7CisJcHQuZGF0YS55ID0geSArIGg7CisJZzJkX2FkZF9jbWQoY3R4LCBEU1RfUklHSFRfQk9UVE9NX1JFRywgcHQudmFsKTsKKworCWcyZF9hZGRfY21kKGN0eCwgU0ZfQ09MT1JfUkVHLCBpbWctPmNvbG9yKTsKKworCWJpdGJsdC52YWwgPSAwOworCWJpdGJsdC5kYXRhLmZhc3Rfc29saWRfY29sb3JfZmlsbF9lbiA9IDE7CisJZzJkX2FkZF9jbWQoY3R4LCBCSVRCTFRfQ09NTUFORF9SRUcsIGJpdGJsdC52YWwpOworCisJcmV0dXJuIGcyZF9mbHVzaChjdHgpOworfQorCisvKioKKyAqIGcyZF9jb3B5IC0gY29weSBjb250ZW50cyBpbiBzb3VyY2UgYnVmZmVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAqCisgKiBAY3R4OiBhIHBvaW50ZXIgdG8gZzJkX2NvbnRleHQgc3RydWN0dXJlLgorICogQHNyYzogYSBwb2ludGVyIHRvIGcyZF9pbWFnZSBzdHJ1Y3R1cmUgaW5jbHVkaW5nIGltYWdlIGFuZCBidWZmZXIKKyAqCWluZm9ybWF0aW9uIHRvIHNvdXJjZS4KKyAqIEBkc3Q6IGEgcG9pbnRlciB0byBnMmRfaW1hZ2Ugc3RydWN0dXJlIGluY2x1ZGluZyBpbWFnZSBhbmQgYnVmZmVyCisgKglpbmZvcm1hdGlvbiB0byBkZXN0aW5hdGlvbi4KKyAqIEBzcmNfeDogeCBzdGFydCBwb3NpdGlvbiB0byBzb3VyY2UgYnVmZmVyLgorICogQHNyY195OiB5IHN0YXJ0IHBvc2l0aW9uIHRvIHNvdXJjZSBidWZmZXIuCisgKiBAZHN0X3g6IHggc3RhcnQgcG9zaXRpb24gdG8gZGVzdGluYXRpb24gYnVmZmVyLgorICogQGRzdF95OiB5IHN0YXJ0IHBvc2l0aW9uIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAqIEB3OiB3aWR0aCB2YWx1ZSB0byBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJ1ZmZlcnMuCisgKiBAaDogaGVpZ2h0IHZhbHVlIHRvIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYnVmZmVycy4KKyAqLworaW50CitnMmRfY29weShzdHJ1Y3QgZzJkX2NvbnRleHQgKmN0eCwgc3RydWN0IGcyZF9pbWFnZSAqc3JjLAorCQlzdHJ1Y3QgZzJkX2ltYWdlICpkc3QsIHVuc2lnbmVkIGludCBzcmNfeCwgdW5zaWduZWQgaW50IHNyY195LAorCQl1bnNpZ25lZCBpbnQgZHN0X3gsIHVuc2lnbmVkIGRzdF95LCB1bnNpZ25lZCBpbnQgdywKKwkJdW5zaWduZWQgaW50IGgpCit7CisJdW5pb24gZzJkX3JvcDRfdmFsIHJvcDQ7CisJdW5pb24gZzJkX3BvaW50X3ZhbCBwdDsKKwl1bnNpZ25lZCBpbnQgc3JjX3csIHNyY19oLCBkc3RfdywgZHN0X2g7CisKKwlzcmNfdyA9IHc7CisJc3JjX2ggPSBoOworCWlmIChzcmNfeCArIHNyYy0+d2lkdGggPiB3KQorCQlzcmNfdyA9IHNyYy0+d2lkdGggLSBzcmNfeDsKKwlpZiAoc3JjX3kgKyBzcmMtPmhlaWdodCA+IGgpCisJCXNyY19oID0gc3JjLT5oZWlnaHQgLSBzcmNfeTsKKworCWRzdF93ID0gdzsKKwlkc3RfaCA9IHc7CisJaWYgKGRzdF94ICsgZHN0LT53aWR0aCA+IHcpCisJCWRzdF93ID0gZHN0LT53aWR0aCAtIGRzdF94OworCWlmIChkc3RfeSArIGRzdC0+aGVpZ2h0ID4gaCkKKwkJZHN0X2ggPSBkc3QtPmhlaWdodCAtIGRzdF95OworCisJdyA9IE1JTihzcmNfdywgZHN0X3cpOworCWggPSBNSU4oc3JjX2gsIGRzdF9oKTsKKworCWlmICh3IDw9IDAgfHwgaCA8PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCBNU0dfUFJFRklYICJpbnZhbGlkIHdpZHRoIG9yIGhlaWdodC5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZzJkX2NoZWNrX3NwYWNlKGN0eCwgMTEsIDIpKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWcyZF9hZGRfY21kKGN0eCwgRFNUX1NFTEVDVF9SRUcsIEcyRF9TRUxFQ1RfTU9ERV9CR0NPTE9SKTsKKwlnMmRfYWRkX2NtZChjdHgsIERTVF9DT0xPUl9NT0RFX1JFRywgZHN0LT5jb2xvcl9tb2RlKTsKKwlnMmRfYWRkX2Jhc2VfYWRkcihjdHgsIGRzdCwgZzJkX2RzdCk7CisJZzJkX2FkZF9jbWQoY3R4LCBEU1RfU1RSSURFX1JFRywgZHN0LT5zdHJpZGUpOworCisJZzJkX2FkZF9jbWQoY3R4LCBTUkNfU0VMRUNUX1JFRywgRzJEX1NFTEVDVF9NT0RFX05PUk1BTCk7CisJZzJkX2FkZF9jbWQoY3R4LCBTUkNfQ09MT1JfTU9ERV9SRUcsIHNyYy0+Y29sb3JfbW9kZSk7CisJZzJkX2FkZF9iYXNlX2FkZHIoY3R4LCBzcmMsIGcyZF9zcmMpOworCWcyZF9hZGRfY21kKGN0eCwgU1JDX1NUUklERV9SRUcsIHNyYy0+c3RyaWRlKTsKKworCXB0LmRhdGEueCA9IHNyY194OworCXB0LmRhdGEueSA9IHNyY195OworCWcyZF9hZGRfY21kKGN0eCwgU1JDX0xFRlRfVE9QX1JFRywgcHQudmFsKTsKKwlwdC5kYXRhLnggPSBzcmNfeCArIHc7CisJcHQuZGF0YS55ID0gc3JjX3kgKyBoOworCWcyZF9hZGRfY21kKGN0eCwgU1JDX1JJR0hUX0JPVFRPTV9SRUcsIHB0LnZhbCk7CisKKwlwdC5kYXRhLnggPSBkc3RfeDsKKwlwdC5kYXRhLnkgPSBkc3RfeTsKKwlnMmRfYWRkX2NtZChjdHgsIERTVF9MRUZUX1RPUF9SRUcsIHB0LnZhbCk7CisJcHQuZGF0YS54ID0gZHN0X3ggKyB3OworCXB0LmRhdGEueSA9IGRzdF95ICsgaDsKKwlnMmRfYWRkX2NtZChjdHgsIERTVF9SSUdIVF9CT1RUT01fUkVHLCBwdC52YWwpOworCisJcm9wNC52YWwgPSAwOworCXJvcDQuZGF0YS51bm1hc2tlZF9yb3AzID0gRzJEX1JPUDNfU1JDOworCWcyZF9hZGRfY21kKGN0eCwgUk9QNF9SRUcsIHJvcDQudmFsKTsKKworCXJldHVybiBnMmRfZmx1c2goY3R4KTsKK30KKworLyoqCisgKiBnMmRfbW92ZSAtIGNvcHkgY29udGVudCBpbnNpZGUgc2luZ2xlIGJ1ZmZlci4KKyAqCVNpbWlsYXIgdG8gbGliYydzIG1lbW1vdmUoKSB0aGlzIGNvcGllcyBhIHJlY3Rhbmd1bGFyCisgKglyZWdpb24gb2YgdGhlIHByb3ZpZGVkIGJ1ZmZlciB0byBhbm90aGVyIGxvY2F0aW9uLCB3aGlsZQorICoJcHJvcGVybHkgaGFuZGxpbmcgdGhlIHNpdHVhdGlvbiB3aGVyZSBzb3VyY2UgYW5kCisgKglkZXN0aW5hdGlvbiByZWN0YW5nbGUgb3ZlcmxhcC4KKyAqCisgKiBAY3R4OiBhIHBvaW50ZXIgdG8gZzJkX2NvbnRleHQgc3RydWN0dXJlLgorICogQGltZzogYSBwb2ludGVyIHRvIGcyZF9pbWFnZSBzdHJ1Y3R1cmUgcHJvdmlkaW5nCisgKglidWZmZXIgaW5mb3JtYXRpb24uCisgKiBAc3JjX3g6IHggcG9zaXRpb24gb2Ygc291cmNlIHJlY3RhbmdsZS4KKyAqIEBzcmNfeTogeSBwb3NpdGlvbiBvZiBzb3VyY2UgcmVjdGFuZ2xlLgorICogQGRzdF94OiB4IHBvc2l0aW9uIG9mIGRlc3RpbmF0aW9uIHJlY3RhbmdsZS4KKyAqIEBkc3RfeTogeSBwb3NpdGlvbiBvZiBkZXN0aW5hdGlvbiByZWN0YW5nbGUuCisgKiBAdzogd2lkdGggb2YgcmVjdGFuZ2xlIHRvIG1vdmUuCisgKiBAaDogaGVpZ2h0IG9mIHJlY3RhbmdsZSB0byBtb3ZlLgorICovCitpbnQKK2cyZF9tb3ZlKHN0cnVjdCBnMmRfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZzJkX2ltYWdlICppbWcsCisJCXVuc2lnbmVkIGludCBzcmNfeCwgdW5zaWduZWQgaW50IHNyY195LAorCQl1bnNpZ25lZCBpbnQgZHN0X3gsIHVuc2lnbmVkIGRzdF95LCB1bnNpZ25lZCBpbnQgdywKKwkJdW5zaWduZWQgaW50IGgpCit7CisJdW5pb24gZzJkX3JvcDRfdmFsIHJvcDQ7CisJdW5pb24gZzJkX3BvaW50X3ZhbCBwdDsKKwl1bmlvbiBnMmRfZGlyZWN0aW9uX3ZhbCBkaXI7CisJdW5zaWduZWQgaW50IHNyY193LCBzcmNfaCwgZHN0X3csIGRzdF9oOworCisJc3JjX3cgPSB3OworCXNyY19oID0gaDsKKwlpZiAoc3JjX3ggKyBpbWctPndpZHRoID4gdykKKwkJc3JjX3cgPSBpbWctPndpZHRoIC0gc3JjX3g7CisJaWYgKHNyY195ICsgaW1nLT5oZWlnaHQgPiBoKQorCQlzcmNfaCA9IGltZy0+aGVpZ2h0IC0gc3JjX3k7CisKKwlkc3RfdyA9IHc7CisJZHN0X2ggPSB3OworCWlmIChkc3RfeCArIGltZy0+d2lkdGggPiB3KQorCQlkc3RfdyA9IGltZy0+d2lkdGggLSBkc3RfeDsKKwlpZiAoZHN0X3kgKyBpbWctPmhlaWdodCA+IGgpCisJCWRzdF9oID0gaW1nLT5oZWlnaHQgLSBkc3RfeTsKKworCXcgPSBNSU4oc3JjX3csIGRzdF93KTsKKwloID0gTUlOKHNyY19oLCBkc3RfaCk7CisKKwlpZiAodyA9PSAwIHx8IGggPT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgTVNHX1BSRUZJWCAiaW52YWxpZCB3aWR0aCBvciBoZWlnaHQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGcyZF9jaGVja19zcGFjZShjdHgsIDEzLCAyKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlnMmRfYWRkX2NtZChjdHgsIERTVF9TRUxFQ1RfUkVHLCBHMkRfU0VMRUNUX01PREVfQkdDT0xPUik7CisJZzJkX2FkZF9jbWQoY3R4LCBTUkNfU0VMRUNUX1JFRywgRzJEX1NFTEVDVF9NT0RFX05PUk1BTCk7CisKKwlnMmRfYWRkX2NtZChjdHgsIERTVF9DT0xPUl9NT0RFX1JFRywgaW1nLT5jb2xvcl9tb2RlKTsKKwlnMmRfYWRkX2NtZChjdHgsIFNSQ19DT0xPUl9NT0RFX1JFRywgaW1nLT5jb2xvcl9tb2RlKTsKKworCWcyZF9hZGRfYmFzZV9hZGRyKGN0eCwgaW1nLCBnMmRfZHN0KTsKKwlnMmRfYWRkX2Jhc2VfYWRkcihjdHgsIGltZywgZzJkX3NyYyk7CisKKwlnMmRfYWRkX2NtZChjdHgsIERTVF9TVFJJREVfUkVHLCBpbWctPnN0cmlkZSk7CisJZzJkX2FkZF9jbWQoY3R4LCBTUkNfU1RSSURFX1JFRywgaW1nLT5zdHJpZGUpOworCisJZGlyLnZhbFswXSA9IGRpci52YWxbMV0gPSAwOworCisJaWYgKGRzdF94ID49IHNyY194KQorCQlkaXIuZGF0YS5zcmNfeF9kaXJlY3Rpb24gPSBkaXIuZGF0YS5kc3RfeF9kaXJlY3Rpb24gPSAxOworCWlmIChkc3RfeSA+PSBzcmNfeSkKKwkJZGlyLmRhdGEuc3JjX3lfZGlyZWN0aW9uID0gZGlyLmRhdGEuZHN0X3lfZGlyZWN0aW9uID0gMTsKKworCWcyZF9zZXRfZGlyZWN0aW9uKGN0eCwgJmRpcik7CisKKwlwdC5kYXRhLnggPSBzcmNfeDsKKwlwdC5kYXRhLnkgPSBzcmNfeTsKKwlnMmRfYWRkX2NtZChjdHgsIFNSQ19MRUZUX1RPUF9SRUcsIHB0LnZhbCk7CisJcHQuZGF0YS54ID0gc3JjX3ggKyB3OworCXB0LmRhdGEueSA9IHNyY195ICsgaDsKKwlnMmRfYWRkX2NtZChjdHgsIFNSQ19SSUdIVF9CT1RUT01fUkVHLCBwdC52YWwpOworCisJcHQuZGF0YS54ID0gZHN0X3g7CisJcHQuZGF0YS55ID0gZHN0X3k7CisJZzJkX2FkZF9jbWQoY3R4LCBEU1RfTEVGVF9UT1BfUkVHLCBwdC52YWwpOworCXB0LmRhdGEueCA9IGRzdF94ICsgdzsKKwlwdC5kYXRhLnkgPSBkc3RfeSArIGg7CisJZzJkX2FkZF9jbWQoY3R4LCBEU1RfUklHSFRfQk9UVE9NX1JFRywgcHQudmFsKTsKKworCXJvcDQudmFsID0gMDsKKwlyb3A0LmRhdGEudW5tYXNrZWRfcm9wMyA9IEcyRF9ST1AzX1NSQzsKKwlnMmRfYWRkX2NtZChjdHgsIFJPUDRfUkVHLCByb3A0LnZhbCk7CisKKwlyZXR1cm4gZzJkX2ZsdXNoKGN0eCk7Cit9CisKKy8qKgorICogZzJkX2NvcHlfd2l0aF9zY2FsZSAtIGNvcHkgY29udGVudHMgaW4gc291cmNlIGJ1ZmZlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCXNjYWxpbmcgdXAgb3IgZG93biBwcm9wZXJseS4KKyAqCisgKiBAY3R4OiBhIHBvaW50ZXIgdG8gZzJkX2NvbnRleHQgc3RydWN0dXJlLgorICogQHNyYzogYSBwb2ludGVyIHRvIGcyZF9pbWFnZSBzdHJ1Y3R1cmUgaW5jbHVkaW5nIGltYWdlIGFuZCBidWZmZXIKKyAqCWluZm9ybWF0aW9uIHRvIHNvdXJjZS4KKyAqIEBkc3Q6IGEgcG9pbnRlciB0byBnMmRfaW1hZ2Ugc3RydWN0dXJlIGluY2x1ZGluZyBpbWFnZSBhbmQgYnVmZmVyCisgKglpbmZvcm1hdGlvbiB0byBkZXN0aW5hdGlvbi4KKyAqIEBzcmNfeDogeCBzdGFydCBwb3NpdGlvbiB0byBzb3VyY2UgYnVmZmVyLgorICogQHNyY195OiB5IHN0YXJ0IHBvc2l0aW9uIHRvIHNvdXJjZSBidWZmZXIuCisgKiBAc3JjX3c6IHdpZHRoIHZhbHVlIHRvIHNvdXJjZSBidWZmZXIuCisgKiBAc3JjX2g6IGhlaWdodCB2YWx1ZSB0byBzb3VyY2UgYnVmZmVyLgorICogQGRzdF94OiB4IHN0YXJ0IHBvc2l0aW9uIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAqIEBkc3RfeTogeSBzdGFydCBwb3NpdGlvbiB0byBkZXN0aW5hdGlvbiBidWZmZXIuCisgKiBAZHN0X3c6IHdpZHRoIHZhbHVlIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAqIEBkc3RfaDogaGVpZ2h0IHZhbHVlIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAqIEBuZWdhdGl2ZTogaW5kaWNhdGUgdGhhdCBpdCB1c2VzIGNvbG9yIG5lZ2F0aXZlIHRvIHNvdXJjZSBhbmQKKyAqCWRlc3RpbmF0aW9uIGJ1ZmZlcnMuCisgKi8KK2ludAorZzJkX2NvcHlfd2l0aF9zY2FsZShzdHJ1Y3QgZzJkX2NvbnRleHQgKmN0eCwgc3RydWN0IGcyZF9pbWFnZSAqc3JjLAorCQkJCXN0cnVjdCBnMmRfaW1hZ2UgKmRzdCwgdW5zaWduZWQgaW50IHNyY194LAorCQkJCXVuc2lnbmVkIGludCBzcmNfeSwgdW5zaWduZWQgaW50IHNyY193LAorCQkJCXVuc2lnbmVkIGludCBzcmNfaCwgdW5zaWduZWQgaW50IGRzdF94LAorCQkJCXVuc2lnbmVkIGludCBkc3RfeSwgdW5zaWduZWQgaW50IGRzdF93LAorCQkJCXVuc2lnbmVkIGludCBkc3RfaCwgdW5zaWduZWQgaW50IG5lZ2F0aXZlKQoreworCXVuaW9uIGcyZF9yb3A0X3ZhbCByb3A0OworCXVuaW9uIGcyZF9wb2ludF92YWwgcHQ7CisJdW5zaWduZWQgaW50IHNjYWxlLCByZXBlYXRfcGFkOworCXVuc2lnbmVkIGludCBzY2FsZV94LCBzY2FsZV95OworCisJLyogU2FuaXRpemUgdGhpcyBwYXJhbWV0ZXIgdG8gZmFjaWxpdGF0ZSBzcGFjZSBjb21wdXRhdGlvbiBiZWxvdy4gKi8KKwlpZiAobmVnYXRpdmUpCisJCW5lZ2F0aXZlID0gMTsKKworCWlmIChzcmNfdyA9PSBkc3RfdyAmJiBzcmNfaCA9PSBkc3RfaCkKKwkJc2NhbGUgPSAwOworCWVsc2UgeworCQlzY2FsZSA9IDE7CisJCXNjYWxlX3ggPSBnMmRfZ2V0X3NjYWxpbmcoc3JjX3csIGRzdF93KTsKKwkJc2NhbGVfeSA9IGcyZF9nZXRfc2NhbGluZyhzcmNfaCwgZHN0X2gpOworCX0KKworCXJlcGVhdF9wYWQgPSBzcmMtPnJlcGVhdF9tb2RlID09IEcyRF9SRVBFQVRfTU9ERV9QQUQgPyAxIDogMDsKKworCWlmIChzcmNfeCArIHNyY193ID4gc3JjLT53aWR0aCkKKwkJc3JjX3cgPSBzcmMtPndpZHRoIC0gc3JjX3g7CisJaWYgKHNyY195ICsgc3JjX2ggPiBzcmMtPmhlaWdodCkKKwkJc3JjX2ggPSBzcmMtPmhlaWdodCAtIHNyY195OworCisJaWYgKGRzdF94ICsgZHN0X3cgPiBkc3QtPndpZHRoKQorCQlkc3RfdyA9IGRzdC0+d2lkdGggLSBkc3RfeDsKKwlpZiAoZHN0X3kgKyBkc3RfaCA+IGRzdC0+aGVpZ2h0KQorCQlkc3RfaCA9IGRzdC0+aGVpZ2h0IC0gZHN0X3k7CisKKwlpZiAoc3JjX3cgPD0gMCB8fCBzcmNfaCA8PSAwIHx8IGRzdF93IDw9IDAgfHwgZHN0X2ggPD0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgTVNHX1BSRUZJWCAiaW52YWxpZCB3aWR0aCBvciBoZWlnaHQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGcyZF9jaGVja19zcGFjZShjdHgsIDEyICsgc2NhbGUgKiAzICsgbmVnYXRpdmUgKyByZXBlYXRfcGFkLCAyKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlnMmRfYWRkX2NtZChjdHgsIERTVF9TRUxFQ1RfUkVHLCBHMkRfU0VMRUNUX01PREVfQkdDT0xPUik7CisJZzJkX2FkZF9jbWQoY3R4LCBEU1RfQ09MT1JfTU9ERV9SRUcsIGRzdC0+Y29sb3JfbW9kZSk7CisJZzJkX2FkZF9iYXNlX2FkZHIoY3R4LCBkc3QsIGcyZF9kc3QpOworCWcyZF9hZGRfY21kKGN0eCwgRFNUX1NUUklERV9SRUcsIGRzdC0+c3RyaWRlKTsKKworCWcyZF9hZGRfY21kKGN0eCwgU1JDX1NFTEVDVF9SRUcsIEcyRF9TRUxFQ1RfTU9ERV9OT1JNQUwpOworCWcyZF9hZGRfY21kKGN0eCwgU1JDX0NPTE9SX01PREVfUkVHLCBzcmMtPmNvbG9yX21vZGUpOworCisJZzJkX2FkZF9jbWQoY3R4LCBTUkNfUkVQRUFUX01PREVfUkVHLCBzcmMtPnJlcGVhdF9tb2RlKTsKKwlpZiAocmVwZWF0X3BhZCkKKwkJZzJkX2FkZF9jbWQoY3R4LCBTUkNfUEFEX1ZBTFVFX1JFRywgZHN0LT5jb2xvcik7CisKKwlnMmRfYWRkX2Jhc2VfYWRkcihjdHgsIHNyYywgZzJkX3NyYyk7CisJZzJkX2FkZF9jbWQoY3R4LCBTUkNfU1RSSURFX1JFRywgc3JjLT5zdHJpZGUpOworCisJcm9wNC52YWwgPSAwOworCXJvcDQuZGF0YS51bm1hc2tlZF9yb3AzID0gRzJEX1JPUDNfU1JDOworCisJaWYgKG5lZ2F0aXZlKSB7CisJCWcyZF9hZGRfY21kKGN0eCwgQkdfQ09MT1JfUkVHLCAweDAwRkZGRkZGKTsKKwkJcm9wNC5kYXRhLnVubWFza2VkX3JvcDMgXj0gRzJEX1JPUDNfRFNUOworCX0KKworCWcyZF9hZGRfY21kKGN0eCwgUk9QNF9SRUcsIHJvcDQudmFsKTsKKworCWlmIChzY2FsZSkgeworCQlnMmRfYWRkX2NtZChjdHgsIFNSQ19TQ0FMRV9DVFJMX1JFRywgRzJEX1NDQUxFX01PREVfQklMSU5FQVIpOworCQlnMmRfYWRkX2NtZChjdHgsIFNSQ19YU0NBTEVfUkVHLCBzY2FsZV94KTsKKwkJZzJkX2FkZF9jbWQoY3R4LCBTUkNfWVNDQUxFX1JFRywgc2NhbGVfeSk7CisJfQorCisJcHQuZGF0YS54ID0gc3JjX3g7CisJcHQuZGF0YS55ID0gc3JjX3k7CisJZzJkX2FkZF9jbWQoY3R4LCBTUkNfTEVGVF9UT1BfUkVHLCBwdC52YWwpOworCXB0LmRhdGEueCA9IHNyY194ICsgc3JjX3c7CisJcHQuZGF0YS55ID0gc3JjX3kgKyBzcmNfaDsKKwlnMmRfYWRkX2NtZChjdHgsIFNSQ19SSUdIVF9CT1RUT01fUkVHLCBwdC52YWwpOworCisJcHQuZGF0YS54ID0gZHN0X3g7CisJcHQuZGF0YS55ID0gZHN0X3k7CisJZzJkX2FkZF9jbWQoY3R4LCBEU1RfTEVGVF9UT1BfUkVHLCBwdC52YWwpOworCXB0LmRhdGEueCA9IGRzdF94ICsgZHN0X3c7CisJcHQuZGF0YS55ID0gZHN0X3kgKyBkc3RfaDsKKwlnMmRfYWRkX2NtZChjdHgsIERTVF9SSUdIVF9CT1RUT01fUkVHLCBwdC52YWwpOworCisJcmV0dXJuIGcyZF9mbHVzaChjdHgpOworfQorCisvKioKKyAqIGcyZF9ibGVuZCAtIGJsZW5kIGltYWdlIGRhdGEgaW4gc291cmNlIGFuZCBkZXN0aW5hdGlvbiBidWZmZXJzLgorICoKKyAqIEBjdHg6IGEgcG9pbnRlciB0byBnMmRfY29udGV4dCBzdHJ1Y3R1cmUuCisgKiBAc3JjOiBhIHBvaW50ZXIgdG8gZzJkX2ltYWdlIHN0cnVjdHVyZSBpbmNsdWRpbmcgaW1hZ2UgYW5kIGJ1ZmZlcgorICoJaW5mb3JtYXRpb24gdG8gc291cmNlLgorICogQGRzdDogYSBwb2ludGVyIHRvIGcyZF9pbWFnZSBzdHJ1Y3R1cmUgaW5jbHVkaW5nIGltYWdlIGFuZCBidWZmZXIKKyAqCWluZm9ybWF0aW9uIHRvIGRlc3RpbmF0aW9uLgorICogQHNyY194OiB4IHN0YXJ0IHBvc2l0aW9uIHRvIHNvdXJjZSBidWZmZXIuCisgKiBAc3JjX3k6IHkgc3RhcnQgcG9zaXRpb24gdG8gc291cmNlIGJ1ZmZlci4KKyAqIEBkc3RfeDogeCBzdGFydCBwb3NpdGlvbiB0byBkZXN0aW5hdGlvbiBidWZmZXIuCisgKiBAZHN0X3k6IHkgc3RhcnQgcG9zaXRpb24gdG8gZGVzdGluYXRpb24gYnVmZmVyLgorICogQHc6IHdpZHRoIHZhbHVlIHRvIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYnVmZmVyLgorICogQGg6IGhlaWdodCB2YWx1ZSB0byBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAqIEBvcDogYmxlbmQgb3BlcmF0aW9uIHR5cGUuCisgKi8KK2ludAorZzJkX2JsZW5kKHN0cnVjdCBnMmRfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZzJkX2ltYWdlICpzcmMsCisJCXN0cnVjdCBnMmRfaW1hZ2UgKmRzdCwgdW5zaWduZWQgaW50IHNyY194LAorCQl1bnNpZ25lZCBpbnQgc3JjX3ksIHVuc2lnbmVkIGludCBkc3RfeCwgdW5zaWduZWQgaW50IGRzdF95LAorCQl1bnNpZ25lZCBpbnQgdywgdW5zaWduZWQgaW50IGgsIGVudW0gZV9nMmRfb3Agb3ApCit7CisJdW5pb24gZzJkX3BvaW50X3ZhbCBwdDsKKwl1bmlvbiBnMmRfYml0Ymx0X2NtZF92YWwgYml0Ymx0OworCXVuaW9uIGcyZF9ibGVuZF9mdW5jX3ZhbCBibGVuZDsKKwl1bnNpZ25lZCBpbnQgZ2VtX3NwYWNlOworCXVuc2lnbmVkIGludCBzcmNfdywgc3JjX2gsIGRzdF93LCBkc3RfaDsKKworCXNyY193ID0gdzsKKwlzcmNfaCA9IGg7CisJaWYgKHNyY194ICsgdyA+IHNyYy0+d2lkdGgpCisJCXNyY193ID0gc3JjLT53aWR0aCAtIHNyY194OworCWlmIChzcmNfeSArIGggPiBzcmMtPmhlaWdodCkKKwkJc3JjX2ggPSBzcmMtPmhlaWdodCAtIHNyY195OworCisJZHN0X3cgPSB3OworCWRzdF9oID0gaDsKKwlpZiAoZHN0X3ggKyB3ID4gZHN0LT53aWR0aCkKKwkJZHN0X3cgPSBkc3QtPndpZHRoIC0gZHN0X3g7CisJaWYgKGRzdF95ICsgaCA+IGRzdC0+aGVpZ2h0KQorCQlkc3RfaCA9IGRzdC0+aGVpZ2h0IC0gZHN0X3k7CisKKwl3ID0gTUlOKHNyY193LCBkc3Rfdyk7CisJaCA9IE1JTihzcmNfaCwgZHN0X2gpOworCisJaWYgKHcgPD0gMCB8fCBoIDw9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsIE1TR19QUkVGSVggImludmFsaWQgd2lkdGggb3IgaGVpZ2h0LlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghZzJkX3ZhbGlkYXRlX3NlbGVjdF9tb2RlKHNyYy0+c2VsZWN0X21vZGUpKSB7CisJCWZwcmludGYoc3RkZXJyICwgTVNHX1BSRUZJWCAiaW52YWxpZCBzZWxlY3QgbW9kZSBmb3Igc291cmNlLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghZzJkX3ZhbGlkYXRlX2JsZW5kaW5nX29wKG9wKSkgeworCQlmcHJpbnRmKHN0ZGVyciAsIE1TR19QUkVGSVggInVuc3VwcG9ydGVkIGJsZW5kaW5nIG9wZXJhdGlvbi5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlnZW1fc3BhY2UgPSBzcmMtPnNlbGVjdF9tb2RlID09IEcyRF9TRUxFQ1RfTU9ERV9OT1JNQUwgPyAyIDogMTsKKworCWlmIChnMmRfY2hlY2tfc3BhY2UoY3R4LCAxMiwgZ2VtX3NwYWNlKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwliaXRibHQudmFsID0gMDsKKwlibGVuZC52YWwgPSAwOworCisJaWYgKG9wID09IEcyRF9PUF9TUkMgfHwgb3AgPT0gRzJEX09QX0NMRUFSKQorCQlnMmRfYWRkX2NtZChjdHgsIERTVF9TRUxFQ1RfUkVHLCBHMkRfU0VMRUNUX01PREVfQkdDT0xPUik7CisJZWxzZQorCQlnMmRfYWRkX2NtZChjdHgsIERTVF9TRUxFQ1RfUkVHLCBHMkRfU0VMRUNUX01PREVfTk9STUFMKTsKKworCWcyZF9hZGRfY21kKGN0eCwgRFNUX0NPTE9SX01PREVfUkVHLCBkc3QtPmNvbG9yX21vZGUpOworCWcyZF9hZGRfYmFzZV9hZGRyKGN0eCwgZHN0LCBnMmRfZHN0KTsKKwlnMmRfYWRkX2NtZChjdHgsIERTVF9TVFJJREVfUkVHLCBkc3QtPnN0cmlkZSk7CisKKwlnMmRfYWRkX2NtZChjdHgsIFNSQ19TRUxFQ1RfUkVHLCBzcmMtPnNlbGVjdF9tb2RlKTsKKwlnMmRfYWRkX2NtZChjdHgsIFNSQ19DT0xPUl9NT0RFX1JFRywgc3JjLT5jb2xvcl9tb2RlKTsKKworCXN3aXRjaCAoc3JjLT5zZWxlY3RfbW9kZSkgeworCWNhc2UgRzJEX1NFTEVDVF9NT0RFX05PUk1BTDoKKwkJZzJkX2FkZF9iYXNlX2FkZHIoY3R4LCBzcmMsIGcyZF9zcmMpOworCQlnMmRfYWRkX2NtZChjdHgsIFNSQ19TVFJJREVfUkVHLCBzcmMtPnN0cmlkZSk7CisJCWJyZWFrOworCWNhc2UgRzJEX1NFTEVDVF9NT0RFX0ZHQ09MT1I6CisJCWcyZF9hZGRfY21kKGN0eCwgRkdfQ09MT1JfUkVHLCBzcmMtPmNvbG9yKTsKKwkJYnJlYWs7CisJY2FzZSBHMkRfU0VMRUNUX01PREVfQkdDT0xPUjoKKwkJZzJkX2FkZF9jbWQoY3R4LCBCR19DT0xPUl9SRUcsIHNyYy0+Y29sb3IpOworCQlicmVhazsKKwl9CisKKwliaXRibHQuZGF0YS5hbHBoYV9ibGVuZF9tb2RlID0gRzJEX0FMUEhBX0JMRU5EX01PREVfRU5BQkxFOworCWJsZW5kLnZhbCA9IGcyZF9nZXRfYmxlbmRfb3Aob3ApOworCWcyZF9hZGRfY21kKGN0eCwgQklUQkxUX0NPTU1BTkRfUkVHLCBiaXRibHQudmFsKTsKKwlnMmRfYWRkX2NtZChjdHgsIEJMRU5EX0ZVTkNUSU9OX1JFRywgYmxlbmQudmFsKTsKKworCXB0LmRhdGEueCA9IHNyY194OworCXB0LmRhdGEueSA9IHNyY195OworCWcyZF9hZGRfY21kKGN0eCwgU1JDX0xFRlRfVE9QX1JFRywgcHQudmFsKTsKKwlwdC5kYXRhLnggPSBzcmNfeCArIHc7CisJcHQuZGF0YS55ID0gc3JjX3kgKyBoOworCWcyZF9hZGRfY21kKGN0eCwgU1JDX1JJR0hUX0JPVFRPTV9SRUcsIHB0LnZhbCk7CisKKwlwdC5kYXRhLnggPSBkc3RfeDsKKwlwdC5kYXRhLnkgPSBkc3RfeTsKKwlnMmRfYWRkX2NtZChjdHgsIERTVF9MRUZUX1RPUF9SRUcsIHB0LnZhbCk7CisJcHQuZGF0YS54ID0gZHN0X3ggKyB3OworCXB0LmRhdGEueSA9IGRzdF95ICsgaDsKKwlnMmRfYWRkX2NtZChjdHgsIERTVF9SSUdIVF9CT1RUT01fUkVHLCBwdC52YWwpOworCisJcmV0dXJuIGcyZF9mbHVzaChjdHgpOworfQorCisvKioKKyAqIGcyZF9zY2FsZV9hbmRfYmxlbmQgLSBhcHBseSBzY2FsaW5nIHRvIHNvdXJjZSBidWZmZXIgYW5kIHRoZW4gYmxlbmQgdG8gZGVzdGluYXRpb24gYnVmZmVyCisgKgorICogQGN0eDogYSBwb2ludGVyIHRvIGcyZF9jb250ZXh0IHN0cnVjdHVyZS4KKyAqIEBzcmM6IGEgcG9pbnRlciB0byBnMmRfaW1hZ2Ugc3RydWN0dXJlIGluY2x1ZGluZyBpbWFnZSBhbmQgYnVmZmVyCisgKglpbmZvcm1hdGlvbiB0byBzb3VyY2UuCisgKiBAZHN0OiBhIHBvaW50ZXIgdG8gZzJkX2ltYWdlIHN0cnVjdHVyZSBpbmNsdWRpbmcgaW1hZ2UgYW5kIGJ1ZmZlcgorICoJaW5mb3JtYXRpb24gdG8gZGVzdGluYXRpb24uCisgKiBAc3JjX3g6IHggc3RhcnQgcG9zaXRpb24gdG8gc291cmNlIGJ1ZmZlci4KKyAqIEBzcmNfeTogeSBzdGFydCBwb3NpdGlvbiB0byBzb3VyY2UgYnVmZmVyLgorICogQHNyY193OiB3aWR0aCB2YWx1ZSB0byBzb3VyY2UgYnVmZmVyLgorICogQHNyY19oOiBoZWlnaHQgdmFsdWUgdG8gc291cmNlIGJ1ZmZlci4KKyAqIEBkc3RfeDogeCBzdGFydCBwb3NpdGlvbiB0byBkZXN0aW5hdGlvbiBidWZmZXIuCisgKiBAZHN0X3k6IHkgc3RhcnQgcG9zaXRpb24gdG8gZGVzdGluYXRpb24gYnVmZmVyLgorICogQGRzdF93OiB3aWR0aCB2YWx1ZSB0byBkZXN0aW5hdGlvbiBidWZmZXIuCisgKiBAZHN0X2g6IGhlaWdodCB2YWx1ZSB0byBkZXN0aW5hdGlvbiBidWZmZXIuCisgKiBAb3A6IGJsZW5kIG9wZXJhdGlvbiB0eXBlLgorICovCitpbnQKK2cyZF9zY2FsZV9hbmRfYmxlbmQoc3RydWN0IGcyZF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnMmRfaW1hZ2UgKnNyYywKKwkJc3RydWN0IGcyZF9pbWFnZSAqZHN0LCB1bnNpZ25lZCBpbnQgc3JjX3gsIHVuc2lnbmVkIGludCBzcmNfeSwKKwkJdW5zaWduZWQgaW50IHNyY193LCB1bnNpZ25lZCBpbnQgc3JjX2gsIHVuc2lnbmVkIGludCBkc3RfeCwKKwkJdW5zaWduZWQgaW50IGRzdF95LCB1bnNpZ25lZCBpbnQgZHN0X3csIHVuc2lnbmVkIGludCBkc3RfaCwKKwkJZW51bSBlX2cyZF9vcCBvcCkKK3sKKwl1bmlvbiBnMmRfcG9pbnRfdmFsIHB0OworCXVuaW9uIGcyZF9iaXRibHRfY21kX3ZhbCBiaXRibHQ7CisJdW5pb24gZzJkX2JsZW5kX2Z1bmNfdmFsIGJsZW5kOworCXVuc2lnbmVkIGludCBzY2FsZSwgZ2VtX3NwYWNlOworCXVuc2lnbmVkIGludCBzY2FsZV94LCBzY2FsZV95OworCisJaWYgKHNyY193ID09IGRzdF93ICYmIHNyY19oID09IGRzdF9oKQorCQlzY2FsZSA9IDA7CisJZWxzZSB7CisJCXNjYWxlID0gMTsKKwkJc2NhbGVfeCA9IGcyZF9nZXRfc2NhbGluZyhzcmNfdywgZHN0X3cpOworCQlzY2FsZV95ID0gZzJkX2dldF9zY2FsaW5nKHNyY19oLCBkc3RfaCk7CisJfQorCisJaWYgKHNyY194ICsgc3JjX3cgPiBzcmMtPndpZHRoKQorCQlzcmNfdyA9IHNyYy0+d2lkdGggLSBzcmNfeDsKKwlpZiAoc3JjX3kgKyBzcmNfaCA+IHNyYy0+aGVpZ2h0KQorCQlzcmNfaCA9IHNyYy0+aGVpZ2h0IC0gc3JjX3k7CisKKwlpZiAoZHN0X3ggKyBkc3RfdyA+IGRzdC0+d2lkdGgpCisJCWRzdF93ID0gZHN0LT53aWR0aCAtIGRzdF94OworCWlmIChkc3RfeSArIGRzdF9oID4gZHN0LT5oZWlnaHQpCisJCWRzdF9oID0gZHN0LT5oZWlnaHQgLSBkc3RfeTsKKworCWlmIChzcmNfdyA8PSAwIHx8IHNyY19oIDw9IDAgfHwgZHN0X3cgPD0gMCB8fCBkc3RfaCA8PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCBNU0dfUFJFRklYICJpbnZhbGlkIHdpZHRoIG9yIGhlaWdodC5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWcyZF92YWxpZGF0ZV9zZWxlY3RfbW9kZShzcmMtPnNlbGVjdF9tb2RlKSkgeworCQlmcHJpbnRmKHN0ZGVyciAsIE1TR19QUkVGSVggImludmFsaWQgc2VsZWN0IG1vZGUgZm9yIHNvdXJjZS5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWcyZF92YWxpZGF0ZV9ibGVuZGluZ19vcChvcCkpIHsKKwkJZnByaW50ZihzdGRlcnIgLCBNU0dfUFJFRklYICJ1bnN1cHBvcnRlZCBibGVuZGluZyBvcGVyYXRpb24uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZ2VtX3NwYWNlID0gc3JjLT5zZWxlY3RfbW9kZSA9PSBHMkRfU0VMRUNUX01PREVfTk9STUFMID8gMiA6IDE7CisKKwlpZiAoZzJkX2NoZWNrX3NwYWNlKGN0eCwgMTIgKyBzY2FsZSAqIDMsIGdlbV9zcGFjZSkpCisJCXJldHVybiAtRU5PU1BDOworCisJYml0Ymx0LnZhbCA9IDA7CisJYmxlbmQudmFsID0gMDsKKworCWlmIChvcCA9PSBHMkRfT1BfU1JDIHx8IG9wID09IEcyRF9PUF9DTEVBUikKKwkJZzJkX2FkZF9jbWQoY3R4LCBEU1RfU0VMRUNUX1JFRywgRzJEX1NFTEVDVF9NT0RFX0JHQ09MT1IpOworCWVsc2UKKwkJZzJkX2FkZF9jbWQoY3R4LCBEU1RfU0VMRUNUX1JFRywgRzJEX1NFTEVDVF9NT0RFX05PUk1BTCk7CisKKwlnMmRfYWRkX2NtZChjdHgsIERTVF9DT0xPUl9NT0RFX1JFRywgZHN0LT5jb2xvcl9tb2RlKTsKKwlnMmRfYWRkX2Jhc2VfYWRkcihjdHgsIGRzdCwgZzJkX2RzdCk7CisJZzJkX2FkZF9jbWQoY3R4LCBEU1RfU1RSSURFX1JFRywgZHN0LT5zdHJpZGUpOworCisJZzJkX2FkZF9jbWQoY3R4LCBTUkNfU0VMRUNUX1JFRywgc3JjLT5zZWxlY3RfbW9kZSk7CisJZzJkX2FkZF9jbWQoY3R4LCBTUkNfQ09MT1JfTU9ERV9SRUcsIHNyYy0+Y29sb3JfbW9kZSk7CisKKwlzd2l0Y2ggKHNyYy0+c2VsZWN0X21vZGUpIHsKKwljYXNlIEcyRF9TRUxFQ1RfTU9ERV9OT1JNQUw6CisJCWcyZF9hZGRfYmFzZV9hZGRyKGN0eCwgc3JjLCBnMmRfc3JjKTsKKwkJZzJkX2FkZF9jbWQoY3R4LCBTUkNfU1RSSURFX1JFRywgc3JjLT5zdHJpZGUpOworCQlicmVhazsKKwljYXNlIEcyRF9TRUxFQ1RfTU9ERV9GR0NPTE9SOgorCQlnMmRfYWRkX2NtZChjdHgsIEZHX0NPTE9SX1JFRywgc3JjLT5jb2xvcik7CisJCWJyZWFrOworCWNhc2UgRzJEX1NFTEVDVF9NT0RFX0JHQ09MT1I6CisJCWcyZF9hZGRfY21kKGN0eCwgQkdfQ09MT1JfUkVHLCBzcmMtPmNvbG9yKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHNjYWxlKSB7CisJCWcyZF9hZGRfY21kKGN0eCwgU1JDX1NDQUxFX0NUUkxfUkVHLCBHMkRfU0NBTEVfTU9ERV9CSUxJTkVBUik7CisJCWcyZF9hZGRfY21kKGN0eCwgU1JDX1hTQ0FMRV9SRUcsIHNjYWxlX3gpOworCQlnMmRfYWRkX2NtZChjdHgsIFNSQ19ZU0NBTEVfUkVHLCBzY2FsZV95KTsKKwl9CisKKwliaXRibHQuZGF0YS5hbHBoYV9ibGVuZF9tb2RlID0gRzJEX0FMUEhBX0JMRU5EX01PREVfRU5BQkxFOworCWJsZW5kLnZhbCA9IGcyZF9nZXRfYmxlbmRfb3Aob3ApOworCWcyZF9hZGRfY21kKGN0eCwgQklUQkxUX0NPTU1BTkRfUkVHLCBiaXRibHQudmFsKTsKKwlnMmRfYWRkX2NtZChjdHgsIEJMRU5EX0ZVTkNUSU9OX1JFRywgYmxlbmQudmFsKTsKKworCXB0LmRhdGEueCA9IHNyY194OworCXB0LmRhdGEueSA9IHNyY195OworCWcyZF9hZGRfY21kKGN0eCwgU1JDX0xFRlRfVE9QX1JFRywgcHQudmFsKTsKKwlwdC5kYXRhLnggPSBzcmNfeCArIHNyY193OworCXB0LmRhdGEueSA9IHNyY195ICsgc3JjX2g7CisJZzJkX2FkZF9jbWQoY3R4LCBTUkNfUklHSFRfQk9UVE9NX1JFRywgcHQudmFsKTsKKworCXB0LmRhdGEueCA9IGRzdF94OworCXB0LmRhdGEueSA9IGRzdF95OworCWcyZF9hZGRfY21kKGN0eCwgRFNUX0xFRlRfVE9QX1JFRywgcHQudmFsKTsKKwlwdC5kYXRhLnggPSBkc3RfeCArIGRzdF93OworCXB0LmRhdGEueSA9IGRzdF95ICsgZHN0X2g7CisJZzJkX2FkZF9jbWQoY3R4LCBEU1RfUklHSFRfQk9UVE9NX1JFRywgcHQudmFsKTsKKworCXJldHVybiBnMmRfZmx1c2goY3R4KTsKK30KZGlmZiAtLWdpdCBhL2V4eW5vcy9leHlub3NfZmltZzJkLmggYi9leHlub3MvZXh5bm9zX2ZpbWcyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MjVjNjgKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MvZXh5bm9zX2ZpbWcyZC5oCkBAIC0wLDAgKzEsMzIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uTHRkCisgKiBBdXRob3JzOgorICoJSW5raSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX0ZJTUcyRF9IXworI2RlZmluZSBfRklNRzJEX0hfCisKKyNkZWZpbmUgRzJEX1BMQU5FX01BWF9OUgkyCisKK2VudW0gZV9nMmRfY29sb3JfbW9kZSB7CisJLyogQ09MT1IgRk9STUFUICovCisJRzJEX0NPTE9SX0ZNVF9YUkdCODg4OCwKKwlHMkRfQ09MT1JfRk1UX0FSR0I4ODg4LAorCUcyRF9DT0xPUl9GTVRfUkdCNTY1LAorCUcyRF9DT0xPUl9GTVRfWFJHQjE1NTUsCisJRzJEX0NPTE9SX0ZNVF9BUkdCMTU1NSwKKwlHMkRfQ09MT1JfRk1UX1hSR0I0NDQ0LAorCUcyRF9DT0xPUl9GTVRfQVJHQjQ0NDQsCisJRzJEX0NPTE9SX0ZNVF9QUkdCODg4LAorCUcyRF9DT0xPUl9GTVRfWUNiQ3I0NDQsCisJRzJEX0NPTE9SX0ZNVF9ZQ2JDcjQyMiwKKwlHMkRfQ09MT1JfRk1UX1lDYkNyNDIwLAorCS8qIGFscGhhIDhiaXQgKi8KKwlHMkRfQ09MT1JfRk1UX0E4LAorCS8qIEx1bWluYW5jZSA4Yml0OiBncmF5IGNvbG9yICovCisJRzJEX0NPTE9SX0ZNVF9MOCwKKwkvKiBhbHBoYSAxYml0ICovCisJRzJEX0NPTE9SX0ZNVF9BMSwKKwkvKiBhbHBoYSA0Yml0ICovCisJRzJEX0NPTE9SX0ZNVF9BNCwKKwlHMkRfQ09MT1JfRk1UX01BU0ssCQkJCS8qIFZFUjQuMSAqLworCisJLyogQ09MT1IgT1JERVIgKi8KKwlHMkRfT1JERVJfQVhSR0IJCT0gKDAgPDwgNCksCQkvKiBWRVI0LjEgKi8KKwlHMkRfT1JERVJfUkdCQVgJCT0gKDEgPDwgNCksCQkvKiBWRVI0LjEgKi8KKwlHMkRfT1JERVJfQVhCR1IJCT0gKDIgPDwgNCksCQkvKiBWRVI0LjEgKi8KKwlHMkRfT1JERVJfQkdSQVgJCT0gKDMgPDwgNCksCQkvKiBWRVI0LjEgKi8KKwlHMkRfT1JERVJfTUFTSwkJPSAoMyA8PCA0KSwJCS8qIFZFUjQuMSAqLworCisJLyogTnVtYmVyIG9mIFlDYkNyIHBsYW5lICovCisJRzJEX1lDYkNyXzFQTEFORQk9ICgwIDw8IDgpLAkJLyogVkVSNC4xICovCisJRzJEX1lDYkNyXzJQTEFORQk9ICgxIDw8IDgpLAkJLyogVkVSNC4xICovCisJRzJEX1lDYkNyX1BMQU5FX01BU0sJPSAoMyA8PCA4KSwJCS8qIFZFUjQuMSAqLworCisJLyogT3JkZXIgaW4gWUNiQ3IgKi8KKwlHMkRfWUNiQ3JfT1JERVJfQ3JZMUNiWTAgPSAoMCA8PCAxMiksCQkJLyogVkVSNC4xICovCisJRzJEX1lDYkNyX09SREVSX0NiWTFDclkwID0gKDEgPDwgMTIpLAkJCS8qIFZFUjQuMSAqLworCUcyRF9ZQ2JDcl9PUkRFUl9ZMUNyWTBDYiA9ICgyIDw8IDEyKSwJCQkvKiBWRVI0LjEgKi8KKwlHMkRfWUNiQ3JfT1JERVJfWTFDYlkwQ3IgPSAoMyA8PCAxMiksCQkJLyogVkVSNC4xICovCisJRzJEX1lDYkNyX09SREVSX0NyQ2IgPSBHMkRfWUNiQ3JfT1JERVJfQ3JZMUNiWTAsCS8qIFZFUjQuMSAqLworCUcyRF9ZQ2JDcl9PUkRFUl9DYkNyID0gRzJEX1lDYkNyX09SREVSX0NiWTFDclkwLAkvKiBWRVI0LjEgKi8KKwlHMkRfWUNiQ3JfT1JERVJfTUFTSyA9ICgzIDwgMTIpLAkJCS8qIFZFUjQuMSAqLworCisJLyogQ1NDICovCisJRzJEX0NTQ182MDEgPSAoMCA8PCAxNiksCQkvKiBWRVI0LjEgKi8KKwlHMkRfQ1NDXzcwOSA9ICgxIDw8IDE2KSwJCS8qIFZFUjQuMSAqLworCUcyRF9DU0NfTUFTSyA9ICgxIDw8IDE2KSwJCS8qIFZFUjQuMSAqLworCisJLyogVmFsaWQgdmFsdWUgcmFuZ2Ugb2YgWUNiQ3IgKi8KKwlHMkRfWUNiQ3JfUkFOR0VfTkFSUk9XID0gKDAgPDwgMTcpLAkvKiBWRVI0LjEgKi8KKwlHMkRfWUNiQ3JfUkFOR0VfV0lERSA9ICgxIDw8IDE3KSwJLyogVkVSNC4xICovCisJRzJEX1lDYkNyX1JBTkdFX01BU0sgPSAoMSA8PCAxNyksCS8qIFZFUjQuMSAqLworCisJRzJEX0NPTE9SX01PREVfTUFTSyA9IDB4RkZGRkZGRkYsCit9OworCitlbnVtIGVfZzJkX3NlbGVjdF9tb2RlIHsKKwlHMkRfU0VMRUNUX01PREVfTk9STUFMCT0gKDAgPDwgMCksCisJRzJEX1NFTEVDVF9NT0RFX0ZHQ09MT1IgPSAoMSA8PCAwKSwKKwlHMkRfU0VMRUNUX01PREVfQkdDT0xPUiA9ICgyIDw8IDApLAorfTsKKworZW51bSBlX2cyZF9yZXBlYXRfbW9kZSB7CisJRzJEX1JFUEVBVF9NT0RFX1JFUEVBVCwKKwlHMkRfUkVQRUFUX01PREVfUEFELAorCUcyRF9SRVBFQVRfTU9ERV9SRUZMRUNULAorCUcyRF9SRVBFQVRfTU9ERV9DTEFNUCwKKwlHMkRfUkVQRUFUX01PREVfTk9ORSwKK307CisKK2VudW0gZV9nMmRfc2NhbGVfbW9kZSB7CisJRzJEX1NDQUxFX01PREVfTk9ORSA9IDAsCisJRzJEX1NDQUxFX01PREVfTkVBUkVTVCwKKwlHMkRfU0NBTEVfTU9ERV9CSUxJTkVBUiwKKwlHMkRfU0NBTEVfTU9ERV9NQVgsCit9OworCitlbnVtIGVfZzJkX2J1Zl90eXBlIHsKKwlHMkRfSU1HQlVGX0NPTE9SLAorCUcyRF9JTUdCVUZfR0VNLAorCUcyRF9JTUdCVUZfVVNFUlBUUiwKK307CisKK2VudW0gZV9nMmRfcm9wM190eXBlIHsKKwlHMkRfUk9QM19EU1QgPSAweEFBLAorCUcyRF9ST1AzX1NSQyA9IDB4Q0MsCisJRzJEX1JPUDNfM1JEID0gMHhGMCwKKwlHMkRfUk9QM19NQVNLID0gMHhGRiwKK307CisKK2VudW0gZV9nMmRfc2VsZWN0X2FscGhhX3NyYyB7CisJRzJEX1NFTEVDVF9TUkNfRk9SX0FMUEhBX0JMRU5ELAkvKiBWRVI0LjEgKi8KKwlHMkRfU0VMRUNUX1JPUF9GT1JfQUxQSEFfQkxFTkQsCS8qIFZFUjQuMSAqLworfTsKKworZW51bSBlX2cyZF90cmFuc3BhcmVudF9tb2RlIHsKKwlHMkRfVFJBTlNQQVJFTlRfTU9ERV9PUEFRVUUsCisJRzJEX1RSQU5TUEFSRU5UX01PREVfVFJBTlNQQVJFTlQsCisJRzJEX1RSQU5TUEFSRU5UX01PREVfQkxVRVNDUkVFTiwKKwlHMkRfVFJBTlNQQVJFTlRfTU9ERV9NQVgsCit9OworCitlbnVtIGVfZzJkX2NvbG9yX2tleV9tb2RlIHsKKwlHMkRfQ09MT1JLRVlfTU9ERV9ESVNBQkxFCT0gMCwKKwlHMkRfQ09MT1JLRVlfTU9ERV9TUkNfUkdCQQk9ICgxPDwwKSwKKwlHMkRfQ09MT1JLRVlfTU9ERV9EU1RfUkdCQQk9ICgxPDwxKSwKKwlHMkRfQ09MT1JLRVlfTU9ERV9TUkNfWUNiQ3IJPSAoMTw8MiksCQkvKiBWRVI0LjEgKi8KKwlHMkRfQ09MT1JLRVlfTU9ERV9EU1RfWUNiQ3IJPSAoMTw8MyksCQkvKiBWRVI0LjEgKi8KKwlHMkRfQ09MT1JLRVlfTU9ERV9NQVNLCQk9IDE1LAorfTsKKworZW51bSBlX2cyZF9hbHBoYV9ibGVuZF9tb2RlIHsKKwlHMkRfQUxQSEFfQkxFTkRfTU9ERV9ESVNBQkxFLAorCUcyRF9BTFBIQV9CTEVORF9NT0RFX0VOQUJMRSwKKwlHMkRfQUxQSEFfQkxFTkRfTU9ERV9GQURJTkcsCQkJCS8qIFZFUjMuMCAqLworCUcyRF9BTFBIQV9CTEVORF9NT0RFX01BWCwKK307CisKK2VudW0gZV9nMmRfb3AgeworCUcyRF9PUF9DTEVBUgkJCT0gMHgwMCwKKwlHMkRfT1BfU1JDCQkJPSAweDAxLAorCUcyRF9PUF9EU1QJCQk9IDB4MDIsCisJRzJEX09QX09WRVIJCQk9IDB4MDMsCisJRzJEX09QX0lOVEVSUE9MQVRFCQk9IDB4MDQsCisJRzJEX09QX0RJU0pPSU5UX0NMRUFSCQk9IDB4MTAsCisJRzJEX09QX0RJU0pPSU5UX1NSQwkJPSAweDExLAorCUcyRF9PUF9ESVNKT0lOVF9EU1QJCT0gMHgxMiwKKwlHMkRfT1BfQ09OSk9JTlRfQ0xFQVIJCT0gMHgyMCwKKwlHMkRfT1BfQ09OSk9JTlRfU1JDCQk9IDB4MjEsCisJRzJEX09QX0NPTkpPSU5UX0RTVAkJPSAweDIyLAorfTsKKworLyoKKyAqIFRoZSBHMkRfQ09FRkZfTU9ERV9EU1Rfe0NPTE9SLEFMUEhBfSBtb2RlcyBib3RoIHVzZSB0aGUgQUxQSEFfUkVHKDB4NjE4KQorICogcmVnaXN0ZXIuIFRoZSByZWdpc3RlcnMgZmllbGRzIGFyZSBhcyBmb2xsb3dzOgorICogYml0cyAzMTo4ID0gY29sb3IgdmFsdWUgKFJHQiBvcmRlcikKKyAqIGJpdHMgNzowID0gYWxwaGEgdmFsdWUKKyAqLworZW51bSBlX2cyZF9jb2VmZl9tb2RlIHsKKwlHMkRfQ09FRkZfTU9ERV9PTkUsCisJRzJEX0NPRUZGX01PREVfWkVSTywKKwlHMkRfQ09FRkZfTU9ERV9TUkNfQUxQSEEsCisJRzJEX0NPRUZGX01PREVfU1JDX0NPTE9SLAorCUcyRF9DT0VGRl9NT0RFX0RTVF9BTFBIQSwKKwlHMkRfQ09FRkZfTU9ERV9EU1RfQ09MT1IsCisJLyogR2xvYmFsIEFscGhhIDogU2V0IGJ5IEFMUEhBX1JFRygweDYxOCkgKi8KKwlHMkRfQ09FRkZfTU9ERV9HQl9BTFBIQSwKKwkvKiBHbG9iYWwgQ29sb3IgYW5kIEFscGhhIDogU2V0IGJ5IEFMUEhBX1JFRygweDYxOCkgKi8KKwlHMkRfQ09FRkZfTU9ERV9HQl9DT0xPUiwKKwkvKiAoMS1TUkMgYWxwaGEpL0RTVCBBbHBoYSAqLworCUcyRF9DT0VGRl9NT0RFX0RJU0pPSU5UX1MsCisJLyogKDEtRFNUIGFscGhhKS9TUkMgQWxwaGEgKi8KKwlHMkRfQ09FRkZfTU9ERV9ESVNKT0lOVF9ELAorCS8qIFNSQyBhbHBoYS9EU1QgYWxwaGEgKi8KKwlHMkRfQ09FRkZfTU9ERV9DT05KT0lOVF9TLAorCS8qIERTVCBhbHBoYS9TUkMgYWxwaGEgKi8KKwlHMkRfQ09FRkZfTU9ERV9DT05KT0lOVF9ELAorCS8qIERTVCBhbHBoYS9TUkMgYWxwaGEgKi8KKwlHMkRfQ09FRkZfTU9ERV9NQVNLCit9OworCitlbnVtIGVfZzJkX2Fjb2VmZl9tb2RlIHsKKwlHMkRfQUNPRUZGX01PREVfQSwgICAgICAgICAgLyogYWxwaGEgKi8KKwlHMkRfQUNPRUZGX01PREVfQVBHQSwJLyogYWxwaGEgKyBnbG9iYWwgYWxwaGEgKi8KKwlHMkRfQUNPRUZGX01PREVfQU1HQSwJLyogYWxwaGEgKiBnbG9iYWwgYWxwaGEgKi8KKwlHMkRfQUNPRUZGX01PREVfTUFTSworfTsKKwordW5pb24gZzJkX3BvaW50X3ZhbCB7CisJdW5zaWduZWQgaW50IHZhbDsKKwlzdHJ1Y3QgeworCQkvKgorCQkgKiBDb29yZGluYXRlIG9mIFNvdXJjZSBJbWFnZQorCQkgKiBSYW5nZTogMCB+IDgwMDAgKFJlcXVpcmVtZW50OiBTcmNMZWZ0WCA8IFNyY1JpZ2h0WCkKKwkJICogSW4gWUNiQ3IgNDIyIGFuZCBZQ2JDciA0MjAgZm9ybWF0IHdpdGggZXZlbiBudW1iZXIuCisJCSAqLworCQl1bnNpZ25lZCBpbnQgeDoxNjsKKwkJLyoKKwkJICogWSBDb29yZGluYXRlIG9mIFNvdXJjZSBJbWFnZQorCQkgKiBSYW5nZTogMCB+IDgwMDAgKFJlcXVpcmVtZW50OiBTcmNUb3BZIDwgU3JjQm90dG9tWSkKKwkJICogSW4gWUNiQ3IgNDIwIGZvcm1hdCB3aXRoIGV2ZW4gbnVtYmVyLgorCQkgKi8KKwkJdW5zaWduZWQgaW50IHk6MTY7CisJfSBkYXRhOworfTsKKwordW5pb24gZzJkX3JvcDRfdmFsIHsKKwl1bnNpZ25lZCBpbnQgdmFsOworCXN0cnVjdCB7CisJCWVudW0gZV9nMmRfcm9wM190eXBlCXVubWFza2VkX3JvcDM6ODsKKwkJZW51bSBlX2cyZF9yb3AzX3R5cGUJbWFza2VkX3JvcDM6ODsKKwkJdW5zaWduZWQgaW50CQlyZXNlcnZlZDoxNjsKKwl9IGRhdGE7Cit9OworCit1bmlvbiBnMmRfYml0Ymx0X2NtZF92YWwgeworCXVuc2lnbmVkIGludCB2YWw7CisJc3RydWN0IHsKKwkJLyogWzA6M10gKi8KKwkJdW5zaWduZWQgaW50CQkJbWFza19yb3A0X2VuOjE7CisJCXVuc2lnbmVkIGludAkJCW1hc2tpbmdfZW46MTsKKwkJZW51bSBlX2cyZF9zZWxlY3RfYWxwaGFfc3JjCXJvcDRfYWxwaGFfZW46MTsKKwkJdW5zaWduZWQgaW50CQkJZGl0aGVyX2VuOjE7CisJCS8qIFs0OjddICovCisJCXVuc2lnbmVkIGludAkJCXJlc29sdmVkMTo0OworCQkvKiBbODoxMV0gKi8KKwkJdW5zaWduZWQgaW50CQkJY3dfZW46NDsKKwkJLyogWzEyOjE1XSAqLworCQllbnVtIGVfZzJkX3RyYW5zcGFyZW50X21vZGUJdHJhbnNwYXJlbnRfbW9kZTo0OworCQkvKiBbMTY6MTldICovCisJCWVudW0gZV9nMmRfY29sb3Jfa2V5X21vZGUJY29sb3Jfa2V5X21vZGU6NDsKKwkJLyogWzIwOjIzXSAqLworCQllbnVtIGVfZzJkX2FscGhhX2JsZW5kX21vZGUJYWxwaGFfYmxlbmRfbW9kZTo0OworCQkvKiBbMjQ6MjddICovCisJCXVuc2lnbmVkIGludCBzcmNfcHJlX211bHRpcGx5OjE7CisJCXVuc2lnbmVkIGludCBwYXRfcHJlX211bHRpcGx5OjE7CisJCXVuc2lnbmVkIGludCBkc3RfcHJlX211bHRpcGx5OjE7CisJCXVuc2lnbmVkIGludCBkc3RfZGVwcmVfbXVsdGlwbHk6MTsKKwkJLyogWzI4OjMxXSAqLworCQl1bnNpZ25lZCBpbnQgZmFzdF9zb2xpZF9jb2xvcl9maWxsX2VuOjE7CisJCXVuc2lnbmVkIGludCByZXNlcnZlZDozOworCX0gZGF0YTsKK307CisKK3VuaW9uIGcyZF9ibGVuZF9mdW5jX3ZhbCB7CisJdW5zaWduZWQgaW50IHZhbDsKKwlzdHJ1Y3QgeworCQkvKiBbMDoxNV0gKi8KKwkJZW51bSBlX2cyZF9jb2VmZl9tb2RlIHNyY19jb2VmZjo0OworCQllbnVtIGVfZzJkX2Fjb2VmZl9tb2RlIHNyY19jb2VmZl9zcmNfYToyOworCQllbnVtIGVfZzJkX2Fjb2VmZl9tb2RlIHNyY19jb2VmZl9kc3RfYToyOworCQllbnVtIGVfZzJkX2NvZWZmX21vZGUgZHN0X2NvZWZmOjQ7CisJCWVudW0gZV9nMmRfYWNvZWZmX21vZGUgZHN0X2NvZWZmX3NyY19hOjI7CisJCWVudW0gZV9nMmRfYWNvZWZmX21vZGUgZHN0X2NvZWZmX2RzdF9hOjI7CisJCS8qIFsxNjoxOV0gKi8KKwkJdW5zaWduZWQgaW50IGludl9zcmNfY29sb3JfY29lZmY6MTsKKwkJdW5zaWduZWQgaW50IHJlc29sZWQxOjE7CisJCXVuc2lnbmVkIGludCBpbnZfZHN0X2NvbG9yX2NvZWZmOjE7CisJCXVuc2lnbmVkIGludCByZXNvbGVkMjoxOworCQkvKiBbMjA6MjNdICovCisJCXVuc2lnbmVkIGludCBsaWdodGVuX2VuOjE7CisJCXVuc2lnbmVkIGludCBkYXJrZW5fZW46MTsKKwkJdW5zaWduZWQgaW50IHdpbl9jZV9zcmNfb3Zlcl9lbjoyOworCQkvKiBbMjQ6MzFdICovCisJCXVuc2lnbmVkIGludCByZXNlcnZlZDo4OworCX0gZGF0YTsKK307CisKK3N0cnVjdCBnMmRfaW1hZ2UgeworCWVudW0gZV9nMmRfc2VsZWN0X21vZGUJCXNlbGVjdF9tb2RlOworCWVudW0gZV9nMmRfY29sb3JfbW9kZQkJY29sb3JfbW9kZTsKKwllbnVtIGVfZzJkX3JlcGVhdF9tb2RlCQlyZXBlYXRfbW9kZTsKKwllbnVtIGVfZzJkX3NjYWxlX21vZGUJCXNjYWxlX21vZGU7CisJdW5zaWduZWQgaW50CQkJeHNjYWxlOworCXVuc2lnbmVkIGludAkJCXlzY2FsZTsKKwl1bnNpZ25lZCBjaGFyCQkJcm90YXRlXzkwOworCXVuc2lnbmVkIGNoYXIJCQl4X2RpcjsKKwl1bnNpZ25lZCBjaGFyCQkJeV9kaXI7CisJdW5zaWduZWQgY2hhcgkJCWNvbXBvbmVudF9hbHBoYTsKKwl1bnNpZ25lZCBpbnQJCQl3aWR0aDsKKwl1bnNpZ25lZCBpbnQJCQloZWlnaHQ7CisJdW5zaWduZWQgaW50CQkJc3RyaWRlOworCXVuc2lnbmVkIGludAkJCW5lZWRfZnJlZTsKKwl1bnNpZ25lZCBpbnQJCQljb2xvcjsKKwllbnVtIGVfZzJkX2J1Zl90eXBlCQlidWZfdHlwZTsKKwl1bnNpZ25lZCBpbnQJCQlib1tHMkRfUExBTkVfTUFYX05SXTsKKwlzdHJ1Y3QgZHJtX2V4eW5vc19nMmRfdXNlcnB0cgl1c2VyX3B0cltHMkRfUExBTkVfTUFYX05SXTsKKwl2b2lkCQkJCSptYXBwZWRfcHRyW0cyRF9QTEFORV9NQVhfTlJdOworfTsKKworc3RydWN0IGcyZF9jb250ZXh0OworCitzdHJ1Y3QgZzJkX2NvbnRleHQgKmcyZF9pbml0KGludCBmZCk7Cit2b2lkIGcyZF9maW5pKHN0cnVjdCBnMmRfY29udGV4dCAqY3R4KTsKK3ZvaWQgZzJkX2NvbmZpZ19ldmVudChzdHJ1Y3QgZzJkX2NvbnRleHQgKmN0eCwgdm9pZCAqdXNlcmRhdGEpOworaW50IGcyZF9leGVjKHN0cnVjdCBnMmRfY29udGV4dCAqY3R4KTsKK2ludCBnMmRfc29saWRfZmlsbChzdHJ1Y3QgZzJkX2NvbnRleHQgKmN0eCwgc3RydWN0IGcyZF9pbWFnZSAqaW1nLAorCQkJdW5zaWduZWQgaW50IHgsIHVuc2lnbmVkIGludCB5LCB1bnNpZ25lZCBpbnQgdywKKwkJCXVuc2lnbmVkIGludCBoKTsKK2ludCBnMmRfY29weShzdHJ1Y3QgZzJkX2NvbnRleHQgKmN0eCwgc3RydWN0IGcyZF9pbWFnZSAqc3JjLAorCQlzdHJ1Y3QgZzJkX2ltYWdlICpkc3QsIHVuc2lnbmVkIGludCBzcmNfeCwKKwkJdW5zaWduZWQgaW50IHNyY195LCB1bnNpZ25lZCBpbnQgZHN0X3gsIHVuc2lnbmVkIGludCBkc3RfeSwKKwkJdW5zaWduZWQgaW50IHcsIHVuc2lnbmVkIGludCBoKTsKK2ludCBnMmRfbW92ZShzdHJ1Y3QgZzJkX2NvbnRleHQgKmN0eCwgc3RydWN0IGcyZF9pbWFnZSAqaW1nLAorCQl1bnNpZ25lZCBpbnQgc3JjX3gsIHVuc2lnbmVkIGludCBzcmNfeSwgdW5zaWduZWQgaW50IGRzdF94LAorCQl1bnNpZ25lZCBkc3RfeSwgdW5zaWduZWQgaW50IHcsIHVuc2lnbmVkIGludCBoKTsKK2ludCBnMmRfY29weV93aXRoX3NjYWxlKHN0cnVjdCBnMmRfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZzJkX2ltYWdlICpzcmMsCisJCQkJc3RydWN0IGcyZF9pbWFnZSAqZHN0LCB1bnNpZ25lZCBpbnQgc3JjX3gsCisJCQkJdW5zaWduZWQgaW50IHNyY195LCB1bnNpZ25lZCBpbnQgc3JjX3csCisJCQkJdW5zaWduZWQgaW50IHNyY19oLCB1bnNpZ25lZCBpbnQgZHN0X3gsCisJCQkJdW5zaWduZWQgaW50IGRzdF95LCB1bnNpZ25lZCBpbnQgZHN0X3csCisJCQkJdW5zaWduZWQgaW50IGRzdF9oLCB1bnNpZ25lZCBpbnQgbmVnYXRpdmUpOworaW50IGcyZF9ibGVuZChzdHJ1Y3QgZzJkX2NvbnRleHQgKmN0eCwgc3RydWN0IGcyZF9pbWFnZSAqc3JjLAorCQlzdHJ1Y3QgZzJkX2ltYWdlICpkc3QsIHVuc2lnbmVkIGludCBzcmNfeCwKKwkJdW5zaWduZWQgaW50IHNyY195LCB1bnNpZ25lZCBpbnQgZHN0X3gsIHVuc2lnbmVkIGludCBkc3RfeSwKKwkJdW5zaWduZWQgaW50IHcsIHVuc2lnbmVkIGludCBoLCBlbnVtIGVfZzJkX29wIG9wKTsKK2ludCBnMmRfc2NhbGVfYW5kX2JsZW5kKHN0cnVjdCBnMmRfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZzJkX2ltYWdlICpzcmMsCisJCXN0cnVjdCBnMmRfaW1hZ2UgKmRzdCwgdW5zaWduZWQgaW50IHNyY194LCB1bnNpZ25lZCBpbnQgc3JjX3ksCisJCXVuc2lnbmVkIGludCBzcmNfdywgdW5zaWduZWQgaW50IHNyY19oLCB1bnNpZ25lZCBpbnQgZHN0X3gsCisJCXVuc2lnbmVkIGludCBkc3RfeSwgdW5zaWduZWQgaW50IGRzdF93LCB1bnNpZ25lZCBpbnQgZHN0X2gsCisJCWVudW0gZV9nMmRfb3Agb3ApOworI2VuZGlmIC8qIF9GSU1HMkRfSF8gKi8KZGlmZiAtLWdpdCBhL2V4eW5vcy9maW1nMmRfcmVnLmggYi9leHlub3MvZmltZzJkX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZGQ2MzQKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MvZmltZzJkX3JlZy5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uTHRkCisgKiBBdXRob3JzOgorICoJSW5raSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX0ZJTUcyRF9SRUdfSF8KKyNkZWZpbmUgX0ZJTUcyRF9SRUdfSF8KKworI2RlZmluZSBTT0ZUX1JFU0VUX1JFRwkJCSgweDAwMDApCisjZGVmaW5lIElOVEVOX1JFRwkJCSgweDAwMDQpCisjZGVmaW5lIElOVENfUEVORF9SRUcJCQkoMHgwMDBDKQorI2RlZmluZSBGSUZPX1NUQVRfUkVHCQkJKDB4MDAxMCkKKyNkZWZpbmUgQVhJX01PREVfUkVHCQkJKDB4MDAxQykKKyNkZWZpbmUgRE1BX1NGUl9CQVNFX0FERFJfUkVHCQkoMHgwMDgwKQorI2RlZmluZSBETUFfQ09NTUFORF9SRUcJCQkoMHgwMDg0KQorI2RlZmluZSBETUFfRVhFX0xJU1RfTlVNX1JFRwkJKDB4MDA4OCkKKyNkZWZpbmUgRE1BX1NUQVRVU19SRUcJCQkoMHgwMDhDKQorI2RlZmluZSBETUFfSE9MRF9DTURfUkVHCQkoMHgwMDkwKQorCisvKiBDT01NQU5EIFJFR0lTVEVSICovCisjZGVmaW5lIEJJVEJMVF9TVEFSVF9SRUcJCSgweDAxMDApCisjZGVmaW5lIEJJVEJMVF9DT01NQU5EX1JFRwkJKDB4MDEwNCkKKyNkZWZpbmUgQkxFTkRfRlVOQ1RJT05fUkVHCQkoMHgwMTA4KQkvKiBWRVI0LjEgKi8KKyNkZWZpbmUgUk9VTkRfTU9ERV9SRUcJCQkoMHgwMTBDKQkvKiBWRVI0LjEgKi8KKworLyogUEFSQU1FVEVSIFNFVFRJTkcgUkVHSVNURVIgKi8KKyNkZWZpbmUgUk9UQVRFX1JFRwkJCSgweDAyMDApCisjZGVmaW5lIFNSQ19NQVNLX0RJUkVDVF9SRUcJCSgweDAyMDQpCisjZGVmaW5lIERTVF9QQVRfRElSRUNUX1JFRwkJKDB4MDIwOCkKKworLyogU09VUkNFICovCisjZGVmaW5lIFNSQ19TRUxFQ1RfUkVHCQkJKDB4MDMwMCkKKyNkZWZpbmUgU1JDX0JBU0VfQUREUl9SRUcJCSgweDAzMDQpCisjZGVmaW5lIFNSQ19TVFJJREVfUkVHCQkJKDB4MDMwOCkKKyNkZWZpbmUgU1JDX0NPTE9SX01PREVfUkVHCQkoMHgwMzBjKQorI2RlZmluZSBTUkNfTEVGVF9UT1BfUkVHCQkoMHgwMzEwKQorI2RlZmluZSBTUkNfUklHSFRfQk9UVE9NX1JFRwkJKDB4MDMxNCkKKyNkZWZpbmUgU1JDX1BMQU5FMl9CQVNFX0FERFJfUkVHCSgweDAzMTgpCS8qIFZFUjQuMSAqLworI2RlZmluZSBTUkNfUkVQRUFUX01PREVfUkVHCQkoMHgwMzFDKQorI2RlZmluZSBTUkNfUEFEX1ZBTFVFX1JFRwkJKDB4MDMyMCkKKyNkZWZpbmUgU1JDX0E4X1JHQl9FWFRfUkVHCQkoMHgwMzI0KQorI2RlZmluZSBTUkNfU0NBTEVfQ1RSTF9SRUcJCSgweDAzMjgpCisjZGVmaW5lIFNSQ19YU0NBTEVfUkVHCQkJKDB4MDMyQykKKyNkZWZpbmUgU1JDX1lTQ0FMRV9SRUcJCQkoMHgwMzMwKQorCisvKiBERVNUSU5BVElPTiAqLworI2RlZmluZSBEU1RfU0VMRUNUX1JFRwkJCSgweDA0MDApCisjZGVmaW5lIERTVF9CQVNFX0FERFJfUkVHCQkoMHgwNDA0KQorI2RlZmluZSBEU1RfU1RSSURFX1JFRwkJCSgweDA0MDgpCisjZGVmaW5lIERTVF9DT0xPUl9NT0RFX1JFRwkJKDB4MDQwQykKKyNkZWZpbmUgRFNUX0xFRlRfVE9QX1JFRwkJKDB4MDQxMCkKKyNkZWZpbmUgRFNUX1JJR0hUX0JPVFRPTV9SRUcJCSgweDA0MTQpCisjZGVmaW5lIERTVF9QTEFORTJfQkFTRV9BRERSX1JFRwkoMHgwNDE4KQkvKiBWRVI0LjEgKi8KKyNkZWZpbmUgRFNUX0E4X1JHQl9FWFRfUkVHCQkoMHgwNDFDKQorCisvKiBQQVRURVJOICovCisjZGVmaW5lIFBBVF9CQVNFX0FERFJfUkVHCQkoMHgwNTAwKQorI2RlZmluZSBQQVRfU0laRV9SRUcJCQkoMHgwNTA0KQorI2RlZmluZSBQQVRfQ09MT1JfTU9ERV9SRUcJCSgweDA1MDgpCisjZGVmaW5lIFBBVF9PRkZTRVRfUkVHCQkJKDB4MDUwQykKKyNkZWZpbmUgUEFUX1NUUklERV9SRUcJCQkoMHgwNTEwKQorCisvKiBNQVNLCSovCisjZGVmaW5lIE1BU0tfQkFTRV9BRERSX1JFRwkJKDB4MDUyMCkKKyNkZWZpbmUgTUFTS19TVFJJREVfUkVHCQkJKDB4MDUyNCkKKyNkZWZpbmUgTUFTS19MRUZUX1RPUF9SRUcJCSgweDA1MjgpCS8qIFZFUjQuMSAqLworI2RlZmluZSBNQVNLX1JJR0hUX0JPVFRPTV9SRUcJCSgweDA1MkMpCS8qIFZFUjQuMSAqLworI2RlZmluZSBNQVNLX01PREVfUkVHCQkJKDB4MDUzMCkJLyogVkVSNC4xICovCisjZGVmaW5lIE1BU0tfUkVQRUFUX01PREVfUkVHCQkoMHgwNTM0KQorI2RlZmluZSBNQVNLX1BBRF9WQUxVRV9SRUcJCSgweDA1MzgpCisjZGVmaW5lIE1BU0tfU0NBTEVfQ1RSTF9SRUcJCSgweDA1M0MpCisjZGVmaW5lIE1BU0tfWFNDQUxFX1JFRwkJCSgweDA1NDApCisjZGVmaW5lIE1BU0tfWVNDQUxFX1JFRwkJCSgweDA1NDQpCisKKy8qIENMSVBQSU5HIFdJTkRPVyAqLworI2RlZmluZSBDV19MVF9SRUcJCQkoMHgwNjAwKQorI2RlZmluZSBDV19SQl9SRUcJCQkoMHgwNjA0KQorCisvKiBST1AgJiBBTFBIQSBTRVRUSU5HICovCisjZGVmaW5lIFRISVJEX09QRVJBTkRfUkVHCQkoMHgwNjEwKQorI2RlZmluZSBST1A0X1JFRwkJCSgweDA2MTQpCisjZGVmaW5lIEFMUEhBX1JFRwkJCSgweDA2MTgpCisKKy8qIENPTE9SIFNFVFRJTkcgKi8KKyNkZWZpbmUgRkdfQ09MT1JfUkVHCQkJKDB4MDcwMCkKKyNkZWZpbmUgQkdfQ09MT1JfUkVHCQkJKDB4MDcwNCkKKyNkZWZpbmUgQlNfQ09MT1JfUkVHCQkJKDB4MDcwOCkKKyNkZWZpbmUgU0ZfQ09MT1JfUkVHCQkJKDB4MDcwQykJLyogVkVSNC4xICovCisKKy8qIENPTE9SIEtFWSAqLworI2RlZmluZSBTUkNfQ09MT1JLRVlfQ1RSTF9SRUcJCSgweDA3MTApCisjZGVmaW5lIFNSQ19DT0xPUktFWV9EUl9NSU5fUkVHCQkoMHgwNzE0KQorI2RlZmluZSBTUkNfQ09MT1JLRVlfRFJfTUFYX1JFRwkJKDB4MDcxOCkKKyNkZWZpbmUgRFNUX0NPTE9SS0VZX0NUUkxfUkVHCQkoMHgwNzFDKQorI2RlZmluZSBEU1RfQ09MT1JLRVlfRFJfTUlOX1JFRwkJKDB4MDcyMCkKKyNkZWZpbmUgRFNUX0NPTE9SS0VZX0RSX01BWF9SRUcJCSgweDA3MjQpCisvKiBZQ2JDciBzcmMgQ29sb3IgS2V5ICovCisjZGVmaW5lIFlDYkNyX1NSQ19DT0xPUktFWV9DVFJMX1JFRwkoMHgwNzI4KQkvKiBWRVI0LjEgKi8KKyNkZWZpbmUgWUNiQ3JfU1JDX0NPTE9SS0VZX0RSX01JTl9SRUcJKDB4MDcyQykJLyogVkVSNC4xICovCisjZGVmaW5lIFlDYkNyX1NSQ19DT0xPUktFWV9EUl9NQVhfUkVHCSgweDA3MzApCS8qIFZFUjQuMSAqLworLypZIENiQ3IgZHN0IENvbG9yIEtleSAqLworI2RlZmluZSBZQ2JDcl9EU1RfQ09MT1JLRVlfQ1RSTF9SRUcJKDB4MDczNCkJLyogVkVSNC4xICovCisjZGVmaW5lIFlDYkNyX0RTVF9DT0xPUktFWV9EUl9NSU5fUkVHCSgweDA3MzgpCS8qIFZFUjQuMSAqLworI2RlZmluZSBZQ2JDcl9EU1RfQ09MT1JLRVlfRFJfTUFYX1JFRwkoMHgwNzNDKQkvKiBWRVI0LjEgKi8KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2V4eW5vcy9saWJkcm1fZXh5bm9zLnBjLmluIGIvZXh5bm9zL2xpYmRybV9leHlub3MucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYxYzQzMgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vcy9saWJkcm1fZXh5bm9zLnBjLmluCkBAIC0wLDAgKzEsMTEgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiBsaWJkcm1fZXh5bm9zCitEZXNjcmlwdGlvbjogVXNlcnNwYWNlIGludGVyZmFjZSB0byBleHlub3Mga2VybmVsIERSTSBzZXJ2aWNlcworVmVyc2lvbjogMC43CitMaWJzOiAtTCR7bGliZGlyfSAtbGRybV9leHlub3MKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9IC1JJHtpbmNsdWRlZGlyfS9saWJkcm0gLUkke2luY2x1ZGVkaXJ9L2V4eW5vcworUmVxdWlyZXMucHJpdmF0ZTogbGliZHJtCmRpZmYgLS1naXQgYS9mcmVlZHJlbm8vQW5kcm9pZC5tayBiL2ZyZWVkcmVuby9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNTgyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9mcmVlZHJlbm8vQW5kcm9pZC5tawpAQCAtMCwwICsxLDE0IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBJbXBvcnQgdmFyaWFibGVzIExJQkRSTV9GUkVFRFJFTk9fRklMRVMsIExJQkRSTV9GUkVFRFJFTk9fSF9GSUxFUworaW5jbHVkZSAkKExPQ0FMX1BBVEgpL01ha2VmaWxlLnNvdXJjZXMKKworTE9DQUxfTU9EVUxFIDo9IGxpYmRybV9mcmVlZHJlbm8KKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJkcm0KKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoTElCRFJNX0ZSRUVEUkVOT19GSUxFUykKKworaW5jbHVkZSAkKExJQkRSTV9DT01NT05fTUspCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9mcmVlZHJlbm8vTWFrZWZpbGUuYW0gYi9mcmVlZHJlbm8vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JiMGQwMwotLS0gL2Rldi9udWxsCisrKyBiL2ZyZWVkcmVuby9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMxIEBACitBVVRPTUFLRV9PUFRJT05TPXN1YmRpci1vYmplY3RzCitpbmNsdWRlIE1ha2VmaWxlLnNvdXJjZXMKKworQU1fQ0ZMQUdTID0gXAorCSQoV0FSTl9DRkxBR1MpIFwKKwktSSQodG9wX3NyY2RpcikgXAorCSQoUFRIUkVBRFNUVUJTX0NGTEFHUykgXAorCSQoVkFMR1JJTkRfQ0ZMQUdTKSBcCisJLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUvZHJtCisKK2xpYmRybV9mcmVlZHJlbm9fbGFfTFRMSUJSQVJJRVMgPSBsaWJkcm1fZnJlZWRyZW5vLmxhCitsaWJkcm1fZnJlZWRyZW5vX2xhZGlyID0gJChsaWJkaXIpCitsaWJkcm1fZnJlZWRyZW5vX2xhX0xERkxBR1MgPSAtdmVyc2lvbi1udW1iZXIgMTowOjAgLW5vLXVuZGVmaW5lZAorbGliZHJtX2ZyZWVkcmVub19sYV9MSUJBREQgPSBcCisJLi4vbGliZHJtLmxhIFwKKwlAUFRIUkVBRFNUVUJTX0xJQlNAIFwKKwlAQ0xPQ0tfTElCQAorCitsaWJkcm1fZnJlZWRyZW5vX2xhX1NPVVJDRVMgPSAkKExJQkRSTV9GUkVFRFJFTk9fRklMRVMpCitpZiBIQVZFX0ZSRUVEUkVOT19LR1NMCitsaWJkcm1fZnJlZWRyZW5vX2xhX1NPVVJDRVMgKz0gJChMSUJEUk1fRlJFRURSRU5PX0tHU0xfRklMRVMpCitlbmRpZgorCitsaWJkcm1fZnJlZWRyZW5vY29tbW9uaW5jbHVkZWRpciA9ICR7aW5jbHVkZWRpcn0vZnJlZWRyZW5vCitsaWJkcm1fZnJlZWRyZW5vY29tbW9uaW5jbHVkZV9IRUFERVJTID0gJChMSUJEUk1fRlJFRURSRU5PX0hfRklMRVMpCisKK3BrZ2NvbmZpZ2RpciA9IEBwa2djb25maWdkaXJACitwa2djb25maWdfREFUQSA9IGxpYmRybV9mcmVlZHJlbm8ucGMKKworVEVTVFMgPSBmcmVlZHJlbm8tc3ltYm9sLWNoZWNrCitFWFRSQV9ESVNUID0gJChURVNUUykKZGlmZiAtLWdpdCBhL2ZyZWVkcmVuby9NYWtlZmlsZS5zb3VyY2VzIGIvZnJlZWRyZW5vL01ha2VmaWxlLnNvdXJjZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhhNjc5YgotLS0gL2Rldi9udWxsCisrKyBiL2ZyZWVkcmVuby9NYWtlZmlsZS5zb3VyY2VzCkBAIC0wLDAgKzEsMjYgQEAKK0xJQkRSTV9GUkVFRFJFTk9fRklMRVMgOj0gXAorCWZyZWVkcmVub19kZXZpY2UuYyBcCisJZnJlZWRyZW5vX3BpcGUuYyBcCisJZnJlZWRyZW5vX3ByaXYuaCBcCisJZnJlZWRyZW5vX3JpbmdidWZmZXIuYyBcCisJZnJlZWRyZW5vX2JvLmMgXAorCWZyZWVkcmVub19ib19jYWNoZS5jIFwKKwltc20vbXNtX2JvLmMgXAorCW1zbS9tc21fZGV2aWNlLmMgXAorCW1zbS9tc21fZHJtLmggXAorCW1zbS9tc21fcGlwZS5jIFwKKwltc20vbXNtX3ByaXYuaCBcCisJbXNtL21zbV9yaW5nYnVmZmVyLmMKKworTElCRFJNX0ZSRUVEUkVOT19LR1NMX0ZJTEVTIDo9IFwKKwlrZ3NsL2tnc2xfYm8uYyBcCisJa2dzbC9rZ3NsX2RldmljZS5jIFwKKwlrZ3NsL2tnc2xfZHJtLmggXAorCWtnc2wva2dzbF9waXBlLmMgXAorCWtnc2wva2dzbF9wcml2LmggXAorCWtnc2wva2dzbF9yaW5nYnVmZmVyLmMgXAorCWtnc2wvbXNtX2tnc2wuaAorCitMSUJEUk1fRlJFRURSRU5PX0hfRklMRVMgOj0gXAorCWZyZWVkcmVub19kcm1pZi5oIFwKKwlmcmVlZHJlbm9fcmluZ2J1ZmZlci5oCmRpZmYgLS1naXQgYS9mcmVlZHJlbm8vZnJlZWRyZW5vLXN5bWJvbC1jaGVjayBiL2ZyZWVkcmVuby9mcmVlZHJlbm8tc3ltYm9sLWNoZWNrCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQyZjJjNDMKLS0tIC9kZXYvbnVsbAorKysgYi9mcmVlZHJlbm8vZnJlZWRyZW5vLXN5bWJvbC1jaGVjawpAQCAtMCwwICsxLDYwIEBACisjIS9iaW4vYmFzaAorCisjIFRoZSBmb2xsb3dpbmcgc3ltYm9scyAocGFzdCB0aGUgZmlyc3QgZml2ZSkgYXJlIHRha2VuIGZyb20gdGhlIHB1YmxpYyBoZWFkZXJzLgorIyBBIGxpc3Qgb2YgdGhlIGxhdHRlciBzaG91bGQgYmUgYXZhaWxhYmxlIE1ha2VmaWxlLnNvdXJjZXMvTElCRFJNX0ZSRUVEUkVOT19IX0ZJTEVTCisKK0ZVTkNTPSQobm0gLUQgLS1mb3JtYXQ9YnNkIC0tZGVmaW5lZC1vbmx5ICR7MS0ubGlicy9saWJkcm1fZnJlZWRyZW5vLnNvfSB8IGF3ayAne3ByaW50ICQzfSd8IHdoaWxlIHJlYWQgZnVuYzsgZG8KKyggZ3JlcCAtcSAiXiRmdW5jJCIgfHwgZWNobyAkZnVuYyApICA8PEVPRgorX19ic3Nfc3RhcnQKK19lZGF0YQorX2VuZAorX2ZpbmkKK19pbml0CitmZF9ib19jcHVfZmluaQorZmRfYm9fY3B1X3ByZXAKK2ZkX2JvX2RlbAorZmRfYm9fZG1hYnVmCitmZF9ib19mcm9tX2RtYWJ1ZgorZmRfYm9fZnJvbV9mYmRldgorZmRfYm9fZnJvbV9oYW5kbGUKK2ZkX2JvX2Zyb21fbmFtZQorZmRfYm9fZ2V0X25hbWUKK2ZkX2JvX2hhbmRsZQorZmRfYm9fbWFwCitmZF9ib19uZXcKK2ZkX2JvX3JlZgorZmRfYm9fc2l6ZQorZmRfZGV2aWNlX2RlbAorZmRfZGV2aWNlX2ZkCitmZF9kZXZpY2VfbmV3CitmZF9kZXZpY2VfbmV3X2R1cAorZmRfZGV2aWNlX3JlZgorZmRfZGV2aWNlX3ZlcnNpb24KK2ZkX3BpcGVfZGVsCitmZF9waXBlX2dldF9wYXJhbQorZmRfcGlwZV9uZXcKK2ZkX3BpcGVfd2FpdAorZmRfcGlwZV93YWl0X3RpbWVvdXQKK2ZkX3JpbmdidWZmZXJfY21kX2NvdW50CitmZF9yaW5nYnVmZmVyX2RlbAorZmRfcmluZ2J1ZmZlcl9lbWl0X3JlbG9jX3JpbmcKK2ZkX3JpbmdidWZmZXJfZW1pdF9yZWxvY19yaW5nX2Z1bGwKK2ZkX3JpbmdidWZmZXJfZmx1c2gKK2ZkX3JpbmdidWZmZXJfZ3JvdworZmRfcmluZ2J1ZmZlcl9uZXcKK2ZkX3JpbmdidWZmZXJfcmVsb2MKK2ZkX3JpbmdidWZmZXJfcmVsb2MyCitmZF9yaW5nYnVmZmVyX3Jlc2V0CitmZF9yaW5nYnVmZmVyX3NldF9wYXJlbnQKK2ZkX3JpbmdidWZmZXJfdGltZXN0YW1wCitmZF9yaW5nbWFya2VyX2RlbAorZmRfcmluZ21hcmtlcl9kd29yZHMKK2ZkX3JpbmdtYXJrZXJfZmx1c2gKK2ZkX3JpbmdidWZmZXJfZmx1c2gyCitmZF9yaW5nbWFya2VyX21hcmsKK2ZkX3JpbmdtYXJrZXJfbmV3CitFT0YKK2RvbmUpCisKK3Rlc3QgISAtbiAiJEZVTkNTIiB8fCBlY2hvICRGVU5DUwordGVzdCAhIC1uICIkRlVOQ1MiCmRpZmYgLS1naXQgYS9mcmVlZHJlbm8vZnJlZWRyZW5vX2JvLmMgYi9mcmVlZHJlbm8vZnJlZWRyZW5vX2JvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4ZWE1OQotLS0gL2Rldi9udWxsCisrKyBiL2ZyZWVkcmVuby9mcmVlZHJlbm9fYm8uYwpAQCAtMCwwICsxLDMzNCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImsmciI7IHRhYi13aWR0aCA0OyBpbmRlbnQtdGFicy1tb2RlOiB0OyAtKi0gKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBSb2IgQ2xhcmsgPHJvYmNsYXJrQGZyZWVkZXNrdG9wLm9yZz4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJvYiBDbGFyayA8cm9iY2xhcmtAZnJlZWRlc2t0b3Aub3JnPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJmcmVlZHJlbm9fZHJtaWYuaCIKKyNpbmNsdWRlICJmcmVlZHJlbm9fcHJpdi5oIgorCitkcm1fcHJpdmF0ZSBwdGhyZWFkX211dGV4X3QgdGFibGVfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Citkcm1fcHJpdmF0ZSB2b2lkIGJvX2RlbChzdHJ1Y3QgZmRfYm8gKmJvKTsKKworLyogc2V0IGJ1ZmZlciBuYW1lLCBhbmQgYWRkIHRvIHRhYmxlLCBjYWxsIHcvIHRhYmxlX2xvY2sgaGVsZDogKi8KK3N0YXRpYyB2b2lkIHNldF9uYW1lKHN0cnVjdCBmZF9ibyAqYm8sIHVpbnQzMl90IG5hbWUpCit7CisJYm8tPm5hbWUgPSBuYW1lOworCS8qIGFkZCBvdXJzZWxmIGludG8gdGhlIGhhbmRsZSB0YWJsZTogKi8KKwlkcm1IYXNoSW5zZXJ0KGJvLT5kZXYtPm5hbWVfdGFibGUsIG5hbWUsIGJvKTsKK30KKworLyogbG9va3VwIGEgYnVmZmVyLCBjYWxsIHcvIHRhYmxlX2xvY2sgaGVsZDogKi8KK3N0YXRpYyBzdHJ1Y3QgZmRfYm8gKiBsb29rdXBfYm8odm9pZCAqdGJsLCB1aW50MzJfdCBrZXkpCit7CisJc3RydWN0IGZkX2JvICpibyA9IE5VTEw7CisJaWYgKCFkcm1IYXNoTG9va3VwKHRibCwga2V5LCAodm9pZCAqKikmYm8pKSB7CisJCS8qIGZvdW5kLCBpbmNyIHJlZmNudCBhbmQgcmV0dXJuOiAqLworCQlibyA9IGZkX2JvX3JlZihibyk7CisKKwkJLyogZG9uJ3QgYnJlYWsgdGhlIGJ1Y2tldCBpZiB0aGlzIGJvIHdhcyBmb3VuZCBpbiBvbmUgKi8KKwkJbGlzdF9kZWxpbml0KCZiby0+bGlzdCk7CisJfQorCXJldHVybiBibzsKK30KKworLyogYWxsb2NhdGUgYSBuZXcgYnVmZmVyIG9iamVjdCwgY2FsbCB3LyB0YWJsZV9sb2NrIGhlbGQgKi8KK3N0YXRpYyBzdHJ1Y3QgZmRfYm8gKiBib19mcm9tX2hhbmRsZShzdHJ1Y3QgZmRfZGV2aWNlICpkZXYsCisJCXVpbnQzMl90IHNpemUsIHVpbnQzMl90IGhhbmRsZSkKK3sKKwlzdHJ1Y3QgZmRfYm8gKmJvOworCisJYm8gPSBkZXYtPmZ1bmNzLT5ib19mcm9tX2hhbmRsZShkZXYsIHNpemUsIGhhbmRsZSk7CisJaWYgKCFibykgeworCQlzdHJ1Y3QgZHJtX2dlbV9jbG9zZSByZXEgPSB7CisJCQkJLmhhbmRsZSA9IGhhbmRsZSwKKwkJfTsKKwkJZHJtSW9jdGwoZGV2LT5mZCwgRFJNX0lPQ1RMX0dFTV9DTE9TRSwgJnJlcSk7CisJCXJldHVybiBOVUxMOworCX0KKwliby0+ZGV2ID0gZmRfZGV2aWNlX3JlZihkZXYpOworCWJvLT5zaXplID0gc2l6ZTsKKwliby0+aGFuZGxlID0gaGFuZGxlOworCWF0b21pY19zZXQoJmJvLT5yZWZjbnQsIDEpOworCWxpc3RfaW5pdGhlYWQoJmJvLT5saXN0KTsKKwkvKiBhZGQgb3Vyc2VsZiBpbnRvIHRoZSBoYW5kbGUgdGFibGU6ICovCisJZHJtSGFzaEluc2VydChkZXYtPmhhbmRsZV90YWJsZSwgaGFuZGxlLCBibyk7CisJcmV0dXJuIGJvOworfQorCitzdHJ1Y3QgZmRfYm8gKgorZmRfYm9fbmV3KHN0cnVjdCBmZF9kZXZpY2UgKmRldiwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3QgZmxhZ3MpCit7CisJc3RydWN0IGZkX2JvICpibyA9IE5VTEw7CisJdWludDMyX3QgaGFuZGxlOworCWludCByZXQ7CisKKwlibyA9IGZkX2JvX2NhY2hlX2FsbG9jKCZkZXYtPmJvX2NhY2hlLCAmc2l6ZSwgZmxhZ3MpOworCWlmIChibykKKwkJcmV0dXJuIGJvOworCisJcmV0ID0gZGV2LT5mdW5jcy0+Ym9fbmV3X2hhbmRsZShkZXYsIHNpemUsIGZsYWdzLCAmaGFuZGxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gTlVMTDsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmdGFibGVfbG9jayk7CisJYm8gPSBib19mcm9tX2hhbmRsZShkZXYsIHNpemUsIGhhbmRsZSk7CisJYm8tPmJvX3JldXNlID0gVFJVRTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmdGFibGVfbG9jayk7CisKKwlWR19CT19BTExPQyhibyk7CisKKwlyZXR1cm4gYm87Cit9CisKK3N0cnVjdCBmZF9ibyAqCitmZF9ib19mcm9tX2hhbmRsZShzdHJ1Y3QgZmRfZGV2aWNlICpkZXYsIHVpbnQzMl90IGhhbmRsZSwgdWludDMyX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZmRfYm8gKmJvID0gTlVMTDsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmdGFibGVfbG9jayk7CisKKwlibyA9IGxvb2t1cF9ibyhkZXYtPmhhbmRsZV90YWJsZSwgaGFuZGxlKTsKKwlpZiAoYm8pCisJCWdvdG8gb3V0X3VubG9jazsKKworCWJvID0gYm9fZnJvbV9oYW5kbGUoZGV2LCBzaXplLCBoYW5kbGUpOworCisJVkdfQk9fQUxMT0MoYm8pOworCitvdXRfdW5sb2NrOgorCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0YWJsZV9sb2NrKTsKKworCXJldHVybiBibzsKK30KKworc3RydWN0IGZkX2JvICoKK2ZkX2JvX2Zyb21fZG1hYnVmKHN0cnVjdCBmZF9kZXZpY2UgKmRldiwgaW50IGZkKQoreworCWludCByZXQsIHNpemU7CisJdWludDMyX3QgaGFuZGxlOworCXN0cnVjdCBmZF9ibyAqYm87CisKKwlwdGhyZWFkX211dGV4X2xvY2soJnRhYmxlX2xvY2spOworCXJldCA9IGRybVByaW1lRkRUb0hhbmRsZShkZXYtPmZkLCBmZCwgJmhhbmRsZSk7CisJaWYgKHJldCkgeworCQlwdGhyZWFkX211dGV4X3VubG9jaygmdGFibGVfbG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKworCWJvID0gbG9va3VwX2JvKGRldi0+aGFuZGxlX3RhYmxlLCBoYW5kbGUpOworCWlmIChibykKKwkJZ290byBvdXRfdW5sb2NrOworCisJLyogbHNlZWsoKSB0byBnZXQgYm8gc2l6ZSAqLworCXNpemUgPSBsc2VlayhmZCwgMCwgU0VFS19FTkQpOworCWxzZWVrKGZkLCAwLCBTRUVLX0NVUik7CisKKwlibyA9IGJvX2Zyb21faGFuZGxlKGRldiwgc2l6ZSwgaGFuZGxlKTsKKworCVZHX0JPX0FMTE9DKGJvKTsKKworb3V0X3VubG9jazoKKwlwdGhyZWFkX211dGV4X3VubG9jaygmdGFibGVfbG9jayk7CisKKwlyZXR1cm4gYm87Cit9CisKK3N0cnVjdCBmZF9ibyAqIGZkX2JvX2Zyb21fbmFtZShzdHJ1Y3QgZmRfZGV2aWNlICpkZXYsIHVpbnQzMl90IG5hbWUpCit7CisJc3RydWN0IGRybV9nZW1fb3BlbiByZXEgPSB7CisJCQkubmFtZSA9IG5hbWUsCisJfTsKKwlzdHJ1Y3QgZmRfYm8gKmJvOworCisJcHRocmVhZF9tdXRleF9sb2NrKCZ0YWJsZV9sb2NrKTsKKworCS8qIGNoZWNrIG5hbWUgdGFibGUgZmlyc3QsIHRvIHNlZSBpZiBibyBpcyBhbHJlYWR5IG9wZW46ICovCisJYm8gPSBsb29rdXBfYm8oZGV2LT5uYW1lX3RhYmxlLCBuYW1lKTsKKwlpZiAoYm8pCisJCWdvdG8gb3V0X3VubG9jazsKKworCWlmIChkcm1Jb2N0bChkZXYtPmZkLCBEUk1fSU9DVExfR0VNX09QRU4sICZyZXEpKSB7CisJCUVSUk9SX01TRygiZ2VtLW9wZW4gZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlibyA9IGxvb2t1cF9ibyhkZXYtPmhhbmRsZV90YWJsZSwgcmVxLmhhbmRsZSk7CisJaWYgKGJvKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlibyA9IGJvX2Zyb21faGFuZGxlKGRldiwgcmVxLnNpemUsIHJlcS5oYW5kbGUpOworCWlmIChibykgeworCQlzZXRfbmFtZShibywgbmFtZSk7CisJCVZHX0JPX0FMTE9DKGJvKTsKKwl9CisKK291dF91bmxvY2s6CisJcHRocmVhZF9tdXRleF91bmxvY2soJnRhYmxlX2xvY2spOworCisJcmV0dXJuIGJvOworfQorCitzdHJ1Y3QgZmRfYm8gKiBmZF9ib19yZWYoc3RydWN0IGZkX2JvICpibykKK3sKKwlhdG9taWNfaW5jKCZiby0+cmVmY250KTsKKwlyZXR1cm4gYm87Cit9CisKK3ZvaWQgZmRfYm9fZGVsKHN0cnVjdCBmZF9ibyAqYm8pCit7CisJc3RydWN0IGZkX2RldmljZSAqZGV2ID0gYm8tPmRldjsKKworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmYm8tPnJlZmNudCkpCisJCXJldHVybjsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmdGFibGVfbG9jayk7CisKKwlpZiAoYm8tPmJvX3JldXNlICYmIChmZF9ib19jYWNoZV9mcmVlKCZkZXYtPmJvX2NhY2hlLCBibykgPT0gMCkpCisJCWdvdG8gb3V0OworCisJYm9fZGVsKGJvKTsKKwlmZF9kZXZpY2VfZGVsX2xvY2tlZChkZXYpOworb3V0OgorCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0YWJsZV9sb2NrKTsKK30KKworLyogQ2FsbGVkIHVuZGVyIHRhYmxlX2xvY2sgKi8KK2RybV9wcml2YXRlIHZvaWQgYm9fZGVsKHN0cnVjdCBmZF9ibyAqYm8pCit7CisJVkdfQk9fRlJFRShibyk7CisKKwlpZiAoYm8tPm1hcCkKKwkJZHJtX211bm1hcChiby0+bWFwLCBiby0+c2l6ZSk7CisKKwkvKiBUT0RPIHByb2JhYmx5IGJvJ3MgaW4gYnVja2V0IGxpc3QgZ2V0IHJlbW92ZWQgZnJvbQorCSAqIGhhbmRsZSB0YWJsZT8/CisJICovCisKKwlpZiAoYm8tPmhhbmRsZSkgeworCQlzdHJ1Y3QgZHJtX2dlbV9jbG9zZSByZXEgPSB7CisJCQkJLmhhbmRsZSA9IGJvLT5oYW5kbGUsCisJCX07CisJCWRybUhhc2hEZWxldGUoYm8tPmRldi0+aGFuZGxlX3RhYmxlLCBiby0+aGFuZGxlKTsKKwkJaWYgKGJvLT5uYW1lKQorCQkJZHJtSGFzaERlbGV0ZShiby0+ZGV2LT5uYW1lX3RhYmxlLCBiby0+bmFtZSk7CisJCWRybUlvY3RsKGJvLT5kZXYtPmZkLCBEUk1fSU9DVExfR0VNX0NMT1NFLCAmcmVxKTsKKwl9CisKKwliby0+ZnVuY3MtPmRlc3Ryb3koYm8pOworfQorCitpbnQgZmRfYm9fZ2V0X25hbWUoc3RydWN0IGZkX2JvICpibywgdWludDMyX3QgKm5hbWUpCit7CisJaWYgKCFiby0+bmFtZSkgeworCQlzdHJ1Y3QgZHJtX2dlbV9mbGluayByZXEgPSB7CisJCQkJLmhhbmRsZSA9IGJvLT5oYW5kbGUsCisJCX07CisJCWludCByZXQ7CisKKwkJcmV0ID0gZHJtSW9jdGwoYm8tPmRldi0+ZmQsIERSTV9JT0NUTF9HRU1fRkxJTkssICZyZXEpOworCQlpZiAocmV0KSB7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcHRocmVhZF9tdXRleF9sb2NrKCZ0YWJsZV9sb2NrKTsKKwkJc2V0X25hbWUoYm8sIHJlcS5uYW1lKTsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJnRhYmxlX2xvY2spOworCQliby0+Ym9fcmV1c2UgPSBGQUxTRTsKKwl9CisKKwkqbmFtZSA9IGJvLT5uYW1lOworCisJcmV0dXJuIDA7Cit9CisKK3VpbnQzMl90IGZkX2JvX2hhbmRsZShzdHJ1Y3QgZmRfYm8gKmJvKQoreworCXJldHVybiBiby0+aGFuZGxlOworfQorCitpbnQgZmRfYm9fZG1hYnVmKHN0cnVjdCBmZF9ibyAqYm8pCit7CisJaW50IHJldCwgcHJpbWVfZmQ7CisKKwlyZXQgPSBkcm1QcmltZUhhbmRsZVRvRkQoYm8tPmRldi0+ZmQsIGJvLT5oYW5kbGUsIERSTV9DTE9FWEVDLAorCQkJJnByaW1lX2ZkKTsKKwlpZiAocmV0KSB7CisJCUVSUk9SX01TRygiZmFpbGVkIHRvIGdldCBkbWFidWYgZmQ6ICVkIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwliby0+Ym9fcmV1c2UgPSBGQUxTRTsKKworCXJldHVybiBwcmltZV9mZDsKK30KKwordWludDMyX3QgZmRfYm9fc2l6ZShzdHJ1Y3QgZmRfYm8gKmJvKQoreworCXJldHVybiBiby0+c2l6ZTsKK30KKwordm9pZCAqIGZkX2JvX21hcChzdHJ1Y3QgZmRfYm8gKmJvKQoreworCWlmICghYm8tPm1hcCkgeworCQl1aW50NjRfdCBvZmZzZXQ7CisJCWludCByZXQ7CisKKwkJcmV0ID0gYm8tPmZ1bmNzLT5vZmZzZXQoYm8sICZvZmZzZXQpOworCQlpZiAocmV0KSB7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWJvLT5tYXAgPSBkcm1fbW1hcCgwLCBiby0+c2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwKKwkJCQliby0+ZGV2LT5mZCwgb2Zmc2V0KTsKKwkJaWYgKGJvLT5tYXAgPT0gTUFQX0ZBSUxFRCkgeworCQkJRVJST1JfTVNHKCJtbWFwIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJYm8tPm1hcCA9IE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIGJvLT5tYXA7Cit9CisKKy8qIGEgYml0IG9kZCB0byB0YWtlIHRoZSBwaXBlIGFzIGFuIGFyZywgYnV0IGl0J3MgYSwgdW1tLCBxdWlyayBvZiBrZ3NsLi4gKi8KK2ludCBmZF9ib19jcHVfcHJlcChzdHJ1Y3QgZmRfYm8gKmJvLCBzdHJ1Y3QgZmRfcGlwZSAqcGlwZSwgdWludDMyX3Qgb3ApCit7CisJcmV0dXJuIGJvLT5mdW5jcy0+Y3B1X3ByZXAoYm8sIHBpcGUsIG9wKTsKK30KKwordm9pZCBmZF9ib19jcHVfZmluaShzdHJ1Y3QgZmRfYm8gKmJvKQoreworCWJvLT5mdW5jcy0+Y3B1X2ZpbmkoYm8pOworfQorCisjaWZuZGVmIEhBVkVfRlJFRURSRU5PX0tHU0wKK3N0cnVjdCBmZF9ibyAqIGZkX2JvX2Zyb21fZmJkZXYoc3RydWN0IGZkX3BpcGUgKnBpcGUsIGludCBmYmZkLCB1aW50MzJfdCBzaXplKQoreworICAgIHJldHVybiBOVUxMOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mcmVlZHJlbm8vZnJlZWRyZW5vX2JvX2NhY2hlLmMgYi9mcmVlZHJlbm8vZnJlZWRyZW5vX2JvX2NhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyMmYzYQotLS0gL2Rldi9udWxsCisrKyBiL2ZyZWVkcmVuby9mcmVlZHJlbm9fYm9fY2FjaGUuYwpAQCAtMCwwICsxLDIyNCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImsmciI7IHRhYi13aWR0aCA0OyBpbmRlbnQtdGFicy1tb2RlOiB0OyAtKi0gKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBSb2IgQ2xhcmsgPHJvYmNsYXJrQGZyZWVkZXNrdG9wLm9yZz4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJvYiBDbGFyayA8cm9iY2xhcmtAZnJlZWRlc2t0b3Aub3JnPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJmcmVlZHJlbm9fZHJtaWYuaCIKKyNpbmNsdWRlICJmcmVlZHJlbm9fcHJpdi5oIgorCitkcm1fcHJpdmF0ZSB2b2lkIGJvX2RlbChzdHJ1Y3QgZmRfYm8gKmJvKTsKK2RybV9wcml2YXRlIGV4dGVybiBwdGhyZWFkX211dGV4X3QgdGFibGVfbG9jazsKKworc3RhdGljIHZvaWQKK2FkZF9idWNrZXQoc3RydWN0IGZkX2JvX2NhY2hlICpjYWNoZSwgaW50IHNpemUpCit7CisJdW5zaWduZWQgaW50IGkgPSBjYWNoZS0+bnVtX2J1Y2tldHM7CisKKwlhc3NlcnQoaSA8IEFSUkFZX1NJWkUoY2FjaGUtPmNhY2hlX2J1Y2tldCkpOworCisJbGlzdF9pbml0aGVhZCgmY2FjaGUtPmNhY2hlX2J1Y2tldFtpXS5saXN0KTsKKwljYWNoZS0+Y2FjaGVfYnVja2V0W2ldLnNpemUgPSBzaXplOworCWNhY2hlLT5udW1fYnVja2V0cysrOworfQorCisvKioKKyAqIEBjb2Fyc2U6IGlmIHRydWUsIG9ubHkgcG93ZXItb2YtdHdvIGJ1Y2tldCBzaXplcywgb3RoZXJ3aXNlCisgKiAgICBmaWxsIGluIGZvciBhIGJpdCBzbW9vdGhlciBzaXplIGN1cnZlLi4KKyAqLworZHJtX3ByaXZhdGUgdm9pZAorZmRfYm9fY2FjaGVfaW5pdChzdHJ1Y3QgZmRfYm9fY2FjaGUgKmNhY2hlLCBpbnQgY291cnNlKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgY2FjaGVfbWF4X3NpemUgPSA2NCAqIDEwMjQgKiAxMDI0OworCisJLyogT0ssIHNvIHBvd2VyIG9mIHR3byBidWNrZXRzIHdhcyB0b28gd2FzdGVmdWwgb2YgbWVtb3J5LgorCSAqIEdpdmUgMyBvdGhlciBzaXplcyBiZXR3ZWVuIGVhY2ggcG93ZXIgb2YgdHdvLCB0byBob3BlZnVsbHkKKwkgKiBjb3ZlciB0aGluZ3MgYWNjdXJhdGVseSBlbm91Z2guICAoVGhlIGFsdGVybmF0aXZlIGlzCisJICogcHJvYmFibHkgdG8ganVzdCBnbyBmb3IgZXhhY3QgbWF0Y2hpbmcgb2Ygc2l6ZXMsIGFuZCBhc3N1bWUKKwkgKiB0aGF0IGZvciB0aGluZ3MgbGlrZSBjb21wb3NpdGVkIHdpbmRvdyByZXNpemUgdGhlIHRpbGVkCisJICogd2lkdGgvaGVpZ2h0IGFsaWdubWVudCBhbmQgcm91bmRpbmcgb2Ygc2l6ZXMgdG8gcGFnZXMgd2lsbAorCSAqIGdldCB1cyB1c2VmdWwgY2FjaGUgaGl0IHJhdGVzIGFueXdheSkKKwkgKi8KKwlhZGRfYnVja2V0KGNhY2hlLCA0MDk2KTsKKwlhZGRfYnVja2V0KGNhY2hlLCA0MDk2ICogMik7CisJaWYgKCFjb3Vyc2UpCisJCWFkZF9idWNrZXQoY2FjaGUsIDQwOTYgKiAzKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGxpbmtlZCBsaXN0cyBmb3IgQk8gcmV1c2UgY2FjaGUuICovCisJZm9yIChzaXplID0gNCAqIDQwOTY7IHNpemUgPD0gY2FjaGVfbWF4X3NpemU7IHNpemUgKj0gMikgeworCQlhZGRfYnVja2V0KGNhY2hlLCBzaXplKTsKKwkJaWYgKCFjb3Vyc2UpIHsKKwkJCWFkZF9idWNrZXQoY2FjaGUsIHNpemUgKyBzaXplICogMSAvIDQpOworCQkJYWRkX2J1Y2tldChjYWNoZSwgc2l6ZSArIHNpemUgKiAyIC8gNCk7CisJCQlhZGRfYnVja2V0KGNhY2hlLCBzaXplICsgc2l6ZSAqIDMgLyA0KTsKKwkJfQorCX0KK30KKworLyogRnJlZXMgb2xkZXIgY2FjaGVkIGJ1ZmZlcnMuICBDYWxsZWQgdW5kZXIgdGFibGVfbG9jayAqLworZHJtX3ByaXZhdGUgdm9pZAorZmRfYm9fY2FjaGVfY2xlYW51cChzdHJ1Y3QgZmRfYm9fY2FjaGUgKmNhY2hlLCB0aW1lX3QgdGltZSkKK3sKKwlpbnQgaTsKKworCWlmIChjYWNoZS0+dGltZSA9PSB0aW1lKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgY2FjaGUtPm51bV9idWNrZXRzOyBpKyspIHsKKwkJc3RydWN0IGZkX2JvX2J1Y2tldCAqYnVja2V0ID0gJmNhY2hlLT5jYWNoZV9idWNrZXRbaV07CisJCXN0cnVjdCBmZF9ibyAqYm87CisKKwkJd2hpbGUgKCFMSVNUX0lTX0VNUFRZKCZidWNrZXQtPmxpc3QpKSB7CisJCQlibyA9IExJU1RfRU5UUlkoc3RydWN0IGZkX2JvLCBidWNrZXQtPmxpc3QubmV4dCwgbGlzdCk7CisKKwkJCS8qIGtlZXAgdGhpbmdzIGluIGNhY2hlIGZvciBhdCBsZWFzdCAxIHNlY29uZDogKi8KKwkJCWlmICh0aW1lICYmICgodGltZSAtIGJvLT5mcmVlX3RpbWUpIDw9IDEpKQorCQkJCWJyZWFrOworCisJCQlWR19CT19PQlRBSU4oYm8pOworCQkJbGlzdF9kZWwoJmJvLT5saXN0KTsKKwkJCWJvX2RlbChibyk7CisJCX0KKwl9CisKKwljYWNoZS0+dGltZSA9IHRpbWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmRfYm9fYnVja2V0ICogZ2V0X2J1Y2tldChzdHJ1Y3QgZmRfYm9fY2FjaGUgKmNhY2hlLCB1aW50MzJfdCBzaXplKQoreworCWludCBpOworCisJLyogaG1tLCB0aGlzIGlzIHdoYXQgaW50ZWwgZG9lcywgYnV0IEkgc3VwcG9zZSB3ZSBjb3VsZCBjYWxjdWxhdGUgb3VyCisJICogd2F5IHRvIHRoZSBjb3JyZWN0IGJ1Y2tldCBzaXplIHJhdGhlciB0aGFuIGxvb3BpbmcuLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBjYWNoZS0+bnVtX2J1Y2tldHM7IGkrKykgeworCQlzdHJ1Y3QgZmRfYm9fYnVja2V0ICpidWNrZXQgPSAmY2FjaGUtPmNhY2hlX2J1Y2tldFtpXTsKKwkJaWYgKGJ1Y2tldC0+c2l6ZSA+PSBzaXplKSB7CisJCQlyZXR1cm4gYnVja2V0OworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgaXNfaWRsZShzdHJ1Y3QgZmRfYm8gKmJvKQoreworCXJldHVybiBmZF9ib19jcHVfcHJlcChibywgTlVMTCwKKwkJCURSTV9GUkVFRFJFTk9fUFJFUF9SRUFEIHwKKwkJCURSTV9GUkVFRFJFTk9fUFJFUF9XUklURSB8CisJCQlEUk1fRlJFRURSRU5PX1BSRVBfTk9TWU5DKSA9PSAwOworfQorCitzdGF0aWMgc3RydWN0IGZkX2JvICpmaW5kX2luX2J1Y2tldChzdHJ1Y3QgZmRfYm9fYnVja2V0ICpidWNrZXQsIHVpbnQzMl90IGZsYWdzKQoreworCXN0cnVjdCBmZF9ibyAqYm8gPSBOVUxMOworCisJLyogVE9ETyAuLiBpZiB3ZSBoYWQgYW4gQUxMT0NfRk9SX1JFTkRFUiBmbGFnIGxpa2UgaW50ZWwsIHdlIGNvdWxkCisJICogc2tpcCB0aGUgYnVzeSBjaGVjay4uIGlmIGl0IGlzIG9ubHkgZ29pbmcgdG8gYmUgYSByZW5kZXIgdGFyZ2V0CisJICogdGhlbiB3ZSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIHN0YWxsLi4KKwkgKgorCSAqIE5PVEUgdGhhdCBpbnRlbCB0YWtlcyBBTExPQ19GT1JfUkVOREVSIGJvJ3MgZnJvbSB0aGUgbGlzdCB0YWlsCisJICogKE1SVSwgc2luY2UgbGlrZWx5IHRvIGJlIGluIEdQVSBjYWNoZSksIHJhdGhlciB0aGFuIGhlYWQgKExSVSkuLgorCSAqLworCXB0aHJlYWRfbXV0ZXhfbG9jaygmdGFibGVfbG9jayk7CisJaWYgKCFMSVNUX0lTX0VNUFRZKCZidWNrZXQtPmxpc3QpKSB7CisJCWJvID0gTElTVF9FTlRSWShzdHJ1Y3QgZmRfYm8sIGJ1Y2tldC0+bGlzdC5uZXh0LCBsaXN0KTsKKwkJLyogVE9ETyBjaGVjayBmb3IgY29tcGF0aWJsZSBmbGFncz8gKi8KKwkJaWYgKGlzX2lkbGUoYm8pKSB7CisJCQlsaXN0X2RlbCgmYm8tPmxpc3QpOworCQl9IGVsc2UgeworCQkJYm8gPSBOVUxMOworCQl9CisJfQorCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0YWJsZV9sb2NrKTsKKworCXJldHVybiBibzsKK30KKworLyogTk9URTogc2l6ZSBpcyBwb3RlbnRpYWxseSByb3VuZGVkIHVwIHRvIGJ1Y2tldCBzaXplOiAqLworZHJtX3ByaXZhdGUgc3RydWN0IGZkX2JvICoKK2ZkX2JvX2NhY2hlX2FsbG9jKHN0cnVjdCBmZF9ib19jYWNoZSAqY2FjaGUsIHVpbnQzMl90ICpzaXplLCB1aW50MzJfdCBmbGFncykKK3sKKwlzdHJ1Y3QgZmRfYm8gKmJvID0gTlVMTDsKKwlzdHJ1Y3QgZmRfYm9fYnVja2V0ICpidWNrZXQ7CisKKwkqc2l6ZSA9IEFMSUdOKCpzaXplLCA0MDk2KTsKKwlidWNrZXQgPSBnZXRfYnVja2V0KGNhY2hlLCAqc2l6ZSk7CisKKwkvKiBzZWUgaWYgd2UgY2FuIGJlIGdyZWVuIGFuZCByZWN5Y2xlOiAqLworcmV0cnk6CisJaWYgKGJ1Y2tldCkgeworCQkqc2l6ZSA9IGJ1Y2tldC0+c2l6ZTsKKwkJYm8gPSBmaW5kX2luX2J1Y2tldChidWNrZXQsIGZsYWdzKTsKKwkJaWYgKGJvKSB7CisJCQlWR19CT19PQlRBSU4oYm8pOworCQkJaWYgKGJvLT5mdW5jcy0+bWFkdmlzZShibywgVFJVRSkgPD0gMCkgeworCQkJCS8qIHdlJ3ZlIGxvc3QgdGhlIGJhY2tpbmcgcGFnZXMsIGRlbGV0ZSBhbmQgdHJ5IGFnYWluOiAqLworCQkJCXB0aHJlYWRfbXV0ZXhfbG9jaygmdGFibGVfbG9jayk7CisJCQkJYm9fZGVsKGJvKTsKKwkJCQlwdGhyZWFkX211dGV4X3VubG9jaygmdGFibGVfbG9jayk7CisJCQkJZ290byByZXRyeTsKKwkJCX0KKwkJCWF0b21pY19zZXQoJmJvLT5yZWZjbnQsIDEpOworCQkJZmRfZGV2aWNlX3JlZihiby0+ZGV2KTsKKwkJCXJldHVybiBibzsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitkcm1fcHJpdmF0ZSBpbnQKK2ZkX2JvX2NhY2hlX2ZyZWUoc3RydWN0IGZkX2JvX2NhY2hlICpjYWNoZSwgc3RydWN0IGZkX2JvICpibykKK3sKKwlzdHJ1Y3QgZmRfYm9fYnVja2V0ICpidWNrZXQgPSBnZXRfYnVja2V0KGNhY2hlLCBiby0+c2l6ZSk7CisKKwkvKiBzZWUgaWYgd2UgY2FuIGJlIGdyZWVuIGFuZCByZWN5Y2xlOiAqLworCWlmIChidWNrZXQpIHsKKwkJc3RydWN0IHRpbWVzcGVjIHRpbWU7CisKKwkJYm8tPmZ1bmNzLT5tYWR2aXNlKGJvLCBGQUxTRSk7CisKKwkJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0aW1lKTsKKworCQliby0+ZnJlZV90aW1lID0gdGltZS50dl9zZWM7CisJCVZHX0JPX1JFTEVBU0UoYm8pOworCQlsaXN0X2FkZHRhaWwoJmJvLT5saXN0LCAmYnVja2V0LT5saXN0KTsKKwkJZmRfYm9fY2FjaGVfY2xlYW51cChjYWNoZSwgdGltZS50dl9zZWMpOworCisJCS8qIGJvJ3MgaW4gdGhlIGJ1Y2tldCBjYWNoZSBkb24ndCBoYXZlIGEgcmVmIGFuZAorCQkgKiBkb24ndCBob2xkIGEgcmVmIHRvIHRoZSBkZXY6CisJCSAqLworCQlmZF9kZXZpY2VfZGVsX2xvY2tlZChiby0+ZGV2KTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9mcmVlZHJlbm8vZnJlZWRyZW5vX2RldmljZS5jIGIvZnJlZWRyZW5vL2ZyZWVkcmVub19kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmI5NWZkCi0tLSAvZGV2L251bGwKKysrIGIvZnJlZWRyZW5vL2ZyZWVkcmVub19kZXZpY2UuYwpAQCAtMCwwICsxLDE0OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImsmciI7IHRhYi13aWR0aCA0OyBpbmRlbnQtdGFicy1tb2RlOiB0OyAtKi0gKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBSb2IgQ2xhcmsgPHJvYmNsYXJrQGZyZWVkZXNrdG9wLm9yZz4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJvYiBDbGFyayA8cm9iY2xhcmtAZnJlZWRlc2t0b3Aub3JnPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiZnJlZWRyZW5vX2RybWlmLmgiCisjaW5jbHVkZSAiZnJlZWRyZW5vX3ByaXYuaCIKKworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCB0YWJsZV9sb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworc3RydWN0IGZkX2RldmljZSAqIGtnc2xfZGV2aWNlX25ldyhpbnQgZmQpOworc3RydWN0IGZkX2RldmljZSAqIG1zbV9kZXZpY2VfbmV3KGludCBmZCk7CisKK3N0cnVjdCBmZF9kZXZpY2UgKiBmZF9kZXZpY2VfbmV3KGludCBmZCkKK3sKKwlzdHJ1Y3QgZmRfZGV2aWNlICpkZXY7CisJZHJtVmVyc2lvblB0ciB2ZXJzaW9uOworCisJLyogZmlndXJlIG91dCBpZiB3ZSBhcmUga2dzbCBvciBtc20gZHJtIGRyaXZlcjogKi8KKwl2ZXJzaW9uID0gZHJtR2V0VmVyc2lvbihmZCk7CisJaWYgKCF2ZXJzaW9uKSB7CisJCUVSUk9SX01TRygiY2Fubm90IGdldCB2ZXJzaW9uOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghc3RyY21wKHZlcnNpb24tPm5hbWUsICJtc20iKSkgeworCQlERUJVR19NU0coIm1zbSBEUk0gZGV2aWNlIik7CisJCWlmICh2ZXJzaW9uLT52ZXJzaW9uX21ham9yICE9IDEpIHsKKwkJCUVSUk9SX01TRygidW5zdXBwb3J0ZWQgdmVyc2lvbjogJXUuJXUuJXUiLCB2ZXJzaW9uLT52ZXJzaW9uX21ham9yLAorCQkJCXZlcnNpb24tPnZlcnNpb25fbWlub3IsIHZlcnNpb24tPnZlcnNpb25fcGF0Y2hsZXZlbCk7CisJCQlkZXYgPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KKworCQlkZXYgPSBtc21fZGV2aWNlX25ldyhmZCk7CisJCWRldi0+dmVyc2lvbiA9IHZlcnNpb24tPnZlcnNpb25fbWlub3I7CisjaWZkZWYgSEFWRV9GUkVFRFJFTk9fS0dTTAorCX0gZWxzZSBpZiAoIXN0cmNtcCh2ZXJzaW9uLT5uYW1lLCAia2dzbCIpKSB7CisJCURFQlVHX01TRygia2dzbCBEUk0gZGV2aWNlIik7CisJCWRldiA9IGtnc2xfZGV2aWNlX25ldyhmZCk7CisjZW5kaWYKKwl9IGVsc2UgeworCQlFUlJPUl9NU0coInVua25vd24gZGV2aWNlOiAlcyIsIHZlcnNpb24tPm5hbWUpOworCQlkZXYgPSBOVUxMOworCX0KKworb3V0OgorCWRybUZyZWVWZXJzaW9uKHZlcnNpb24pOworCisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCisJYXRvbWljX3NldCgmZGV2LT5yZWZjbnQsIDEpOworCWRldi0+ZmQgPSBmZDsKKwlkZXYtPmhhbmRsZV90YWJsZSA9IGRybUhhc2hDcmVhdGUoKTsKKwlkZXYtPm5hbWVfdGFibGUgPSBkcm1IYXNoQ3JlYXRlKCk7CisJZmRfYm9fY2FjaGVfaW5pdCgmZGV2LT5ib19jYWNoZSwgRkFMU0UpOworCisJcmV0dXJuIGRldjsKK30KKworLyogbGlrZSBmZF9kZXZpY2VfbmV3KCkgYnV0IGNyZWF0ZXMgaXQncyBvd24gcHJpdmF0ZSBkdXAoKSBvZiB0aGUgZmQKKyAqIHdoaWNoIGlzIGNsb3NlKClkIHdoZW4gdGhlIGRldmljZSBpcyBmaW5hbGl6ZWQuCisgKi8KK3N0cnVjdCBmZF9kZXZpY2UgKiBmZF9kZXZpY2VfbmV3X2R1cChpbnQgZmQpCit7CisJaW50IGR1cF9mZCA9IGR1cChmZCk7CisJc3RydWN0IGZkX2RldmljZSAqZGV2ID0gZmRfZGV2aWNlX25ldyhkdXBfZmQpOworCWlmIChkZXYpCisJCWRldi0+Y2xvc2VmZCA9IDE7CisJZWxzZQorCQljbG9zZShkdXBfZmQpOworCXJldHVybiBkZXY7Cit9CisKK3N0cnVjdCBmZF9kZXZpY2UgKiBmZF9kZXZpY2VfcmVmKHN0cnVjdCBmZF9kZXZpY2UgKmRldikKK3sKKwlhdG9taWNfaW5jKCZkZXYtPnJlZmNudCk7CisJcmV0dXJuIGRldjsKK30KKworc3RhdGljIHZvaWQgZmRfZGV2aWNlX2RlbF9pbXBsKHN0cnVjdCBmZF9kZXZpY2UgKmRldikKK3sKKwlpbnQgY2xvc2VfZmQgPSBkZXYtPmNsb3NlZmQgPyBkZXYtPmZkIDogLTE7CisJZmRfYm9fY2FjaGVfY2xlYW51cCgmZGV2LT5ib19jYWNoZSwgMCk7CisJZHJtSGFzaERlc3Ryb3koZGV2LT5oYW5kbGVfdGFibGUpOworCWRybUhhc2hEZXN0cm95KGRldi0+bmFtZV90YWJsZSk7CisJZGV2LT5mdW5jcy0+ZGVzdHJveShkZXYpOworCWlmIChjbG9zZV9mZCA+PSAwKQorCQljbG9zZShjbG9zZV9mZCk7Cit9CisKK2RybV9wcml2YXRlIHZvaWQgZmRfZGV2aWNlX2RlbF9sb2NrZWQoc3RydWN0IGZkX2RldmljZSAqZGV2KQoreworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmZGV2LT5yZWZjbnQpKQorCQlyZXR1cm47CisJZmRfZGV2aWNlX2RlbF9pbXBsKGRldik7Cit9CisKK3ZvaWQgZmRfZGV2aWNlX2RlbChzdHJ1Y3QgZmRfZGV2aWNlICpkZXYpCit7CisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXYtPnJlZmNudCkpCisJCXJldHVybjsKKwlwdGhyZWFkX211dGV4X2xvY2soJnRhYmxlX2xvY2spOworCWZkX2RldmljZV9kZWxfaW1wbChkZXYpOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0YWJsZV9sb2NrKTsKK30KKworaW50IGZkX2RldmljZV9mZChzdHJ1Y3QgZmRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+ZmQ7Cit9CisKK2VudW0gZmRfdmVyc2lvbiBmZF9kZXZpY2VfdmVyc2lvbihzdHJ1Y3QgZmRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+dmVyc2lvbjsKK30KZGlmZiAtLWdpdCBhL2ZyZWVkcmVuby9mcmVlZHJlbm9fZHJtaWYuaCBiL2ZyZWVkcmVuby9mcmVlZHJlbm9fZHJtaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTgwNzNmCi0tLSAvZGV2L251bGwKKysrIGIvZnJlZWRyZW5vL2ZyZWVkcmVub19kcm1pZi5oCkBAIC0wLDAgKzEsMTMzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiayZyIjsgdGFiLXdpZHRoIDQ7IGluZGVudC10YWJzLW1vZGU6IHQ7IC0qLSAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFJvYiBDbGFyayA8cm9iY2xhcmtAZnJlZWRlc2t0b3Aub3JnPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgUm9iIENsYXJrIDxyb2JjbGFya0BmcmVlZGVza3RvcC5vcmc+CisgKi8KKworI2lmbmRlZiBGUkVFRFJFTk9fRFJNSUZfSF8KKyNkZWZpbmUgRlJFRURSRU5PX0RSTUlGX0hfCisKKyNpbmNsdWRlIDx4Zjg2ZHJtLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQorIyAgZGVmaW5lIGRybV9kZXByZWNhdGVkIF9fYXR0cmlidXRlX18oKF9fZGVwcmVjYXRlZF9fKSkKKyNlbHNlCisjICBkZWZpbmUgZHJtX2RlcHJlY2F0ZWQKKyNlbmRpZgorCisvKiBhbiBlbXB0eSBtYXJrZXIgZm9yIHRoaW5ncyB0aGF0IHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgZnV0dXJlOiAqLworI2RlZmluZSB3aWxsX2JlX2RlcHJlY2F0ZWQKKworc3RydWN0IGZkX2JvOworc3RydWN0IGZkX3BpcGU7CitzdHJ1Y3QgZmRfZGV2aWNlOworCitlbnVtIGZkX3BpcGVfaWQgeworCUZEX1BJUEVfM0QgPSAxLAorCUZEX1BJUEVfMkQgPSAyLAorCS8qIHNvbWUgZGV2aWNlcyBoYXZlIHR3byAyZCBibG9ja3MuLiBub3QgcmVhbGx5IHN1cmUgaG93IHRvCisJICogdXNlIHRoYXQgeWV0LCBzbyBqdXN0IGlnbm9yaW5nIHRoZSAybmQgMmQgcGlwZSBmb3Igbm93CisJICovCisJRkRfUElQRV9NQVgKK307CisKK2VudW0gZmRfcGFyYW1faWQgeworCUZEX0RFVklDRV9JRCwKKwlGRF9HTUVNX1NJWkUsCisJRkRfR1BVX0lELAorCUZEX0NISVBfSUQsCisJRkRfTUFYX0ZSRVEsCisJRkRfVElNRVNUQU1QLAorfTsKKworLyogYm8gZmxhZ3M6ICovCisjZGVmaW5lIERSTV9GUkVFRFJFTk9fR0VNX1RZUEVfU01JICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIERSTV9GUkVFRFJFTk9fR0VNX1RZUEVfS01FTSAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIERSTV9GUkVFRFJFTk9fR0VNX1RZUEVfTUVNX01BU0sgICAweDAwMDAwMDBmCisjZGVmaW5lIERSTV9GUkVFRFJFTk9fR0VNX0NBQ0hFX05PTkUgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIERSTV9GUkVFRFJFTk9fR0VNX0NBQ0hFX1dDT01CSU5FICAweDAwMTAwMDAwCisjZGVmaW5lIERSTV9GUkVFRFJFTk9fR0VNX0NBQ0hFX1dUSFJPVUdIICAweDAwMjAwMDAwCisjZGVmaW5lIERSTV9GUkVFRFJFTk9fR0VNX0NBQ0hFX1dCQUNLICAgICAweDAwNDAwMDAwCisjZGVmaW5lIERSTV9GUkVFRFJFTk9fR0VNX0NBQ0hFX1dCQUNLV0EgICAweDAwODAwMDAwCisjZGVmaW5lIERSTV9GUkVFRFJFTk9fR0VNX0NBQ0hFX01BU0sgICAgICAweDAwZjAwMDAwCisjZGVmaW5lIERSTV9GUkVFRFJFTk9fR0VNX0dQVVJFQURPTkxZICAgICAweDAxMDAwMDAwCisKKy8qIGJvIGFjY2VzcyBmbGFnczogKGtlZXAgYWxpZ25lZCB0byBNU01fUFJFUF94KSAqLworI2RlZmluZSBEUk1fRlJFRURSRU5PX1BSRVBfUkVBRCAgICAgICAgICAgMHgwMQorI2RlZmluZSBEUk1fRlJFRURSRU5PX1BSRVBfV1JJVEUgICAgICAgICAgMHgwMgorI2RlZmluZSBEUk1fRlJFRURSRU5PX1BSRVBfTk9TWU5DICAgICAgICAgMHgwNAorCisvKiBkZXZpY2UgZnVuY3Rpb25zOgorICovCisKK3N0cnVjdCBmZF9kZXZpY2UgKiBmZF9kZXZpY2VfbmV3KGludCBmZCk7CitzdHJ1Y3QgZmRfZGV2aWNlICogZmRfZGV2aWNlX25ld19kdXAoaW50IGZkKTsKK3N0cnVjdCBmZF9kZXZpY2UgKiBmZF9kZXZpY2VfcmVmKHN0cnVjdCBmZF9kZXZpY2UgKmRldik7Cit2b2lkIGZkX2RldmljZV9kZWwoc3RydWN0IGZkX2RldmljZSAqZGV2KTsKK2ludCBmZF9kZXZpY2VfZmQoc3RydWN0IGZkX2RldmljZSAqZGV2KTsKKworZW51bSBmZF92ZXJzaW9uIHsKKwlGRF9WRVJTSU9OX01BRFZJU0UgPSAxLCAgICAgICAgICAgIC8qIGtlcm5lbCBzdXBwb3J0cyBtYWR2aXNlICovCisJRkRfVkVSU0lPTl9VTkxJTUlURURfQ01EUyA9IDEsICAgICAvKiBzdWJtaXRzIHcvID40IGNtZCBidWZmZXJzIChncm93YWJsZSByaW5nYnVmZmVyKSAqLworCUZEX1ZFUlNJT05fRkVOQ0VfRkQgPSAyLCAgICAgICAgICAgLyogc3VibWl0IGNvbW1hbmQgc3VwcG9ydHMgaW4vb3V0IGZlbmNlcyAqLworfTsKK2VudW0gZmRfdmVyc2lvbiBmZF9kZXZpY2VfdmVyc2lvbihzdHJ1Y3QgZmRfZGV2aWNlICpkZXYpOworCisvKiBwaXBlIGZ1bmN0aW9uczoKKyAqLworCitzdHJ1Y3QgZmRfcGlwZSAqIGZkX3BpcGVfbmV3KHN0cnVjdCBmZF9kZXZpY2UgKmRldiwgZW51bSBmZF9waXBlX2lkIGlkKTsKK3ZvaWQgZmRfcGlwZV9kZWwoc3RydWN0IGZkX3BpcGUgKnBpcGUpOworaW50IGZkX3BpcGVfZ2V0X3BhcmFtKHN0cnVjdCBmZF9waXBlICpwaXBlLCBlbnVtIGZkX3BhcmFtX2lkIHBhcmFtLAorCQl1aW50NjRfdCAqdmFsdWUpOworaW50IGZkX3BpcGVfd2FpdChzdHJ1Y3QgZmRfcGlwZSAqcGlwZSwgdWludDMyX3QgdGltZXN0YW1wKTsKKy8qIHRpbWVvdXQgaW4gbmFub3NlYyAqLworaW50IGZkX3BpcGVfd2FpdF90aW1lb3V0KHN0cnVjdCBmZF9waXBlICpwaXBlLCB1aW50MzJfdCB0aW1lc3RhbXAsCisJCXVpbnQ2NF90IHRpbWVvdXQpOworCisKKy8qIGJ1ZmZlci1vYmplY3QgZnVuY3Rpb25zOgorICovCisKK3N0cnVjdCBmZF9ibyAqIGZkX2JvX25ldyhzdHJ1Y3QgZmRfZGV2aWNlICpkZXYsCisJCXVpbnQzMl90IHNpemUsIHVpbnQzMl90IGZsYWdzKTsKK3N0cnVjdCBmZF9ibyAqIGZkX2JvX2Zyb21fZmJkZXYoc3RydWN0IGZkX3BpcGUgKnBpcGUsCisJCWludCBmYmZkLCB1aW50MzJfdCBzaXplKTsKK3N0cnVjdCBmZF9ibyAqZmRfYm9fZnJvbV9oYW5kbGUoc3RydWN0IGZkX2RldmljZSAqZGV2LAorCQl1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IHNpemUpOworc3RydWN0IGZkX2JvICogZmRfYm9fZnJvbV9uYW1lKHN0cnVjdCBmZF9kZXZpY2UgKmRldiwgdWludDMyX3QgbmFtZSk7CitzdHJ1Y3QgZmRfYm8gKiBmZF9ib19mcm9tX2RtYWJ1ZihzdHJ1Y3QgZmRfZGV2aWNlICpkZXYsIGludCBmZCk7CitzdHJ1Y3QgZmRfYm8gKiBmZF9ib19yZWYoc3RydWN0IGZkX2JvICpibyk7Cit2b2lkIGZkX2JvX2RlbChzdHJ1Y3QgZmRfYm8gKmJvKTsKK2ludCBmZF9ib19nZXRfbmFtZShzdHJ1Y3QgZmRfYm8gKmJvLCB1aW50MzJfdCAqbmFtZSk7Cit1aW50MzJfdCBmZF9ib19oYW5kbGUoc3RydWN0IGZkX2JvICpibyk7CitpbnQgZmRfYm9fZG1hYnVmKHN0cnVjdCBmZF9ibyAqYm8pOwordWludDMyX3QgZmRfYm9fc2l6ZShzdHJ1Y3QgZmRfYm8gKmJvKTsKK3ZvaWQgKiBmZF9ib19tYXAoc3RydWN0IGZkX2JvICpibyk7CitpbnQgZmRfYm9fY3B1X3ByZXAoc3RydWN0IGZkX2JvICpibywgc3RydWN0IGZkX3BpcGUgKnBpcGUsIHVpbnQzMl90IG9wKTsKK3ZvaWQgZmRfYm9fY3B1X2Zpbmkoc3RydWN0IGZkX2JvICpibyk7CisKKyNlbmRpZiAvKiBGUkVFRFJFTk9fRFJNSUZfSF8gKi8KZGlmZiAtLWdpdCBhL2ZyZWVkcmVuby9mcmVlZHJlbm9fcGlwZS5jIGIvZnJlZWRyZW5vL2ZyZWVkcmVub19waXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5Y2IyOAotLS0gL2Rldi9udWxsCisrKyBiL2ZyZWVkcmVuby9mcmVlZHJlbm9fcGlwZS5jCkBAIC0wLDAgKzEsODIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJrJnIiOyB0YWItd2lkdGggNDsgaW5kZW50LXRhYnMtbW9kZTogdDsgLSotICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgUm9iIENsYXJrIDxyb2JjbGFya0BmcmVlZGVza3RvcC5vcmc+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBSb2IgQ2xhcmsgPHJvYmNsYXJrQGZyZWVkZXNrdG9wLm9yZz4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZnJlZWRyZW5vX2RybWlmLmgiCisjaW5jbHVkZSAiZnJlZWRyZW5vX3ByaXYuaCIKKworc3RydWN0IGZkX3BpcGUgKgorZmRfcGlwZV9uZXcoc3RydWN0IGZkX2RldmljZSAqZGV2LCBlbnVtIGZkX3BpcGVfaWQgaWQpCit7CisJc3RydWN0IGZkX3BpcGUgKnBpcGU7CisJdWludDY0X3QgdmFsOworCisJaWYgKGlkID4gRkRfUElQRV9NQVgpIHsKKwkJRVJST1JfTVNHKCJpbnZhbGlkIHBpcGUgaWQ6ICVkIiwgaWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwaXBlID0gZGV2LT5mdW5jcy0+cGlwZV9uZXcoZGV2LCBpZCk7CisJaWYgKCFwaXBlKSB7CisJCUVSUk9SX01TRygiYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcGlwZS0+ZGV2ID0gZGV2OworCXBpcGUtPmlkID0gaWQ7CisKKwlmZF9waXBlX2dldF9wYXJhbShwaXBlLCBGRF9HUFVfSUQsICZ2YWwpOworCXBpcGUtPmdwdV9pZCA9IHZhbDsKKworCXJldHVybiBwaXBlOworfQorCit2b2lkIGZkX3BpcGVfZGVsKHN0cnVjdCBmZF9waXBlICpwaXBlKQoreworCXBpcGUtPmZ1bmNzLT5kZXN0cm95KHBpcGUpOworfQorCitpbnQgZmRfcGlwZV9nZXRfcGFyYW0oc3RydWN0IGZkX3BpcGUgKnBpcGUsCisJCQkJIGVudW0gZmRfcGFyYW1faWQgcGFyYW0sIHVpbnQ2NF90ICp2YWx1ZSkKK3sKKwlyZXR1cm4gcGlwZS0+ZnVuY3MtPmdldF9wYXJhbShwaXBlLCBwYXJhbSwgdmFsdWUpOworfQorCitpbnQgZmRfcGlwZV93YWl0KHN0cnVjdCBmZF9waXBlICpwaXBlLCB1aW50MzJfdCB0aW1lc3RhbXApCit7CisJcmV0dXJuIGZkX3BpcGVfd2FpdF90aW1lb3V0KHBpcGUsIHRpbWVzdGFtcCwgfjApOworfQorCitpbnQgZmRfcGlwZV93YWl0X3RpbWVvdXQoc3RydWN0IGZkX3BpcGUgKnBpcGUsIHVpbnQzMl90IHRpbWVzdGFtcCwKKwkJdWludDY0X3QgdGltZW91dCkKK3sKKwlyZXR1cm4gcGlwZS0+ZnVuY3MtPndhaXQocGlwZSwgdGltZXN0YW1wLCB0aW1lb3V0KTsKK30KZGlmZiAtLWdpdCBhL2ZyZWVkcmVuby9mcmVlZHJlbm9fcHJpdi5oIGIvZnJlZWRyZW5vL2ZyZWVkcmVub19wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkM2VlNgotLS0gL2Rldi9udWxsCisrKyBiL2ZyZWVkcmVuby9mcmVlZHJlbm9fcHJpdi5oCkBAIC0wLDAgKzEsMjU1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiayZyIjsgdGFiLXdpZHRoIDQ7IGluZGVudC10YWJzLW1vZGU6IHQ7IC0qLSAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFJvYiBDbGFyayA8cm9iY2xhcmtAZnJlZWRlc2t0b3Aub3JnPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgUm9iIENsYXJrIDxyb2JjbGFya0BmcmVlZGVza3RvcC5vcmc+CisgKi8KKworI2lmbmRlZiBGUkVFRFJFTk9fUFJJVl9IXworI2RlZmluZSBGUkVFRFJFTk9fUFJJVl9IXworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgImxpYmRybV9tYWNyb3MuaCIKKyNpbmNsdWRlICJ4Zjg2ZHJtLmgiCisjaW5jbHVkZSAieGY4NmF0b21pYy5oIgorCisjaW5jbHVkZSAidXRpbF9kb3VibGVfbGlzdC5oIgorCisjaW5jbHVkZSAiZnJlZWRyZW5vX2RybWlmLmgiCisjaW5jbHVkZSAiZnJlZWRyZW5vX3JpbmdidWZmZXIuaCIKKyNpbmNsdWRlICJkcm0uaCIKKworI2lmbmRlZiBUUlVFCisjICBkZWZpbmUgVFJVRSAxCisjZW5kaWYKKyNpZm5kZWYgRkFMU0UKKyMgIGRlZmluZSBGQUxTRSAwCisjZW5kaWYKKworc3RydWN0IGZkX2RldmljZV9mdW5jcyB7CisJaW50ICgqYm9fbmV3X2hhbmRsZSkoc3RydWN0IGZkX2RldmljZSAqZGV2LCB1aW50MzJfdCBzaXplLAorCQkJdWludDMyX3QgZmxhZ3MsIHVpbnQzMl90ICpoYW5kbGUpOworCXN0cnVjdCBmZF9ibyAqICgqYm9fZnJvbV9oYW5kbGUpKHN0cnVjdCBmZF9kZXZpY2UgKmRldiwKKwkJCXVpbnQzMl90IHNpemUsIHVpbnQzMl90IGhhbmRsZSk7CisJc3RydWN0IGZkX3BpcGUgKiAoKnBpcGVfbmV3KShzdHJ1Y3QgZmRfZGV2aWNlICpkZXYsIGVudW0gZmRfcGlwZV9pZCBpZCk7CisJdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBmZF9kZXZpY2UgKmRldik7Cit9OworCitzdHJ1Y3QgZmRfYm9fYnVja2V0IHsKKwl1aW50MzJfdCBzaXplOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0cnVjdCBmZF9ib19jYWNoZSB7CisJc3RydWN0IGZkX2JvX2J1Y2tldCBjYWNoZV9idWNrZXRbMTQgKiA0XTsKKwlpbnQgbnVtX2J1Y2tldHM7CisJdGltZV90IHRpbWU7Cit9OworCitzdHJ1Y3QgZmRfZGV2aWNlIHsKKwlpbnQgZmQ7CisJZW51bSBmZF92ZXJzaW9uIHZlcnNpb247CisJYXRvbWljX3QgcmVmY250OworCisJLyogdGFibGVzIHRvIGtlZXAgdHJhY2sgb2YgYm8ncywgdG8gYXZvaWQgImV2aWwtdHdpbiIgZmRfYm8gb2JqZWN0czoKKwkgKgorCSAqICAgaGFuZGxlX3RhYmxlOiBtYXBzIGhhbmRsZSB0byBmZF9ibworCSAqICAgbmFtZV90YWJsZTogbWFwcyBmbGluayBuYW1lIHRvIGZkX2JvCisJICoKKwkgKiBXZSBlbmQgdXAgbmVlZGluZyB0d28gdGFibGVzLCBiZWNhdXNlIERSTV9JT0NUTF9HRU1fT1BFTiBhbHdheXMKKwkgKiByZXR1cm5zIGEgbmV3IGhhbmRsZS4gIFNvIHdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgYm8gaXMgYWxyZWFkeQorCSAqIG9wZW4gaW4gdGhlIHByb2Nlc3MgZmlyc3QsIGJlZm9yZSBjYWxsaW5nIGdlbS1vcGVuLgorCSAqLworCXZvaWQgKmhhbmRsZV90YWJsZSwgKm5hbWVfdGFibGU7CisKKwljb25zdCBzdHJ1Y3QgZmRfZGV2aWNlX2Z1bmNzICpmdW5jczsKKworCXN0cnVjdCBmZF9ib19jYWNoZSBib19jYWNoZTsKKworCWludCBjbG9zZWZkOyAgICAgICAgLyogY2FsbCBjbG9zZShmZCkgdXBvbiBkZXN0cnVjdGlvbiAqLworCisJLyoganVzdCBmb3IgdmFsZ3JpbmQ6ICovCisJaW50IGJvX3NpemU7Cit9OworCitkcm1fcHJpdmF0ZSB2b2lkIGZkX2JvX2NhY2hlX2luaXQoc3RydWN0IGZkX2JvX2NhY2hlICpjYWNoZSwgaW50IGNvYXJzZSk7Citkcm1fcHJpdmF0ZSB2b2lkIGZkX2JvX2NhY2hlX2NsZWFudXAoc3RydWN0IGZkX2JvX2NhY2hlICpjYWNoZSwgdGltZV90IHRpbWUpOworZHJtX3ByaXZhdGUgc3RydWN0IGZkX2JvICogZmRfYm9fY2FjaGVfYWxsb2Moc3RydWN0IGZkX2JvX2NhY2hlICpjYWNoZSwKKwkJdWludDMyX3QgKnNpemUsIHVpbnQzMl90IGZsYWdzKTsKK2RybV9wcml2YXRlIGludCBmZF9ib19jYWNoZV9mcmVlKHN0cnVjdCBmZF9ib19jYWNoZSAqY2FjaGUsIHN0cnVjdCBmZF9ibyAqYm8pOworCisvKiBmb3Igd2hlcmUgQHRhYmxlX2xvY2sgaXMgYWxyZWFkeSBoZWxkOiAqLworZHJtX3ByaXZhdGUgdm9pZCBmZF9kZXZpY2VfZGVsX2xvY2tlZChzdHJ1Y3QgZmRfZGV2aWNlICpkZXYpOworCitzdHJ1Y3QgZmRfcGlwZV9mdW5jcyB7CisJc3RydWN0IGZkX3JpbmdidWZmZXIgKiAoKnJpbmdidWZmZXJfbmV3KShzdHJ1Y3QgZmRfcGlwZSAqcGlwZSwgdWludDMyX3Qgc2l6ZSk7CisJaW50ICgqZ2V0X3BhcmFtKShzdHJ1Y3QgZmRfcGlwZSAqcGlwZSwgZW51bSBmZF9wYXJhbV9pZCBwYXJhbSwgdWludDY0X3QgKnZhbHVlKTsKKwlpbnQgKCp3YWl0KShzdHJ1Y3QgZmRfcGlwZSAqcGlwZSwgdWludDMyX3QgdGltZXN0YW1wLCB1aW50NjRfdCB0aW1lb3V0KTsKKwl2b2lkICgqZGVzdHJveSkoc3RydWN0IGZkX3BpcGUgKnBpcGUpOworfTsKKworc3RydWN0IGZkX3BpcGUgeworCXN0cnVjdCBmZF9kZXZpY2UgKmRldjsKKwllbnVtIGZkX3BpcGVfaWQgaWQ7CisJdWludDMyX3QgZ3B1X2lkOworCWNvbnN0IHN0cnVjdCBmZF9waXBlX2Z1bmNzICpmdW5jczsKK307CisKK3N0cnVjdCBmZF9yaW5nbWFya2VyIHsKKwlzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZzsKKwl1aW50MzJfdCAqY3VyOworfTsKKworc3RydWN0IGZkX3JpbmdidWZmZXJfZnVuY3MgeworCXZvaWQgKiAoKmhvc3RwdHIpKHN0cnVjdCBmZF9yaW5nYnVmZmVyICpyaW5nKTsKKwlpbnQgKCpmbHVzaCkoc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcsIHVpbnQzMl90ICpsYXN0X3N0YXJ0LAorCQkJaW50IGluX2ZlbmNlX2ZkLCBpbnQgKm91dF9mZW5jZV9mZCk7CisJdm9pZCAoKmdyb3cpKHN0cnVjdCBmZF9yaW5nYnVmZmVyICpyaW5nLCB1aW50MzJfdCBzaXplKTsKKwl2b2lkICgqcmVzZXQpKHN0cnVjdCBmZF9yaW5nYnVmZmVyICpyaW5nKTsKKwl2b2lkICgqZW1pdF9yZWxvYykoc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcsCisJCQljb25zdCBzdHJ1Y3QgZmRfcmVsb2MgKnJlbG9jKTsKKwl1aW50MzJfdCAoKmVtaXRfcmVsb2NfcmluZykoc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcsCisJCQlzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqdGFyZ2V0LCB1aW50MzJfdCBjbWRfaWR4LAorCQkJdWludDMyX3Qgc3VibWl0X29mZnNldCwgdWludDMyX3Qgc2l6ZSk7CisJdWludDMyX3QgKCpjbWRfY291bnQpKHN0cnVjdCBmZF9yaW5nYnVmZmVyICpyaW5nKTsKKwl2b2lkICgqZGVzdHJveSkoc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcpOworfTsKKworc3RydWN0IGZkX2JvX2Z1bmNzIHsKKwlpbnQgKCpvZmZzZXQpKHN0cnVjdCBmZF9ibyAqYm8sIHVpbnQ2NF90ICpvZmZzZXQpOworCWludCAoKmNwdV9wcmVwKShzdHJ1Y3QgZmRfYm8gKmJvLCBzdHJ1Y3QgZmRfcGlwZSAqcGlwZSwgdWludDMyX3Qgb3ApOworCXZvaWQgKCpjcHVfZmluaSkoc3RydWN0IGZkX2JvICpibyk7CisJaW50ICgqbWFkdmlzZSkoc3RydWN0IGZkX2JvICpibywgaW50IHdpbGxuZWVkKTsKKwl2b2lkICgqZGVzdHJveSkoc3RydWN0IGZkX2JvICpibyk7Cit9OworCitzdHJ1Y3QgZmRfYm8geworCXN0cnVjdCBmZF9kZXZpY2UgKmRldjsKKwl1aW50MzJfdCBzaXplOworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCBuYW1lOworCXZvaWQgKm1hcDsKKwlhdG9taWNfdCByZWZjbnQ7CisJY29uc3Qgc3RydWN0IGZkX2JvX2Z1bmNzICpmdW5jczsKKworCWludCBib19yZXVzZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7ICAgLyogYnVja2V0LWxpc3QgZW50cnkgKi8KKwl0aW1lX3QgZnJlZV90aW1lOyAgICAgICAgLyogdGltZSB3aGVuIGFkZGVkIHRvIGJ1Y2tldC1saXN0ICovCit9OworCisjZGVmaW5lIEFMSUdOKHYsYSkgKCgodikgKyAoYSkgLSAxKSAmIH4oKGEpIC0gMSkpCisjZGVmaW5lIEFSUkFZX1NJWkUoYXJyKSAoc2l6ZW9mKGFycikgLyBzaXplb2YoKGFycilbMF0pKQorCisjZGVmaW5lIGVuYWJsZV9kZWJ1ZyAwICAvKiBUT0RPIG1ha2UgZHluYW1pYyAqLworCisjZGVmaW5lIElORk9fTVNHKGZtdCwgLi4uKSBcCisJCWRvIHsgZHJtTXNnKCJbSV0gImZtdCAiICglczolZClcbiIsIFwKKwkJCQkjI19fVkFfQVJHU19fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgREVCVUdfTVNHKGZtdCwgLi4uKSBcCisJCWRvIGlmIChlbmFibGVfZGVidWcpIHsgZHJtTXNnKCJbRF0gImZtdCAiICglczolZClcbiIsIFwKKwkJCQkjI19fVkFfQVJHU19fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgV0FSTl9NU0coZm10LCAuLi4pIFwKKwkJZG8geyBkcm1Nc2coIltXXSAiZm10ICIgKCVzOiVkKVxuIiwgXAorCQkJCSMjX19WQV9BUkdTX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyB9IHdoaWxlICgwKQorI2RlZmluZSBFUlJPUl9NU0coZm10LCAuLi4pIFwKKwkJZG8geyBkcm1Nc2coIltFXSAiIGZtdCAiICglczolZClcbiIsIFwKKwkJCQkjI19fVkFfQVJHU19fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBVNjQyVk9JRCh4KSAoKHZvaWQgKikodW5zaWduZWQgbG9uZykoeCkpCisjZGVmaW5lIFZPSUQyVTY0KHgpICgodWludDY0X3QpKHVuc2lnbmVkIGxvbmcpKHgpKQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90CitvZmZzZXRfYnl0ZXModm9pZCAqZW5kLCB2b2lkICpzdGFydCkKK3sKKwlyZXR1cm4gKChjaGFyICopZW5kKSAtICgoY2hhciAqKXN0YXJ0KTsKK30KKworI2lmZGVmIEhBVkVfVkFMR1JJTkQKKyMgIGluY2x1ZGUgPG1lbWNoZWNrLmg+CisKKy8qCisgKiBGb3IgdHJhY2tpbmcgdGhlIGJhY2tpbmcgbWVtb3J5IChpZiB2YWxncmluZCBlbmFibGVkLCB3ZSBmb3JjZSBhIG1tYXAKKyAqIGZvciB0aGUgcHVycG9zZXMgb2YgdHJhY2tpbmcpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBWR19CT19BTExPQyhzdHJ1Y3QgZmRfYm8gKmJvKQoreworCWlmIChibyAmJiBSVU5OSU5HX09OX1ZBTEdSSU5EKSB7CisJCVZBTEdSSU5EX01BTExPQ0xJS0VfQkxPQ0soZmRfYm9fbWFwKGJvKSwgYm8tPnNpemUsIDAsIDEpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIFZHX0JPX0ZSRUUoc3RydWN0IGZkX2JvICpibykKK3sKKwlWQUxHUklORF9GUkVFTElLRV9CTE9DSyhiby0+bWFwLCAwKTsKK30KKworLyoKKyAqIEZvciB0cmFja2luZyBibyBzdHJ1Y3RzIHRoYXQgYXJlIGluIHRoZSBidWZmZXItY2FjaGUsIHNvIHRoYXQgdmFsZ3JpbmQKKyAqIGRvZXNuJ3QgYXR0cmlidXRlIG93bmVyc2hpcCB0byB0aGUgZmlyc3Qgb25lIHRvIGFsbG9jYXRlIHRoZSByZWN5Y2xlZAorICogYm8uCisgKgorICogTm90ZSB0aGF0IHRoZSBsaXN0X2hlYWQgaW4gZmRfYm8gaXMgdXNlZCB0byB0cmFjayB0aGUgYnVmZmVycyBpbiBjYWNoZQorICogc28gZGlzYWJsZSBlcnJvciByZXBvcnRpbmcgb24gdGhlIHJhbmdlIHdoaWxlIHRoZXkgYXJlIGluIGNhY2hlIHNvCisgKiB2YWxncmluZCBkb2Vzbid0IHNxdWF3ayBhYm91dCBsaXN0IHRyYXZlcnNhbC4KKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBWR19CT19SRUxFQVNFKHN0cnVjdCBmZF9ibyAqYm8pCit7CisJaWYgKFJVTk5JTkdfT05fVkFMR1JJTkQpIHsKKwkJVkFMR1JJTkRfRElTQUJMRV9BRERSX0VSUk9SX1JFUE9SVElOR19JTl9SQU5HRShibywgYm8tPmRldi0+Ym9fc2l6ZSk7CisJCVZBTEdSSU5EX01BS0VfTUVNX05PQUNDRVNTKGJvLCBiby0+ZGV2LT5ib19zaXplKTsKKwkJVkFMR1JJTkRfRlJFRUxJS0VfQkxPQ0soYm8tPm1hcCwgMCk7CisJfQorfQorc3RhdGljIGlubGluZSB2b2lkIFZHX0JPX09CVEFJTihzdHJ1Y3QgZmRfYm8gKmJvKQoreworCWlmIChSVU5OSU5HX09OX1ZBTEdSSU5EKSB7CisJCVZBTEdSSU5EX01BS0VfTUVNX0RFRklORUQoYm8sIGJvLT5kZXYtPmJvX3NpemUpOworCQlWQUxHUklORF9FTkFCTEVfQUREUl9FUlJPUl9SRVBPUlRJTkdfSU5fUkFOR0UoYm8sIGJvLT5kZXYtPmJvX3NpemUpOworCQlWQUxHUklORF9NQUxMT0NMSUtFX0JMT0NLKGJvLT5tYXAsIGJvLT5zaXplLCAwLCAxKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIFZHX0JPX0FMTE9DKHN0cnVjdCBmZF9ibyAqYm8pICAge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBWR19CT19GUkVFKHN0cnVjdCBmZF9ibyAqYm8pICAgIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgVkdfQk9fUkVMRUFTRShzdHJ1Y3QgZmRfYm8gKmJvKSB7fQorc3RhdGljIGlubGluZSB2b2lkIFZHX0JPX09CVEFJTihzdHJ1Y3QgZmRfYm8gKmJvKSAge30KKyNlbmRpZgorCisKKyNlbmRpZiAvKiBGUkVFRFJFTk9fUFJJVl9IXyAqLwpkaWZmIC0tZ2l0IGEvZnJlZWRyZW5vL2ZyZWVkcmVub19yaW5nYnVmZmVyLmMgYi9mcmVlZHJlbm8vZnJlZWRyZW5vX3JpbmdidWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzEwZjFmCi0tLSAvZGV2L251bGwKKysrIGIvZnJlZWRyZW5vL2ZyZWVkcmVub19yaW5nYnVmZmVyLmMKQEAgLTAsMCArMSwxOTUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJrJnIiOyB0YWItd2lkdGggNDsgaW5kZW50LXRhYnMtbW9kZTogdDsgLSotICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgUm9iIENsYXJrIDxyb2JjbGFya0BmcmVlZGVza3RvcC5vcmc+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBSb2IgQ2xhcmsgPHJvYmNsYXJrQGZyZWVkZXNrdG9wLm9yZz4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJmcmVlZHJlbm9fZHJtaWYuaCIKKyNpbmNsdWRlICJmcmVlZHJlbm9fcHJpdi5oIgorI2luY2x1ZGUgImZyZWVkcmVub19yaW5nYnVmZmVyLmgiCisKK3N0cnVjdCBmZF9yaW5nYnVmZmVyICoKK2ZkX3JpbmdidWZmZXJfbmV3KHN0cnVjdCBmZF9waXBlICpwaXBlLCB1aW50MzJfdCBzaXplKQoreworCXN0cnVjdCBmZF9yaW5nYnVmZmVyICpyaW5nOworCisJcmluZyA9IHBpcGUtPmZ1bmNzLT5yaW5nYnVmZmVyX25ldyhwaXBlLCBzaXplKTsKKwlpZiAoIXJpbmcpCisJCXJldHVybiBOVUxMOworCisJcmluZy0+cGlwZSA9IHBpcGU7CisJcmluZy0+c3RhcnQgPSByaW5nLT5mdW5jcy0+aG9zdHB0cihyaW5nKTsKKwlyaW5nLT5lbmQgPSAmKHJpbmctPnN0YXJ0W3JpbmctPnNpemUvNF0pOworCisJcmluZy0+Y3VyID0gcmluZy0+bGFzdF9zdGFydCA9IHJpbmctPnN0YXJ0OworCisJcmV0dXJuIHJpbmc7Cit9CisKK3ZvaWQgZmRfcmluZ2J1ZmZlcl9kZWwoc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcpCit7CisJZmRfcmluZ2J1ZmZlcl9yZXNldChyaW5nKTsKKwlyaW5nLT5mdW5jcy0+ZGVzdHJveShyaW5nKTsKK30KKworLyogcmluZ2J1ZmZlcnMgd2hpY2ggYXJlIElCIHRhcmdldHMgc2hvdWxkIHNldCB0aGUgdG9wbGV2ZWwgcmIgKGllLgorICogdGhlIElCIHNvdXJjZSkgYXMgaXQncyBwYXJlbnQgYmVmb3JlIGVtaXR0aW5nIHJlbG9jJ3MsIHRvIGVuc3VyZQorICogdGhlIGJvb2trZWVwaW5nIHdvcmtzIG91dCBwcm9wZXJseS4KKyAqLwordm9pZCBmZF9yaW5nYnVmZmVyX3NldF9wYXJlbnQoc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcsCisJCQkJCSBzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcGFyZW50KQoreworCXJpbmctPnBhcmVudCA9IHBhcmVudDsKK30KKwordm9pZCBmZF9yaW5nYnVmZmVyX3Jlc2V0KHN0cnVjdCBmZF9yaW5nYnVmZmVyICpyaW5nKQoreworCXVpbnQzMl90ICpzdGFydCA9IHJpbmctPnN0YXJ0OworCWlmIChyaW5nLT5waXBlLT5pZCA9PSBGRF9QSVBFXzJEKQorCQlzdGFydCA9ICZyaW5nLT5zdGFydFsweDE0MF07CisJcmluZy0+Y3VyID0gcmluZy0+bGFzdF9zdGFydCA9IHN0YXJ0OworCWlmIChyaW5nLT5mdW5jcy0+cmVzZXQpCisJCXJpbmctPmZ1bmNzLT5yZXNldChyaW5nKTsKK30KKworaW50IGZkX3JpbmdidWZmZXJfZmx1c2goc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIHJpbmctPmZ1bmNzLT5mbHVzaChyaW5nLCByaW5nLT5sYXN0X3N0YXJ0LCAtMSwgTlVMTCk7Cit9CisKK2ludCBmZF9yaW5nYnVmZmVyX2ZsdXNoMihzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZywgaW50IGluX2ZlbmNlX2ZkLAorCQlpbnQgKm91dF9mZW5jZV9mZCkKK3sKKwlyZXR1cm4gcmluZy0+ZnVuY3MtPmZsdXNoKHJpbmcsIHJpbmctPmxhc3Rfc3RhcnQsIGluX2ZlbmNlX2ZkLCBvdXRfZmVuY2VfZmQpOworfQorCit2b2lkIGZkX3JpbmdidWZmZXJfZ3JvdyhzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZywgdWludDMyX3QgbmR3b3JkcykKK3sKKwlhc3NlcnQocmluZy0+ZnVuY3MtPmdyb3cpOyAgICAgLyogdW5zdXBwb3J0ZWQgb24ga2dzbCAqLworCisJLyogdGhlcmUgaXMgYW4gdXBwZXIgYm91bmQgb24gSUIgc2l6ZSwgd2hpY2ggYXBwZWFycyB0byBiZSAweDEwMDAwMCAqLworCWlmIChyaW5nLT5zaXplIDwgMHgxMDAwMDApCisJCXJpbmctPnNpemUgKj0gMjsKKworCXJpbmctPmZ1bmNzLT5ncm93KHJpbmcsIHJpbmctPnNpemUpOworCisJcmluZy0+c3RhcnQgPSByaW5nLT5mdW5jcy0+aG9zdHB0cihyaW5nKTsKKwlyaW5nLT5lbmQgPSAmKHJpbmctPnN0YXJ0W3JpbmctPnNpemUvNF0pOworCisJcmluZy0+Y3VyID0gcmluZy0+bGFzdF9zdGFydCA9IHJpbmctPnN0YXJ0OworfQorCit1aW50MzJfdCBmZF9yaW5nYnVmZmVyX3RpbWVzdGFtcChzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gcmluZy0+bGFzdF90aW1lc3RhbXA7Cit9CisKK3ZvaWQgZmRfcmluZ2J1ZmZlcl9yZWxvYyhzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZywKKwkJCQkgICAgY29uc3Qgc3RydWN0IGZkX3JlbG9jICpyZWxvYykKK3sKKwlhc3NlcnQocmluZy0+cGlwZS0+Z3B1X2lkIDwgNTAwKTsKKwlyaW5nLT5mdW5jcy0+ZW1pdF9yZWxvYyhyaW5nLCByZWxvYyk7Cit9CisKK3ZvaWQgZmRfcmluZ2J1ZmZlcl9yZWxvYzIoc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgZmRfcmVsb2MgKnJlbG9jKQoreworCXJpbmctPmZ1bmNzLT5lbWl0X3JlbG9jKHJpbmcsIHJlbG9jKTsKK30KKwordm9pZCBmZF9yaW5nYnVmZmVyX2VtaXRfcmVsb2NfcmluZyhzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZywKKwkJc3RydWN0IGZkX3JpbmdtYXJrZXIgKnRhcmdldCwgc3RydWN0IGZkX3JpbmdtYXJrZXIgKmVuZCkKK3sKKwl1aW50MzJfdCBzdWJtaXRfb2Zmc2V0LCBzaXplOworCisJLyogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIGFuZCBub3Qgc3VwcG9ydGVkIG9uIDY0YiBkZXZpY2VzOiAqLworCWFzc2VydChyaW5nLT5waXBlLT5ncHVfaWQgPCA1MDApOworCWFzc2VydCh0YXJnZXQtPnJpbmcgPT0gZW5kLT5yaW5nKTsKKworCXN1Ym1pdF9vZmZzZXQgPSBvZmZzZXRfYnl0ZXModGFyZ2V0LT5jdXIsIHRhcmdldC0+cmluZy0+c3RhcnQpOworCXNpemUgPSBvZmZzZXRfYnl0ZXMoZW5kLT5jdXIsIHRhcmdldC0+Y3VyKTsKKworCXJpbmctPmZ1bmNzLT5lbWl0X3JlbG9jX3JpbmcocmluZywgdGFyZ2V0LT5yaW5nLCAwLCBzdWJtaXRfb2Zmc2V0LCBzaXplKTsKK30KKwordWludDMyX3QgZmRfcmluZ2J1ZmZlcl9jbWRfY291bnQoc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcpCit7CisJaWYgKCFyaW5nLT5mdW5jcy0+Y21kX2NvdW50KQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gcmluZy0+ZnVuY3MtPmNtZF9jb3VudChyaW5nKTsKK30KKwordWludDMyX3QKK2ZkX3JpbmdidWZmZXJfZW1pdF9yZWxvY19yaW5nX2Z1bGwoc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcsCisJCXN0cnVjdCBmZF9yaW5nYnVmZmVyICp0YXJnZXQsIHVpbnQzMl90IGNtZF9pZHgpCit7CisJdWludDMyX3Qgc2l6ZSA9IG9mZnNldF9ieXRlcyh0YXJnZXQtPmN1ciwgdGFyZ2V0LT5zdGFydCk7CisJcmV0dXJuIHJpbmctPmZ1bmNzLT5lbWl0X3JlbG9jX3JpbmcocmluZywgdGFyZ2V0LCBjbWRfaWR4LCAwLCBzaXplKTsKK30KKworc3RydWN0IGZkX3JpbmdtYXJrZXIgKiBmZF9yaW5nbWFya2VyX25ldyhzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZykKK3sKKwlzdHJ1Y3QgZmRfcmluZ21hcmtlciAqbWFya2VyID0gTlVMTDsKKworCW1hcmtlciA9IGNhbGxvYygxLCBzaXplb2YoKm1hcmtlcikpOworCWlmICghbWFya2VyKSB7CisJCUVSUk9SX01TRygiYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWFya2VyLT5yaW5nID0gcmluZzsKKworCW1hcmtlci0+Y3VyID0gbWFya2VyLT5yaW5nLT5jdXI7CisKKwlyZXR1cm4gbWFya2VyOworfQorCit2b2lkIGZkX3JpbmdtYXJrZXJfZGVsKHN0cnVjdCBmZF9yaW5nbWFya2VyICptYXJrZXIpCit7CisJZnJlZShtYXJrZXIpOworfQorCit2b2lkIGZkX3JpbmdtYXJrZXJfbWFyayhzdHJ1Y3QgZmRfcmluZ21hcmtlciAqbWFya2VyKQoreworCW1hcmtlci0+Y3VyID0gbWFya2VyLT5yaW5nLT5jdXI7Cit9CisKK3VpbnQzMl90IGZkX3JpbmdtYXJrZXJfZHdvcmRzKHN0cnVjdCBmZF9yaW5nbWFya2VyICpzdGFydCwKKwkJCQkJIHN0cnVjdCBmZF9yaW5nbWFya2VyICplbmQpCit7CisJcmV0dXJuIGVuZC0+Y3VyIC0gc3RhcnQtPmN1cjsKK30KKworaW50IGZkX3JpbmdtYXJrZXJfZmx1c2goc3RydWN0IGZkX3JpbmdtYXJrZXIgKm1hcmtlcikKK3sKKwlzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZyA9IG1hcmtlci0+cmluZzsKKwlyZXR1cm4gcmluZy0+ZnVuY3MtPmZsdXNoKHJpbmcsIG1hcmtlci0+Y3VyLCAtMSwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9mcmVlZHJlbm8vZnJlZWRyZW5vX3JpbmdidWZmZXIuaCBiL2ZyZWVkcmVuby9mcmVlZHJlbm9fcmluZ2J1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MDFmYmEKLS0tIC9kZXYvbnVsbAorKysgYi9mcmVlZHJlbm8vZnJlZWRyZW5vX3JpbmdidWZmZXIuaApAQCAtMCwwICsxLDEwMSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImsmciI7IHRhYi13aWR0aCA0OyBpbmRlbnQtdGFicy1tb2RlOiB0OyAtKi0gKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBSb2IgQ2xhcmsgPHJvYmNsYXJrQGZyZWVkZXNrdG9wLm9yZz4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJvYiBDbGFyayA8cm9iY2xhcmtAZnJlZWRlc2t0b3Aub3JnPgorICovCisKKyNpZm5kZWYgRlJFRURSRU5PX1JJTkdCVUZGRVJfSF8KKyNkZWZpbmUgRlJFRURSRU5PX1JJTkdCVUZGRVJfSF8KKworI2luY2x1ZGUgPGZyZWVkcmVub19kcm1pZi5oPgorCisvKiB0aGUgcmluZ2J1ZmZlciBvYmplY3QgaXMgbm90IG9wYXF1ZSBzbyB0aGF0IE9VVF9SSU5HKCkgdHlwZSBzdHVmZgorICogY2FuIGJlIGlubGluZWQuICBOb3RlIHRoYXQgdXNlcnMgc2hvdWxkIG5vdCBtYWtlIGFzc3VtcHRpb25zIGFib3V0CisgKiB0aGUgc2l6ZSBvZiB0aGlzIHN0cnVjdC4uIG1vcmUgc3R1ZmYgd2lsbCBiZSBhZGRlZCB3aGVuIHdlIGV2ZW50dWFsbHkKKyAqIGhhdmUgYSBrZXJuZWwgZHJpdmVyIHRoYXQgY2FuIGRlYWwgdy8gcmVsb2Mncy4uCisgKi8KKworc3RydWN0IGZkX3JpbmdidWZmZXJfZnVuY3M7CitzdHJ1Y3QgZmRfcmluZ21hcmtlcjsKKworc3RydWN0IGZkX3JpbmdidWZmZXIgeworCWludCBzaXplOworCXVpbnQzMl90ICpjdXIsICplbmQsICpzdGFydCwgKmxhc3Rfc3RhcnQ7CisJc3RydWN0IGZkX3BpcGUgKnBpcGU7CisJY29uc3Qgc3RydWN0IGZkX3JpbmdidWZmZXJfZnVuY3MgKmZ1bmNzOworCXVpbnQzMl90IGxhc3RfdGltZXN0YW1wOworCXN0cnVjdCBmZF9yaW5nYnVmZmVyICpwYXJlbnQ7Cit9OworCitzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqIGZkX3JpbmdidWZmZXJfbmV3KHN0cnVjdCBmZF9waXBlICpwaXBlLAorCQl1aW50MzJfdCBzaXplKTsKK3ZvaWQgZmRfcmluZ2J1ZmZlcl9kZWwoc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcpOwordm9pZCBmZF9yaW5nYnVmZmVyX3NldF9wYXJlbnQoc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcsCisJCXN0cnVjdCBmZF9yaW5nYnVmZmVyICpwYXJlbnQpOwordm9pZCBmZF9yaW5nYnVmZmVyX3Jlc2V0KHN0cnVjdCBmZF9yaW5nYnVmZmVyICpyaW5nKTsKK2ludCBmZF9yaW5nYnVmZmVyX2ZsdXNoKHN0cnVjdCBmZF9yaW5nYnVmZmVyICpyaW5nKTsKKy8qIGluX2ZlbmNlX2ZkOiAtMSBmb3Igbm8gaW4tZmVuY2UsIGVsc2UgZmVuY2UgZmQKKyAqIG91dF9mZW5jZV9mZDogTlVMTCBmb3Igbm8gb3V0cHV0LWZlbmNlIHJlcXVlc3RlZCwgZWxzZSBwdHIgdG8gcmV0dXJuIG91dC1mZW5jZQorICovCitpbnQgZmRfcmluZ2J1ZmZlcl9mbHVzaDIoc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcsIGludCBpbl9mZW5jZV9mZCwKKwkJaW50ICpvdXRfZmVuY2VfZmQpOwordm9pZCBmZF9yaW5nYnVmZmVyX2dyb3coc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcsIHVpbnQzMl90IG5kd29yZHMpOwordWludDMyX3QgZmRfcmluZ2J1ZmZlcl90aW1lc3RhbXAoc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcpOworCitzdGF0aWMgaW5saW5lIHZvaWQgZmRfcmluZ2J1ZmZlcl9lbWl0KHN0cnVjdCBmZF9yaW5nYnVmZmVyICpyaW5nLAorCQl1aW50MzJfdCBkYXRhKQoreworCSgqcmluZy0+Y3VyKyspID0gZGF0YTsKK30KKworc3RydWN0IGZkX3JlbG9jIHsKKwlzdHJ1Y3QgZmRfYm8gKmJvOworI2RlZmluZSBGRF9SRUxPQ19SRUFEICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBGRF9SRUxPQ19XUklURSAgICAgICAgICAgIDB4MDAwMgorCXVpbnQzMl90IGZsYWdzOworCXVpbnQzMl90IG9mZnNldDsKKwl1aW50MzJfdCBvcjsKKwlpbnQzMl90ICBzaGlmdDsKKwl1aW50MzJfdCBvcmhpOyAgICAgIC8qIHVzZWQgZm9yIGE1eHgrICovCit9OworCisvKiBOT1RFOiByZWxvY3MgYXJlIDIgZHdvcmRzIG9uIGE1eHgrICovCisKK3ZvaWQgZmRfcmluZ2J1ZmZlcl9yZWxvYzIoc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcsIGNvbnN0IHN0cnVjdCBmZF9yZWxvYyAqcmVsb2MpOword2lsbF9iZV9kZXByZWNhdGVkIHZvaWQgZmRfcmluZ2J1ZmZlcl9yZWxvYyhzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZywgY29uc3Qgc3RydWN0IGZkX3JlbG9jICpyZWxvYyk7Cit3aWxsX2JlX2RlcHJlY2F0ZWQgdm9pZCBmZF9yaW5nYnVmZmVyX2VtaXRfcmVsb2NfcmluZyhzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZywKKwkJc3RydWN0IGZkX3JpbmdtYXJrZXIgKnRhcmdldCwgc3RydWN0IGZkX3JpbmdtYXJrZXIgKmVuZCk7Cit1aW50MzJfdCBmZF9yaW5nYnVmZmVyX2NtZF9jb3VudChzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZyk7Cit1aW50MzJfdCBmZF9yaW5nYnVmZmVyX2VtaXRfcmVsb2NfcmluZ19mdWxsKHN0cnVjdCBmZF9yaW5nYnVmZmVyICpyaW5nLAorCQlzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqdGFyZ2V0LCB1aW50MzJfdCBjbWRfaWR4KTsKKword2lsbF9iZV9kZXByZWNhdGVkIHN0cnVjdCBmZF9yaW5nbWFya2VyICogZmRfcmluZ21hcmtlcl9uZXcoc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcpOword2lsbF9iZV9kZXByZWNhdGVkIHZvaWQgZmRfcmluZ21hcmtlcl9kZWwoc3RydWN0IGZkX3JpbmdtYXJrZXIgKm1hcmtlcik7Cit3aWxsX2JlX2RlcHJlY2F0ZWQgdm9pZCBmZF9yaW5nbWFya2VyX21hcmsoc3RydWN0IGZkX3JpbmdtYXJrZXIgKm1hcmtlcik7Cit3aWxsX2JlX2RlcHJlY2F0ZWQgdWludDMyX3QgZmRfcmluZ21hcmtlcl9kd29yZHMoc3RydWN0IGZkX3JpbmdtYXJrZXIgKnN0YXJ0LAorCQlzdHJ1Y3QgZmRfcmluZ21hcmtlciAqZW5kKTsKK3dpbGxfYmVfZGVwcmVjYXRlZCBpbnQgZmRfcmluZ21hcmtlcl9mbHVzaChzdHJ1Y3QgZmRfcmluZ21hcmtlciAqbWFya2VyKTsKKworI2VuZGlmIC8qIEZSRUVEUkVOT19SSU5HQlVGRkVSX0hfICovCmRpZmYgLS1naXQgYS9mcmVlZHJlbm8va2dzbC9SRUFETUUgYi9mcmVlZHJlbm8va2dzbC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4NzRiNAotLS0gL2Rldi9udWxsCisrKyBiL2ZyZWVkcmVuby9rZ3NsL1JFQURNRQpAQCAtMCwwICsxLDI2IEBACitUaGlzIGlzIGEgaGlzdG9yaWNhbCBkaXNjcmlwdGlvbiBvZiB3aGF0IGlzIG5vdyB0aGUga2dzbCBiYWNrZW5kCitpbiBsaWJkcm0gZnJlZWRyZW5vIChiZWZvcmUgdGhlIHVwc3RyZWFtIGRybS9tc20gZHJpdmVyKS4gIE5vdGUKK3RoYXQgdGhlIGtnc2wgYmFja2VuZCByZXF1aXJlcyB0aGUgImtnc2wtZHJtIiBzaGltIGRyaXZlciwgd2hpY2gKK3VzdWFsbHkgaXMgaW4gZGlzcmVwYWlyIChRQ09NIGRvZXMgbm90IGJ1aWxkIGl0IGZvciBhbmRyb2lkKSwgYW5kCitkdWUgdG8gcmFuZG9tIGRpZmZlcmVuY2VzIGJldHdlZW4gZGlmZmVyZW50IGRvd25zdHJlYW0gYW5kcm9pZAora2VybmVsIGJyYW5jaGVzIGl0IG1heSBvciBtYXkgbm90IHdvcmsuICBTbyBZTU1WLgorCitPcmlnaW5hbCBSRUFETUU6CistLS0tLS0tLS0tLS0tLS0tCisKK05vdGUgdGhhdCBjdXJyZW50IG1zbSBrZXJuZWwgZHJpdmVyIGlzIGEgYml0IHN0cmFuZ2UuICBJdCBwcm92aWRlcyBhCitEUk0gaW50ZXJmYWNlIGZvciBHRU0sIHdoaWNoIGlzIGJhc2ljYWxseSBzdWZmaWNpZW50IHRvIGhhdmUgRFJJMgord29ya2luZy4gIEJ1dCBpdCBkb2VzIG5vdCBwcm92aWRlIEtNUy4gIEFuZCBpbnRlcmZhY2UgdG8gMmQgYW5kIDNkCitjb3JlcyBpcyB2aWEgZGlmZmVyZW50IG90aGVyIGRldmljZXMgKC9kZXYva2dzbC0qKS4gIFRoaXMgaXMgbm90CitxdWl0ZSBob3cgSSdkIHdyaXRlIGEgRFJNIGRyaXZlciwgYnV0IGF0IHRoaXMgc3RhZ2UgaXQgaXMgdXNlZnVsIGZvcgoreGY4Ni12aWRlby1mcmVlZHJlbm8gYW5kIGZkcmUgKGFuZCBldmVudHVhbCBnYWxsaXVtIGRyaXZlcikgdG8gYmUKK2FibGUgdG8gd29yayBvbiBleGlzdGluZyBrZXJuZWwgZHJpdmVyIGZyb20gUUNPTSwgdG8gYWxsb3cgdG8KK2NhcHR1cmUgY21kc3RyZWFtIGR1bXBzIGZyb20gdGhlIGJpbmFyeSBibG9iIGRyaXZlcnMgd2l0aG91dCBoYXZpbmcKK3RvIHJlYm9vdC4gIFNvIGxpYmRybV9mcmVlZHJlbm8gYXR0ZW1wdHMgdG8gaGlkZSBtb3N0IG9mIHRoZSBjcmF6eS4KK1RoZSBpbnRlbnRpb24gaXMgdGhhdCB3aGVuIHRoZXJlIGlzIGEgcHJvcGVyIGtlcm5lbCBkcml2ZXIsIGl0IHdpbGwKK2JlIG1vc3RseSBqdXN0IGNoYW5nZXMgaW4gbGliZHJtX2ZyZWVkcmVubyB0byBhZGFwdCB0aGUgZ2FsbGl1bQorZHJpdmVyIGFuZCB4Zjg2LXZpZGVvLWZyZWVkcmVubyAoaWdub3JpbmcgdGhlIGZiZGV2LT5LTVMgY2hhbmdlcykuCisKK1NvIGRvbid0IGxvb2sgYXQgZnJlZWRyZW5vIGFzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHdyaXRlIGEgbGliZHJtCittb2R1bGUgb3IgYSBEUk0gZHJpdmVyLi4gaXQgaXMganVzdCBhbiBhdHRlbXB0IHRvIHBhcGVyIG92ZXIgYSBub24tCitzdGFuZGFyZCBrZXJuZWwgZHJpdmVyIGFyY2hpdGVjdHVyZS4KZGlmZiAtLWdpdCBhL2ZyZWVkcmVuby9rZ3NsL2tnc2xfYm8uYyBiL2ZyZWVkcmVuby9rZ3NsL2tnc2xfYm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjM0ODVlCi0tLSAvZGV2L251bGwKKysrIGIvZnJlZWRyZW5vL2tnc2wva2dzbF9iby5jCkBAIC0wLDAgKzEsMzE1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiayZyIjsgdGFiLXdpZHRoIDQ7IGluZGVudC10YWJzLW1vZGU6IHQ7IC0qLSAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJvYiBDbGFyayA8cm9iY2xhcmtAZnJlZWRlc2t0b3Aub3JnPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgUm9iIENsYXJrIDxyb2JjbGFya0BmcmVlZGVza3RvcC5vcmc+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImtnc2xfcHJpdi5oIgorCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworc3RhdGljIGludCBzZXRfbWVtdHlwZShzdHJ1Y3QgZmRfZGV2aWNlICpkZXYsIHVpbnQzMl90IGhhbmRsZSwgdWludDMyX3QgZmxhZ3MpCit7CisJc3RydWN0IGRybV9rZ3NsX2dlbV9tZW10eXBlIHJlcSA9IHsKKwkJCS5oYW5kbGUgPSBoYW5kbGUsCisJCQkudHlwZSA9IGZsYWdzICYgRFJNX0ZSRUVEUkVOT19HRU1fVFlQRV9NRU1fTUFTSywKKwl9OworCisJcmV0dXJuIGRybUNvbW1hbmRXcml0ZShkZXYtPmZkLCBEUk1fS0dTTF9HRU1fU0VUTUVNVFlQRSwKKwkJCSZyZXEsIHNpemVvZihyZXEpKTsKK30KKworc3RhdGljIGludCBib19hbGxvYyhzdHJ1Y3Qga2dzbF9ibyAqa2dzbF9ibykKK3sKKwlzdHJ1Y3QgZmRfYm8gKmJvID0gJmtnc2xfYm8tPmJhc2U7CisJaWYgKCFrZ3NsX2JvLT5vZmZzZXQpIHsKKwkJc3RydWN0IGRybV9rZ3NsX2dlbV9hbGxvYyByZXEgPSB7CisJCQkJLmhhbmRsZSA9IGJvLT5oYW5kbGUsCisJCX07CisJCWludCByZXQ7CisKKwkJLyogaWYgdGhlIGJ1ZmZlciBpcyBhbHJlYWR5IGJhY2tlZCBieSBwYWdlcyB0aGVuIHRoaXMKKwkJICogZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyAob3RoZXIgdGhhbiBnaXZpbmcgdXMKKwkJICogdGhlIG9mZnNldCkKKwkJICovCisJCXJldCA9IGRybUNvbW1hbmRXcml0ZVJlYWQoYm8tPmRldi0+ZmQsIERSTV9LR1NMX0dFTV9BTExPQywKKwkJCQkmcmVxLCBzaXplb2YocmVxKSk7CisJCWlmIChyZXQpIHsKKwkJCUVSUk9SX01TRygiYWxsb2MgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJa2dzbF9iby0+b2Zmc2V0ID0gcmVxLm9mZnNldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrZ3NsX2JvX29mZnNldChzdHJ1Y3QgZmRfYm8gKmJvLCB1aW50NjRfdCAqb2Zmc2V0KQoreworCXN0cnVjdCBrZ3NsX2JvICprZ3NsX2JvID0gdG9fa2dzbF9ibyhibyk7CisJaW50IHJldCA9IGJvX2FsbG9jKGtnc2xfYm8pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJKm9mZnNldCA9IGtnc2xfYm8tPm9mZnNldDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrZ3NsX2JvX2NwdV9wcmVwKHN0cnVjdCBmZF9ibyAqYm8sIHN0cnVjdCBmZF9waXBlICpwaXBlLCB1aW50MzJfdCBvcCkKK3sKKwl1aW50MzJfdCB0aW1lc3RhbXAgPSBrZ3NsX2JvX2dldF90aW1lc3RhbXAodG9fa2dzbF9ibyhibykpOworCisJaWYgKG9wICYgRFJNX0ZSRUVEUkVOT19QUkVQX05PU1lOQykgeworCQl1aW50MzJfdCBjdXJyZW50OworCQlpbnQgcmV0OworCisJCS8qIHNwZWNpYWwgY2FzZSBmb3IgaXNfaWRsZSgpLi4gd2UgY2FuJ3QgcmVhbGx5IGhhbmRsZSB0aGF0CisJCSAqIHByb3Blcmx5IGluIGtnc2wgKHBlcmhhcHMgd2UgbmVlZCBhIHdheSB0byBqdXN0IGRpc2FibGUKKwkJICogdGhlIGJvLWNhY2hlIGZvciBrZ3NsPykKKwkJICovCisJCWlmICghcGlwZSkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJcmV0ID0ga2dzbF9waXBlX3RpbWVzdGFtcCh0b19rZ3NsX3BpcGUocGlwZSksICZjdXJyZW50KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKHRpbWVzdGFtcCA+IGN1cnJlbnQpCisJCQlyZXR1cm4gLUVCVVNZOworCisJCXJldHVybiAwOworCX0KKworCWlmICh0aW1lc3RhbXApCisJCWZkX3BpcGVfd2FpdChwaXBlLCB0aW1lc3RhbXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGtnc2xfYm9fY3B1X2Zpbmkoc3RydWN0IGZkX2JvICpibykKK3sKK30KKworc3RhdGljIGludCBrZ3NsX2JvX21hZHZpc2Uoc3RydWN0IGZkX2JvICpibywgaW50IHdpbGxuZWVkKQoreworCXJldHVybiB3aWxsbmVlZDsgLyogbm90IHN1cHBvcnRlZCBieSBrZ3NsICovCit9CisKK3N0YXRpYyB2b2lkIGtnc2xfYm9fZGVzdHJveShzdHJ1Y3QgZmRfYm8gKmJvKQoreworCXN0cnVjdCBrZ3NsX2JvICprZ3NsX2JvID0gdG9fa2dzbF9ibyhibyk7CisJZnJlZShrZ3NsX2JvKTsKKworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZkX2JvX2Z1bmNzIGZ1bmNzID0geworCQkub2Zmc2V0ID0ga2dzbF9ib19vZmZzZXQsCisJCS5jcHVfcHJlcCA9IGtnc2xfYm9fY3B1X3ByZXAsCisJCS5jcHVfZmluaSA9IGtnc2xfYm9fY3B1X2ZpbmksCisJCS5tYWR2aXNlID0ga2dzbF9ib19tYWR2aXNlLAorCQkuZGVzdHJveSA9IGtnc2xfYm9fZGVzdHJveSwKK307CisKKy8qIGFsbG9jYXRlIGEgYnVmZmVyIGhhbmRsZTogKi8KK2RybV9wcml2YXRlIGludCBrZ3NsX2JvX25ld19oYW5kbGUoc3RydWN0IGZkX2RldmljZSAqZGV2LAorCQl1aW50MzJfdCBzaXplLCB1aW50MzJfdCBmbGFncywgdWludDMyX3QgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgZHJtX2tnc2xfZ2VtX2NyZWF0ZSByZXEgPSB7CisJCQkuc2l6ZSA9IHNpemUsCisJfTsKKwlpbnQgcmV0OworCisJcmV0ID0gZHJtQ29tbWFuZFdyaXRlUmVhZChkZXYtPmZkLCBEUk1fS0dTTF9HRU1fQ1JFQVRFLAorCQkJJnJlcSwgc2l6ZW9mKHJlcSkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvLyBUT0RPIG1ha2UgZmxhZ3MgbWF0Y2ggbXNtIGRyaXZlciwgc2luY2Uga2dzbCBpcyBsZWdhY3kuLgorCS8vIHRyYW5zbGF0ZSBmbGFncyBpbiBrZ3NsLi4KKworCXNldF9tZW10eXBlKGRldiwgcmVxLmhhbmRsZSwgZmxhZ3MpOworCisJKmhhbmRsZSA9IHJlcS5oYW5kbGU7CisKKwlyZXR1cm4gMDsKK30KKworLyogYWxsb2NhdGUgYSBuZXcgYnVmZmVyIG9iamVjdCAqLworZHJtX3ByaXZhdGUgc3RydWN0IGZkX2JvICoga2dzbF9ib19mcm9tX2hhbmRsZShzdHJ1Y3QgZmRfZGV2aWNlICpkZXYsCisJCXVpbnQzMl90IHNpemUsIHVpbnQzMl90IGhhbmRsZSkKK3sKKwlzdHJ1Y3Qga2dzbF9ibyAqa2dzbF9ibzsKKwlzdHJ1Y3QgZmRfYm8gKmJvOworCXVuc2lnbmVkIGk7CisKKwlrZ3NsX2JvID0gY2FsbG9jKDEsIHNpemVvZigqa2dzbF9ibykpOworCWlmICgha2dzbF9ibykKKwkJcmV0dXJuIE5VTEw7CisKKwlibyA9ICZrZ3NsX2JvLT5iYXNlOworCWJvLT5mdW5jcyA9ICZmdW5jczsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtnc2xfYm8tPmxpc3QpOyBpKyspCisJCWxpc3RfaW5pdGhlYWQoJmtnc2xfYm8tPmxpc3RbaV0pOworCisJcmV0dXJuIGJvOworfQorCitzdHJ1Y3QgZmRfYm8gKgorZmRfYm9fZnJvbV9mYmRldihzdHJ1Y3QgZmRfcGlwZSAqcGlwZSwgaW50IGZiZmQsIHVpbnQzMl90IHNpemUpCit7CisJc3RydWN0IGZkX2JvICpibzsKKworCWlmICghaXNfa2dzbF9waXBlKHBpcGUpKQorCQlyZXR1cm4gTlVMTDsKKworCWJvID0gZmRfYm9fbmV3KHBpcGUtPmRldiwgMSwgMCk7CisKKwkvKiB0aGlzIGlzIGZ1Z2x5LCBidXQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBrZXJuZWwuLgorCSAqIHByaXYtPm1lbWRlc2Muc2l6ZSBuZXZlciBnZXRzIHNldCwgc28gZ2V0YnVmaW5mbyBpb2N0bAorCSAqIHRoaW5rcyB0aGUgYnVmZmVyIGhhc24ndCBiZSBhbGxvY2F0ZSBhbmQgZmFpbHMKKwkgKi8KKwlpZiAoYm8pIHsKKwkJdm9pZCAqZmJtZW0gPSBkcm1fbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCQkJCU1BUF9TSEFSRUQsIGZiZmQsIDApOworCQlzdHJ1Y3Qga2dzbF9tYXBfdXNlcl9tZW0gcmVxID0geworCQkJCS5tZW10eXBlID0gS0dTTF9VU0VSX01FTV9UWVBFX0FERFIsCisJCQkJLmxlbiAgICAgPSBzaXplLAorCQkJCS5vZmZzZXQgID0gMCwKKwkJCQkuaG9zdHB0ciA9ICh1bnNpZ25lZCBsb25nKWZibWVtLAorCQl9OworCQlzdHJ1Y3Qga2dzbF9ibyAqa2dzbF9ibyA9IHRvX2tnc2xfYm8oYm8pOworCQlpbnQgcmV0OworCisJCXJldCA9IGlvY3RsKHRvX2tnc2xfcGlwZShwaXBlKS0+ZmQsIElPQ1RMX0tHU0xfTUFQX1VTRVJfTUVNLCAmcmVxKTsKKwkJaWYgKHJldCkgeworCQkJRVJST1JfTVNHKCJtYXBwaW5nIHVzZXIgbWVtIGZhaWxlZDogJXMiLAorCQkJCQlzdHJlcnJvcihlcnJubykpOworCQkJZ290byBmYWlsOworCQl9CisJCWtnc2xfYm8tPmdwdWFkZHIgPSByZXEuZ3B1YWRkcjsKKwkJYm8tPm1hcCA9IGZibWVtOworCX0KKworCXJldHVybiBibzsKK2ZhaWw6CisJaWYgKGJvKQorCQlmZF9ib19kZWwoYm8pOworCXJldHVybiBOVUxMOworfQorCitkcm1fcHJpdmF0ZSB1aW50MzJfdCBrZ3NsX2JvX2dwdWFkZHIoc3RydWN0IGtnc2xfYm8gKmtnc2xfYm8sIHVpbnQzMl90IG9mZnNldCkKK3sKKwlzdHJ1Y3QgZmRfYm8gKmJvID0gJmtnc2xfYm8tPmJhc2U7CisJaWYgKCFrZ3NsX2JvLT5ncHVhZGRyKSB7CisJCXN0cnVjdCBkcm1fa2dzbF9nZW1fYnVmaW5mbyByZXEgPSB7CisJCQkJLmhhbmRsZSA9IGJvLT5oYW5kbGUsCisJCX07CisJCWludCByZXQ7CisKKwkJcmV0ID0gYm9fYWxsb2Moa2dzbF9ibyk7CisJCWlmIChyZXQpIHsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXQgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGJvLT5kZXYtPmZkLCBEUk1fS0dTTF9HRU1fR0VUX0JVRklORk8sCisJCQkJJnJlcSwgc2l6ZW9mKHJlcSkpOworCQlpZiAocmV0KSB7CisJCQlFUlJPUl9NU0coImdldCBidWZpbmZvIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlrZ3NsX2JvLT5ncHVhZGRyID0gcmVxLmdwdWFkZHJbMF07CisJfQorCXJldHVybiBrZ3NsX2JvLT5ncHVhZGRyICsgb2Zmc2V0OworfQorCisvKgorICogU3VwZXItY2hlZXp5IHdheSB0byBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBtZXNhIGFuZCBkZHguLiAgdGhlCisgKiBTRVRfQUNUSVZFIGlvY3RsIGdpdmVzIHVzIGEgd2F5IHRvIHN0YXNoIGEgMzJiICMgdy8gYSBHRU0gYm8sIGFuZAorICogR0VUX0JVRklORk8gZ2l2ZXMgdXMgYSB3YXkgdG8gcmV0cmlldmUgaXQuICBXZSB1c2UgdGhpcyB0byBzdGFzaAorICogdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBJU1NVRUlCQ01EUyBvbiB0aGUgYnVmZmVyLgorICoKKyAqIFRvIGF2b2lkIGFuIG9ic2NlbmUgYW1vdW50IG9mIHN5c2NhbGxzLCB3ZToKKyAqICAxKSBPbmx5IHNldCB0aGUgdGltZXN0YW1wIGZvciBidWZmZXJzIHcvIGFuIGZsaW5rIG5hbWUsIGllLgorICogICAgIG9ubHkgYnVmZmVycyBzaGFyZWQgYWNyb3NzIHByb2Nlc3Nlcy4gIFRoaXMgaXMgZW5vdWdoIHRvCisgKiAgICAgY2F0Y2ggdGhlIERSSTIgYnVmZmVycy4KKyAqICAyKSBPbmx5IHNldCB0aGUgdGltZXN0YW1wIGZvciBidWZmZXJzIHN1Ym1pdHRlZCB0byB0aGUgM2QgcmluZworICogICAgIGFuZCBvbmx5IGNoZWNrIHRoZSB0aW1lc3RhbXBzIG9uIGJ1ZmZlcnMgc3VibWl0dGVkIHRvIHRoZQorICogICAgIDJkIHJpbmcuICBUaGlzIHNob3VsZCBiZSBlbm91Z2ggdG8gaGFuZGxlIHN5bmNocm9uaXppbmcgb2YKKyAqICAgICBwcmVzZW50YXRpb24gYmxpdC4gIFdlIGNvdWxkIGRvIHN5bmNocm9uaXphdGlvbiBpbiB0aGUgb3RoZXIKKyAqICAgICBkaXJlY3Rpb24gdG9vLCBidXQgdGhhdCB3b3VsZCBiZSBwcm9ibGVtYXRpYyBpZiB3ZSBhcmUgdXNpbmcKKyAqICAgICB0aGUgM2QgcmluZyBmcm9tIEREWCwgc2luY2UgY2xpZW50IHNpZGUgd291bGRuJ3Qga25vdyB0aGlzLgorICoKKyAqIFRoZSB3YWl0aW5nIG9uIHRpbWVzdGFtcCBoYXBwZW5zIGJlZm9yZSBmbHVzaCwgYW5kIHNldHRpbmcgb2YKKyAqIHRpbWVzdGFtcCBoYXBwZW5zIGFmdGVyIGZsdXNoLiAgSXQgaXMgdHJhbnNwYXJlbnQgdG8gdGhlIHVzZXIKKyAqIG9mIGxpYmRybV9mcmVlZHJlbm8gYXMgYWxsIHRoZSB0cmFja2luZyBvZiBidWZmZXJzIGhhcHBlbnMgdmlhCisgKiBfZW1pdF9yZWxvYygpLi4KKyAqLworCitkcm1fcHJpdmF0ZSB2b2lkIGtnc2xfYm9fc2V0X3RpbWVzdGFtcChzdHJ1Y3Qga2dzbF9ibyAqa2dzbF9ibywKKwkJdWludDMyX3QgdGltZXN0YW1wKQoreworCXN0cnVjdCBmZF9ibyAqYm8gPSAma2dzbF9iby0+YmFzZTsKKwlpZiAoYm8tPm5hbWUpIHsKKwkJc3RydWN0IGRybV9rZ3NsX2dlbV9hY3RpdmUgcmVxID0geworCQkJCS5oYW5kbGUgPSBiby0+aGFuZGxlLAorCQkJCS5hY3RpdmUgPSB0aW1lc3RhbXAsCisJCX07CisJCWludCByZXQ7CisKKwkJcmV0ID0gZHJtQ29tbWFuZFdyaXRlKGJvLT5kZXYtPmZkLCBEUk1fS0dTTF9HRU1fU0VUX0FDVElWRSwKKwkJCQkmcmVxLCBzaXplb2YocmVxKSk7CisJCWlmIChyZXQpIHsKKwkJCUVSUk9SX01TRygic2V0IGFjdGl2ZSBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCX0KK30KKworZHJtX3ByaXZhdGUgdWludDMyX3Qga2dzbF9ib19nZXRfdGltZXN0YW1wKHN0cnVjdCBrZ3NsX2JvICprZ3NsX2JvKQoreworCXN0cnVjdCBmZF9ibyAqYm8gPSAma2dzbF9iby0+YmFzZTsKKwl1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworCWlmIChiby0+bmFtZSkgeworCQlzdHJ1Y3QgZHJtX2tnc2xfZ2VtX2J1ZmluZm8gcmVxID0geworCQkJCS5oYW5kbGUgPSBiby0+aGFuZGxlLAorCQl9OworCQlpbnQgcmV0OworCisJCXJldCA9IGRybUNvbW1hbmRXcml0ZVJlYWQoYm8tPmRldi0+ZmQsIERSTV9LR1NMX0dFTV9HRVRfQlVGSU5GTywKKwkJCQkmcmVxLCBzaXplb2YocmVxKSk7CisJCWlmIChyZXQpIHsKKwkJCUVSUk9SX01TRygiZ2V0IGJ1ZmluZm8gZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXRpbWVzdGFtcCA9IHJlcS5hY3RpdmU7CisJfQorCXJldHVybiB0aW1lc3RhbXA7Cit9CmRpZmYgLS1naXQgYS9mcmVlZHJlbm8va2dzbC9rZ3NsX2RldmljZS5jIGIvZnJlZWRyZW5vL2tnc2wva2dzbF9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NThlOGE3Ci0tLSAvZGV2L251bGwKKysrIGIvZnJlZWRyZW5vL2tnc2wva2dzbF9kZXZpY2UuYwpAQCAtMCwwICsxLDY3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiayZyIjsgdGFiLXdpZHRoIDQ7IGluZGVudC10YWJzLW1vZGU6IHQ7IC0qLSAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJvYiBDbGFyayA8cm9iY2xhcmtAZnJlZWRlc2t0b3Aub3JnPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgUm9iIENsYXJrIDxyb2JjbGFya0BmcmVlZGVza3RvcC5vcmc+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJrZ3NsX3ByaXYuaCIKKworc3RhdGljIHZvaWQga2dzbF9kZXZpY2VfZGVzdHJveShzdHJ1Y3QgZmRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGtnc2xfZGV2aWNlICprZ3NsX2RldiA9IHRvX2tnc2xfZGV2aWNlKGRldik7CisJZnJlZShrZ3NsX2Rldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmRfZGV2aWNlX2Z1bmNzIGZ1bmNzID0geworCQkuYm9fbmV3X2hhbmRsZSA9IGtnc2xfYm9fbmV3X2hhbmRsZSwKKwkJLmJvX2Zyb21faGFuZGxlID0ga2dzbF9ib19mcm9tX2hhbmRsZSwKKwkJLnBpcGVfbmV3ID0ga2dzbF9waXBlX25ldywKKwkJLmRlc3Ryb3kgPSBrZ3NsX2RldmljZV9kZXN0cm95LAorfTsKKworZHJtX3ByaXZhdGUgc3RydWN0IGZkX2RldmljZSAqIGtnc2xfZGV2aWNlX25ldyhpbnQgZmQpCit7CisJc3RydWN0IGtnc2xfZGV2aWNlICprZ3NsX2RldjsKKwlzdHJ1Y3QgZmRfZGV2aWNlICpkZXY7CisKKwlrZ3NsX2RldiA9IGNhbGxvYygxLCBzaXplb2YoKmtnc2xfZGV2KSk7CisJaWYgKCFrZ3NsX2RldikKKwkJcmV0dXJuIE5VTEw7CisKKwlkZXYgPSAma2dzbF9kZXYtPmJhc2U7CisJZGV2LT5mdW5jcyA9ICZmdW5jczsKKworCWRldi0+Ym9fc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga2dzbF9ibyk7CisKKwlyZXR1cm4gZGV2OworfQpkaWZmIC0tZ2l0IGEvZnJlZWRyZW5vL2tnc2wva2dzbF9kcm0uaCBiL2ZyZWVkcmVuby9rZ3NsL2tnc2xfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgxOTc4ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZyZWVkcmVuby9rZ3NsL2tnc2xfZHJtLmgKQEAgLTAsMCArMSwxOTIgQEAKKyNpZm5kZWYgX0tHU0xfRFJNX0hfCisjZGVmaW5lIF9LR1NMX0RSTV9IXworCisjaW5jbHVkZSAiZHJtLmgiCisKKyNkZWZpbmUgRFJNX0tHU0xfR0VNX0NSRUFURSAweDAwCisjZGVmaW5lIERSTV9LR1NMX0dFTV9QUkVQICAgMHgwMQorI2RlZmluZSBEUk1fS0dTTF9HRU1fU0VUTUVNVFlQRSAweDAyCisjZGVmaW5lIERSTV9LR1NMX0dFTV9HRVRNRU1UWVBFIDB4MDMKKyNkZWZpbmUgRFJNX0tHU0xfR0VNX01NQVAgMHgwNAorI2RlZmluZSBEUk1fS0dTTF9HRU1fQUxMT0MgMHgwNQorI2RlZmluZSBEUk1fS0dTTF9HRU1fQklORF9HUFUgMHgwNgorI2RlZmluZSBEUk1fS0dTTF9HRU1fVU5CSU5EX0dQVSAweDA3CisKKyNkZWZpbmUgRFJNX0tHU0xfR0VNX0dFVF9CVUZJTkZPIDB4MDgKKyNkZWZpbmUgRFJNX0tHU0xfR0VNX1NFVF9CVUZDT1VOVCAweDA5CisjZGVmaW5lIERSTV9LR1NMX0dFTV9TRVRfQUNUSVZFIDB4MEEKKyNkZWZpbmUgRFJNX0tHU0xfR0VNX0xPQ0tfSEFORExFIDB4MEIKKyNkZWZpbmUgRFJNX0tHU0xfR0VNX1VOTE9DS19IQU5ETEUgMHgwQworI2RlZmluZSBEUk1fS0dTTF9HRU1fVU5MT0NLX09OX1RTIDB4MEQKKyNkZWZpbmUgRFJNX0tHU0xfR0VNX0NSRUFURV9GRCAweDBFCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0tHU0xfR0VNX0NSRUFURSBcCitEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0tHU0xfR0VNX0NSRUFURSwgc3RydWN0IGRybV9rZ3NsX2dlbV9jcmVhdGUpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0tHU0xfR0VNX1BSRVAgXAorRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9LR1NMX0dFTV9QUkVQLCBzdHJ1Y3QgZHJtX2tnc2xfZ2VtX3ByZXApCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0tHU0xfR0VNX1NFVE1FTVRZUEUgXAorRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9LR1NMX0dFTV9TRVRNRU1UWVBFLCBcCitzdHJ1Y3QgZHJtX2tnc2xfZ2VtX21lbXR5cGUpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0tHU0xfR0VNX0dFVE1FTVRZUEUgXAorRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9LR1NMX0dFTV9HRVRNRU1UWVBFLCBcCitzdHJ1Y3QgZHJtX2tnc2xfZ2VtX21lbXR5cGUpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0tHU0xfR0VNX01NQVAgXAorRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9LR1NMX0dFTV9NTUFQLCBzdHJ1Y3QgZHJtX2tnc2xfZ2VtX21tYXApCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0tHU0xfR0VNX0FMTE9DIFwKK0RSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fS0dTTF9HRU1fQUxMT0MsIHN0cnVjdCBkcm1fa2dzbF9nZW1fYWxsb2MpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0tHU0xfR0VNX0JJTkRfR1BVIFwKK0RSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fS0dTTF9HRU1fQklORF9HUFUsIHN0cnVjdCBkcm1fa2dzbF9nZW1fYmluZF9ncHUpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0tHU0xfR0VNX1VOQklORF9HUFUgXAorRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9LR1NMX0dFTV9VTkJJTkRfR1BVLCBcCitzdHJ1Y3QgZHJtX2tnc2xfZ2VtX2JpbmRfZ3B1KQorCisjZGVmaW5lIERSTV9JT0NUTF9LR1NMX0dFTV9HRVRfQlVGSU5GTyBcCitEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0tHU0xfR0VNX0dFVF9CVUZJTkZPLCBcCisJIHN0cnVjdCBkcm1fa2dzbF9nZW1fYnVmaW5mbykKKworI2RlZmluZSBEUk1fSU9DVExfS0dTTF9HRU1fU0VUX0JVRkNPVU5UIFwKK0RSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fS0dTTF9HRU1fU0VUX0JVRkNPVU5ULCBcCisJIHN0cnVjdCBkcm1fa2dzbF9nZW1fYnVmY291bnQpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0tHU0xfR0VNX1NFVF9BQ1RJVkUgXAorRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9LR1NMX0dFTV9TRVRfQUNUSVZFLCBcCisJIHN0cnVjdCBkcm1fa2dzbF9nZW1fYWN0aXZlKQorCisjZGVmaW5lIERSTV9JT0NUTF9LR1NMX0dFTV9MT0NLX0hBTkRMRSBcCitEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0tHU0xfR0VNX0xPQ0tfSEFORExFLCBcCitzdHJ1Y3QgZHJtX2tnc2xfZ2VtX2xvY2tfaGFuZGxlcykKKworI2RlZmluZSBEUk1fSU9DVExfS0dTTF9HRU1fVU5MT0NLX0hBTkRMRSBcCitEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0tHU0xfR0VNX1VOTE9DS19IQU5ETEUsIFwKK3N0cnVjdCBkcm1fa2dzbF9nZW1fdW5sb2NrX2hhbmRsZXMpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0tHU0xfR0VNX1VOTE9DS19PTl9UUyBcCitEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0tHU0xfR0VNX1VOTE9DS19PTl9UUywgXAorc3RydWN0IGRybV9rZ3NsX2dlbV91bmxvY2tfb25fdHMpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0tHU0xfR0VNX0NSRUFURV9GRCBcCitEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0tHU0xfR0VNX0NSRUFURV9GRCwgXAorc3RydWN0IGRybV9rZ3NsX2dlbV9jcmVhdGVfZmQpCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHN1YiBidWZmZXJzIHBlciBHRU0gb2JqZWN0ICovCisjZGVmaW5lIERSTV9LR1NMX0dFTV9NQVhfQlVGRkVSUyAyCisKKy8qIE1lbW9yeSB0eXBlcyAtIHRoZXNlIGRlZmluZSB0aGUgc291cmNlIGFuZCBjYWNoaW5nIHBvbGljaWVzCisgICBvZiB0aGUgR0VNIG1lbW9yeSBjaHVuayAqLworCisvKiBMZWdhY3kgZGVmaW5pdGlvbnMgbGVmdCBmb3IgY29tcGF0aWJpbGl0eSAqLworCisjZGVmaW5lIERSTV9LR1NMX0dFTV9UWVBFX0VCSSAgICAgICAgICAwCisjZGVmaW5lIERSTV9LR1NMX0dFTV9UWVBFX1NNSSAgICAgICAgICAxCisjZGVmaW5lIERSTV9LR1NMX0dFTV9UWVBFX0tNRU0gICAgICAgICAyCisjZGVmaW5lIERSTV9LR1NMX0dFTV9UWVBFX0tNRU1fTk9DQUNIRSAzCisjZGVmaW5lIERSTV9LR1NMX0dFTV9UWVBFX01FTV9NQVNLICAgICAweEYKKworLyogQ29udGlndW91cyBtZW1vcnkgKFBNRU0pICovCisjZGVmaW5lIERSTV9LR1NMX0dFTV9UWVBFX1BNRU0gICAgICAgMHgwMDAxMDAKKworLyogUE1FTSBtZW1vcnkgdHlwZXMgKi8KKyNkZWZpbmUgRFJNX0tHU0xfR0VNX1BNRU1fRUJJICAgICAgICAweDAwMTAwMAorI2RlZmluZSBEUk1fS0dTTF9HRU1fUE1FTV9TTUkgICAgICAgIDB4MDAyMDAwCisKKy8qIFN0YW5kYXJkIHBhZ2VkIG1lbW9yeSAqLworI2RlZmluZSBEUk1fS0dTTF9HRU1fVFlQRV9NRU0gICAgICAgIDB4MDEwMDAwCisKKy8qIENhY2hpbmcgY29udHJvbHMgKi8KKyNkZWZpbmUgRFJNX0tHU0xfR0VNX0NBQ0hFX05PTkUgICAgICAweDAwMDAwMAorI2RlZmluZSBEUk1fS0dTTF9HRU1fQ0FDSEVfV0NPTUJJTkUgIDB4MTAwMDAwCisjZGVmaW5lIERSTV9LR1NMX0dFTV9DQUNIRV9XVEhST1VHSCAgMHgyMDAwMDAKKyNkZWZpbmUgRFJNX0tHU0xfR0VNX0NBQ0hFX1dCQUNLICAgICAweDQwMDAwMAorI2RlZmluZSBEUk1fS0dTTF9HRU1fQ0FDSEVfV0JBQ0tXQSAgIDB4ODAwMDAwCisjZGVmaW5lIERSTV9LR1NMX0dFTV9DQUNIRV9NQVNLICAgICAgMHhGMDAwMDAKKworLyogRkQgYmFzZWQgb2JqZWN0cyAqLworI2RlZmluZSBEUk1fS0dTTF9HRU1fVFlQRV9GRF9GQk1FTSAgIDB4MTAwMDAwMAorI2RlZmluZSBEUk1fS0dTTF9HRU1fVFlQRV9GRF9NQVNLICAgIDB4RjAwMDAwMAorCisvKiBUaW1lc3RhbXAgdHlwZXMgKi8KKyNkZWZpbmUgRFJNX0tHU0xfR0VNX1RTXzNEICAgICAgICAgMHgwMDAwMDQzMAorI2RlZmluZSBEUk1fS0dTTF9HRU1fVFNfMkQgICAgICAgICAweDAwMDAwMTgwCisKKworc3RydWN0IGRybV9rZ3NsX2dlbV9jcmVhdGUgeworCXVpbnQzMl90IHNpemU7CisJdWludDMyX3QgaGFuZGxlOworfTsKKworc3RydWN0IGRybV9rZ3NsX2dlbV9wcmVwIHsKKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3QgcGh5czsKKwl1aW50NjRfdCBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgZHJtX2tnc2xfZ2VtX21lbXR5cGUgeworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCB0eXBlOworfTsKKworc3RydWN0IGRybV9rZ3NsX2dlbV9tbWFwIHsKKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3Qgc2l6ZTsKKwl1aW50MzJfdCBob3N0cHRyOworCXVpbnQ2NF90IG9mZnNldDsKK307CisKK3N0cnVjdCBkcm1fa2dzbF9nZW1fYWxsb2MgeworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50NjRfdCBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgZHJtX2tnc2xfZ2VtX2JpbmRfZ3B1IHsKKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3QgZ3B1cHRyOworfTsKKworc3RydWN0IGRybV9rZ3NsX2dlbV9idWZpbmZvIHsKKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3QgY291bnQ7CisJdWludDMyX3QgYWN0aXZlOworCXVpbnQzMl90IG9mZnNldFtEUk1fS0dTTF9HRU1fTUFYX0JVRkZFUlNdOworCXVpbnQzMl90IGdwdWFkZHJbRFJNX0tHU0xfR0VNX01BWF9CVUZGRVJTXTsKK307CisKK3N0cnVjdCBkcm1fa2dzbF9nZW1fYnVmY291bnQgeworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCBidWZjb3VudDsKK307CisKK3N0cnVjdCBkcm1fa2dzbF9nZW1fYWN0aXZlIHsKKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3QgYWN0aXZlOworfTsKKworc3RydWN0IGRybV9rZ3NsX2dlbV9sb2NrX2hhbmRsZXMgeworCXVpbnQzMl90IG51bV9oYW5kbGVzOworCXVpbnQzMl90ICpoYW5kbGVfbGlzdDsKKwl1aW50MzJfdCBwaWQ7CisJdWludDMyX3QgbG9ja19pZDsJICAvKiBSZXR1cm5lZCBsb2NrIGlkIHVzZWQgZm9yIHVubG9ja2luZyAqLworfTsKKworc3RydWN0IGRybV9rZ3NsX2dlbV91bmxvY2tfaGFuZGxlcyB7CisJdWludDMyX3QgbG9ja19pZDsKK307CisKK3N0cnVjdCBkcm1fa2dzbF9nZW1fdW5sb2NrX29uX3RzIHsKKwl1aW50MzJfdCBsb2NrX2lkOworCXVpbnQzMl90IHRpbWVzdGFtcDsJIC8qIFRoaXMgZmllbGQgaXMgYSBodyBnZW5lcmF0ZWQgdHMgKi8KKwl1aW50MzJfdCB0eXBlOwkJIC8qIFdoaWNoIHBpcGUgdG8gY2hlY2sgZm9yIHRzIGdlbmVyYXRpb24gKi8KK307CisKK3N0cnVjdCBkcm1fa2dzbF9nZW1fY3JlYXRlX2ZkIHsKKwl1aW50MzJfdCBmZDsKKwl1aW50MzJfdCBoYW5kbGU7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZyZWVkcmVuby9rZ3NsL2tnc2xfcGlwZS5jIGIvZnJlZWRyZW5vL2tnc2wva2dzbF9waXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzOWViNAotLS0gL2Rldi9udWxsCisrKyBiL2ZyZWVkcmVuby9rZ3NsL2tnc2xfcGlwZS5jCkBAIC0wLDAgKzEsMjg1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiayZyIjsgdGFiLXdpZHRoIDQ7IGluZGVudC10YWJzLW1vZGU6IHQ7IC0qLSAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJvYiBDbGFyayA8cm9iY2xhcmtAZnJlZWRlc2t0b3Aub3JnPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgUm9iIENsYXJrIDxyb2JjbGFya0BmcmVlZGVza3RvcC5vcmc+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImtnc2xfcHJpdi5oIgorCisKK3N0YXRpYyBpbnQga2dzbF9waXBlX2dldF9wYXJhbShzdHJ1Y3QgZmRfcGlwZSAqcGlwZSwKKwkJZW51bSBmZF9wYXJhbV9pZCBwYXJhbSwgdWludDY0X3QgKnZhbHVlKQoreworCXN0cnVjdCBrZ3NsX3BpcGUgKmtnc2xfcGlwZSA9IHRvX2tnc2xfcGlwZShwaXBlKTsKKwlzd2l0Y2ggKHBhcmFtKSB7CisJY2FzZSBGRF9ERVZJQ0VfSUQ6CisJCSp2YWx1ZSA9IGtnc2xfcGlwZS0+ZGV2aW5mby5kZXZpY2VfaWQ7CisJCXJldHVybiAwOworCWNhc2UgRkRfR1BVX0lEOgorCQkqdmFsdWUgPSBrZ3NsX3BpcGUtPmRldmluZm8uZ3B1X2lkOworCQlyZXR1cm4gMDsKKwljYXNlIEZEX0dNRU1fU0laRToKKwkJKnZhbHVlID0ga2dzbF9waXBlLT5kZXZpbmZvLmdtZW1fc2l6ZWJ5dGVzOworCQlyZXR1cm4gMDsKKwljYXNlIEZEX0NISVBfSUQ6CisJCSp2YWx1ZSA9IGtnc2xfcGlwZS0+ZGV2aW5mby5jaGlwX2lkOworCQlyZXR1cm4gMDsKKwljYXNlIEZEX01BWF9GUkVROgorCWNhc2UgRkRfVElNRVNUQU1QOgorCQkvKiB1bnN1cHBvcnRlZCBvbiBrZ3NsICovCisJCXJldHVybiAtMTsKKwlkZWZhdWx0OgorCQlFUlJPUl9NU0coImludmFsaWQgcGFyYW0gaWQ6ICVkIiwgcGFyYW0pOworCQlyZXR1cm4gLTE7CisJfQorfQorCitzdGF0aWMgaW50IGtnc2xfcGlwZV93YWl0KHN0cnVjdCBmZF9waXBlICpwaXBlLCB1aW50MzJfdCB0aW1lc3RhbXAsCisJCXVpbnQ2NF90IHRpbWVvdXQpCit7CisJc3RydWN0IGtnc2xfcGlwZSAqa2dzbF9waXBlID0gdG9fa2dzbF9waXBlKHBpcGUpOworCXN0cnVjdCBrZ3NsX2RldmljZV93YWl0dGltZXN0YW1wIHJlcSA9IHsKKwkJCS50aW1lc3RhbXAgPSB0aW1lc3RhbXAsCisJCQkudGltZW91dCAgID0gNTAwMCwKKwl9OworCWludCByZXQ7CisKKwlkbyB7CisJCXJldCA9IGlvY3RsKGtnc2xfcGlwZS0+ZmQsIElPQ1RMX0tHU0xfREVWSUNFX1dBSVRUSU1FU1RBTVAsICZyZXEpOworCX0gd2hpbGUgKChyZXQgPT0gLTEpICYmICgoZXJybm8gPT0gRUlOVFIpIHx8IChlcnJubyA9PSBFQUdBSU4pKSk7CisJaWYgKHJldCkKKwkJRVJST1JfTVNHKCJ3YWl0dGltZXN0YW1wIGZhaWxlZCEgJWQgKCVzKSIsIHJldCwgc3RyZXJyb3IoZXJybm8pKTsKKwllbHNlCisJCWtnc2xfcGlwZV9wcm9jZXNzX3BlbmRpbmcoa2dzbF9waXBlLCB0aW1lc3RhbXApOworCXJldHVybiByZXQ7Cit9CisKK2RybV9wcml2YXRlIGludCBrZ3NsX3BpcGVfdGltZXN0YW1wKHN0cnVjdCBrZ3NsX3BpcGUgKmtnc2xfcGlwZSwKKwkJdWludDMyX3QgKnRpbWVzdGFtcCkKK3sKKwlzdHJ1Y3Qga2dzbF9jbWRzdHJlYW1fcmVhZHRpbWVzdGFtcCByZXEgPSB7CisJCQkudHlwZSA9IEtHU0xfVElNRVNUQU1QX1JFVElSRUQKKwl9OworCWludCByZXQgPSBpb2N0bChrZ3NsX3BpcGUtPmZkLCBJT0NUTF9LR1NMX0NNRFNUUkVBTV9SRUFEVElNRVNUQU1QLCAmcmVxKTsKKwlpZiAocmV0KSB7CisJCUVSUk9SX01TRygicmVhZHRpbWVzdGFtcCBmYWlsZWQhICVkICglcykiLAorCQkJCXJldCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJKnRpbWVzdGFtcCA9IHJlcS50aW1lc3RhbXA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGtnc2xfcGlwZV9kZXN0cm95KHN0cnVjdCBmZF9waXBlICpwaXBlKQoreworCXN0cnVjdCBrZ3NsX3BpcGUgKmtnc2xfcGlwZSA9IHRvX2tnc2xfcGlwZShwaXBlKTsKKwlzdHJ1Y3Qga2dzbF9kcmF3Y3R4dF9kZXN0cm95IHJlcSA9IHsKKwkJCS5kcmF3Y3R4dF9pZCA9IGtnc2xfcGlwZS0+ZHJhd2N0eHRfaWQsCisJfTsKKworCWlmIChrZ3NsX3BpcGUtPmRyYXdjdHh0X2lkKQorCQlpb2N0bChrZ3NsX3BpcGUtPmZkLCBJT0NUTF9LR1NMX0RSQVdDVFhUX0RFU1RST1ksICZyZXEpOworCisJaWYgKGtnc2xfcGlwZS0+ZmQgPj0gMCkKKwkJY2xvc2Uoa2dzbF9waXBlLT5mZCk7CisKKwlmcmVlKGtnc2xfcGlwZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmRfcGlwZV9mdW5jcyBmdW5jcyA9IHsKKwkJLnJpbmdidWZmZXJfbmV3ID0ga2dzbF9yaW5nYnVmZmVyX25ldywKKwkJLmdldF9wYXJhbSA9IGtnc2xfcGlwZV9nZXRfcGFyYW0sCisJCS53YWl0ID0ga2dzbF9waXBlX3dhaXQsCisJCS5kZXN0cm95ID0ga2dzbF9waXBlX2Rlc3Ryb3ksCit9OworCitkcm1fcHJpdmF0ZSBpbnQgaXNfa2dzbF9waXBlKHN0cnVjdCBmZF9waXBlICpwaXBlKQoreworCXJldHVybiBwaXBlLT5mdW5jcyA9PSAmZnVuY3M7Cit9CisKKy8qIGFkZCBidWZmZXIgdG8gc3VibWl0IGxpc3Qgd2hlbiBpdCBpcyByZWZlcmVuY2VkIGluIGNtZHN0cmVhbTogKi8KK2RybV9wcml2YXRlIHZvaWQga2dzbF9waXBlX2FkZF9zdWJtaXQoc3RydWN0IGtnc2xfcGlwZSAqa2dzbF9waXBlLAorCQlzdHJ1Y3Qga2dzbF9ibyAqa2dzbF9ibykKK3sKKwlzdHJ1Y3QgZmRfcGlwZSAqcGlwZSA9ICZrZ3NsX3BpcGUtPmJhc2U7CisJc3RydWN0IGZkX2JvICpibyA9ICZrZ3NsX2JvLT5iYXNlOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QgPSAma2dzbF9iby0+bGlzdFtwaXBlLT5pZF07CisJaWYgKExJU1RfSVNfRU1QVFkobGlzdCkpIHsKKwkJZmRfYm9fcmVmKGJvKTsKKwl9IGVsc2UgeworCQlsaXN0X2RlbChsaXN0KTsKKwl9CisJbGlzdF9hZGR0YWlsKGxpc3QsICZrZ3NsX3BpcGUtPnN1Ym1pdF9saXN0KTsKK30KKworLyogcHJlcGFyZSBidWZmZXJzIG9uIHN1Ym1pdCBsaXN0IGJlZm9yZSBmbHVzaDogKi8KK2RybV9wcml2YXRlIHZvaWQga2dzbF9waXBlX3ByZV9zdWJtaXQoc3RydWN0IGtnc2xfcGlwZSAqa2dzbF9waXBlKQoreworCXN0cnVjdCBmZF9waXBlICpwaXBlID0gJmtnc2xfcGlwZS0+YmFzZTsKKwlzdHJ1Y3Qga2dzbF9ibyAqa2dzbF9ibyA9IE5VTEw7CisKKwlpZiAoIWtnc2xfcGlwZS0+cDNkKQorCQlrZ3NsX3BpcGUtPnAzZCA9IGZkX3BpcGVfbmV3KHBpcGUtPmRldiwgRkRfUElQRV8zRCk7CisKKwlMSVNUX0ZPUl9FQUNIX0VOVFJZKGtnc2xfYm8sICZrZ3NsX3BpcGUtPnN1Ym1pdF9saXN0LCBsaXN0W3BpcGUtPmlkXSkgeworCQl1aW50MzJfdCB0aW1lc3RhbXAgPSBrZ3NsX2JvX2dldF90aW1lc3RhbXAoa2dzbF9ibyk7CisJCWlmICh0aW1lc3RhbXApCisJCQlmZF9waXBlX3dhaXQoa2dzbF9waXBlLT5wM2QsIHRpbWVzdGFtcCk7CisJfQorfQorCisvKiBwcm9jZXNzIGJ1ZmZlcnMgb24gc3VibWl0IGxpc3QgYWZ0ZXIgZmx1c2g6ICovCitkcm1fcHJpdmF0ZSB2b2lkIGtnc2xfcGlwZV9wb3N0X3N1Ym1pdChzdHJ1Y3Qga2dzbF9waXBlICprZ3NsX3BpcGUsCisJCXVpbnQzMl90IHRpbWVzdGFtcCkKK3sKKwlzdHJ1Y3QgZmRfcGlwZSAqcGlwZSA9ICZrZ3NsX3BpcGUtPmJhc2U7CisJc3RydWN0IGtnc2xfYm8gKmtnc2xfYm8gPSBOVUxMLCAqdG1wOworCisJTElTVF9GT1JfRUFDSF9FTlRSWV9TQUZFKGtnc2xfYm8sIHRtcCwgJmtnc2xfcGlwZS0+c3VibWl0X2xpc3QsIGxpc3RbcGlwZS0+aWRdKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QgPSAma2dzbF9iby0+bGlzdFtwaXBlLT5pZF07CisJCWxpc3RfZGVsKGxpc3QpOworCQlrZ3NsX2JvLT50aW1lc3RhbXBbcGlwZS0+aWRdID0gdGltZXN0YW1wOworCQlsaXN0X2FkZHRhaWwobGlzdCwgJmtnc2xfcGlwZS0+cGVuZGluZ19saXN0KTsKKworCQlrZ3NsX2JvX3NldF90aW1lc3RhbXAoa2dzbF9ibywgdGltZXN0YW1wKTsKKwl9CisKKwlpZiAoIWtnc2xfcGlwZV90aW1lc3RhbXAoa2dzbF9waXBlLCAmdGltZXN0YW1wKSkKKwkJa2dzbF9waXBlX3Byb2Nlc3NfcGVuZGluZyhrZ3NsX3BpcGUsIHRpbWVzdGFtcCk7Cit9CisKK2RybV9wcml2YXRlIHZvaWQga2dzbF9waXBlX3Byb2Nlc3NfcGVuZGluZyhzdHJ1Y3Qga2dzbF9waXBlICprZ3NsX3BpcGUsCisJCXVpbnQzMl90IHRpbWVzdGFtcCkKK3sKKwlzdHJ1Y3QgZmRfcGlwZSAqcGlwZSA9ICZrZ3NsX3BpcGUtPmJhc2U7CisJc3RydWN0IGtnc2xfYm8gKmtnc2xfYm8gPSBOVUxMLCAqdG1wOworCisJTElTVF9GT1JfRUFDSF9FTlRSWV9TQUZFKGtnc2xfYm8sIHRtcCwgJmtnc2xfcGlwZS0+cGVuZGluZ19saXN0LCBsaXN0W3BpcGUtPmlkXSkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0ID0gJmtnc2xfYm8tPmxpc3RbcGlwZS0+aWRdOworCQlpZiAoa2dzbF9iby0+dGltZXN0YW1wW3BpcGUtPmlkXSA+IHRpbWVzdGFtcCkKKwkJCXJldHVybjsKKwkJbGlzdF9kZWxpbml0KGxpc3QpOworCQlrZ3NsX2JvLT50aW1lc3RhbXBbcGlwZS0+aWRdID0gMDsKKwkJZmRfYm9fZGVsKCZrZ3NsX2JvLT5iYXNlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ2V0cHJvcChpbnQgZmQsIGVudW0ga2dzbF9wcm9wZXJ0eV90eXBlIHR5cGUsCisJCXZvaWQgKnZhbHVlLCBpbnQgc2l6ZWJ5dGVzKQoreworCXN0cnVjdCBrZ3NsX2RldmljZV9nZXRwcm9wZXJ0eSByZXEgPSB7CisJCQkudHlwZSA9IHR5cGUsCisJCQkudmFsdWUgPSB2YWx1ZSwKKwkJCS5zaXplYnl0ZXMgPSBzaXplYnl0ZXMsCisJfTsKKwlyZXR1cm4gaW9jdGwoZmQsIElPQ1RMX0tHU0xfREVWSUNFX0dFVFBST1BFUlRZLCAmcmVxKTsKK30KKworI2RlZmluZSBHRVRQUk9QKGZkLCBwcm9wLCB4KSBkbyB7IFwKKwlpZiAoZ2V0cHJvcCgoZmQpLCBLR1NMX1BST1BfIyNwcm9wLCAmKHgpLCBzaXplb2YoeCkpKSB7ICAgICBcCisJCUVSUk9SX01TRygiZmFpbGVkIHRvIGdldCBwcm9wZXJ0eTogIiAjcHJvcCk7ICAgICAgICAgICAgXAorCQlnb3RvIGZhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9IH0gd2hpbGUgKDApCisKKworZHJtX3ByaXZhdGUgc3RydWN0IGZkX3BpcGUgKiBrZ3NsX3BpcGVfbmV3KHN0cnVjdCBmZF9kZXZpY2UgKmRldiwKKwkJZW51bSBmZF9waXBlX2lkIGlkKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpwYXRoc1tdID0geworCQkJW0ZEX1BJUEVfM0RdID0gIi9kZXYva2dzbC0zZDAiLAorCQkJW0ZEX1BJUEVfMkRdID0gIi9kZXYva2dzbC0yZDAiLAorCX07CisJc3RydWN0IGtnc2xfZHJhd2N0eHRfY3JlYXRlIHJlcSA9IHsKKwkJCS5mbGFncyA9IDB4MjAwMCwgLyogPz8/ICovCisJfTsKKwlzdHJ1Y3Qga2dzbF9waXBlICprZ3NsX3BpcGUgPSBOVUxMOworCXN0cnVjdCBmZF9waXBlICpwaXBlID0gTlVMTDsKKwlpbnQgcmV0LCBmZDsKKworCWZkID0gb3BlbihwYXRoc1tpZF0sIE9fUkRXUik7CisJaWYgKGZkIDwgMCkgeworCQlFUlJPUl9NU0coImNvdWxkIG5vdCBvcGVuICVzIGRldmljZTogJWQgKCVzKSIsCisJCQkJcGF0aHNbaWRdLCBmZCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldCA9IGlvY3RsKGZkLCBJT0NUTF9LR1NMX0RSQVdDVFhUX0NSRUFURSwgJnJlcSk7CisJaWYgKHJldCkgeworCQlFUlJPUl9NU0coImZhaWxlZCB0byBhbGxvY2F0ZSBjb250ZXh0OiAlZCAoJXMpIiwKKwkJCQlyZXQsIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlrZ3NsX3BpcGUgPSBjYWxsb2MoMSwgc2l6ZW9mKCprZ3NsX3BpcGUpKTsKKwlpZiAoIWtnc2xfcGlwZSkgeworCQlFUlJPUl9NU0coImFsbG9jYXRpb24gZmFpbGVkIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwaXBlID0gJmtnc2xfcGlwZS0+YmFzZTsKKwlwaXBlLT5mdW5jcyA9ICZmdW5jczsKKworCWtnc2xfcGlwZS0+ZmQgPSBmZDsKKwlrZ3NsX3BpcGUtPmRyYXdjdHh0X2lkID0gcmVxLmRyYXdjdHh0X2lkOworCisJbGlzdF9pbml0aGVhZCgma2dzbF9waXBlLT5zdWJtaXRfbGlzdCk7CisJbGlzdF9pbml0aGVhZCgma2dzbF9waXBlLT5wZW5kaW5nX2xpc3QpOworCisJR0VUUFJPUChmZCwgVkVSU0lPTiwgICAgIGtnc2xfcGlwZS0+dmVyc2lvbik7CisJR0VUUFJPUChmZCwgREVWSUNFX0lORk8sIGtnc2xfcGlwZS0+ZGV2aW5mbyk7CisKKwlpZiAoa2dzbF9waXBlLT5kZXZpbmZvLmdwdV9pZCA+PSA1MDApIHsKKwkJRVJST1JfTVNHKCI2NGIgdW5zdXBwb3J0ZWQgd2l0aCBrZ3NsIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlJTkZPX01TRygiUGlwZSBJbmZvOiIpOworCUlORk9fTVNHKCIgRGV2aWNlOiAgICAgICAgICAlcyIsIHBhdGhzW2lkXSk7CisJSU5GT19NU0coIiBDaGlwLWlkOiAgICAgICAgICVkLiVkLiVkLiVkIiwKKwkJCShrZ3NsX3BpcGUtPmRldmluZm8uY2hpcF9pZCA+PiAyNCkgJiAweGZmLAorCQkJKGtnc2xfcGlwZS0+ZGV2aW5mby5jaGlwX2lkID4+IDE2KSAmIDB4ZmYsCisJCQkoa2dzbF9waXBlLT5kZXZpbmZvLmNoaXBfaWQgPj4gIDgpICYgMHhmZiwKKwkJCShrZ3NsX3BpcGUtPmRldmluZm8uY2hpcF9pZCA+PiAgMCkgJiAweGZmKTsKKwlJTkZPX01TRygiIERldmljZS1pZDogICAgICAgJWQiLCBrZ3NsX3BpcGUtPmRldmluZm8uZGV2aWNlX2lkKTsKKwlJTkZPX01TRygiIEdQVS1pZDogICAgICAgICAgJWQiLCBrZ3NsX3BpcGUtPmRldmluZm8uZ3B1X2lkKTsKKwlJTkZPX01TRygiIE1NVSBlbmFibGVkOiAgICAgJWQiLCBrZ3NsX3BpcGUtPmRldmluZm8ubW11X2VuYWJsZWQpOworCUlORk9fTVNHKCIgR01FTSBCYXNlIGFkZHI6ICAweCUwOHgiLCBrZ3NsX3BpcGUtPmRldmluZm8uZ21lbV9ncHViYXNlYWRkcik7CisJSU5GT19NU0coIiBHTUVNIHNpemU6ICAgICAgIDB4JTA4eCIsIGtnc2xfcGlwZS0+ZGV2aW5mby5nbWVtX3NpemVieXRlcyk7CisJSU5GT19NU0coIiBEcml2ZXIgdmVyc2lvbjogICVkLiVkIiwKKwkJCWtnc2xfcGlwZS0+dmVyc2lvbi5kcnZfbWFqb3IsIGtnc2xfcGlwZS0+dmVyc2lvbi5kcnZfbWlub3IpOworCUlORk9fTVNHKCIgRGV2aWNlIHZlcnNpb246ICAlZC4lZCIsCisJCQlrZ3NsX3BpcGUtPnZlcnNpb24uZGV2X21ham9yLCBrZ3NsX3BpcGUtPnZlcnNpb24uZGV2X21pbm9yKTsKKworCXJldHVybiBwaXBlOworZmFpbDoKKwlpZiAocGlwZSkKKwkJZmRfcGlwZV9kZWwocGlwZSk7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9mcmVlZHJlbm8va2dzbC9rZ3NsX3ByaXYuaCBiL2ZyZWVkcmVuby9rZ3NsL2tnc2xfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYjY0OTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcmVlZHJlbm8va2dzbC9rZ3NsX3ByaXYuaApAQCAtMCwwICsxLDEyMCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImsmciI7IHRhYi13aWR0aCA0OyBpbmRlbnQtdGFicy1tb2RlOiB0OyAtKi0gKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBSb2IgQ2xhcmsgPHJvYmNsYXJrQGZyZWVkZXNrdG9wLm9yZz4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJvYiBDbGFyayA8cm9iY2xhcmtAZnJlZWRlc2t0b3Aub3JnPgorICovCisKKyNpZm5kZWYgS0dTTF9QUklWX0hfCisjZGVmaW5lIEtHU0xfUFJJVl9IXworCisjaW5jbHVkZSAiZnJlZWRyZW5vX3ByaXYuaCIKKyNpbmNsdWRlICJtc21fa2dzbC5oIgorI2luY2x1ZGUgImtnc2xfZHJtLmgiCisKK3N0cnVjdCBrZ3NsX2RldmljZSB7CisJc3RydWN0IGZkX2RldmljZSBiYXNlOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qga2dzbF9kZXZpY2UgKiB0b19rZ3NsX2RldmljZShzdHJ1Y3QgZmRfZGV2aWNlICp4KQoreworCXJldHVybiAoc3RydWN0IGtnc2xfZGV2aWNlICopeDsKK30KKworc3RydWN0IGtnc2xfcGlwZSB7CisJc3RydWN0IGZkX3BpcGUgYmFzZTsKKworCWludCBmZDsKKwl1aW50MzJfdCBkcmF3Y3R4dF9pZDsKKworCS8qIGRldmljZSBwcm9wZXJ0aWVzOiAqLworCXN0cnVjdCBrZ3NsX3ZlcnNpb24gdmVyc2lvbjsKKwlzdHJ1Y3Qga2dzbF9kZXZpbmZvIGRldmluZm87CisKKwkvKiBsaXN0IG9mIGJvJ3MgdGhhdCBhcmUgcmVmZXJlbmNlZCBpbiByaW5nYnVmZmVyIGJ1dCBub3QKKwkgKiBzdWJtaXR0ZWQgeWV0OgorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQgc3VibWl0X2xpc3Q7CisKKwkvKiBsaXN0IG9mIGJvJ3MgdGhhdCBoYXZlIGJlZW4gc3VibWl0dGVkIGJ1dCB0aW1lc3RhbXAgaGFzCisJICogbm90IHBhc3NlZCB5ZXQgKHNvIHN0aWxsIHJlZidkIGluIGFjdGl2ZSBjbWRzdHJlYW0pCisJICovCisJc3RydWN0IGxpc3RfaGVhZCBwZW5kaW5nX2xpc3Q7CisKKwkvKiBpZiB3ZSBhcmUgdGhlIDJkIHBpcGUsIGFuZCB3YW50IHRvIHdhaXQgb24gYSB0aW1lc3RhbXAKKwkgKiBmcm9tIDNkLCB3ZSBuZWVkIHRvIGFsc28gaW50ZXJuYWxseSBvcGVuIHRoZSAzZCBwaXBlOgorCSAqLworCXN0cnVjdCBmZF9waXBlICpwM2Q7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBrZ3NsX3BpcGUgKiB0b19rZ3NsX3BpcGUoc3RydWN0IGZkX3BpcGUgKngpCit7CisJcmV0dXJuIChzdHJ1Y3Qga2dzbF9waXBlICopeDsKK30KKworZHJtX3ByaXZhdGUgaW50IGlzX2tnc2xfcGlwZShzdHJ1Y3QgZmRfcGlwZSAqcGlwZSk7CisKK3N0cnVjdCBrZ3NsX2JvIHsKKwlzdHJ1Y3QgZmRfYm8gYmFzZTsKKwl1aW50NjRfdCBvZmZzZXQ7CisJdWludDMyX3QgZ3B1YWRkcjsKKwkvKiB0aW1lc3RhbXAgKHBlciBwaXBlKSBmb3IgYm8ncyBpbiBhIHBpcGUncyBwZW5kaW5nX2xpc3Q6ICovCisJdWludDMyX3QgdGltZXN0YW1wW0ZEX1BJUEVfTUFYXTsKKwkvKiBsaXN0LW5vZGUgZm9yIHBpcGUncyBzdWJtaXRfbGlzdCBvciBwZW5kaW5nX2xpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RbRkRfUElQRV9NQVhdOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qga2dzbF9ibyAqIHRvX2tnc2xfYm8oc3RydWN0IGZkX2JvICp4KQoreworCXJldHVybiAoc3RydWN0IGtnc2xfYm8gKil4OworfQorCisKK2RybV9wcml2YXRlIHN0cnVjdCBmZF9kZXZpY2UgKiBrZ3NsX2RldmljZV9uZXcoaW50IGZkKTsKKworZHJtX3ByaXZhdGUgaW50IGtnc2xfcGlwZV90aW1lc3RhbXAoc3RydWN0IGtnc2xfcGlwZSAqa2dzbF9waXBlLAorCQl1aW50MzJfdCAqdGltZXN0YW1wKTsKK2RybV9wcml2YXRlIHZvaWQga2dzbF9waXBlX2FkZF9zdWJtaXQoc3RydWN0IGtnc2xfcGlwZSAqcGlwZSwKKwkJc3RydWN0IGtnc2xfYm8gKmJvKTsKK2RybV9wcml2YXRlIHZvaWQga2dzbF9waXBlX3ByZV9zdWJtaXQoc3RydWN0IGtnc2xfcGlwZSAqcGlwZSk7Citkcm1fcHJpdmF0ZSB2b2lkIGtnc2xfcGlwZV9wb3N0X3N1Ym1pdChzdHJ1Y3Qga2dzbF9waXBlICpwaXBlLAorCQl1aW50MzJfdCB0aW1lc3RhbXApOworZHJtX3ByaXZhdGUgdm9pZCBrZ3NsX3BpcGVfcHJvY2Vzc19wZW5kaW5nKHN0cnVjdCBrZ3NsX3BpcGUgKnBpcGUsCisJCXVpbnQzMl90IHRpbWVzdGFtcCk7Citkcm1fcHJpdmF0ZSBzdHJ1Y3QgZmRfcGlwZSAqIGtnc2xfcGlwZV9uZXcoc3RydWN0IGZkX2RldmljZSAqZGV2LAorCQllbnVtIGZkX3BpcGVfaWQgaWQpOworCitkcm1fcHJpdmF0ZSBzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqIGtnc2xfcmluZ2J1ZmZlcl9uZXcoc3RydWN0IGZkX3BpcGUgKnBpcGUsCisJCXVpbnQzMl90IHNpemUpOworCitkcm1fcHJpdmF0ZSBpbnQga2dzbF9ib19uZXdfaGFuZGxlKHN0cnVjdCBmZF9kZXZpY2UgKmRldiwKKwkJdWludDMyX3Qgc2l6ZSwgdWludDMyX3QgZmxhZ3MsIHVpbnQzMl90ICpoYW5kbGUpOworZHJtX3ByaXZhdGUgc3RydWN0IGZkX2JvICoga2dzbF9ib19mcm9tX2hhbmRsZShzdHJ1Y3QgZmRfZGV2aWNlICpkZXYsCisJCXVpbnQzMl90IHNpemUsIHVpbnQzMl90IGhhbmRsZSk7CisKK2RybV9wcml2YXRlIHVpbnQzMl90IGtnc2xfYm9fZ3B1YWRkcihzdHJ1Y3Qga2dzbF9ibyAqYm8sIHVpbnQzMl90IG9mZnNldCk7Citkcm1fcHJpdmF0ZSB2b2lkIGtnc2xfYm9fc2V0X3RpbWVzdGFtcChzdHJ1Y3Qga2dzbF9ibyAqYm8sIHVpbnQzMl90IHRpbWVzdGFtcCk7Citkcm1fcHJpdmF0ZSB1aW50MzJfdCBrZ3NsX2JvX2dldF90aW1lc3RhbXAoc3RydWN0IGtnc2xfYm8gKmJvKTsKKworI2VuZGlmIC8qIEtHU0xfUFJJVl9IXyAqLwpkaWZmIC0tZ2l0IGEvZnJlZWRyZW5vL2tnc2wva2dzbF9yaW5nYnVmZmVyLmMgYi9mcmVlZHJlbm8va2dzbC9rZ3NsX3JpbmdidWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDljNDMzCi0tLSAvZGV2L251bGwKKysrIGIvZnJlZWRyZW5vL2tnc2wva2dzbF9yaW5nYnVmZmVyLmMKQEAgLTAsMCArMSwyMzUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJrJnIiOyB0YWItd2lkdGggNDsgaW5kZW50LXRhYnMtbW9kZTogdDsgLSotICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUm9iIENsYXJrIDxyb2JjbGFya0BmcmVlZGVza3RvcC5vcmc+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBSb2IgQ2xhcmsgPHJvYmNsYXJrQGZyZWVkZXNrdG9wLm9yZz4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJmcmVlZHJlbm9fcmluZ2J1ZmZlci5oIgorI2luY2x1ZGUgImtnc2xfcHJpdi5oIgorCisKKy8qIGJlY2F1c2Uga2dzbCB0cmllcyB0byB2YWxpZGF0ZSB0aGUgZ3B1YWRkciBvbiBrZXJuZWwgc2lkZSBpbiBJU1NVRUlCQ01EUywKKyAqIHdlIGNhbid0IHVzZSBub3JtYWwgZ2VtIGJvJ3MgZm9yIHJpbmdidWZmZXIuLiAgc29tZWRheSB0aGUga2VybmVsIHBhcnQKKyAqIG5lZWRzIHRvIGJlIHJld29ya2VkIGludG8gYSBzaW5nbGUgc2FuZSBkcm0gZHJpdmVyIDotLworICovCitzdHJ1Y3Qga2dzbF9yYl9ibyB7CisJc3RydWN0IGtnc2xfcGlwZSAqcGlwZTsKKwl2b2lkICAgICpob3N0cHRyOworCXVpbnQzMl90IGdwdWFkZHI7CisJdWludDMyX3Qgc2l6ZTsKK307CisKK3N0cnVjdCBrZ3NsX3JpbmdidWZmZXIgeworCXN0cnVjdCBmZF9yaW5nYnVmZmVyIGJhc2U7CisJc3RydWN0IGtnc2xfcmJfYm8gKmJvOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qga2dzbF9yaW5nYnVmZmVyICogdG9fa2dzbF9yaW5nYnVmZmVyKHN0cnVjdCBmZF9yaW5nYnVmZmVyICp4KQoreworCXJldHVybiAoc3RydWN0IGtnc2xfcmluZ2J1ZmZlciAqKXg7Cit9CisKK3N0YXRpYyB2b2lkIGtnc2xfcmJfYm9fZGVsKHN0cnVjdCBrZ3NsX3JiX2JvICpibykKK3sKKwlzdHJ1Y3Qga2dzbF9zaGFyZWRtZW1fZnJlZSByZXEgPSB7CisJCQkuZ3B1YWRkciA9IGJvLT5ncHVhZGRyLAorCX07CisJaW50IHJldDsKKworCWRybV9tdW5tYXAoYm8tPmhvc3RwdHIsIGJvLT5zaXplKTsKKworCXJldCA9IGlvY3RsKGJvLT5waXBlLT5mZCwgSU9DVExfS0dTTF9TSEFSRURNRU1fRlJFRSwgJnJlcSk7CisJaWYgKHJldCkgeworCQlFUlJPUl9NU0coInNoYXJlZG1lbSBmcmVlIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCX0KKworCWZyZWUoYm8pOworfQorCitzdGF0aWMgc3RydWN0IGtnc2xfcmJfYm8gKiBrZ3NsX3JiX2JvX25ldyhzdHJ1Y3Qga2dzbF9waXBlICpwaXBlLCB1aW50MzJfdCBzaXplKQoreworCXN0cnVjdCBrZ3NsX3JiX2JvICpibzsKKwlzdHJ1Y3Qga2dzbF9ncHVtZW1fYWxsb2MgcmVxID0geworCQkJLnNpemUgPSBBTElHTihzaXplLCA0MDk2KSwKKwkJCS5mbGFncyA9IEtHU0xfTUVNRkxBR1NfR1BVUkVBRE9OTFksCisJfTsKKwlpbnQgcmV0OworCisJYm8gPSBjYWxsb2MoMSwgc2l6ZW9mKCpibykpOworCWlmICghYm8pIHsKKwkJRVJST1JfTVNHKCJhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0ID0gaW9jdGwocGlwZS0+ZmQsIElPQ1RMX0tHU0xfR1BVTUVNX0FMTE9DLCAmcmVxKTsKKwlpZiAocmV0KSB7CisJCUVSUk9SX01TRygiZ3B1bWVtIGFsbG9jYXRpb24gZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwliby0+cGlwZSA9IHBpcGU7CisJYm8tPmdwdWFkZHIgPSByZXEuZ3B1YWRkcjsKKwliby0+c2l6ZSA9IHNpemU7CisJYm8tPmhvc3RwdHIgPSBkcm1fbW1hcChOVUxMLCBzaXplLCBQUk9UX1dSSVRFfFBST1RfUkVBRCwKKwkJCQlNQVBfU0hBUkVELCBwaXBlLT5mZCwgcmVxLmdwdWFkZHIpOworCisJcmV0dXJuIGJvOworZmFpbDoKKwlpZiAoYm8pCisJCWtnc2xfcmJfYm9fZGVsKGJvKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKiBrZ3NsX3JpbmdidWZmZXJfaG9zdHB0cihzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZykKK3sKKwlzdHJ1Y3Qga2dzbF9yaW5nYnVmZmVyICprZ3NsX3JpbmcgPSB0b19rZ3NsX3JpbmdidWZmZXIocmluZyk7CisJcmV0dXJuIGtnc2xfcmluZy0+Ym8tPmhvc3RwdHI7Cit9CisKK3N0YXRpYyBpbnQga2dzbF9yaW5nYnVmZmVyX2ZsdXNoKHN0cnVjdCBmZF9yaW5nYnVmZmVyICpyaW5nLCB1aW50MzJfdCAqbGFzdF9zdGFydCwKKwkJaW50IGluX2ZlbmNlX2ZkLCBpbnQgKm91dF9mZW5jZV9mZCkKK3sKKwlzdHJ1Y3Qga2dzbF9yaW5nYnVmZmVyICprZ3NsX3JpbmcgPSB0b19rZ3NsX3JpbmdidWZmZXIocmluZyk7CisJc3RydWN0IGtnc2xfcGlwZSAqa2dzbF9waXBlID0gdG9fa2dzbF9waXBlKHJpbmctPnBpcGUpOworCXVpbnQzMl90IG9mZnNldCA9ICh1aW50OF90ICopbGFzdF9zdGFydCAtICh1aW50OF90ICopcmluZy0+c3RhcnQ7CisJc3RydWN0IGtnc2xfaWJkZXNjIGliZGVzYyA9IHsKKwkJCS5ncHVhZGRyICAgICA9IGtnc2xfcmluZy0+Ym8tPmdwdWFkZHIgKyBvZmZzZXQsCisJCQkuaG9zdHB0ciAgICAgPSBsYXN0X3N0YXJ0LAorCQkJLnNpemVkd29yZHMgID0gcmluZy0+Y3VyIC0gbGFzdF9zdGFydCwKKwl9OworCXN0cnVjdCBrZ3NsX3JpbmdidWZmZXJfaXNzdWVpYmNtZHMgcmVxID0geworCQkJLmRyYXdjdHh0X2lkID0ga2dzbF9waXBlLT5kcmF3Y3R4dF9pZCwKKwkJCS5pYmRlc2NfYWRkciA9ICh1bnNpZ25lZCBsb25nKSZpYmRlc2MsCisJCQkubnVtaWJzICAgICAgPSAxLAorCQkJLmZsYWdzICAgICAgID0gS0dTTF9DT05URVhUX1NVQk1JVF9JQl9MSVNULAorCX07CisJaW50IHJldDsKKworCWFzc2VydChpbl9mZW5jZV9mZCA9PSAtMSk7CisJYXNzZXJ0KG91dF9mZW5jZV9mZCA9PSBOVUxMKTsKKworCWtnc2xfcGlwZV9wcmVfc3VibWl0KGtnc2xfcGlwZSk7CisKKwkvKiB6MTgwX2NtZHN0cmVhbV9pc3N1ZWliY21kcygpIGlzIG1hZGUgb2YgZmFpbDogKi8KKwlpZiAocmluZy0+cGlwZS0+aWQgPT0gRkRfUElQRV8yRCkgeworCQkvKiBmaXggdXAgc2l6ZSBmaWVsZCBpbiBsYXN0IGNtZCBwYWNrZXQgKi8KKwkJdWludDMyX3QgbGFzdF9zaXplID0gKHVpbnQzMl90KShyaW5nLT5jdXIgLSBsYXN0X3N0YXJ0KTsKKwkJLyogNSBpcyBsZW5ndGggb2YgZmlyc3QgcGFja2V0LCAyIGZvciB0aGUgdHdvIDdmMDAwMDAwJ3MgKi8KKwkJbGFzdF9zdGFydFsyXSA9IGxhc3Rfc2l6ZSAtICg1ICsgMik7CisJCWliZGVzYy5ncHVhZGRyID0ga2dzbF9yaW5nLT5iby0+Z3B1YWRkcjsKKwkJaWJkZXNjLmhvc3RwdHIgPSBrZ3NsX3JpbmctPmJvLT5ob3N0cHRyOworCQlpYmRlc2Muc2l6ZWR3b3JkcyA9IDB4MTQ1OworCQlyZXEudGltZXN0YW1wID0gKHVpbnRwdHJfdClrZ3NsX3JpbmctPmJvLT5ob3N0cHRyOworCX0KKworCWRvIHsKKwkJcmV0ID0gaW9jdGwoa2dzbF9waXBlLT5mZCwgSU9DVExfS0dTTF9SSU5HQlVGRkVSX0lTU1VFSUJDTURTLCAmcmVxKTsKKwl9IHdoaWxlICgocmV0ID09IC0xKSAmJiAoKGVycm5vID09IEVJTlRSKSB8fCAoZXJybm8gPT0gRUFHQUlOKSkpOworCWlmIChyZXQpCisJCUVSUk9SX01TRygiaXNzdWVpYmNtZHMgZmFpbGVkISAgJWQgKCVzKSIsIHJldCwgc3RyZXJyb3IoZXJybm8pKTsKKworCXJpbmctPmxhc3RfdGltZXN0YW1wID0gcmVxLnRpbWVzdGFtcDsKKwlyaW5nLT5sYXN0X3N0YXJ0ID0gcmluZy0+Y3VyOworCisJa2dzbF9waXBlX3Bvc3Rfc3VibWl0KGtnc2xfcGlwZSwgcmVxLnRpbWVzdGFtcCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBrZ3NsX3JpbmdidWZmZXJfZW1pdF9yZWxvYyhzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZywKKwkJY29uc3Qgc3RydWN0IGZkX3JlbG9jICpyKQoreworCXN0cnVjdCBrZ3NsX2JvICprZ3NsX2JvID0gdG9fa2dzbF9ibyhyLT5ibyk7CisJdWludDMyX3QgYWRkciA9IGtnc2xfYm9fZ3B1YWRkcihrZ3NsX2JvLCByLT5vZmZzZXQpOworCWFzc2VydChhZGRyKTsKKwlpZiAoci0+c2hpZnQgPCAwKQorCQlhZGRyID4+PSAtci0+c2hpZnQ7CisJZWxzZQorCQlhZGRyIDw8PSByLT5zaGlmdDsKKwkoKnJpbmctPmN1cisrKSA9IGFkZHIgfCByLT5vcjsKKwlrZ3NsX3BpcGVfYWRkX3N1Ym1pdCh0b19rZ3NsX3BpcGUocmluZy0+cGlwZSksIGtnc2xfYm8pOworfQorCitzdGF0aWMgdWludDMyX3Qga2dzbF9yaW5nYnVmZmVyX2VtaXRfcmVsb2NfcmluZyhzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZywKKwkJc3RydWN0IGZkX3JpbmdidWZmZXIgKnRhcmdldCwgdWludDMyX3QgY21kX2lkeCwKKwkJdWludDMyX3Qgc3VibWl0X29mZnNldCwgdWludDMyX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qga2dzbF9yaW5nYnVmZmVyICp0YXJnZXRfcmluZyA9IHRvX2tnc2xfcmluZ2J1ZmZlcih0YXJnZXQpOworCWFzc2VydChjbWRfaWR4ID09IDApOworCSgqcmluZy0+Y3VyKyspID0gdGFyZ2V0X3JpbmctPmJvLT5ncHVhZGRyICsgc3VibWl0X29mZnNldDsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHZvaWQga2dzbF9yaW5nYnVmZmVyX2Rlc3Ryb3koc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcpCit7CisJc3RydWN0IGtnc2xfcmluZ2J1ZmZlciAqa2dzbF9yaW5nID0gdG9fa2dzbF9yaW5nYnVmZmVyKHJpbmcpOworCWlmIChyaW5nLT5sYXN0X3RpbWVzdGFtcCkKKwkJZmRfcGlwZV93YWl0KHJpbmctPnBpcGUsIHJpbmctPmxhc3RfdGltZXN0YW1wKTsKKwlpZiAoa2dzbF9yaW5nLT5ibykKKwkJa2dzbF9yYl9ib19kZWwoa2dzbF9yaW5nLT5ibyk7CisJZnJlZShrZ3NsX3JpbmcpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZkX3JpbmdidWZmZXJfZnVuY3MgZnVuY3MgPSB7CisJCS5ob3N0cHRyID0ga2dzbF9yaW5nYnVmZmVyX2hvc3RwdHIsCisJCS5mbHVzaCA9IGtnc2xfcmluZ2J1ZmZlcl9mbHVzaCwKKwkJLmVtaXRfcmVsb2MgPSBrZ3NsX3JpbmdidWZmZXJfZW1pdF9yZWxvYywKKwkJLmVtaXRfcmVsb2NfcmluZyA9IGtnc2xfcmluZ2J1ZmZlcl9lbWl0X3JlbG9jX3JpbmcsCisJCS5kZXN0cm95ID0ga2dzbF9yaW5nYnVmZmVyX2Rlc3Ryb3ksCit9OworCitkcm1fcHJpdmF0ZSBzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqIGtnc2xfcmluZ2J1ZmZlcl9uZXcoc3RydWN0IGZkX3BpcGUgKnBpcGUsCisJCXVpbnQzMl90IHNpemUpCit7CisJc3RydWN0IGtnc2xfcmluZ2J1ZmZlciAqa2dzbF9yaW5nOworCXN0cnVjdCBmZF9yaW5nYnVmZmVyICpyaW5nID0gTlVMTDsKKworCWtnc2xfcmluZyA9IGNhbGxvYygxLCBzaXplb2YoKmtnc2xfcmluZykpOworCWlmICgha2dzbF9yaW5nKSB7CisJCUVSUk9SX01TRygiYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJZ290byBmYWlsOworCX0KKworCXJpbmcgPSAma2dzbF9yaW5nLT5iYXNlOworCXJpbmctPmZ1bmNzID0gJmZ1bmNzOworCXJpbmctPnNpemUgPSBzaXplOworCisJa2dzbF9yaW5nLT5ibyA9IGtnc2xfcmJfYm9fbmV3KHRvX2tnc2xfcGlwZShwaXBlKSwgc2l6ZSk7CisJaWYgKCFrZ3NsX3JpbmctPmJvKSB7CisJCUVSUk9SX01TRygicmluZ2J1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIHJpbmc7CitmYWlsOgorCWlmIChyaW5nKQorCQlmZF9yaW5nYnVmZmVyX2RlbChyaW5nKTsKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ZyZWVkcmVuby9rZ3NsL21zbV9rZ3NsLmggYi9mcmVlZHJlbm8va2dzbC9tc21fa2dzbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMzZlZWIKLS0tIC9kZXYvbnVsbAorKysgYi9mcmVlZHJlbm8va2dzbC9tc21fa2dzbC5oCkBAIC0wLDAgKzEsNTE5IEBACisjaWZuZGVmIF9NU01fS0dTTF9ICisjZGVmaW5lIF9NU01fS0dTTF9ICisKKyNkZWZpbmUgS0dTTF9WRVJTSU9OX01BSk9SICAgICAgICAzCisjZGVmaW5lIEtHU0xfVkVSU0lPTl9NSU5PUiAgICAgICAgMTEKKworLypjb250ZXh0IGZsYWdzICovCisjZGVmaW5lIEtHU0xfQ09OVEVYVF9TQVZFX0dNRU0JCTB4MDAwMDAwMDEKKyNkZWZpbmUgS0dTTF9DT05URVhUX05PX0dNRU1fQUxMT0MJMHgwMDAwMDAwMgorI2RlZmluZSBLR1NMX0NPTlRFWFRfU1VCTUlUX0lCX0xJU1QJMHgwMDAwMDAwNAorI2RlZmluZSBLR1NMX0NPTlRFWFRfQ1RYX1NXSVRDSAkJMHgwMDAwMDAwOAorI2RlZmluZSBLR1NMX0NPTlRFWFRfUFJFQU1CTEUJCTB4MDAwMDAwMTAKKyNkZWZpbmUgS0dTTF9DT05URVhUX1RSQVNIX1NUQVRFCTB4MDAwMDAwMjAKKyNkZWZpbmUgS0dTTF9DT05URVhUX1BFUl9DT05URVhUX1RTCTB4MDAwMDAwNDAKKworI2RlZmluZSBLR1NMX0NPTlRFWFRfSU5WQUxJRCAweGZmZmZmZmZmCisKKy8qIE1lbW9yeSBhbGxvY2F5aW9uIGZsYWdzICovCisjZGVmaW5lIEtHU0xfTUVNRkxBR1NfR1BVUkVBRE9OTFkJMHgwMTAwMDAwMAorCisvKiBnZW5lcmljIGZsYWcgdmFsdWVzICovCisjZGVmaW5lIEtHU0xfRkxBR1NfTk9STUFMTU9ERSAgMHgwMDAwMDAwMAorI2RlZmluZSBLR1NMX0ZMQUdTX1NBRkVNT0RFICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgS0dTTF9GTEFHU19JTklUSUFMSVpFRDAgMHgwMDAwMDAwMgorI2RlZmluZSBLR1NMX0ZMQUdTX0lOSVRJQUxJWkVEIDB4MDAwMDAwMDQKKyNkZWZpbmUgS0dTTF9GTEFHU19TVEFSVEVEICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEtHU0xfRkxBR1NfQUNUSVZFICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBLR1NMX0ZMQUdTX1JFU0VSVkVEMCAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgS0dTTF9GTEFHU19SRVNFUlZFRDEgICAweDAwMDAwMDQwCisjZGVmaW5lIEtHU0xfRkxBR1NfUkVTRVJWRUQyICAgMHgwMDAwMDA4MAorI2RlZmluZSBLR1NMX0ZMQUdTX1NPRlRfUkVTRVQgIDB4MDAwMDAxMDAKKyNkZWZpbmUgS0dTTF9GTEFHU19QRVJfQ09OVEVYVF9USU1FU1RBTVBTIDB4MDAwMDAyMDAKKworLyogQ2xvY2sgZmxhZ3MgdG8gc2hvdyB3aGljaCBjbG9ja3Mgc2hvdWxkIGJlIGNvbnRyb2xsZWQgYnkgYSBnaXZlbiBwbGF0Zm9ybSAqLworI2RlZmluZSBLR1NMX0NMS19TUkMJMHgwMDAwMDAwMQorI2RlZmluZSBLR1NMX0NMS19DT1JFCTB4MDAwMDAwMDIKKyNkZWZpbmUgS0dTTF9DTEtfSUZBQ0UJMHgwMDAwMDAwNAorI2RlZmluZSBLR1NMX0NMS19NRU0JMHgwMDAwMDAwOAorI2RlZmluZSBLR1NMX0NMS19NRU1fSUZBQ0UgMHgwMDAwMDAxMAorI2RlZmluZSBLR1NMX0NMS19BWEkJMHgwMDAwMDAyMAorCisvKgorICogUmVzZXQgc3RhdHVzIHZhbHVlcyBmb3IgY29udGV4dAorICovCitlbnVtIGtnc2xfY3R4X3Jlc2V0X3N0YXQgeworCUtHU0xfQ1RYX1NUQVRfTk9fRVJST1IJCQkJPSAweDAwMDAwMDAwLAorCUtHU0xfQ1RYX1NUQVRfR1VJTFRZX0NPTlRFWFRfUkVTRVRfRVhUCQk9IDB4MDAwMDAwMDEsCisJS0dTTF9DVFhfU1RBVF9JTk5PQ0VOVF9DT05URVhUX1JFU0VUX0VYVAk9IDB4MDAwMDAwMDIsCisJS0dTTF9DVFhfU1RBVF9VTktOT1dOX0NPTlRFWFRfUkVTRVRfRVhUCQk9IDB4MDAwMDAwMDMKK307CisKKyNkZWZpbmUgS0dTTF9NQVhfUFdSTEVWRUxTIDUKKworI2RlZmluZSBLR1NMX0NPTlZFUlRfVE9fTUJQUyh2YWwpIFwKKwkodmFsKjEwMDAqMTAwMFUpCisKKy8qIGRldmljZSBpZCAqLworZW51bSBrZ3NsX2RldmljZWlkIHsKKwlLR1NMX0RFVklDRV8zRDAJCT0gMHgwMDAwMDAwMCwKKwlLR1NMX0RFVklDRV8yRDAJCT0gMHgwMDAwMDAwMSwKKwlLR1NMX0RFVklDRV8yRDEJCT0gMHgwMDAwMDAwMiwKKwlLR1NMX0RFVklDRV9NQVgJCT0gMHgwMDAwMDAwMworfTsKKworZW51bSBrZ3NsX3VzZXJfbWVtX3R5cGUgeworCUtHU0xfVVNFUl9NRU1fVFlQRV9QTUVNCQk9IDB4MDAwMDAwMDAsCisJS0dTTF9VU0VSX01FTV9UWVBFX0FTSE1FTQk9IDB4MDAwMDAwMDEsCisJS0dTTF9VU0VSX01FTV9UWVBFX0FERFIJCT0gMHgwMDAwMDAwMiwKKwlLR1NMX1VTRVJfTUVNX1RZUEVfSU9OCQk9IDB4MDAwMDAwMDMsCisJS0dTTF9VU0VSX01FTV9UWVBFX01BWAkJPSAweDAwMDAwMDA0LAorfTsKKworc3RydWN0IGtnc2xfZGV2aW5mbyB7CisKKwl1bnNpZ25lZCBpbnQgZGV2aWNlX2lkOworCS8qIGNoaXAgcmV2aXNpb24gaWQKKwkqIGNvcmVpZDo4IG1ham9ycmV2OjggbWlub3JyZXY6OCBwYXRjaDo4CisJKi8KKwl1bnNpZ25lZCBpbnQgY2hpcF9pZDsKKwl1bnNpZ25lZCBpbnQgbW11X2VuYWJsZWQ7CisJdW5zaWduZWQgaW50IGdtZW1fZ3B1YmFzZWFkZHI7CisJLyoKKwkqIFRoaXMgZmllbGQgY29udGFpbnMgdGhlIGFkcmVubyByZXZpc2lvbgorCSogbnVtYmVyIDIwMCwgMjA1LCAyMjAsIGV0Yy4uLgorCSovCisJdW5zaWduZWQgaW50IGdwdV9pZDsKKwl1bnNpZ25lZCBpbnQgZ21lbV9zaXplYnl0ZXM7Cit9OworCisvKiB0aGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSByZWdpb24gb2YgbWVtb3J5IHRoYXQgY2FuIGJlIG1tYXAoKWVkIGZyb20gdGhpcworICAgZHJpdmVyLiBUaGUgdGltZXN0YW1wIGZpZWxkcyBhcmUgdm9sYXRpbGUgYmVjYXVzZSB0aGV5IGFyZSB3cml0dGVuIGJ5IHRoZQorICAgR1BVCisqLworc3RydWN0IGtnc2xfZGV2bWVtc3RvcmUgeworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBzb3B0aW1lc3RhbXA7CisJdW5zaWduZWQgaW50IHNiejsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgZW9wdGltZXN0YW1wOworCXVuc2lnbmVkIGludCBzYnoyOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCB0c19jbXBfZW5hYmxlOworCXVuc2lnbmVkIGludCBzYnozOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCByZWZfd2FpdF90czsKKwl1bnNpZ25lZCBpbnQgc2J6NDsKKwl1bnNpZ25lZCBpbnQgY3VycmVudF9jb250ZXh0OworCXVuc2lnbmVkIGludCBzYno1OworfTsKKworI2RlZmluZSBLR1NMX01FTVNUT1JFX09GRlNFVChjdHh0X2lkLCBmaWVsZCkgXAorCSgoY3R4dF9pZCkqc2l6ZW9mKHN0cnVjdCBrZ3NsX2Rldm1lbXN0b3JlKSArIFwKKwkgb2Zmc2V0b2Yoc3RydWN0IGtnc2xfZGV2bWVtc3RvcmUsIGZpZWxkKSkKKworLyogdGltZXN0YW1wIGlkKi8KK2VudW0ga2dzbF90aW1lc3RhbXBfdHlwZSB7CisJS0dTTF9USU1FU1RBTVBfQ09OU1VNRUQgPSAweDAwMDAwMDAxLCAvKiBzdGFydC1vZi1waXBlbGluZSB0aW1lc3RhbXAgKi8KKwlLR1NMX1RJTUVTVEFNUF9SRVRJUkVEICA9IDB4MDAwMDAwMDIsIC8qIGVuZC1vZi1waXBlbGluZSB0aW1lc3RhbXAqLworCUtHU0xfVElNRVNUQU1QX1FVRVVFRCAgID0gMHgwMDAwMDAwMywKK307CisKKy8qIHByb3BlcnR5IHR5cGVzIC0gdXNlZCB3aXRoIGtnc2xfZGV2aWNlX2dldHByb3BlcnR5ICovCitlbnVtIGtnc2xfcHJvcGVydHlfdHlwZSB7CisJS0dTTF9QUk9QX0RFVklDRV9JTkZPICAgICA9IDB4MDAwMDAwMDEsCisJS0dTTF9QUk9QX0RFVklDRV9TSEFET1cgICA9IDB4MDAwMDAwMDIsCisJS0dTTF9QUk9QX0RFVklDRV9QT1dFUiAgICA9IDB4MDAwMDAwMDMsCisJS0dTTF9QUk9QX1NITUVNICAgICAgICAgICA9IDB4MDAwMDAwMDQsCisJS0dTTF9QUk9QX1NITUVNX0FQRVJUVVJFUyA9IDB4MDAwMDAwMDUsCisJS0dTTF9QUk9QX01NVV9FTkFCTEUgCSAgPSAweDAwMDAwMDA2LAorCUtHU0xfUFJPUF9JTlRFUlJVUFRfV0FJVFMgPSAweDAwMDAwMDA3LAorCUtHU0xfUFJPUF9WRVJTSU9OICAgICAgICAgPSAweDAwMDAwMDA4LAorCUtHU0xfUFJPUF9HUFVfUkVTRVRfU1RBVCAgPSAweDAwMDAwMDA5LAorCUtHU0xfUFJPUF9QV1JDVFJMICAgICAgICAgPSAweDAwMDAwMDBFLAorfTsKKworc3RydWN0IGtnc2xfc2hhZG93cHJvcCB7CisJdW5zaWduZWQgaW50IGdwdWFkZHI7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgaW50IGZsYWdzOyAvKiBjb250YWlucyBLR1NMX0ZMQUdTXyB2YWx1ZXMgKi8KK307CisKK3N0cnVjdCBrZ3NsX3B3cmxldmVsIHsKKwl1bnNpZ25lZCBpbnQgZ3B1X2ZyZXE7CisJdW5zaWduZWQgaW50IGJ1c19mcmVxOworCXVuc2lnbmVkIGludCBpb19mcmFjdGlvbjsKK307CisKK3N0cnVjdCBrZ3NsX3ZlcnNpb24geworCXVuc2lnbmVkIGludCBkcnZfbWFqb3I7CisJdW5zaWduZWQgaW50IGRydl9taW5vcjsKKwl1bnNpZ25lZCBpbnQgZGV2X21ham9yOworCXVuc2lnbmVkIGludCBkZXZfbWlub3I7Cit9OworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIEtHU0xfM0QwX1JFR19NRU1PUlkJImtnc2xfM2QwX3JlZ19tZW1vcnkiCisjZGVmaW5lIEtHU0xfM0QwX0lSUQkJImtnc2xfM2QwX2lycSIKKyNkZWZpbmUgS0dTTF8yRDBfUkVHX01FTU9SWQkia2dzbF8yZDBfcmVnX21lbW9yeSIKKyNkZWZpbmUgS0dTTF8yRDBfSVJRCQkia2dzbF8yZDBfaXJxIgorI2RlZmluZSBLR1NMXzJEMV9SRUdfTUVNT1JZCSJrZ3NsXzJkMV9yZWdfbWVtb3J5IgorI2RlZmluZSBLR1NMXzJEMV9JUlEJCSJrZ3NsXzJkMV9pcnEiCisKK2VudW0ga2dzbF9pb21tdV9jb250ZXh0X2lkIHsKKwlLR1NMX0lPTU1VX0NPTlRFWFRfVVNFUiA9IDAsCisJS0dTTF9JT01NVV9DT05URVhUX1BSSVYgPSAxLAorfTsKKworc3RydWN0IGtnc2xfaW9tbXVfY3R4IHsKKwljb25zdCBjaGFyICppb21tdV9jdHhfbmFtZTsKKwllbnVtIGtnc2xfaW9tbXVfY29udGV4dF9pZCBjdHhfaWQ7Cit9OworCitzdHJ1Y3Qga2dzbF9kZXZpY2VfaW9tbXVfZGF0YSB7CisJY29uc3Qgc3RydWN0IGtnc2xfaW9tbXVfY3R4ICppb21tdV9jdHhzOworCWludCBpb21tdV9jdHhfY291bnQ7CisJdW5zaWduZWQgaW50IHBoeXNzdGFydDsKKwl1bnNpZ25lZCBpbnQgcGh5c2VuZDsKK307CisKK3N0cnVjdCBrZ3NsX2RldmljZV9wbGF0Zm9ybV9kYXRhIHsKKwlzdHJ1Y3Qga2dzbF9wd3JsZXZlbCBwd3JsZXZlbFtLR1NMX01BWF9QV1JMRVZFTFNdOworCWludCBpbml0X2xldmVsOworCWludCBudW1fbGV2ZWxzOworCWludCAoKnNldF9ncnBfYXN5bmMpKHZvaWQpOworCXVuc2lnbmVkIGludCBpZGxlX3RpbWVvdXQ7CisJYm9vbCBzdHJ0c3RwX3NsZWVwd2FrZTsKKwl1bnNpZ25lZCBpbnQgbmFwX2FsbG93ZWQ7CisJdW5zaWduZWQgaW50IGNsa19tYXA7CisJdW5zaWduZWQgaW50IGlkbGVfbmVlZGVkOworCXN0cnVjdCBtc21fYnVzX3NjYWxlX3BkYXRhICpidXNfc2NhbGVfdGFibGU7CisJc3RydWN0IGtnc2xfZGV2aWNlX2lvbW11X2RhdGEgKmlvbW11X2RhdGE7CisJaW50IGlvbW11X2NvdW50OworCXN0cnVjdCBtc21fZGN2c19jb3JlX2luZm8gKmNvcmVfaW5mbzsKK307CisKKyNlbmRpZgorCisvKiBzdHJ1Y3R1cmUgaG9sZHMgbGlzdCBvZiBpYnMgKi8KK3N0cnVjdCBrZ3NsX2liZGVzYyB7CisJdW5zaWduZWQgaW50IGdwdWFkZHI7CisJdm9pZCAqaG9zdHB0cjsKKwl1bnNpZ25lZCBpbnQgc2l6ZWR3b3JkczsKKwl1bnNpZ25lZCBpbnQgY3RybDsKK307CisKKy8qIGlvY3RscyAqLworI2RlZmluZSBLR1NMX0lPQ19UWVBFIDB4MDkKKworLyogZ2V0IG1pc2MgaW5mbyBhYm91dCB0aGUgR1BVCisgICB0eXBlIHNob3VsZCBiZSBhIHZhbHVlIGZyb20gZW51bSBrZ3NsX3Byb3BlcnR5X3R5cGUKKyAgIHZhbHVlIHBvaW50cyB0byBhIHN0cnVjdHVyZSB0aGF0IHZhcmllcyBiYXNlZCBvbiB0eXBlCisgICBzaXplYnl0ZXMgaXMgc2l6ZW9mKCkgdGhhdCBzdHJ1Y3R1cmUKKyAgIGZvciBLR1NMX1BST1BfREVWSUNFX0lORk8sIHVzZSBzdHJ1Y3Qga2dzbF9kZXZpbmZvCisgICB0aGlzIHN0cnVjdHVyZSBjb250YWluZ3MgaGFyZHdhcmUgdmVyc2lvbmluZyBpbmZvLgorICAgZm9yIEtHU0xfUFJPUF9ERVZJQ0VfU0hBRE9XLCB1c2Ugc3RydWN0IGtnc2xfc2hhZG93cHJvcAorICAgdGhpcyBpcyB1c2VkIHRvIGZpbmQgbW1hcCgpIG9mZnNldCBhbmQgc2l6ZXMgZm9yIG1hcHBpbmcKKyAgIHN0cnVjdCBrZ3NsX21lbXN0b3JlIGludG8gdXNlcnNwYWNlLgorKi8KK3N0cnVjdCBrZ3NsX2RldmljZV9nZXRwcm9wZXJ0eSB7CisJdW5zaWduZWQgaW50IHR5cGU7CisJdm9pZCAgKnZhbHVlOworCXVuc2lnbmVkIGludCBzaXplYnl0ZXM7Cit9OworCisjZGVmaW5lIElPQ1RMX0tHU0xfREVWSUNFX0dFVFBST1BFUlRZIFwKKwlfSU9XUihLR1NMX0lPQ19UWVBFLCAweDIsIHN0cnVjdCBrZ3NsX2RldmljZV9nZXRwcm9wZXJ0eSkKKworLyogSU9DVExfS0dTTF9ERVZJQ0VfUkVBRCAoMHgzKSAtIHJlbW92ZWQgMDMvMjAxMgorICovCisKKy8qIGJsb2NrIHVudGlsIHRoZSBHUFUgaGFzIGV4ZWN1dGVkIHBhc3QgYSBnaXZlbiB0aW1lc3RhbXAKKyAqIHRpbWVvdXQgaXMgaW4gbWlsbGlzZWNvbmRzLgorICovCitzdHJ1Y3Qga2dzbF9kZXZpY2Vfd2FpdHRpbWVzdGFtcCB7CisJdW5zaWduZWQgaW50IHRpbWVzdGFtcDsKKwl1bnNpZ25lZCBpbnQgdGltZW91dDsKK307CisKKyNkZWZpbmUgSU9DVExfS0dTTF9ERVZJQ0VfV0FJVFRJTUVTVEFNUCBcCisJX0lPVyhLR1NMX0lPQ19UWVBFLCAweDYsIHN0cnVjdCBrZ3NsX2RldmljZV93YWl0dGltZXN0YW1wKQorCitzdHJ1Y3Qga2dzbF9kZXZpY2Vfd2FpdHRpbWVzdGFtcF9jdHh0aWQgeworCXVuc2lnbmVkIGludCBjb250ZXh0X2lkOworCXVuc2lnbmVkIGludCB0aW1lc3RhbXA7CisJdW5zaWduZWQgaW50IHRpbWVvdXQ7Cit9OworCisjZGVmaW5lIElPQ1RMX0tHU0xfREVWSUNFX1dBSVRUSU1FU1RBTVBfQ1RYVElEIFwKKwlfSU9XKEtHU0xfSU9DX1RZUEUsIDB4Nywgc3RydWN0IGtnc2xfZGV2aWNlX3dhaXR0aW1lc3RhbXBfY3R4dGlkKQorCisvKiBpc3N1ZSBpbmRpcmVjdCBjb21tYW5kcyB0byB0aGUgR1BVLgorICogZHJhd2N0eHRfaWQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIElPQ1RMX0tHU0xfRFJBV0NUWFRfQ1JFQVRFCisgKiBpYmFkZHIgYW5kIHNpemVkd29yZHMgbXVzdCBzcGVjaWZ5IGEgc3Vic2V0IG9mIGEgYnVmZmVyIGNyZWF0ZWQKKyAqIHdpdGggSU9DVExfS0dTTF9TSEFSRURNRU1fRlJPTV9QTUVNCisgKiBmbGFncyBtYXkgYmUgYSBtYXNrIG9mIEtHU0xfQ09OVEVYVF8gdmFsdWVzCisgKiB0aW1lc3RhbXAgaXMgYSByZXR1cm5lZCBjb3VudGVyIHZhbHVlIHdoaWNoIGNhbiBiZSBwYXNzZWQgdG8KKyAqIG90aGVyIGlvY3RscyB0byBkZXRlcm1pbmUgd2hlbiB0aGUgY29tbWFuZHMgaGF2ZSBiZWVuIGV4ZWN1dGVkIGJ5CisgKiB0aGUgR1BVLgorICovCitzdHJ1Y3Qga2dzbF9yaW5nYnVmZmVyX2lzc3VlaWJjbWRzIHsKKwl1bnNpZ25lZCBpbnQgZHJhd2N0eHRfaWQ7CisJdW5zaWduZWQgaW50IGliZGVzY19hZGRyOworCXVuc2lnbmVkIGludCBudW1pYnM7CisJdW5zaWduZWQgaW50IHRpbWVzdGFtcDsgLypvdXRwdXQgcGFyYW0gKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7Cit9OworCisjZGVmaW5lIElPQ1RMX0tHU0xfUklOR0JVRkZFUl9JU1NVRUlCQ01EUyBcCisJX0lPV1IoS0dTTF9JT0NfVFlQRSwgMHgxMCwgc3RydWN0IGtnc2xfcmluZ2J1ZmZlcl9pc3N1ZWliY21kcykKKworLyogcmVhZCB0aGUgbW9zdCByZWNlbnRseSBleGVjdXRlZCB0aW1lc3RhbXAgdmFsdWUKKyAqIHR5cGUgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSBlbnVtIGtnc2xfdGltZXN0YW1wX3R5cGUKKyAqLworc3RydWN0IGtnc2xfY21kc3RyZWFtX3JlYWR0aW1lc3RhbXAgeworCXVuc2lnbmVkIGludCB0eXBlOworCXVuc2lnbmVkIGludCB0aW1lc3RhbXA7IC8qb3V0cHV0IHBhcmFtICovCit9OworCisjZGVmaW5lIElPQ1RMX0tHU0xfQ01EU1RSRUFNX1JFQURUSU1FU1RBTVBfT0xEIFwKKwlfSU9SKEtHU0xfSU9DX1RZUEUsIDB4MTEsIHN0cnVjdCBrZ3NsX2NtZHN0cmVhbV9yZWFkdGltZXN0YW1wKQorCisjZGVmaW5lIElPQ1RMX0tHU0xfQ01EU1RSRUFNX1JFQURUSU1FU1RBTVAgXAorCV9JT1dSKEtHU0xfSU9DX1RZUEUsIDB4MTEsIHN0cnVjdCBrZ3NsX2NtZHN0cmVhbV9yZWFkdGltZXN0YW1wKQorCisvKiBmcmVlIG1lbW9yeSB3aGVuIHRoZSBHUFUgcmVhY2hlcyBhIGdpdmVuIHRpbWVzdGFtcC4KKyAqIGdwdWFkZHIgc3BlY2lmeSBhIG1lbW9yeSByZWdpb24gY3JlYXRlZCBieSBhCisgKiBJT0NUTF9LR1NMX1NIQVJFRE1FTV9GUk9NX1BNRU0gY2FsbAorICogdHlwZSBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIGVudW0ga2dzbF90aW1lc3RhbXBfdHlwZQorICovCitzdHJ1Y3Qga2dzbF9jbWRzdHJlYW1fZnJlZW1lbW9udGltZXN0YW1wIHsKKwl1bnNpZ25lZCBpbnQgZ3B1YWRkcjsKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKwl1bnNpZ25lZCBpbnQgdGltZXN0YW1wOworfTsKKworI2RlZmluZSBJT0NUTF9LR1NMX0NNRFNUUkVBTV9GUkVFTUVNT05USU1FU1RBTVAgXAorCV9JT1coS0dTTF9JT0NfVFlQRSwgMHgxMiwgc3RydWN0IGtnc2xfY21kc3RyZWFtX2ZyZWVtZW1vbnRpbWVzdGFtcCkKKworLyogUHJldmlvdXMgdmVyc2lvbnMgb2YgdGhpcyBoZWFkZXIgaGFkIGluY29ycmVjdGx5IGRlZmluZWQKKyAgIElPQ1RMX0tHU0xfQ01EU1RSRUFNX0ZSRUVNRU1PTlRJTUVTVEFNUCBhcyBhIHJlYWQtb25seSBpb2N0bCBpbnN0ZWFkCisgICBvZiBhIHdyaXRlIG9ubHkgaW9jdGwuICBUbyBlbnN1cmUgYmluYXJ5IGNvbXBhdGliaWxpdHksIHRoZSBmb2xsb3dpbmcKKyAgICNkZWZpbmUgd2lsbCBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgaW5jb3JyZWN0IGlvY3RsCisqLworCisjZGVmaW5lIElPQ1RMX0tHU0xfQ01EU1RSRUFNX0ZSRUVNRU1PTlRJTUVTVEFNUF9PTEQgXAorCV9JT1IoS0dTTF9JT0NfVFlQRSwgMHgxMiwgc3RydWN0IGtnc2xfY21kc3RyZWFtX2ZyZWVtZW1vbnRpbWVzdGFtcCkKKworLyogY3JlYXRlIGEgZHJhdyBjb250ZXh0LCB3aGljaCBpcyB1c2VkIHRvIHByZXNlcnZlIEdQVSBzdGF0ZS4KKyAqIFRoZSBmbGFncyBmaWVsZCBtYXkgY29udGFpbiBhIG1hc2sgS0dTTF9DT05URVhUXyogIHZhbHVlcworICovCitzdHJ1Y3Qga2dzbF9kcmF3Y3R4dF9jcmVhdGUgeworCXVuc2lnbmVkIGludCBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZHJhd2N0eHRfaWQ7IC8qb3V0cHV0IHBhcmFtICovCit9OworCisjZGVmaW5lIElPQ1RMX0tHU0xfRFJBV0NUWFRfQ1JFQVRFIFwKKwlfSU9XUihLR1NMX0lPQ19UWVBFLCAweDEzLCBzdHJ1Y3Qga2dzbF9kcmF3Y3R4dF9jcmVhdGUpCisKKy8qIGRlc3Ryb3kgYSBkcmF3IGNvbnRleHQgKi8KK3N0cnVjdCBrZ3NsX2RyYXdjdHh0X2Rlc3Ryb3kgeworCXVuc2lnbmVkIGludCBkcmF3Y3R4dF9pZDsKK307CisKKyNkZWZpbmUgSU9DVExfS0dTTF9EUkFXQ1RYVF9ERVNUUk9ZIFwKKwlfSU9XKEtHU0xfSU9DX1RZUEUsIDB4MTQsIHN0cnVjdCBrZ3NsX2RyYXdjdHh0X2Rlc3Ryb3kpCisKKy8qIGFkZCBhIGJsb2NrIG9mIHBtZW0sIGZiLCBhc2htZW0gb3IgdXNlciBhbGxvY2F0ZWQgYWRkcmVzcworICogaW50byB0aGUgR1BVIGFkZHJlc3Mgc3BhY2UgKi8KK3N0cnVjdCBrZ3NsX21hcF91c2VyX21lbSB7CisJaW50IGZkOworCXVuc2lnbmVkIGludCBncHVhZGRyOyAgIC8qb3V0cHV0IHBhcmFtICovCisJdW5zaWduZWQgaW50IGxlbjsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGludCBob3N0cHRyOyAgIC8qaW5wdXQgcGFyYW0gKi8KKwllbnVtIGtnc2xfdXNlcl9tZW1fdHlwZSBtZW10eXBlOworCXVuc2lnbmVkIGludCByZXNlcnZlZDsJLyogTWF5IGJlIHJlcXVpcmVkIHRvIGFkZAorCQkJCXBhcmFtcyBmb3IgYW5vdGhlciBtZW0gdHlwZSAqLworfTsKKworI2RlZmluZSBJT0NUTF9LR1NMX01BUF9VU0VSX01FTSBcCisJX0lPV1IoS0dTTF9JT0NfVFlQRSwgMHgxNSwgc3RydWN0IGtnc2xfbWFwX3VzZXJfbWVtKQorCitzdHJ1Y3Qga2dzbF9jbWRzdHJlYW1fcmVhZHRpbWVzdGFtcF9jdHh0aWQgeworCXVuc2lnbmVkIGludCBjb250ZXh0X2lkOworCXVuc2lnbmVkIGludCB0eXBlOworCXVuc2lnbmVkIGludCB0aW1lc3RhbXA7IC8qb3V0cHV0IHBhcmFtICovCit9OworCisjZGVmaW5lIElPQ1RMX0tHU0xfQ01EU1RSRUFNX1JFQURUSU1FU1RBTVBfQ1RYVElEIFwKKwlfSU9XUihLR1NMX0lPQ19UWVBFLCAweDE2LCBzdHJ1Y3Qga2dzbF9jbWRzdHJlYW1fcmVhZHRpbWVzdGFtcF9jdHh0aWQpCisKK3N0cnVjdCBrZ3NsX2NtZHN0cmVhbV9mcmVlbWVtb250aW1lc3RhbXBfY3R4dGlkIHsKKwl1bnNpZ25lZCBpbnQgY29udGV4dF9pZDsKKwl1bnNpZ25lZCBpbnQgZ3B1YWRkcjsKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKwl1bnNpZ25lZCBpbnQgdGltZXN0YW1wOworfTsKKworI2RlZmluZSBJT0NUTF9LR1NMX0NNRFNUUkVBTV9GUkVFTUVNT05USU1FU1RBTVBfQ1RYVElEIFwKKwlfSU9XKEtHU0xfSU9DX1RZUEUsIDB4MTcsIFwKKwlzdHJ1Y3Qga2dzbF9jbWRzdHJlYW1fZnJlZW1lbW9udGltZXN0YW1wX2N0eHRpZCkKKworLyogYWRkIGEgYmxvY2sgb2YgcG1lbSBvciBmYiBpbnRvIHRoZSBHUFUgYWRkcmVzcyBzcGFjZSAqLworc3RydWN0IGtnc2xfc2hhcmVkbWVtX2Zyb21fcG1lbSB7CisJaW50IHBtZW1fZmQ7CisJdW5zaWduZWQgaW50IGdwdWFkZHI7CS8qb3V0cHV0IHBhcmFtICovCisJdW5zaWduZWQgaW50IGxlbjsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworfTsKKworI2RlZmluZSBJT0NUTF9LR1NMX1NIQVJFRE1FTV9GUk9NX1BNRU0gXAorCV9JT1dSKEtHU0xfSU9DX1RZUEUsIDB4MjAsIHN0cnVjdCBrZ3NsX3NoYXJlZG1lbV9mcm9tX3BtZW0pCisKKy8qIHJlbW92ZSBtZW1vcnkgZnJvbSB0aGUgR1BVJ3MgYWRkcmVzcyBzcGFjZSAqLworc3RydWN0IGtnc2xfc2hhcmVkbWVtX2ZyZWUgeworCXVuc2lnbmVkIGludCBncHVhZGRyOworfTsKKworI2RlZmluZSBJT0NUTF9LR1NMX1NIQVJFRE1FTV9GUkVFIFwKKwlfSU9XKEtHU0xfSU9DX1RZUEUsIDB4MjEsIHN0cnVjdCBrZ3NsX3NoYXJlZG1lbV9mcmVlKQorCitzdHJ1Y3Qga2dzbF9jZmZfdXNlcl9ldmVudCB7CisJdW5zaWduZWQgY2hhciBjZmZfb3Bjb2RlOworCXVuc2lnbmVkIGludCBvcDE7CisJdW5zaWduZWQgaW50IG9wMjsKKwl1bnNpZ25lZCBpbnQgb3AzOworCXVuc2lnbmVkIGludCBvcDQ7CisJdW5zaWduZWQgaW50IG9wNTsKKwl1bnNpZ25lZCBpbnQgX19wYWRbMl07Cit9OworCisjZGVmaW5lIElPQ1RMX0tHU0xfQ0ZGX1VTRVJfRVZFTlQgXAorCV9JT1coS0dTTF9JT0NfVFlQRSwgMHgzMSwgc3RydWN0IGtnc2xfY2ZmX3VzZXJfZXZlbnQpCisKK3N0cnVjdCBrZ3NsX2dtZW1fZGVzYyB7CisJdW5zaWduZWQgaW50IHg7CisJdW5zaWduZWQgaW50IHk7CisJdW5zaWduZWQgaW50IHdpZHRoOworCXVuc2lnbmVkIGludCBoZWlnaHQ7CisJdW5zaWduZWQgaW50IHBpdGNoOworfTsKKworc3RydWN0IGtnc2xfYnVmZmVyX2Rlc2MgeworCXZvaWQgCQkJKmhvc3RwdHI7CisJdW5zaWduZWQgaW50CWdwdWFkZHI7CisJaW50CQkJCXNpemU7CisJdW5zaWduZWQgaW50CWZvcm1hdDsKKwl1bnNpZ25lZCBpbnQgIAlwaXRjaDsKKwl1bnNpZ25lZCBpbnQgIAllbmFibGVkOworfTsKKworc3RydWN0IGtnc2xfYmluZF9nbWVtX3NoYWRvdyB7CisJdW5zaWduZWQgaW50IGRyYXdjdHh0X2lkOworCXN0cnVjdCBrZ3NsX2dtZW1fZGVzYyBnbWVtX2Rlc2M7CisJdW5zaWduZWQgaW50IHNoYWRvd194OworCXVuc2lnbmVkIGludCBzaGFkb3dfeTsKKwlzdHJ1Y3Qga2dzbF9idWZmZXJfZGVzYyBzaGFkb3dfYnVmZmVyOworCXVuc2lnbmVkIGludCBidWZmZXJfaWQ7Cit9OworCisjZGVmaW5lIElPQ1RMX0tHU0xfRFJBV0NUWFRfQklORF9HTUVNX1NIQURPVyBcCisgICAgX0lPVyhLR1NMX0lPQ19UWVBFLCAweDIyLCBzdHJ1Y3Qga2dzbF9iaW5kX2dtZW1fc2hhZG93KQorCisvKiBhZGQgYSBibG9jayBvZiBtZW1vcnkgaW50byB0aGUgR1BVIGFkZHJlc3Mgc3BhY2UgKi8KK3N0cnVjdCBrZ3NsX3NoYXJlZG1lbV9mcm9tX3ZtYWxsb2MgeworCXVuc2lnbmVkIGludCBncHVhZGRyOwkvKm91dHB1dCBwYXJhbSAqLworCXVuc2lnbmVkIGludCBob3N0cHRyOworCXVuc2lnbmVkIGludCBmbGFnczsKK307CisKKyNkZWZpbmUgSU9DVExfS0dTTF9TSEFSRURNRU1fRlJPTV9WTUFMTE9DIFwKKwlfSU9XUihLR1NMX0lPQ19UWVBFLCAweDIzLCBzdHJ1Y3Qga2dzbF9zaGFyZWRtZW1fZnJvbV92bWFsbG9jKQorCisjZGVmaW5lIElPQ1RMX0tHU0xfU0hBUkVETUVNX0ZMVVNIX0NBQ0hFIFwKKwlfSU9XKEtHU0xfSU9DX1RZUEUsIDB4MjQsIHN0cnVjdCBrZ3NsX3NoYXJlZG1lbV9mcmVlKQorCitzdHJ1Y3Qga2dzbF9kcmF3Y3R4dF9zZXRfYmluX2Jhc2Vfb2Zmc2V0IHsKKwl1bnNpZ25lZCBpbnQgZHJhd2N0eHRfaWQ7CisJdW5zaWduZWQgaW50IG9mZnNldDsKK307CisKKyNkZWZpbmUgSU9DVExfS0dTTF9EUkFXQ1RYVF9TRVRfQklOX0JBU0VfT0ZGU0VUIFwKKwlfSU9XKEtHU0xfSU9DX1RZUEUsIDB4MjUsIHN0cnVjdCBrZ3NsX2RyYXdjdHh0X3NldF9iaW5fYmFzZV9vZmZzZXQpCisKK2VudW0ga2dzbF9jbWR3aW5kb3dfdHlwZSB7CisJS0dTTF9DTURXSU5ET1dfTUlOICAgICA9IDB4MDAwMDAwMDAsCisJS0dTTF9DTURXSU5ET1dfMkQgICAgICA9IDB4MDAwMDAwMDAsCisJS0dTTF9DTURXSU5ET1dfM0QgICAgICA9IDB4MDAwMDAwMDEsIC8qIGxlZ2FjeSAqLworCUtHU0xfQ01EV0lORE9XX01NVSAgICAgPSAweDAwMDAwMDAyLAorCUtHU0xfQ01EV0lORE9XX0FSQklURVIgPSAweDAwMDAwMEZGLAorCUtHU0xfQ01EV0lORE9XX01BWCAgICAgPSAweDAwMDAwMEZGLAorfTsKKworLyogd3JpdGUgdG8gdGhlIGNvbW1hbmQgd2luZG93ICovCitzdHJ1Y3Qga2dzbF9jbWR3aW5kb3dfd3JpdGUgeworCWVudW0ga2dzbF9jbWR3aW5kb3dfdHlwZSB0YXJnZXQ7CisJdW5zaWduZWQgaW50IGFkZHI7CisJdW5zaWduZWQgaW50IGRhdGE7Cit9OworCisjZGVmaW5lIElPQ1RMX0tHU0xfQ01EV0lORE9XX1dSSVRFIFwKKwlfSU9XKEtHU0xfSU9DX1RZUEUsIDB4MmUsIHN0cnVjdCBrZ3NsX2NtZHdpbmRvd193cml0ZSkKKworc3RydWN0IGtnc2xfZ3B1bWVtX2FsbG9jIHsKKwl1bnNpZ25lZCBsb25nIGdwdWFkZHI7CisJc2l6ZV90IHNpemU7CisJdW5zaWduZWQgaW50IGZsYWdzOworfTsKKworI2RlZmluZSBJT0NUTF9LR1NMX0dQVU1FTV9BTExPQyBcCisJX0lPV1IoS0dTTF9JT0NfVFlQRSwgMHgyZiwgc3RydWN0IGtnc2xfZ3B1bWVtX2FsbG9jKQorCitzdHJ1Y3Qga2dzbF9jZmZfc3luY21lbSB7CisJdW5zaWduZWQgaW50IGdwdWFkZHI7CisJdW5zaWduZWQgaW50IGxlbjsKKwl1bnNpZ25lZCBpbnQgX19wYWRbMl07IC8qIEZvciBmdXR1cmUgYmluYXJ5IGNvbXBhdGliaWxpdHkgKi8KK307CisKKyNkZWZpbmUgSU9DVExfS0dTTF9DRkZfU1lOQ01FTSBcCisJX0lPVyhLR1NMX0lPQ19UWVBFLCAweDMwLCBzdHJ1Y3Qga2dzbF9jZmZfc3luY21lbSkKKworLyoKKyAqIEEgdGltZXN0YW1wIGV2ZW50IGFsbG93cyB0aGUgdXNlciBzcGFjZSB0byByZWdpc3RlciBhbiBhY3Rpb24gZm9sbG93aW5nIGFuCisgKiBleHBpcmVkIHRpbWVzdGFtcC4KKyAqLworCitzdHJ1Y3Qga2dzbF90aW1lc3RhbXBfZXZlbnQgeworCWludCB0eXBlOyAgICAgICAgICAgICAgICAvKiBUeXBlIG9mIGV2ZW50IChzZWUgbGlzdCBiZWxvdykgKi8KKwl1bnNpZ25lZCBpbnQgdGltZXN0YW1wOyAgLyogVGltZXN0YW1wIHRvIHRyaWdnZXIgZXZlbnQgb24gKi8KKwl1bnNpZ25lZCBpbnQgY29udGV4dF9pZDsgLyogQ29udGV4dCBmb3IgdGhlIHRpbWVzdGFtcCAqLworCXZvaWQgKnByaXY7ICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBldmVudCBzcGVjaWZpYyBibG9iICovCisJc2l6ZV90IGxlbjsgICAgICAgICAgICAgIC8qIFNpemUgb2YgdGhlIGV2ZW50IHNwZWNpZmljIGJsb2IgKi8KK307CisKKyNkZWZpbmUgSU9DVExfS0dTTF9USU1FU1RBTVBfRVZFTlQgXAorCV9JT1coS0dTTF9JT0NfVFlQRSwgMHgzMSwgc3RydWN0IGtnc2xfdGltZXN0YW1wX2V2ZW50KQorCisvKiBBIGdlbmxvY2sgdGltZXN0YW1wIGV2ZW50IHJlbGVhc2VzIGFuIGV4aXN0aW5nIGxvY2sgb24gdGltZXN0YW1wIGV4cGlyZSAqLworCisjZGVmaW5lIEtHU0xfVElNRVNUQU1QX0VWRU5UX0dFTkxPQ0sgMQorCitzdHJ1Y3Qga2dzbF90aW1lc3RhbXBfZXZlbnRfZ2VubG9jayB7CisJaW50IGhhbmRsZTsgLyogSGFuZGxlIG9mIHRoZSBnZW5sb2NrIGxvY2sgdG8gcmVsZWFzZSAqLworfTsKKworLyoKKyAqIFNldCBhIHByb3BlcnR5IHdpdGhpbiB0aGUga2VybmVsLiAgVXNlcyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMKKyAqIElPQ1RMX0tHU0xfR0VUUFJPUEVSVFkKKyAqLworCisjZGVmaW5lIElPQ1RMX0tHU0xfU0VUUFJPUEVSVFkgXAorCV9JT1coS0dTTF9JT0NfVFlQRSwgMHgzMiwgc3RydWN0IGtnc2xfZGV2aWNlX2dldHByb3BlcnR5KQorCisjaWZkZWYgX19LRVJORUxfXworI2lmZGVmIENPTkZJR19NU01fS0dTTF9EUk0KK2ludCBrZ3NsX2dlbV9vYmpfYWRkcihpbnQgZHJtX2ZkLCBpbnQgaGFuZGxlLCB1bnNpZ25lZCBsb25nICpzdGFydCwKKwkJCXVuc2lnbmVkIGxvbmcgKmxlbik7CisjZWxzZQorI2RlZmluZSBrZ3NsX2dlbV9vYmpfYWRkciguLi4pIDAKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYgLyogX01TTV9LR1NMX0ggKi8KZGlmZiAtLWdpdCBhL2ZyZWVkcmVuby9saWJkcm1fZnJlZWRyZW5vLnBjLmluIGIvZnJlZWRyZW5vL2xpYmRybV9mcmVlZHJlbm8ucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjczNmI2NQotLS0gL2Rldi9udWxsCisrKyBiL2ZyZWVkcmVuby9saWJkcm1fZnJlZWRyZW5vLnBjLmluCkBAIC0wLDAgKzEsMTEgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiBsaWJkcm1fZnJlZWRyZW5vCitEZXNjcmlwdGlvbjogVXNlcnNwYWNlIGludGVyZmFjZSB0byBmcmVlZHJlbm8ga2VybmVsIERSTSBzZXJ2aWNlcworVmVyc2lvbjogQFBBQ0tBR0VfVkVSU0lPTkAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sZHJtX2ZyZWVkcmVubworQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0gLUkke2luY2x1ZGVkaXJ9L2xpYmRybSAtSSR7aW5jbHVkZWRpcn0vZnJlZWRyZW5vCitSZXF1aXJlcy5wcml2YXRlOiBsaWJkcm0KZGlmZiAtLWdpdCBhL2ZyZWVkcmVuby9tc20vbXNtX2JvLmMgYi9mcmVlZHJlbm8vbXNtL21zbV9iby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNDcxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9mcmVlZHJlbm8vbXNtL21zbV9iby5jCkBAIC0wLDAgKzEsMTYxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiayZyIjsgdGFiLXdpZHRoIDQ7IGluZGVudC10YWJzLW1vZGU6IHQ7IC0qLSAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJvYiBDbGFyayA8cm9iY2xhcmtAZnJlZWRlc2t0b3Aub3JnPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgUm9iIENsYXJrIDxyb2JjbGFya0BmcmVlZGVza3RvcC5vcmc+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIm1zbV9wcml2LmgiCisKK3N0YXRpYyBpbnQgYm9fYWxsb2NhdGUoc3RydWN0IG1zbV9ibyAqbXNtX2JvKQoreworCXN0cnVjdCBmZF9ibyAqYm8gPSAmbXNtX2JvLT5iYXNlOworCWlmICghbXNtX2JvLT5vZmZzZXQpIHsKKwkJc3RydWN0IGRybV9tc21fZ2VtX2luZm8gcmVxID0geworCQkJCS5oYW5kbGUgPSBiby0+aGFuZGxlLAorCQl9OworCQlpbnQgcmV0OworCisJCS8qIGlmIHRoZSBidWZmZXIgaXMgYWxyZWFkeSBiYWNrZWQgYnkgcGFnZXMgdGhlbiB0aGlzCisJCSAqIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgKG90aGVyIHRoYW4gZ2l2aW5nIHVzCisJCSAqIHRoZSBvZmZzZXQpCisJCSAqLworCQlyZXQgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGJvLT5kZXYtPmZkLCBEUk1fTVNNX0dFTV9JTkZPLAorCQkJCSZyZXEsIHNpemVvZihyZXEpKTsKKwkJaWYgKHJldCkgeworCQkJRVJST1JfTVNHKCJhbGxvYyBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQltc21fYm8tPm9mZnNldCA9IHJlcS5vZmZzZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2JvX29mZnNldChzdHJ1Y3QgZmRfYm8gKmJvLCB1aW50NjRfdCAqb2Zmc2V0KQoreworCXN0cnVjdCBtc21fYm8gKm1zbV9ibyA9IHRvX21zbV9ibyhibyk7CisJaW50IHJldCA9IGJvX2FsbG9jYXRlKG1zbV9ibyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwkqb2Zmc2V0ID0gbXNtX2JvLT5vZmZzZXQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2JvX2NwdV9wcmVwKHN0cnVjdCBmZF9ibyAqYm8sIHN0cnVjdCBmZF9waXBlICpwaXBlLCB1aW50MzJfdCBvcCkKK3sKKwlzdHJ1Y3QgZHJtX21zbV9nZW1fY3B1X3ByZXAgcmVxID0geworCQkJLmhhbmRsZSA9IGJvLT5oYW5kbGUsCisJCQkub3AgPSBvcCwKKwl9OworCisJZ2V0X2Fic190aW1lb3V0KCZyZXEudGltZW91dCwgNTAwMDAwMDAwMCk7CisKKwlyZXR1cm4gZHJtQ29tbWFuZFdyaXRlKGJvLT5kZXYtPmZkLCBEUk1fTVNNX0dFTV9DUFVfUFJFUCwgJnJlcSwgc2l6ZW9mKHJlcSkpOworfQorCitzdGF0aWMgdm9pZCBtc21fYm9fY3B1X2Zpbmkoc3RydWN0IGZkX2JvICpibykKK3sKKwlzdHJ1Y3QgZHJtX21zbV9nZW1fY3B1X2ZpbmkgcmVxID0geworCQkJLmhhbmRsZSA9IGJvLT5oYW5kbGUsCisJfTsKKworCWRybUNvbW1hbmRXcml0ZShiby0+ZGV2LT5mZCwgRFJNX01TTV9HRU1fQ1BVX0ZJTkksICZyZXEsIHNpemVvZihyZXEpKTsKK30KKworc3RhdGljIGludCBtc21fYm9fbWFkdmlzZShzdHJ1Y3QgZmRfYm8gKmJvLCBpbnQgd2lsbG5lZWQpCit7CisJc3RydWN0IGRybV9tc21fZ2VtX21hZHZpc2UgcmVxID0geworCQkJLmhhbmRsZSA9IGJvLT5oYW5kbGUsCisJCQkubWFkdiA9IHdpbGxuZWVkID8gTVNNX01BRFZfV0lMTE5FRUQgOiBNU01fTUFEVl9ET05UTkVFRCwKKwl9OworCWludCByZXQ7CisKKwkvKiBvbGRlciBrZXJuZWxzIGRvIG5vdCBzdXBwb3J0IHRoaXM6ICovCisJaWYgKGJvLT5kZXYtPnZlcnNpb24gPCBGRF9WRVJTSU9OX01BRFZJU0UpCisJCXJldHVybiB3aWxsbmVlZDsKKworCXJldCA9IGRybUNvbW1hbmRXcml0ZVJlYWQoYm8tPmRldi0+ZmQsIERSTV9NU01fR0VNX01BRFZJU0UsICZyZXEsIHNpemVvZihyZXEpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHJlcS5yZXRhaW5lZDsKK30KKworc3RhdGljIHZvaWQgbXNtX2JvX2Rlc3Ryb3koc3RydWN0IGZkX2JvICpibykKK3sKKwlzdHJ1Y3QgbXNtX2JvICptc21fYm8gPSB0b19tc21fYm8oYm8pOworCWZyZWUobXNtX2JvKTsKKworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZkX2JvX2Z1bmNzIGZ1bmNzID0geworCQkub2Zmc2V0ID0gbXNtX2JvX29mZnNldCwKKwkJLmNwdV9wcmVwID0gbXNtX2JvX2NwdV9wcmVwLAorCQkuY3B1X2ZpbmkgPSBtc21fYm9fY3B1X2ZpbmksCisJCS5tYWR2aXNlID0gbXNtX2JvX21hZHZpc2UsCisJCS5kZXN0cm95ID0gbXNtX2JvX2Rlc3Ryb3ksCit9OworCisvKiBhbGxvY2F0ZSBhIGJ1ZmZlciBoYW5kbGU6ICovCitkcm1fcHJpdmF0ZSBpbnQgbXNtX2JvX25ld19oYW5kbGUoc3RydWN0IGZkX2RldmljZSAqZGV2LAorCQl1aW50MzJfdCBzaXplLCB1aW50MzJfdCBmbGFncywgdWludDMyX3QgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgZHJtX21zbV9nZW1fbmV3IHJlcSA9IHsKKwkJCS5zaXplID0gc2l6ZSwKKwkJCS5mbGFncyA9IE1TTV9CT19XQywgIC8vIFRPRE8gZmlndXJlIG91dCBwcm9wZXIgZmxhZ3MuLgorCX07CisJaW50IHJldDsKKworCXJldCA9IGRybUNvbW1hbmRXcml0ZVJlYWQoZGV2LT5mZCwgRFJNX01TTV9HRU1fTkVXLAorCQkJJnJlcSwgc2l6ZW9mKHJlcSkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkqaGFuZGxlID0gcmVxLmhhbmRsZTsKKworCXJldHVybiAwOworfQorCisvKiBhbGxvY2F0ZSBhIG5ldyBidWZmZXIgb2JqZWN0ICovCitkcm1fcHJpdmF0ZSBzdHJ1Y3QgZmRfYm8gKiBtc21fYm9fZnJvbV9oYW5kbGUoc3RydWN0IGZkX2RldmljZSAqZGV2LAorCQl1aW50MzJfdCBzaXplLCB1aW50MzJfdCBoYW5kbGUpCit7CisJc3RydWN0IG1zbV9ibyAqbXNtX2JvOworCXN0cnVjdCBmZF9ibyAqYm87CisKKwltc21fYm8gPSBjYWxsb2MoMSwgc2l6ZW9mKCptc21fYm8pKTsKKwlpZiAoIW1zbV9ibykKKwkJcmV0dXJuIE5VTEw7CisKKwlibyA9ICZtc21fYm8tPmJhc2U7CisJYm8tPmZ1bmNzID0gJmZ1bmNzOworCisJcmV0dXJuIGJvOworfQpkaWZmIC0tZ2l0IGEvZnJlZWRyZW5vL21zbS9tc21fZGV2aWNlLmMgYi9mcmVlZHJlbm8vbXNtL21zbV9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDU0OTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZnJlZWRyZW5vL21zbS9tc21fZGV2aWNlLmMKQEAgLTAsMCArMSw3MCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImsmciI7IHRhYi13aWR0aCA0OyBpbmRlbnQtdGFicy1tb2RlOiB0OyAtKi0gKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBSb2IgQ2xhcmsgPHJvYmNsYXJrQGZyZWVkZXNrdG9wLm9yZz4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJvYiBDbGFyayA8cm9iY2xhcmtAZnJlZWRlc2t0b3Aub3JnPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAibXNtX3ByaXYuaCIKKworc3RhdGljIHZvaWQgbXNtX2RldmljZV9kZXN0cm95KHN0cnVjdCBmZF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXNtX2RldmljZSAqbXNtX2RldiA9IHRvX21zbV9kZXZpY2UoZGV2KTsKKwlmZF9ib19jYWNoZV9jbGVhbnVwKCZtc21fZGV2LT5yaW5nX2NhY2hlLCAwKTsKKwlmcmVlKG1zbV9kZXYpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZkX2RldmljZV9mdW5jcyBmdW5jcyA9IHsKKwkJLmJvX25ld19oYW5kbGUgPSBtc21fYm9fbmV3X2hhbmRsZSwKKwkJLmJvX2Zyb21faGFuZGxlID0gbXNtX2JvX2Zyb21faGFuZGxlLAorCQkucGlwZV9uZXcgPSBtc21fcGlwZV9uZXcsCisJCS5kZXN0cm95ID0gbXNtX2RldmljZV9kZXN0cm95LAorfTsKKworZHJtX3ByaXZhdGUgc3RydWN0IGZkX2RldmljZSAqIG1zbV9kZXZpY2VfbmV3KGludCBmZCkKK3sKKwlzdHJ1Y3QgbXNtX2RldmljZSAqbXNtX2RldjsKKwlzdHJ1Y3QgZmRfZGV2aWNlICpkZXY7CisKKwltc21fZGV2ID0gY2FsbG9jKDEsIHNpemVvZigqbXNtX2RldikpOworCWlmICghbXNtX2RldikKKwkJcmV0dXJuIE5VTEw7CisKKwlkZXYgPSAmbXNtX2Rldi0+YmFzZTsKKwlkZXYtPmZ1bmNzID0gJmZ1bmNzOworCisJZmRfYm9fY2FjaGVfaW5pdCgmbXNtX2Rldi0+cmluZ19jYWNoZSwgVFJVRSk7CisKKwlkZXYtPmJvX3NpemUgPSBzaXplb2Yoc3RydWN0IG1zbV9ibyk7CisKKwlyZXR1cm4gZGV2OworfQpkaWZmIC0tZ2l0IGEvZnJlZWRyZW5vL21zbS9tc21fZHJtLmggYi9mcmVlZHJlbm8vbXNtL21zbV9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDRjOGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZnJlZWRyZW5vL21zbS9tc21fZHJtLmgKQEAgLTAsMCArMSwyNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdAorICogQXV0aG9yOiBSb2IgQ2xhcmsgPHJvYmRjbGFya0BnbWFpbC5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19NU01fRFJNX0hfXworI2RlZmluZSBfX01TTV9EUk1fSF9fCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlICJkcm0uaCIKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBQbGVhc2Ugbm90ZSB0aGF0IG1vZGlmaWNhdGlvbnMgdG8gYWxsIHN0cnVjdHMgZGVmaW5lZCBoZXJlIGFyZQorICogc3ViamVjdCB0byBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBjb25zdHJhaW50czoKKyAqICAxKSBEbyBub3QgdXNlIHBvaW50ZXJzLCB1c2UgX191NjQgaW5zdGVhZCBmb3IgMzIgYml0IC8gNjQgYml0CisgKiAgICAgdXNlci9rZXJuZWwgY29tcGF0aWJpbGl0eQorICogIDIpIEtlZXAgZmllbGRzIGFsaWduZWQgdG8gdGhlaXIgc2l6ZQorICogIDMpIEJlY2F1c2Ugb2YgaG93IGRybV9pb2N0bCgpIHdvcmtzLCB3ZSBjYW4gYWRkIG5ldyBmaWVsZHMgYXQKKyAqICAgICB0aGUgZW5kIG9mIGFuIGlvY3RsIGlmIHNvbWUgY2FyZSBpcyB0YWtlbjogZHJtX2lvY3RsKCkgd2lsbAorICogICAgIHplcm8gb3V0IHRoZSBuZXcgZmllbGRzIGF0IHRoZSB0YWlsIG9mIHRoZSBpb2N0bCwgc28gYSB6ZXJvCisgKiAgICAgdmFsdWUgc2hvdWxkIGhhdmUgYSBiYWNrd2FyZHMgY29tcGF0aWJsZSBtZWFuaW5nLiAgQW5kIGZvcgorICogICAgIG91dHB1dCBwYXJhbXMsIHVzZXJzcGFjZSB3b24ndCBzZWUgdGhlIG5ld2x5IGFkZGVkIG91dHB1dAorICogICAgIGZpZWxkcy4uIHNvIHRoYXQgaGFzIHRvIGJlIHNvbWVob3cgb2suCisgKi8KKworI2RlZmluZSBNU01fUElQRV9OT05FICAgICAgICAweDAwCisjZGVmaW5lIE1TTV9QSVBFXzJEMCAgICAgICAgIDB4MDEKKyNkZWZpbmUgTVNNX1BJUEVfMkQxICAgICAgICAgMHgwMgorI2RlZmluZSBNU01fUElQRV8zRDAgICAgICAgICAweDEwCisKKy8qIFRoZSBwaXBlLWlkIGp1c3QgdXNlcyB0aGUgbG93ZXIgYml0cywgc28gY2FuIGJlIE9SJ2Qgd2l0aCBmbGFncyBpbgorICogdGhlIHVwcGVyIDE2IGJpdHMgKHdoaWNoIGNvdWxkIGJlIGV4dGVuZGVkIGZ1cnRoZXIsIGlmIG5lZWRlZCwgbWF5YmUKKyAqIHdlIGV4dGVuZC9vdmVybG9hZCB0aGUgcGlwZS1pZCBzb21lIGRheSB0byBkZWFsIHdpdGggbXVsdGlwbGUgcmluZ3MsCisgKiBidXQgZXZlbiB0aGVuIEkgZG9uJ3QgdGhpbmsgd2UgbmVlZCB0aGUgZnVsbCBsb3dlciAxNiBiaXRzKS4KKyAqLworI2RlZmluZSBNU01fUElQRV9JRF9NQVNLICAgICAweGZmZmYKKyNkZWZpbmUgTVNNX1BJUEVfSUQoeCkgICAgICAgKCh4KSAmIE1TTV9QSVBFX0lEX01BU0spCisjZGVmaW5lIE1TTV9QSVBFX0ZMQUdTKHgpICAgICgoeCkgJiB+TVNNX1BJUEVfSURfTUFTSykKKworLyogdGltZW91dHMgYXJlIHNwZWNpZmllZCBpbiBjbG9jay1tb25vdG9uaWMgYWJzb2x1dGUgdGltZXMgKHRvIHNpbXBsaWZ5CisgKiByZXN0YXJ0aW5nIGludGVycnVwdGVkIGlvY3RscykuICBUaGUgZm9sbG93aW5nIHN0cnVjdCBpcyBsb2dpY2FsbHkgdGhlCisgKiBzYW1lIGFzICdzdHJ1Y3QgdGltZXNwZWMnIGJ1dCAzMi82NGIgQUJJIHNhZmUuCisgKi8KK3N0cnVjdCBkcm1fbXNtX3RpbWVzcGVjIHsKKwlfX3M2NCB0dl9zZWM7ICAgICAgICAgIC8qIHNlY29uZHMgKi8KKwlfX3M2NCB0dl9uc2VjOyAgICAgICAgIC8qIG5hbm9zZWNvbmRzICovCit9OworCisjZGVmaW5lIE1TTV9QQVJBTV9HUFVfSUQgICAgIDB4MDEKKyNkZWZpbmUgTVNNX1BBUkFNX0dNRU1fU0laRSAgMHgwMgorI2RlZmluZSBNU01fUEFSQU1fQ0hJUF9JRCAgICAweDAzCisjZGVmaW5lIE1TTV9QQVJBTV9NQVhfRlJFUSAgIDB4MDQKKyNkZWZpbmUgTVNNX1BBUkFNX1RJTUVTVEFNUCAgMHgwNQorCitzdHJ1Y3QgZHJtX21zbV9wYXJhbSB7CisJX191MzIgcGlwZTsgICAgICAgICAgIC8qIGluLCBNU01fUElQRV94ICovCisJX191MzIgcGFyYW07ICAgICAgICAgIC8qIGluLCBNU01fUEFSQU1feCAqLworCV9fdTY0IHZhbHVlOyAgICAgICAgICAvKiBvdXQgKGdldF9wYXJhbSkgb3IgaW4gKHNldF9wYXJhbSkgKi8KK307CisKKy8qCisgKiBHRU0gYnVmZmVyczoKKyAqLworCisjZGVmaW5lIE1TTV9CT19TQ0FOT1VUICAgICAgIDB4MDAwMDAwMDEgICAgIC8qIHNjYW5vdXQgY2FwYWJsZSAqLworI2RlZmluZSBNU01fQk9fR1BVX1JFQURPTkxZICAweDAwMDAwMDAyCisjZGVmaW5lIE1TTV9CT19DQUNIRV9NQVNLICAgIDB4MDAwZjAwMDAKKy8qIGNhY2hlIG1vZGVzICovCisjZGVmaW5lIE1TTV9CT19DQUNIRUQgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgTVNNX0JPX1dDICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBNU01fQk9fVU5DQUNIRUQgICAgICAweDAwMDQwMDAwCisKKyNkZWZpbmUgTVNNX0JPX0ZMQUdTICAgICAgICAgKE1TTV9CT19TQ0FOT1VUIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNNX0JPX0dQVV9SRUFET05MWSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TTV9CT19DQUNIRUQgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU01fQk9fV0MgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU01fQk9fVU5DQUNIRUQpCisKK3N0cnVjdCBkcm1fbXNtX2dlbV9uZXcgeworCV9fdTY0IHNpemU7ICAgICAgICAgICAvKiBpbiAqLworCV9fdTMyIGZsYWdzOyAgICAgICAgICAvKiBpbiwgbWFzayBvZiBNU01fQk9feCAqLworCV9fdTMyIGhhbmRsZTsgICAgICAgICAvKiBvdXQgKi8KK307CisKK3N0cnVjdCBkcm1fbXNtX2dlbV9pbmZvIHsKKwlfX3UzMiBoYW5kbGU7ICAgICAgICAgLyogaW4gKi8KKwlfX3UzMiBwYWQ7CisJX191NjQgb2Zmc2V0OyAgICAgICAgIC8qIG91dCwgb2Zmc2V0IHRvIHBhc3MgdG8gbW1hcCgpICovCit9OworCisjZGVmaW5lIE1TTV9QUkVQX1JFQUQgICAgICAgIDB4MDEKKyNkZWZpbmUgTVNNX1BSRVBfV1JJVEUgICAgICAgMHgwMgorI2RlZmluZSBNU01fUFJFUF9OT1NZTkMgICAgICAweDA0CisKKyNkZWZpbmUgTVNNX1BSRVBfRkxBR1MgICAgICAgKE1TTV9QUkVQX1JFQUQgfCBNU01fUFJFUF9XUklURSB8IE1TTV9QUkVQX05PU1lOQykKKworc3RydWN0IGRybV9tc21fZ2VtX2NwdV9wcmVwIHsKKwlfX3UzMiBoYW5kbGU7ICAgICAgICAgLyogaW4gKi8KKwlfX3UzMiBvcDsgICAgICAgICAgICAgLyogaW4sIG1hc2sgb2YgTVNNX1BSRVBfeCAqLworCXN0cnVjdCBkcm1fbXNtX3RpbWVzcGVjIHRpbWVvdXQ7ICAgLyogaW4gKi8KK307CisKK3N0cnVjdCBkcm1fbXNtX2dlbV9jcHVfZmluaSB7CisJX191MzIgaGFuZGxlOyAgICAgICAgIC8qIGluICovCit9OworCisvKgorICogQ21kc3RyZWFtIFN1Ym1pc3Npb246CisgKi8KKworLyogVGhlIHZhbHVlIHdyaXR0ZW4gaW50byB0aGUgY21kc3RyZWFtIGlzIGxvZ2ljYWxseToKKyAqCisgKiAgICgocmVsb2NidWYtPmdwdWFkZHIgKyByZWxvY19vZmZzZXQpIDw8IHNoaWZ0KSB8IG9yCisgKgorICogV2hlbiB3ZSBoYXZlIEdQVSdzIHcvID4zMmJpdCBwdHJzLCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gZGVhbAorICogd2l0aCB0aGlzIGJ5IGVtaXQnaW5nIHR3byByZWxvYyBlbnRyaWVzIHdpdGggYXBwcm9wcmlhdGUgc2hpZnQKKyAqIHZhbHVlcy4gIE9yIGEgbmV3IE1TTV9TVUJNSVRfQ01EX3ggdHlwZSB3b3VsZCBhbHNvIGJlIGFuIG9wdGlvbi4KKyAqCisgKiBOT1RFIHRoYXQgcmVsb2MncyBtdXN0IGJlIHNvcnRlZCBieSBvcmRlciBvZiBpbmNyZWFzaW5nIHN1Ym1pdF9vZmZzZXQsCisgKiBvdGhlcndpc2UgRUlOVkFMLgorICovCitzdHJ1Y3QgZHJtX21zbV9nZW1fc3VibWl0X3JlbG9jIHsKKwlfX3UzMiBzdWJtaXRfb2Zmc2V0OyAgLyogaW4sIG9mZnNldCBmcm9tIHN1Ym1pdF9ibyAqLworCV9fdTMyIG9yOyAgICAgICAgICAgICAvKiBpbiwgdmFsdWUgT1InZCB3aXRoIHJlc3VsdCAqLworCV9fczMyIHNoaWZ0OyAgICAgICAgICAvKiBpbiwgYW1vdW50IG9mIGxlZnQgc2hpZnQgKGNhbiBiZSBuZWdhdGl2ZSkgKi8KKwlfX3UzMiByZWxvY19pZHg7ICAgICAgLyogaW4sIGluZGV4IG9mIHJlbG9jX2JvIGJ1ZmZlciAqLworCV9fdTY0IHJlbG9jX29mZnNldDsgICAvKiBpbiwgb2Zmc2V0IGZyb20gc3RhcnQgb2YgcmVsb2NfYm8gKi8KK307CisKKy8qIHN1Ym1pdC10eXBlczoKKyAqICAgQlVGIC0gdGhpcyBjbWQgYnVmZmVyIGlzIGV4ZWN1dGVkIG5vcm1hbGx5LgorICogICBJQl9UQVJHRVRfQlVGIC0gdGhpcyBjbWQgYnVmZmVyIGlzIGFuIElCIHRhcmdldC4gIFJlbG9jJ3MgYXJlCisgKiAgICAgIHByb2Nlc3NlZCBub3JtYWxseSwgYnV0IHRoZSBrZXJuZWwgZG9lcyBub3Qgc2V0dXAgYW4gSUIgdG8KKyAqICAgICAgdGhpcyBidWZmZXIgaW4gdGhlIGZpcnN0LWxldmVsIHJpbmdidWZmZXIKKyAqICAgQ1RYX1JFU1RPUkVfQlVGIC0gb25seSBleGVjdXRlZCBpZiB0aGVyZSBoYXMgYmVlbiBhIEdQVSBjb250ZXh0CisgKiAgICAgIHN3aXRjaCBzaW5jZSB0aGUgbGFzdCBTVUJNSVQgaW9jdGwKKyAqLworI2RlZmluZSBNU01fU1VCTUlUX0NNRF9CVUYgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1TTV9TVUJNSVRfQ01EX0lCX1RBUkdFVF9CVUYgICAweDAwMDIKKyNkZWZpbmUgTVNNX1NVQk1JVF9DTURfQ1RYX1JFU1RPUkVfQlVGIDB4MDAwMworc3RydWN0IGRybV9tc21fZ2VtX3N1Ym1pdF9jbWQgeworCV9fdTMyIHR5cGU7ICAgICAgICAgICAvKiBpbiwgb25lIG9mIE1TTV9TVUJNSVRfQ01EX3ggKi8KKwlfX3UzMiBzdWJtaXRfaWR4OyAgICAgLyogaW4sIGluZGV4IG9mIHN1Ym1pdF9ibyBjbWRzdHJlYW0gYnVmZmVyICovCisJX191MzIgc3VibWl0X29mZnNldDsgIC8qIGluLCBvZmZzZXQgaW50byBzdWJtaXRfYm8gKi8KKwlfX3UzMiBzaXplOyAgICAgICAgICAgLyogaW4sIGNtZHN0cmVhbSBzaXplICovCisJX191MzIgcGFkOworCV9fdTMyIG5yX3JlbG9jczsgICAgICAvKiBpbiwgbnVtYmVyIG9mIHN1Ym1pdF9yZWxvYydzICovCisJX191NjQgX191c2VyIHJlbG9jczsgIC8qIGluLCBwdHIgdG8gYXJyYXkgb2Ygc3VibWl0X3JlbG9jJ3MgKi8KK307CisKKy8qIEVhY2ggYnVmZmVyIHJlZmVyZW5jZWQgZWxzZXdoZXJlIGluIHRoZSBjbWRzdHJlYW0gc3VibWl0IChpZS4gdGhlCisgKiBjbWRzdHJlYW0gYnVmZmVyKHMpIHRoZW1zZWx2ZXMgb3IgcmVsb2MgZW50cmllcykgaGFzIG9uZSAoYW5kIG9ubHkKKyAqIG9uZSkgZW50cnkgaW4gdGhlIHN1Ym1pdC0+Ym9zW10gdGFibGUuCisgKgorICogQXMgYSBvcHRpbWl6YXRpb24sIHRoZSBjdXJyZW50IGJ1ZmZlciAoZ3B1IHZpcnR1YWwgYWRkcmVzcykgY2FuIGJlCisgKiBwYXNzZWQgYmFjayB0aHJvdWdoIHRoZSAncHJlc3VtZWQnIGZpZWxkLiAgSWYgb24gYSBzdWJzZXF1ZW50IHJlbG9jLAorICogdXNlcnNwYWNlIHBhc3NlcyBiYWNrIGEgJ3ByZXN1bWVkJyBhZGRyZXNzIHRoYXQgaXMgc3RpbGwgdmFsaWQsCisgKiB0aGVuIHBhdGNoaW5nIHRoZSBjbWRzdHJlYW0gZm9yIHRoaXMgZW50cnkgaXMgc2tpcHBlZC4gIFRoaXMgY2FuCisgKiBhdm9pZCBrZXJuZWwgbmVlZGluZyB0byBtYXAvYWNjZXNzIHRoZSBjbWRzdHJlYW0gYm8gaW4gdGhlIGNvbW1vbgorICogY2FzZS4KKyAqLworI2RlZmluZSBNU01fU1VCTUlUX0JPX1JFQUQgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1TTV9TVUJNSVRfQk9fV1JJVEUgICAgICAgICAgICAweDAwMDIKKworI2RlZmluZSBNU01fU1VCTUlUX0JPX0ZMQUdTICAgICAgICAgICAgKE1TTV9TVUJNSVRfQk9fUkVBRCB8IE1TTV9TVUJNSVRfQk9fV1JJVEUpCisKK3N0cnVjdCBkcm1fbXNtX2dlbV9zdWJtaXRfYm8geworCV9fdTMyIGZsYWdzOyAgICAgICAgICAvKiBpbiwgbWFzayBvZiBNU01fU1VCTUlUX0JPX3ggKi8KKwlfX3UzMiBoYW5kbGU7ICAgICAgICAgLyogaW4sIEdFTSBoYW5kbGUgKi8KKwlfX3U2NCBwcmVzdW1lZDsgICAgICAgLyogaW4vb3V0LCBwcmVzdW1lZCBidWZmZXIgYWRkcmVzcyAqLworfTsKKworLyogVmFsaWQgc3VibWl0IGlvY3RsIGZsYWdzOiAqLworI2RlZmluZSBNU01fU1VCTUlUX05PX0lNUExJQ0lUICAgMHg4MDAwMDAwMCAvKiBkaXNhYmxlIGltcGxpY2l0IHN5bmMgKi8KKyNkZWZpbmUgTVNNX1NVQk1JVF9GRU5DRV9GRF9JTiAgIDB4NDAwMDAwMDAgLyogZW5hYmxlIGlucHV0IGZlbmNlX2ZkICovCisjZGVmaW5lIE1TTV9TVUJNSVRfRkVOQ0VfRkRfT1VUICAweDIwMDAwMDAwIC8qIGVuYWJsZSBvdXRwdXQgZmVuY2VfZmQgKi8KKyNkZWZpbmUgTVNNX1NVQk1JVF9GTEFHUyAgICAgICAgICAgICAgICAoIFwKKwkJTVNNX1NVQk1JVF9OT19JTVBMSUNJVCAgIHwgXAorCQlNU01fU1VCTUlUX0ZFTkNFX0ZEX0lOICAgfCBcCisJCU1TTV9TVUJNSVRfRkVOQ0VfRkRfT1VUICB8IFwKKwkJMCkKKworLyogRWFjaCBjbWRzdHJlYW0gc3VibWl0IGNvbnNpc3RzIG9mIGEgdGFibGUgb2YgYnVmZmVycyBpbnZvbHZlZCwgYW5kCisgKiBvbmUgb3IgbW9yZSBjbWRzdHJlYW0gYnVmZmVycy4gIFRoaXMgYWxsb3dzIGZvciBjb25kaXRpb25hbCBleGVjdXRpb24KKyAqIChjb250ZXh0LXJlc3RvcmUpLCBhbmQgSUIgYnVmZmVycyBuZWVkZWQgZm9yIHBlciB0aWxlL2JpbiBkcmF3IGNtZHMuCisgKi8KK3N0cnVjdCBkcm1fbXNtX2dlbV9zdWJtaXQgeworCV9fdTMyIGZsYWdzOyAgICAgICAgICAvKiBNU01fUElQRV94IHwgTVNNX1NVQk1JVF94ICovCisJX191MzIgZmVuY2U7ICAgICAgICAgIC8qIG91dCAqLworCV9fdTMyIG5yX2JvczsgICAgICAgICAvKiBpbiwgbnVtYmVyIG9mIHN1Ym1pdF9ibydzICovCisJX191MzIgbnJfY21kczsgICAgICAgIC8qIGluLCBudW1iZXIgb2Ygc3VibWl0X2NtZCdzICovCisJX191NjQgX191c2VyIGJvczsgICAgIC8qIGluLCBwdHIgdG8gYXJyYXkgb2Ygc3VibWl0X2JvJ3MgKi8KKwlfX3U2NCBfX3VzZXIgY21kczsgICAgLyogaW4sIHB0ciB0byBhcnJheSBvZiBzdWJtaXRfY21kJ3MgKi8KKwlfX3MzMiBmZW5jZV9mZDsgICAgICAgLyogaW4vb3V0IGZlbmNlIGZkIChzZWUgTVNNX1NVQk1JVF9GRU5DRV9GRF9JTi9PVVQpICovCit9OworCisvKiBUaGUgbm9ybWFsIHdheSB0byBzeW5jaHJvbml6ZSB3aXRoIHRoZSBHUFUgaXMganVzdCB0byBDUFVfUFJFUCBvbgorICogYSBidWZmZXIgaWYgeW91IG5lZWQgdG8gYWNjZXNzIGl0IGZyb20gdGhlIENQVSAob3RoZXIgY21kc3RyZWFtCisgKiBzdWJtaXNzaW9uIGZyb20gc2FtZSBvciBvdGhlciBjb250ZXh0cywgUEFHRV9GTElQIGlvY3RsLCBldGMsIGFsbAorICogaGFuZGxlIHRoZSByZXF1aXJlZCBzeW5jaHJvbml6YXRpb24gdW5kZXIgdGhlIGhvb2QpLiAgVGhpcyBpb2N0bAorICogbWFpbmx5IGp1c3QgZXhpc3RzIGFzIGEgd2F5IHRvIGltcGxlbWVudCB0aGUgZ2FsbGl1bSBwaXBlX2ZlbmNlCisgKiBBUElzIHdpdGhvdXQgcmVxdWlyaW5nIGEgZHVtbXkgYm8gdG8gc3luY2hyb25pemUgb24uCisgKi8KK3N0cnVjdCBkcm1fbXNtX3dhaXRfZmVuY2UgeworCV9fdTMyIGZlbmNlOyAgICAgICAgICAvKiBpbiAqLworCV9fdTMyIHBhZDsKKwlzdHJ1Y3QgZHJtX21zbV90aW1lc3BlYyB0aW1lb3V0OyAgIC8qIGluICovCit9OworCisvKiBtYWR2aXNlIHByb3ZpZGVzIGEgd2F5IHRvIHRlbGwgdGhlIGtlcm5lbCBpbiBjYXNlIGEgYnVmZmVycyBjb250ZW50cworICogY2FuIGJlIGRpc2NhcmRlZCB1bmRlciBtZW1vcnkgcHJlc3N1cmUsIHdoaWNoIGlzIHVzZWZ1bCBmb3IgdXNlcnNwYWNlCisgKiBibyBjYWNoZSB3aGVyZSB3ZSB3YW50IHRvIG9wdGltaXN0aWNhbGx5IGhvbGQgb24gdG8gYnVmZmVyIGFsbG9jYXRlCisgKiBhbmQgcG90ZW50aWFsIG1tYXAsIGJ1dCBhbGxvdyB0aGUgcGFnZXMgdG8gYmUgZGlzY2FyZGVkIHVuZGVyIG1lbW9yeQorICogcHJlc3N1cmUuCisgKgorICogVHlwaWNhbCB1c2FnZSB3b3VsZCBpbnZvbHZlIG1hZHZpc2UoRE9OVE5FRUQpIHdoZW4gYnVmZmVyIGVudGVycyBCTworICogY2FjaGUsIGFuZCBtYWR2aXNlKFdJTExORUVEKSBpZiB0cnlpbmcgdG8gcmVjeWNsZSBidWZmZXIgZnJvbSBCTyBjYWNoZS4KKyAqIEluIHRoZSBXSUxMTkVFRCBjYXNlLCAncmV0YWluZWQnIGluZGljYXRlcyB0byB1c2Vyc3BhY2Ugd2hldGhlciB0aGUKKyAqIGJhY2tpbmcgcGFnZXMgc3RpbGwgZXhpc3QuCisgKi8KKyNkZWZpbmUgTVNNX01BRFZfV0lMTE5FRUQgMCAgICAgICAvKiBiYWNraW5nIHBhZ2VzIGFyZSBuZWVkZWQsIHN0YXR1cyByZXR1cm5lZCBpbiAncmV0YWluZWQnICovCisjZGVmaW5lIE1TTV9NQURWX0RPTlRORUVEIDEgICAgICAgLyogYmFja2luZyBwYWdlcyBub3QgbmVlZGVkICovCisjZGVmaW5lIF9fTVNNX01BRFZfUFVSR0VEIDIgICAgICAgLyogaW50ZXJuYWwgc3RhdGUgKi8KKworc3RydWN0IGRybV9tc21fZ2VtX21hZHZpc2UgeworCV9fdTMyIGhhbmRsZTsgICAgICAgICAvKiBpbiwgR0VNIGhhbmRsZSAqLworCV9fdTMyIG1hZHY7ICAgICAgICAgICAvKiBpbiwgTVNNX01BRFZfeCAqLworCV9fdTMyIHJldGFpbmVkOyAgICAgICAvKiBvdXQsIHdoZXRoZXIgYmFja2luZyBzdG9yZSBzdGlsbCBleGlzdHMgKi8KK307CisKKyNkZWZpbmUgRFJNX01TTV9HRVRfUEFSQU0gICAgICAgICAgICAgIDB4MDAKKy8qIHBsYWNlaG9sZGVyOgorI2RlZmluZSBEUk1fTVNNX1NFVF9QQVJBTSAgICAgICAgICAgICAgMHgwMQorICovCisjZGVmaW5lIERSTV9NU01fR0VNX05FVyAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIERSTV9NU01fR0VNX0lORk8gICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIERSTV9NU01fR0VNX0NQVV9QUkVQICAgICAgICAgICAweDA0CisjZGVmaW5lIERSTV9NU01fR0VNX0NQVV9GSU5JICAgICAgICAgICAweDA1CisjZGVmaW5lIERSTV9NU01fR0VNX1NVQk1JVCAgICAgICAgICAgICAweDA2CisjZGVmaW5lIERSTV9NU01fV0FJVF9GRU5DRSAgICAgICAgICAgICAweDA3CisjZGVmaW5lIERSTV9NU01fR0VNX01BRFZJU0UgICAgICAgICAgICAweDA4CisjZGVmaW5lIERSTV9NU01fTlVNX0lPQ1RMUyAgICAgICAgICAgICAweDA5CisKKyNkZWZpbmUgRFJNX0lPQ1RMX01TTV9HRVRfUEFSQU0gICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTVNNX0dFVF9QQVJBTSwgc3RydWN0IGRybV9tc21fcGFyYW0pCisjZGVmaW5lIERSTV9JT0NUTF9NU01fR0VNX05FVyAgICAgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX01TTV9HRU1fTkVXLCBzdHJ1Y3QgZHJtX21zbV9nZW1fbmV3KQorI2RlZmluZSBEUk1fSU9DVExfTVNNX0dFTV9JTkZPICAgICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NU01fR0VNX0lORk8sIHN0cnVjdCBkcm1fbXNtX2dlbV9pbmZvKQorI2RlZmluZSBEUk1fSU9DVExfTVNNX0dFTV9DUFVfUFJFUCAgICAgRFJNX0lPVyAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NU01fR0VNX0NQVV9QUkVQLCBzdHJ1Y3QgZHJtX21zbV9nZW1fY3B1X3ByZXApCisjZGVmaW5lIERSTV9JT0NUTF9NU01fR0VNX0NQVV9GSU5JICAgICBEUk1fSU9XIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX01TTV9HRU1fQ1BVX0ZJTkksIHN0cnVjdCBkcm1fbXNtX2dlbV9jcHVfZmluaSkKKyNkZWZpbmUgRFJNX0lPQ1RMX01TTV9HRU1fU1VCTUlUICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTVNNX0dFTV9TVUJNSVQsIHN0cnVjdCBkcm1fbXNtX2dlbV9zdWJtaXQpCisjZGVmaW5lIERSTV9JT0NUTF9NU01fV0FJVF9GRU5DRSAgICAgICBEUk1fSU9XIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX01TTV9XQUlUX0ZFTkNFLCBzdHJ1Y3QgZHJtX21zbV93YWl0X2ZlbmNlKQorI2RlZmluZSBEUk1fSU9DVExfTVNNX0dFTV9NQURWSVNFICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NU01fR0VNX01BRFZJU0UsIHN0cnVjdCBkcm1fbXNtX2dlbV9tYWR2aXNlKQorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19NU01fRFJNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnJlZWRyZW5vL21zbS9tc21fcGlwZS5jIGIvZnJlZWRyZW5vL21zbS9tc21fcGlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NzJlMjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcmVlZHJlbm8vbXNtL21zbV9waXBlLmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJrJnIiOyB0YWItd2lkdGggNDsgaW5kZW50LXRhYnMtbW9kZTogdDsgLSotICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUm9iIENsYXJrIDxyb2JjbGFya0BmcmVlZGVza3RvcC5vcmc+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBSb2IgQ2xhcmsgPHJvYmNsYXJrQGZyZWVkZXNrdG9wLm9yZz4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibXNtX3ByaXYuaCIKKworc3RhdGljIGludCBxdWVyeV9wYXJhbShzdHJ1Y3QgZmRfcGlwZSAqcGlwZSwgdWludDMyX3QgcGFyYW0sCisJCXVpbnQ2NF90ICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgbXNtX3BpcGUgKm1zbV9waXBlID0gdG9fbXNtX3BpcGUocGlwZSk7CisJc3RydWN0IGRybV9tc21fcGFyYW0gcmVxID0geworCQkJLnBpcGUgPSBtc21fcGlwZS0+cGlwZSwKKwkJCS5wYXJhbSA9IHBhcmFtLAorCX07CisJaW50IHJldDsKKworCXJldCA9IGRybUNvbW1hbmRXcml0ZVJlYWQocGlwZS0+ZGV2LT5mZCwgRFJNX01TTV9HRVRfUEFSQU0sCisJCQkmcmVxLCBzaXplb2YocmVxKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCSp2YWx1ZSA9IHJlcS52YWx1ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9waXBlX2dldF9wYXJhbShzdHJ1Y3QgZmRfcGlwZSAqcGlwZSwKKwkJZW51bSBmZF9wYXJhbV9pZCBwYXJhbSwgdWludDY0X3QgKnZhbHVlKQoreworCXN0cnVjdCBtc21fcGlwZSAqbXNtX3BpcGUgPSB0b19tc21fcGlwZShwaXBlKTsKKwlzd2l0Y2gocGFyYW0pIHsKKwljYXNlIEZEX0RFVklDRV9JRDogLy8gWFhYIHByb2JhYmx5IGdldCByaWQgb2YgdGhpcy4uCisJY2FzZSBGRF9HUFVfSUQ6CisJCSp2YWx1ZSA9IG1zbV9waXBlLT5ncHVfaWQ7CisJCXJldHVybiAwOworCWNhc2UgRkRfR01FTV9TSVpFOgorCQkqdmFsdWUgPSBtc21fcGlwZS0+Z21lbTsKKwkJcmV0dXJuIDA7CisJY2FzZSBGRF9DSElQX0lEOgorCQkqdmFsdWUgPSBtc21fcGlwZS0+Y2hpcF9pZDsKKwkJcmV0dXJuIDA7CisJY2FzZSBGRF9NQVhfRlJFUToKKwkJcmV0dXJuIHF1ZXJ5X3BhcmFtKHBpcGUsIE1TTV9QQVJBTV9NQVhfRlJFUSwgdmFsdWUpOworCWNhc2UgRkRfVElNRVNUQU1QOgorCQlyZXR1cm4gcXVlcnlfcGFyYW0ocGlwZSwgTVNNX1BBUkFNX1RJTUVTVEFNUCwgdmFsdWUpOworCWRlZmF1bHQ6CisJCUVSUk9SX01TRygiaW52YWxpZCBwYXJhbSBpZDogJWQiLCBwYXJhbSk7CisJCXJldHVybiAtMTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BpcGVfd2FpdChzdHJ1Y3QgZmRfcGlwZSAqcGlwZSwgdWludDMyX3QgdGltZXN0YW1wLAorCQl1aW50NjRfdCB0aW1lb3V0KQoreworCXN0cnVjdCBmZF9kZXZpY2UgKmRldiA9IHBpcGUtPmRldjsKKwlzdHJ1Y3QgZHJtX21zbV93YWl0X2ZlbmNlIHJlcSA9IHsKKwkJCS5mZW5jZSA9IHRpbWVzdGFtcCwKKwl9OworCWludCByZXQ7CisKKwlnZXRfYWJzX3RpbWVvdXQoJnJlcS50aW1lb3V0LCB0aW1lb3V0KTsKKworCXJldCA9IGRybUNvbW1hbmRXcml0ZShkZXYtPmZkLCBEUk1fTVNNX1dBSVRfRkVOQ0UsICZyZXEsIHNpemVvZihyZXEpKTsKKwlpZiAocmV0KSB7CisJCUVSUk9SX01TRygid2FpdC1mZW5jZSBmYWlsZWQhICVkICglcykiLCByZXQsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9waXBlX2Rlc3Ryb3koc3RydWN0IGZkX3BpcGUgKnBpcGUpCit7CisJc3RydWN0IG1zbV9waXBlICptc21fcGlwZSA9IHRvX21zbV9waXBlKHBpcGUpOworCWZyZWUobXNtX3BpcGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZkX3BpcGVfZnVuY3MgZnVuY3MgPSB7CisJCS5yaW5nYnVmZmVyX25ldyA9IG1zbV9yaW5nYnVmZmVyX25ldywKKwkJLmdldF9wYXJhbSA9IG1zbV9waXBlX2dldF9wYXJhbSwKKwkJLndhaXQgPSBtc21fcGlwZV93YWl0LAorCQkuZGVzdHJveSA9IG1zbV9waXBlX2Rlc3Ryb3ksCit9OworCitzdGF0aWMgdWludDY0X3QgZ2V0X3BhcmFtKHN0cnVjdCBmZF9waXBlICpwaXBlLCB1aW50MzJfdCBwYXJhbSkKK3sKKwl1aW50NjRfdCB2YWx1ZTsKKwlpbnQgcmV0ID0gcXVlcnlfcGFyYW0ocGlwZSwgcGFyYW0sICZ2YWx1ZSk7CisJaWYgKHJldCkgeworCQlFUlJPUl9NU0coImdldC1wYXJhbSBmYWlsZWQhICVkICglcykiLCByZXQsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gdmFsdWU7Cit9CisKK2RybV9wcml2YXRlIHN0cnVjdCBmZF9waXBlICogbXNtX3BpcGVfbmV3KHN0cnVjdCBmZF9kZXZpY2UgKmRldiwKKwkJZW51bSBmZF9waXBlX2lkIGlkKQoreworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBwaXBlX2lkW10gPSB7CisJCQlbRkRfUElQRV8zRF0gPSBNU01fUElQRV8zRDAsCisJCQlbRkRfUElQRV8yRF0gPSBNU01fUElQRV8yRDAsCisJfTsKKwlzdHJ1Y3QgbXNtX3BpcGUgKm1zbV9waXBlID0gTlVMTDsKKwlzdHJ1Y3QgZmRfcGlwZSAqcGlwZSA9IE5VTEw7CisKKwltc21fcGlwZSA9IGNhbGxvYygxLCBzaXplb2YoKm1zbV9waXBlKSk7CisJaWYgKCFtc21fcGlwZSkgeworCQlFUlJPUl9NU0coImFsbG9jYXRpb24gZmFpbGVkIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwaXBlID0gJm1zbV9waXBlLT5iYXNlOworCXBpcGUtPmZ1bmNzID0gJmZ1bmNzOworCisJLyogaW5pdGlhbGl6ZSBiZWZvcmUgZ2V0X3BhcmFtKCk6ICovCisJcGlwZS0+ZGV2ID0gZGV2OworCW1zbV9waXBlLT5waXBlID0gcGlwZV9pZFtpZF07CisKKwkvKiB0aGVzZSBwYXJhbXMgc2hvdWxkIGJlIHN1cHBvcnRlZCBzaW5jZSB0aGUgZmlyc3QgdmVyc2lvbiBvZiBkcm0vbXNtOiAqLworCW1zbV9waXBlLT5ncHVfaWQgPSBnZXRfcGFyYW0ocGlwZSwgTVNNX1BBUkFNX0dQVV9JRCk7CisJbXNtX3BpcGUtPmdtZW0gICA9IGdldF9wYXJhbShwaXBlLCBNU01fUEFSQU1fR01FTV9TSVpFKTsKKwltc21fcGlwZS0+Y2hpcF9pZCA9IGdldF9wYXJhbShwaXBlLCBNU01fUEFSQU1fQ0hJUF9JRCk7CisKKwlpZiAoISBtc21fcGlwZS0+Z3B1X2lkKQorCQlnb3RvIGZhaWw7CisKKwlJTkZPX01TRygiUGlwZSBJbmZvOiIpOworCUlORk9fTVNHKCIgR1BVLWlkOiAgICAgICAgICAlZCIsIG1zbV9waXBlLT5ncHVfaWQpOworCUlORk9fTVNHKCIgQ2hpcC1pZDogICAgICAgICAweCUwOHgiLCBtc21fcGlwZS0+Y2hpcF9pZCk7CisJSU5GT19NU0coIiBHTUVNIHNpemU6ICAgICAgIDB4JTA4eCIsIG1zbV9waXBlLT5nbWVtKTsKKworCXJldHVybiBwaXBlOworZmFpbDoKKwlpZiAocGlwZSkKKwkJZmRfcGlwZV9kZWwocGlwZSk7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9mcmVlZHJlbm8vbXNtL21zbV9wcml2LmggYi9mcmVlZHJlbm8vbXNtL21zbV9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ2NzBhYQotLS0gL2Rldi9udWxsCisrKyBiL2ZyZWVkcmVuby9tc20vbXNtX3ByaXYuaApAQCAtMCwwICsxLDEwMyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImsmciI7IHRhYi13aWR0aCA0OyBpbmRlbnQtdGFicy1tb2RlOiB0OyAtKi0gKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBSb2IgQ2xhcmsgPHJvYmNsYXJrQGZyZWVkZXNrdG9wLm9yZz4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJvYiBDbGFyayA8cm9iY2xhcmtAZnJlZWRlc2t0b3Aub3JnPgorICovCisKKyNpZm5kZWYgTVNNX1BSSVZfSF8KKyNkZWZpbmUgTVNNX1BSSVZfSF8KKworI2luY2x1ZGUgImZyZWVkcmVub19wcml2LmgiCisKKyNpZm5kZWYgX191c2VyCisjICBkZWZpbmUgX191c2VyCisjZW5kaWYKKworI2luY2x1ZGUgIm1zbV9kcm0uaCIKKworc3RydWN0IG1zbV9kZXZpY2UgeworCXN0cnVjdCBmZF9kZXZpY2UgYmFzZTsKKwlzdHJ1Y3QgZmRfYm9fY2FjaGUgcmluZ19jYWNoZTsKKwl1bnNpZ25lZCByaW5nX2NudDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1zbV9kZXZpY2UgKiB0b19tc21fZGV2aWNlKHN0cnVjdCBmZF9kZXZpY2UgKngpCit7CisJcmV0dXJuIChzdHJ1Y3QgbXNtX2RldmljZSAqKXg7Cit9CisKK2RybV9wcml2YXRlIHN0cnVjdCBmZF9kZXZpY2UgKiBtc21fZGV2aWNlX25ldyhpbnQgZmQpOworCitzdHJ1Y3QgbXNtX3BpcGUgeworCXN0cnVjdCBmZF9waXBlIGJhc2U7CisJdWludDMyX3QgcGlwZTsKKwl1aW50MzJfdCBncHVfaWQ7CisJdWludDMyX3QgZ21lbTsKKwl1aW50MzJfdCBjaGlwX2lkOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbXNtX3BpcGUgKiB0b19tc21fcGlwZShzdHJ1Y3QgZmRfcGlwZSAqeCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBtc21fcGlwZSAqKXg7Cit9CisKK2RybV9wcml2YXRlIHN0cnVjdCBmZF9waXBlICogbXNtX3BpcGVfbmV3KHN0cnVjdCBmZF9kZXZpY2UgKmRldiwKKwkJZW51bSBmZF9waXBlX2lkIGlkKTsKKworZHJtX3ByaXZhdGUgc3RydWN0IGZkX3JpbmdidWZmZXIgKiBtc21fcmluZ2J1ZmZlcl9uZXcoc3RydWN0IGZkX3BpcGUgKnBpcGUsCisJCXVpbnQzMl90IHNpemUpOworCitzdHJ1Y3QgbXNtX2JvIHsKKwlzdHJ1Y3QgZmRfYm8gYmFzZTsKKwl1aW50NjRfdCBvZmZzZXQ7CisJdWludDY0X3QgcHJlc3VtZWQ7CisJLyogdG8gYXZvaWQgZXhjZXNzIGhhc2h0YWJsZSBsb29rdXBzLCBjYWNoZSB0aGUgcmluZyB0aGlzIGJvIHdhcworCSAqIGxhc3QgZW1pdHRlZCBvbiAoc2luY2UgdGhhdCB3aWxsIHByb2JhYmx5IGFsc28gYmUgdGhlIG5leHQgcmluZworCSAqIGl0IGlzIGVtaXR0ZWQgb24pCisJICovCisJdW5zaWduZWQgY3VycmVudF9yaW5nX3NlcW5vOworCXVpbnQzMl90IGlkeDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1zbV9ibyAqIHRvX21zbV9ibyhzdHJ1Y3QgZmRfYm8gKngpCit7CisJcmV0dXJuIChzdHJ1Y3QgbXNtX2JvICopeDsKK30KKworZHJtX3ByaXZhdGUgaW50IG1zbV9ib19uZXdfaGFuZGxlKHN0cnVjdCBmZF9kZXZpY2UgKmRldiwKKwkJdWludDMyX3Qgc2l6ZSwgdWludDMyX3QgZmxhZ3MsIHVpbnQzMl90ICpoYW5kbGUpOworZHJtX3ByaXZhdGUgc3RydWN0IGZkX2JvICogbXNtX2JvX2Zyb21faGFuZGxlKHN0cnVjdCBmZF9kZXZpY2UgKmRldiwKKwkJdWludDMyX3Qgc2l6ZSwgdWludDMyX3QgaGFuZGxlKTsKKworc3RhdGljIGlubGluZSB2b2lkIGdldF9hYnNfdGltZW91dChzdHJ1Y3QgZHJtX21zbV90aW1lc3BlYyAqdHYsIHVpbnQ2NF90IG5zKQoreworCXN0cnVjdCB0aW1lc3BlYyB0OworCXVpbnQzMl90IHMgPSBucyAvIDEwMDAwMDAwMDA7CisJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0KTsKKwl0di0+dHZfc2VjID0gdC50dl9zZWMgKyBzOworCXR2LT50dl9uc2VjID0gdC50dl9uc2VjICsgbnMgLSAocyAqIDEwMDAwMDAwMDApOworfQorCisjZW5kaWYgLyogTVNNX1BSSVZfSF8gKi8KZGlmZiAtLWdpdCBhL2ZyZWVkcmVuby9tc20vbXNtX3JpbmdidWZmZXIuYyBiL2ZyZWVkcmVuby9tc20vbXNtX3JpbmdidWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjI4ZmVhCi0tLSAvZGV2L251bGwKKysrIGIvZnJlZWRyZW5vL21zbS9tc21fcmluZ2J1ZmZlci5jCkBAIC0wLDAgKzEsNjE3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiayZyIjsgdGFiLXdpZHRoIDQ7IGluZGVudC10YWJzLW1vZGU6IHQ7IC0qLSAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJvYiBDbGFyayA8cm9iY2xhcmtAZnJlZWRlc2t0b3Aub3JnPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgUm9iIENsYXJrIDxyb2JjbGFya0BmcmVlZGVza3RvcC5vcmc+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJmcmVlZHJlbm9fcmluZ2J1ZmZlci5oIgorI2luY2x1ZGUgIm1zbV9wcml2LmgiCisKKy8qIHJlcHJlc2VudHMgYSBzaW5nbGUgY21kIGJ1ZmZlciBpbiB0aGUgc3VibWl0IGlvY3RsLiAgRWFjaCBjbWQgYnVmZmVyIGhhcworICogYSBiYWNraW5nIGJvLCBhbmQgYSByZWxvYyB0YWJsZS4KKyAqLworc3RydWN0IG1zbV9jbWQgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCXN0cnVjdCBmZF9yaW5nYnVmZmVyICpyaW5nOworCXN0cnVjdCBmZF9ibyAqcmluZ19ibzsKKworCS8qIHJlbG9jJ3MgdGFibGU6ICovCisJc3RydWN0IGRybV9tc21fZ2VtX3N1Ym1pdF9yZWxvYyAqcmVsb2NzOworCXVpbnQzMl90IG5yX3JlbG9jcywgbWF4X3JlbG9jczsKKworCXVpbnQzMl90IHNpemU7Cit9OworCitzdHJ1Y3QgbXNtX3JpbmdidWZmZXIgeworCXN0cnVjdCBmZF9yaW5nYnVmZmVyIGJhc2U7CisKKwkvKiBzdWJtaXQgaW9jdGwgcmVsYXRlZCB0YWJsZXM6CisJICogTm90ZSB0aGF0IGJvcyBhbmQgY21kcyBhcmUgdHJhY2tlZCBieSB0aGUgcGFyZW50IHJpbmdidWZmZXIsIHNpbmNlCisJICogdGhhdCBpcyBnbG9iYWwgdG8gdGhlIHN1Ym1pdCBpb2N0bCBjYWxsLiAgVGhlIHJlbG9jJ3MgdGFibGUgaXMgdHJhY2tlZAorCSAqIHBlciBjbWQtYnVmZmVyLgorCSAqLworCXN0cnVjdCB7CisJCS8qIGJvJ3MgdGFibGU6ICovCisJCXN0cnVjdCBkcm1fbXNtX2dlbV9zdWJtaXRfYm8gKmJvczsKKwkJdWludDMyX3QgbnJfYm9zLCBtYXhfYm9zOworCisJCS8qIGNtZCdzIHRhYmxlOiAqLworCQlzdHJ1Y3QgZHJtX21zbV9nZW1fc3VibWl0X2NtZCAqY21kczsKKwkJdWludDMyX3QgbnJfY21kcywgbWF4X2NtZHM7CisJfSBzdWJtaXQ7CisKKwkvKiBzaG91bGQgaGF2ZSBtYXRjaGluZyBlbnRyaWVzIGluIHN1Ym1pdC5ib3M6ICovCisJLyogTm90ZSwgb25seSBpbiBwYXJlbnQgcmluZ2J1ZmZlciAqLworCXN0cnVjdCBmZF9ibyAqKmJvczsKKwl1aW50MzJfdCBucl9ib3MsIG1heF9ib3M7CisKKwkvKiBzaG91bGQgaGF2ZSBtYXRjaGluZyBlbnRyaWVzIGluIHN1Ym1pdC5jbWRzOiAqLworCXN0cnVjdCBtc21fY21kICoqY21kczsKKwl1aW50MzJfdCBucl9jbWRzLCBtYXhfY21kczsKKworCS8qIExpc3Qgb2YgcGh5c2ljYWwgY21kc3RyZWFtIGJ1ZmZlcnMgKG1zbV9jbWQpIGFzc29jYXRlZCB3aXRoIHRoaXMKKwkgKiBsb2dpY2FsIGZkX3JpbmdidWZmZXIuCisJICoKKwkgKiBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBtc21fcmluZ2J1ZmZlcjo6Y21kcyAod2hpY2gKKwkgKiBzaGFkb3dzIG1zbV9yaW5nYnVmZmVyOjpzdWJtaXQ6OmNtZHMgZm9yIHRyYWNraW5nIHN1Ym1pdCBpb2N0bAorCSAqIHJlbGF0ZWQgc3R1ZmYsIGFuZCAqb25seSogaXMgdHJhY2tlZCBpbiB0aGUgcGFyZW50IHJpbmdidWZmZXIuCisJICogQW5kIG9ubHkgaGFzICJjb21wbGV0ZWQiIGNtZCBidWZmZXJzIChpZS4gd2UgYWxyZWFkeSBrbm93IHRoZQorCSAqIHNpemUpIGFkZGVkIHZpYSBnZXRfY21kKCkuCisJICovCisJc3RydWN0IGxpc3RfaGVhZCBjbWRfbGlzdDsKKworCWludCBpc19ncm93YWJsZTsKKwl1bnNpZ25lZCBjbWRfY291bnQ7CisKKwl1bnNpZ25lZCBzZXFubzsKKworCS8qIG1hcHMgZmRfYm8gdG8gaWR4OiAqLworCXZvaWQgKmJvX3RhYmxlOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbXNtX3JpbmdidWZmZXIgKiB0b19tc21fcmluZ2J1ZmZlcihzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqeCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBtc21fcmluZ2J1ZmZlciAqKXg7Cit9CisKKyNkZWZpbmUgSU5JVF9TSVpFIDB4MTAwMAorCitzdGF0aWMgcHRocmVhZF9tdXRleF90IGlkeF9sb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKK2RybV9wcml2YXRlIGV4dGVybiBwdGhyZWFkX211dGV4X3QgdGFibGVfbG9jazsKKworc3RhdGljIHZvaWQgcmluZ19ib19kZWwoc3RydWN0IGZkX2RldmljZSAqZGV2LCBzdHJ1Y3QgZmRfYm8gKmJvKQoreworCWludCByZXQ7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJnRhYmxlX2xvY2spOworCXJldCA9IGZkX2JvX2NhY2hlX2ZyZWUoJnRvX21zbV9kZXZpY2UoZGV2KS0+cmluZ19jYWNoZSwgYm8pOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0YWJsZV9sb2NrKTsKKworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuOworCisJZmRfYm9fZGVsKGJvKTsKK30KKworc3RhdGljIHN0cnVjdCBmZF9ibyAqIHJpbmdfYm9fbmV3KHN0cnVjdCBmZF9kZXZpY2UgKmRldiwgdWludDMyX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZmRfYm8gKmJvOworCisJYm8gPSBmZF9ib19jYWNoZV9hbGxvYygmdG9fbXNtX2RldmljZShkZXYpLT5yaW5nX2NhY2hlLCAmc2l6ZSwgMCk7CisJaWYgKGJvKQorCQlyZXR1cm4gYm87CisKKwlibyA9IGZkX2JvX25ldyhkZXYsIHNpemUsIDApOworCWlmICghYm8pCisJCXJldHVybiBOVUxMOworCisJLyoga2VlcCByaW5nYnVmZmVyIGJvJ3Mgb3V0IG9mIHRoZSBub3JtYWwgYm8gY2FjaGU6ICovCisJYm8tPmJvX3JldXNlID0gRkFMU0U7CisKKwlyZXR1cm4gYm87Cit9CisKK3N0YXRpYyB2b2lkIHJpbmdfY21kX2RlbChzdHJ1Y3QgbXNtX2NtZCAqY21kKQoreworCWlmIChjbWQtPnJpbmdfYm8pCisJCXJpbmdfYm9fZGVsKGNtZC0+cmluZy0+cGlwZS0+ZGV2LCBjbWQtPnJpbmdfYm8pOworCWxpc3RfZGVsKCZjbWQtPmxpc3QpOworCXRvX21zbV9yaW5nYnVmZmVyKGNtZC0+cmluZyktPmNtZF9jb3VudC0tOworCWZyZWUoY21kLT5yZWxvY3MpOworCWZyZWUoY21kKTsKK30KKworc3RhdGljIHN0cnVjdCBtc21fY21kICogcmluZ19jbWRfbmV3KHN0cnVjdCBmZF9yaW5nYnVmZmVyICpyaW5nLCB1aW50MzJfdCBzaXplKQoreworCXN0cnVjdCBtc21fcmluZ2J1ZmZlciAqbXNtX3JpbmcgPSB0b19tc21fcmluZ2J1ZmZlcihyaW5nKTsKKwlzdHJ1Y3QgbXNtX2NtZCAqY21kID0gY2FsbG9jKDEsIHNpemVvZigqY21kKSk7CisKKwlpZiAoIWNtZCkKKwkJcmV0dXJuIE5VTEw7CisKKwljbWQtPnJpbmcgPSByaW5nOworCWNtZC0+cmluZ19ibyA9IHJpbmdfYm9fbmV3KHJpbmctPnBpcGUtPmRldiwgc2l6ZSk7CisJaWYgKCFjbWQtPnJpbmdfYm8pCisJCWdvdG8gZmFpbDsKKworCWxpc3RfYWRkdGFpbCgmY21kLT5saXN0LCAmbXNtX3JpbmctPmNtZF9saXN0KTsKKwltc21fcmluZy0+Y21kX2NvdW50Kys7CisKKwlyZXR1cm4gY21kOworCitmYWlsOgorCXJpbmdfY21kX2RlbChjbWQpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqZ3Jvdyh2b2lkICpwdHIsIHVpbnQzMl90IG5yLCB1aW50MzJfdCAqbWF4LCB1aW50MzJfdCBzeikKK3sKKwlpZiAoKG5yICsgMSkgPiAqbWF4KSB7CisJCWlmICgoKm1heCAqIDIpIDwgKG5yICsgMSkpCisJCQkqbWF4ID0gbnIgKyA1OworCQllbHNlCisJCQkqbWF4ID0gKm1heCAqIDI7CisJCXB0ciA9IHJlYWxsb2MocHRyLCAqbWF4ICogc3opOworCX0KKwlyZXR1cm4gcHRyOworfQorCisjZGVmaW5lIEFQUEVORCh4LCBuYW1lKSAoeyBcCisJKHgpLT5uYW1lID0gZ3JvdygoeCktPm5hbWUsICh4KS0+bnJfICMjIG5hbWUsICYoeCktPm1heF8gIyMgbmFtZSwgc2l6ZW9mKCh4KS0+bmFtZVswXSkpOyBcCisJKHgpLT5ucl8gIyMgbmFtZSArKzsgXAorfSkKKworc3RhdGljIHN0cnVjdCBtc21fY21kICpjdXJyZW50X2NtZChzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZykKK3sKKwlzdHJ1Y3QgbXNtX3JpbmdidWZmZXIgKm1zbV9yaW5nID0gdG9fbXNtX3JpbmdidWZmZXIocmluZyk7CisJYXNzZXJ0KCFMSVNUX0lTX0VNUFRZKCZtc21fcmluZy0+Y21kX2xpc3QpKTsKKwlyZXR1cm4gTElTVF9MQVNUX0VOVFJZKCZtc21fcmluZy0+Y21kX2xpc3QsIHN0cnVjdCBtc21fY21kLCBsaXN0KTsKK30KKworc3RhdGljIHVpbnQzMl90IGFwcGVuZF9ibyhzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZywgc3RydWN0IGZkX2JvICpibykKK3sKKwlzdHJ1Y3QgbXNtX3JpbmdidWZmZXIgKm1zbV9yaW5nID0gdG9fbXNtX3JpbmdidWZmZXIocmluZyk7CisJdWludDMyX3QgaWR4OworCisJaWR4ID0gQVBQRU5EKCZtc21fcmluZy0+c3VibWl0LCBib3MpOworCWlkeCA9IEFQUEVORChtc21fcmluZywgYm9zKTsKKworCW1zbV9yaW5nLT5zdWJtaXQuYm9zW2lkeF0uZmxhZ3MgPSAwOworCW1zbV9yaW5nLT5zdWJtaXQuYm9zW2lkeF0uaGFuZGxlID0gYm8tPmhhbmRsZTsKKwltc21fcmluZy0+c3VibWl0LmJvc1tpZHhdLnByZXN1bWVkID0gdG9fbXNtX2JvKGJvKS0+cHJlc3VtZWQ7CisKKwltc21fcmluZy0+Ym9zW2lkeF0gPSBmZF9ib19yZWYoYm8pOworCisJcmV0dXJuIGlkeDsKK30KKworLyogYWRkIChpZiBuZWVkZWQpIGJvLCByZXR1cm4gaWR4OiAqLworc3RhdGljIHVpbnQzMl90IGJvMmlkeChzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZywgc3RydWN0IGZkX2JvICpibywgdWludDMyX3QgZmxhZ3MpCit7CisJc3RydWN0IG1zbV9yaW5nYnVmZmVyICptc21fcmluZyA9IHRvX21zbV9yaW5nYnVmZmVyKHJpbmcpOworCXN0cnVjdCBtc21fYm8gKm1zbV9ibyA9IHRvX21zbV9ibyhibyk7CisJdWludDMyX3QgaWR4OworCXB0aHJlYWRfbXV0ZXhfbG9jaygmaWR4X2xvY2spOworCWlmIChtc21fYm8tPmN1cnJlbnRfcmluZ19zZXFubyA9PSBtc21fcmluZy0+c2Vxbm8pIHsKKwkJaWR4ID0gbXNtX2JvLT5pZHg7CisJfSBlbHNlIHsKKwkJdm9pZCAqdmFsOworCisJCWlmICghbXNtX3JpbmctPmJvX3RhYmxlKQorCQkJbXNtX3JpbmctPmJvX3RhYmxlID0gZHJtSGFzaENyZWF0ZSgpOworCisJCWlmICghZHJtSGFzaExvb2t1cChtc21fcmluZy0+Ym9fdGFibGUsIGJvLT5oYW5kbGUsICZ2YWwpKSB7CisJCQkvKiBmb3VuZCAqLworCQkJaWR4ID0gKHVpbnQzMl90KSh1aW50cHRyX3QpdmFsOworCQl9IGVsc2UgeworCQkJaWR4ID0gYXBwZW5kX2JvKHJpbmcsIGJvKTsKKwkJCXZhbCA9ICh2b2lkICopKHVpbnRwdHJfdClpZHg7CisJCQlkcm1IYXNoSW5zZXJ0KG1zbV9yaW5nLT5ib190YWJsZSwgYm8tPmhhbmRsZSwgdmFsKTsKKwkJfQorCQltc21fYm8tPmN1cnJlbnRfcmluZ19zZXFubyA9IG1zbV9yaW5nLT5zZXFubzsKKwkJbXNtX2JvLT5pZHggPSBpZHg7CisJfQorCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZpZHhfbG9jayk7CisJaWYgKGZsYWdzICYgRkRfUkVMT0NfUkVBRCkKKwkJbXNtX3JpbmctPnN1Ym1pdC5ib3NbaWR4XS5mbGFncyB8PSBNU01fU1VCTUlUX0JPX1JFQUQ7CisJaWYgKGZsYWdzICYgRkRfUkVMT0NfV1JJVEUpCisJCW1zbV9yaW5nLT5zdWJtaXQuYm9zW2lkeF0uZmxhZ3MgfD0gTVNNX1NVQk1JVF9CT19XUklURTsKKwlyZXR1cm4gaWR4OworfQorCitzdGF0aWMgaW50IGNoZWNrX2NtZF9ibyhzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZywKKwkJc3RydWN0IGRybV9tc21fZ2VtX3N1Ym1pdF9jbWQgKmNtZCwgc3RydWN0IGZkX2JvICpibykKK3sKKwlzdHJ1Y3QgbXNtX3JpbmdidWZmZXIgKm1zbV9yaW5nID0gdG9fbXNtX3JpbmdidWZmZXIocmluZyk7CisJcmV0dXJuIG1zbV9yaW5nLT5zdWJtaXQuYm9zW2NtZC0+c3VibWl0X2lkeF0uaGFuZGxlID09IGJvLT5oYW5kbGU7Cit9CisKKy8qIEVuc3VyZSB0aGF0IHN1Ym1pdCBoYXMgY29ycmVzcG9uZGluZyBlbnRyeSBpbiBjbWRzIHRhYmxlIGZvciB0aGUKKyAqIHRhcmdldCBjbWRzdHJlYW0gYnVmZmVyOgorICovCitzdGF0aWMgdm9pZCBnZXRfY21kKHN0cnVjdCBmZF9yaW5nYnVmZmVyICpyaW5nLCBzdHJ1Y3QgbXNtX2NtZCAqdGFyZ2V0X2NtZCwKKwkJdWludDMyX3Qgc3VibWl0X29mZnNldCwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3QgdHlwZSkKK3sKKwlzdHJ1Y3QgbXNtX3JpbmdidWZmZXIgKm1zbV9yaW5nID0gdG9fbXNtX3JpbmdidWZmZXIocmluZyk7CisJc3RydWN0IGRybV9tc21fZ2VtX3N1Ym1pdF9jbWQgKmNtZDsKKwl1aW50MzJfdCBpOworCisJLyogZmlndXJlIG91dCBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBjbWQgYnVmOiAqLworCWZvciAoaSA9IDA7IGkgPCBtc21fcmluZy0+c3VibWl0Lm5yX2NtZHM7IGkrKykgeworCQljbWQgPSAmbXNtX3JpbmctPnN1Ym1pdC5jbWRzW2ldOworCQlpZiAoKGNtZC0+c3VibWl0X29mZnNldCA9PSBzdWJtaXRfb2Zmc2V0KSAmJgorCQkJCShjbWQtPnNpemUgPT0gc2l6ZSkgJiYKKwkJCQkoY21kLT50eXBlID09IHR5cGUpICYmCisJCQkJY2hlY2tfY21kX2JvKHJpbmcsIGNtZCwgdGFyZ2V0X2NtZC0+cmluZ19ibykpCisJCQlyZXR1cm47CisJfQorCisJLyogY3JlYXRlIGNtZCBidWYgaWYgbm90OiAqLworCWkgPSBBUFBFTkQoJm1zbV9yaW5nLT5zdWJtaXQsIGNtZHMpOworCUFQUEVORChtc21fcmluZywgY21kcyk7CisJbXNtX3JpbmctPmNtZHNbaV0gPSB0YXJnZXRfY21kOworCWNtZCA9ICZtc21fcmluZy0+c3VibWl0LmNtZHNbaV07CisJY21kLT50eXBlID0gdHlwZTsKKwljbWQtPnN1Ym1pdF9pZHggPSBibzJpZHgocmluZywgdGFyZ2V0X2NtZC0+cmluZ19ibywgRkRfUkVMT0NfUkVBRCk7CisJY21kLT5zdWJtaXRfb2Zmc2V0ID0gc3VibWl0X29mZnNldDsKKwljbWQtPnNpemUgPSBzaXplOworCWNtZC0+cGFkID0gMDsKKworCXRhcmdldF9jbWQtPnNpemUgPSBzaXplOworfQorCitzdGF0aWMgdm9pZCAqIG1zbV9yaW5nYnVmZmVyX2hvc3RwdHIoc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIGZkX2JvX21hcChjdXJyZW50X2NtZChyaW5nKS0+cmluZ19ibyk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBmaW5kX25leHRfcmVsb2NfaWR4KHN0cnVjdCBtc21fY21kICptc21fY21kLAorCQl1aW50MzJfdCBzdGFydCwgdWludDMyX3Qgb2Zmc2V0KQoreworCXVpbnQzMl90IGk7CisKKwkvKiBhIGJpbmFyeSBzZWFyY2ggd291bGQgYmUgbW9yZSBjbGV2ZXIuLiAqLworCWZvciAoaSA9IHN0YXJ0OyBpIDwgbXNtX2NtZC0+bnJfcmVsb2NzOyBpKyspIHsKKwkJc3RydWN0IGRybV9tc21fZ2VtX3N1Ym1pdF9yZWxvYyAqcmVsb2MgPSAmbXNtX2NtZC0+cmVsb2NzW2ldOworCQlpZiAocmVsb2MtPnN1Ym1pdF9vZmZzZXQgPj0gb2Zmc2V0KQorCQkJcmV0dXJuIGk7CisJfQorCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIGRlbGV0ZV9jbWRzKHN0cnVjdCBtc21fcmluZ2J1ZmZlciAqbXNtX3JpbmcpCit7CisJc3RydWN0IG1zbV9jbWQgKmNtZCwgKnRtcDsKKworCUxJU1RfRk9SX0VBQ0hfRU5UUllfU0FGRShjbWQsIHRtcCwgJm1zbV9yaW5nLT5jbWRfbGlzdCwgbGlzdCkgeworCQlyaW5nX2NtZF9kZWwoY21kKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoX3Jlc2V0KHN0cnVjdCBmZF9yaW5nYnVmZmVyICpyaW5nKQoreworCXN0cnVjdCBtc21fcmluZ2J1ZmZlciAqbXNtX3JpbmcgPSB0b19tc21fcmluZ2J1ZmZlcihyaW5nKTsKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IG1zbV9yaW5nLT5ucl9ib3M7IGkrKykgeworCQlzdHJ1Y3QgbXNtX2JvICptc21fYm8gPSB0b19tc21fYm8obXNtX3JpbmctPmJvc1tpXSk7CisJCW1zbV9iby0+Y3VycmVudF9yaW5nX3NlcW5vID0gMDsKKwkJZmRfYm9fZGVsKCZtc21fYm8tPmJhc2UpOworCX0KKworCS8qIGZvciBlYWNoIG9mIHRoZSBjbWQgYnVmZmVycywgY2xlYXIgdGhlaXIgcmVsb2MnczogKi8KKwlmb3IgKGkgPSAwOyBpIDwgbXNtX3JpbmctPnN1Ym1pdC5ucl9jbWRzOyBpKyspIHsKKwkJc3RydWN0IG1zbV9jbWQgKnRhcmdldF9jbWQgPSBtc21fcmluZy0+Y21kc1tpXTsKKwkJdGFyZ2V0X2NtZC0+bnJfcmVsb2NzID0gMDsKKwl9CisKKwltc21fcmluZy0+c3VibWl0Lm5yX2NtZHMgPSAwOworCW1zbV9yaW5nLT5zdWJtaXQubnJfYm9zID0gMDsKKwltc21fcmluZy0+bnJfY21kcyA9IDA7CisJbXNtX3JpbmctPm5yX2JvcyA9IDA7CisKKwlpZiAobXNtX3JpbmctPmJvX3RhYmxlKSB7CisJCWRybUhhc2hEZXN0cm95KG1zbV9yaW5nLT5ib190YWJsZSk7CisJCW1zbV9yaW5nLT5ib190YWJsZSA9IE5VTEw7CisJfQorCisJaWYgKG1zbV9yaW5nLT5pc19ncm93YWJsZSkgeworCQlkZWxldGVfY21kcyhtc21fcmluZyk7CisJfSBlbHNlIHsKKwkJLyogaW4gb2xkIG1vZGUsIGp1c3QgcmVzZXQgdGhlICMgb2YgcmVsb2NzOiAqLworCQljdXJyZW50X2NtZChyaW5nKS0+bnJfcmVsb2NzID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZpbmFsaXplX2N1cnJlbnRfY21kKHN0cnVjdCBmZF9yaW5nYnVmZmVyICpyaW5nLCB1aW50MzJfdCAqbGFzdF9zdGFydCkKK3sKKwl1aW50MzJfdCBzdWJtaXRfb2Zmc2V0LCBzaXplLCB0eXBlOworCXN0cnVjdCBmZF9yaW5nYnVmZmVyICpwYXJlbnQ7CisKKwlpZiAocmluZy0+cGFyZW50KSB7CisJCXBhcmVudCA9IHJpbmctPnBhcmVudDsKKwkJdHlwZSA9IE1TTV9TVUJNSVRfQ01EX0lCX1RBUkdFVF9CVUY7CisJfSBlbHNlIHsKKwkJcGFyZW50ID0gcmluZzsKKwkJdHlwZSA9IE1TTV9TVUJNSVRfQ01EX0JVRjsKKwl9CisKKwlzdWJtaXRfb2Zmc2V0ID0gb2Zmc2V0X2J5dGVzKGxhc3Rfc3RhcnQsIHJpbmctPnN0YXJ0KTsKKwlzaXplID0gb2Zmc2V0X2J5dGVzKHJpbmctPmN1ciwgbGFzdF9zdGFydCk7CisKKwlnZXRfY21kKHBhcmVudCwgY3VycmVudF9jbWQocmluZyksIHN1Ym1pdF9vZmZzZXQsIHNpemUsIHR5cGUpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3N1Ym1pdChzdHJ1Y3QgbXNtX3JpbmdidWZmZXIgKm1zbV9yaW5nKQoreworCXVpbnQzMl90IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNtX3JpbmctPnN1Ym1pdC5ucl9ib3M7IGkrKykgeworCQlzdHJ1Y3QgZHJtX21zbV9nZW1fc3VibWl0X2JvICpibyA9ICZtc21fcmluZy0+c3VibWl0LmJvc1tpXTsKKwkJRVJST1JfTVNHKCIgIGJvc1slZF06IGhhbmRsZT0ldSwgZmxhZ3M9JXgiLCBpLCBiby0+aGFuZGxlLCBiby0+ZmxhZ3MpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbXNtX3JpbmctPnN1Ym1pdC5ucl9jbWRzOyBpKyspIHsKKwkJc3RydWN0IGRybV9tc21fZ2VtX3N1Ym1pdF9jbWQgKmNtZCA9ICZtc21fcmluZy0+c3VibWl0LmNtZHNbaV07CisJCXN0cnVjdCBkcm1fbXNtX2dlbV9zdWJtaXRfcmVsb2MgKnJlbG9jcyA9IFU2NDJWT0lEKGNtZC0+cmVsb2NzKTsKKwkJRVJST1JfTVNHKCIgIGNtZFslZF06IHR5cGU9JXUsIHN1Ym1pdF9pZHg9JXUsIHN1Ym1pdF9vZmZzZXQ9JXUsIHNpemU9JXUiLAorCQkJCWksIGNtZC0+dHlwZSwgY21kLT5zdWJtaXRfaWR4LCBjbWQtPnN1Ym1pdF9vZmZzZXQsIGNtZC0+c2l6ZSk7CisJCWZvciAoaiA9IDA7IGogPCBjbWQtPm5yX3JlbG9jczsgaisrKSB7CisJCQlzdHJ1Y3QgZHJtX21zbV9nZW1fc3VibWl0X3JlbG9jICpyID0gJnJlbG9jc1tqXTsKKwkJCUVSUk9SX01TRygiICAgIHJlbG9jWyVkXTogc3VibWl0X29mZnNldD0ldSwgb3I9JTA4eCwgc2hpZnQ9JWQsIHJlbG9jX2lkeD0ldSIKKwkJCQkJIiwgcmVsb2Nfb2Zmc2V0PSUiUFJJdTY0LCBqLCByLT5zdWJtaXRfb2Zmc2V0LCByLT5vciwgci0+c2hpZnQsCisJCQkJCXItPnJlbG9jX2lkeCwgci0+cmVsb2Nfb2Zmc2V0KTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBtc21fcmluZ2J1ZmZlcl9mbHVzaChzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZywgdWludDMyX3QgKmxhc3Rfc3RhcnQsCisJCWludCBpbl9mZW5jZV9mZCwgaW50ICpvdXRfZmVuY2VfZmQpCit7CisJc3RydWN0IG1zbV9yaW5nYnVmZmVyICptc21fcmluZyA9IHRvX21zbV9yaW5nYnVmZmVyKHJpbmcpOworCXN0cnVjdCBkcm1fbXNtX2dlbV9zdWJtaXQgcmVxID0geworCQkJLmZsYWdzID0gdG9fbXNtX3BpcGUocmluZy0+cGlwZSktPnBpcGUsCisJfTsKKwl1aW50MzJfdCBpOworCWludCByZXQ7CisKKwlpZiAoaW5fZmVuY2VfZmQgIT0gLTEpIHsKKwkJcmVxLmZsYWdzIHw9IE1TTV9TVUJNSVRfRkVOQ0VfRkRfSU4gfCBNU01fU1VCTUlUX05PX0lNUExJQ0lUOworCQlyZXEuZmVuY2VfZmQgPSBpbl9mZW5jZV9mZDsKKwl9CisKKwlpZiAob3V0X2ZlbmNlX2ZkKSB7CisJCXJlcS5mbGFncyB8PSBNU01fU1VCTUlUX0ZFTkNFX0ZEX09VVDsKKwl9CisKKwlmaW5hbGl6ZV9jdXJyZW50X2NtZChyaW5nLCBsYXN0X3N0YXJ0KTsKKworCS8qIG5lZWRzIHRvIGJlIGFmdGVyIGdldF9jbWQoKSBhcyB0aGF0IGNvdWxkIGNyZWF0ZSBib3MvY21kcyB0YWJsZTogKi8KKwlyZXEuYm9zID0gVk9JRDJVNjQobXNtX3JpbmctPnN1Ym1pdC5ib3MpLAorCXJlcS5ucl9ib3MgPSBtc21fcmluZy0+c3VibWl0Lm5yX2JvczsKKwlyZXEuY21kcyA9IFZPSUQyVTY0KG1zbV9yaW5nLT5zdWJtaXQuY21kcyksCisJcmVxLm5yX2NtZHMgPSBtc21fcmluZy0+c3VibWl0Lm5yX2NtZHM7CisKKwkvKiBmb3IgZWFjaCBvZiB0aGUgY21kJ3MgZml4IHVwIHRoZWlyIHJlbG9jJ3M6ICovCisJZm9yIChpID0gMDsgaSA8IG1zbV9yaW5nLT5zdWJtaXQubnJfY21kczsgaSsrKSB7CisJCXN0cnVjdCBkcm1fbXNtX2dlbV9zdWJtaXRfY21kICpjbWQgPSAmbXNtX3JpbmctPnN1Ym1pdC5jbWRzW2ldOworCQlzdHJ1Y3QgbXNtX2NtZCAqbXNtX2NtZCA9IG1zbV9yaW5nLT5jbWRzW2ldOworCQl1aW50MzJfdCBhID0gZmluZF9uZXh0X3JlbG9jX2lkeChtc21fY21kLCAwLCBjbWQtPnN1Ym1pdF9vZmZzZXQpOworCQl1aW50MzJfdCBiID0gZmluZF9uZXh0X3JlbG9jX2lkeChtc21fY21kLCBhLCBjbWQtPnN1Ym1pdF9vZmZzZXQgKyBjbWQtPnNpemUpOworCQljbWQtPnJlbG9jcyA9IFZPSUQyVTY0KCZtc21fY21kLT5yZWxvY3NbYV0pOworCQljbWQtPm5yX3JlbG9jcyA9IChiID4gYSkgPyBiIC0gYSA6IDA7CisJfQorCisJREVCVUdfTVNHKCJucl9jbWRzPSV1LCBucl9ib3M9JXUiLCByZXEubnJfY21kcywgcmVxLm5yX2Jvcyk7CisKKwlyZXQgPSBkcm1Db21tYW5kV3JpdGVSZWFkKHJpbmctPnBpcGUtPmRldi0+ZmQsIERSTV9NU01fR0VNX1NVQk1JVCwKKwkJCSZyZXEsIHNpemVvZihyZXEpKTsKKwlpZiAocmV0KSB7CisJCUVSUk9SX01TRygic3VibWl0IGZhaWxlZDogJWQgKCVzKSIsIHJldCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZHVtcF9zdWJtaXQobXNtX3JpbmcpOworCX0gZWxzZSBpZiAoIXJldCkgeworCQkvKiB1cGRhdGUgdGltZXN0YW1wIG9uIGFsbCByaW5ncyBhc3NvY2lhdGVkIHdpdGggc3VibWl0OiAqLworCQlmb3IgKGkgPSAwOyBpIDwgbXNtX3JpbmctPnN1Ym1pdC5ucl9jbWRzOyBpKyspIHsKKwkJCXN0cnVjdCBtc21fY21kICptc21fY21kID0gbXNtX3JpbmctPmNtZHNbaV07CisJCQltc21fY21kLT5yaW5nLT5sYXN0X3RpbWVzdGFtcCA9IHJlcS5mZW5jZTsKKwkJfQorCisJCWlmIChvdXRfZmVuY2VfZmQpIHsKKwkJCSpvdXRfZmVuY2VfZmQgPSByZXEuZmVuY2VfZmQ7CisJCX0KKwl9CisKKwlmbHVzaF9yZXNldChyaW5nKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9yaW5nYnVmZmVyX2dyb3coc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcsIHVpbnQzMl90IHNpemUpCit7CisJYXNzZXJ0KHRvX21zbV9yaW5nYnVmZmVyKHJpbmcpLT5pc19ncm93YWJsZSk7CisJZmluYWxpemVfY3VycmVudF9jbWQocmluZywgcmluZy0+bGFzdF9zdGFydCk7CisJcmluZ19jbWRfbmV3KHJpbmcsIHNpemUpOworfQorCitzdGF0aWMgdm9pZCBtc21fcmluZ2J1ZmZlcl9yZXNldChzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZykKK3sKKwlmbHVzaF9yZXNldChyaW5nKTsKK30KKworc3RhdGljIHZvaWQgbXNtX3JpbmdidWZmZXJfZW1pdF9yZWxvYyhzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZywKKwkJY29uc3Qgc3RydWN0IGZkX3JlbG9jICpyKQoreworCXN0cnVjdCBmZF9yaW5nYnVmZmVyICpwYXJlbnQgPSByaW5nLT5wYXJlbnQgPyByaW5nLT5wYXJlbnQgOiByaW5nOworCXN0cnVjdCBtc21fYm8gKm1zbV9ibyA9IHRvX21zbV9ibyhyLT5ibyk7CisJc3RydWN0IGRybV9tc21fZ2VtX3N1Ym1pdF9yZWxvYyAqcmVsb2M7CisJc3RydWN0IG1zbV9jbWQgKmNtZCA9IGN1cnJlbnRfY21kKHJpbmcpOworCXVpbnQzMl90IGlkeCA9IEFQUEVORChjbWQsIHJlbG9jcyk7CisJdWludDMyX3QgYWRkcjsKKworCXJlbG9jID0gJmNtZC0+cmVsb2NzW2lkeF07CisKKwlyZWxvYy0+cmVsb2NfaWR4ID0gYm8yaWR4KHBhcmVudCwgci0+Ym8sIHItPmZsYWdzKTsKKwlyZWxvYy0+cmVsb2Nfb2Zmc2V0ID0gci0+b2Zmc2V0OworCXJlbG9jLT5vciA9IHItPm9yOworCXJlbG9jLT5zaGlmdCA9IHItPnNoaWZ0OworCXJlbG9jLT5zdWJtaXRfb2Zmc2V0ID0gb2Zmc2V0X2J5dGVzKHJpbmctPmN1ciwgcmluZy0+c3RhcnQpOworCisJYWRkciA9IG1zbV9iby0+cHJlc3VtZWQ7CisJaWYgKHJlbG9jLT5zaGlmdCA8IDApCisJCWFkZHIgPj49IC1yZWxvYy0+c2hpZnQ7CisJZWxzZQorCQlhZGRyIDw8PSByZWxvYy0+c2hpZnQ7CisJKCpyaW5nLT5jdXIrKykgPSBhZGRyIHwgci0+b3I7CisKKwlpZiAocmluZy0+cGlwZS0+Z3B1X2lkID49IDUwMCkgeworCQlzdHJ1Y3QgZHJtX21zbV9nZW1fc3VibWl0X3JlbG9jICpyZWxvY19oaTsKKworCQkvKiBOT1RFOiBncmFiIHJlbG9jX2lkeCAqYmVmb3JlKiBBUFBFTkQoKSBzaW5jZSB0aGF0IGNvdWxkCisJCSAqIHJlYWxsb2MoKSBtZWFuaW5nIHRoYXQgJ3JlbG9jJyBwdHIgaXMgbm8gbG9uZ2VyIHZhbGlkOgorCQkgKi8KKwkJdWludDMyX3QgcmVsb2NfaWR4ID0gcmVsb2MtPnJlbG9jX2lkeDsKKworCQlpZHggPSBBUFBFTkQoY21kLCByZWxvY3MpOworCisJCXJlbG9jX2hpID0gJmNtZC0+cmVsb2NzW2lkeF07CisKKwkJcmVsb2NfaGktPnJlbG9jX2lkeCA9IHJlbG9jX2lkeDsKKwkJcmVsb2NfaGktPnJlbG9jX29mZnNldCA9IHItPm9mZnNldDsKKwkJcmVsb2NfaGktPm9yID0gci0+b3JoaTsKKwkJcmVsb2NfaGktPnNoaWZ0ID0gci0+c2hpZnQgLSAzMjsKKwkJcmVsb2NfaGktPnN1Ym1pdF9vZmZzZXQgPSBvZmZzZXRfYnl0ZXMocmluZy0+Y3VyLCByaW5nLT5zdGFydCk7CisKKwkJYWRkciA9IG1zbV9iby0+cHJlc3VtZWQgPj4gMzI7CisJCWlmIChyZWxvY19oaS0+c2hpZnQgPCAwKQorCQkJYWRkciA+Pj0gLXJlbG9jX2hpLT5zaGlmdDsKKwkJZWxzZQorCQkJYWRkciA8PD0gcmVsb2NfaGktPnNoaWZ0OworCQkoKnJpbmctPmN1cisrKSA9IGFkZHIgfCByLT5vcmhpOworCX0KK30KKworc3RhdGljIHVpbnQzMl90IG1zbV9yaW5nYnVmZmVyX2VtaXRfcmVsb2NfcmluZyhzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqcmluZywKKwkJc3RydWN0IGZkX3JpbmdidWZmZXIgKnRhcmdldCwgdWludDMyX3QgY21kX2lkeCwKKwkJdWludDMyX3Qgc3VibWl0X29mZnNldCwgdWludDMyX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgbXNtX2NtZCAqY21kID0gTlVMTDsKKwl1aW50MzJfdCBpZHggPSAwOworCisJTElTVF9GT1JfRUFDSF9FTlRSWShjbWQsICZ0b19tc21fcmluZ2J1ZmZlcih0YXJnZXQpLT5jbWRfbGlzdCwgbGlzdCkgeworCQlpZiAoaWR4ID09IGNtZF9pZHgpCisJCQlicmVhazsKKwkJaWR4Kys7CisJfQorCisJYXNzZXJ0KGNtZCAmJiAoaWR4ID09IGNtZF9pZHgpKTsKKworCWlmIChpZHggPCAodG9fbXNtX3JpbmdidWZmZXIodGFyZ2V0KS0+Y21kX2NvdW50IC0gMSkpIHsKKwkJLyogQWxsIGJ1dCB0aGUgbGFzdCBjbWQgYnVmZmVyIGlzIGZ1bGx5ICJiYWtlZCIgKGllLiBhbHJlYWR5IGhhcworCQkgKiBkb25lIGdldF9jbWQoKSB0byBhZGQgaXQgdG8gdGhlIGNtZHMgdGFibGUpLiAgQnV0IGluIHRoaXMgY2FzZSwKKwkJICogdGhlIHNpemUgd2UgZ2V0IGlzIGludmFsaWQgKHNpbmNlIGl0IGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGUKKwkJICogbGFzdCBjbWQgYnVmZmVyKToKKwkJICovCisJCXNpemUgPSBjbWQtPnNpemU7CisJfSBlbHNlIHsKKwkJZ2V0X2NtZChyaW5nLCBjbWQsIHN1Ym1pdF9vZmZzZXQsIHNpemUsIE1TTV9TVUJNSVRfQ01EX0lCX1RBUkdFVF9CVUYpOworCX0KKworCW1zbV9yaW5nYnVmZmVyX2VtaXRfcmVsb2MocmluZywgJihzdHJ1Y3QgZmRfcmVsb2MpeworCQkuYm8gPSBjbWQtPnJpbmdfYm8sCisJCS5mbGFncyA9IEZEX1JFTE9DX1JFQUQsCisJCS5vZmZzZXQgPSBzdWJtaXRfb2Zmc2V0LAorCX0pOworCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBtc21fcmluZ2J1ZmZlcl9jbWRfY291bnQoc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIHRvX21zbV9yaW5nYnVmZmVyKHJpbmcpLT5jbWRfY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9yaW5nYnVmZmVyX2Rlc3Ryb3koc3RydWN0IGZkX3JpbmdidWZmZXIgKnJpbmcpCit7CisJc3RydWN0IG1zbV9yaW5nYnVmZmVyICptc21fcmluZyA9IHRvX21zbV9yaW5nYnVmZmVyKHJpbmcpOworCisJZmx1c2hfcmVzZXQocmluZyk7CisJZGVsZXRlX2NtZHMobXNtX3JpbmcpOworCisJZnJlZShtc21fcmluZy0+c3VibWl0LmNtZHMpOworCWZyZWUobXNtX3JpbmctPnN1Ym1pdC5ib3MpOworCWZyZWUobXNtX3JpbmctPmJvcyk7CisJZnJlZShtc21fcmluZy0+Y21kcyk7CisJZnJlZShtc21fcmluZyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmRfcmluZ2J1ZmZlcl9mdW5jcyBmdW5jcyA9IHsKKwkJLmhvc3RwdHIgPSBtc21fcmluZ2J1ZmZlcl9ob3N0cHRyLAorCQkuZmx1c2ggPSBtc21fcmluZ2J1ZmZlcl9mbHVzaCwKKwkJLmdyb3cgPSBtc21fcmluZ2J1ZmZlcl9ncm93LAorCQkucmVzZXQgPSBtc21fcmluZ2J1ZmZlcl9yZXNldCwKKwkJLmVtaXRfcmVsb2MgPSBtc21fcmluZ2J1ZmZlcl9lbWl0X3JlbG9jLAorCQkuZW1pdF9yZWxvY19yaW5nID0gbXNtX3JpbmdidWZmZXJfZW1pdF9yZWxvY19yaW5nLAorCQkuY21kX2NvdW50ID0gbXNtX3JpbmdidWZmZXJfY21kX2NvdW50LAorCQkuZGVzdHJveSA9IG1zbV9yaW5nYnVmZmVyX2Rlc3Ryb3ksCit9OworCitkcm1fcHJpdmF0ZSBzdHJ1Y3QgZmRfcmluZ2J1ZmZlciAqIG1zbV9yaW5nYnVmZmVyX25ldyhzdHJ1Y3QgZmRfcGlwZSAqcGlwZSwKKwkJdWludDMyX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgbXNtX3JpbmdidWZmZXIgKm1zbV9yaW5nOworCXN0cnVjdCBmZF9yaW5nYnVmZmVyICpyaW5nOworCisJbXNtX3JpbmcgPSBjYWxsb2MoMSwgc2l6ZW9mKCptc21fcmluZykpOworCWlmICghbXNtX3JpbmcpIHsKKwkJRVJST1JfTVNHKCJhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoc2l6ZSA9PSAwKSB7CisJCWFzc2VydChwaXBlLT5kZXYtPnZlcnNpb24gPj0gRkRfVkVSU0lPTl9VTkxJTUlURURfQ01EUyk7CisJCXNpemUgPSBJTklUX1NJWkU7CisJCW1zbV9yaW5nLT5pc19ncm93YWJsZSA9IFRSVUU7CisJfQorCisJbGlzdF9pbml0aGVhZCgmbXNtX3JpbmctPmNtZF9saXN0KTsKKwltc21fcmluZy0+c2Vxbm8gPSArK3RvX21zbV9kZXZpY2UocGlwZS0+ZGV2KS0+cmluZ19jbnQ7CisKKwlyaW5nID0gJm1zbV9yaW5nLT5iYXNlOworCXJpbmctPmZ1bmNzID0gJmZ1bmNzOworCXJpbmctPnNpemUgPSBzaXplOworCXJpbmctPnBpcGUgPSBwaXBlOyAgIC8qIG5lZWRlZCBpbiByaW5nX2NtZF9uZXcoKSAqLworCisJcmluZ19jbWRfbmV3KHJpbmcsIHNpemUpOworCisJcmV0dXJuIHJpbmc7Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9SRUFETUUgYi9pbmNsdWRlL2RybS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwYjBiNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL1JFQURNRQpAQCAtMCwwICsxLDE1NSBAQAorV2hhdCBhcmUgdGhlc2UgaGVhZGVycyA/CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgaXMgdGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgZHJtIGhlYWRlcnMgdGhhdCB1c2VyIHNwYWNlIHNob3VsZCB1c2UgZm9yCitjb21tdW5pY2F0aW5nIHdpdGggdGhlIGtlcm5lbCBEUk0gc3Vic3lzdGVtLgorCitUaGV5IGZsb3cgZnJvbSB0aGUga2VybmVsLCB0aHVzIGFueSBjaGFuZ2VzIG11c3QgYmUgbWVyZ2VkIHRoZXJlIGZpcnN0LgorRG8gX25vdF8gYXR0ZW1wdCB0byAiZml4IiB0aGVzZSBieSBkZXZpYXRpbmcgZnJvbSB0aGUga2VybmVsIG9uZXMgIQorCisKK05vbi1saW51eCBwbGF0Zm9ybXMgLSBjaGFuZ2VzL3BhdGNoZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0lmIHlvdXIgcGxhdGZvcm0gaGFzIGxvY2FsIGNoYW5nZXMsIHBsZWFzZSBzZW5kIHRoZW0gdXBzdHJlYW0gZm9yIGluY2x1c2lvbi4KK0V2ZW4gaWYgeW91ciBwYXRjaGVzIGRvbid0IGdldCBhY2NlcHRlZCBpbiB0aGVpciBjdXJyZW50IGZvcm0sIGRldnMgd2lsbAorZ2l2ZSB5b3UgZmVlZGJhY2sgb24gaG93IHRvIGFkZHJlc3MgdGhpbmdzIHByb3Blcmx5LgorCitnaXQgc2VuZC1lbWFpbCAtLXN1YmplY3QtcHJlZml4PSJQQVRDSCBsaWJkcm0iIHlvdXIgcGF0Y2hlcyB0byBkcmktZGV2ZWwKK21haWxpbmcgbGlzdC4KKworQmVmb3JlIGRvaW5nIHNvLCBwbGVhc2UgY29uc2lkZXIgdGhlIGZvbGxvd2luZzoKKyAtIEhhdmUgdGhlIFtsaWJkcm0gdnMga2VybmVsXSBoZWFkZXJzIG9uIHlvdXIgcGxhdGZvcm0gZGV2aWF0ZWQgPworQ29uc2lkZXIgdW5pZnlpbmcgdGhlbSBmaXJzdC4KKworIC0gSGF2ZSB5b3UgaW50cm9kdWNlZCBhZGRpdGlvbmFsIEFCSSB0aGF0J3Mgbm90IGF2YWlsYWJsZSBpbiBMaW51eCA/CitQcm9wb3NlIGl0IGZvciBbTGludXgga2VybmVsXSB1cHN0cmVhbSBpbmNsdXNpb24uCitJZiB0aGF0IGRvZXNuJ3Qgd29yayBvdXQgKGhvcGVmdWxseSBpdCBuZXZlciBkb2VzKSwgbW92ZSBpdCB0byBhbm90aGVyIGhlYWRlcgorYW5kL29yIGtlZXAgdGhlIGNoYW5nZShzKSBsb2NhbCA/CisKKyAtIEFyZSB5b3VyIGNoYW5nZXMgRFJJMS9VTVMgc3BlY2lmaWMgPworVGhlcmUgaXMgdmlydHVhbGx5IG5vIGludGVyZXN0L3Bvd2VyIGluIGtlZXBpbmcgdGhvc2UgbGVnYWN5IGludGVyZmFjZXMuIFRoZXkKK2FyZSBhcm91bmQgZHVlIHRvIHRoZSBrZXJuZWwgInRob3Ugc2hhbHQgbm90IGJyZWFrIGV4aXN0aW5nIHVzZXIgc3BhY2UiIHJ1bGUuCisKK0NvbnNpZGVyIHBvcnRpbmcgdGhlIGRyaXZlciB0byBEUkkyL0tNUyAtIGFsbCAoYWxtb3N0Pykgc2Vuc2libGUgaGFyZHdhcmUgaXMKK2NhcGFibGUgb2Ygc3VwcG9ydGluZyB0aG9zZS4KKworCitXaGljaCBoZWFkZXJzIGdvIHdoZXJlID8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBzbmlwcGVkIGZyb20gdGhlLCBub3cgcmVtb3ZlZCwgTWFrZWZpbGUuYW0gdXNlZCB0byBzdGF0ZToKKworICBYWFggYWlybGllZCBzYXlzLCBub3RoaW5nIGJlc2lkZXMgKl9kcm0uaCBhbmQgZHJtKi5oIHNob3VsZCBiZSBuZWNlc3NhcnkuCisgIGhvd2V2ZXIsIHIzMDAgYW5kIHZpYSBuZWVkIHRoZWlyIHJlZyBoZWFkZXJzIGluc3RhbGxlZCBpbiBvcmRlciB0byBidWlsZC4KKyAgYmV0dGVyIHNvbHV0aW9ucyBhcmUgd2VsY29tZS4KKworT2J2aW91c2x5IHRoZSByMzAwIGFuZCB2aWEgaGVhZGVycyBhcmUgbm8gbG9uZ2VyIGFyb3VuZCA7LSkKKworUmVhc29uIGJlaGluZCBpcyB0aGF0IHRoZSBkcm0gaGVhZGVycyBjYW4gYmUgdXNlZCBhcyBhIGJhc2ljIGNvbW11bmljYXRpb25zCitjaGFubmVsIHdpdGggdGhlIHJlc3BlY3RpdmUga2VybmVsIG1vZHVsZXMuIElmIG1vcmUgYWR2YW5jZWQgZnVuY3Rpb25hbGl0eSBpcworcmVxdWlyZWQgb25lIGNhbiBwdWxsIHRoZSBzcGVjaWZpYyBsaWJkcm1fJGRyaXZlciB3aGljaCBpcyBmcmVlIHRvIHB1bGwKK2FkZGl0aW9uYWwgZmlsZXMgZnJvbSB0aGUga2VybmVsLgorCitGb3IgZXhhbXBsZTogbm91dmVhdSBoYXMgbm91dmVhdS9udmlmLyouaCB3aGlsZSB2YzQgaGFzIHZjNC8qLmgKKworSWYgeW91ciBkcml2ZXIgaXMgc3RpbGwgaW4gcHJvdG90eXBpbmcvc3RhZ2luZyBzdGF0ZSwgY29uc2lkZXIgbW92aW5nIHRoZQorJGRyaXZlcl9kcm0uaCBpbnRvICRkcml2ZXIgYW5kIF9ub3RfIGluc3RhbGxpbmcgaXQuIEFuIGhlYWRlciBwcm92aWRpbmcgb3BhcXVlCitkZWZpbml0aW9ucyBhbmQgYWNjZXNzIFt2aWEgJGRyaXZlcl9kcm1pZi5oIG9yIHNpbWlsYXJdIHdvdWxkIGJlIGJldHRlciBmaXQuCisKKworV2hlbiBhbmQgd2hpY2ggaGVhZGVycyB0byB1cGRhdGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJZGVhbGx5IGFsbCBmaWxlcyB3aWxsIGJlIHN5bmNlZCAodXBkYXRlZCkgd2l0aCB0aGUgbGF0ZXN0IHJlbGVhc2VkIGtlcm5lbCBvbgorZWFjaCBsaWJkcm0gcmVsZWFzZS4gU2FkbHkgdGhhdCdzIG5vdCB5ZXQgcG9zc2libGUgc2luY2UgcXVpdGUgYSBmZXcgaGVhZGVycworZGlmZmVyIHNpZ25pZmljYW50bHkgLSBzZWUgT3V0ZGF0ZWQgb3IgQnJva2VuIEhlYWRlcnMgc2VjdGlvbiBiZWxvdy4KKworVGhhdCBzYWlkLCBpdCdzIHVwLXRvIHRoZSBpbmRpdmlkdWFsIGRldmVsb3BlcnMgdG8gc3luYyB3aXRoIG5ld2VyIHZlcnNpb24KKyhmcm9tIGRybS1uZXh0KSBhcyB0aGV5IHNlZSBmaXQuCisKKworV2hlbiBhbmQgaG93IHRvIHVwZGF0ZSB0aGVzZSBmaWxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTm90ZTogT25lIHNob3VsZCBub3QgZG8gX2FueV8gY2hhbmdlcyB0byB0aGUgZmlsZXMgYXBhcnQgZnJvbSB0aGUgc3RlcHMgYmVsb3cuCisKK0luIG9yZGVyIHRvIHVwZGF0ZSB0aGUgZmlsZXMgZG8gdGhlIGZvbGxvd2luZzoKKyAtIFN3aXRjaCB0byBhIExpbnV4IGtlcm5lbCB0cmVlL2JyYW5jaCB3aGljaCBpcyBub3QgcmViYXNlZC4KK0ZvciBleGFtcGxlOiBhaXJsaWVkL2RybS1uZXh0CisgLSBJbnN0YWxsIHRoZSBoZWFkZXJzIHZpYSBgbWFrZSBoZWFkZXJzX2luc3RhbGwnIHRvIGEgc2VwYXJhdGUgbG9jYXRpb24uCisgLSBDb3B5IHRoZSBkcm0gaGVhZGVyW3NdICsgZ2l0IGFkZCArIGdpdCBjb21taXQuCisgLSBOb3RlOiBZb3VyIGNvbW1pdCBtZXNzYWdlIG11c3QgaW5jbHVkZToKKyAgIGEpIEJyaWVmIHN1bW1hcnkgb24gdGhlIGRlbHRhLiBJZiB0aGVyZSdzIGFueSBjaGFuZ2UgdGhhdCBsb29rcyBsaWtlIGFuCitBUEkvQUJJIGJyZWFrIG9uZSBfbXVzdF8gZXhwbGljaXRseSBzdGF0ZSB3aHkgaXQncyBzYWZlIHRvIGRvIHNvLgorICAgYikgIkdlbmVyYXRlZCB1c2luZyBtYWtlIGhlYWRlcnNfaW5zdGFsbC4iCisgICBjKSAiR2VuZXJhdGVkIGZyb20gJHRyZWUvYnJhbmNoIGNvbW1pdCAkc2hhIgorCisKK091dGRhdGVkIG9yIEJyb2tlbiBIZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGEgbGlzdCBvZiBoZWFkZXJzIGFuZCB0aGUgcmVzcGVjdGl2ZSAiaXNzdWVzIiB0aGV5IG1pZ2h0CitoYXZlIHJlbGF0aXZlIHRvIHRoZWlyIGtlcm5lbCBlcXVpdmFsZW50LgorCitOZWFybHkgYWxsIGhlYWRlcnM6CisgLSBNaXNzaW5nIGV4dGVybiBDIG5vdGF0aW9uLgorU3RhdHVzOiBUcml2aWFsLgorCitNb3N0IFVNUyBoZWFkZXJzOgorIC0gTm90IHVzaW5nIGZpeGVkIHNpemUgaW50ZWdlcnMgLSBjb21wYXQgaW9jdGxzIGFyZSBicm9rZW4uCitTdGF0dXM6ID8KK1Byb21vdGUgdG8gZml4ZWQgc2l6ZSBpbnRzLCB3aGljaCBtYXRjaCB0aGUgY3VycmVudCAoMzJiaXQpIG9uZXMuCisKKworZHJtX21vZGUuaAorIC0gTWlzc2luZyBEUEkgZW5jb2RlL2Nvbm5lY3RvciBwYWlyLgorU3RhdHVzOiBUcml2aWFsLgorCitpOTE1X2RybS5oCisgLSBNaXNzaW5nIFBBUkFNUyAtIEhBU19QT09MRURfRVUsIE1JTl9FVV9JTl9QT09MIENPTlRFWFRfUEFSQU1fTk9fRVJST1JfQ0FQVFVSRQorU3RhdHVzOiBUcml2aWFsLgorCittZ2FfZHJtLmgKKyAtIFR5cG8gZml4LCB1c2Ugc3RydWN0IG92ZXIgdHlwZWRlZi4KK1N0YXR1czogVHJpdmlhbC4KKworbm91dmVhdV9kcm0uaAorIC0gTWlzc2luZyBtYWNyb3MgTk9VVkVBVV9HRVRQQVJBTSosIE5PVVZFQVVfRFJNX0hFQURFUl9QQVRDSExFVkVMLCBzdHJ1Y3RzLAorZW51bXMsIHVzaW5nIHN0ZGludC5oIG92ZXIgdGhlIF9fdSogdHlwZXMuCitTdGF0dXM6ID8KKworcXhsX2RybS5oCisgLSBVc2luZyB0aGUgc3RkaW50LmggdWludCpfdCBvdmVyIHRoZSByZXNwZWN0aXZlIF9fdSogb25lcworU3RhdHVzOiBUcml2aWFsLgorCityMTI4X2RybS5oCisgLSBCcm9rZW4gY29tcGF0IGlvY3Rscy4KKworcmFkZW9uX2RybS5oCisgLSBNaXNzaW5nIFJBREVPTl9USUxJTkdfUjYwMF9OT19TQ0FOT1VULCBDSUtfVElMRV9NT0RFXyosIGJyb2tlbiBVTVMgaW9jdGxzLAordXNpbmcgc3RkaW50IHR5cGVzLgorIC0gQm90aCBrZXJuZWwgYW5kIGxpYmRybTogbWlzc2luZyBwYWRkaW5nIC0KK2RybV9yYWRlb25fZ2VtX3tjcmVhdGUse2csc31ldF90aWxpbmcsc2V0X2RvbWFpbn0gb3RoZXJzID8KK1N0YXR1czogPworCitzYXZhZ2VfZHJtLmgKKyAtIFJlbmFtZWQgaW9jdGxzIC0gRFJNX0lPQ1RMX1NBVkFHRV97LEJDSX1fRVZFTlRfRU1JVCwgY29tcGF0IGlvY3RscyBhcmUgYnJva2VuLgorU3RhdHVzOiA/CisKK3Npc19kcm0uaAorIC0gQm9ya2VuIGlvY3RscyArIGxpYmRybSB1c2VzIGludCB2cyBrZXJuZWwgbG9uZworU3RhdHVzOiA/CisKK3ZpYV9kcm0uaAorIC0gQm9ya2VuIGlvY3RscyAtIGxpYmRybSBpbnQgdnMga2VybmVsIGxvbmcKK1N0YXR1czogPworCisKK29tYXBfZHJtLmggKGxpdmluZyBpbiAkVE9QL29tYXApCisgLSBMaWNlbnNlIG1pc21hdGNoLCBtaXNzaW5nIERSTV9JT0NUTF9PTUFQX0dFTV9ORVcgYW5kIHJlbGF0ZWQgc3RydWN0CitTdGF0dXM6ID8KKworbXNtX2RybS5oIChsb2NhdGVkIGluICRUT1AvZnJlZWRyZW5vL21zbS8pCisgLSBMaWNlbnNlIG1pc21hdGNoLCBtaXNzaW5nIE1TTV9QSVBFXyosIE1TTV9TVUJNSVRfKi4gUmVuYW1lZAorZHJtX21zbV9nZW1fc3VibWl0OjpmbGFncywgbWlzc2luZyBkcm1fbXNtX2dlbV9zdWJtaXQ6OmZlbmNlX2ZkLgorU3RhdHVzOiA/CisKK2V4eW5vc19kcm0uaCAobGl2aW5nIGluICRUT1AvZXh5bm9zKQorIC0gTGljZW5zZSBtaXNtYXRjaCwgbm93IHVzaW5nIGZpeGVkIHNpemUgaW50cyAoYnV0IG5vdCBldmVyeXdoZXJlKS4gTG90cyBvZgorbmV3IHN0dWZmLgorU3RhdHVzOiA/CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9hbWRncHVfZHJtLmggYi9pbmNsdWRlL2RybS9hbWRncHVfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM2ZThjNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL2FtZGdwdV9kcm0uaApAQCAtMCwwICsxLDkwMCBAQAorLyogYW1kZ3B1X2RybS5oIC0tIFB1YmxpYyBoZWFkZXIgZm9yIHRoZSBhbWRncHUgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICoKKyAqIENvcHlyaWdodCAyMDAwIFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIEZyZW1vbnQsIENhbGlmb3JuaWEuCisgKiBDb3B5cmlnaHQgMjAwMiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAxNCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEtldmluIEUuIE1hcnRpbiA8bWFydGluQHZhbGludXguY29tPgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICogICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICovCisKKyNpZm5kZWYgX19BTURHUFVfRFJNX0hfXworI2RlZmluZSBfX0FNREdQVV9EUk1fSF9fCisKKyNpbmNsdWRlICJkcm0uaCIKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIERSTV9BTURHUFVfR0VNX0NSRUFURQkJMHgwMAorI2RlZmluZSBEUk1fQU1ER1BVX0dFTV9NTUFQCQkweDAxCisjZGVmaW5lIERSTV9BTURHUFVfQ1RYCQkJMHgwMgorI2RlZmluZSBEUk1fQU1ER1BVX0JPX0xJU1QJCTB4MDMKKyNkZWZpbmUgRFJNX0FNREdQVV9DUwkJCTB4MDQKKyNkZWZpbmUgRFJNX0FNREdQVV9JTkZPCQkJMHgwNQorI2RlZmluZSBEUk1fQU1ER1BVX0dFTV9NRVRBREFUQQkJMHgwNgorI2RlZmluZSBEUk1fQU1ER1BVX0dFTV9XQUlUX0lETEUJMHgwNworI2RlZmluZSBEUk1fQU1ER1BVX0dFTV9WQQkJMHgwOAorI2RlZmluZSBEUk1fQU1ER1BVX1dBSVRfQ1MJCTB4MDkKKyNkZWZpbmUgRFJNX0FNREdQVV9HRU1fT1AJCTB4MTAKKyNkZWZpbmUgRFJNX0FNREdQVV9HRU1fVVNFUlBUUgkJMHgxMQorI2RlZmluZSBEUk1fQU1ER1BVX1dBSVRfRkVOQ0VTCQkweDEyCisjZGVmaW5lIERSTV9BTURHUFVfVk0JCQkweDEzCisjZGVmaW5lIERSTV9BTURHUFVfRkVOQ0VfVE9fSEFORExFCTB4MTQKKworI2RlZmluZSBEUk1fSU9DVExfQU1ER1BVX0dFTV9DUkVBVEUJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9BTURHUFVfR0VNX0NSRUFURSwgdW5pb24gZHJtX2FtZGdwdV9nZW1fY3JlYXRlKQorI2RlZmluZSBEUk1fSU9DVExfQU1ER1BVX0dFTV9NTUFQCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fQU1ER1BVX0dFTV9NTUFQLCB1bmlvbiBkcm1fYW1kZ3B1X2dlbV9tbWFwKQorI2RlZmluZSBEUk1fSU9DVExfQU1ER1BVX0NUWAkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9BTURHUFVfQ1RYLCB1bmlvbiBkcm1fYW1kZ3B1X2N0eCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FNREdQVV9CT19MSVNUCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fQU1ER1BVX0JPX0xJU1QsIHVuaW9uIGRybV9hbWRncHVfYm9fbGlzdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FNREdQVV9DUwkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9BTURHUFVfQ1MsIHVuaW9uIGRybV9hbWRncHVfY3MpCisjZGVmaW5lIERSTV9JT0NUTF9BTURHUFVfSU5GTwkJRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX0FNREdQVV9JTkZPLCBzdHJ1Y3QgZHJtX2FtZGdwdV9pbmZvKQorI2RlZmluZSBEUk1fSU9DVExfQU1ER1BVX0dFTV9NRVRBREFUQQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0FNREdQVV9HRU1fTUVUQURBVEEsIHN0cnVjdCBkcm1fYW1kZ3B1X2dlbV9tZXRhZGF0YSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FNREdQVV9HRU1fV0FJVF9JRExFCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fQU1ER1BVX0dFTV9XQUlUX0lETEUsIHVuaW9uIGRybV9hbWRncHVfZ2VtX3dhaXRfaWRsZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FNREdQVV9HRU1fVkEJCURSTV9JT1coRFJNX0NPTU1BTkRfQkFTRSArIERSTV9BTURHUFVfR0VNX1ZBLCBzdHJ1Y3QgZHJtX2FtZGdwdV9nZW1fdmEpCisjZGVmaW5lIERSTV9JT0NUTF9BTURHUFVfV0FJVF9DUwlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0FNREdQVV9XQUlUX0NTLCB1bmlvbiBkcm1fYW1kZ3B1X3dhaXRfY3MpCisjZGVmaW5lIERSTV9JT0NUTF9BTURHUFVfR0VNX09QCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0FNREdQVV9HRU1fT1AsIHN0cnVjdCBkcm1fYW1kZ3B1X2dlbV9vcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FNREdQVV9HRU1fVVNFUlBUUglEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0FNREdQVV9HRU1fVVNFUlBUUiwgc3RydWN0IGRybV9hbWRncHVfZ2VtX3VzZXJwdHIpCisjZGVmaW5lIERSTV9JT0NUTF9BTURHUFVfV0FJVF9GRU5DRVMJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9BTURHUFVfV0FJVF9GRU5DRVMsIHVuaW9uIGRybV9hbWRncHVfd2FpdF9mZW5jZXMpCisjZGVmaW5lIERSTV9JT0NUTF9BTURHUFVfVk0JCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fQU1ER1BVX1ZNLCB1bmlvbiBkcm1fYW1kZ3B1X3ZtKQorI2RlZmluZSBEUk1fSU9DVExfQU1ER1BVX0ZFTkNFX1RPX0hBTkRMRSBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0FNREdQVV9GRU5DRV9UT19IQU5ETEUsIHVuaW9uIGRybV9hbWRncHVfZmVuY2VfdG9faGFuZGxlKQorCisjZGVmaW5lIEFNREdQVV9HRU1fRE9NQUlOX0NQVQkJMHgxCisjZGVmaW5lIEFNREdQVV9HRU1fRE9NQUlOX0dUVAkJMHgyCisjZGVmaW5lIEFNREdQVV9HRU1fRE9NQUlOX1ZSQU0JCTB4NAorI2RlZmluZSBBTURHUFVfR0VNX0RPTUFJTl9HRFMJCTB4OAorI2RlZmluZSBBTURHUFVfR0VNX0RPTUFJTl9HV1MJCTB4MTAKKyNkZWZpbmUgQU1ER1BVX0dFTV9ET01BSU5fT0EJCTB4MjAKKworLyogRmxhZyB0aGF0IENQVSBhY2Nlc3Mgd2lsbCBiZSByZXF1aXJlZCBmb3IgdGhlIGNhc2Ugb2YgVlJBTSBkb21haW4gKi8KKyNkZWZpbmUgQU1ER1BVX0dFTV9DUkVBVEVfQ1BVX0FDQ0VTU19SRVFVSVJFRAkoMSA8PCAwKQorLyogRmxhZyB0aGF0IENQVSBhY2Nlc3Mgd2lsbCBub3Qgd29yaywgdGhpcyBWUkFNIGRvbWFpbiBpcyBpbnZpc2libGUgKi8KKyNkZWZpbmUgQU1ER1BVX0dFTV9DUkVBVEVfTk9fQ1BVX0FDQ0VTUwkJKDEgPDwgMSkKKy8qIEZsYWcgdGhhdCBVU1dDIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIHVzZWQgZm9yIEdUVCAqLworI2RlZmluZSBBTURHUFVfR0VNX0NSRUFURV9DUFVfR1RUX1VTV0MJCSgxIDw8IDIpCisvKiBGbGFnIHRoYXQgdGhlIG1lbW9yeSBzaG91bGQgYmUgaW4gVlJBTSBhbmQgY2xlYXJlZCAqLworI2RlZmluZSBBTURHUFVfR0VNX0NSRUFURV9WUkFNX0NMRUFSRUQJCSgxIDw8IDMpCisvKiBGbGFnIHRoYXQgY3JlYXRlIHNoYWRvdyBibyhHVFQpIHdoaWxlIGFsbG9jYXRpbmcgdnJhbSBibyAqLworI2RlZmluZSBBTURHUFVfR0VNX0NSRUFURV9TSEFET1cJCSgxIDw8IDQpCisvKiBGbGFnIHRoYXQgYWxsb2NhdGluZyB0aGUgQk8gc2hvdWxkIHVzZSBsaW5lYXIgVlJBTSAqLworI2RlZmluZSBBTURHUFVfR0VNX0NSRUFURV9WUkFNX0NPTlRJR1VPVVMJKDEgPDwgNSkKKy8qIEZsYWcgdGhhdCBCTyBpcyBhbHdheXMgdmFsaWQgaW4gdGhpcyBWTSAqLworI2RlZmluZSBBTURHUFVfR0VNX0NSRUFURV9WTV9BTFdBWVNfVkFMSUQJKDEgPDwgNikKKworc3RydWN0IGRybV9hbWRncHVfZ2VtX2NyZWF0ZV9pbiAgeworCS8qKiB0aGUgcmVxdWVzdGVkIG1lbW9yeSBzaXplICovCisJX191NjQgYm9fc2l6ZTsKKwkvKiogcGh5c2ljYWwgc3RhcnRfYWRkciBhbGlnbm1lbnQgaW4gYnl0ZXMgZm9yIHNvbWUgSFcgcmVxdWlyZW1lbnRzICovCisJX191NjQgYWxpZ25tZW50OworCS8qKiB0aGUgcmVxdWVzdGVkIG1lbW9yeSBkb21haW5zICovCisJX191NjQgZG9tYWluczsKKwkvKiogYWxsb2NhdGlvbiBmbGFncyAqLworCV9fdTY0IGRvbWFpbl9mbGFnczsKK307CisKK3N0cnVjdCBkcm1fYW1kZ3B1X2dlbV9jcmVhdGVfb3V0ICB7CisJLyoqIHJldHVybmVkIEdFTSBvYmplY3QgaGFuZGxlICovCisJX191MzIgaGFuZGxlOworCV9fdTMyIF9wYWQ7Cit9OworCit1bmlvbiBkcm1fYW1kZ3B1X2dlbV9jcmVhdGUgeworCXN0cnVjdCBkcm1fYW1kZ3B1X2dlbV9jcmVhdGVfaW4JCWluOworCXN0cnVjdCBkcm1fYW1kZ3B1X2dlbV9jcmVhdGVfb3V0CW91dDsKK307CisKKy8qKiBPcGNvZGUgdG8gY3JlYXRlIG5ldyByZXNpZGVuY3kgbGlzdC4gICovCisjZGVmaW5lIEFNREdQVV9CT19MSVNUX09QX0NSRUFURQkwCisvKiogT3Bjb2RlIHRvIGRlc3Ryb3kgcHJldmlvdXNseSBjcmVhdGVkIHJlc2lkZW5jeSBsaXN0ICovCisjZGVmaW5lIEFNREdQVV9CT19MSVNUX09QX0RFU1RST1kJMQorLyoqIE9wY29kZSB0byB1cGRhdGUgcmVzb3VyY2UgaW5mb3JtYXRpb24gaW4gdGhlIGxpc3QgKi8KKyNkZWZpbmUgQU1ER1BVX0JPX0xJU1RfT1BfVVBEQVRFCTIKKworc3RydWN0IGRybV9hbWRncHVfYm9fbGlzdF9pbiB7CisJLyoqIFR5cGUgb2Ygb3BlcmF0aW9uICovCisJX191MzIgb3BlcmF0aW9uOworCS8qKiBIYW5kbGUgb2YgbGlzdCBvciAwIGlmIHdlIHdhbnQgdG8gY3JlYXRlIG9uZSAqLworCV9fdTMyIGxpc3RfaGFuZGxlOworCS8qKiBOdW1iZXIgb2YgQk9zIGluIGxpc3QgICovCisJX191MzIgYm9fbnVtYmVyOworCS8qKiBTaXplIG9mIGVhY2ggZWxlbWVudCBkZXNjcmliaW5nIEJPICovCisJX191MzIgYm9faW5mb19zaXplOworCS8qKiBQb2ludGVyIHRvIGFycmF5IGRlc2NyaWJpbmcgQk9zICovCisJX191NjQgYm9faW5mb19wdHI7Cit9OworCitzdHJ1Y3QgZHJtX2FtZGdwdV9ib19saXN0X2VudHJ5IHsKKwkvKiogSGFuZGxlIG9mIEJPICovCisJX191MzIgYm9faGFuZGxlOworCS8qKiBOZXcgKGlmIHNwZWNpZmllZCkgQk8gcHJpb3JpdHkgdG8gYmUgdXNlZCBkdXJpbmcgbWlncmF0aW9uICovCisJX191MzIgYm9fcHJpb3JpdHk7Cit9OworCitzdHJ1Y3QgZHJtX2FtZGdwdV9ib19saXN0X291dCB7CisJLyoqIEhhbmRsZSBvZiByZXNvdXJjZSBsaXN0ICAqLworCV9fdTMyIGxpc3RfaGFuZGxlOworCV9fdTMyIF9wYWQ7Cit9OworCit1bmlvbiBkcm1fYW1kZ3B1X2JvX2xpc3QgeworCXN0cnVjdCBkcm1fYW1kZ3B1X2JvX2xpc3RfaW4gaW47CisJc3RydWN0IGRybV9hbWRncHVfYm9fbGlzdF9vdXQgb3V0OworfTsKKworLyogY29udGV4dCByZWxhdGVkICovCisjZGVmaW5lIEFNREdQVV9DVFhfT1BfQUxMT0NfQ1RYCTEKKyNkZWZpbmUgQU1ER1BVX0NUWF9PUF9GUkVFX0NUWAkyCisjZGVmaW5lIEFNREdQVV9DVFhfT1BfUVVFUllfU1RBVEUJMworCisvKiBHUFUgcmVzZXQgc3RhdHVzICovCisjZGVmaW5lIEFNREdQVV9DVFhfTk9fUkVTRVQJCTAKKy8qIHRoaXMgdGhlIGNvbnRleHQgY2F1c2VkIGl0ICovCisjZGVmaW5lIEFNREdQVV9DVFhfR1VJTFRZX1JFU0VUCQkxCisvKiBzb21lIG90aGVyIGNvbnRleHQgY2F1c2VkIGl0ICovCisjZGVmaW5lIEFNREdQVV9DVFhfSU5OT0NFTlRfUkVTRVQJMgorLyogdW5rbm93biBjYXVzZSAqLworI2RlZmluZSBBTURHUFVfQ1RYX1VOS05PV05fUkVTRVQJMworCitzdHJ1Y3QgZHJtX2FtZGdwdV9jdHhfaW4geworCS8qKiBBTURHUFVfQ1RYX09QXyogKi8KKwlfX3UzMglvcDsKKwkvKiogRm9yIGZ1dHVyZSB1c2UsIG5vIGZsYWdzIGRlZmluZWQgc28gZmFyICovCisJX191MzIJZmxhZ3M7CisJX191MzIJY3R4X2lkOworCV9fdTMyCV9wYWQ7Cit9OworCit1bmlvbiBkcm1fYW1kZ3B1X2N0eF9vdXQgeworCQlzdHJ1Y3QgeworCQkJX191MzIJY3R4X2lkOworCQkJX191MzIJX3BhZDsKKwkJfSBhbGxvYzsKKworCQlzdHJ1Y3QgeworCQkJLyoqIEZvciBmdXR1cmUgdXNlLCBubyBmbGFncyBkZWZpbmVkIHNvIGZhciAqLworCQkJX191NjQJZmxhZ3M7CisJCQkvKiogTnVtYmVyIG9mIHJlc2V0cyBjYXVzZWQgYnkgdGhpcyBjb250ZXh0IHNvIGZhci4gKi8KKwkJCV9fdTMyCWhhbmdzOworCQkJLyoqIFJlc2V0IHN0YXR1cyBzaW5jZSB0aGUgbGFzdCBjYWxsIG9mIHRoZSBpb2N0bC4gKi8KKwkJCV9fdTMyCXJlc2V0X3N0YXR1czsKKwkJfSBzdGF0ZTsKK307CisKK3VuaW9uIGRybV9hbWRncHVfY3R4IHsKKwlzdHJ1Y3QgZHJtX2FtZGdwdV9jdHhfaW4gaW47CisJdW5pb24gZHJtX2FtZGdwdV9jdHhfb3V0IG91dDsKK307CisKKy8qIHZtIGlvY3RsICovCisjZGVmaW5lIEFNREdQVV9WTV9PUF9SRVNFUlZFX1ZNSUQJMQorI2RlZmluZSBBTURHUFVfVk1fT1BfVU5SRVNFUlZFX1ZNSUQJMgorCitzdHJ1Y3QgZHJtX2FtZGdwdV92bV9pbiB7CisJLyoqIEFNREdQVV9WTV9PUF8qICovCisJX191MzIJb3A7CisJX191MzIJZmxhZ3M7Cit9OworCitzdHJ1Y3QgZHJtX2FtZGdwdV92bV9vdXQgeworCS8qKiBGb3IgZnV0dXJlIHVzZSwgbm8gZmxhZ3MgZGVmaW5lZCBzbyBmYXIgKi8KKwlfX3U2NAlmbGFnczsKK307CisKK3VuaW9uIGRybV9hbWRncHVfdm0geworCXN0cnVjdCBkcm1fYW1kZ3B1X3ZtX2luIGluOworCXN0cnVjdCBkcm1fYW1kZ3B1X3ZtX291dCBvdXQ7Cit9OworCisvKgorICogVGhpcyBpcyBub3QgYSByZWxpYWJsZSBBUEkgYW5kIHlvdSBzaG91bGQgZXhwZWN0IGl0IHRvIGZhaWwgZm9yIGFueQorICogbnVtYmVyIG9mIHJlYXNvbnMgYW5kIGhhdmUgZmFsbGJhY2sgcGF0aCB0aGF0IGRvIG5vdCB1c2UgdXNlcnB0ciB0bworICogcGVyZm9ybSBhbnkgb3BlcmF0aW9uLgorICovCisjZGVmaW5lIEFNREdQVV9HRU1fVVNFUlBUUl9SRUFET05MWQkoMSA8PCAwKQorI2RlZmluZSBBTURHUFVfR0VNX1VTRVJQVFJfQU5PTk9OTFkJKDEgPDwgMSkKKyNkZWZpbmUgQU1ER1BVX0dFTV9VU0VSUFRSX1ZBTElEQVRFCSgxIDw8IDIpCisjZGVmaW5lIEFNREdQVV9HRU1fVVNFUlBUUl9SRUdJU1RFUgkoMSA8PCAzKQorCitzdHJ1Y3QgZHJtX2FtZGdwdV9nZW1fdXNlcnB0ciB7CisJX191NjQJCWFkZHI7CisJX191NjQJCXNpemU7CisJLyogQU1ER1BVX0dFTV9VU0VSUFRSXyogKi8KKwlfX3UzMgkJZmxhZ3M7CisJLyogUmVzdWx0aW5nIEdFTSBoYW5kbGUgKi8KKwlfX3UzMgkJaGFuZGxlOworfTsKKworLyogU0ktQ0ktVkk6ICovCisvKiBzYW1lIG1lYW5pbmcgYXMgdGhlIEdCX1RJTEVfTU9ERSBhbmQgR0xfTUFDUk9fVElMRV9NT0RFIGZpZWxkcyAqLworI2RlZmluZSBBTURHUFVfVElMSU5HX0FSUkFZX01PREVfU0hJRlQJCQkwCisjZGVmaW5lIEFNREdQVV9USUxJTkdfQVJSQVlfTU9ERV9NQVNLCQkJMHhmCisjZGVmaW5lIEFNREdQVV9USUxJTkdfUElQRV9DT05GSUdfU0hJRlQJCQk0CisjZGVmaW5lIEFNREdQVV9USUxJTkdfUElQRV9DT05GSUdfTUFTSwkJCTB4MWYKKyNkZWZpbmUgQU1ER1BVX1RJTElOR19USUxFX1NQTElUX1NISUZUCQkJOQorI2RlZmluZSBBTURHUFVfVElMSU5HX1RJTEVfU1BMSVRfTUFTSwkJCTB4NworI2RlZmluZSBBTURHUFVfVElMSU5HX01JQ1JPX1RJTEVfTU9ERV9TSElGVAkJMTIKKyNkZWZpbmUgQU1ER1BVX1RJTElOR19NSUNST19USUxFX01PREVfTUFTSwkJMHg3CisjZGVmaW5lIEFNREdQVV9USUxJTkdfQkFOS19XSURUSF9TSElGVAkJCTE1CisjZGVmaW5lIEFNREdQVV9USUxJTkdfQkFOS19XSURUSF9NQVNLCQkJMHgzCisjZGVmaW5lIEFNREdQVV9USUxJTkdfQkFOS19IRUlHSFRfU0hJRlQJCQkxNworI2RlZmluZSBBTURHUFVfVElMSU5HX0JBTktfSEVJR0hUX01BU0sJCQkweDMKKyNkZWZpbmUgQU1ER1BVX1RJTElOR19NQUNST19USUxFX0FTUEVDVF9TSElGVAkJMTkKKyNkZWZpbmUgQU1ER1BVX1RJTElOR19NQUNST19USUxFX0FTUEVDVF9NQVNLCQkweDMKKyNkZWZpbmUgQU1ER1BVX1RJTElOR19OVU1fQkFOS1NfU0hJRlQJCQkyMQorI2RlZmluZSBBTURHUFVfVElMSU5HX05VTV9CQU5LU19NQVNLCQkJMHgzCisKKy8qIEdGWDkgYW5kIGxhdGVyOiAqLworI2RlZmluZSBBTURHUFVfVElMSU5HX1NXSVpaTEVfTU9ERV9TSElGVAkJMAorI2RlZmluZSBBTURHUFVfVElMSU5HX1NXSVpaTEVfTU9ERV9NQVNLCQkJMHgxZgorCisvKiBTZXQvR2V0IGhlbHBlcnMgZm9yIHRpbGluZyBmbGFncy4gKi8KKyNkZWZpbmUgQU1ER1BVX1RJTElOR19TRVQoZmllbGQsIHZhbHVlKSBcCisJKCgoX191NjQpKHZhbHVlKSAmIEFNREdQVV9USUxJTkdfIyNmaWVsZCMjX01BU0spIDw8IEFNREdQVV9USUxJTkdfIyNmaWVsZCMjX1NISUZUKQorI2RlZmluZSBBTURHUFVfVElMSU5HX0dFVCh2YWx1ZSwgZmllbGQpIFwKKwkoKChfX3U2NCkodmFsdWUpID4+IEFNREdQVV9USUxJTkdfIyNmaWVsZCMjX1NISUZUKSAmIEFNREdQVV9USUxJTkdfIyNmaWVsZCMjX01BU0spCisKKyNkZWZpbmUgQU1ER1BVX0dFTV9NRVRBREFUQV9PUF9TRVRfTUVUQURBVEEgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFNREdQVV9HRU1fTUVUQURBVEFfT1BfR0VUX01FVEFEQVRBICAgICAgICAgICAgICAgICAgMgorCisvKiogVGhlIHNhbWUgc3RydWN0dXJlIGlzIHNoYXJlZCBmb3IgaW5wdXQvb3V0cHV0ICovCitzdHJ1Y3QgZHJtX2FtZGdwdV9nZW1fbWV0YWRhdGEgeworCS8qKiBHRU0gT2JqZWN0IGhhbmRsZSAqLworCV9fdTMyCWhhbmRsZTsKKwkvKiogRG8gd2Ugd2FudCBnZXQgb3Igc2V0IG1ldGFkYXRhICovCisJX191MzIJb3A7CisJc3RydWN0IHsKKwkJLyoqIEZvciBmdXR1cmUgdXNlLCBubyBmbGFncyBkZWZpbmVkIHNvIGZhciAqLworCQlfX3U2NAlmbGFnczsKKwkJLyoqIGZhbWlseSBzcGVjaWZpYyB0aWxpbmcgaW5mbyAqLworCQlfX3U2NAl0aWxpbmdfaW5mbzsKKwkJX191MzIJZGF0YV9zaXplX2J5dGVzOworCQlfX3UzMglkYXRhWzY0XTsKKwl9IGRhdGE7Cit9OworCitzdHJ1Y3QgZHJtX2FtZGdwdV9nZW1fbW1hcF9pbiB7CisJLyoqIHRoZSBHRU0gb2JqZWN0IGhhbmRsZSAqLworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBfcGFkOworfTsKKworc3RydWN0IGRybV9hbWRncHVfZ2VtX21tYXBfb3V0IHsKKwkvKiogbW1hcCBvZmZzZXQgZnJvbSB0aGUgdm1hIG9mZnNldCBtYW5hZ2VyICovCisJX191NjQgYWRkcl9wdHI7Cit9OworCit1bmlvbiBkcm1fYW1kZ3B1X2dlbV9tbWFwIHsKKwlzdHJ1Y3QgZHJtX2FtZGdwdV9nZW1fbW1hcF9pbiAgIGluOworCXN0cnVjdCBkcm1fYW1kZ3B1X2dlbV9tbWFwX291dCBvdXQ7Cit9OworCitzdHJ1Y3QgZHJtX2FtZGdwdV9nZW1fd2FpdF9pZGxlX2luIHsKKwkvKiogR0VNIG9iamVjdCBoYW5kbGUgKi8KKwlfX3UzMiBoYW5kbGU7CisJLyoqIEZvciBmdXR1cmUgdXNlLCBubyBmbGFncyBkZWZpbmVkIHNvIGZhciAqLworCV9fdTMyIGZsYWdzOworCS8qKiBBYnNvbHV0ZSB0aW1lb3V0IHRvIHdhaXQgKi8KKwlfX3U2NCB0aW1lb3V0OworfTsKKworc3RydWN0IGRybV9hbWRncHVfZ2VtX3dhaXRfaWRsZV9vdXQgeworCS8qKiBCTyBzdGF0dXM6ICAwIC0gQk8gaXMgaWRsZSwgMSAtIEJPIGlzIGJ1c3kgKi8KKwlfX3UzMiBzdGF0dXM7CisJLyoqIFJldHVybmVkIGN1cnJlbnQgbWVtb3J5IGRvbWFpbiAqLworCV9fdTMyIGRvbWFpbjsKK307CisKK3VuaW9uIGRybV9hbWRncHVfZ2VtX3dhaXRfaWRsZSB7CisJc3RydWN0IGRybV9hbWRncHVfZ2VtX3dhaXRfaWRsZV9pbiAgaW47CisJc3RydWN0IGRybV9hbWRncHVfZ2VtX3dhaXRfaWRsZV9vdXQgb3V0OworfTsKKworc3RydWN0IGRybV9hbWRncHVfd2FpdF9jc19pbiB7CisJLyogQ29tbWFuZCBzdWJtaXNzaW9uIGhhbmRsZQorICAgICAgICAgKiBoYW5kbGUgZXF1YWxzIDAgbWVhbnMgbm9uZSB0byB3YWl0IGZvcgorICAgICAgICAgKiBoYW5kbGUgZXF1YWxzIH4wdWxsIG1lYW5zIHdhaXQgZm9yIHRoZSBsYXRlc3Qgc2VxdWVuY2UgbnVtYmVyCisgICAgICAgICAqLworCV9fdTY0IGhhbmRsZTsKKwkvKiogQWJzb2x1dGUgdGltZW91dCB0byB3YWl0ICovCisJX191NjQgdGltZW91dDsKKwlfX3UzMiBpcF90eXBlOworCV9fdTMyIGlwX2luc3RhbmNlOworCV9fdTMyIHJpbmc7CisJX191MzIgY3R4X2lkOworfTsKKworc3RydWN0IGRybV9hbWRncHVfd2FpdF9jc19vdXQgeworCS8qKiBDUyBzdGF0dXM6ICAwIC0gQ1MgY29tcGxldGVkLCAxIC0gQ1Mgc3RpbGwgYnVzeSAqLworCV9fdTY0IHN0YXR1czsKK307CisKK3VuaW9uIGRybV9hbWRncHVfd2FpdF9jcyB7CisJc3RydWN0IGRybV9hbWRncHVfd2FpdF9jc19pbiBpbjsKKwlzdHJ1Y3QgZHJtX2FtZGdwdV93YWl0X2NzX291dCBvdXQ7Cit9OworCitzdHJ1Y3QgZHJtX2FtZGdwdV9mZW5jZSB7CisJX191MzIgY3R4X2lkOworCV9fdTMyIGlwX3R5cGU7CisJX191MzIgaXBfaW5zdGFuY2U7CisJX191MzIgcmluZzsKKwlfX3U2NCBzZXFfbm87Cit9OworCitzdHJ1Y3QgZHJtX2FtZGdwdV93YWl0X2ZlbmNlc19pbiB7CisJLyoqIFRoaXMgcG9pbnRzIHRvIHVpbnQ2NF90ICogd2hpY2ggcG9pbnRzIHRvIGZlbmNlcyAqLworCV9fdTY0IGZlbmNlczsKKwlfX3UzMiBmZW5jZV9jb3VudDsKKwlfX3UzMiB3YWl0X2FsbDsKKwlfX3U2NCB0aW1lb3V0X25zOworfTsKKworc3RydWN0IGRybV9hbWRncHVfd2FpdF9mZW5jZXNfb3V0IHsKKwlfX3UzMiBzdGF0dXM7CisJX191MzIgZmlyc3Rfc2lnbmFsZWQ7Cit9OworCit1bmlvbiBkcm1fYW1kZ3B1X3dhaXRfZmVuY2VzIHsKKwlzdHJ1Y3QgZHJtX2FtZGdwdV93YWl0X2ZlbmNlc19pbiBpbjsKKwlzdHJ1Y3QgZHJtX2FtZGdwdV93YWl0X2ZlbmNlc19vdXQgb3V0OworfTsKKworI2RlZmluZSBBTURHUFVfR0VNX09QX0dFVF9HRU1fQ1JFQVRFX0lORk8JMAorI2RlZmluZSBBTURHUFVfR0VNX09QX1NFVF9QTEFDRU1FTlQJCTEKKworLyogU2V0cyBvciByZXR1cm5zIGEgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgYnVmZmVyLiAqLworc3RydWN0IGRybV9hbWRncHVfZ2VtX29wIHsKKwkvKiogR0VNIG9iamVjdCBoYW5kbGUgKi8KKwlfX3UzMgloYW5kbGU7CisJLyoqIEFNREdQVV9HRU1fT1BfKiAqLworCV9fdTMyCW9wOworCS8qKiBJbnB1dCBvciByZXR1cm4gdmFsdWUgKi8KKwlfX3U2NAl2YWx1ZTsKK307CisKKyNkZWZpbmUgQU1ER1BVX1ZBX09QX01BUAkJCTEKKyNkZWZpbmUgQU1ER1BVX1ZBX09QX1VOTUFQCQkJMgorI2RlZmluZSBBTURHUFVfVkFfT1BfQ0xFQVIJCQkzCisjZGVmaW5lIEFNREdQVV9WQV9PUF9SRVBMQUNFCQkJNAorCisvKiBEZWxheSB0aGUgcGFnZSB0YWJsZSB1cGRhdGUgdGlsbCB0aGUgbmV4dCBDUyAqLworI2RlZmluZSBBTURHUFVfVk1fREVMQVlfVVBEQVRFCQkoMSA8PCAwKQorCisvKiBNYXBwaW5nIGZsYWdzICovCisvKiByZWFkYWJsZSBtYXBwaW5nICovCisjZGVmaW5lIEFNREdQVV9WTV9QQUdFX1JFQURBQkxFCQkoMSA8PCAxKQorLyogd3JpdGFibGUgbWFwcGluZyAqLworI2RlZmluZSBBTURHUFVfVk1fUEFHRV9XUklURUFCTEUJKDEgPDwgMikKKy8qIGV4ZWN1dGFibGUgbWFwcGluZywgbmV3IGZvciBWSSAqLworI2RlZmluZSBBTURHUFVfVk1fUEFHRV9FWEVDVVRBQkxFCSgxIDw8IDMpCisvKiBwYXJ0aWFsbHkgcmVzaWRlbnQgdGV4dHVyZSAqLworI2RlZmluZSBBTURHUFVfVk1fUEFHRV9QUlQJCSgxIDw8IDQpCisvKiBNVFlQRSBmbGFncyB1c2UgYml0IDUgdG8gOCAqLworI2RlZmluZSBBTURHUFVfVk1fTVRZUEVfTUFTSwkJKDB4ZiA8PCA1KQorLyogRGVmYXVsdCBNVFlQRS4gUHJlLUFJIG11c3QgdXNlIHRoaXMuICBSZWNvbW1lbmRlZCBmb3IgbmV3ZXIgQVNJQ3MuICovCisjZGVmaW5lIEFNREdQVV9WTV9NVFlQRV9ERUZBVUxUCQkoMCA8PCA1KQorLyogVXNlIE5DIE1UWVBFIGluc3RlYWQgb2YgZGVmYXVsdCBNVFlQRSAqLworI2RlZmluZSBBTURHUFVfVk1fTVRZUEVfTkMJCSgxIDw8IDUpCisvKiBVc2UgV0MgTVRZUEUgaW5zdGVhZCBvZiBkZWZhdWx0IE1UWVBFICovCisjZGVmaW5lIEFNREdQVV9WTV9NVFlQRV9XQwkJKDIgPDwgNSkKKy8qIFVzZSBDQyBNVFlQRSBpbnN0ZWFkIG9mIGRlZmF1bHQgTVRZUEUgKi8KKyNkZWZpbmUgQU1ER1BVX1ZNX01UWVBFX0NDCQkoMyA8PCA1KQorLyogVXNlIFVDIE1UWVBFIGluc3RlYWQgb2YgZGVmYXVsdCBNVFlQRSAqLworI2RlZmluZSBBTURHUFVfVk1fTVRZUEVfVUMJCSg0IDw8IDUpCisKK3N0cnVjdCBkcm1fYW1kZ3B1X2dlbV92YSB7CisJLyoqIEdFTSBvYmplY3QgaGFuZGxlICovCisJX191MzIgaGFuZGxlOworCV9fdTMyIF9wYWQ7CisJLyoqIEFNREdQVV9WQV9PUF8qICovCisJX191MzIgb3BlcmF0aW9uOworCS8qKiBBTURHUFVfVk1fUEFHRV8qICovCisJX191MzIgZmxhZ3M7CisJLyoqIHZhIGFkZHJlc3MgdG8gYXNzaWduIC4gTXVzdCBiZSBjb3JyZWN0bHkgYWxpZ25lZC4qLworCV9fdTY0IHZhX2FkZHJlc3M7CisJLyoqIFNwZWNpZnkgb2Zmc2V0IGluc2lkZSBvZiBCTyB0byBhc3NpZ24uIE11c3QgYmUgY29ycmVjdGx5IGFsaWduZWQuKi8KKwlfX3U2NCBvZmZzZXRfaW5fYm87CisJLyoqIFNwZWNpZnkgbWFwcGluZyBzaXplLiBNdXN0IGJlIGNvcnJlY3RseSBhbGlnbmVkLiAqLworCV9fdTY0IG1hcF9zaXplOworfTsKKworI2RlZmluZSBBTURHUFVfSFdfSVBfR0ZYICAgICAgICAgIDAKKyNkZWZpbmUgQU1ER1BVX0hXX0lQX0NPTVBVVEUgICAgICAxCisjZGVmaW5lIEFNREdQVV9IV19JUF9ETUEgICAgICAgICAgMgorI2RlZmluZSBBTURHUFVfSFdfSVBfVVZEICAgICAgICAgIDMKKyNkZWZpbmUgQU1ER1BVX0hXX0lQX1ZDRSAgICAgICAgICA0CisjZGVmaW5lIEFNREdQVV9IV19JUF9VVkRfRU5DICAgICAgNQorI2RlZmluZSBBTURHUFVfSFdfSVBfVkNOX0RFQyAgICAgIDYKKyNkZWZpbmUgQU1ER1BVX0hXX0lQX1ZDTl9FTkMgICAgICA3CisjZGVmaW5lIEFNREdQVV9IV19JUF9OVU0gICAgICAgICAgOAorCisjZGVmaW5lIEFNREdQVV9IV19JUF9JTlNUQU5DRV9NQVhfQ09VTlQgMQorCisjZGVmaW5lIEFNREdQVV9DSFVOS19JRF9JQgkJMHgwMQorI2RlZmluZSBBTURHUFVfQ0hVTktfSURfRkVOQ0UJCTB4MDIKKyNkZWZpbmUgQU1ER1BVX0NIVU5LX0lEX0RFUEVOREVOQ0lFUwkweDAzCisjZGVmaW5lIEFNREdQVV9DSFVOS19JRF9TWU5DT0JKX0lOICAgICAgMHgwNAorI2RlZmluZSBBTURHUFVfQ0hVTktfSURfU1lOQ09CSl9PVVQgICAgIDB4MDUKKworc3RydWN0IGRybV9hbWRncHVfY3NfY2h1bmsgeworCV9fdTMyCQljaHVua19pZDsKKwlfX3UzMgkJbGVuZ3RoX2R3OworCV9fdTY0CQljaHVua19kYXRhOworfTsKKworc3RydWN0IGRybV9hbWRncHVfY3NfaW4geworCS8qKiBSZW5kZXJpbmcgY29udGV4dCBpZCAqLworCV9fdTMyCQljdHhfaWQ7CisJLyoqICBIYW5kbGUgb2YgcmVzb3VyY2UgbGlzdCBhc3NvY2lhdGVkIHdpdGggQ1MgKi8KKwlfX3UzMgkJYm9fbGlzdF9oYW5kbGU7CisJX191MzIJCW51bV9jaHVua3M7CisJX191MzIJCV9wYWQ7CisJLyoqIHRoaXMgcG9pbnRzIHRvIF9fdTY0ICogd2hpY2ggcG9pbnQgdG8gY3MgY2h1bmtzICovCisJX191NjQJCWNodW5rczsKK307CisKK3N0cnVjdCBkcm1fYW1kZ3B1X2NzX291dCB7CisJX191NjQgaGFuZGxlOworfTsKKwordW5pb24gZHJtX2FtZGdwdV9jcyB7CisJc3RydWN0IGRybV9hbWRncHVfY3NfaW4gaW47CisJc3RydWN0IGRybV9hbWRncHVfY3Nfb3V0IG91dDsKK307CisKKy8qIFNwZWNpZnkgZmxhZ3MgdG8gYmUgdXNlZCBmb3IgSUIgKi8KKworLyogVGhpcyBJQiBzaG91bGQgYmUgc3VibWl0dGVkIHRvIENFICovCisjZGVmaW5lIEFNREdQVV9JQl9GTEFHX0NFCSgxPDwwKQorCisvKiBQcmVhbWJsZSBmbGFnLCB3aGljaCBtZWFucyB0aGUgSUIgY291bGQgYmUgZHJvcHBlZCBpZiBubyBjb250ZXh0IHN3aXRjaCAqLworI2RlZmluZSBBTURHUFVfSUJfRkxBR19QUkVBTUJMRSAoMTw8MSkKKworLyogUHJlZW1wdCBmbGFnLCBJQiBzaG91bGQgc2V0IFByZV9lbmIgYml0IGlmIFBSRUVNUFQgZmxhZyBkZXRlY3RlZCAqLworI2RlZmluZSBBTURHUFVfSUJfRkxBR19QUkVFTVBUICgxPDwyKQorCitzdHJ1Y3QgZHJtX2FtZGdwdV9jc19jaHVua19pYiB7CisJX191MzIgX3BhZDsKKwkvKiogQU1ER1BVX0lCX0ZMQUdfKiAqLworCV9fdTMyIGZsYWdzOworCS8qKiBWaXJ0dWFsIGFkZHJlc3MgdG8gYmVnaW4gSUIgZXhlY3V0aW9uICovCisJX191NjQgdmFfc3RhcnQ7CisJLyoqIFNpemUgb2Ygc3VibWlzc2lvbiAqLworCV9fdTMyIGliX2J5dGVzOworCS8qKiBIVyBJUCB0byBzdWJtaXQgdG8gKi8KKwlfX3UzMiBpcF90eXBlOworCS8qKiBIVyBJUCBpbmRleCBvZiB0aGUgc2FtZSB0eXBlIHRvIHN1Ym1pdCB0byAgKi8KKwlfX3UzMiBpcF9pbnN0YW5jZTsKKwkvKiogUmluZyBpbmRleCB0byBzdWJtaXQgdG8gKi8KKwlfX3UzMiByaW5nOworfTsKKworc3RydWN0IGRybV9hbWRncHVfY3NfY2h1bmtfZGVwIHsKKwlfX3UzMiBpcF90eXBlOworCV9fdTMyIGlwX2luc3RhbmNlOworCV9fdTMyIHJpbmc7CisJX191MzIgY3R4X2lkOworCV9fdTY0IGhhbmRsZTsKK307CisKK3N0cnVjdCBkcm1fYW1kZ3B1X2NzX2NodW5rX2ZlbmNlIHsKKwlfX3UzMiBoYW5kbGU7CisJX191MzIgb2Zmc2V0OworfTsKKworc3RydWN0IGRybV9hbWRncHVfY3NfY2h1bmtfc2VtIHsKKwlfX3UzMiBoYW5kbGU7Cit9OworCisjZGVmaW5lIEFNREdQVV9GRU5DRV9UT19IQU5ETEVfR0VUX1NZTkNPQkoJMAorI2RlZmluZSBBTURHUFVfRkVOQ0VfVE9fSEFORExFX0dFVF9TWU5DT0JKX0ZECTEKKyNkZWZpbmUgQU1ER1BVX0ZFTkNFX1RPX0hBTkRMRV9HRVRfU1lOQ19GSUxFX0ZECTIKKwordW5pb24gZHJtX2FtZGdwdV9mZW5jZV90b19oYW5kbGUgeworCXN0cnVjdCB7CisJCXN0cnVjdCBkcm1fYW1kZ3B1X2ZlbmNlIGZlbmNlOworCQlfX3UzMiB3aGF0OworCX0gaW47CisJc3RydWN0IHsKKwkJX191MzIgaGFuZGxlOworCX0gb3V0OworfTsKKworc3RydWN0IGRybV9hbWRncHVfY3NfY2h1bmtfZGF0YSB7CisJdW5pb24geworCQlzdHJ1Y3QgZHJtX2FtZGdwdV9jc19jaHVua19pYgkJaWJfZGF0YTsKKwkJc3RydWN0IGRybV9hbWRncHVfY3NfY2h1bmtfZmVuY2UJZmVuY2VfZGF0YTsKKwl9OworfTsKKworLyoqCisgKiAgUXVlcnkgaC93IGluZm86IEZsYWcgdGhhdCB0aGlzIGlzIGludGVncmF0ZWQgKGEuaC5hLiBmdXNpb24pIEdQVQorICoKKyAqLworI2RlZmluZSBBTURHUFVfSURTX0ZMQUdTX0ZVU0lPTiAgICAgICAgIDB4MQorI2RlZmluZSBBTURHUFVfSURTX0ZMQUdTX1BSRUVNUFRJT04gICAgIDB4MgorCisvKiBpbmRpY2F0ZSBpZiBhY2NlbGVyYXRpb24gY2FuIGJlIHdvcmtpbmcgKi8KKyNkZWZpbmUgQU1ER1BVX0lORk9fQUNDRUxfV09SS0lORwkJMHgwMAorLyogZ2V0IHRoZSBjcnRjX2lkIGZyb20gdGhlIG1vZGUgb2JqZWN0IGlkPyAqLworI2RlZmluZSBBTURHUFVfSU5GT19DUlRDX0ZST01fSUQJCTB4MDEKKy8qIHF1ZXJ5IGh3IElQIGluZm8gKi8KKyNkZWZpbmUgQU1ER1BVX0lORk9fSFdfSVBfSU5GTwkJCTB4MDIKKy8qIHF1ZXJ5IGh3IElQIGluc3RhbmNlIGNvdW50IGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgKi8KKyNkZWZpbmUgQU1ER1BVX0lORk9fSFdfSVBfQ09VTlQJCQkweDAzCisvKiB0aW1lc3RhbXAgZm9yIEdMX0FSQl90aW1lcl9xdWVyeSAqLworI2RlZmluZSBBTURHUFVfSU5GT19USU1FU1RBTVAJCQkweDA1CisvKiBRdWVyeSB0aGUgZmlybXdhcmUgdmVyc2lvbiAqLworI2RlZmluZSBBTURHUFVfSU5GT19GV19WRVJTSU9OCQkJMHgwZQorCS8qIFN1YnF1ZXJ5IGlkOiBRdWVyeSBWQ0UgZmlybXdhcmUgdmVyc2lvbiAqLworCSNkZWZpbmUgQU1ER1BVX0lORk9fRldfVkNFCQkweDEKKwkvKiBTdWJxdWVyeSBpZDogUXVlcnkgVVZEIGZpcm13YXJlIHZlcnNpb24gKi8KKwkjZGVmaW5lIEFNREdQVV9JTkZPX0ZXX1VWRAkJMHgyCisJLyogU3VicXVlcnkgaWQ6IFF1ZXJ5IEdNQyBmaXJtd2FyZSB2ZXJzaW9uICovCisJI2RlZmluZSBBTURHUFVfSU5GT19GV19HTUMJCTB4MDMKKwkvKiBTdWJxdWVyeSBpZDogUXVlcnkgR0ZYIE1FIGZpcm13YXJlIHZlcnNpb24gKi8KKwkjZGVmaW5lIEFNREdQVV9JTkZPX0ZXX0dGWF9NRQkJMHgwNAorCS8qIFN1YnF1ZXJ5IGlkOiBRdWVyeSBHRlggUEZQIGZpcm13YXJlIHZlcnNpb24gKi8KKwkjZGVmaW5lIEFNREdQVV9JTkZPX0ZXX0dGWF9QRlAJCTB4MDUKKwkvKiBTdWJxdWVyeSBpZDogUXVlcnkgR0ZYIENFIGZpcm13YXJlIHZlcnNpb24gKi8KKwkjZGVmaW5lIEFNREdQVV9JTkZPX0ZXX0dGWF9DRQkJMHgwNgorCS8qIFN1YnF1ZXJ5IGlkOiBRdWVyeSBHRlggUkxDIGZpcm13YXJlIHZlcnNpb24gKi8KKwkjZGVmaW5lIEFNREdQVV9JTkZPX0ZXX0dGWF9STEMJCTB4MDcKKwkvKiBTdWJxdWVyeSBpZDogUXVlcnkgR0ZYIE1FQyBmaXJtd2FyZSB2ZXJzaW9uICovCisJI2RlZmluZSBBTURHUFVfSU5GT19GV19HRlhfTUVDCQkweDA4CisJLyogU3VicXVlcnkgaWQ6IFF1ZXJ5IFNNQyBmaXJtd2FyZSB2ZXJzaW9uICovCisJI2RlZmluZSBBTURHUFVfSU5GT19GV19TTUMJCTB4MGEKKwkvKiBTdWJxdWVyeSBpZDogUXVlcnkgU0RNQSBmaXJtd2FyZSB2ZXJzaW9uICovCisJI2RlZmluZSBBTURHUFVfSU5GT19GV19TRE1BCQkweDBiCisJLyogU3VicXVlcnkgaWQ6IFF1ZXJ5IFBTUCBTT1MgZmlybXdhcmUgdmVyc2lvbiAqLworCSNkZWZpbmUgQU1ER1BVX0lORk9fRldfU09TCQkweDBjCisJLyogU3VicXVlcnkgaWQ6IFF1ZXJ5IFBTUCBBU0QgZmlybXdhcmUgdmVyc2lvbiAqLworCSNkZWZpbmUgQU1ER1BVX0lORk9fRldfQVNECQkweDBkCisvKiBudW1iZXIgb2YgYnl0ZXMgbW92ZWQgZm9yIFRUTSBtaWdyYXRpb24gKi8KKyNkZWZpbmUgQU1ER1BVX0lORk9fTlVNX0JZVEVTX01PVkVECQkweDBmCisvKiB0aGUgdXNlZCBWUkFNIHNpemUgKi8KKyNkZWZpbmUgQU1ER1BVX0lORk9fVlJBTV9VU0FHRQkJCTB4MTAKKy8qIHRoZSB1c2VkIEdUVCBzaXplICovCisjZGVmaW5lIEFNREdQVV9JTkZPX0dUVF9VU0FHRQkJCTB4MTEKKy8qIEluZm9ybWF0aW9uIGFib3V0IEdEUywgZXRjLiByZXNvdXJjZSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIEFNREdQVV9JTkZPX0dEU19DT05GSUcJCQkweDEzCisvKiBRdWVyeSBpbmZvcm1hdGlvbiBhYm91dCBWUkFNIGFuZCBHVFQgZG9tYWlucyAqLworI2RlZmluZSBBTURHUFVfSU5GT19WUkFNX0dUVAkJCTB4MTQKKy8qIFF1ZXJ5IGluZm9ybWF0aW9uIGFib3V0IHJlZ2lzdGVyIGluIE1NUiBhZGRyZXNzIHNwYWNlKi8KKyNkZWZpbmUgQU1ER1BVX0lORk9fUkVBRF9NTVJfUkVHCQkweDE1CisvKiBRdWVyeSBpbmZvcm1hdGlvbiBhYm91dCBkZXZpY2U6IHJldiBpZCwgZmFtaWx5LCBldGMuICovCisjZGVmaW5lIEFNREdQVV9JTkZPX0RFVl9JTkZPCQkJMHgxNgorLyogdmlzaWJsZSB2cmFtIHVzYWdlICovCisjZGVmaW5lIEFNREdQVV9JTkZPX1ZJU19WUkFNX1VTQUdFCQkweDE3CisvKiBudW1iZXIgb2YgVFRNIGJ1ZmZlciBldmljdGlvbnMgKi8KKyNkZWZpbmUgQU1ER1BVX0lORk9fTlVNX0VWSUNUSU9OUwkJMHgxOAorLyogUXVlcnkgbWVtb3J5IGFib3V0IFZSQU0gYW5kIEdUVCBkb21haW5zICovCisjZGVmaW5lIEFNREdQVV9JTkZPX01FTU9SWQkJCTB4MTkKKy8qIFF1ZXJ5IHZjZSBjbG9jayB0YWJsZSAqLworI2RlZmluZSBBTURHUFVfSU5GT19WQ0VfQ0xPQ0tfVEFCTEUJCTB4MUEKKy8qIFF1ZXJ5IHZiaW9zIHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgQU1ER1BVX0lORk9fVkJJT1MJCQkweDFCCisJLyogU3VicXVlcnkgaWQ6IFF1ZXJ5IHZiaW9zIHNpemUgKi8KKwkjZGVmaW5lIEFNREdQVV9JTkZPX1ZCSU9TX1NJWkUJCTB4MQorCS8qIFN1YnF1ZXJ5IGlkOiBRdWVyeSB2YmlvcyBpbWFnZSAqLworCSNkZWZpbmUgQU1ER1BVX0lORk9fVkJJT1NfSU1BR0UJCTB4MgorLyogUXVlcnkgVVZEIGhhbmRsZXMgKi8KKyNkZWZpbmUgQU1ER1BVX0lORk9fTlVNX0hBTkRMRVMJCQkweDFDCisvKiBRdWVyeSBzZW5zb3IgcmVsYXRlZCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBBTURHUFVfSU5GT19TRU5TT1IJCQkweDFECisJLyogU3VicXVlcnkgaWQ6IFF1ZXJ5IEdQVSBzaGFkZXIgY2xvY2sgKi8KKwkjZGVmaW5lIEFNREdQVV9JTkZPX1NFTlNPUl9HRlhfU0NMSwkJMHgxCisJLyogU3VicXVlcnkgaWQ6IFF1ZXJ5IEdQVSBtZW1vcnkgY2xvY2sgKi8KKwkjZGVmaW5lIEFNREdQVV9JTkZPX1NFTlNPUl9HRlhfTUNMSwkJMHgyCisJLyogU3VicXVlcnkgaWQ6IFF1ZXJ5IEdQVSB0ZW1wZXJhdHVyZSAqLworCSNkZWZpbmUgQU1ER1BVX0lORk9fU0VOU09SX0dQVV9URU1QCQkweDMKKwkvKiBTdWJxdWVyeSBpZDogUXVlcnkgR1BVIGxvYWQgKi8KKwkjZGVmaW5lIEFNREdQVV9JTkZPX1NFTlNPUl9HUFVfTE9BRAkJMHg0CisJLyogU3VicXVlcnkgaWQ6IFF1ZXJ5IGF2ZXJhZ2UgR1BVIHBvd2VyCSovCisJI2RlZmluZSBBTURHUFVfSU5GT19TRU5TT1JfR1BVX0FWR19QT1dFUgkweDUKKwkvKiBTdWJxdWVyeSBpZDogUXVlcnkgbm9ydGhicmlkZ2Ugdm9sdGFnZSAqLworCSNkZWZpbmUgQU1ER1BVX0lORk9fU0VOU09SX1ZERE5CCQkweDYKKwkvKiBTdWJxdWVyeSBpZDogUXVlcnkgZ3JhcGhpY3Mgdm9sdGFnZSAqLworCSNkZWZpbmUgQU1ER1BVX0lORk9fU0VOU09SX1ZEREdGWAkJMHg3CisvKiBOdW1iZXIgb2YgVlJBTSBwYWdlIGZhdWx0cyBvbiBDUFUgYWNjZXNzLiAqLworI2RlZmluZSBBTURHUFVfSU5GT19OVU1fVlJBTV9DUFVfUEFHRV9GQVVMVFMJMHgxRQorCisjZGVmaW5lIEFNREdQVV9JTkZPX01NUl9TRV9JTkRFWF9TSElGVAkwCisjZGVmaW5lIEFNREdQVV9JTkZPX01NUl9TRV9JTkRFWF9NQVNLCTB4ZmYKKyNkZWZpbmUgQU1ER1BVX0lORk9fTU1SX1NIX0lOREVYX1NISUZUCTgKKyNkZWZpbmUgQU1ER1BVX0lORk9fTU1SX1NIX0lOREVYX01BU0sJMHhmZgorCitzdHJ1Y3QgZHJtX2FtZGdwdV9xdWVyeV9mdyB7CisJLyoqIEFNREdQVV9JTkZPX0ZXXyogKi8KKwlfX3UzMiBmd190eXBlOworCS8qKgorCSAqIEluZGV4IG9mIHRoZSBJUCBpZiB0aGVyZSBhcmUgbW9yZSBJUHMgb2YKKwkgKiB0aGUgc2FtZSB0eXBlLgorCSAqLworCV9fdTMyIGlwX2luc3RhbmNlOworCS8qKgorCSAqIEluZGV4IG9mIHRoZSBlbmdpbmUuIFdoZXRoZXIgdGhpcyBpcyB1c2VkIGRlcGVuZHMKKwkgKiBvbiB0aGUgZmlybXdhcmUgdHlwZS4gKGUuZy4gTUVDLCBTRE1BKQorCSAqLworCV9fdTMyIGluZGV4OworCV9fdTMyIF9wYWQ7Cit9OworCisvKiBJbnB1dCBzdHJ1Y3R1cmUgZm9yIHRoZSBJTkZPIGlvY3RsICovCitzdHJ1Y3QgZHJtX2FtZGdwdV9pbmZvIHsKKwkvKiBXaGVyZSB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgc3RvcmVkICovCisJX191NjQgcmV0dXJuX3BvaW50ZXI7CisJLyogVGhlIHNpemUgb2YgdGhlIHJldHVybiB2YWx1ZS4gSnVzdCBsaWtlICJzaXplIiBpbiAic25wcmludGYiLAorCSAqIGl0IGxpbWl0cyBob3cgbWFueSBieXRlcyB0aGUga2VybmVsIGNhbiB3cml0ZS4gKi8KKwlfX3UzMiByZXR1cm5fc2l6ZTsKKwkvKiBUaGUgcXVlcnkgcmVxdWVzdCBpZC4gKi8KKwlfX3UzMiBxdWVyeTsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTMyIGlkOworCQkJX191MzIgX3BhZDsKKwkJfSBtb2RlX2NydGM7CisKKwkJc3RydWN0IHsKKwkJCS8qKiBBTURHUFVfSFdfSVBfKiAqLworCQkJX191MzIgdHlwZTsKKwkJCS8qKgorCQkJICogSW5kZXggb2YgdGhlIElQIGlmIHRoZXJlIGFyZSBtb3JlIElQcyBvZiB0aGUgc2FtZQorCQkJICogdHlwZS4gSWdub3JlZCBieSBBTURHUFVfSU5GT19IV19JUF9DT1VOVC4KKwkJCSAqLworCQkJX191MzIgaXBfaW5zdGFuY2U7CisJCX0gcXVlcnlfaHdfaXA7CisKKwkJc3RydWN0IHsKKwkJCV9fdTMyIGR3b3JkX29mZnNldDsKKwkJCS8qKiBudW1iZXIgb2YgcmVnaXN0ZXJzIHRvIHJlYWQgKi8KKwkJCV9fdTMyIGNvdW50OworCQkJX191MzIgaW5zdGFuY2U7CisJCQkvKiogRm9yIGZ1dHVyZSB1c2UsIG5vIGZsYWdzIGRlZmluZWQgc28gZmFyICovCisJCQlfX3UzMiBmbGFnczsKKwkJfSByZWFkX21tcl9yZWc7CisKKwkJc3RydWN0IGRybV9hbWRncHVfcXVlcnlfZncgcXVlcnlfZnc7CisKKwkJc3RydWN0IHsKKwkJCV9fdTMyIHR5cGU7CisJCQlfX3UzMiBvZmZzZXQ7CisJCX0gdmJpb3NfaW5mbzsKKworCQlzdHJ1Y3QgeworCQkJX191MzIgdHlwZTsKKwkJfSBzZW5zb3JfaW5mbzsKKwl9OworfTsKKworc3RydWN0IGRybV9hbWRncHVfaW5mb19nZHMgeworCS8qKiBHRFMgR0ZYIHBhcnRpdGlvbiBzaXplICovCisJX191MzIgZ2RzX2dmeF9wYXJ0aXRpb25fc2l6ZTsKKwkvKiogR0RTIGNvbXB1dGUgcGFydGl0aW9uIHNpemUgKi8KKwlfX3UzMiBjb21wdXRlX3BhcnRpdGlvbl9zaXplOworCS8qKiB0b3RhbCBHRFMgbWVtb3J5IHNpemUgKi8KKwlfX3UzMiBnZHNfdG90YWxfc2l6ZTsKKwkvKiogR1dTIHNpemUgcGVyIEdGWCBwYXJ0aXRpb24gKi8KKwlfX3UzMiBnd3NfcGVyX2dmeF9wYXJ0aXRpb247CisJLyoqIEdTVyBzaXplIHBlciBjb21wdXRlIHBhcnRpdGlvbiAqLworCV9fdTMyIGd3c19wZXJfY29tcHV0ZV9wYXJ0aXRpb247CisJLyoqIE9BIHNpemUgcGVyIEdGWCBwYXJ0aXRpb24gKi8KKwlfX3UzMiBvYV9wZXJfZ2Z4X3BhcnRpdGlvbjsKKwkvKiogT0Egc2l6ZSBwZXIgY29tcHV0ZSBwYXJ0aXRpb24gKi8KKwlfX3UzMiBvYV9wZXJfY29tcHV0ZV9wYXJ0aXRpb247CisJX191MzIgX3BhZDsKK307CisKK3N0cnVjdCBkcm1fYW1kZ3B1X2luZm9fdnJhbV9ndHQgeworCV9fdTY0IHZyYW1fc2l6ZTsKKwlfX3U2NCB2cmFtX2NwdV9hY2Nlc3NpYmxlX3NpemU7CisJX191NjQgZ3R0X3NpemU7Cit9OworCitzdHJ1Y3QgZHJtX2FtZGdwdV9oZWFwX2luZm8geworCS8qKiBtYXguIHBoeXNpY2FsIG1lbW9yeSAqLworCV9fdTY0IHRvdGFsX2hlYXBfc2l6ZTsKKworCS8qKiBUaGVvcmV0aWNhbCBtYXguIGF2YWlsYWJsZSBtZW1vcnkgaW4gdGhlIGdpdmVuIGhlYXAgKi8KKwlfX3U2NCB1c2FibGVfaGVhcF9zaXplOworCisJLyoqCisJICogTnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBpbiB0aGUgaGVhcC4gVGhpcyBpbmNsdWRlcyBhbGwgcHJvY2Vzc2VzCisJICogYW5kIHByaXZhdGUgYWxsb2NhdGlvbnMgaW4gdGhlIGtlcm5lbC4gSXQgY2hhbmdlcyB3aGVuIG5ldyBidWZmZXJzCisJICogYXJlIGFsbG9jYXRlZCwgZnJlZWQsIGFuZCBtb3ZlZC4gSXQgY2Fubm90IGJlIGxhcmdlciB0aGFuCisJICogaGVhcF9zaXplLgorCSAqLworCV9fdTY0IGhlYXBfdXNhZ2U7CisKKwkvKioKKwkgKiBUaGVvcmV0aWNhbCBwb3NzaWJsZSBtYXguIHNpemUgb2YgYnVmZmVyIHdoaWNoCisJICogY291bGQgYmUgYWxsb2NhdGVkIGluIHRoZSBnaXZlbiBoZWFwCisJICovCisJX191NjQgbWF4X2FsbG9jYXRpb247Cit9OworCitzdHJ1Y3QgZHJtX2FtZGdwdV9tZW1vcnlfaW5mbyB7CisJc3RydWN0IGRybV9hbWRncHVfaGVhcF9pbmZvIHZyYW07CisJc3RydWN0IGRybV9hbWRncHVfaGVhcF9pbmZvIGNwdV9hY2Nlc3NpYmxlX3ZyYW07CisJc3RydWN0IGRybV9hbWRncHVfaGVhcF9pbmZvIGd0dDsKK307CisKK3N0cnVjdCBkcm1fYW1kZ3B1X2luZm9fZmlybXdhcmUgeworCV9fdTMyIHZlcjsKKwlfX3UzMiBmZWF0dXJlOworfTsKKworI2RlZmluZSBBTURHUFVfVlJBTV9UWVBFX1VOS05PV04gMAorI2RlZmluZSBBTURHUFVfVlJBTV9UWVBFX0dERFIxIDEKKyNkZWZpbmUgQU1ER1BVX1ZSQU1fVFlQRV9ERFIyICAyCisjZGVmaW5lIEFNREdQVV9WUkFNX1RZUEVfR0REUjMgMworI2RlZmluZSBBTURHUFVfVlJBTV9UWVBFX0dERFI0IDQKKyNkZWZpbmUgQU1ER1BVX1ZSQU1fVFlQRV9HRERSNSA1CisjZGVmaW5lIEFNREdQVV9WUkFNX1RZUEVfSEJNICAgNgorI2RlZmluZSBBTURHUFVfVlJBTV9UWVBFX0REUjMgIDcKKworc3RydWN0IGRybV9hbWRncHVfaW5mb19kZXZpY2UgeworCS8qKiBQQ0kgRGV2aWNlIElEICovCisJX191MzIgZGV2aWNlX2lkOworCS8qKiBJbnRlcm5hbCBjaGlwIHJldmlzaW9uOiBBMCwgQTEsIGV0Yy4pICovCisJX191MzIgY2hpcF9yZXY7CisJX191MzIgZXh0ZXJuYWxfcmV2OworCS8qKiBSZXZpc2lvbiBpZCBpbiBQQ0kgQ29uZmlnIHNwYWNlICovCisJX191MzIgcGNpX3JldjsKKwlfX3UzMiBmYW1pbHk7CisJX191MzIgbnVtX3NoYWRlcl9lbmdpbmVzOworCV9fdTMyIG51bV9zaGFkZXJfYXJyYXlzX3Blcl9lbmdpbmU7CisJLyogaW4gS0h6ICovCisJX191MzIgZ3B1X2NvdW50ZXJfZnJlcTsKKwlfX3U2NCBtYXhfZW5naW5lX2Nsb2NrOworCV9fdTY0IG1heF9tZW1vcnlfY2xvY2s7CisJLyogY3UgaW5mb3JtYXRpb24gKi8KKwlfX3UzMiBjdV9hY3RpdmVfbnVtYmVyOworCS8qIE5PVEU6IGN1X2FvX21hc2sgaXMgSU5WQUxJRCwgRE9OJ1QgdXNlIGl0ICovCisJX191MzIgY3VfYW9fbWFzazsKKwlfX3UzMiBjdV9iaXRtYXBbNF1bNF07CisJLyoqIFJlbmRlciBiYWNrZW5kIHBpcGUgbWFzay4gT25lIHJlbmRlciBiYWNrZW5kIGlzIENCK0RCLiAqLworCV9fdTMyIGVuYWJsZWRfcmJfcGlwZXNfbWFzazsKKwlfX3UzMiBudW1fcmJfcGlwZXM7CisJX191MzIgbnVtX2h3X2dmeF9jb250ZXh0czsKKwlfX3UzMiBfcGFkOworCV9fdTY0IGlkc19mbGFnczsKKwkvKiogU3RhcnRpbmcgdmlydHVhbCBhZGRyZXNzIGZvciBVTURzLiAqLworCV9fdTY0IHZpcnR1YWxfYWRkcmVzc19vZmZzZXQ7CisJLyoqIFRoZSBtYXhpbXVtIHZpcnR1YWwgYWRkcmVzcyAqLworCV9fdTY0IHZpcnR1YWxfYWRkcmVzc19tYXg7CisJLyoqIFJlcXVpcmVkIGFsaWdubWVudCBvZiB2aXJ0dWFsIGFkZHJlc3Nlcy4gKi8KKwlfX3UzMiB2aXJ0dWFsX2FkZHJlc3NfYWxpZ25tZW50OworCS8qKiBQYWdlIHRhYmxlIGVudHJ5IC0gZnJhZ21lbnQgc2l6ZSAqLworCV9fdTMyIHB0ZV9mcmFnbWVudF9zaXplOworCV9fdTMyIGdhcnRfcGFnZV9zaXplOworCS8qKiBjb25zdGFudCBlbmdpbmUgcmFtIHNpemUqLworCV9fdTMyIGNlX3JhbV9zaXplOworCS8qKiB2aWRlbyBtZW1vcnkgdHlwZSBpbmZvKi8KKwlfX3UzMiB2cmFtX3R5cGU7CisJLyoqIHZpZGVvIG1lbW9yeSBiaXQgd2lkdGgqLworCV9fdTMyIHZyYW1fYml0X3dpZHRoOworCS8qIHZjZSBoYXJ2ZXN0aW5nIGluc3RhbmNlICovCisJX191MzIgdmNlX2hhcnZlc3RfY29uZmlnOworCS8qIGdmeCBkb3VibGUgb2ZmY2hpcCBMRFMgYnVmZmVycyAqLworCV9fdTMyIGdjX2RvdWJsZV9vZmZjaGlwX2xkc19idWY7CisJLyogTkdHIFByaW1pdGl2ZSBCdWZmZXIgKi8KKwlfX3U2NCBwcmltX2J1Zl9ncHVfYWRkcjsKKwkvKiBOR0cgUG9zaXRpb24gQnVmZmVyICovCisJX191NjQgcG9zX2J1Zl9ncHVfYWRkcjsKKwkvKiBOR0cgQ29udHJvbCBTaWRlYmFuZCAqLworCV9fdTY0IGNudGxfc2JfYnVmX2dwdV9hZGRyOworCS8qIE5HRyBQYXJhbWV0ZXIgQ2FjaGUgKi8KKwlfX3U2NCBwYXJhbV9idWZfZ3B1X2FkZHI7CisJX191MzIgcHJpbV9idWZfc2l6ZTsKKwlfX3UzMiBwb3NfYnVmX3NpemU7CisJX191MzIgY250bF9zYl9idWZfc2l6ZTsKKwlfX3UzMiBwYXJhbV9idWZfc2l6ZTsKKwkvKiB3YXZlZnJvbnQgc2l6ZSovCisJX191MzIgd2F2ZV9mcm9udF9zaXplOworCS8qIHNoYWRlciB2aXNpYmxlIHZncHJzKi8KKwlfX3UzMiBudW1fc2hhZGVyX3Zpc2libGVfdmdwcnM7CisJLyogQ1UgcGVyIHNoYWRlciBhcnJheSovCisJX191MzIgbnVtX2N1X3Blcl9zaDsKKwkvKiBudW1iZXIgb2YgdGNjIGJsb2NrcyovCisJX191MzIgbnVtX3RjY19ibG9ja3M7CisJLyogZ3Mgdmd0IHRhYmxlIGRlcHRoKi8KKwlfX3UzMiBnc192Z3RfdGFibGVfZGVwdGg7CisJLyogZ3MgcHJpbWl0aXZlIGJ1ZmZlciBkZXB0aCovCisJX191MzIgZ3NfcHJpbV9idWZmZXJfZGVwdGg7CisJLyogbWF4IGdzIHdhdmVmcm9udCBwZXIgdmd0Ki8KKwlfX3UzMiBtYXhfZ3Nfd2F2ZXNfcGVyX3ZndDsKKwlfX3UzMiBfcGFkMTsKKwkvKiBhbHdheXMgb24gY3UgYml0bWFwICovCisJX191MzIgY3VfYW9fYml0bWFwWzRdWzRdOworfTsKKworc3RydWN0IGRybV9hbWRncHVfaW5mb19od19pcCB7CisJLyoqIFZlcnNpb24gb2YgaC93IElQICovCisJX191MzIgIGh3X2lwX3ZlcnNpb25fbWFqb3I7CisJX191MzIgIGh3X2lwX3ZlcnNpb25fbWlub3I7CisJLyoqIENhcGFiaWxpdGllcyAqLworCV9fdTY0ICBjYXBhYmlsaXRpZXNfZmxhZ3M7CisJLyoqIGNvbW1hbmQgYnVmZmVyIGFkZHJlc3Mgc3RhcnQgYWxpZ25tZW50Ki8KKwlfX3UzMiAgaWJfc3RhcnRfYWxpZ25tZW50OworCS8qKiBjb21tYW5kIGJ1ZmZlciBzaXplIGFsaWdubWVudCovCisJX191MzIgIGliX3NpemVfYWxpZ25tZW50OworCS8qKiBCaXRtYXNrIG9mIGF2YWlsYWJsZSByaW5ncy4gQml0IDAgbWVhbnMgcmluZyAwLCBldGMuICovCisJX191MzIgIGF2YWlsYWJsZV9yaW5nczsKKwlfX3UzMiAgX3BhZDsKK307CisKK3N0cnVjdCBkcm1fYW1kZ3B1X2luZm9fbnVtX2hhbmRsZXMgeworCS8qKiBNYXggaGFuZGxlcyBhcyBzdXBwb3J0ZWQgYnkgZmlybXdhcmUgZm9yIFVWRCAqLworCV9fdTMyICB1dmRfbWF4X2hhbmRsZXM7CisJLyoqIEhhbmRsZXMgY3VycmVudGx5IGluIHVzZSBmb3IgVVZEICovCisJX191MzIgIHV2ZF91c2VkX2hhbmRsZXM7Cit9OworCisjZGVmaW5lIEFNREdQVV9WQ0VfQ0xPQ0tfVEFCTEVfRU5UUklFUwkJNgorCitzdHJ1Y3QgZHJtX2FtZGdwdV9pbmZvX3ZjZV9jbG9ja190YWJsZV9lbnRyeSB7CisJLyoqIFN5c3RlbSBjbG9jayAqLworCV9fdTMyIHNjbGs7CisJLyoqIE1lbW9yeSBjbG9jayAqLworCV9fdTMyIG1jbGs7CisJLyoqIFZDRSBjbG9jayAqLworCV9fdTMyIGVjbGs7CisJX191MzIgcGFkOworfTsKKworc3RydWN0IGRybV9hbWRncHVfaW5mb192Y2VfY2xvY2tfdGFibGUgeworCXN0cnVjdCBkcm1fYW1kZ3B1X2luZm9fdmNlX2Nsb2NrX3RhYmxlX2VudHJ5IGVudHJpZXNbQU1ER1BVX1ZDRV9DTE9DS19UQUJMRV9FTlRSSUVTXTsKKwlfX3UzMiBudW1fdmFsaWRfZW50cmllczsKKwlfX3UzMiBwYWQ7Cit9OworCisvKgorICogU3VwcG9ydGVkIEdQVSBmYW1pbGllcworICovCisjZGVmaW5lIEFNREdQVV9GQU1JTFlfVU5LTk9XTgkJCTAKKyNkZWZpbmUgQU1ER1BVX0ZBTUlMWV9TSQkJCTExMCAvKiBIYWluYW4sIE9sYW5kLCBWZXJkZSwgUGl0Y2Fpcm4sIFRhaGl0aSAqLworI2RlZmluZSBBTURHUFVfRkFNSUxZX0NJCQkJMTIwIC8qIEJvbmFpcmUsIEhhd2FpaSAqLworI2RlZmluZSBBTURHUFVfRkFNSUxZX0tWCQkJMTI1IC8qIEthdmVyaSwgS2FiaW5pLCBNdWxsaW5zICovCisjZGVmaW5lIEFNREdQVV9GQU1JTFlfVkkJCQkxMzAgLyogSWNlbGFuZCwgVG9uZ2EgKi8KKyNkZWZpbmUgQU1ER1BVX0ZBTUlMWV9DWgkJCTEzNSAvKiBDYXJyaXpvLCBTdG9uZXkgKi8KKyNkZWZpbmUgQU1ER1BVX0ZBTUlMWV9BSQkJCTE0MSAvKiBWZWdhMTAgKi8KKyNkZWZpbmUgQU1ER1BVX0ZBTUlMWV9SVgkJCTE0MiAvKiBSYXZlbiAqLworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybS5oIGIvaW5jbHVkZS9kcm0vZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZiOGVmYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL2RybS5oCkBAIC0wLDAgKzEsOTUyIEBACisvKioKKyAqIFxmaWxlIGRybS5oCisgKiBIZWFkZXIgZm9yIHRoZSBEaXJlY3QgUmVuZGVyaW5nIE1hbmFnZXIKKyAqCisgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICoKKyAqIFxwYXIgQWNrbm93bGVkZ21lbnRzOgorICogRGVjIDE5OTksIFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdHdpZGRsZS5uZXQ+LCBtb3ZlIHRvIGdlbmVyaWMgXGMgY21weGNoZy4KKyAqLworCisvKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9EUk1fSF8KKyNkZWZpbmUgX0RSTV9IXworCisjaWYgICBkZWZpbmVkKF9fbGludXhfXykKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lvY3RsLmg+Cit0eXBlZGVmIHVuc2lnbmVkIGludCBkcm1faGFuZGxlX3Q7CisKKyNlbHNlIC8qIE9uZSBvZiB0aGUgQlNEcyAqLworCisjaW5jbHVkZSA8c3lzL2lvY2NvbS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgordHlwZWRlZiBpbnQ4X3QgICBfX3M4OwordHlwZWRlZiB1aW50OF90ICBfX3U4OwordHlwZWRlZiBpbnQxNl90ICBfX3MxNjsKK3R5cGVkZWYgdWludDE2X3QgX191MTY7Cit0eXBlZGVmIGludDMyX3QgIF9fczMyOwordHlwZWRlZiB1aW50MzJfdCBfX3UzMjsKK3R5cGVkZWYgaW50NjRfdCAgX19zNjQ7Cit0eXBlZGVmIHVpbnQ2NF90IF9fdTY0OwordHlwZWRlZiBzaXplX3QgICBfX2tlcm5lbF9zaXplX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZHJtX2hhbmRsZV90OworCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIERSTV9OQU1FCSJkcm0iCSAgLyoqPCBOYW1lIGluIGtlcm5lbCwgL2RldiwgYW5kIC9wcm9jICovCisjZGVmaW5lIERSTV9NSU5fT1JERVIJNQkgIC8qKjwgQXQgbGVhc3QgMl41IGJ5dGVzID0gMzIgYnl0ZXMgKi8KKyNkZWZpbmUgRFJNX01BWF9PUkRFUgkyMgkgIC8qKjwgVXAgdG8gMl4yMiBieXRlcyA9IDRNQiAqLworI2RlZmluZSBEUk1fUkFNX1BFUkNFTlQgMTAJICAvKio8IEhvdyBtdWNoIHN5c3RlbSByYW0gY2FuIHdlIGxvY2s/ICovCisKKyNkZWZpbmUgX0RSTV9MT0NLX0hFTEQJMHg4MDAwMDAwMFUgLyoqPCBIYXJkd2FyZSBsb2NrIGlzIGhlbGQgKi8KKyNkZWZpbmUgX0RSTV9MT0NLX0NPTlQJMHg0MDAwMDAwMFUgLyoqPCBIYXJkd2FyZSBsb2NrIGlzIGNvbnRlbmRlZCAqLworI2RlZmluZSBfRFJNX0xPQ0tfSVNfSEVMRChsb2NrKQkgICAoKGxvY2spICYgX0RSTV9MT0NLX0hFTEQpCisjZGVmaW5lIF9EUk1fTE9DS19JU19DT05UKGxvY2spCSAgICgobG9jaykgJiBfRFJNX0xPQ0tfQ09OVCkKKyNkZWZpbmUgX0RSTV9MT0NLSU5HX0NPTlRFWFQobG9jaykgKChsb2NrKSAmIH4oX0RSTV9MT0NLX0hFTER8X0RSTV9MT0NLX0NPTlQpKQorCit0eXBlZGVmIHVuc2lnbmVkIGludCBkcm1fY29udGV4dF90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgZHJtX2RyYXdhYmxlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBkcm1fbWFnaWNfdDsKKworLyoqCisgKiBDbGlwcmVjdC4KKyAqCisgKiBcd2FybmluZzogSWYgeW91IGNoYW5nZSB0aGlzIHN0cnVjdHVyZSwgbWFrZSBzdXJlIHlvdSBjaGFuZ2UKKyAqIFhGODZEUklDbGlwUmVjdFJlYyBpbiB0aGUgc2VydmVyIGFzIHdlbGwKKyAqCisgKiBcbm90ZSBLVzogQWN0dWFsbHkgaXQncyBpbGxlZ2FsIHRvIGNoYW5nZSBlaXRoZXIgZm9yCisgKiBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSByZWFzb25zLgorICovCitzdHJ1Y3QgZHJtX2NsaXBfcmVjdCB7CisJdW5zaWduZWQgc2hvcnQgeDE7CisJdW5zaWduZWQgc2hvcnQgeTE7CisJdW5zaWduZWQgc2hvcnQgeDI7CisJdW5zaWduZWQgc2hvcnQgeTI7Cit9OworCisvKioKKyAqIERyYXdhYmxlIGluZm9ybWF0aW9uLgorICovCitzdHJ1Y3QgZHJtX2RyYXdhYmxlX2luZm8geworCXVuc2lnbmVkIGludCBudW1fcmVjdHM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnJlY3RzOworfTsKKworLyoqCisgKiBUZXh0dXJlIHJlZ2lvbiwKKyAqLworc3RydWN0IGRybV90ZXhfcmVnaW9uIHsKKwl1bnNpZ25lZCBjaGFyIG5leHQ7CisJdW5zaWduZWQgY2hhciBwcmV2OworCXVuc2lnbmVkIGNoYXIgaW5fdXNlOworCXVuc2lnbmVkIGNoYXIgcGFkZGluZzsKKwl1bnNpZ25lZCBpbnQgYWdlOworfTsKKworLyoqCisgKiBIYXJkd2FyZSBsb2NrLgorICoKKyAqIFRoZSBsb2NrIHN0cnVjdHVyZSBpcyBhIHNpbXBsZSBjYWNoZS1saW5lIGFsaWduZWQgaW50ZWdlci4gIFRvIGF2b2lkCisgKiBwcm9jZXNzb3IgYnVzIGNvbnRlbnRpb24gb24gYSBtdWx0aXByb2Nlc3NvciBzeXN0ZW0sIHRoZXJlIHNob3VsZCBub3QgYmUgYW55CisgKiBvdGhlciBkYXRhIHN0b3JlZCBpbiB0aGUgc2FtZSBjYWNoZSBsaW5lLgorICovCitzdHJ1Y3QgZHJtX2h3X2xvY2sgeworCV9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgbG9jazsJCS8qKjwgbG9jayB2YXJpYWJsZSAqLworCWNoYXIgcGFkZGluZ1s2MF07CQkJLyoqPCBQYWQgdG8gY2FjaGUgbGluZSAqLworfTsKKworLyoqCisgKiBEUk1fSU9DVExfVkVSU0lPTiBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1HZXRWZXJzaW9uKCkuCisgKi8KK3N0cnVjdCBkcm1fdmVyc2lvbiB7CisJaW50IHZlcnNpb25fbWFqb3I7CSAgLyoqPCBNYWpvciB2ZXJzaW9uICovCisJaW50IHZlcnNpb25fbWlub3I7CSAgLyoqPCBNaW5vciB2ZXJzaW9uICovCisJaW50IHZlcnNpb25fcGF0Y2hsZXZlbDsJICAvKio8IFBhdGNoIGxldmVsICovCisJX19rZXJuZWxfc2l6ZV90IG5hbWVfbGVuOwkgIC8qKjwgTGVuZ3RoIG9mIG5hbWUgYnVmZmVyICovCisJY2hhciAqbmFtZTsJICAvKio8IE5hbWUgb2YgZHJpdmVyICovCisJX19rZXJuZWxfc2l6ZV90IGRhdGVfbGVuOwkgIC8qKjwgTGVuZ3RoIG9mIGRhdGUgYnVmZmVyICovCisJY2hhciAqZGF0ZTsJICAvKio8IFVzZXItc3BhY2UgYnVmZmVyIHRvIGhvbGQgZGF0ZSAqLworCV9fa2VybmVsX3NpemVfdCBkZXNjX2xlbjsJICAvKio8IExlbmd0aCBvZiBkZXNjIGJ1ZmZlciAqLworCWNoYXIgKmRlc2M7CSAgLyoqPCBVc2VyLXNwYWNlIGJ1ZmZlciB0byBob2xkIGRlc2MgKi8KK307CisKKy8qKgorICogRFJNX0lPQ1RMX0dFVF9VTklRVUUgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtR2V0QnVzaWQoKSBhbmQgZHJtU2V0QnVzSWQoKS4KKyAqLworc3RydWN0IGRybV91bmlxdWUgeworCV9fa2VybmVsX3NpemVfdCB1bmlxdWVfbGVuOwkgIC8qKjwgTGVuZ3RoIG9mIHVuaXF1ZSAqLworCWNoYXIgKnVuaXF1ZTsJICAvKio8IFVuaXF1ZSBuYW1lIGZvciBkcml2ZXIgaW5zdGFudGlhdGlvbiAqLworfTsKKworc3RydWN0IGRybV9saXN0IHsKKwlpbnQgY291bnQ7CQkgIC8qKjwgTGVuZ3RoIG9mIHVzZXItc3BhY2Ugc3RydWN0dXJlcyAqLworCXN0cnVjdCBkcm1fdmVyc2lvbiAqdmVyc2lvbjsKK307CisKK3N0cnVjdCBkcm1fYmxvY2sgeworCWludCB1bnVzZWQ7Cit9OworCisvKioKKyAqIERSTV9JT0NUTF9DT05UUk9MIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUN0bEluc3RIYW5kbGVyKCkgYW5kIGRybUN0bFVuaW5zdEhhbmRsZXIoKS4KKyAqLworc3RydWN0IGRybV9jb250cm9sIHsKKwllbnVtIHsKKwkJRFJNX0FERF9DT01NQU5ELAorCQlEUk1fUk1fQ09NTUFORCwKKwkJRFJNX0lOU1RfSEFORExFUiwKKwkJRFJNX1VOSU5TVF9IQU5ETEVSCisJfSBmdW5jOworCWludCBpcnE7Cit9OworCisvKioKKyAqIFR5cGUgb2YgbWVtb3J5IHRvIG1hcC4KKyAqLworZW51bSBkcm1fbWFwX3R5cGUgeworCV9EUk1fRlJBTUVfQlVGRkVSID0gMCwJICAvKio8IFdDIChubyBjYWNoaW5nKSwgbm8gY29yZSBkdW1wICovCisJX0RSTV9SRUdJU1RFUlMgPSAxLAkgIC8qKjwgbm8gY2FjaGluZywgbm8gY29yZSBkdW1wICovCisJX0RSTV9TSE0gPSAyLAkJICAvKio8IHNoYXJlZCwgY2FjaGVkICovCisJX0RSTV9BR1AgPSAzLAkJICAvKio8IEFHUC9HQVJUICovCisJX0RSTV9TQ0FUVEVSX0dBVEhFUiA9IDQsICAvKio8IFNjYXR0ZXIvZ2F0aGVyIG1lbW9yeSBmb3IgUENJIERNQSAqLworCV9EUk1fQ09OU0lTVEVOVCA9IDUJICAvKio8IENvbnNpc3RlbnQgbWVtb3J5IGZvciBQQ0kgRE1BICovCit9OworCisvKioKKyAqIE1lbW9yeSBtYXBwaW5nIGZsYWdzLgorICovCitlbnVtIGRybV9tYXBfZmxhZ3MgeworCV9EUk1fUkVTVFJJQ1RFRCA9IDB4MDEsCSAgICAgLyoqPCBDYW5ub3QgYmUgbWFwcGVkIHRvIHVzZXItdmlydHVhbCAqLworCV9EUk1fUkVBRF9PTkxZID0gMHgwMiwKKwlfRFJNX0xPQ0tFRCA9IDB4MDQsCSAgICAgLyoqPCBzaGFyZWQsIGNhY2hlZCwgbG9ja2VkICovCisJX0RSTV9LRVJORUwgPSAweDA4LAkgICAgIC8qKjwga2VybmVsIHJlcXVpcmVzIGFjY2VzcyAqLworCV9EUk1fV1JJVEVfQ09NQklOSU5HID0gMHgxMCwgLyoqPCB1c2Ugd3JpdGUtY29tYmluaW5nIGlmIGF2YWlsYWJsZSAqLworCV9EUk1fQ09OVEFJTlNfTE9DSyA9IDB4MjAsICAgLyoqPCBTSE0gcGFnZSB0aGF0IGNvbnRhaW5zIGxvY2sgKi8KKwlfRFJNX1JFTU9WQUJMRSA9IDB4NDAsCSAgICAgLyoqPCBSZW1vdmFibGUgbWFwcGluZyAqLworCV9EUk1fRFJJVkVSID0gMHg4MAkgICAgIC8qKjwgTWFuYWdlZCBieSBkcml2ZXIgKi8KK307CisKK3N0cnVjdCBkcm1fY3R4X3ByaXZfbWFwIHsKKwl1bnNpZ25lZCBpbnQgY3R4X2lkOwkgLyoqPCBDb250ZXh0IHJlcXVlc3RpbmcgcHJpdmF0ZSBtYXBwaW5nICovCisJdm9pZCAqaGFuZGxlOwkJIC8qKjwgSGFuZGxlIG9mIG1hcCAqLworfTsKKworLyoqCisgKiBEUk1fSU9DVExfR0VUX01BUCwgRFJNX0lPQ1RMX0FERF9NQVAgYW5kIERSTV9JT0NUTF9STV9NQVAgaW9jdGxzCisgKiBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1BZGRNYXAoKS4KKyAqLworc3RydWN0IGRybV9tYXAgeworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkgLyoqPCBSZXF1ZXN0ZWQgcGh5c2ljYWwgYWRkcmVzcyAoMCBmb3IgU0FSRUEpKi8KKwl1bnNpZ25lZCBsb25nIHNpemU7CSAvKio8IFJlcXVlc3RlZCBwaHlzaWNhbCBzaXplIChieXRlcykgKi8KKwllbnVtIGRybV9tYXBfdHlwZSB0eXBlOwkgLyoqPCBUeXBlIG9mIG1lbW9yeSB0byBtYXAgKi8KKwllbnVtIGRybV9tYXBfZmxhZ3MgZmxhZ3M7CSAvKio8IEZsYWdzICovCisJdm9pZCAqaGFuZGxlOwkJIC8qKjwgVXNlci1zcGFjZTogIkhhbmRsZSIgdG8gcGFzcyB0byBtbWFwKCkgKi8KKwkJCQkgLyoqPCBLZXJuZWwtc3BhY2U6IGtlcm5lbC12aXJ0dWFsIGFkZHJlc3MgKi8KKwlpbnQgbXRycjsJCSAvKio8IE1UUlIgc2xvdCB1c2VkICovCisJLyogICBQcml2YXRlIGRhdGEgKi8KK307CisKKy8qKgorICogRFJNX0lPQ1RMX0dFVF9DTElFTlQgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLworc3RydWN0IGRybV9jbGllbnQgeworCWludCBpZHg7CQkvKio8IFdoaWNoIGNsaWVudCBkZXNpcmVkPyAqLworCWludCBhdXRoOwkJLyoqPCBJcyBjbGllbnQgYXV0aGVudGljYXRlZD8gKi8KKwl1bnNpZ25lZCBsb25nIHBpZDsJLyoqPCBQcm9jZXNzIElEICovCisJdW5zaWduZWQgbG9uZyB1aWQ7CS8qKjwgVXNlciBJRCAqLworCXVuc2lnbmVkIGxvbmcgbWFnaWM7CS8qKjwgTWFnaWMgKi8KKwl1bnNpZ25lZCBsb25nIGlvY3M7CS8qKjwgSW9jdGwgY291bnQgKi8KK307CisKK2VudW0gZHJtX3N0YXRfdHlwZSB7CisJX0RSTV9TVEFUX0xPQ0ssCisJX0RSTV9TVEFUX09QRU5TLAorCV9EUk1fU1RBVF9DTE9TRVMsCisJX0RSTV9TVEFUX0lPQ1RMUywKKwlfRFJNX1NUQVRfTE9DS1MsCisJX0RSTV9TVEFUX1VOTE9DS1MsCisJX0RSTV9TVEFUX1ZBTFVFLAkvKio8IEdlbmVyaWMgdmFsdWUgKi8KKwlfRFJNX1NUQVRfQllURSwJCS8qKjwgR2VuZXJpYyBieXRlIGNvdW50ZXIgKDEwMjRieXRlcy9LKSAqLworCV9EUk1fU1RBVF9DT1VOVCwJLyoqPCBHZW5lcmljIG5vbi1ieXRlIGNvdW50ZXIgKDEwMDAvaykgKi8KKworCV9EUk1fU1RBVF9JUlEsCQkvKio8IElSUSAqLworCV9EUk1fU1RBVF9QUklNQVJZLAkvKio8IFByaW1hcnkgRE1BIGJ5dGVzICovCisJX0RSTV9TVEFUX1NFQ09OREFSWSwJLyoqPCBTZWNvbmRhcnkgRE1BIGJ5dGVzICovCisJX0RSTV9TVEFUX0RNQSwJCS8qKjwgRE1BICovCisJX0RSTV9TVEFUX1NQRUNJQUwsCS8qKjwgU3BlY2lhbCBETUEgKGUuZy4sIHByaW9yaXR5IG9yIHBvbGxlZCkgKi8KKwlfRFJNX1NUQVRfTUlTU0VECS8qKjwgTWlzc2VkIERNQSBvcHBvcnR1bml0eSAqLworCSAgICAvKiBBZGQgdG8gdGhlICpFTkQqIG9mIHRoZSBsaXN0ICovCit9OworCisvKioKKyAqIERSTV9JT0NUTF9HRVRfU1RBVFMgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLworc3RydWN0IGRybV9zdGF0cyB7CisJdW5zaWduZWQgbG9uZyBjb3VudDsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIHZhbHVlOworCQllbnVtIGRybV9zdGF0X3R5cGUgdHlwZTsKKwl9IGRhdGFbMTVdOworfTsKKworLyoqCisgKiBIYXJkd2FyZSBsb2NraW5nIGZsYWdzLgorICovCitlbnVtIGRybV9sb2NrX2ZsYWdzIHsKKwlfRFJNX0xPQ0tfUkVBRFkgPSAweDAxLAkgICAgIC8qKjwgV2FpdCB1bnRpbCBoYXJkd2FyZSBpcyByZWFkeSBmb3IgRE1BICovCisJX0RSTV9MT0NLX1FVSUVTQ0VOVCA9IDB4MDIsICAvKio8IFdhaXQgdW50aWwgaGFyZHdhcmUgcXVpZXNjZW50ICovCisJX0RSTV9MT0NLX0ZMVVNIID0gMHgwNCwJICAgICAvKio8IEZsdXNoIHRoaXMgY29udGV4dCdzIERNQSBxdWV1ZSBmaXJzdCAqLworCV9EUk1fTE9DS19GTFVTSF9BTEwgPSAweDA4LCAgLyoqPCBGbHVzaCBhbGwgRE1BIHF1ZXVlcyBmaXJzdCAqLworCS8qIFRoZXNlICpIQUxUKiBmbGFncyBhcmVuJ3Qgc3VwcG9ydGVkIHlldAorCSAgIC0tIHRoZXkgd2lsbCBiZSB1c2VkIHRvIHN1cHBvcnQgdGhlCisJICAgZnVsbC1zY3JlZW4gREdBLWxpa2UgbW9kZS4gKi8KKwlfRFJNX0hBTFRfQUxMX1FVRVVFUyA9IDB4MTAsIC8qKjwgSGFsdCBhbGwgY3VycmVudCBhbmQgZnV0dXJlIHF1ZXVlcyAqLworCV9EUk1fSEFMVF9DVVJfUVVFVUVTID0gMHgyMCAgLyoqPCBIYWx0IGFsbCBjdXJyZW50IHF1ZXVlcyAqLworfTsKKworLyoqCisgKiBEUk1fSU9DVExfTE9DSywgRFJNX0lPQ1RMX1VOTE9DSyBhbmQgRFJNX0lPQ1RMX0ZJTklTSCBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1HZXRMb2NrKCkgYW5kIGRybVVubG9jaygpLgorICovCitzdHJ1Y3QgZHJtX2xvY2sgeworCWludCBjb250ZXh0OworCWVudW0gZHJtX2xvY2tfZmxhZ3MgZmxhZ3M7Cit9OworCisvKioKKyAqIERNQSBmbGFncworICoKKyAqIFx3YXJuaW5nCisgKiBUaGVzZSB2YWx1ZXMgXGUgbXVzdCBtYXRjaCB4Zjg2ZHJtLmguCisgKgorICogXHNhIGRybV9kbWEuCisgKi8KK2VudW0gZHJtX2RtYV9mbGFncyB7CisJLyogRmxhZ3MgZm9yIERNQSBidWZmZXIgZGlzcGF0Y2ggKi8KKwlfRFJNX0RNQV9CTE9DSyA9IDB4MDEsCSAgICAgIC8qKjwKKwkJCQkgICAgICAgKiBCbG9jayB1bnRpbCBidWZmZXIgZGlzcGF0Y2hlZC4KKwkJCQkgICAgICAgKgorCQkJCSAgICAgICAqIFxub3RlIFRoZSBidWZmZXIgbWF5IG5vdCB5ZXQgaGF2ZQorCQkJCSAgICAgICAqIGJlZW4gcHJvY2Vzc2VkIGJ5IHRoZSBoYXJkd2FyZSAtLQorCQkJCSAgICAgICAqIGdldHRpbmcgYSBoYXJkd2FyZSBsb2NrIHdpdGggdGhlCisJCQkJICAgICAgICogaGFyZHdhcmUgcXVpZXNjZW50IHdpbGwgZW5zdXJlCisJCQkJICAgICAgICogdGhhdCB0aGUgYnVmZmVyIGhhcyBiZWVuCisJCQkJICAgICAgICogcHJvY2Vzc2VkLgorCQkJCSAgICAgICAqLworCV9EUk1fRE1BX1dISUxFX0xPQ0tFRCA9IDB4MDIsIC8qKjwgRGlzcGF0Y2ggd2hpbGUgbG9jayBoZWxkICovCisJX0RSTV9ETUFfUFJJT1JJVFkgPSAweDA0LCAgICAgLyoqPCBIaWdoIHByaW9yaXR5IGRpc3BhdGNoICovCisKKwkvKiBGbGFncyBmb3IgRE1BIGJ1ZmZlciByZXF1ZXN0ICovCisJX0RSTV9ETUFfV0FJVCA9IDB4MTAsCSAgICAgIC8qKjwgV2FpdCBmb3IgZnJlZSBidWZmZXJzICovCisJX0RSTV9ETUFfU01BTExFUl9PSyA9IDB4MjAsICAgLyoqPCBTbWFsbGVyLXRoYW4tcmVxdWVzdGVkIGJ1ZmZlcnMgT0sgKi8KKwlfRFJNX0RNQV9MQVJHRVJfT0sgPSAweDQwICAgICAvKio8IExhcmdlci10aGFuLXJlcXVlc3RlZCBidWZmZXJzIE9LICovCit9OworCisvKioKKyAqIERSTV9JT0NUTF9BRERfQlVGUyBhbmQgRFJNX0lPQ1RMX01BUktfQlVGUyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1BZGRCdWZzKCkuCisgKi8KK3N0cnVjdCBkcm1fYnVmX2Rlc2MgeworCWludCBjb3VudDsJCSAvKio8IE51bWJlciBvZiBidWZmZXJzIG9mIHRoaXMgc2l6ZSAqLworCWludCBzaXplOwkJIC8qKjwgU2l6ZSBpbiBieXRlcyAqLworCWludCBsb3dfbWFyazsJCSAvKio8IExvdyB3YXRlciBtYXJrICovCisJaW50IGhpZ2hfbWFyazsJCSAvKio8IEhpZ2ggd2F0ZXIgbWFyayAqLworCWVudW0geworCQlfRFJNX1BBR0VfQUxJR04gPSAweDAxLAkvKio8IEFsaWduIG9uIHBhZ2UgYm91bmRhcmllcyBmb3IgRE1BICovCisJCV9EUk1fQUdQX0JVRkZFUiA9IDB4MDIsCS8qKjwgQnVmZmVyIGlzIGluIEFHUCBzcGFjZSAqLworCQlfRFJNX1NHX0JVRkZFUiA9IDB4MDQsCS8qKjwgU2NhdHRlci9nYXRoZXIgbWVtb3J5IGJ1ZmZlciAqLworCQlfRFJNX0ZCX0JVRkZFUiA9IDB4MDgsCS8qKjwgQnVmZmVyIGlzIGluIGZyYW1lIGJ1ZmZlciAqLworCQlfRFJNX1BDSV9CVUZGRVJfUk8gPSAweDEwIC8qKjwgTWFwIFBDSSBETUEgYnVmZmVyIHJlYWQtb25seSAqLworCX0gZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBhZ3Bfc3RhcnQ7IC8qKjwKKwkJCQkgICogU3RhcnQgYWRkcmVzcyBvZiB3aGVyZSB0aGUgQUdQIGJ1ZmZlcnMgYXJlCisJCQkJICAqIGluIHRoZSBBR1AgYXBlcnR1cmUKKwkJCQkgICovCit9OworCisvKioKKyAqIERSTV9JT0NUTF9JTkZPX0JVRlMgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLworc3RydWN0IGRybV9idWZfaW5mbyB7CisJaW50IGNvdW50OwkJLyoqPCBFbnRyaWVzIGluIGxpc3QgKi8KKwlzdHJ1Y3QgZHJtX2J1Zl9kZXNjICpsaXN0OworfTsKKworLyoqCisgKiBEUk1fSU9DVExfRlJFRV9CVUZTIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3N0cnVjdCBkcm1fYnVmX2ZyZWUgeworCWludCBjb3VudDsKKwlpbnQgKmxpc3Q7Cit9OworCisvKioKKyAqIEJ1ZmZlciBpbmZvcm1hdGlvbgorICoKKyAqIFxzYSBkcm1fYnVmX21hcC4KKyAqLworc3RydWN0IGRybV9idWZfcHViIHsKKwlpbnQgaWR4OwkJICAgICAgIC8qKjwgSW5kZXggaW50byB0aGUgbWFzdGVyIGJ1ZmZlciBsaXN0ICovCisJaW50IHRvdGFsOwkJICAgICAgIC8qKjwgQnVmZmVyIHNpemUgKi8KKwlpbnQgdXNlZDsJCSAgICAgICAvKio8IEFtb3VudCBvZiBidWZmZXIgaW4gdXNlIChmb3IgRE1BKSAqLworCXZvaWQgKmFkZHJlc3M7CSAgICAgICAvKio8IEFkZHJlc3Mgb2YgYnVmZmVyICovCit9OworCisvKioKKyAqIERSTV9JT0NUTF9NQVBfQlVGUyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICovCitzdHJ1Y3QgZHJtX2J1Zl9tYXAgeworCWludCBjb3VudDsJCS8qKjwgTGVuZ3RoIG9mIHRoZSBidWZmZXIgbGlzdCAqLworI2lmZGVmIF9fY3BsdXNwbHVzCisJdm9pZCAqdmlydDsKKyNlbHNlCisJdm9pZCAqdmlydHVhbDsJCS8qKjwgTW1hcCdkIGFyZWEgaW4gdXNlci12aXJ0dWFsICovCisjZW5kaWYKKwlzdHJ1Y3QgZHJtX2J1Zl9wdWIgKmxpc3Q7CS8qKjwgQnVmZmVyIGluZm9ybWF0aW9uICovCit9OworCisvKioKKyAqIERSTV9JT0NUTF9ETUEgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBJbmRpY2VzIGhlcmUgcmVmZXIgdG8gdGhlIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgbGlzdCBpbiBkcm1fYnVmX2dldC4KKyAqCisgKiBcc2EgZHJtRE1BKCkuCisgKi8KK3N0cnVjdCBkcm1fZG1hIHsKKwlpbnQgY29udGV4dDsJCQkgIC8qKjwgQ29udGV4dCBoYW5kbGUgKi8KKwlpbnQgc2VuZF9jb3VudDsJCQkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgdG8gc2VuZCAqLworCWludCAqc2VuZF9pbmRpY2VzOwkgIC8qKjwgTGlzdCBvZiBoYW5kbGVzIHRvIGJ1ZmZlcnMgKi8KKwlpbnQgKnNlbmRfc2l6ZXM7CQkgIC8qKjwgTGVuZ3RocyBvZiBkYXRhIHRvIHNlbmQgKi8KKwllbnVtIGRybV9kbWFfZmxhZ3MgZmxhZ3M7CSAgLyoqPCBGbGFncyAqLworCWludCByZXF1ZXN0X2NvdW50OwkJICAvKio8IE51bWJlciBvZiBidWZmZXJzIHJlcXVlc3RlZCAqLworCWludCByZXF1ZXN0X3NpemU7CQkgIC8qKjwgRGVzaXJlZCBzaXplIGZvciBidWZmZXJzICovCisJaW50ICpyZXF1ZXN0X2luZGljZXM7CSAgLyoqPCBCdWZmZXIgaW5mb3JtYXRpb24gKi8KKwlpbnQgKnJlcXVlc3Rfc2l6ZXM7CisJaW50IGdyYW50ZWRfY291bnQ7CQkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgZ3JhbnRlZCAqLworfTsKKworZW51bSBkcm1fY3R4X2ZsYWdzIHsKKwlfRFJNX0NPTlRFWFRfUFJFU0VSVkVEID0gMHgwMSwKKwlfRFJNX0NPTlRFWFRfMkRPTkxZID0gMHgwMgorfTsKKworLyoqCisgKiBEUk1fSU9DVExfQUREX0NUWCBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1DcmVhdGVDb250ZXh0KCkgYW5kIGRybURlc3Ryb3lDb250ZXh0KCkuCisgKi8KK3N0cnVjdCBkcm1fY3R4IHsKKwlkcm1fY29udGV4dF90IGhhbmRsZTsKKwllbnVtIGRybV9jdHhfZmxhZ3MgZmxhZ3M7Cit9OworCisvKioKKyAqIERSTV9JT0NUTF9SRVNfQ1RYIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3N0cnVjdCBkcm1fY3R4X3JlcyB7CisJaW50IGNvdW50OworCXN0cnVjdCBkcm1fY3R4ICpjb250ZXh0czsKK307CisKKy8qKgorICogRFJNX0lPQ1RMX0FERF9EUkFXIGFuZCBEUk1fSU9DVExfUk1fRFJBVyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICovCitzdHJ1Y3QgZHJtX2RyYXcgeworCWRybV9kcmF3YWJsZV90IGhhbmRsZTsKK307CisKKy8qKgorICogRFJNX0lPQ1RMX1VQREFURV9EUkFXIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJRFJNX0RSQVdBQkxFX0NMSVBSRUNUUworfSBkcm1fZHJhd2FibGVfaW5mb190eXBlX3Q7CisKK3N0cnVjdCBkcm1fdXBkYXRlX2RyYXcgeworCWRybV9kcmF3YWJsZV90IGhhbmRsZTsKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKwl1bnNpZ25lZCBpbnQgbnVtOworCXVuc2lnbmVkIGxvbmcgbG9uZyBkYXRhOworfTsKKworLyoqCisgKiBEUk1fSU9DVExfR0VUX01BR0lDIGFuZCBEUk1fSU9DVExfQVVUSF9NQUdJQyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICovCitzdHJ1Y3QgZHJtX2F1dGggeworCWRybV9tYWdpY190IG1hZ2ljOworfTsKKworLyoqCisgKiBEUk1fSU9DVExfSVJRX0JVU0lEIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUdldEludGVycnVwdEZyb21CdXNJRCgpLgorICovCitzdHJ1Y3QgZHJtX2lycV9idXNpZCB7CisJaW50IGlycTsJLyoqPCBJUlEgbnVtYmVyICovCisJaW50IGJ1c251bTsJLyoqPCBidXMgbnVtYmVyICovCisJaW50IGRldm51bTsJLyoqPCBkZXZpY2UgbnVtYmVyICovCisJaW50IGZ1bmNudW07CS8qKjwgZnVuY3Rpb24gbnVtYmVyICovCit9OworCitlbnVtIGRybV92Ymxhbmtfc2VxX3R5cGUgeworCV9EUk1fVkJMQU5LX0FCU09MVVRFID0gMHgwLAkvKio8IFdhaXQgZm9yIHNwZWNpZmljIHZibGFuayBzZXF1ZW5jZSBudW1iZXIgKi8KKwlfRFJNX1ZCTEFOS19SRUxBVElWRSA9IDB4MSwJLyoqPCBXYWl0IGZvciBnaXZlbiBudW1iZXIgb2YgdmJsYW5rcyAqLworCS8qIGJpdHMgMS02IGFyZSByZXNlcnZlZCBmb3IgaGlnaCBjcnRjcyAqLworCV9EUk1fVkJMQU5LX0hJR0hfQ1JUQ19NQVNLID0gMHgwMDAwMDAzZSwKKwlfRFJNX1ZCTEFOS19FVkVOVCA9IDB4NDAwMDAwMCwgICAvKio8IFNlbmQgZXZlbnQgaW5zdGVhZCBvZiBibG9ja2luZyAqLworCV9EUk1fVkJMQU5LX0ZMSVAgPSAweDgwMDAwMDAsICAgLyoqPCBTY2hlZHVsZWQgYnVmZmVyIHN3YXAgc2hvdWxkIGZsaXAgKi8KKwlfRFJNX1ZCTEFOS19ORVhUT05NSVNTID0gMHgxMDAwMDAwMCwJLyoqPCBJZiBtaXNzZWQsIHdhaXQgZm9yIG5leHQgdmJsYW5rICovCisJX0RSTV9WQkxBTktfU0VDT05EQVJZID0gMHgyMDAwMDAwMCwJLyoqPCBTZWNvbmRhcnkgZGlzcGxheSBjb250cm9sbGVyICovCisJX0RSTV9WQkxBTktfU0lHTkFMID0gMHg0MDAwMDAwMAkvKio8IFNlbmQgc2lnbmFsIGluc3RlYWQgb2YgYmxvY2tpbmcsIHVuc3VwcG9ydGVkICovCit9OworI2RlZmluZSBfRFJNX1ZCTEFOS19ISUdIX0NSVENfU0hJRlQgMQorCisjZGVmaW5lIF9EUk1fVkJMQU5LX1RZUEVTX01BU0sgKF9EUk1fVkJMQU5LX0FCU09MVVRFIHwgX0RSTV9WQkxBTktfUkVMQVRJVkUpCisjZGVmaW5lIF9EUk1fVkJMQU5LX0ZMQUdTX01BU0sgKF9EUk1fVkJMQU5LX0VWRU5UIHwgX0RSTV9WQkxBTktfU0lHTkFMIHwgXAorCQkJCV9EUk1fVkJMQU5LX1NFQ09OREFSWSB8IF9EUk1fVkJMQU5LX05FWFRPTk1JU1MpCisKK3N0cnVjdCBkcm1fd2FpdF92YmxhbmtfcmVxdWVzdCB7CisJZW51bSBkcm1fdmJsYW5rX3NlcV90eXBlIHR5cGU7CisJdW5zaWduZWQgaW50IHNlcXVlbmNlOworCXVuc2lnbmVkIGxvbmcgc2lnbmFsOworfTsKKworc3RydWN0IGRybV93YWl0X3ZibGFua19yZXBseSB7CisJZW51bSBkcm1fdmJsYW5rX3NlcV90eXBlIHR5cGU7CisJdW5zaWduZWQgaW50IHNlcXVlbmNlOworCWxvbmcgdHZhbF9zZWM7CisJbG9uZyB0dmFsX3VzZWM7Cit9OworCisvKioKKyAqIERSTV9JT0NUTF9XQUlUX1ZCTEFOSyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1XYWl0VkJsYW5rKCkuCisgKi8KK3VuaW9uIGRybV93YWl0X3ZibGFuayB7CisJc3RydWN0IGRybV93YWl0X3ZibGFua19yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IGRybV93YWl0X3ZibGFua19yZXBseSByZXBseTsKK307CisKKyNkZWZpbmUgX0RSTV9QUkVfTU9ERVNFVCAxCisjZGVmaW5lIF9EUk1fUE9TVF9NT0RFU0VUIDIKKworLyoqCisgKiBEUk1fSU9DVExfTU9ERVNFVF9DVEwgaW9jdGwgYXJndW1lbnQgdHlwZQorICoKKyAqIFxzYSBkcm1Nb2Rlc2V0Q3RsKCkuCisgKi8KK3N0cnVjdCBkcm1fbW9kZXNldF9jdGwgeworCV9fdTMyIGNydGM7CisJX191MzIgY21kOworfTsKKworLyoqCisgKiBEUk1fSU9DVExfQUdQX0VOQUJMRSBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1BZ3BFbmFibGUoKS4KKyAqLworc3RydWN0IGRybV9hZ3BfbW9kZSB7CisJdW5zaWduZWQgbG9uZyBtb2RlOwkvKio8IEFHUCBtb2RlICovCit9OworCisvKioKKyAqIERSTV9JT0NUTF9BR1BfQUxMT0MgYW5kIERSTV9JT0NUTF9BR1BfRlJFRSBpb2N0bHMgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtQWdwQWxsb2MoKSBhbmQgZHJtQWdwRnJlZSgpLgorICovCitzdHJ1Y3QgZHJtX2FncF9idWZmZXIgeworCXVuc2lnbmVkIGxvbmcgc2l6ZTsJLyoqPCBJbiBieXRlcyAtLSB3aWxsIHJvdW5kIHRvIHBhZ2UgYm91bmRhcnkgKi8KKwl1bnNpZ25lZCBsb25nIGhhbmRsZTsJLyoqPCBVc2VkIGZvciBiaW5kaW5nIC8gdW5iaW5kaW5nICovCisJdW5zaWduZWQgbG9uZyB0eXBlOwkvKio8IFR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlICovCisJdW5zaWduZWQgbG9uZyBwaHlzaWNhbDsJLyoqPCBQaHlzaWNhbCB1c2VkIGJ5IGk4MTAgKi8KK307CisKKy8qKgorICogRFJNX0lPQ1RMX0FHUF9CSU5EIGFuZCBEUk1fSU9DVExfQUdQX1VOQklORCBpb2N0bHMgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtQWdwQmluZCgpIGFuZCBkcm1BZ3BVbmJpbmQoKS4KKyAqLworc3RydWN0IGRybV9hZ3BfYmluZGluZyB7CisJdW5zaWduZWQgbG9uZyBoYW5kbGU7CS8qKjwgRnJvbSBkcm1fYWdwX2J1ZmZlciAqLworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkvKio8IEluIGJ5dGVzIC0tIHdpbGwgcm91bmQgdG8gcGFnZSBib3VuZGFyeSAqLworfTsKKworLyoqCisgKiBEUk1fSU9DVExfQUdQX0lORk8gaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtQWdwVmVyc2lvbk1ham9yKCksIGRybUFncFZlcnNpb25NaW5vcigpLCBkcm1BZ3BHZXRNb2RlKCksCisgKiBkcm1BZ3BCYXNlKCksIGRybUFncFNpemUoKSwgZHJtQWdwTWVtb3J5VXNlZCgpLCBkcm1BZ3BNZW1vcnlBdmFpbCgpLAorICogZHJtQWdwVmVuZG9ySWQoKSBhbmQgZHJtQWdwRGV2aWNlSWQoKS4KKyAqLworc3RydWN0IGRybV9hZ3BfaW5mbyB7CisJaW50IGFncF92ZXJzaW9uX21ham9yOworCWludCBhZ3BfdmVyc2lvbl9taW5vcjsKKwl1bnNpZ25lZCBsb25nIG1vZGU7CisJdW5zaWduZWQgbG9uZyBhcGVydHVyZV9iYXNlOwkvKiBwaHlzaWNhbCBhZGRyZXNzICovCisJdW5zaWduZWQgbG9uZyBhcGVydHVyZV9zaXplOwkvKiBieXRlcyAqLworCXVuc2lnbmVkIGxvbmcgbWVtb3J5X2FsbG93ZWQ7CS8qIGJ5dGVzICovCisJdW5zaWduZWQgbG9uZyBtZW1vcnlfdXNlZDsKKworCS8qIFBDSSBpbmZvcm1hdGlvbiAqLworCXVuc2lnbmVkIHNob3J0IGlkX3ZlbmRvcjsKKwl1bnNpZ25lZCBzaG9ydCBpZF9kZXZpY2U7Cit9OworCisvKioKKyAqIERSTV9JT0NUTF9TR19BTExPQyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICovCitzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyIHsKKwl1bnNpZ25lZCBsb25nIHNpemU7CS8qKjwgSW4gYnl0ZXMgLS0gd2lsbCByb3VuZCB0byBwYWdlIGJvdW5kYXJ5ICovCisJdW5zaWduZWQgbG9uZyBoYW5kbGU7CS8qKjwgVXNlZCBmb3IgbWFwcGluZyAvIHVubWFwcGluZyAqLworfTsKKworLyoqCisgKiBEUk1fSU9DVExfU0VUX1ZFUlNJT04gaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLworc3RydWN0IGRybV9zZXRfdmVyc2lvbiB7CisJaW50IGRybV9kaV9tYWpvcjsKKwlpbnQgZHJtX2RpX21pbm9yOworCWludCBkcm1fZGRfbWFqb3I7CisJaW50IGRybV9kZF9taW5vcjsKK307CisKKy8qKiBEUk1fSU9DVExfR0VNX0NMT1NFIGlvY3RsIGFyZ3VtZW50IHR5cGUgKi8KK3N0cnVjdCBkcm1fZ2VtX2Nsb3NlIHsKKwkvKiogSGFuZGxlIG9mIHRoZSBvYmplY3QgdG8gYmUgY2xvc2VkLiAqLworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBwYWQ7Cit9OworCisvKiogRFJNX0lPQ1RMX0dFTV9GTElOSyBpb2N0bCBhcmd1bWVudCB0eXBlICovCitzdHJ1Y3QgZHJtX2dlbV9mbGluayB7CisJLyoqIEhhbmRsZSBmb3IgdGhlIG9iamVjdCBiZWluZyBuYW1lZCAqLworCV9fdTMyIGhhbmRsZTsKKworCS8qKiBSZXR1cm5lZCBnbG9iYWwgbmFtZSAqLworCV9fdTMyIG5hbWU7Cit9OworCisvKiogRFJNX0lPQ1RMX0dFTV9PUEVOIGlvY3RsIGFyZ3VtZW50IHR5cGUgKi8KK3N0cnVjdCBkcm1fZ2VtX29wZW4geworCS8qKiBOYW1lIG9mIG9iamVjdCBiZWluZyBvcGVuZWQgKi8KKwlfX3UzMiBuYW1lOworCisJLyoqIFJldHVybmVkIGhhbmRsZSBmb3IgdGhlIG9iamVjdCAqLworCV9fdTMyIGhhbmRsZTsKKworCS8qKiBSZXR1cm5lZCBzaXplIG9mIHRoZSBvYmplY3QgKi8KKwlfX3U2NCBzaXplOworfTsKKworI2RlZmluZSBEUk1fQ0FQX0RVTUJfQlVGRkVSCQkweDEKKyNkZWZpbmUgRFJNX0NBUF9WQkxBTktfSElHSF9DUlRDCTB4MgorI2RlZmluZSBEUk1fQ0FQX0RVTUJfUFJFRkVSUkVEX0RFUFRICTB4MworI2RlZmluZSBEUk1fQ0FQX0RVTUJfUFJFRkVSX1NIQURPVwkweDQKKyNkZWZpbmUgRFJNX0NBUF9QUklNRQkJCTB4NQorI2RlZmluZSAgRFJNX1BSSU1FX0NBUF9JTVBPUlQJCTB4MQorI2RlZmluZSAgRFJNX1BSSU1FX0NBUF9FWFBPUlQJCTB4MgorI2RlZmluZSBEUk1fQ0FQX1RJTUVTVEFNUF9NT05PVE9OSUMJMHg2CisjZGVmaW5lIERSTV9DQVBfQVNZTkNfUEFHRV9GTElQCQkweDcKKy8qCisgKiBUaGUgQ1VSU09SX1dJRFRIIGFuZCBDVVJTT1JfSEVJR0hUIGNhcGFiaWxpdGllcyByZXR1cm4gYSB2YWxpZCB3aWR0aHhoZWlnaHQKKyAqIGNvbWJpbmF0aW9uIGZvciB0aGUgaGFyZHdhcmUgY3Vyc29yLiBUaGUgaW50ZW50aW9uIGlzIHRoYXQgYSBoYXJkd2FyZQorICogYWdub3N0aWMgdXNlcnNwYWNlIGNhbiBxdWVyeSBhIGN1cnNvciBwbGFuZSBzaXplIHRvIHVzZS4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGNyb3NzLWRyaXZlciBjb250cmFjdCBpcyB0byBtZXJlbHkgcmV0dXJuIGEgdmFsaWQgc2l6ZTsKKyAqIGRyaXZlcnMgYXJlIGZyZWUgdG8gYXR0YWNoIGFub3RoZXIgbWVhbmluZyBvbiB0b3AsIGVnLiBpOTE1IHJldHVybnMgdGhlCisgKiBtYXhpbXVtIHBsYW5lIHNpemUuCisgKi8KKyNkZWZpbmUgRFJNX0NBUF9DVVJTT1JfV0lEVEgJCTB4OAorI2RlZmluZSBEUk1fQ0FQX0NVUlNPUl9IRUlHSFQJCTB4OQorI2RlZmluZSBEUk1fQ0FQX0FEREZCMl9NT0RJRklFUlMJMHgxMAorI2RlZmluZSBEUk1fQ0FQX1BBR0VfRkxJUF9UQVJHRVQJMHgxMQorI2RlZmluZSBEUk1fQ0FQX0NSVENfSU5fVkJMQU5LX0VWRU5UCTB4MTIKKyNkZWZpbmUgRFJNX0NBUF9TWU5DT0JKCQkweDEzCisKKy8qKiBEUk1fSU9DVExfR0VUX0NBUCBpb2N0bCBhcmd1bWVudCB0eXBlICovCitzdHJ1Y3QgZHJtX2dldF9jYXAgeworCV9fdTY0IGNhcGFiaWxpdHk7CisJX191NjQgdmFsdWU7Cit9OworCisvKioKKyAqIERSTV9DTElFTlRfQ0FQX1NURVJFT18zRAorICoKKyAqIGlmIHNldCB0byAxLCB0aGUgRFJNIGNvcmUgd2lsbCBleHBvc2UgdGhlIHN0ZXJlbyAzRCBjYXBhYmlsaXRpZXMgb2YgdGhlCisgKiBtb25pdG9yIGJ5IGFkdmVydGlzaW5nIHRoZSBzdXBwb3J0ZWQgM0QgbGF5b3V0cyBpbiB0aGUgZmxhZ3Mgb2Ygc3RydWN0CisgKiBkcm1fbW9kZV9tb2RlaW5mby4KKyAqLworI2RlZmluZSBEUk1fQ0xJRU5UX0NBUF9TVEVSRU9fM0QJMQorCisvKioKKyAqIERSTV9DTElFTlRfQ0FQX1VOSVZFUlNBTF9QTEFORVMKKyAqCisgKiBJZiBzZXQgdG8gMSwgdGhlIERSTSBjb3JlIHdpbGwgZXhwb3NlIGFsbCBwbGFuZXMgKG92ZXJsYXksIHByaW1hcnksIGFuZAorICogY3Vyc29yKSB0byB1c2Vyc3BhY2UuCisgKi8KKyNkZWZpbmUgRFJNX0NMSUVOVF9DQVBfVU5JVkVSU0FMX1BMQU5FUyAgMgorCisvKioKKyAqIERSTV9DTElFTlRfQ0FQX0FUT01JQworICoKKyAqIElmIHNldCB0byAxLCB0aGUgRFJNIGNvcmUgd2lsbCBleHBvc2UgYXRvbWljIHByb3BlcnRpZXMgdG8gdXNlcnNwYWNlCisgKi8KKyNkZWZpbmUgRFJNX0NMSUVOVF9DQVBfQVRPTUlDCTMKKworLyoqIERSTV9JT0NUTF9TRVRfQ0xJRU5UX0NBUCBpb2N0bCBhcmd1bWVudCB0eXBlICovCitzdHJ1Y3QgZHJtX3NldF9jbGllbnRfY2FwIHsKKwlfX3U2NCBjYXBhYmlsaXR5OworCV9fdTY0IHZhbHVlOworfTsKKworI2RlZmluZSBEUk1fUkRXUiBPX1JEV1IKKyNkZWZpbmUgRFJNX0NMT0VYRUMgT19DTE9FWEVDCitzdHJ1Y3QgZHJtX3ByaW1lX2hhbmRsZSB7CisJX191MzIgaGFuZGxlOworCisJLyoqIEZsYWdzLi4gb25seSBhcHBsaWNhYmxlIGZvciBoYW5kbGUtPmZkICovCisJX191MzIgZmxhZ3M7CisKKwkvKiogUmV0dXJuZWQgZG1hYnVmIGZpbGUgZGVzY3JpcHRvciAqLworCV9fczMyIGZkOworfTsKKworc3RydWN0IGRybV9zeW5jb2JqX2NyZWF0ZSB7CisJX191MzIgaGFuZGxlOworI2RlZmluZSBEUk1fU1lOQ09CSl9DUkVBVEVfU0lHTkFMRUQgKDEgPDwgMCkKKwlfX3UzMiBmbGFnczsKK307CisKK3N0cnVjdCBkcm1fc3luY29ial9kZXN0cm95IHsKKwlfX3UzMiBoYW5kbGU7CisJX191MzIgcGFkOworfTsKKworI2RlZmluZSBEUk1fU1lOQ09CSl9GRF9UT19IQU5ETEVfRkxBR1NfSU1QT1JUX1NZTkNfRklMRSAoMSA8PCAwKQorI2RlZmluZSBEUk1fU1lOQ09CSl9IQU5ETEVfVE9fRkRfRkxBR1NfRVhQT1JUX1NZTkNfRklMRSAoMSA8PCAwKQorc3RydWN0IGRybV9zeW5jb2JqX2hhbmRsZSB7CisJX191MzIgaGFuZGxlOworCV9fdTMyIGZsYWdzOworCisJX19zMzIgZmQ7CisJX191MzIgcGFkOworfTsKKworI2RlZmluZSBEUk1fU1lOQ09CSl9XQUlUX0ZMQUdTX1dBSVRfQUxMICgxIDw8IDApCisjZGVmaW5lIERSTV9TWU5DT0JKX1dBSVRfRkxBR1NfV0FJVF9GT1JfU1VCTUlUICgxIDw8IDEpCitzdHJ1Y3QgZHJtX3N5bmNvYmpfd2FpdCB7CisJX191NjQgaGFuZGxlczsKKwkvKiBhYnNvbHV0ZSB0aW1lb3V0ICovCisJX19zNjQgdGltZW91dF9uc2VjOworCV9fdTMyIGNvdW50X2hhbmRsZXM7CisJX191MzIgZmxhZ3M7CisJX191MzIgZmlyc3Rfc2lnbmFsZWQ7IC8qIG9ubHkgdmFsaWQgd2hlbiBub3Qgd2FpdGluZyBhbGwgKi8KKwlfX3UzMiBwYWQ7Cit9OworCitzdHJ1Y3QgZHJtX3N5bmNvYmpfYXJyYXkgeworCV9fdTY0IGhhbmRsZXM7CisJX191MzIgY291bnRfaGFuZGxlczsKKwlfX3UzMiBwYWQ7Cit9OworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjaW5jbHVkZSAiZHJtX21vZGUuaCIKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIERSTV9JT0NUTF9CQVNFCQkJJ2QnCisjZGVmaW5lIERSTV9JTyhucikJCQlfSU8oRFJNX0lPQ1RMX0JBU0UsbnIpCisjZGVmaW5lIERSTV9JT1IobnIsdHlwZSkJCV9JT1IoRFJNX0lPQ1RMX0JBU0UsbnIsdHlwZSkKKyNkZWZpbmUgRFJNX0lPVyhucix0eXBlKQkJX0lPVyhEUk1fSU9DVExfQkFTRSxucix0eXBlKQorI2RlZmluZSBEUk1fSU9XUihucix0eXBlKQkJX0lPV1IoRFJNX0lPQ1RMX0JBU0UsbnIsdHlwZSkKKworI2RlZmluZSBEUk1fSU9DVExfVkVSU0lPTgkJRFJNX0lPV1IoMHgwMCwgc3RydWN0IGRybV92ZXJzaW9uKQorI2RlZmluZSBEUk1fSU9DVExfR0VUX1VOSVFVRQkJRFJNX0lPV1IoMHgwMSwgc3RydWN0IGRybV91bmlxdWUpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfTUFHSUMJCURSTV9JT1IoIDB4MDIsIHN0cnVjdCBkcm1fYXV0aCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0lSUV9CVVNJRAkJRFJNX0lPV1IoMHgwMywgc3RydWN0IGRybV9pcnFfYnVzaWQpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfTUFQICAgICAgICAgICAgICAgRFJNX0lPV1IoMHgwNCwgc3RydWN0IGRybV9tYXApCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfQ0xJRU5UICAgICAgICAgICAgRFJNX0lPV1IoMHgwNSwgc3RydWN0IGRybV9jbGllbnQpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfU1RBVFMgICAgICAgICAgICAgRFJNX0lPUiggMHgwNiwgc3RydWN0IGRybV9zdGF0cykKKyNkZWZpbmUgRFJNX0lPQ1RMX1NFVF9WRVJTSU9OCQlEUk1fSU9XUigweDA3LCBzdHJ1Y3QgZHJtX3NldF92ZXJzaW9uKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERVNFVF9DVEwgICAgICAgICAgIERSTV9JT1coMHgwOCwgc3RydWN0IGRybV9tb2Rlc2V0X2N0bCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFTV9DTE9TRQkJRFJNX0lPVyAoMHgwOSwgc3RydWN0IGRybV9nZW1fY2xvc2UpCisjZGVmaW5lIERSTV9JT0NUTF9HRU1fRkxJTksJCURSTV9JT1dSKDB4MGEsIHN0cnVjdCBkcm1fZ2VtX2ZsaW5rKQorI2RlZmluZSBEUk1fSU9DVExfR0VNX09QRU4JCURSTV9JT1dSKDB4MGIsIHN0cnVjdCBkcm1fZ2VtX29wZW4pCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfQ0FQCQlEUk1fSU9XUigweDBjLCBzdHJ1Y3QgZHJtX2dldF9jYXApCisjZGVmaW5lIERSTV9JT0NUTF9TRVRfQ0xJRU5UX0NBUAlEUk1fSU9XKCAweDBkLCBzdHJ1Y3QgZHJtX3NldF9jbGllbnRfY2FwKQorCisjZGVmaW5lIERSTV9JT0NUTF9TRVRfVU5JUVVFCQlEUk1fSU9XKCAweDEwLCBzdHJ1Y3QgZHJtX3VuaXF1ZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FVVEhfTUFHSUMJCURSTV9JT1coIDB4MTEsIHN0cnVjdCBkcm1fYXV0aCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0JMT0NLCQkJRFJNX0lPV1IoMHgxMiwgc3RydWN0IGRybV9ibG9jaykKKyNkZWZpbmUgRFJNX0lPQ1RMX1VOQkxPQ0sJCURSTV9JT1dSKDB4MTMsIHN0cnVjdCBkcm1fYmxvY2spCisjZGVmaW5lIERSTV9JT0NUTF9DT05UUk9MCQlEUk1fSU9XKCAweDE0LCBzdHJ1Y3QgZHJtX2NvbnRyb2wpCisjZGVmaW5lIERSTV9JT0NUTF9BRERfTUFQCQlEUk1fSU9XUigweDE1LCBzdHJ1Y3QgZHJtX21hcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FERF9CVUZTCQlEUk1fSU9XUigweDE2LCBzdHJ1Y3QgZHJtX2J1Zl9kZXNjKQorI2RlZmluZSBEUk1fSU9DVExfTUFSS19CVUZTCQlEUk1fSU9XKCAweDE3LCBzdHJ1Y3QgZHJtX2J1Zl9kZXNjKQorI2RlZmluZSBEUk1fSU9DVExfSU5GT19CVUZTCQlEUk1fSU9XUigweDE4LCBzdHJ1Y3QgZHJtX2J1Zl9pbmZvKQorI2RlZmluZSBEUk1fSU9DVExfTUFQX0JVRlMJCURSTV9JT1dSKDB4MTksIHN0cnVjdCBkcm1fYnVmX21hcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0ZSRUVfQlVGUwkJRFJNX0lPVyggMHgxYSwgc3RydWN0IGRybV9idWZfZnJlZSkKKworI2RlZmluZSBEUk1fSU9DVExfUk1fTUFQCQlEUk1fSU9XKCAweDFiLCBzdHJ1Y3QgZHJtX21hcCkKKworI2RlZmluZSBEUk1fSU9DVExfU0VUX1NBUkVBX0NUWAkJRFJNX0lPVyggMHgxYywgc3RydWN0IGRybV9jdHhfcHJpdl9tYXApCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfU0FSRUFfQ1RYIAlEUk1fSU9XUigweDFkLCBzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCkKKworI2RlZmluZSBEUk1fSU9DVExfU0VUX01BU1RFUiAgICAgICAgICAgIERSTV9JTygweDFlKQorI2RlZmluZSBEUk1fSU9DVExfRFJPUF9NQVNURVIgICAgICAgICAgIERSTV9JTygweDFmKQorCisjZGVmaW5lIERSTV9JT0NUTF9BRERfQ1RYCQlEUk1fSU9XUigweDIwLCBzdHJ1Y3QgZHJtX2N0eCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JNX0NUWAkJRFJNX0lPV1IoMHgyMSwgc3RydWN0IGRybV9jdHgpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RfQ1RYCQlEUk1fSU9XKCAweDIyLCBzdHJ1Y3QgZHJtX2N0eCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9DVFgJCURSTV9JT1dSKDB4MjMsIHN0cnVjdCBkcm1fY3R4KQorI2RlZmluZSBEUk1fSU9DVExfU1dJVENIX0NUWAkJRFJNX0lPVyggMHgyNCwgc3RydWN0IGRybV9jdHgpCisjZGVmaW5lIERSTV9JT0NUTF9ORVdfQ1RYCQlEUk1fSU9XKCAweDI1LCBzdHJ1Y3QgZHJtX2N0eCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JFU19DVFgJCURSTV9JT1dSKDB4MjYsIHN0cnVjdCBkcm1fY3R4X3JlcykKKyNkZWZpbmUgRFJNX0lPQ1RMX0FERF9EUkFXCQlEUk1fSU9XUigweDI3LCBzdHJ1Y3QgZHJtX2RyYXcpCisjZGVmaW5lIERSTV9JT0NUTF9STV9EUkFXCQlEUk1fSU9XUigweDI4LCBzdHJ1Y3QgZHJtX2RyYXcpCisjZGVmaW5lIERSTV9JT0NUTF9ETUEJCQlEUk1fSU9XUigweDI5LCBzdHJ1Y3QgZHJtX2RtYSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0xPQ0sJCQlEUk1fSU9XKCAweDJhLCBzdHJ1Y3QgZHJtX2xvY2spCisjZGVmaW5lIERSTV9JT0NUTF9VTkxPQ0sJCURSTV9JT1coIDB4MmIsIHN0cnVjdCBkcm1fbG9jaykKKyNkZWZpbmUgRFJNX0lPQ1RMX0ZJTklTSAkJRFJNX0lPVyggMHgyYywgc3RydWN0IGRybV9sb2NrKQorCisjZGVmaW5lIERSTV9JT0NUTF9QUklNRV9IQU5ETEVfVE9fRkQgICAgRFJNX0lPV1IoMHgyZCwgc3RydWN0IGRybV9wcmltZV9oYW5kbGUpCisjZGVmaW5lIERSTV9JT0NUTF9QUklNRV9GRF9UT19IQU5ETEUgICAgRFJNX0lPV1IoMHgyZSwgc3RydWN0IGRybV9wcmltZV9oYW5kbGUpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9BQ1FVSVJFCQlEUk1fSU8oICAweDMwKQorI2RlZmluZSBEUk1fSU9DVExfQUdQX1JFTEVBU0UJCURSTV9JTyggIDB4MzEpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfRU5BQkxFCQlEUk1fSU9XKCAweDMyLCBzdHJ1Y3QgZHJtX2FncF9tb2RlKQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0lORk8JCURSTV9JT1IoIDB4MzMsIHN0cnVjdCBkcm1fYWdwX2luZm8pCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfQUxMT0MJCURSTV9JT1dSKDB4MzQsIHN0cnVjdCBkcm1fYWdwX2J1ZmZlcikKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9GUkVFCQlEUk1fSU9XKCAweDM1LCBzdHJ1Y3QgZHJtX2FncF9idWZmZXIpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfQklORAkJRFJNX0lPVyggMHgzNiwgc3RydWN0IGRybV9hZ3BfYmluZGluZykKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9VTkJJTkQJCURSTV9JT1coIDB4MzcsIHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1NHX0FMTE9DCQlEUk1fSU9XUigweDM4LCBzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyKQorI2RlZmluZSBEUk1fSU9DVExfU0dfRlJFRQkJRFJNX0lPVyggMHgzOSwgc3RydWN0IGRybV9zY2F0dGVyX2dhdGhlcikKKworI2RlZmluZSBEUk1fSU9DVExfV0FJVF9WQkxBTksJCURSTV9JT1dSKDB4M2EsIHVuaW9uIGRybV93YWl0X3ZibGFuaykKKworI2RlZmluZSBEUk1fSU9DVExfVVBEQVRFX0RSQVcJCURSTV9JT1coMHgzZiwgc3RydWN0IGRybV91cGRhdGVfZHJhdykKKworI2RlZmluZSBEUk1fSU9DVExfTU9ERV9HRVRSRVNPVVJDRVMJRFJNX0lPV1IoMHhBMCwgc3RydWN0IGRybV9tb2RlX2NhcmRfcmVzKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9HRVRDUlRDCQlEUk1fSU9XUigweEExLCBzdHJ1Y3QgZHJtX21vZGVfY3J0YykKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfU0VUQ1JUQwkJRFJNX0lPV1IoMHhBMiwgc3RydWN0IGRybV9tb2RlX2NydGMpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0NVUlNPUgkJRFJNX0lPV1IoMHhBMywgc3RydWN0IGRybV9tb2RlX2N1cnNvcikKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfR0VUR0FNTUEJCURSTV9JT1dSKDB4QTQsIHN0cnVjdCBkcm1fbW9kZV9jcnRjX2x1dCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfU0VUR0FNTUEJCURSTV9JT1dSKDB4QTUsIHN0cnVjdCBkcm1fbW9kZV9jcnRjX2x1dCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfR0VURU5DT0RFUglEUk1fSU9XUigweEE2LCBzdHJ1Y3QgZHJtX21vZGVfZ2V0X2VuY29kZXIpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0dFVENPTk5FQ1RPUglEUk1fSU9XUigweEE3LCBzdHJ1Y3QgZHJtX21vZGVfZ2V0X2Nvbm5lY3RvcikKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfQVRUQUNITU9ERQlEUk1fSU9XUigweEE4LCBzdHJ1Y3QgZHJtX21vZGVfbW9kZV9jbWQpIC8qIGRlcHJlY2F0ZWQgKG5ldmVyIHdvcmtlZCkgKi8KKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfREVUQUNITU9ERQlEUk1fSU9XUigweEE5LCBzdHJ1Y3QgZHJtX21vZGVfbW9kZV9jbWQpIC8qIGRlcHJlY2F0ZWQgKG5ldmVyIHdvcmtlZCkgKi8KKworI2RlZmluZSBEUk1fSU9DVExfTU9ERV9HRVRQUk9QRVJUWQlEUk1fSU9XUigweEFBLCBzdHJ1Y3QgZHJtX21vZGVfZ2V0X3Byb3BlcnR5KQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9TRVRQUk9QRVJUWQlEUk1fSU9XUigweEFCLCBzdHJ1Y3QgZHJtX21vZGVfY29ubmVjdG9yX3NldF9wcm9wZXJ0eSkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfR0VUUFJPUEJMT0IJRFJNX0lPV1IoMHhBQywgc3RydWN0IGRybV9tb2RlX2dldF9ibG9iKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9HRVRGQgkJRFJNX0lPV1IoMHhBRCwgc3RydWN0IGRybV9tb2RlX2ZiX2NtZCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfQURERkIJCURSTV9JT1dSKDB4QUUsIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX1JNRkIJCURSTV9JT1dSKDB4QUYsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfUEFHRV9GTElQCURSTV9JT1dSKDB4QjAsIHN0cnVjdCBkcm1fbW9kZV9jcnRjX3BhZ2VfZmxpcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfRElSVFlGQgkJRFJNX0lPV1IoMHhCMSwgc3RydWN0IGRybV9tb2RlX2ZiX2RpcnR5X2NtZCkKKworI2RlZmluZSBEUk1fSU9DVExfTU9ERV9DUkVBVEVfRFVNQiBEUk1fSU9XUigweEIyLCBzdHJ1Y3QgZHJtX21vZGVfY3JlYXRlX2R1bWIpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX01BUF9EVU1CICAgIERSTV9JT1dSKDB4QjMsIHN0cnVjdCBkcm1fbW9kZV9tYXBfZHVtYikKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfREVTVFJPWV9EVU1CICAgIERSTV9JT1dSKDB4QjQsIHN0cnVjdCBkcm1fbW9kZV9kZXN0cm95X2R1bWIpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0dFVFBMQU5FUkVTT1VSQ0VTIERSTV9JT1dSKDB4QjUsIHN0cnVjdCBkcm1fbW9kZV9nZXRfcGxhbmVfcmVzKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9HRVRQTEFORQlEUk1fSU9XUigweEI2LCBzdHJ1Y3QgZHJtX21vZGVfZ2V0X3BsYW5lKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9TRVRQTEFORQlEUk1fSU9XUigweEI3LCBzdHJ1Y3QgZHJtX21vZGVfc2V0X3BsYW5lKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9BRERGQjIJCURSTV9JT1dSKDB4QjgsIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQyKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9PQkpfR0VUUFJPUEVSVElFUwlEUk1fSU9XUigweEI5LCBzdHJ1Y3QgZHJtX21vZGVfb2JqX2dldF9wcm9wZXJ0aWVzKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9PQkpfU0VUUFJPUEVSVFkJRFJNX0lPV1IoMHhCQSwgc3RydWN0IGRybV9tb2RlX29ial9zZXRfcHJvcGVydHkpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0NVUlNPUjIJCURSTV9JT1dSKDB4QkIsIHN0cnVjdCBkcm1fbW9kZV9jdXJzb3IyKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9BVE9NSUMJCURSTV9JT1dSKDB4QkMsIHN0cnVjdCBkcm1fbW9kZV9hdG9taWMpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0NSRUFURVBST1BCTE9CCURSTV9JT1dSKDB4QkQsIHN0cnVjdCBkcm1fbW9kZV9jcmVhdGVfYmxvYikKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfREVTVFJPWVBST1BCTE9CCURSTV9JT1dSKDB4QkUsIHN0cnVjdCBkcm1fbW9kZV9kZXN0cm95X2Jsb2IpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1NZTkNPQkpfQ1JFQVRFCURSTV9JT1dSKDB4QkYsIHN0cnVjdCBkcm1fc3luY29ial9jcmVhdGUpCisjZGVmaW5lIERSTV9JT0NUTF9TWU5DT0JKX0RFU1RST1kJRFJNX0lPV1IoMHhDMCwgc3RydWN0IGRybV9zeW5jb2JqX2Rlc3Ryb3kpCisjZGVmaW5lIERSTV9JT0NUTF9TWU5DT0JKX0hBTkRMRV9UT19GRAlEUk1fSU9XUigweEMxLCBzdHJ1Y3QgZHJtX3N5bmNvYmpfaGFuZGxlKQorI2RlZmluZSBEUk1fSU9DVExfU1lOQ09CSl9GRF9UT19IQU5ETEUJRFJNX0lPV1IoMHhDMiwgc3RydWN0IGRybV9zeW5jb2JqX2hhbmRsZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NZTkNPQkpfV0FJVAkJRFJNX0lPV1IoMHhDMywgc3RydWN0IGRybV9zeW5jb2JqX3dhaXQpCisjZGVmaW5lIERSTV9JT0NUTF9TWU5DT0JKX1JFU0VUCQlEUk1fSU9XUigweEM0LCBzdHJ1Y3QgZHJtX3N5bmNvYmpfYXJyYXkpCisjZGVmaW5lIERSTV9JT0NUTF9TWU5DT0JKX1NJR05BTAlEUk1fSU9XUigweEM1LCBzdHJ1Y3QgZHJtX3N5bmNvYmpfYXJyYXkpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfQ1JFQVRFX0xFQVNFICAgIERSTV9JT1dSKDB4QzYsIHN0cnVjdCBkcm1fbW9kZV9jcmVhdGVfbGVhc2UpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0xJU1RfTEVTU0VFUyAgICBEUk1fSU9XUigweEM3LCBzdHJ1Y3QgZHJtX21vZGVfbGlzdF9sZXNzZWVzKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9HRVRfTEVBU0UgICAgICAgRFJNX0lPV1IoMHhDOCwgc3RydWN0IGRybV9tb2RlX2dldF9sZWFzZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfUkVWT0tFX0xFQVNFICAgIERSTV9JT1dSKDB4QzksIHN0cnVjdCBkcm1fbW9kZV9yZXZva2VfbGVhc2UpCisKKy8qKgorICogRGV2aWNlIHNwZWNpZmljIGlvY3RscyBzaG91bGQgb25seSBiZSBpbiB0aGVpciByZXNwZWN0aXZlIGhlYWRlcnMKKyAqIFRoZSBkZXZpY2Ugc3BlY2lmaWMgaW9jdGwgcmFuZ2UgaXMgZnJvbSAweDQwIHRvIDB4OWYuCisgKiBHZW5lcmljIElPQ1RMUyByZXN0YXJ0IGF0IDB4QTAuCisgKgorICogXHNhIGRybUNvbW1hbmROb25lKCksIGRybUNvbW1hbmRSZWFkKCksIGRybUNvbW1hbmRXcml0ZSgpLCBhbmQKKyAqIGRybUNvbW1hbmRSZWFkV3JpdGUoKS4KKyAqLworI2RlZmluZSBEUk1fQ09NTUFORF9CQVNFICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgRFJNX0NPTU1BTkRfRU5ECQkJMHhBMAorCisvKioKKyAqIEhlYWRlciBmb3IgZXZlbnRzIHdyaXR0ZW4gYmFjayB0byB1c2Vyc3BhY2Ugb24gdGhlIGRybSBmZC4gIFRoZQorICogdHlwZSBkZWZpbmVzIHRoZSB0eXBlIG9mIGV2ZW50LCB0aGUgbGVuZ3RoIHNwZWNpZmllcyB0aGUgdG90YWwKKyAqIGxlbmd0aCBvZiB0aGUgZXZlbnQgKGluY2x1ZGluZyB0aGUgaGVhZGVyKSwgYW5kIHVzZXJfZGF0YSBpcworICogdHlwaWNhbGx5IGEgNjQgYml0IHZhbHVlIHBhc3NlZCB3aXRoIHRoZSBpb2N0bCB0aGF0IHRyaWdnZXJlZCB0aGUKKyAqIGV2ZW50LiAgQSByZWFkIG9uIHRoZSBkcm0gZmQgd2lsbCBhbHdheXMgb25seSByZXR1cm4gY29tcGxldGUKKyAqIGV2ZW50cywgdGhhdCBpcywgaWYgZm9yIGV4YW1wbGUgdGhlIHJlYWQgYnVmZmVyIGlzIDEwMCBieXRlcywgYW5kCisgKiB0aGVyZSBhcmUgdHdvIDY0IGJ5dGUgZXZlbnRzIHBlbmRpbmcsIG9ubHkgb25lIHdpbGwgYmUgcmV0dXJuZWQuCisgKgorICogRXZlbnQgdHlwZXMgMCAtIDB4N2ZmZmZmZmYgYXJlIGdlbmVyaWMgZHJtIGV2ZW50cywgMHg4MDAwMDAwMCBhbmQKKyAqIHVwIGFyZSBjaGlwc2V0IHNwZWNpZmljLgorICovCitzdHJ1Y3QgZHJtX2V2ZW50IHsKKwlfX3UzMiB0eXBlOworCV9fdTMyIGxlbmd0aDsKK307CisKKyNkZWZpbmUgRFJNX0VWRU5UX1ZCTEFOSyAweDAxCisjZGVmaW5lIERSTV9FVkVOVF9GTElQX0NPTVBMRVRFIDB4MDIKKworc3RydWN0IGRybV9ldmVudF92YmxhbmsgeworCXN0cnVjdCBkcm1fZXZlbnQgYmFzZTsKKwlfX3U2NCB1c2VyX2RhdGE7CisJX191MzIgdHZfc2VjOworCV9fdTMyIHR2X3VzZWM7CisJX191MzIgc2VxdWVuY2U7CisJX191MzIgY3J0Y19pZDsgLyogMCBvbiBvbGRlciBrZXJuZWxzIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhpcyAqLworfTsKKworLyogdHlwZWRlZiBhcmVhICovCit0eXBlZGVmIHN0cnVjdCBkcm1fY2xpcF9yZWN0IGRybV9jbGlwX3JlY3RfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9kcmF3YWJsZV9pbmZvIGRybV9kcmF3YWJsZV9pbmZvX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fdGV4X3JlZ2lvbiBkcm1fdGV4X3JlZ2lvbl90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2h3X2xvY2sgZHJtX2h3X2xvY2tfdDsKK3R5cGVkZWYgc3RydWN0IGRybV92ZXJzaW9uIGRybV92ZXJzaW9uX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fdW5pcXVlIGRybV91bmlxdWVfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9saXN0IGRybV9saXN0X3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYmxvY2sgZHJtX2Jsb2NrX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fY29udHJvbCBkcm1fY29udHJvbF90OwordHlwZWRlZiBlbnVtIGRybV9tYXBfdHlwZSBkcm1fbWFwX3R5cGVfdDsKK3R5cGVkZWYgZW51bSBkcm1fbWFwX2ZsYWdzIGRybV9tYXBfZmxhZ3NfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9jdHhfcHJpdl9tYXAgZHJtX2N0eF9wcml2X21hcF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX21hcCBkcm1fbWFwX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fY2xpZW50IGRybV9jbGllbnRfdDsKK3R5cGVkZWYgZW51bSBkcm1fc3RhdF90eXBlIGRybV9zdGF0X3R5cGVfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9zdGF0cyBkcm1fc3RhdHNfdDsKK3R5cGVkZWYgZW51bSBkcm1fbG9ja19mbGFncyBkcm1fbG9ja19mbGFnc190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2xvY2sgZHJtX2xvY2tfdDsKK3R5cGVkZWYgZW51bSBkcm1fZG1hX2ZsYWdzIGRybV9kbWFfZmxhZ3NfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9idWZfZGVzYyBkcm1fYnVmX2Rlc2NfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9idWZfaW5mbyBkcm1fYnVmX2luZm9fdDsKK3R5cGVkZWYgc3RydWN0IGRybV9idWZfZnJlZSBkcm1fYnVmX2ZyZWVfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9idWZfcHViIGRybV9idWZfcHViX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX21hcCBkcm1fYnVmX21hcF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2RtYSBkcm1fZG1hX3Q7Cit0eXBlZGVmIHVuaW9uIGRybV93YWl0X3ZibGFuayBkcm1fd2FpdF92YmxhbmtfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9hZ3BfbW9kZSBkcm1fYWdwX21vZGVfdDsKK3R5cGVkZWYgZW51bSBkcm1fY3R4X2ZsYWdzIGRybV9jdHhfZmxhZ3NfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9jdHggZHJtX2N0eF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2N0eF9yZXMgZHJtX2N0eF9yZXNfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9kcmF3IGRybV9kcmF3X3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fdXBkYXRlX2RyYXcgZHJtX3VwZGF0ZV9kcmF3X3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYXV0aCBkcm1fYXV0aF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2lycV9idXNpZCBkcm1faXJxX2J1c2lkX3Q7Cit0eXBlZGVmIGVudW0gZHJtX3ZibGFua19zZXFfdHlwZSBkcm1fdmJsYW5rX3NlcV90eXBlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9hZ3BfYnVmZmVyIGRybV9hZ3BfYnVmZmVyX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgZHJtX2FncF9iaW5kaW5nX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2luZm8gZHJtX2FncF9pbmZvX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIgZHJtX3NjYXR0ZXJfZ2F0aGVyX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fc2V0X3ZlcnNpb24gZHJtX3NldF92ZXJzaW9uX3Q7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2ZvdXJjYy5oIGIvaW5jbHVkZS9kcm0vZHJtX2ZvdXJjYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MDIzYjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9kcm1fZm91cmNjLmgKQEAgLTAsMCArMSw0NjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgRFJNX0ZPVVJDQ19ICisjZGVmaW5lIERSTV9GT1VSQ0NfSAorCisjaW5jbHVkZSAiZHJtLmgiCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBmb3VyY2NfY29kZShhLCBiLCBjLCBkKSAoKF9fdTMyKShhKSB8ICgoX191MzIpKGIpIDw8IDgpIHwgXAorCQkJCSAoKF9fdTMyKShjKSA8PCAxNikgfCAoKF9fdTMyKShkKSA8PCAyNCkpCisKKyNkZWZpbmUgRFJNX0ZPUk1BVF9CSUdfRU5ESUFOICgxPDwzMSkgLyogZm9ybWF0IGlzIGJpZyBlbmRpYW4gaW5zdGVhZCBvZiBsaXR0bGUgZW5kaWFuICovCisKKy8qIGNvbG9yIGluZGV4ICovCisjZGVmaW5lIERSTV9GT1JNQVRfQzgJCWZvdXJjY19jb2RlKCdDJywgJzgnLCAnICcsICcgJykgLyogWzc6MF0gQyAqLworCisvKiA4IGJwcCBSZWQgKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9SOAkJZm91cmNjX2NvZGUoJ1InLCAnOCcsICcgJywgJyAnKSAvKiBbNzowXSBSICovCisKKy8qIDE2IGJwcCBSZWQgKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9SMTYgICAgICAgIGZvdXJjY19jb2RlKCdSJywgJzEnLCAnNicsICcgJykgLyogWzE1OjBdIFIgbGl0dGxlIGVuZGlhbiAqLworCisvKiAxNiBicHAgUkcgKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9SRzg4ICAgICAgICBmb3VyY2NfY29kZSgnUicsICdHJywgJzgnLCAnOCcpIC8qIFsxNTowXSBSOkcgODo4IGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9HUjg4ICAgICAgICBmb3VyY2NfY29kZSgnRycsICdSJywgJzgnLCAnOCcpIC8qIFsxNTowXSBHOlIgODo4IGxpdHRsZSBlbmRpYW4gKi8KKworLyogMzIgYnBwIFJHICovCisjZGVmaW5lIERSTV9GT1JNQVRfUkcxNjE2ICAgIGZvdXJjY19jb2RlKCdSJywgJ0cnLCAnMycsICcyJykgLyogWzMxOjBdIFI6RyAxNjoxNiBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIERSTV9GT1JNQVRfR1IxNjE2ICAgIGZvdXJjY19jb2RlKCdHJywgJ1InLCAnMycsICcyJykgLyogWzMxOjBdIEc6UiAxNjoxNiBsaXR0bGUgZW5kaWFuICovCisKKy8qIDMyIGJwcCBSRyAqLworI2RlZmluZSBEUk1fRk9STUFUX1JHMTYxNglmb3VyY2NfY29kZSgnUicsICdHJywgJzMnLCAnMicpIC8qIFszMTowXSBSOkcgMTY6MTYgbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBEUk1fRk9STUFUX0dSMTYxNglmb3VyY2NfY29kZSgnRycsICdSJywgJzMnLCAnMicpIC8qIFszMTowXSBHOlIgMTY6MTYgbGl0dGxlIGVuZGlhbiAqLworCisvKiA4IGJwcCBSR0IgKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9SR0IzMzIJZm91cmNjX2NvZGUoJ1InLCAnRycsICdCJywgJzgnKSAvKiBbNzowXSBSOkc6QiAzOjM6MiAqLworI2RlZmluZSBEUk1fRk9STUFUX0JHUjIzMwlmb3VyY2NfY29kZSgnQicsICdHJywgJ1InLCAnOCcpIC8qIFs3OjBdIEI6RzpSIDI6MzozICovCisKKy8qIDE2IGJwcCBSR0IgKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9YUkdCNDQ0NAlmb3VyY2NfY29kZSgnWCcsICdSJywgJzEnLCAnMicpIC8qIFsxNTowXSB4OlI6RzpCIDQ6NDo0OjQgbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBEUk1fRk9STUFUX1hCR1I0NDQ0CWZvdXJjY19jb2RlKCdYJywgJ0InLCAnMScsICcyJykgLyogWzE1OjBdIHg6QjpHOlIgNDo0OjQ6NCBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIERSTV9GT1JNQVRfUkdCWDQ0NDQJZm91cmNjX2NvZGUoJ1InLCAnWCcsICcxJywgJzInKSAvKiBbMTU6MF0gUjpHOkI6eCA0OjQ6NDo0IGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9CR1JYNDQ0NAlmb3VyY2NfY29kZSgnQicsICdYJywgJzEnLCAnMicpIC8qIFsxNTowXSBCOkc6Ujp4IDQ6NDo0OjQgbGl0dGxlIGVuZGlhbiAqLworCisjZGVmaW5lIERSTV9GT1JNQVRfQVJHQjQ0NDQJZm91cmNjX2NvZGUoJ0EnLCAnUicsICcxJywgJzInKSAvKiBbMTU6MF0gQTpSOkc6QiA0OjQ6NDo0IGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9BQkdSNDQ0NAlmb3VyY2NfY29kZSgnQScsICdCJywgJzEnLCAnMicpIC8qIFsxNTowXSBBOkI6RzpSIDQ6NDo0OjQgbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBEUk1fRk9STUFUX1JHQkE0NDQ0CWZvdXJjY19jb2RlKCdSJywgJ0EnLCAnMScsICcyJykgLyogWzE1OjBdIFI6RzpCOkEgNDo0OjQ6NCBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIERSTV9GT1JNQVRfQkdSQTQ0NDQJZm91cmNjX2NvZGUoJ0InLCAnQScsICcxJywgJzInKSAvKiBbMTU6MF0gQjpHOlI6QSA0OjQ6NDo0IGxpdHRsZSBlbmRpYW4gKi8KKworI2RlZmluZSBEUk1fRk9STUFUX1hSR0IxNTU1CWZvdXJjY19jb2RlKCdYJywgJ1InLCAnMScsICc1JykgLyogWzE1OjBdIHg6UjpHOkIgMTo1OjU6NSBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIERSTV9GT1JNQVRfWEJHUjE1NTUJZm91cmNjX2NvZGUoJ1gnLCAnQicsICcxJywgJzUnKSAvKiBbMTU6MF0geDpCOkc6UiAxOjU6NTo1IGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9SR0JYNTU1MQlmb3VyY2NfY29kZSgnUicsICdYJywgJzEnLCAnNScpIC8qIFsxNTowXSBSOkc6Qjp4IDU6NTo1OjEgbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBEUk1fRk9STUFUX0JHUlg1NTUxCWZvdXJjY19jb2RlKCdCJywgJ1gnLCAnMScsICc1JykgLyogWzE1OjBdIEI6RzpSOnggNTo1OjU6MSBsaXR0bGUgZW5kaWFuICovCisKKyNkZWZpbmUgRFJNX0ZPUk1BVF9BUkdCMTU1NQlmb3VyY2NfY29kZSgnQScsICdSJywgJzEnLCAnNScpIC8qIFsxNTowXSBBOlI6RzpCIDE6NTo1OjUgbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBEUk1fRk9STUFUX0FCR1IxNTU1CWZvdXJjY19jb2RlKCdBJywgJ0InLCAnMScsICc1JykgLyogWzE1OjBdIEE6QjpHOlIgMTo1OjU6NSBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIERSTV9GT1JNQVRfUkdCQTU1NTEJZm91cmNjX2NvZGUoJ1InLCAnQScsICcxJywgJzUnKSAvKiBbMTU6MF0gUjpHOkI6QSA1OjU6NToxIGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9CR1JBNTU1MQlmb3VyY2NfY29kZSgnQicsICdBJywgJzEnLCAnNScpIC8qIFsxNTowXSBCOkc6UjpBIDU6NTo1OjEgbGl0dGxlIGVuZGlhbiAqLworCisjZGVmaW5lIERSTV9GT1JNQVRfUkdCNTY1CWZvdXJjY19jb2RlKCdSJywgJ0cnLCAnMScsICc2JykgLyogWzE1OjBdIFI6RzpCIDU6Njo1IGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9CR1I1NjUJZm91cmNjX2NvZGUoJ0InLCAnRycsICcxJywgJzYnKSAvKiBbMTU6MF0gQjpHOlIgNTo2OjUgbGl0dGxlIGVuZGlhbiAqLworCisvKiAyNCBicHAgUkdCICovCisjZGVmaW5lIERSTV9GT1JNQVRfUkdCODg4CWZvdXJjY19jb2RlKCdSJywgJ0cnLCAnMicsICc0JykgLyogWzIzOjBdIFI6RzpCIGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9CR1I4ODgJZm91cmNjX2NvZGUoJ0InLCAnRycsICcyJywgJzQnKSAvKiBbMjM6MF0gQjpHOlIgbGl0dGxlIGVuZGlhbiAqLworCisvKiAzMiBicHAgUkdCICovCisjZGVmaW5lIERSTV9GT1JNQVRfWFJHQjg4ODgJZm91cmNjX2NvZGUoJ1gnLCAnUicsICcyJywgJzQnKSAvKiBbMzE6MF0geDpSOkc6QiA4Ojg6ODo4IGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9YQkdSODg4OAlmb3VyY2NfY29kZSgnWCcsICdCJywgJzInLCAnNCcpIC8qIFszMTowXSB4OkI6RzpSIDg6ODo4OjggbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBEUk1fRk9STUFUX1JHQlg4ODg4CWZvdXJjY19jb2RlKCdSJywgJ1gnLCAnMicsICc0JykgLyogWzMxOjBdIFI6RzpCOnggODo4Ojg6OCBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIERSTV9GT1JNQVRfQkdSWDg4ODgJZm91cmNjX2NvZGUoJ0InLCAnWCcsICcyJywgJzQnKSAvKiBbMzE6MF0gQjpHOlI6eCA4Ojg6ODo4IGxpdHRsZSBlbmRpYW4gKi8KKworI2RlZmluZSBEUk1fRk9STUFUX0FSR0I4ODg4CWZvdXJjY19jb2RlKCdBJywgJ1InLCAnMicsICc0JykgLyogWzMxOjBdIEE6UjpHOkIgODo4Ojg6OCBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIERSTV9GT1JNQVRfQUJHUjg4ODgJZm91cmNjX2NvZGUoJ0EnLCAnQicsICcyJywgJzQnKSAvKiBbMzE6MF0gQTpCOkc6UiA4Ojg6ODo4IGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9SR0JBODg4OAlmb3VyY2NfY29kZSgnUicsICdBJywgJzInLCAnNCcpIC8qIFszMTowXSBSOkc6QjpBIDg6ODo4OjggbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBEUk1fRk9STUFUX0JHUkE4ODg4CWZvdXJjY19jb2RlKCdCJywgJ0EnLCAnMicsICc0JykgLyogWzMxOjBdIEI6RzpSOkEgODo4Ojg6OCBsaXR0bGUgZW5kaWFuICovCisKKyNkZWZpbmUgRFJNX0ZPUk1BVF9YUkdCMjEwMTAxMAlmb3VyY2NfY29kZSgnWCcsICdSJywgJzMnLCAnMCcpIC8qIFszMTowXSB4OlI6RzpCIDI6MTA6MTA6MTAgbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBEUk1fRk9STUFUX1hCR1IyMTAxMDEwCWZvdXJjY19jb2RlKCdYJywgJ0InLCAnMycsICcwJykgLyogWzMxOjBdIHg6QjpHOlIgMjoxMDoxMDoxMCBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIERSTV9GT1JNQVRfUkdCWDEwMTAxMDIJZm91cmNjX2NvZGUoJ1InLCAnWCcsICczJywgJzAnKSAvKiBbMzE6MF0gUjpHOkI6eCAxMDoxMDoxMDoyIGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9CR1JYMTAxMDEwMglmb3VyY2NfY29kZSgnQicsICdYJywgJzMnLCAnMCcpIC8qIFszMTowXSBCOkc6Ujp4IDEwOjEwOjEwOjIgbGl0dGxlIGVuZGlhbiAqLworCisjZGVmaW5lIERSTV9GT1JNQVRfQVJHQjIxMDEwMTAJZm91cmNjX2NvZGUoJ0EnLCAnUicsICczJywgJzAnKSAvKiBbMzE6MF0gQTpSOkc6QiAyOjEwOjEwOjEwIGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9BQkdSMjEwMTAxMAlmb3VyY2NfY29kZSgnQScsICdCJywgJzMnLCAnMCcpIC8qIFszMTowXSBBOkI6RzpSIDI6MTA6MTA6MTAgbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBEUk1fRk9STUFUX1JHQkExMDEwMTAyCWZvdXJjY19jb2RlKCdSJywgJ0EnLCAnMycsICcwJykgLyogWzMxOjBdIFI6RzpCOkEgMTA6MTA6MTA6MiBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIERSTV9GT1JNQVRfQkdSQTEwMTAxMDIJZm91cmNjX2NvZGUoJ0InLCAnQScsICczJywgJzAnKSAvKiBbMzE6MF0gQjpHOlI6QSAxMDoxMDoxMDoyIGxpdHRsZSBlbmRpYW4gKi8KKworLyogcGFja2VkIFlDYkNyICovCisjZGVmaW5lIERSTV9GT1JNQVRfWVVZVgkJZm91cmNjX2NvZGUoJ1knLCAnVScsICdZJywgJ1YnKSAvKiBbMzE6MF0gQ3IwOlkxOkNiMDpZMCA4Ojg6ODo4IGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9ZVllVCQlmb3VyY2NfY29kZSgnWScsICdWJywgJ1knLCAnVScpIC8qIFszMTowXSBDYjA6WTE6Q3IwOlkwIDg6ODo4OjggbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBEUk1fRk9STUFUX1VZVlkJCWZvdXJjY19jb2RlKCdVJywgJ1knLCAnVicsICdZJykgLyogWzMxOjBdIFkxOkNyMDpZMDpDYjAgODo4Ojg6OCBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIERSTV9GT1JNQVRfVllVWQkJZm91cmNjX2NvZGUoJ1YnLCAnWScsICdVJywgJ1knKSAvKiBbMzE6MF0gWTE6Q2IwOlkwOkNyMCA4Ojg6ODo4IGxpdHRsZSBlbmRpYW4gKi8KKworI2RlZmluZSBEUk1fRk9STUFUX0FZVVYJCWZvdXJjY19jb2RlKCdBJywgJ1knLCAnVScsICdWJykgLyogWzMxOjBdIEE6WTpDYjpDciA4Ojg6ODo4IGxpdHRsZSBlbmRpYW4gKi8KKworLyoKKyAqIDIgcGxhbmUgUkdCICsgQQorICogaW5kZXggMCA9IFJHQiBwbGFuZSwgc2FtZSBmb3JtYXQgYXMgdGhlIGNvcnJlc3BvbmRpbmcgbm9uIF9BOCBmb3JtYXQgaGFzCisgKiBpbmRleCAxID0gQSBwbGFuZSwgWzc6MF0gQQorICovCisjZGVmaW5lIERSTV9GT1JNQVRfWFJHQjg4ODhfQTgJZm91cmNjX2NvZGUoJ1gnLCAnUicsICdBJywgJzgnKQorI2RlZmluZSBEUk1fRk9STUFUX1hCR1I4ODg4X0E4CWZvdXJjY19jb2RlKCdYJywgJ0InLCAnQScsICc4JykKKyNkZWZpbmUgRFJNX0ZPUk1BVF9SR0JYODg4OF9BOAlmb3VyY2NfY29kZSgnUicsICdYJywgJ0EnLCAnOCcpCisjZGVmaW5lIERSTV9GT1JNQVRfQkdSWDg4ODhfQTgJZm91cmNjX2NvZGUoJ0InLCAnWCcsICdBJywgJzgnKQorI2RlZmluZSBEUk1fRk9STUFUX1JHQjg4OF9BOAlmb3VyY2NfY29kZSgnUicsICc4JywgJ0EnLCAnOCcpCisjZGVmaW5lIERSTV9GT1JNQVRfQkdSODg4X0E4CWZvdXJjY19jb2RlKCdCJywgJzgnLCAnQScsICc4JykKKyNkZWZpbmUgRFJNX0ZPUk1BVF9SR0I1NjVfQTgJZm91cmNjX2NvZGUoJ1InLCAnNScsICdBJywgJzgnKQorI2RlZmluZSBEUk1fRk9STUFUX0JHUjU2NV9BOAlmb3VyY2NfY29kZSgnQicsICc1JywgJ0EnLCAnOCcpCisKKy8qCisgKiAyIHBsYW5lIFlDYkNyCisgKiBpbmRleCAwID0gWSBwbGFuZSwgWzc6MF0gWQorICogaW5kZXggMSA9IENyOkNiIHBsYW5lLCBbMTU6MF0gQ3I6Q2IgbGl0dGxlIGVuZGlhbgorICogb3IKKyAqIGluZGV4IDEgPSBDYjpDciBwbGFuZSwgWzE1OjBdIENiOkNyIGxpdHRsZSBlbmRpYW4KKyAqLworI2RlZmluZSBEUk1fRk9STUFUX05WMTIJCWZvdXJjY19jb2RlKCdOJywgJ1YnLCAnMScsICcyJykgLyogMngyIHN1YnNhbXBsZWQgQ3I6Q2IgcGxhbmUgKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9OVjIxCQlmb3VyY2NfY29kZSgnTicsICdWJywgJzInLCAnMScpIC8qIDJ4MiBzdWJzYW1wbGVkIENiOkNyIHBsYW5lICovCisjZGVmaW5lIERSTV9GT1JNQVRfTlYxNgkJZm91cmNjX2NvZGUoJ04nLCAnVicsICcxJywgJzYnKSAvKiAyeDEgc3Vic2FtcGxlZCBDcjpDYiBwbGFuZSAqLworI2RlZmluZSBEUk1fRk9STUFUX05WNjEJCWZvdXJjY19jb2RlKCdOJywgJ1YnLCAnNicsICcxJykgLyogMngxIHN1YnNhbXBsZWQgQ2I6Q3IgcGxhbmUgKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9OVjI0CQlmb3VyY2NfY29kZSgnTicsICdWJywgJzInLCAnNCcpIC8qIG5vbi1zdWJzYW1wbGVkIENyOkNiIHBsYW5lICovCisjZGVmaW5lIERSTV9GT1JNQVRfTlY0MgkJZm91cmNjX2NvZGUoJ04nLCAnVicsICc0JywgJzInKSAvKiBub24tc3Vic2FtcGxlZCBDYjpDciBwbGFuZSAqLworI2RlZmluZSBEUk1fRk9STUFUX1AwMTAJCWZvdXJjY19jb2RlKCdQJywgJzAnLCAnMScsICcwJykgLyogMngyIHN1YnNhbXBsZWQgQ3I6Q2IgcGxhbmUsIDEwLWJpdCBwZXIgY2hhbm5lbCAqLworCisvKgorICogMyBwbGFuZSBZQ2JDcgorICogaW5kZXggMDogWSBwbGFuZSwgWzc6MF0gWQorICogaW5kZXggMTogQ2IgcGxhbmUsIFs3OjBdIENiCisgKiBpbmRleCAyOiBDciBwbGFuZSwgWzc6MF0gQ3IKKyAqIG9yCisgKiBpbmRleCAxOiBDciBwbGFuZSwgWzc6MF0gQ3IKKyAqIGluZGV4IDI6IENiIHBsYW5lLCBbNzowXSBDYgorICovCisjZGVmaW5lIERSTV9GT1JNQVRfWVVWNDEwCWZvdXJjY19jb2RlKCdZJywgJ1UnLCAnVicsICc5JykgLyogNHg0IHN1YnNhbXBsZWQgQ2IgKDEpIGFuZCBDciAoMikgcGxhbmVzICovCisjZGVmaW5lIERSTV9GT1JNQVRfWVZVNDEwCWZvdXJjY19jb2RlKCdZJywgJ1YnLCAnVScsICc5JykgLyogNHg0IHN1YnNhbXBsZWQgQ3IgKDEpIGFuZCBDYiAoMikgcGxhbmVzICovCisjZGVmaW5lIERSTV9GT1JNQVRfWVVWNDExCWZvdXJjY19jb2RlKCdZJywgJ1UnLCAnMScsICcxJykgLyogNHgxIHN1YnNhbXBsZWQgQ2IgKDEpIGFuZCBDciAoMikgcGxhbmVzICovCisjZGVmaW5lIERSTV9GT1JNQVRfWVZVNDExCWZvdXJjY19jb2RlKCdZJywgJ1YnLCAnMScsICcxJykgLyogNHgxIHN1YnNhbXBsZWQgQ3IgKDEpIGFuZCBDYiAoMikgcGxhbmVzICovCisjZGVmaW5lIERSTV9GT1JNQVRfWVVWNDIwCWZvdXJjY19jb2RlKCdZJywgJ1UnLCAnMScsICcyJykgLyogMngyIHN1YnNhbXBsZWQgQ2IgKDEpIGFuZCBDciAoMikgcGxhbmVzICovCisjZGVmaW5lIERSTV9GT1JNQVRfWVZVNDIwCWZvdXJjY19jb2RlKCdZJywgJ1YnLCAnMScsICcyJykgLyogMngyIHN1YnNhbXBsZWQgQ3IgKDEpIGFuZCBDYiAoMikgcGxhbmVzICovCisjZGVmaW5lIERSTV9GT1JNQVRfWVVWNDIyCWZvdXJjY19jb2RlKCdZJywgJ1UnLCAnMScsICc2JykgLyogMngxIHN1YnNhbXBsZWQgQ2IgKDEpIGFuZCBDciAoMikgcGxhbmVzICovCisjZGVmaW5lIERSTV9GT1JNQVRfWVZVNDIyCWZvdXJjY19jb2RlKCdZJywgJ1YnLCAnMScsICc2JykgLyogMngxIHN1YnNhbXBsZWQgQ3IgKDEpIGFuZCBDYiAoMikgcGxhbmVzICovCisjZGVmaW5lIERSTV9GT1JNQVRfWVVWNDQ0CWZvdXJjY19jb2RlKCdZJywgJ1UnLCAnMicsICc0JykgLyogbm9uLXN1YnNhbXBsZWQgQ2IgKDEpIGFuZCBDciAoMikgcGxhbmVzICovCisjZGVmaW5lIERSTV9GT1JNQVRfWVZVNDQ0CWZvdXJjY19jb2RlKCdZJywgJ1YnLCAnMicsICc0JykgLyogbm9uLXN1YnNhbXBsZWQgQ3IgKDEpIGFuZCBDYiAoMikgcGxhbmVzICovCisKKworLyoKKyAqIEZvcm1hdCBNb2RpZmllcnM6CisgKgorICogRm9ybWF0IG1vZGlmaWVycyBkZXNjcmliZSwgdHlwaWNhbGx5LCBhIHJlLW9yZGVyaW5nIG9yIG1vZGlmaWNhdGlvbgorICogb2YgdGhlIGRhdGEgaW4gYSBwbGFuZSBvZiBhbiBGQi4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gZXhwcmVzcyB0aWxlZC8KKyAqIHN3aXp6bGVkIGZvcm1hdHMsIG9yIGNvbXByZXNzaW9uLCBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28uCisgKgorICogVGhlIHVwcGVyIDggYml0cyBvZiB0aGUgZm9ybWF0IG1vZGlmaWVyIGFyZSBhIHZlbmRvci1pZCBhcyBhc3NpZ25lZAorICogYmVsb3cuICBUaGUgbG93ZXIgNTYgYml0cyBhcmUgYXNzaWduZWQgYXMgdmVuZG9yIHNlZXMgZml0LgorICovCisKKy8qIFZlbmRvciBJZHM6ICovCisjZGVmaW5lIERSTV9GT1JNQVRfTU9EX05PTkUgICAgICAgICAgIDAKKyNkZWZpbmUgRFJNX0ZPUk1BVF9NT0RfVkVORE9SX05PTkUgICAgMAorI2RlZmluZSBEUk1fRk9STUFUX01PRF9WRU5ET1JfSU5URUwgICAweDAxCisjZGVmaW5lIERSTV9GT1JNQVRfTU9EX1ZFTkRPUl9BTUQgICAgIDB4MDIKKyNkZWZpbmUgRFJNX0ZPUk1BVF9NT0RfVkVORE9SX05WICAgICAgMHgwMworI2RlZmluZSBEUk1fRk9STUFUX01PRF9WRU5ET1JfU0FNU1VORyAweDA0CisjZGVmaW5lIERSTV9GT1JNQVRfTU9EX1ZFTkRPUl9RQ09NICAgIDB4MDUKKyNkZWZpbmUgRFJNX0ZPUk1BVF9NT0RfVkVORE9SX1ZJVkFOVEUgMHgwNgorI2RlZmluZSBEUk1fRk9STUFUX01PRF9WRU5ET1JfQlJPQURDT00gMHgwNworI2RlZmluZSBEUk1fRk9STUFUX01PRF9WRU5ET1JfQU1QSElPTiAgMHgwOAorI2RlZmluZSBEUk1fRk9STUFUX01PRF9WRU5ET1JfVlNJICAgICAgMHgwOQorLyogYWRkIG1vcmUgdG8gdGhlIGVuZCBhcyBuZWVkZWQgKi8KKworI2RlZmluZSBEUk1fRk9STUFUX1JFU0VSVkVECSAgICAgICgoMVVMTCA8PCA1NikgLSAxKQorCisjZGVmaW5lIGZvdXJjY19tb2RfY29kZSh2ZW5kb3IsIHZhbCkgXAorCSgoKChfX3U2NClEUk1fRk9STUFUX01PRF9WRU5ET1JfIyMgdmVuZG9yKSA8PCA1NikgfCAodmFsICYgMHgwMGZmZmZmZmZmZmZmZmZmVUxMKSkKKworLyoKKyAqIEZvcm1hdCBNb2RpZmllciB0b2tlbnM6CisgKgorICogV2hlbiBhZGRpbmcgYSBuZXcgdG9rZW4gcGxlYXNlIGRvY3VtZW50IHRoZSBsYXlvdXQgd2l0aCBhIGNvZGUgY29tbWVudCwKKyAqIHNpbWlsYXIgdG8gdGhlIGZvdXJjYyBjb2RlcyBhYm92ZS4gZHJtX2ZvdXJjYy5oIGlzIGNvbnNpZGVyZWQgdGhlCisgKiBhdXRob3JpdGF0aXZlIHNvdXJjZSBmb3IgYWxsIG9mIHRoZXNlLgorICovCisKKy8qCisgKiBJbnZhbGlkIE1vZGlmaWVyCisgKgorICogVGhpcyBtb2RpZmllciBjYW4gYmUgdXNlZCBhcyBhIHNlbnRpbmVsIHRvIHRlcm1pbmF0ZSB0aGUgZm9ybWF0IG1vZGlmaWVycworICogbGlzdCwgb3IgdG8gaW5pdGlhbGl6ZSBhIHZhcmlhYmxlIHdpdGggYW4gaW52YWxpZCBtb2RpZmllci4gSXQgbWlnaHQgYWxzbyBiZQorICogdXNlZCB0byByZXBvcnQgYW4gZXJyb3IgYmFjayB0byB1c2Vyc3BhY2UgZm9yIGNlcnRhaW4gQVBJcy4KKyAqLworI2RlZmluZSBEUk1fRk9STUFUX01PRF9JTlZBTElECWZvdXJjY19tb2RfY29kZShOT05FLCBEUk1fRk9STUFUX1JFU0VSVkVEKQorCisvKgorICogTGluZWFyIExheW91dAorICoKKyAqIEp1c3QgcGxhaW4gbGluZWFyIGxheW91dC4gTm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gbm8gc3BlY2lmeWluZyBhbnkKKyAqIG1vZGlmaWVyIChlLmcuIG5vdCBzZXR0aW5nIERSTV9NT0RFX0ZCX01PRElGSUVSUyBpbiB0aGUgRFJNX0FEREZCMiBpb2N0bCksCisgKiB3aGljaCB0ZWxscyB0aGUgZHJpdmVyIHRvIGFsc28gdGFrZSBkcml2ZXItaW50ZXJuYWwgaW5mb3JtYXRpb24gaW50byBhY2NvdW50CisgKiBhbmQgc28gbWlnaHQgYWN0dWFsbHkgcmVzdWx0IGluIGEgdGlsZWQgZnJhbWVidWZmZXIuCisgKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9NT0RfTElORUFSCWZvdXJjY19tb2RfY29kZShOT05FLCAwKQorCisvKiBJbnRlbCBmcmFtZWJ1ZmZlciBtb2RpZmllcnMgKi8KKworLyoKKyAqIEludGVsIFgtdGlsaW5nIGxheW91dAorICoKKyAqIFRoaXMgaXMgYSB0aWxlZCBsYXlvdXQgdXNpbmcgNEtiIHRpbGVzIChleGNlcHQgb24gZ2VuMiB3aGVyZSB0aGUgdGlsZXMgMktiKQorICogaW4gcm93LW1ham9yIGxheW91dC4gV2l0aGluIHRoZSB0aWxlIGJ5dGVzIGFyZSBsYWlkIG91dCByb3ctbWFqb3IsIHdpdGgKKyAqIGEgcGxhdGZvcm0tZGVwZW5kZW50IHN0cmlkZS4gT24gdG9wIG9mIHRoYXQgdGhlIG1lbW9yeSBjYW4gYXBwbHkKKyAqIHBsYXRmb3JtLWRlcGVuZGluZyBzd2l6emxpbmcgb2Ygc29tZSBoaWdoZXIgYWRkcmVzcyBiaXRzIGludG8gYml0Ni4KKyAqCisgKiBUaGlzIGZvcm1hdCBpcyBoaWdobHkgcGxhdGZvcm1zIHNwZWNpZmljIGFuZCBub3QgdXNlZnVsIGZvciBjcm9zcy1kcml2ZXIKKyAqIHNoYXJpbmcuIEl0IGV4aXN0cyBzaW5jZSBvbiBhIGdpdmVuIHBsYXRmb3JtIGl0IGRvZXMgdW5pcXVlbHkgaWRlbnRpZnkgdGhlCisgKiBsYXlvdXQgaW4gYSBzaW1wbGUgd2F5IGZvciBpOTE1LXNwZWNpZmljIHVzZXJzcGFjZS4KKyAqLworI2RlZmluZSBJOTE1X0ZPUk1BVF9NT0RfWF9USUxFRAlmb3VyY2NfbW9kX2NvZGUoSU5URUwsIDEpCisKKy8qCisgKiBJbnRlbCBZLXRpbGluZyBsYXlvdXQKKyAqCisgKiBUaGlzIGlzIGEgdGlsZWQgbGF5b3V0IHVzaW5nIDRLYiB0aWxlcyAoZXhjZXB0IG9uIGdlbjIgd2hlcmUgdGhlIHRpbGVzIDJLYikKKyAqIGluIHJvdy1tYWpvciBsYXlvdXQuIFdpdGhpbiB0aGUgdGlsZSBieXRlcyBhcmUgbGFpZCBvdXQgaW4gT1dPUkQgKDE2IGJ5dGVzKQorICogY2h1bmtzIGNvbHVtbi1tYWpvciwgd2l0aCBhIHBsYXRmb3JtLWRlcGVuZGVudCBoZWlnaHQuIE9uIHRvcCBvZiB0aGF0IHRoZQorICogbWVtb3J5IGNhbiBhcHBseSBwbGF0Zm9ybS1kZXBlbmRpbmcgc3dpenpsaW5nIG9mIHNvbWUgaGlnaGVyIGFkZHJlc3MgYml0cworICogaW50byBiaXQ2LgorICoKKyAqIFRoaXMgZm9ybWF0IGlzIGhpZ2hseSBwbGF0Zm9ybXMgc3BlY2lmaWMgYW5kIG5vdCB1c2VmdWwgZm9yIGNyb3NzLWRyaXZlcgorICogc2hhcmluZy4gSXQgZXhpc3RzIHNpbmNlIG9uIGEgZ2l2ZW4gcGxhdGZvcm0gaXQgZG9lcyB1bmlxdWVseSBpZGVudGlmeSB0aGUKKyAqIGxheW91dCBpbiBhIHNpbXBsZSB3YXkgZm9yIGk5MTUtc3BlY2lmaWMgdXNlcnNwYWNlLgorICovCisjZGVmaW5lIEk5MTVfRk9STUFUX01PRF9ZX1RJTEVECWZvdXJjY19tb2RfY29kZShJTlRFTCwgMikKKworLyoKKyAqIEludGVsIFlmLXRpbGluZyBsYXlvdXQKKyAqCisgKiBUaGlzIGlzIGEgdGlsZWQgbGF5b3V0IHVzaW5nIDRLYiB0aWxlcyBpbiByb3ctbWFqb3IgbGF5b3V0LgorICogV2l0aGluIHRoZSB0aWxlIHBpeGVscyBhcmUgbGFpZCBvdXQgaW4gMTYgMjU2IGJ5dGUgdW5pdHMgLyBzdWItdGlsZXMgd2hpY2gKKyAqIGFyZSBhcnJhbmdlZCBpbiBmb3VyIGdyb3VwcyAodHdvIHdpZGUsIHR3byBoaWdoKSB3aXRoIGNvbHVtbi1tYWpvciBsYXlvdXQuCisgKiBFYWNoIGdyb3VwIHRoZXJlZm9yZSBjb25zaXRzIG91dCBvZiBmb3VyIDI1NiBieXRlIHVuaXRzLCB3aGljaCBhcmUgYWxzbyBsYWlkCisgKiBvdXQgYXMgMngyIGNvbHVtbi1tYWpvci4KKyAqIDI1NiBieXRlIHVuaXRzIGFyZSBtYWRlIG91dCBvZiBmb3VyIDY0IGJ5dGUgYmxvY2tzIG9mIHBpeGVscywgcHJvZHVjaW5nCisgKiBlaXRoZXIgYSBzcXVhcmUgYmxvY2sgb3IgYSAyOjEgdW5pdC4KKyAqIDY0IGJ5dGUgYmxvY2tzIG9mIHBpeGVscyBjb250YWluIGZvdXIgcGl4ZWwgcm93cyBvZiAxNiBieXRlcywgd2hlcmUgdGhlIHdpZHRoCisgKiBpbiBwaXhlbCBkZXBlbmRzIG9uIHRoZSBwaXhlbCBkZXB0aC4KKyAqLworI2RlZmluZSBJOTE1X0ZPUk1BVF9NT0RfWWZfVElMRUQgZm91cmNjX21vZF9jb2RlKElOVEVMLCAzKQorCisvKgorICogSW50ZWwgY29sb3IgY29udHJvbCBzdXJmYWNlIChDQ1MpIGZvciByZW5kZXIgY29tcHJlc3Npb24KKyAqCisgKiBUaGUgZnJhbWVidWZmZXIgZm9ybWF0IG11c3QgYmUgb25lIG9mIHRoZSA4Ojg6ODo4IFJHQiBmb3JtYXRzLgorICogVGhlIG1haW4gc3VyZmFjZSB3aWxsIGJlIHBsYW5lIGluZGV4IDAgYW5kIG11c3QgYmUgWS9ZZi10aWxlZCwKKyAqIHRoZSBDQ1Mgd2lsbCBiZSBwbGFuZSBpbmRleCAxLgorICoKKyAqIEVhY2ggQ0NTIHRpbGUgbWF0Y2hlcyBhIDEwMjR4NTEyIHBpeGVsIGFyZWEgb2YgdGhlIG1haW4gc3VyZmFjZS4KKyAqIFRvIG1hdGNoIGNlcnRhaW4gYXNwZWN0cyBvZiB0aGUgM0QgaGFyZHdhcmUgdGhlIENDUyBpcworICogY29uc2lkZXJlZCB0byBiZSBtYWRlIHVwIG9mIG5vcm1hbCAxMjhCeDMyIFkgdGlsZXMsIFRodXMKKyAqIHRoZSBDQ1MgcGl0Y2ggbXVzdCBiZSBzcGVjaWZpZWQgaW4gbXVsdGlwbGVzIG9mIDEyOCBieXRlcy4KKyAqCisgKiBJbiByZWFsaXR5IHRoZSBDQ1MgdGlsZSBhcHBlYXJzIHRvIGJlIGEgNjRCeDY0IFkgdGlsZSwgY29tcG9zZWQKKyAqIG9mIFFXT1JEICg4IGJ5dGVzKSBjaHVua3MgaW5zdGVhZCBvZiBPV09SRCAoMTYgYnl0ZXMpIGNodW5rcy4KKyAqIEJ1dCB0aGF0IGZhY3QgaXMgbm90IHJlbGV2YW50IHVubGVzcyB0aGUgbWVtb3J5IGlzIGFjY2Vzc2VkCisgKiBkaXJlY3RseS4KKyAqLworI2RlZmluZSBJOTE1X0ZPUk1BVF9NT0RfWV9USUxFRF9DQ1MJZm91cmNjX21vZF9jb2RlKElOVEVMLCA0KQorI2RlZmluZSBJOTE1X0ZPUk1BVF9NT0RfWWZfVElMRURfQ0NTCWZvdXJjY19tb2RfY29kZShJTlRFTCwgNSkKKworLyoKKyAqIFRpbGVkLCBOVjEyTVQsIGdyb3VwZWQgaW4gNjQgKHBpeGVscykgeCAzMiAobGluZXMpIC1zaXplZCBtYWNyb2Jsb2NrcworICoKKyAqIE1hY3JvYmxvY2tzIGFyZSBsYWlkIGluIGEgWi1zaGFwZSwgYW5kIGVhY2ggcGl4ZWwgZGF0YSBpcyBmb2xsb3dpbmcgdGhlCisgKiBzdGFuZGFyZCBOVjEyIHN0eWxlLgorICogQXMgZm9yIE5WMTIsIGFuIGltYWdlIGlzIHRoZSByZXN1bHQgb2YgdHdvIGZyYW1lIGJ1ZmZlcnM6IG9uZSBmb3IgWSwKKyAqIG9uZSBmb3IgdGhlIGludGVybGVhdmVkIENiL0NyIGNvbXBvbmVudHMgKDEvMiB0aGUgaGVpZ2h0IG9mIHRoZSBZIGJ1ZmZlcikuCisgKiBBbGlnbm1lbnQgcmVxdWlyZW1lbnRzIGFyZSAoZm9yIGVhY2ggYnVmZmVyKToKKyAqIC0gbXVsdGlwbGUgb2YgMTI4IHBpeGVscyBmb3IgdGhlIHdpZHRoCisgKiAtIG11bHRpcGxlIG9mICAzMiBwaXhlbHMgZm9yIHRoZSBoZWlnaHQKKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbjogc2VlIGh0dHA6Ly9saW51eHR2Lm9yZy9kb3dubG9hZHMvdjRsLWR2Yi1hcGlzL3JlMzIuaHRtbAorICovCisjZGVmaW5lIERSTV9GT1JNQVRfTU9EX1NBTVNVTkdfNjRfMzJfVElMRQlmb3VyY2NfbW9kX2NvZGUoU0FNU1VORywgMSkKKworLyogVml2YW50ZSBmcmFtZWJ1ZmZlciBtb2RpZmllcnMgKi8KKworLyoKKyAqIFZpdmFudGUgNHg0IHRpbGluZyBsYXlvdXQKKyAqCisgKiBUaGlzIGlzIGEgc2ltcGxlIHRpbGVkIGxheW91dCB1c2luZyB0aWxlcyBvZiA0eDQgcGl4ZWxzIGluIGEgcm93LW1ham9yCisgKiBsYXlvdXQuCisgKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9NT0RfVklWQU5URV9USUxFRAkJZm91cmNjX21vZF9jb2RlKFZJVkFOVEUsIDEpCisKKy8qCisgKiBWaXZhbnRlIDY0eDY0IHN1cGVyLXRpbGluZyBsYXlvdXQKKyAqCisgKiBUaGlzIGlzIGEgdGlsZWQgbGF5b3V0IHVzaW5nIDY0eDY0IHBpeGVsIHN1cGVyLXRpbGVzLCB3aGVyZSBlYWNoIHN1cGVyLXRpbGUKKyAqIGNvbnRhaW5zIDh4NCBncm91cHMgb2YgMng0IHRpbGVzIG9mIDR4NCBwaXhlbHMgKGxpa2UgYWJvdmUpIGVhY2gsIGFsbCBpbiByb3ctCisgKiBtYWpvciBsYXlvdXQuCisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb246IHNlZQorICogaHR0cHM6Ly9naXRodWIuY29tL2V0bmF2aXYvZXRuYV92aXYvYmxvYi9tYXN0ZXIvZG9jL2hhcmR3YXJlLm1kI3RleHR1cmUtdGlsaW5nCisgKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9NT0RfVklWQU5URV9TVVBFUl9USUxFRAlmb3VyY2NfbW9kX2NvZGUoVklWQU5URSwgMikKKworLyoKKyAqIFZpdmFudGUgNHg0IHRpbGluZyBsYXlvdXQgZm9yIGR1YWwtcGlwZQorICoKKyAqIFNhbWUgYXMgdGhlIDR4NCB0aWxpbmcgbGF5b3V0LCBleGNlcHQgZXZlcnkgc2Vjb25kIDR4NCBwaXhlbCB0aWxlIHN0YXJ0cyBhdCBhCisgKiBkaWZmZXJlbnQgYmFzZSBhZGRyZXNzLiBPZmZzZXRzIGZyb20gdGhlIGJhc2UgYWRkcmVzc2VzIGFyZSB0aGVyZWZvcmUgaGFsdmVkCisgKiBjb21wYXJlZCB0byB0aGUgbm9uLXNwbGl0IHRpbGVkIGxheW91dC4KKyAqLworI2RlZmluZSBEUk1fRk9STUFUX01PRF9WSVZBTlRFX1NQTElUX1RJTEVECWZvdXJjY19tb2RfY29kZShWSVZBTlRFLCAzKQorCisvKgorICogVml2YW50ZSA2NHg2NCBzdXBlci10aWxpbmcgbGF5b3V0IGZvciBkdWFsLXBpcGUKKyAqCisgKiBTYW1lIGFzIHRoZSA2NHg2NCBzdXBlci10aWxpbmcgbGF5b3V0LCBleGNlcHQgZXZlcnkgc2Vjb25kIDR4NCBwaXhlbCB0aWxlCisgKiBzdGFydHMgYXQgYSBkaWZmZXJlbnQgYmFzZSBhZGRyZXNzLiBPZmZzZXRzIGZyb20gdGhlIGJhc2UgYWRkcmVzc2VzIGFyZQorICogdGhlcmVmb3JlIGhhbHZlZCBjb21wYXJlZCB0byB0aGUgbm9uLXNwbGl0IHN1cGVyLXRpbGVkIGxheW91dC4KKyAqLworI2RlZmluZSBEUk1fRk9STUFUX01PRF9WSVZBTlRFX1NQTElUX1NVUEVSX1RJTEVEIGZvdXJjY19tb2RfY29kZShWSVZBTlRFLCA0KQorCisvKgorICogVml2YW50ZSA2NHg2NCBzdXBlci10aWxpbmcgd2l0aCBjb21wcmVzc2lvbiBsYXlvdXQKKyAqCisgKiBUaGlzIGlzIGEgdGlsZWQgbGF5b3V0IHVzaW5nIDY0eDY0IHBpeGVsIHN1cGVyLXRpbGVzLCB3aGVyZSBlYWNoIHN1cGVyLXRpbGUKKyAqIGNvbnRhaW5zIDh4NCBncm91cHMgb2YgMng0IHRpbGVzIG9mIDR4NCBwaXhlbHMgZWFjaCwgYWxsIGluIHJvdy1tYWpvciBsYXlvdXQKKyAqIHdpdGggY29tcHJlc3Npb24uCisgKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9NT0RfVklWQU5URV9TVVBFUl9USUxFRF9GQyAgZm91cmNjX21vZF9jb2RlKFZJVkFOVEUsIDUpCisKKy8qIE5WSURJQSBUZWdyYSBmcmFtZSBidWZmZXIgbW9kaWZpZXJzICovCisKKy8qCisgKiBTb21lIG1vZGlmaWVycyB0YWtlIHBhcmFtZXRlcnMsIGZvciBleGFtcGxlIHRoZSBudW1iZXIgb2YgdmVydGljYWwgR09CcyBpbgorICogYSBibG9jay4gUmVzZXJ2ZSB0aGUgbG93ZXIgMzIgYml0cyBmb3IgcGFyYW1ldGVycworICovCisjZGVmaW5lIF9fZm91cmNjX21vZF90ZWdyYV9tb2RlX3NoaWZ0IDMyCisjZGVmaW5lIGZvdXJjY19tb2RfdGVncmFfY29kZSh2YWwsIHBhcmFtcykgXAorCWZvdXJjY19tb2RfY29kZShOViwgKCgoKF9fdTY0KXZhbCkgPDwgX19mb3VyY2NfbW9kX3RlZ3JhX21vZGVfc2hpZnQpIHwgcGFyYW1zKSkKKyNkZWZpbmUgZm91cmNjX21vZF90ZWdyYV9tb2QobSkgXAorCShtICYgfigoMVVMTCA8PCBfX2ZvdXJjY19tb2RfdGVncmFfbW9kZV9zaGlmdCkgLSAxKSkKKyNkZWZpbmUgZm91cmNjX21vZF90ZWdyYV9wYXJhbShtKSBcCisJKG0gJiAoKDFVTEwgPDwgX19mb3VyY2NfbW9kX3RlZ3JhX21vZGVfc2hpZnQpIC0gMSkpCisKKy8qCisgKiBUZWdyYSBUaWxlZCBMYXlvdXQsIHVzZWQgYnkgVGVncmEgMiwgMyBhbmQgNC4KKyAqCisgKiBQaXhlbHMgYXJlIGFycmFuZ2VkIGluIHNpbXBsZSB0aWxlcyBvZiAxNiB4IDE2IGJ5dGVzLgorICovCisjZGVmaW5lIE5WX0ZPUk1BVF9NT0RfVEVHUkFfVElMRUQgZm91cmNjX21vZF90ZWdyYV9jb2RlKDEsIDApCisKKy8qCisgKiBUZWdyYSAxNkJ4MiBCbG9jayBMaW5lYXIgbGF5b3V0LCB1c2VkIGJ5IFRLMS9UWDEKKyAqCisgKiBQaXhlbHMgYXJlIGFycmFuZ2VkIGluIDY0eDggR3JvdXBzIE9mIEJ5dGVzIChHT0JzKS4gR09CcyBhcmUgdGhlbiBzdGFja2VkCisgKiB2ZXJ0aWNhbGx5IGJ5IGEgcG93ZXIgb2YgMiAoMSB0byAzMiBHT0JzKSB0byBmb3JtIGEgYmxvY2suCisgKgorICogV2l0aGluIGEgR09CLCBkYXRhIGlzIG9yZGVyZWQgYXMgMTZCIHggMiBsaW5lcyBzZWN0b3JzIGxhaWQgaW4gWi1zaGFwZS4KKyAqCisgKiBQYXJhbWV0ZXIgJ3YnIGlzIHRoZSBsb2cyIGVuY29kaW5nIG9mIHRoZSBudW1iZXIgb2YgR09CcyBzdGFja2VkIHZlcnRpY2FsbHkuCisgKiBWYWxpZCB2YWx1ZXMgYXJlOgorICoKKyAqIDAgPT0gT05FX0dPQgorICogMSA9PSBUV09fR09CUworICogMiA9PSBGT1VSX0dPQlMKKyAqIDMgPT0gRUlHSFRfR09CUworICogNCA9PSBTSVhURUVOX0dPQlMKKyAqIDUgPT0gVEhJUlRZVFdPX0dPQlMKKyAqCisgKiBDaGFwdGVyIDIwICJQaXhlbCBNZW1vcnkgRm9ybWF0cyIgb2YgdGhlIFRlZ3JhIFgxIFRSTSBkZXNjcmliZXMgdGhpcyBmb3JtYXQKKyAqIGluIGZ1bGwgZGV0YWlsLgorICovCisjZGVmaW5lIE5WX0ZPUk1BVF9NT0RfVEVHUkFfMTZCWDJfQkxPQ0sodikgZm91cmNjX21vZF90ZWdyYV9jb2RlKDIsIHYpCisKKy8qCisgKiBCcm9hZGNvbSBWQzQgIlQiIGZvcm1hdAorICoKKyAqIFRoaXMgaXMgdGhlIHByaW1hcnkgbGF5b3V0IHRoYXQgdGhlIFYzRCBHUFUgY2FuIHRleHR1cmUgZnJvbSAoaXQKKyAqIGNhbid0IGRvIGxpbmVhcikuICBUaGUgVCBmb3JtYXQgaGFzOgorICoKKyAqIC0gNjRiIHV0aWxlcyBvZiBwaXhlbHMgaW4gYSByYXN0ZXItb3JkZXIgZ3JpZCBhY2NvcmRpbmcgdG8gY3BwLiAgSXQncyA0eDQKKyAqICAgcGl4ZWxzIGF0IDMyIGJpdCBkZXB0aC4KKyAqCisgKiAtIDFrIHN1YnRpbGVzIG1hZGUgb2YgYSA0eDQgcmFzdGVyLW9yZGVyIGdyaWQgb2YgNjRiIHV0aWxlcyAoc28gdXN1YWxseQorICogICAxNngxNiBwaXhlbHMpLgorICoKKyAqIC0gNGsgdGlsZXMgbWFkZSBvZiBhIDJ4MiBncmlkIG9mIDFrIHN1YnRpbGVzIChzbyB1c3VhbGx5IDMyeDMyIHBpeGVscykuICBPbgorICogICBldmVuIDRrIHRpbGUgcm93cywgdGhleSdyZSBhcnJhbmdlZCBhcyAoQkwsIFRMLCBUUiwgQlIpLCBhbmQgb24gb2RkIHJvd3MKKyAqICAgdGhleSdyZSAoVFIsIEJSLCBCTCwgVEwpLCB3aGVyZSBib3R0b20gbGVmdCBpcyBzdGFydCBvZiBtZW1vcnkuCisgKgorICogLSBhbiBpbWFnZSBtYWRlIG9mIDRrIHRpbGVzIGluIHJvd3MgZWl0aGVyIGxlZnQtdG8tcmlnaHQgKGV2ZW4gcm93cyBvZiA0aworICogICB0aWxlcykgb3IgcmlnaHQtdG8tbGVmdCAob2RkIHJvd3Mgb2YgNGsgdGlsZXMpLgorICovCisjZGVmaW5lIERSTV9GT1JNQVRfTU9EX0JST0FEQ09NX1ZDNF9UX1RJTEVEIGZvdXJjY19tb2RfY29kZShCUk9BRENPTSwgMSkKKworLyogQW1waGlvbiB0aWxlZCBsYXlvdXQgKi8KKworLyoKKyAqIEFtcGhpb24gOHgxMjggdGlsaW5nIGxheW91dAorICoKKyAqIFRoaXMgaXMgYSB0aWxlZCBsYXlvdXQgdXNpbmcgOHgxMjggcGl4ZWwgdmVydGljYWwgc3RyaXBzLCB3aGVyZSBlYWNoIHN0cmlwCisgKiBjb250YWlucyAxeDE2IGdyb3VwcyBvZiA4eDggcGl4ZWxzIGluIGEgcm93LW1ham9yIGxheW91dC4KKyAqLworI2RlZmluZSBEUk1fRk9STUFUX01PRF9BTVBISU9OX1RJTEVEIGZvdXJjY19tb2RfY29kZShBTVBISU9OLCAxKQorCisvKiBWZXJpc2lsaWNvbiBmcmFtZWJ1ZmZlciBtb2RpZmllcnMgKi8KKworLyoKKyAqIFZlcmlzaWxpY29uIDh4NCB0aWxpbmcgbGF5b3V0CisgKgorICogVGhpcyBpcyBHMSBWUFUgdGlsZWQgbGF5b3V0IHVzaW5nIHRpbGVzIG9mIDh4NCBwaXhlbHMgaW4gYSByb3ctbWFqb3IKKyAqIGxheW91dC4KKyAqLworI2RlZmluZSBEUk1fRk9STUFUX01PRF9WU0lfRzFfVElMRUQgZm91cmNjX21vZF9jb2RlKFZTSSwgMSkKKworLyoKKyAqIFZlcmlzaWxpY29uIDR4NCB0aWxpbmcgbGF5b3V0CisgKgorICogVGhpcyBpcyBHMiBWUFUgdGlsZWQgbGF5b3V0IHVzaW5nIHRpbGVzIG9mIDR4NCBwaXhlbHMgaW4gYSByb3ctbWFqb3IKKyAqIGxheW91dC4KKyAqLworI2RlZmluZSBEUk1fRk9STUFUX01PRF9WU0lfRzJfVElMRUQgZm91cmNjX21vZF9jb2RlKFZTSSwgMikKKworLyoKKyAqIFZlcmlzaWxpY29uIDR4NCB0aWxpbmcgd2l0aCBjb21wcmVzc2lvbiBsYXlvdXQKKyAqCisgKiBUaGlzIGlzIEcyIFZQVSB0aWxlZCBsYXlvdXQgdXNpbmcgdGlsZXMgb2YgNHg0IHBpeGVscyBpbiBhIHJvdy1tYWpvcgorICogbGF5b3V0IHdpdGggY29tcHJlc3Npb24uCisgKi8KKyNkZWZpbmUgRFJNX0ZPUk1BVF9NT0RfVlNJX0cyX1RJTEVEX0NPTVBSRVNTRUQgZm91cmNjX21vZF9jb2RlKFZTSSwgMykKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmIC8qIERSTV9GT1VSQ0NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX21vZGUuaCBiL2luY2x1ZGUvZHJtL2RybV9tb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjljOWMwYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL2RybV9tb2RlLmgKQEAgLTAsMCArMSw4NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgRGF2ZSBBaXJsaWUgPGFpcmxpZWRAbGludXguaWU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSmFrb2IgQm9ybmVjcmFudHogPHdhbGxicmFrZXJAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA4IFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRYLiwgVVNBCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9EUk1fTU9ERV9ICisjZGVmaW5lIF9EUk1fTU9ERV9ICisKKyNpbmNsdWRlICJkcm0uaCIKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIERSTV9ESVNQTEFZX0lORk9fTEVOCTMyCisjZGVmaW5lIERSTV9DT05ORUNUT1JfTkFNRV9MRU4JMzIKKyNkZWZpbmUgRFJNX0RJU1BMQVlfTU9ERV9MRU4JMzIKKyNkZWZpbmUgRFJNX1BST1BfTkFNRV9MRU4JMzIKKworI2RlZmluZSBEUk1fTU9ERV9UWVBFX0JVSUxUSU4JKDE8PDApCisjZGVmaW5lIERSTV9NT0RFX1RZUEVfQ0xPQ0tfQwkoKDE8PDEpIHwgRFJNX01PREVfVFlQRV9CVUlMVElOKQorI2RlZmluZSBEUk1fTU9ERV9UWVBFX0NSVENfQwkoKDE8PDIpIHwgRFJNX01PREVfVFlQRV9CVUlMVElOKQorI2RlZmluZSBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRAkoMTw8MykKKyNkZWZpbmUgRFJNX01PREVfVFlQRV9ERUZBVUxUCSgxPDw0KQorI2RlZmluZSBEUk1fTU9ERV9UWVBFX1VTRVJERUYJKDE8PDUpCisjZGVmaW5lIERSTV9NT0RFX1RZUEVfRFJJVkVSCSgxPDw2KQorCisvKiBWaWRlbyBtb2RlIGZsYWdzICovCisvKiBiaXQgY29tcGF0aWJsZSB3aXRoIHRoZSB4cmFuZHIgUlJfIGRlZmluaXRpb25zIChiaXRzIDAtMTMpCisgKgorICogQUJJIHdhcm5pbmc6IEV4aXN0aW5nIHVzZXJzcGFjZSByZWFsbHkgZXhwZWN0cworICogdGhlIG1vZGUgZmxhZ3MgdG8gbWF0Y2ggdGhlIHhyYW5kciBkZWZpbml0aW9ucy4gQW55CisgKiBjaGFuZ2VzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIHhyYW5kciBkZWZpbml0aW9ucyB3aWxsCisgKiBsaWtlbHkgbmVlZCBhIG5ldyBjbGllbnQgY2FwIG9yIHNvbWUgb3RoZXIgbWVjaGFuaXNtCisgKiB0byBhdm9pZCBicmVha2luZyBleGlzdGluZyB1c2Vyc3BhY2UuIFRoaXMgaW5jbHVkZXMKKyAqIGFsbG9jYXRpbmcgbmV3IGZsYWdzIGluIHRoZSBwcmV2aW91c2x5IHVudXNlZCBiaXRzIQorICovCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfUEhTWU5DCQkJKDE8PDApCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfTkhTWU5DCQkJKDE8PDEpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfUFZTWU5DCQkJKDE8PDIpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfTlZTWU5DCQkJKDE8PDMpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFCQkJKDE8PDQpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfREJMU0NBTgkJCSgxPDw1KQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX0NTWU5DCQkJKDE8PDYpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfUENTWU5DCQkJKDE8PDcpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfTkNTWU5DCQkJKDE8PDgpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfSFNLRVcJCQkoMTw8OSkgLyogaHNrZXcgcHJvdmlkZWQgKi8KKyNkZWZpbmUgRFJNX01PREVfRkxBR19CQ0FTVAkJCSgxPDwxMCkKKyNkZWZpbmUgRFJNX01PREVfRkxBR19QSVhNVVgJCQkoMTw8MTEpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfREJMQ0xLCQkJKDE8PDEyKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX0NMS0RJVjIJCQkoMTw8MTMpCisgLyoKKyAgKiBXaGVuIGFkZGluZyBhIG5ldyBzdGVyZW8gbW9kZSBkb24ndCBmb3JnZXQgdG8gYWRqdXN0IERSTV9NT0RFX0ZMQUdTXzNEX01BWAorICAqIChkZWZpbmUgbm90IGV4cG9zZWQgdG8gdXNlciBzcGFjZSkuCisgICovCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfM0RfTUFTSwkJCSgweDFmPDwxNCkKKyNkZWZpbmUgIERSTV9NT0RFX0ZMQUdfM0RfTk9ORQkJCSgwPDwxNCkKKyNkZWZpbmUgIERSTV9NT0RFX0ZMQUdfM0RfRlJBTUVfUEFDS0lORwkJKDE8PDE0KQorI2RlZmluZSAgRFJNX01PREVfRkxBR18zRF9GSUVMRF9BTFRFUk5BVElWRQkoMjw8MTQpCisjZGVmaW5lICBEUk1fTU9ERV9GTEFHXzNEX0xJTkVfQUxURVJOQVRJVkUJKDM8PDE0KQorI2RlZmluZSAgRFJNX01PREVfRkxBR18zRF9TSURFX0JZX1NJREVfRlVMTAkoNDw8MTQpCisjZGVmaW5lICBEUk1fTU9ERV9GTEFHXzNEX0xfREVQVEgJCSg1PDwxNCkKKyNkZWZpbmUgIERSTV9NT0RFX0ZMQUdfM0RfTF9ERVBUSF9HRlhfR0ZYX0RFUFRICSg2PDwxNCkKKyNkZWZpbmUgIERSTV9NT0RFX0ZMQUdfM0RfVE9QX0FORF9CT1RUT00JKDc8PDE0KQorI2RlZmluZSAgRFJNX01PREVfRkxBR18zRF9TSURFX0JZX1NJREVfSEFMRgkoODw8MTQpCisKKworLyogRFBNUyBmbGFncyAqLworLyogYml0IGNvbXBhdGlibGUgd2l0aCB0aGUgeG9yZyBkZWZpbml0aW9ucy4gKi8KKyNkZWZpbmUgRFJNX01PREVfRFBNU19PTgkwCisjZGVmaW5lIERSTV9NT0RFX0RQTVNfU1RBTkRCWQkxCisjZGVmaW5lIERSTV9NT0RFX0RQTVNfU1VTUEVORAkyCisjZGVmaW5lIERSTV9NT0RFX0RQTVNfT0ZGCTMKKworLyogU2NhbGluZyBtb2RlIG9wdGlvbnMgKi8KKyNkZWZpbmUgRFJNX01PREVfU0NBTEVfTk9ORQkJMCAvKiBVbm1vZGlmaWVkIHRpbWluZyAoZGlzcGxheSBvcgorCQkJCQkgICAgIHNvZnR3YXJlIGNhbiBzdGlsbCBzY2FsZSkgKi8KKyNkZWZpbmUgRFJNX01PREVfU0NBTEVfRlVMTFNDUkVFTgkxIC8qIEZ1bGwgc2NyZWVuLCBpZ25vcmUgYXNwZWN0ICovCisjZGVmaW5lIERSTV9NT0RFX1NDQUxFX0NFTlRFUgkJMiAvKiBDZW50ZXJlZCwgbm8gc2NhbGluZyAqLworI2RlZmluZSBEUk1fTU9ERV9TQ0FMRV9BU1BFQ1QJCTMgLyogRnVsbCBzY3JlZW4sIHByZXNlcnZlIGFzcGVjdCAqLworCisvKiBQaWN0dXJlIGFzcGVjdCByYXRpbyBvcHRpb25zICovCisjZGVmaW5lIERSTV9NT0RFX1BJQ1RVUkVfQVNQRUNUX05PTkUJMAorI2RlZmluZSBEUk1fTU9ERV9QSUNUVVJFX0FTUEVDVF80XzMJMQorI2RlZmluZSBEUk1fTU9ERV9QSUNUVVJFX0FTUEVDVF8xNl85CTIKKworLyogRGl0aGVyaW5nIG1vZGUgb3B0aW9ucyAqLworI2RlZmluZSBEUk1fTU9ERV9ESVRIRVJJTkdfT0ZGCTAKKyNkZWZpbmUgRFJNX01PREVfRElUSEVSSU5HX09OCTEKKyNkZWZpbmUgRFJNX01PREVfRElUSEVSSU5HX0FVVE8gMgorCisvKiBEaXJ0eSBpbmZvIG9wdGlvbnMgKi8KKyNkZWZpbmUgRFJNX01PREVfRElSVFlfT0ZGICAgICAgMAorI2RlZmluZSBEUk1fTU9ERV9ESVJUWV9PTiAgICAgICAxCisjZGVmaW5lIERSTV9NT0RFX0RJUlRZX0FOTk9UQVRFIDIKKworLyogTGluayBTdGF0dXMgb3B0aW9ucyAqLworI2RlZmluZSBEUk1fTU9ERV9MSU5LX1NUQVRVU19HT09ECTAKKyNkZWZpbmUgRFJNX01PREVfTElOS19TVEFUVVNfQkFECTEKKworLyoKKyAqIERSTV9NT0RFX1JPVEFURV88ZGVncmVlcz4KKyAqCisgKiBTaWduYWxzIHRoYXQgYSBkcm0gcGxhbmUgaXMgYmVlbiByb3RhdGVkIDxkZWdyZWVzPiBkZWdyZWVzIGluIGNvdW50ZXIKKyAqIGNsb2Nrd2lzZSBkaXJlY3Rpb24uCisgKgorICogVGhpcyBkZWZpbmUgaXMgcHJvdmlkZWQgYXMgYSBjb252ZW5pZW5jZSwgbG9va2luZyB1cCB0aGUgcHJvcGVydHkgaWQKKyAqIHVzaW5nIHRoZSBuYW1lLT5wcm9wIGlkIGxvb2t1cCBpcyB0aGUgcHJlZmVycmVkIG1ldGhvZC4KKyAqLworI2RlZmluZSBEUk1fTU9ERV9ST1RBVEVfMCAgICAgICAoMTw8MCkKKyNkZWZpbmUgRFJNX01PREVfUk9UQVRFXzkwICAgICAgKDE8PDEpCisjZGVmaW5lIERSTV9NT0RFX1JPVEFURV8xODAgICAgICgxPDwyKQorI2RlZmluZSBEUk1fTU9ERV9ST1RBVEVfMjcwICAgICAoMTw8MykKKworLyoKKyAqIERSTV9NT0RFX1JPVEFURV9NQVNLCisgKgorICogQml0bWFzayB1c2VkIHRvIGxvb2sgZm9yIGRybSBwbGFuZSByb3RhdGlvbnMuCisgKi8KKyNkZWZpbmUgRFJNX01PREVfUk9UQVRFX01BU0sgKFwKKwkJRFJNX01PREVfUk9UQVRFXzAgIHwgXAorCQlEUk1fTU9ERV9ST1RBVEVfOTAgIHwgXAorCQlEUk1fTU9ERV9ST1RBVEVfMTgwIHwgXAorCQlEUk1fTU9ERV9ST1RBVEVfMjcwKQorCisvKgorICogRFJNX01PREVfUkVGTEVDVF88YXhpcz4KKyAqCisgKiBTaWduYWxzIHRoYXQgdGhlIGNvbnRlbnRzIG9mIGEgZHJtIHBsYW5lIGlzIHJlZmxlY3RlZCBpbiB0aGUgPGF4aXM+IGF4aXMsCisgKiBpbiB0aGUgc2FtZSB3YXkgYXMgbWlycm9yaW5nLgorICoKKyAqIFRoaXMgZGVmaW5lIGlzIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2UsIGxvb2tpbmcgdXAgdGhlIHByb3BlcnR5IGlkCisgKiB1c2luZyB0aGUgbmFtZS0+cHJvcCBpZCBsb29rdXAgaXMgdGhlIHByZWZlcnJlZCBtZXRob2QuCisgKi8KKyNkZWZpbmUgRFJNX01PREVfUkVGTEVDVF9YICAgICAgKDE8PDQpCisjZGVmaW5lIERSTV9NT0RFX1JFRkxFQ1RfWSAgICAgICgxPDw1KQorCisvKgorICogRFJNX01PREVfUkVGTEVDVF9NQVNLCisgKgorICogQml0bWFzayB1c2VkIHRvIGxvb2sgZm9yIGRybSBwbGFuZSByZWZsZWN0aW9ucy4KKyAqLworI2RlZmluZSBEUk1fTU9ERV9SRUZMRUNUX01BU0sgKFwKKwkJRFJNX01PREVfUkVGTEVDVF9YIHwgXAorCQlEUk1fTU9ERV9SRUZMRUNUX1kpCisKKworc3RydWN0IGRybV9tb2RlX21vZGVpbmZvIHsKKwlfX3UzMiBjbG9jazsKKwlfX3UxNiBoZGlzcGxheTsKKwlfX3UxNiBoc3luY19zdGFydDsKKwlfX3UxNiBoc3luY19lbmQ7CisJX191MTYgaHRvdGFsOworCV9fdTE2IGhza2V3OworCV9fdTE2IHZkaXNwbGF5OworCV9fdTE2IHZzeW5jX3N0YXJ0OworCV9fdTE2IHZzeW5jX2VuZDsKKwlfX3UxNiB2dG90YWw7CisJX191MTYgdnNjYW47CisKKwlfX3UzMiB2cmVmcmVzaDsKKworCV9fdTMyIGZsYWdzOworCV9fdTMyIHR5cGU7CisJY2hhciBuYW1lW0RSTV9ESVNQTEFZX01PREVfTEVOXTsKK307CisKK3N0cnVjdCBkcm1fbW9kZV9jYXJkX3JlcyB7CisJX191NjQgZmJfaWRfcHRyOworCV9fdTY0IGNydGNfaWRfcHRyOworCV9fdTY0IGNvbm5lY3Rvcl9pZF9wdHI7CisJX191NjQgZW5jb2Rlcl9pZF9wdHI7CisJX191MzIgY291bnRfZmJzOworCV9fdTMyIGNvdW50X2NydGNzOworCV9fdTMyIGNvdW50X2Nvbm5lY3RvcnM7CisJX191MzIgY291bnRfZW5jb2RlcnM7CisJX191MzIgbWluX3dpZHRoOworCV9fdTMyIG1heF93aWR0aDsKKwlfX3UzMiBtaW5faGVpZ2h0OworCV9fdTMyIG1heF9oZWlnaHQ7Cit9OworCitzdHJ1Y3QgZHJtX21vZGVfY3J0YyB7CisJX191NjQgc2V0X2Nvbm5lY3RvcnNfcHRyOworCV9fdTMyIGNvdW50X2Nvbm5lY3RvcnM7CisKKwlfX3UzMiBjcnRjX2lkOyAvKio8IElkICovCisJX191MzIgZmJfaWQ7IC8qKjwgSWQgb2YgZnJhbWVidWZmZXIgKi8KKworCV9fdTMyIHg7IC8qKjwgeCBQb3NpdGlvbiBvbiB0aGUgZnJhbWVidWZmZXIgKi8KKwlfX3UzMiB5OyAvKio8IHkgUG9zaXRpb24gb24gdGhlIGZyYW1lYnVmZmVyICovCisKKwlfX3UzMiBnYW1tYV9zaXplOworCV9fdTMyIG1vZGVfdmFsaWQ7CisJc3RydWN0IGRybV9tb2RlX21vZGVpbmZvIG1vZGU7Cit9OworCisjZGVmaW5lIERSTV9NT0RFX1BSRVNFTlRfVE9QX0ZJRUxECSgxPDwwKQorI2RlZmluZSBEUk1fTU9ERV9QUkVTRU5UX0JPVFRPTV9GSUVMRAkoMTw8MSkKKworLyogUGxhbmVzIGJsZW5kIHdpdGggb3Igb3ZlcnJpZGUgb3RoZXIgYml0cyBvbiB0aGUgQ1JUQyAqLworc3RydWN0IGRybV9tb2RlX3NldF9wbGFuZSB7CisJX191MzIgcGxhbmVfaWQ7CisJX191MzIgY3J0Y19pZDsKKwlfX3UzMiBmYl9pZDsgLyogZmIgb2JqZWN0IGNvbnRhaW5zIHN1cmZhY2UgZm9ybWF0IHR5cGUgKi8KKwlfX3UzMiBmbGFnczsgLyogc2VlIGFib3ZlIGZsYWdzICovCisKKwkvKiBTaWduZWQgZGVzdCBsb2NhdGlvbiBhbGxvd3MgaXQgdG8gYmUgcGFydGlhbGx5IG9mZiBzY3JlZW4gKi8KKwlfX3MzMiBjcnRjX3g7CisJX19zMzIgY3J0Y195OworCV9fdTMyIGNydGNfdzsKKwlfX3UzMiBjcnRjX2g7CisKKwkvKiBTb3VyY2UgdmFsdWVzIGFyZSAxNi4xNiBmaXhlZCBwb2ludCAqLworCV9fdTMyIHNyY194OworCV9fdTMyIHNyY195OworCV9fdTMyIHNyY19oOworCV9fdTMyIHNyY193OworfTsKKworc3RydWN0IGRybV9tb2RlX2dldF9wbGFuZSB7CisJX191MzIgcGxhbmVfaWQ7CisKKwlfX3UzMiBjcnRjX2lkOworCV9fdTMyIGZiX2lkOworCisJX191MzIgcG9zc2libGVfY3J0Y3M7CisJX191MzIgZ2FtbWFfc2l6ZTsKKworCV9fdTMyIGNvdW50X2Zvcm1hdF90eXBlczsKKwlfX3U2NCBmb3JtYXRfdHlwZV9wdHI7Cit9OworCitzdHJ1Y3QgZHJtX21vZGVfZ2V0X3BsYW5lX3JlcyB7CisJX191NjQgcGxhbmVfaWRfcHRyOworCV9fdTMyIGNvdW50X3BsYW5lczsKK307CisKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9OT05FCTAKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9EQUMJMQorI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX1RNRFMJMgorI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX0xWRFMJMworI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX1RWREFDCTQKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9WSVJUVUFMIDUKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9EU0kJNgorI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX0RQTVNUCTcKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9EUEkJOAorCitzdHJ1Y3QgZHJtX21vZGVfZ2V0X2VuY29kZXIgeworCV9fdTMyIGVuY29kZXJfaWQ7CisJX191MzIgZW5jb2Rlcl90eXBlOworCisJX191MzIgY3J0Y19pZDsgLyoqPCBJZCBvZiBjcnRjICovCisKKwlfX3UzMiBwb3NzaWJsZV9jcnRjczsKKwlfX3UzMiBwb3NzaWJsZV9jbG9uZXM7Cit9OworCisvKiBUaGlzIGlzIGZvciBjb25uZWN0b3JzIHdpdGggbXVsdGlwbGUgc2lnbmFsIHR5cGVzLiAqLworLyogVHJ5IHRvIG1hdGNoIERSTV9NT0RFX0NPTk5FQ1RPUl9YIGFzIGNsb3NlbHkgYXMgcG9zc2libGUuICovCitlbnVtIGRybV9tb2RlX3N1YmNvbm5lY3RvciB7CisJRFJNX01PREVfU1VCQ09OTkVDVE9SX0F1dG9tYXRpYyA9IDAsCisJRFJNX01PREVfU1VCQ09OTkVDVE9SX1Vua25vd24gPSAwLAorCURSTV9NT0RFX1NVQkNPTk5FQ1RPUl9EVklEID0gMywKKwlEUk1fTU9ERV9TVUJDT05ORUNUT1JfRFZJQSA9IDQsCisJRFJNX01PREVfU1VCQ09OTkVDVE9SX0NvbXBvc2l0ZSA9IDUsCisJRFJNX01PREVfU1VCQ09OTkVDVE9SX1NWSURFTyA9IDYsCisJRFJNX01PREVfU1VCQ09OTkVDVE9SX0NvbXBvbmVudCA9IDgsCisJRFJNX01PREVfU1VCQ09OTkVDVE9SX1NDQVJUID0gOSwKK307CisKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX1Vua25vd24JMAorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfVkdBCQkxCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklJCQkyCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklECQkzCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklBCQk0CisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9Db21wb3NpdGUJNQorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfU1ZJREVPCTYKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0xWRFMJCTcKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0NvbXBvbmVudAk4CisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl85UGluRElOCTkKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0CTEwCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQQkxMQorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUIJMTIKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX1RWCQkxMworI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfZURQCQkxNAorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfVklSVFVBTCAgICAgIDE1CisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9EU0kJCTE2CisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9EUEkJCTE3CisKK3N0cnVjdCBkcm1fbW9kZV9nZXRfY29ubmVjdG9yIHsKKworCV9fdTY0IGVuY29kZXJzX3B0cjsKKwlfX3U2NCBtb2Rlc19wdHI7CisJX191NjQgcHJvcHNfcHRyOworCV9fdTY0IHByb3BfdmFsdWVzX3B0cjsKKworCV9fdTMyIGNvdW50X21vZGVzOworCV9fdTMyIGNvdW50X3Byb3BzOworCV9fdTMyIGNvdW50X2VuY29kZXJzOworCisJX191MzIgZW5jb2Rlcl9pZDsgLyoqPCBDdXJyZW50IEVuY29kZXIgKi8KKwlfX3UzMiBjb25uZWN0b3JfaWQ7IC8qKjwgSWQgKi8KKwlfX3UzMiBjb25uZWN0b3JfdHlwZTsKKwlfX3UzMiBjb25uZWN0b3JfdHlwZV9pZDsKKworCV9fdTMyIGNvbm5lY3Rpb247CisJX191MzIgbW1fd2lkdGg7ICAvKio8IHdpZHRoIGluIG1pbGxpbWV0ZXJzICovCisJX191MzIgbW1faGVpZ2h0OyAvKio8IGhlaWdodCBpbiBtaWxsaW1ldGVycyAqLworCV9fdTMyIHN1YnBpeGVsOworCisJX191MzIgcGFkOworfTsKKworI2RlZmluZSBEUk1fTU9ERV9QUk9QX1BFTkRJTkcJKDE8PDApCisjZGVmaW5lIERSTV9NT0RFX1BST1BfUkFOR0UJKDE8PDEpCisjZGVmaW5lIERSTV9NT0RFX1BST1BfSU1NVVRBQkxFCSgxPDwyKQorI2RlZmluZSBEUk1fTU9ERV9QUk9QX0VOVU0JKDE8PDMpIC8qIGVudW1lcmF0ZWQgdHlwZSB3aXRoIHRleHQgc3RyaW5ncyAqLworI2RlZmluZSBEUk1fTU9ERV9QUk9QX0JMT0IJKDE8PDQpCisjZGVmaW5lIERSTV9NT0RFX1BST1BfQklUTUFTSwkoMTw8NSkgLyogYml0bWFzayBvZiBlbnVtZXJhdGVkIHR5cGVzICovCisKKy8qIG5vbi1leHRlbmRlZCB0eXBlczogbGVnYWN5IGJpdG1hc2ssIG9uZSBiaXQgcGVyIHR5cGU6ICovCisjZGVmaW5lIERSTV9NT0RFX1BST1BfTEVHQUNZX1RZUEUgICggXAorCQlEUk1fTU9ERV9QUk9QX1JBTkdFIHwgXAorCQlEUk1fTU9ERV9QUk9QX0VOVU0gfCBcCisJCURSTV9NT0RFX1BST1BfQkxPQiB8IFwKKwkJRFJNX01PREVfUFJPUF9CSVRNQVNLKQorCisvKiBleHRlbmRlZC10eXBlczogcmF0aGVyIHRoYW4gY29udGludWUgdG8gY29uc3VtZSBhIGJpdCBwZXIgdHlwZSwKKyAqIGdyYWIgYSBjaHVuayBvZiB0aGUgYml0cyB0byB1c2UgYXMgaW50ZWdlciB0eXBlIGlkLgorICovCisjZGVmaW5lIERSTV9NT0RFX1BST1BfRVhURU5ERURfVFlQRQkweDAwMDBmZmMwCisjZGVmaW5lIERSTV9NT0RFX1BST1BfVFlQRShuKQkJKChuKSA8PCA2KQorI2RlZmluZSBEUk1fTU9ERV9QUk9QX09CSkVDVAkJRFJNX01PREVfUFJPUF9UWVBFKDEpCisjZGVmaW5lIERSTV9NT0RFX1BST1BfU0lHTkVEX1JBTkdFCURSTV9NT0RFX1BST1BfVFlQRSgyKQorCisvKiB0aGUgUFJPUF9BVE9NSUMgZmxhZyBpcyB1c2VkIHRvIGhpZGUgcHJvcGVydGllcyBmcm9tIHVzZXJzcGFjZSB0aGF0CisgKiBpcyBub3QgYXdhcmUgb2YgYXRvbWljIHByb3BlcnRpZXMuICBUaGlzIGlzIG1vc3RseSB0byB3b3JrIGFyb3VuZAorICogb2xkZXIgdXNlcnNwYWNlIChERFggZHJpdmVycykgdGhhdCByZWFkL3dyaXRlIGVhY2ggcHJvcCB0aGV5IGZpbmQsCisgKiB3aXRvdXQgYmVpbmcgYXdhcmUgdGhhdCB0aGlzIGNvdWxkIGJlIHRyaWdnZXJpbmcgYSBsZW5ndGh5IG1vZGVzZXQuCisgKi8KKyNkZWZpbmUgRFJNX01PREVfUFJPUF9BVE9NSUMgICAgICAgIDB4ODAwMDAwMDAKKworc3RydWN0IGRybV9tb2RlX3Byb3BlcnR5X2VudW0geworCV9fdTY0IHZhbHVlOworCWNoYXIgbmFtZVtEUk1fUFJPUF9OQU1FX0xFTl07Cit9OworCitzdHJ1Y3QgZHJtX21vZGVfZ2V0X3Byb3BlcnR5IHsKKwlfX3U2NCB2YWx1ZXNfcHRyOyAvKiB2YWx1ZXMgYW5kIGJsb2IgbGVuZ3RocyAqLworCV9fdTY0IGVudW1fYmxvYl9wdHI7IC8qIGVudW0gYW5kIGJsb2IgaWQgcHRycyAqLworCisJX191MzIgcHJvcF9pZDsKKwlfX3UzMiBmbGFnczsKKwljaGFyIG5hbWVbRFJNX1BST1BfTkFNRV9MRU5dOworCisJX191MzIgY291bnRfdmFsdWVzOworCS8qIFRoaXMgaXMgb25seSB1c2VkIHRvIGNvdW50IGVudW0gdmFsdWVzLCBub3QgYmxvYnMuIFRoZSBfYmxvYnMgaXMKKwkgKiBzaW1wbHkgYmVjYXVzZSBvZiBhIGhpc3RvcmljYWwgcmVhc29uLCBpLmUuIGJhY2t3YXJkcyBjb21wYXQuICovCisJX191MzIgY291bnRfZW51bV9ibG9iczsKK307CisKK3N0cnVjdCBkcm1fbW9kZV9jb25uZWN0b3Jfc2V0X3Byb3BlcnR5IHsKKwlfX3U2NCB2YWx1ZTsKKwlfX3UzMiBwcm9wX2lkOworCV9fdTMyIGNvbm5lY3Rvcl9pZDsKK307CisKKyNkZWZpbmUgRFJNX01PREVfT0JKRUNUX0NSVEMgMHhjY2NjY2NjYworI2RlZmluZSBEUk1fTU9ERV9PQkpFQ1RfQ09OTkVDVE9SIDB4YzBjMGMwYzAKKyNkZWZpbmUgRFJNX01PREVfT0JKRUNUX0VOQ09ERVIgMHhlMGUwZTBlMAorI2RlZmluZSBEUk1fTU9ERV9PQkpFQ1RfTU9ERSAweGRlZGVkZWRlCisjZGVmaW5lIERSTV9NT0RFX09CSkVDVF9QUk9QRVJUWSAweGIwYjBiMGIwCisjZGVmaW5lIERSTV9NT0RFX09CSkVDVF9GQiAweGZiZmJmYmZiCisjZGVmaW5lIERSTV9NT0RFX09CSkVDVF9CTE9CIDB4YmJiYmJiYmIKKyNkZWZpbmUgRFJNX01PREVfT0JKRUNUX1BMQU5FIDB4ZWVlZWVlZWUKKyNkZWZpbmUgRFJNX01PREVfT0JKRUNUX0FOWSAwCisKK3N0cnVjdCBkcm1fbW9kZV9vYmpfZ2V0X3Byb3BlcnRpZXMgeworCV9fdTY0IHByb3BzX3B0cjsKKwlfX3U2NCBwcm9wX3ZhbHVlc19wdHI7CisJX191MzIgY291bnRfcHJvcHM7CisJX191MzIgb2JqX2lkOworCV9fdTMyIG9ial90eXBlOworfTsKKworc3RydWN0IGRybV9tb2RlX29ial9zZXRfcHJvcGVydHkgeworCV9fdTY0IHZhbHVlOworCV9fdTMyIHByb3BfaWQ7CisJX191MzIgb2JqX2lkOworCV9fdTMyIG9ial90eXBlOworfTsKKworc3RydWN0IGRybV9tb2RlX2dldF9ibG9iIHsKKwlfX3UzMiBibG9iX2lkOworCV9fdTMyIGxlbmd0aDsKKwlfX3U2NCBkYXRhOworfTsKKworc3RydWN0IGRybV9tb2RlX2ZiX2NtZCB7CisJX191MzIgZmJfaWQ7CisJX191MzIgd2lkdGg7CisJX191MzIgaGVpZ2h0OworCV9fdTMyIHBpdGNoOworCV9fdTMyIGJwcDsKKwlfX3UzMiBkZXB0aDsKKwkvKiBkcml2ZXIgc3BlY2lmaWMgaGFuZGxlICovCisJX191MzIgaGFuZGxlOworfTsKKworI2RlZmluZSBEUk1fTU9ERV9GQl9JTlRFUkxBQ0VECSgxPDwwKSAvKiBmb3IgaW50ZXJsYWNlZCBmcmFtZWJ1ZmZlcnMgKi8KKyNkZWZpbmUgRFJNX01PREVfRkJfTU9ESUZJRVJTCSgxPDwxKSAvKiBlbmFibGVzIC0+bW9kaWZlcltdICovCisKK3N0cnVjdCBkcm1fbW9kZV9mYl9jbWQyIHsKKwlfX3UzMiBmYl9pZDsKKwlfX3UzMiB3aWR0aDsKKwlfX3UzMiBoZWlnaHQ7CisJX191MzIgcGl4ZWxfZm9ybWF0OyAvKiBmb3VyY2MgY29kZSBmcm9tIGRybV9mb3VyY2MuaCAqLworCV9fdTMyIGZsYWdzOyAvKiBzZWUgYWJvdmUgZmxhZ3MgKi8KKworCS8qCisJICogSW4gY2FzZSBvZiBwbGFuYXIgZm9ybWF0cywgdGhpcyBpb2N0bCBhbGxvd3MgdXAgdG8gNAorCSAqIGJ1ZmZlciBvYmplY3RzIHdpdGggb2Zmc2V0cyBhbmQgcGl0Y2hlcyBwZXIgcGxhbmUuCisJICogVGhlIHBpdGNoIGFuZCBvZmZzZXQgb3JkZXIgaXMgZGljdGF0ZWQgYnkgdGhlIGZvdXJjYywKKwkgKiBlLmcuIE5WMTIgKGh0dHA6Ly9mb3VyY2Mub3JnL3l1di5waHAjTlYxMikgaXMgZGVzY3JpYmVkIGFzOgorCSAqCisJICogICBZVVYgNDoyOjAgaW1hZ2Ugd2l0aCBhIHBsYW5lIG9mIDggYml0IFkgc2FtcGxlcworCSAqICAgZm9sbG93ZWQgYnkgYW4gaW50ZXJsZWF2ZWQgVS9WIHBsYW5lIGNvbnRhaW5pbmcKKwkgKiAgIDggYml0IDJ4MiBzdWJzYW1wbGVkIGNvbG91ciBkaWZmZXJlbmNlIHNhbXBsZXMuCisJICoKKwkgKiBTbyBpdCB3b3VsZCBjb25zaXN0IG9mIFkgYXMgb2Zmc2V0c1swXSBhbmQgVVYgYXMKKwkgKiBvZmZzZXRzWzFdLiAgTm90ZSB0aGF0IG9mZnNldHNbMF0gd2lsbCBnZW5lcmFsbHkKKwkgKiBiZSAwIChidXQgdGhpcyBpcyBub3QgcmVxdWlyZWQpLgorCSAqCisJICogVG8gYWNjb21tb2RhdGUgdGlsZWQsIGNvbXByZXNzZWQsIGV0YyBmb3JtYXRzLCBhCisJICogbW9kaWZpZXIgY2FuIGJlIHNwZWNpZmllZC4gIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHplcm8KKwkgKiBpbmRpY2F0ZXMgIm5hdGl2ZSIgZm9ybWF0IGFzIHNwZWNpZmllZCBieSB0aGUgZm91cmNjLgorCSAqIFZlbmRvciBzcGVjaWZpYyBtb2RpZmllciB0b2tlbi4gIE5vdGUgdGhhdCBldmVuIHRob3VnaAorCSAqIGl0IGxvb2tzIGxpa2Ugd2UgaGF2ZSBhIG1vZGlmaWVyIHBlci1wbGFuZSwgd2UgaW4gZmFjdAorCSAqIGRvIG5vdC4gVGhlIG1vZGlmaWVyIGZvciBlYWNoIHBsYW5lIG11c3QgYmUgaWRlbnRpY2FsLgorCSAqIFRodXMgYWxsIGNvbWJpbmF0aW9ucyBvZiBkaWZmZXJlbnQgZGF0YSBsYXlvdXRzIGZvcgorCSAqIG11bHRpIHBsYW5lIGZvcm1hdHMgbXVzdCBiZSBlbnVtZXJhdGVkIGFzIHNlcGFyYXRlCisJICogbW9kaWZpZXJzLgorCSAqLworCV9fdTMyIGhhbmRsZXNbNF07CisJX191MzIgcGl0Y2hlc1s0XTsgLyogcGl0Y2ggZm9yIGVhY2ggcGxhbmUgKi8KKwlfX3UzMiBvZmZzZXRzWzRdOyAvKiBvZmZzZXQgb2YgZWFjaCBwbGFuZSAqLworCV9fdTY0IG1vZGlmaWVyWzRdOyAvKiBpZSwgdGlsaW5nLCBjb21wcmVzcyAqLworfTsKKworI2RlZmluZSBEUk1fTU9ERV9GQl9ESVJUWV9BTk5PVEFURV9DT1BZIDB4MDEKKyNkZWZpbmUgRFJNX01PREVfRkJfRElSVFlfQU5OT1RBVEVfRklMTCAweDAyCisjZGVmaW5lIERSTV9NT0RFX0ZCX0RJUlRZX0ZMQUdTICAgICAgICAgMHgwMworCisjZGVmaW5lIERSTV9NT0RFX0ZCX0RJUlRZX01BWF9DTElQUyAgICAgMjU2CisKKy8qCisgKiBNYXJrIGEgcmVnaW9uIG9mIGEgZnJhbWVidWZmZXIgYXMgZGlydHkuCisgKgorICogU29tZSBoYXJkd2FyZSBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSBkaXNwbGF5IGNvbnRlbnRzCisgKiBhcyBhIGhhcmR3YXJlIG9yIHNvZnR3YXJlIGRyYXcgdG8gYSBmcmFtZWJ1ZmZlci4gVGhpcyBpb2N0bAorICogYWxsb3dzIHVzZXJzcGFjZSB0byB0ZWxsIHRoZSBrZXJuZWwgYW5kIHRoZSBoYXJkd2FyZSB3aGF0CisgKiByZWdpb25zIG9mIHRoZSBmcmFtZWJ1ZmZlciBoYXZlIGNoYW5nZWQuCisgKgorICogVGhlIGtlcm5lbCBvciBoYXJkd2FyZSBpcyBmcmVlIHRvIHVwZGF0ZSBtb3JlIHRoZW4ganVzdCB0aGUKKyAqIHJlZ2lvbiBzcGVjaWZpZWQgYnkgdGhlIGNsaXAgcmVjdHMuIFRoZSBrZXJuZWwgb3IgaGFyZHdhcmUKKyAqIG1heSBhbHNvIGRlbGF5IGFuZC9vciBjb2FsZXNjZSBzZXZlcmFsIGNhbGxzIHRvIGRpcnR5IGludG8gYQorICogc2luZ2xlIHVwZGF0ZS4KKyAqCisgKiBVc2Vyc3BhY2UgbWF5IGFubm90YXRlIHRoZSB1cGRhdGVzLCB0aGUgYW5ub3RhdGVzIGFyZSBhCisgKiBwcm9taXNlIG1hZGUgYnkgdGhlIGNhbGxlciB0aGF0IHRoZSBjaGFuZ2UgaXMgZWl0aGVyIGEgY29weQorICogb2YgcGl4ZWxzIG9yIGEgZmlsbCBvZiBhIHNpbmdsZSBjb2xvciBpbiB0aGUgcmVnaW9uIHNwZWNpZmllZC4KKyAqCisgKiBJZiB0aGUgRFJNX01PREVfRkJfRElSVFlfQU5OT1RBVEVfQ09QWSBmbGFnIGlzIGdpdmVuIHRoZW4KKyAqIHRoZSBudW1iZXIgb2YgdXBkYXRlZCByZWdpb25zIGFyZSBoYWxmIG9mIG51bV9jbGlwcyBnaXZlbiwKKyAqIHdoZXJlIHRoZSBjbGlwIHJlY3RzIGFyZSBwYWlyZWQgaW4gc3JjIGFuZCBkc3QuIFRoZSB3aWR0aCBhbmQKKyAqIGhlaWdodCBvZiBlYWNoIG9uZSBvZiB0aGUgcGFpcnMgbXVzdCBtYXRjaC4KKyAqCisgKiBJZiB0aGUgRFJNX01PREVfRkJfRElSVFlfQU5OT1RBVEVfRklMTCBmbGFnIGlzIGdpdmVuIHRoZSBjYWxsZXIKKyAqIHByb21pc2VzIHRoYXQgdGhlIHJlZ2lvbiBzcGVjaWZpZWQgb2YgdGhlIGNsaXAgcmVjdHMgaXMgZmlsbGVkCisgKiBjb21wbGV0ZWx5IHdpdGggYSBzaW5nbGUgY29sb3IgYXMgZ2l2ZW4gaW4gdGhlIGNvbG9yIGFyZ3VtZW50LgorICovCisKK3N0cnVjdCBkcm1fbW9kZV9mYl9kaXJ0eV9jbWQgeworCV9fdTMyIGZiX2lkOworCV9fdTMyIGZsYWdzOworCV9fdTMyIGNvbG9yOworCV9fdTMyIG51bV9jbGlwczsKKwlfX3U2NCBjbGlwc19wdHI7Cit9OworCitzdHJ1Y3QgZHJtX21vZGVfbW9kZV9jbWQgeworCV9fdTMyIGNvbm5lY3Rvcl9pZDsKKwlzdHJ1Y3QgZHJtX21vZGVfbW9kZWluZm8gbW9kZTsKK307CisKKyNkZWZpbmUgRFJNX01PREVfQ1VSU09SX0JPCTB4MDEKKyNkZWZpbmUgRFJNX01PREVfQ1VSU09SX01PVkUJMHgwMgorI2RlZmluZSBEUk1fTU9ERV9DVVJTT1JfRkxBR1MJMHgwMworCisvKgorICogZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBpbiBmbGFncyBkaWZmZXJlbnQgbWVtYmVycyBhcmUgdXNlZC4KKyAqCisgKiBDVVJTT1JfQk8gdXNlcworICogICAgY3J0Y19pZAorICogICAgd2lkdGgKKyAqICAgIGhlaWdodAorICogICAgaGFuZGxlIC0gaWYgMCB0dXJucyB0aGUgY3Vyc29yIG9mZgorICoKKyAqIENVUlNPUl9NT1ZFIHVzZXMKKyAqICAgIGNydGNfaWQKKyAqICAgIHgKKyAqICAgIHkKKyAqLworc3RydWN0IGRybV9tb2RlX2N1cnNvciB7CisJX191MzIgZmxhZ3M7CisJX191MzIgY3J0Y19pZDsKKwlfX3MzMiB4OworCV9fczMyIHk7CisJX191MzIgd2lkdGg7CisJX191MzIgaGVpZ2h0OworCS8qIGRyaXZlciBzcGVjaWZpYyBoYW5kbGUgKi8KKwlfX3UzMiBoYW5kbGU7Cit9OworCitzdHJ1Y3QgZHJtX21vZGVfY3Vyc29yMiB7CisJX191MzIgZmxhZ3M7CisJX191MzIgY3J0Y19pZDsKKwlfX3MzMiB4OworCV9fczMyIHk7CisJX191MzIgd2lkdGg7CisJX191MzIgaGVpZ2h0OworCS8qIGRyaXZlciBzcGVjaWZpYyBoYW5kbGUgKi8KKwlfX3UzMiBoYW5kbGU7CisJX19zMzIgaG90X3g7CisJX19zMzIgaG90X3k7Cit9OworCitzdHJ1Y3QgZHJtX21vZGVfY3J0Y19sdXQgeworCV9fdTMyIGNydGNfaWQ7CisJX191MzIgZ2FtbWFfc2l6ZTsKKworCS8qIHBvaW50ZXJzIHRvIGFycmF5cyAqLworCV9fdTY0IHJlZDsKKwlfX3U2NCBncmVlbjsKKwlfX3U2NCBibHVlOworfTsKKworc3RydWN0IGRybV9jb2xvcl9jdG0geworCS8qIENvbnZlcnNpb24gbWF0cml4IGluIFMzMS4zMiBmb3JtYXQuICovCisJX19zNjQgbWF0cml4WzldOworfTsKKworc3RydWN0IGRybV9jb2xvcl9sdXQgeworCS8qCisJICogRGF0YSBpcyBVMC4xNiBmaXhlZCBwb2ludCBmb3JtYXQuCisJICovCisJX191MTYgcmVkOworCV9fdTE2IGdyZWVuOworCV9fdTE2IGJsdWU7CisJX191MTYgcmVzZXJ2ZWQ7Cit9OworCitlbnVtIHN1cHBvcnRlZF9lb3RmX3R5cGUgeworCVRSQURJVElPTkFMX0dBTU1BX1NEUiA9IDAsCisJVFJBRElUSU9OQV9HQU1NQV9IRFIsCisJU01QVEVfU1QyMDg0LAorCUZVVFVSRV9FT1RGCit9OworCisvKiBIRFIgTWV0YWRhdGEgKi8KK3N0cnVjdCBoZHJfc3RhdGljX21ldGFkYXRhIHsKKwlfX3U4IGVvdGY7CisJX191OCB0eXBlOworCV9fdTE2IGRpc3BsYXlfcHJpbWFyaWVzX3hbM107CisJX191MTYgZGlzcGxheV9wcmltYXJpZXNfeVszXTsKKwlfX3UxNiB3aGl0ZV9wb2ludF94OworCV9fdTE2IHdoaXRlX3BvaW50X3k7CisJX191MTYgbWF4X21hc3RlcmluZ19kaXNwbGF5X2x1bWluYW5jZTsKKwlfX3UxNiBtaW5fbWFzdGVyaW5nX2Rpc3BsYXlfbHVtaW5hbmNlOworCV9fdTE2IG1heF9mYWxsOworCV9fdTE2IG1heF9jbGw7Cit9OworCisjZGVmaW5lIERSTV9NT0RFX1BBR0VfRkxJUF9FVkVOVCAweDAxCisjZGVmaW5lIERSTV9NT0RFX1BBR0VfRkxJUF9BU1lOQyAweDAyCisjZGVmaW5lIERSTV9NT0RFX1BBR0VfRkxJUF9UQVJHRVRfQUJTT0xVVEUgMHg0CisjZGVmaW5lIERSTV9NT0RFX1BBR0VfRkxJUF9UQVJHRVRfUkVMQVRJVkUgMHg4CisjZGVmaW5lIERSTV9NT0RFX1BBR0VfRkxJUF9UQVJHRVQgKERSTV9NT0RFX1BBR0VfRkxJUF9UQVJHRVRfQUJTT0xVVEUgfCBcCisJCQkJICAgRFJNX01PREVfUEFHRV9GTElQX1RBUkdFVF9SRUxBVElWRSkKKyNkZWZpbmUgRFJNX01PREVfUEFHRV9GTElQX0ZMQUdTIChEUk1fTU9ERV9QQUdFX0ZMSVBfRVZFTlQgfCBcCisJCQkJICBEUk1fTU9ERV9QQUdFX0ZMSVBfQVNZTkMgfCBcCisJCQkJICBEUk1fTU9ERV9QQUdFX0ZMSVBfVEFSR0VUKQorCisvKgorICogUmVxdWVzdCBhIHBhZ2UgZmxpcCBvbiB0aGUgc3BlY2lmaWVkIGNydGMuCisgKgorICogVGhpcyBpb2N0bCB3aWxsIGFzayBLTVMgdG8gc2NoZWR1bGUgYSBwYWdlIGZsaXAgZm9yIHRoZSBzcGVjaWZpZWQKKyAqIGNydGMuICBPbmNlIGFueSBwZW5kaW5nIHJlbmRlcmluZyB0YXJnZXRpbmcgdGhlIHNwZWNpZmllZCBmYiAoYXMgb2YKKyAqIGlvY3RsIHRpbWUpIGhhcyBjb21wbGV0ZWQsIHRoZSBjcnRjIHdpbGwgYmUgcmVwcm9ncmFtbWVkIHRvIGRpc3BsYXkKKyAqIHRoYXQgZmIgYWZ0ZXIgdGhlIG5leHQgdmVydGljYWwgcmVmcmVzaC4gIFRoZSBpb2N0bCByZXR1cm5zCisgKiBpbW1lZGlhdGVseSwgYnV0IHN1YnNlcXVlbnQgcmVuZGVyaW5nIHRvIHRoZSBjdXJyZW50IGZiIHdpbGwgYmxvY2sKKyAqIGluIHRoZSBleGVjYnVmZmVyIGlvY3RsIHVudGlsIHRoZSBwYWdlIGZsaXAgaGFwcGVucy4gIElmIGEgcGFnZQorICogZmxpcCBpcyBhbHJlYWR5IHBlbmRpbmcgYXMgdGhlIGlvY3RsIGlzIGNhbGxlZCwgRUJVU1kgd2lsbCBiZQorICogcmV0dXJuZWQuCisgKgorICogRmxhZyBEUk1fTU9ERV9QQUdFX0ZMSVBfRVZFTlQgcmVxdWVzdHMgdGhhdCBkcm0gc2VuZHMgYmFjayBhIHZibGFuaworICogZXZlbnQgKHNlZSBkcm0uaDogc3RydWN0IGRybV9ldmVudF92YmxhbmspIHdoZW4gdGhlIHBhZ2UgZmxpcCBpcworICogZG9uZS4gIFRoZSB1c2VyX2RhdGEgZmllbGQgcGFzc2VkIGluIHdpdGggdGhpcyBpb2N0bCB3aWxsIGJlCisgKiByZXR1cm5lZCBhcyB0aGUgdXNlcl9kYXRhIGZpZWxkIGluIHRoZSB2YmxhbmsgZXZlbnQgc3RydWN0LgorICoKKyAqIEZsYWcgRFJNX01PREVfUEFHRV9GTElQX0FTWU5DIHJlcXVlc3RzIHRoYXQgdGhlIGZsaXAgaGFwcGVuCisgKiAnYXMgc29vbiBhcyBwb3NzaWJsZScsIG1lYW5pbmcgdGhhdCBpdCBub3QgZGVsYXkgd2FpdGluZyBmb3IgdmJsYW5rLgorICogVGhpcyBtYXkgY2F1c2UgdGVhcmluZyBvbiB0aGUgc2NyZWVuLgorICoKKyAqIFRoZSByZXNlcnZlZCBmaWVsZCBtdXN0IGJlIHplcm8uCisgKi8KKworc3RydWN0IGRybV9tb2RlX2NydGNfcGFnZV9mbGlwIHsKKwlfX3UzMiBjcnRjX2lkOworCV9fdTMyIGZiX2lkOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHJlc2VydmVkOworCV9fdTY0IHVzZXJfZGF0YTsKK307CisKKy8qCisgKiBSZXF1ZXN0IGEgcGFnZSBmbGlwIG9uIHRoZSBzcGVjaWZpZWQgY3J0Yy4KKyAqCisgKiBTYW1lIGFzIHN0cnVjdCBkcm1fbW9kZV9jcnRjX3BhZ2VfZmxpcCwgYnV0IHN1cHBvcnRzIG5ldyBmbGFncyBhbmQKKyAqIHJlLXB1cnBvc2VzIHRoZSByZXNlcnZlZCBmaWVsZDoKKyAqCisgKiBUaGUgc2VxdWVuY2UgZmllbGQgbXVzdCBiZSB6ZXJvIHVubGVzcyBlaXRoZXIgb2YgdGhlCisgKiBEUk1fTU9ERV9QQUdFX0ZMSVBfVEFSR0VUX0FCU09MVVRFL1JFTEFUSVZFIGZsYWdzIGlzIHNwZWNpZmllZC4gV2hlbgorICogdGhlIEFCU09MVVRFIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgc2VxdWVuY2UgZmllbGQgZGVub3RlcyB0aGUgYWJzb2x1dGUKKyAqIHZibGFuayBzZXF1ZW5jZSB3aGVuIHRoZSBmbGlwIHNob3VsZCB0YWtlIGVmZmVjdC4gV2hlbiB0aGUgUkVMQVRJVkUKKyAqIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgc2VxdWVuY2UgZmllbGQgZGVub3RlcyB0aGUgcmVsYXRpdmUgKHRvIHRoZQorICogY3VycmVudCBvbmUgd2hlbiB0aGUgaW9jdGwgaXMgY2FsbGVkKSB2Ymxhbmsgc2VxdWVuY2Ugd2hlbiB0aGUgZmxpcAorICogc2hvdWxkIHRha2UgZWZmZWN0LiBOT1RFOiBEUk1fSU9DVExfV0FJVF9WQkxBTksgbXVzdCBzdGlsbCBiZSB1c2VkIHRvCisgKiBtYWtlIHN1cmUgdGhlIHZibGFuayBzZXF1ZW5jZSBiZWZvcmUgdGhlIHRhcmdldCBvbmUgaGFzIHBhc3NlZCBiZWZvcmUKKyAqIGNhbGxpbmcgdGhpcyBpb2N0bC4gVGhlIHB1cnBvc2Ugb2YgdGhlCisgKiBEUk1fTU9ERV9QQUdFX0ZMSVBfVEFSR0VUX0FCU09MVVRFL1JFTEFUSVZFIGZsYWdzIGlzIG1lcmVseSB0byBjbGFyaWZ5CisgKiB0aGUgdGFyZ2V0IGZvciB3aGVuIGNvZGUgZGVhbGluZyB3aXRoIGEgcGFnZSBmbGlwIHJ1bnMgZHVyaW5nIGEKKyAqIHZlcnRpY2FsIGJsYW5rIHBlcmlvZC4KKyAqLworCitzdHJ1Y3QgZHJtX21vZGVfY3J0Y19wYWdlX2ZsaXBfdGFyZ2V0IHsKKwlfX3UzMiBjcnRjX2lkOworCV9fdTMyIGZiX2lkOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHNlcXVlbmNlOworCV9fdTY0IHVzZXJfZGF0YTsKK307CisKKy8qIGNyZWF0ZSBhIGR1bWIgc2Nhbm91dCBidWZmZXIgKi8KK3N0cnVjdCBkcm1fbW9kZV9jcmVhdGVfZHVtYiB7CisJX191MzIgaGVpZ2h0OworCV9fdTMyIHdpZHRoOworCV9fdTMyIGJwcDsKKwlfX3UzMiBmbGFnczsKKwkvKiBoYW5kbGUsIHBpdGNoLCBzaXplIHdpbGwgYmUgcmV0dXJuZWQgKi8KKwlfX3UzMiBoYW5kbGU7CisJX191MzIgcGl0Y2g7CisJX191NjQgc2l6ZTsKK307CisKKy8qIHNldCB1cCBmb3IgbW1hcCBvZiBhIGR1bWIgc2Nhbm91dCBidWZmZXIgKi8KK3N0cnVjdCBkcm1fbW9kZV9tYXBfZHVtYiB7CisJLyoqIEhhbmRsZSBmb3IgdGhlIG9iamVjdCBiZWluZyBtYXBwZWQuICovCisJX191MzIgaGFuZGxlOworCV9fdTMyIHBhZDsKKwkvKioKKwkgKiBGYWtlIG9mZnNldCB0byB1c2UgZm9yIHN1YnNlcXVlbnQgbW1hcCBjYWxsCisJICoKKwkgKiBUaGlzIGlzIGEgZml4ZWQtc2l6ZSB0eXBlIGZvciAzMi82NCBjb21wYXRpYmlsaXR5LgorCSAqLworCV9fdTY0IG9mZnNldDsKK307CisKK3N0cnVjdCBkcm1fbW9kZV9kZXN0cm95X2R1bWIgeworCV9fdTMyIGhhbmRsZTsKK307CisKKy8qIHBhZ2UtZmxpcCBmbGFncyBhcmUgdmFsaWQsIHBsdXM6ICovCisjZGVmaW5lIERSTV9NT0RFX0FUT01JQ19URVNUX09OTFkgMHgwMTAwCisjZGVmaW5lIERSTV9NT0RFX0FUT01JQ19OT05CTE9DSyAgMHgwMjAwCisjZGVmaW5lIERSTV9NT0RFX0FUT01JQ19BTExPV19NT0RFU0VUIDB4MDQwMAorCisjZGVmaW5lIERSTV9NT0RFX0FUT01JQ19GTEFHUyAoXAorCQlEUk1fTU9ERV9QQUdFX0ZMSVBfRVZFTlQgfFwKKwkJRFJNX01PREVfUEFHRV9GTElQX0FTWU5DIHxcCisJCURSTV9NT0RFX0FUT01JQ19URVNUX09OTFkgfFwKKwkJRFJNX01PREVfQVRPTUlDX05PTkJMT0NLIHxcCisJCURSTV9NT0RFX0FUT01JQ19BTExPV19NT0RFU0VUKQorCitzdHJ1Y3QgZHJtX21vZGVfYXRvbWljIHsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBjb3VudF9vYmpzOworCV9fdTY0IG9ianNfcHRyOworCV9fdTY0IGNvdW50X3Byb3BzX3B0cjsKKwlfX3U2NCBwcm9wc19wdHI7CisJX191NjQgcHJvcF92YWx1ZXNfcHRyOworCV9fdTY0IHJlc2VydmVkOworCV9fdTY0IHVzZXJfZGF0YTsKK307CisKK3N0cnVjdCBkcm1fZm9ybWF0X21vZGlmaWVyX2Jsb2IgeworI2RlZmluZSBGT1JNQVRfQkxPQl9DVVJSRU5UIDEKKwkvKiBWZXJzaW9uIG9mIHRoaXMgYmxvYiBmb3JtYXQgKi8KKwlfX3UzMiB2ZXJzaW9uOworCisJLyogRmxhZ3MgKi8KKwlfX3UzMiBmbGFnczsKKworCS8qIE51bWJlciBvZiBmb3VyY2MgZm9ybWF0cyBzdXBwb3J0ZWQgKi8KKwlfX3UzMiBjb3VudF9mb3JtYXRzOworCisJLyogV2hlcmUgaW4gdGhpcyBibG9iIHRoZSBmb3JtYXRzIGV4aXN0IChpbiBieXRlcykgKi8KKwlfX3UzMiBmb3JtYXRzX29mZnNldDsKKworCS8qIE51bWJlciBvZiBkcm1fZm9ybWF0X21vZGlmaWVycyAqLworCV9fdTMyIGNvdW50X21vZGlmaWVyczsKKworCS8qIFdoZXJlIGluIHRoaXMgYmxvYiB0aGUgbW9kaWZpZXJzIGV4aXN0IChpbiBieXRlcykgKi8KKwlfX3UzMiBtb2RpZmllcnNfb2Zmc2V0OworCisJLyogdTMyIGZvcm1hdHNbXSAqLworCS8qIHN0cnVjdCBkcm1fZm9ybWF0X21vZGlmaWVyIG1vZGlmaWVyc1tdICovCit9OworCitzdHJ1Y3QgZHJtX2Zvcm1hdF9tb2RpZmllciB7CisJLyogQml0bWFzayBvZiBmb3JtYXRzIGluIGdldF9wbGFuZSBmb3JtYXQgbGlzdCB0aGlzIGluZm8gYXBwbGllcyB0by4gVGhlCisJICogb2Zmc2V0IGFsbG93cyBhIHNsaWRpbmcgd2luZG93IG9mIHdoaWNoIDY0IGZvcm1hdHMgKGJpdHMpLgorCSAqCisJICogU29tZSBleGFtcGxlczoKKwkgKiBJbiB0b2RheSdzIHdvcmxkIHdpdGggPCA2NSBmb3JtYXRzLCBhbmQgZm9ybWF0cyAwLCBhbmQgMiBhcmUKKwkgKiBzdXBwb3J0ZWQKKwkgKiAweDAwMDAwMDAwMDAwMDAwMDUKKwkgKgkJICBeLW9mZnNldCA9IDAsIGZvcm1hdHMgPSA1CisJICoKKwkgKiBJZiB0aGUgbnVtYmVyIGZvcm1hdHMgZ3JldyB0byAxMjgsIGFuZCBmb3JtYXRzIDk4LTEwMiBhcmUKKwkgKiBzdXBwb3J0ZWQgd2l0aCB0aGUgbW9kaWZpZXI6CisJICoKKwkgKiAweDAwMDAwMDNjMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMAorCSAqCQkgIF4KKwkgKgkJICB8X19vZmZzZXQgPSA2NCwgZm9ybWF0cyA9IDB4M2MwMDAwMDAwMAorCSAqCisJICovCisJX191NjQgZm9ybWF0czsKKwlfX3UzMiBvZmZzZXQ7CisJX191MzIgcGFkOworCisJLyogVGhlIG1vZGlmaWVyIHRoYXQgYXBwbGllcyB0byB0aGUgPmdldF9wbGFuZSBmb3JtYXQgbGlzdCBiaXRtYXNrLiAqLworCV9fdTY0IG1vZGlmaWVyOworfTsKKworLyoqCisgKiBDcmVhdGUgYSBuZXcgJ2Jsb2InIGRhdGEgcHJvcGVydHksIGNvcHlpbmcgbGVuZ3RoIGJ5dGVzIGZyb20gZGF0YSBwb2ludGVyLAorICogYW5kIHJldHVybmluZyBuZXcgYmxvYiBJRC4KKyAqLworc3RydWN0IGRybV9tb2RlX2NyZWF0ZV9ibG9iIHsKKwkvKiogUG9pbnRlciB0byBkYXRhIHRvIGNvcHkuICovCisJX191NjQgZGF0YTsKKwkvKiogTGVuZ3RoIG9mIGRhdGEgdG8gY29weS4gKi8KKwlfX3UzMiBsZW5ndGg7CisJLyoqIFJldHVybjogbmV3IHByb3BlcnR5IElELiAqLworCV9fdTMyIGJsb2JfaWQ7Cit9OworCisvKioKKyAqIERlc3Ryb3kgYSB1c2VyLWNyZWF0ZWQgYmxvYiBwcm9wZXJ0eS4KKyAqLworc3RydWN0IGRybV9tb2RlX2Rlc3Ryb3lfYmxvYiB7CisJX191MzIgYmxvYl9pZDsKK307CisKKy8qKgorICogTGVhc2UgbW9kZSByZXNvdXJjZXMgdG8gYW5vdGhlciB1c2VyLgorICovCitzdHJ1Y3QgZHJtX21vZGVfY3JlYXRlX2xlYXNlIHsKKwkvKiogUG9pbnRlciB0byBhcnJheSBvZiBvYmplY3QgaWRzIChfX3UzMikgKi8KKwlfX3U2NCBvYmplY3RfaWRzOworCS8qKiBOdW1iZXIgb2Ygb2JqZWN0IGlkcyAqLworCV9fdTMyIG9iamVjdF9jb3VudDsKKwkvKiogZmxhZ3MgZm9yIG5ldyBGRCAoT19DTE9FWEVDLCBldGMpICovCisJX191MzIgZmxhZ3M7CisKKwkvKiogUmV0dXJuOiB1bmlxdWUgaWRlbnRpZmllciBmb3IgbGVzc2VlLiAqLworCV9fdTMyIGxlc3NlZV9pZDsKKwkvKiogUmV0dXJuOiBmaWxlIGRlc2NyaXB0b3IgdG8gbmV3IGRybV9tYXN0ZXIgZmlsZSAqLworCV9fdTMyIGZkOworfTsKKworLyoqCisgKiBMaXN0IGxlc3NlcyBmcm9tIGEgZHJtX21hc3RlcgorICovCitzdHJ1Y3QgZHJtX21vZGVfbGlzdF9sZXNzZWVzIHsKKwkvKiogTnVtYmVyIG9mIGxlc3NlZXMuCisJICogT24gaW5wdXQsIHByb3ZpZGVzIGxlbmd0aCBvZiB0aGUgYXJyYXkuCisJICogT24gb3V0cHV0LCBwcm92aWRlcyB0b3RhbCBudW1iZXIuIE5vCisJICogbW9yZSB0aGFuIHRoZSBpbnB1dCBudW1iZXIgd2lsbCBiZSB3cml0dGVuCisJICogYmFjaywgc28gdHdvIGNhbGxzIGNhbiBiZSB1c2VkIHRvIGdldAorCSAqIHRoZSBzaXplIGFuZCB0aGVuIHRoZSBkYXRhLgorCSAqLworCV9fdTMyIGNvdW50X2xlc3NlZXM7CisJX191MzIgcGFkOworCisJLyoqIFBvaW50ZXIgdG8gbGVzc2Vlcy4KKwkgKiBwb2ludGVyIHRvIF9fdTY0IGFycmF5IG9mIGxlc3NlZSBpZHMKKwkgKi8KKwlfX3U2NCBsZXNzZWVzX3B0cjsKK307CisKKy8qKgorICogR2V0IGxlYXNlZCBvYmplY3RzIGZvciBhIGxlc3NlZQorICovCitzdHJ1Y3QgZHJtX21vZGVfZ2V0X2xlYXNlIHsKKwkvKiogTnVtYmVyIG9mIGxlYXNlZCBvYmplY3RzLgorCSAqIE9uIGlucHV0LCBwcm92aWRlcyBsZW5ndGggb2YgdGhlIGFycmF5LgorCSAqIE9uIG91dHB1dCwgcHJvdmlkZXMgdG90YWwgbnVtYmVyLiBObworCSAqIG1vcmUgdGhhbiB0aGUgaW5wdXQgbnVtYmVyIHdpbGwgYmUgd3JpdHRlbgorCSAqIGJhY2ssIHNvIHR3byBjYWxscyBjYW4gYmUgdXNlZCB0byBnZXQKKwkgKiB0aGUgc2l6ZSBhbmQgdGhlbiB0aGUgZGF0YS4KKwkgKi8KKwlfX3UzMiBjb3VudF9vYmplY3RzOworCV9fdTMyIHBhZDsKKworCS8qKiBQb2ludGVyIHRvIG9iamVjdHMuCisJICogcG9pbnRlciB0byBfX3UzMiBhcnJheSBvZiBvYmplY3QgaWRzCisJICovCisJX191NjQgb2JqZWN0c19wdHI7Cit9OworCisvKioKKyAqIFJldm9rZSBsZWFzZQorICovCitzdHJ1Y3QgZHJtX21vZGVfcmV2b2tlX2xlYXNlIHsKKwkvKiogVW5pcXVlIElEIG9mIGxlc3NlZQorCSovCisJX191MzIgbGVzc2VlX2lkOworfTsKKworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9zYXJlYS5oIGIvaW5jbHVkZS9kcm0vZHJtX3NhcmVhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMwMjViZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL2RybV9zYXJlYS5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qKgorICogXGZpbGUgZHJtX3NhcmVhLmgKKyAqIFxicmllZiBTQVJFQSBkZWZpbml0aW9ucworICoKKyAqIFxhdXRob3IgTWljaGVsIETDpG56ZXIgPG1pY2hlbEBkYWVuemVyLm5ldD4KKyAqLworCisvKgorICogQ29weXJpZ2h0IDIwMDIgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRFJNX1NBUkVBX0hfCisjZGVmaW5lIF9EUk1fU0FSRUFfSF8KKworI2luY2x1ZGUgImRybS5oIgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFNBUkVBIGFyZWEgbmVlZHMgdG8gYmUgYXQgbGVhc3QgYSBwYWdlICovCisjaWYgZGVmaW5lZChfX2FscGhhX18pCisjZGVmaW5lIFNBUkVBX01BWCAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwVQorI2VsaWYgZGVmaW5lZChfX21pcHNfXykKKyNkZWZpbmUgU0FSRUFfTUFYICAgICAgICAgICAgICAgICAgICAgICAweDQwMDBVCisjZWxpZiBkZWZpbmVkKF9faWE2NF9fKQorI2RlZmluZSBTQVJFQV9NQVggICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDBVCS8qIDY0a0IgKi8KKyNlbHNlCisvKiBJbnRlbCA4MzBNIGRyaXZlciBuZWVkcyBhdCBsZWFzdCA4ayBTQVJFQSAqLworI2RlZmluZSBTQVJFQV9NQVggICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMFUKKyNlbmRpZgorCisvKiogTWF4aW11bSBudW1iZXIgb2YgZHJhd2FibGVzIGluIHRoZSBTQVJFQSAqLworI2RlZmluZSBTQVJFQV9NQVhfRFJBV0FCTEVTCQkyNTYKKworI2RlZmluZSBTQVJFQV9EUkFXQUJMRV9DTEFJTUVEX0VOVFJZICAgIDB4ODAwMDAwMDAKKworLyoqIFNBUkVBIGRyYXdhYmxlICovCitzdHJ1Y3QgZHJtX3NhcmVhX2RyYXdhYmxlIHsKKwl1bnNpZ25lZCBpbnQgc3RhbXA7CisJdW5zaWduZWQgaW50IGZsYWdzOworfTsKKworLyoqIFNBUkVBIGZyYW1lICovCitzdHJ1Y3QgZHJtX3NhcmVhX2ZyYW1lIHsKKwl1bnNpZ25lZCBpbnQgeDsKKwl1bnNpZ25lZCBpbnQgeTsKKwl1bnNpZ25lZCBpbnQgd2lkdGg7CisJdW5zaWduZWQgaW50IGhlaWdodDsKKwl1bnNpZ25lZCBpbnQgZnVsbHNjcmVlbjsKK307CisKKy8qKiBTQVJFQSAqLworc3RydWN0IGRybV9zYXJlYSB7CisgICAgLyoqIGZpcnN0IHRoaW5nIGlzIGFsd2F5cyB0aGUgRFJNIGxvY2tpbmcgc3RydWN0dXJlICovCisJc3RydWN0IGRybV9od19sb2NrIGxvY2s7CisgICAgLyoqIFx0b2RvIFVzZSByZWFkZXJzL3dyaXRlciBsb2NrIGZvciBkcm1fc2FyZWE6OmRyYXdhYmxlX2xvY2sgKi8KKwlzdHJ1Y3QgZHJtX2h3X2xvY2sgZHJhd2FibGVfbG9jazsKKwlzdHJ1Y3QgZHJtX3NhcmVhX2RyYXdhYmxlIGRyYXdhYmxlVGFibGVbU0FSRUFfTUFYX0RSQVdBQkxFU107CS8qKjwgZHJhd2FibGVzICovCisJc3RydWN0IGRybV9zYXJlYV9mcmFtZSBmcmFtZTsJLyoqPCBmcmFtZSAqLworCWRybV9jb250ZXh0X3QgZHVtbXlfY29udGV4dDsKK307CisKK3R5cGVkZWYgc3RydWN0IGRybV9zYXJlYV9kcmF3YWJsZSBkcm1fc2FyZWFfZHJhd2FibGVfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9zYXJlYV9mcmFtZSBkcm1fc2FyZWFfZnJhbWVfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9zYXJlYSBkcm1fc2FyZWFfdDsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCQkJCS8qIF9EUk1fU0FSRUFfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2k5MTVfZHJtLmggYi9pbmNsdWRlL2RybS9pOTE1X2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYmUwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9pOTE1X2RybS5oCkBAIC0wLDAgKzEsMTQzMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX0k5MTVfRFJNX0hfCisjZGVmaW5lIF9JOTE1X0RSTV9IXworCisjaW5jbHVkZSAiZHJtLmgiCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogUGxlYXNlIG5vdGUgdGhhdCBtb2RpZmljYXRpb25zIHRvIGFsbCBzdHJ1Y3RzIGRlZmluZWQgaGVyZSBhcmUKKyAqIHN1YmplY3QgdG8gYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgY29uc3RyYWludHMuCisgKi8KKworLyoqCisgKiBET0M6IHVldmVudHMgZ2VuZXJhdGVkIGJ5IGk5MTUgb24gaXQncyBkZXZpY2Ugbm9kZQorICoKKyAqIEk5MTVfTDNfUEFSSVRZX1VFVkVOVCAtIEdlbmVyYXRlZCB3aGVuIHRoZSBkcml2ZXIgcmVjZWl2ZXMgYSBwYXJpdHkgbWlzbWF0Y2gKKyAqCWV2ZW50IGZyb20gdGhlIGdwdSBsMyBjYWNoZS4gQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBzdXBwbGllZCBpcyBST1csCisgKglCQU5LLCBTVUJCQU5LLCBTTElDRSBvZiB0aGUgYWZmZWN0ZWQgY2FjaGVsaW5lLiBVc2Vyc3BhY2Ugc2hvdWxkIGtlZXAKKyAqCXRyYWNrIG9mIHRoZXNlIGV2ZW50cyBhbmQgaWYgYSBzcGVjaWZpYyBjYWNoZS1saW5lIHNlZW1zIHRvIGhhdmUgYQorICoJcGVyc2lzdGVudCBlcnJvciByZW1hcCBpdCB3aXRoIHRoZSBsMyByZW1hcHBpbmcgdG9vbCBzdXBwbGllZCBpbgorICoJaW50ZWwtZ3B1LXRvb2xzLiAgVGhlIHZhbHVlIHN1cHBsaWVkIHdpdGggdGhlIGV2ZW50IGlzIGFsd2F5cyAxLgorICoKKyAqIEk5MTVfRVJST1JfVUVWRU5UIC0gR2VuZXJhdGVkIHVwb24gZXJyb3IgZGV0ZWN0aW9uLCBjdXJyZW50bHkgb25seSB2aWEKKyAqCWhhbmdjaGVjay4gVGhlIGVycm9yIGRldGVjdGlvbiBldmVudCBpcyBhIGdvb2QgaW5kaWNhdG9yIG9mIHdoZW4gdGhpbmdzCisgKgliZWdhbiB0byBnbyBiYWRseS4gVGhlIHZhbHVlIHN1cHBsaWVkIHdpdGggdGhlIGV2ZW50IGlzIGEgMSB1cG9uIGVycm9yCisgKglkZXRlY3Rpb24sIGFuZCBhIDAgdXBvbiByZXNldCBjb21wbGV0aW9uLCBzaWduaWZ5aW5nIG5vIG1vcmUgZXJyb3IKKyAqCWV4aXN0cy4gTk9URTogRGlzYWJsaW5nIGhhbmdjaGVjayBvciByZXNldCB2aWEgbW9kdWxlIHBhcmFtZXRlciB3aWxsCisgKgljYXVzZSB0aGUgcmVsYXRlZCBldmVudHMgdG8gbm90IGJlIHNlZW4uCisgKgorICogSTkxNV9SRVNFVF9VRVZFTlQgLSBFdmVudCBpcyBnZW5lcmF0ZWQganVzdCBiZWZvcmUgYW4gYXR0ZW1wdCB0byByZXNldCB0aGUKKyAqCXRoZSBHUFUuIFRoZSB2YWx1ZSBzdXBwbGllZCB3aXRoIHRoZSBldmVudCBpcyBhbHdheXMgMS4gTk9URTogRGlzYWJsZQorICoJcmVzZXQgdmlhIG1vZHVsZSBwYXJhbWV0ZXIgd2lsbCBjYXVzZSB0aGlzIGV2ZW50IHRvIG5vdCBiZSBzZWVuLgorICovCisjZGVmaW5lIEk5MTVfTDNfUEFSSVRZX1VFVkVOVAkJIkwzX1BBUklUWV9FUlJPUiIKKyNkZWZpbmUgSTkxNV9FUlJPUl9VRVZFTlQJCSJFUlJPUiIKKyNkZWZpbmUgSTkxNV9SRVNFVF9VRVZFTlQJCSJSRVNFVCIKKworLyoKKyAqIE1PQ1MgaW5kZXhlcyB1c2VkIGZvciBHUFUgc3VyZmFjZXMsIGRlZmluaW5nIHRoZSBjYWNoZWFiaWxpdHkgb2YgdGhlCisgKiBzdXJmYWNlIGRhdGEgYW5kIHRoZSBjb2hlcmVuY3kgZm9yIHRoaXMgZGF0YSB3cnQuIENQVSB2cy4gR1BVIGFjY2Vzc2VzLgorICovCitlbnVtIGk5MTVfbW9jc190YWJsZV9pbmRleCB7CisJLyoKKwkgKiBOb3QgY2FjaGVkIGFueXdoZXJlLCBjb2hlcmVuY3kgYmV0d2VlbiBDUFUgYW5kIEdQVSBhY2Nlc3NlcyBpcworCSAqIGd1YXJhbnRlZWQuCisJICovCisJSTkxNV9NT0NTX1VOQ0FDSEVELAorCS8qCisJICogQ2FjaGVhYmlsaXR5IGFuZCBjb2hlcmVuY3kgY29udHJvbGxlZCBieSB0aGUga2VybmVsIGF1dG9tYXRpY2FsbHkKKwkgKiBiYXNlZCBvbiB0aGUgRFJNX0k5MTVfR0VNX1NFVF9DQUNISU5HIElPQ1RMIHNldHRpbmcgYW5kIHRoZSBjdXJyZW50CisJICogdXNhZ2Ugb2YgdGhlIHN1cmZhY2UgKHVzZWQgZm9yIGRpc3BsYXkgc2Nhbm91dCBvciBub3QpLgorCSAqLworCUk5MTVfTU9DU19QVEUsCisJLyoKKwkgKiBDYWNoZWQgaW4gYWxsIEdQVSBjYWNoZXMgYXZhaWxhYmxlIG9uIHRoZSBwbGF0Zm9ybS4KKwkgKiBDb2hlcmVuY3kgYmV0d2VlbiBDUFUgYW5kIEdQVSBhY2Nlc3NlcyB0byB0aGUgc3VyZmFjZSBpcyBub3QKKwkgKiBndWFyYW50ZWVkIHdpdGhvdXQgZXh0cmEgc3luY2hyb25pemF0aW9uLgorCSAqLworCUk5MTVfTU9DU19DQUNIRUQsCit9OworCisvKiBFYWNoIHJlZ2lvbiBpcyBhIG1pbmltdW0gb2YgMTZrLCBhbmQgdGhlcmUgYXJlIGF0IG1vc3QgMjU1IG9mIHRoZW0uCisgKi8KKyNkZWZpbmUgSTkxNV9OUl9URVhfUkVHSU9OUyAyNTUJLyogdGFibGUgc2l6ZSAyayAtIG1heGltdW0gZHVlIHRvIHVzZQorCQkJCSAqIG9mIGNoYXJzIGZvciBuZXh0L3ByZXYgaW5kaWNlcyAqLworI2RlZmluZSBJOTE1X0xPR19NSU5fVEVYX1JFR0lPTl9TSVpFIDE0CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTkxNV9pbml0IHsKKwllbnVtIHsKKwkJSTkxNV9JTklUX0RNQSA9IDB4MDEsCisJCUk5MTVfQ0xFQU5VUF9ETUEgPSAweDAyLAorCQlJOTE1X1JFU1VNRV9ETUEgPSAweDAzCisJfSBmdW5jOworCXVuc2lnbmVkIGludCBtbWlvX29mZnNldDsKKwlpbnQgc2FyZWFfcHJpdl9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHJpbmdfc3RhcnQ7CisJdW5zaWduZWQgaW50IHJpbmdfZW5kOworCXVuc2lnbmVkIGludCByaW5nX3NpemU7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYmFja19vZmZzZXQ7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgdzsKKwl1bnNpZ25lZCBpbnQgaDsKKwl1bnNpZ25lZCBpbnQgcGl0Y2g7CisJdW5zaWduZWQgaW50IHBpdGNoX2JpdHM7CisJdW5zaWduZWQgaW50IGJhY2tfcGl0Y2g7CisJdW5zaWduZWQgaW50IGRlcHRoX3BpdGNoOworCXVuc2lnbmVkIGludCBjcHA7CisJdW5zaWduZWQgaW50IGNoaXBzZXQ7Cit9IGRybV9pOTE1X2luaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pOTE1X3NhcmVhIHsKKwlzdHJ1Y3QgZHJtX3RleF9yZWdpb24gdGV4TGlzdFtJOTE1X05SX1RFWF9SRUdJT05TICsgMV07CisJaW50IGxhc3RfdXBsb2FkOwkvKiBsYXN0IHRpbWUgdGV4dHVyZSB3YXMgdXBsb2FkZWQgKi8KKwlpbnQgbGFzdF9lbnF1ZXVlOwkvKiBsYXN0IHRpbWUgYSBidWZmZXIgd2FzIGVucXVldWVkICovCisJaW50IGxhc3RfZGlzcGF0Y2g7CS8qIGFnZSBvZiB0aGUgbW9zdCByZWNlbnRseSBkaXNwYXRjaGVkIGJ1ZmZlciAqLworCWludCBjdHhPd25lcjsJCS8qIGxhc3QgY29udGV4dCB0byB1cGxvYWQgc3RhdGUgKi8KKwlpbnQgdGV4QWdlOworCWludCBwZl9lbmFibGVkOwkJLyogaXMgcGFnZWZsaXBwaW5nIGFsbG93ZWQ/ICovCisJaW50IHBmX2FjdGl2ZTsKKwlpbnQgcGZfY3VycmVudF9wYWdlOwkvKiB3aGljaCBidWZmZXIgaXMgYmVpbmcgZGlzcGxheWVkPyAqLworCWludCBwZXJmX2JveGVzOwkJLyogcGVyZm9ybWFuY2UgYm94ZXMgdG8gYmUgZGlzcGxheWVkICovCisJaW50IHdpZHRoLCBoZWlnaHQ7ICAgICAgLyogc2NyZWVuIHNpemUgaW4gcGl4ZWxzICovCisKKwlkcm1faGFuZGxlX3QgZnJvbnRfaGFuZGxlOworCWludCBmcm9udF9vZmZzZXQ7CisJaW50IGZyb250X3NpemU7CisKKwlkcm1faGFuZGxlX3QgYmFja19oYW5kbGU7CisJaW50IGJhY2tfb2Zmc2V0OworCWludCBiYWNrX3NpemU7CisKKwlkcm1faGFuZGxlX3QgZGVwdGhfaGFuZGxlOworCWludCBkZXB0aF9vZmZzZXQ7CisJaW50IGRlcHRoX3NpemU7CisKKwlkcm1faGFuZGxlX3QgdGV4X2hhbmRsZTsKKwlpbnQgdGV4X29mZnNldDsKKwlpbnQgdGV4X3NpemU7CisJaW50IGxvZ190ZXhfZ3JhbnVsYXJpdHk7CisJaW50IHBpdGNoOworCWludCByb3RhdGlvbjsgICAgICAgICAgIC8qIDAsIDkwLCAxODAgb3IgMjcwICovCisJaW50IHJvdGF0ZWRfb2Zmc2V0OworCWludCByb3RhdGVkX3NpemU7CisJaW50IHJvdGF0ZWRfcGl0Y2g7CisJaW50IHZpcnR1YWxYLCB2aXJ0dWFsWTsKKworCXVuc2lnbmVkIGludCBmcm9udF90aWxlZDsKKwl1bnNpZ25lZCBpbnQgYmFja190aWxlZDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfdGlsZWQ7CisJdW5zaWduZWQgaW50IHJvdGF0ZWRfdGlsZWQ7CisJdW5zaWduZWQgaW50IHJvdGF0ZWQyX3RpbGVkOworCisJaW50IHBpcGVBX3g7CisJaW50IHBpcGVBX3k7CisJaW50IHBpcGVBX3c7CisJaW50IHBpcGVBX2g7CisJaW50IHBpcGVCX3g7CisJaW50IHBpcGVCX3k7CisJaW50IHBpcGVCX3c7CisJaW50IHBpcGVCX2g7CisKKwkvKiBmaWxsIG91dCBzb21lIHNwYWNlIGZvciBvbGQgdXNlcnNwYWNlIHRyaXBsZSBidWZmZXIgKi8KKwlkcm1faGFuZGxlX3QgdW51c2VkX2hhbmRsZTsKKwlfX3UzMiB1bnVzZWQxLCB1bnVzZWQyLCB1bnVzZWQzOworCisJLyogYnVmZmVyIG9iamVjdCBoYW5kbGVzIGZvciBzdGF0aWMgYnVmZmVycy4gTWF5IGNoYW5nZQorCSAqIG92ZXIgdGhlIGxpZmV0aW1lIG9mIHRoZSBjbGllbnQuCisJICovCisJX191MzIgZnJvbnRfYm9faGFuZGxlOworCV9fdTMyIGJhY2tfYm9faGFuZGxlOworCV9fdTMyIHVudXNlZF9ib19oYW5kbGU7CisJX191MzIgZGVwdGhfYm9faGFuZGxlOworCit9IGRybV9pOTE1X3NhcmVhX3Q7CisKKy8qIGR1ZSB0byB1c2Vyc3BhY2UgYnVpbGRpbmcgYWdhaW5zdCB0aGVzZSBoZWFkZXJzIHdlIG5lZWQgc29tZSBjb21wYXQgaGVyZSAqLworI2RlZmluZSBwbGFuZUFfeCBwaXBlQV94CisjZGVmaW5lIHBsYW5lQV95IHBpcGVBX3kKKyNkZWZpbmUgcGxhbmVBX3cgcGlwZUFfdworI2RlZmluZSBwbGFuZUFfaCBwaXBlQV9oCisjZGVmaW5lIHBsYW5lQl94IHBpcGVCX3gKKyNkZWZpbmUgcGxhbmVCX3kgcGlwZUJfeQorI2RlZmluZSBwbGFuZUJfdyBwaXBlQl93CisjZGVmaW5lIHBsYW5lQl9oIHBpcGVCX2gKKworLyogRmxhZ3MgZm9yIHBlcmZfYm94ZXMKKyAqLworI2RlZmluZSBJOTE1X0JPWF9SSU5HX0VNUFRZICAgIDB4MQorI2RlZmluZSBJOTE1X0JPWF9GTElQICAgICAgICAgIDB4MgorI2RlZmluZSBJOTE1X0JPWF9XQUlUICAgICAgICAgIDB4NAorI2RlZmluZSBJOTE1X0JPWF9URVhUVVJFX0xPQUQgIDB4OAorI2RlZmluZSBJOTE1X0JPWF9MT1NUX0NPTlRFWFQgIDB4MTAKKworLyoKKyAqIGk5MTUgc3BlY2lmaWMgaW9jdGxzLgorICoKKyAqIFRoZSBkZXZpY2Ugc3BlY2lmaWMgaW9jdGwgcmFuZ2UgaXMgW0RSTV9DT01NQU5EX0JBU0UsIERSTV9DT01NQU5EX0VORCkgaWUKKyAqIFsweDQwLCAweGEwKSAoYTAgaXMgZXhjbHVkZWQpLiBUaGUgbnVtYmVycyBiZWxvdyBhcmUgZGVmaW5lZCBhcyBvZmZzZXQKKyAqIGFnYWluc3QgRFJNX0NPTU1BTkRfQkFTRSBhbmQgc2hvdWxkIGJlIGJldHdlZW4gWzB4MCwgMHg2MCkuCisgKi8KKyNkZWZpbmUgRFJNX0k5MTVfSU5JVAkJMHgwMAorI2RlZmluZSBEUk1fSTkxNV9GTFVTSAkJMHgwMQorI2RlZmluZSBEUk1fSTkxNV9GTElQCQkweDAyCisjZGVmaW5lIERSTV9JOTE1X0JBVENIQlVGRkVSCTB4MDMKKyNkZWZpbmUgRFJNX0k5MTVfSVJRX0VNSVQJMHgwNAorI2RlZmluZSBEUk1fSTkxNV9JUlFfV0FJVAkweDA1CisjZGVmaW5lIERSTV9JOTE1X0dFVFBBUkFNCTB4MDYKKyNkZWZpbmUgRFJNX0k5MTVfU0VUUEFSQU0JMHgwNworI2RlZmluZSBEUk1fSTkxNV9BTExPQwkJMHgwOAorI2RlZmluZSBEUk1fSTkxNV9GUkVFCQkweDA5CisjZGVmaW5lIERSTV9JOTE1X0lOSVRfSEVBUAkweDBhCisjZGVmaW5lIERSTV9JOTE1X0NNREJVRkZFUgkweDBiCisjZGVmaW5lIERSTV9JOTE1X0RFU1RST1lfSEVBUAkweDBjCisjZGVmaW5lIERSTV9JOTE1X1NFVF9WQkxBTktfUElQRQkweDBkCisjZGVmaW5lIERSTV9JOTE1X0dFVF9WQkxBTktfUElQRQkweDBlCisjZGVmaW5lIERSTV9JOTE1X1ZCTEFOS19TV0FQCTB4MGYKKyNkZWZpbmUgRFJNX0k5MTVfSFdTX0FERFIJMHgxMQorI2RlZmluZSBEUk1fSTkxNV9HRU1fSU5JVAkweDEzCisjZGVmaW5lIERSTV9JOTE1X0dFTV9FWEVDQlVGRkVSCTB4MTQKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX1BJTgkweDE1CisjZGVmaW5lIERSTV9JOTE1X0dFTV9VTlBJTgkweDE2CisjZGVmaW5lIERSTV9JOTE1X0dFTV9CVVNZCTB4MTcKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX1RIUk9UVExFCTB4MTgKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX0VOVEVSVlQJMHgxOQorI2RlZmluZSBEUk1fSTkxNV9HRU1fTEVBVkVWVAkweDFhCisjZGVmaW5lIERSTV9JOTE1X0dFTV9DUkVBVEUJMHgxYgorI2RlZmluZSBEUk1fSTkxNV9HRU1fUFJFQUQJMHgxYworI2RlZmluZSBEUk1fSTkxNV9HRU1fUFdSSVRFCTB4MWQKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX01NQVAJMHgxZQorI2RlZmluZSBEUk1fSTkxNV9HRU1fU0VUX0RPTUFJTgkweDFmCisjZGVmaW5lIERSTV9JOTE1X0dFTV9TV19GSU5JU0gJMHgyMAorI2RlZmluZSBEUk1fSTkxNV9HRU1fU0VUX1RJTElORwkweDIxCisjZGVmaW5lIERSTV9JOTE1X0dFTV9HRVRfVElMSU5HCTB4MjIKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX0dFVF9BUEVSVFVSRSAweDIzCisjZGVmaW5lIERSTV9JOTE1X0dFTV9NTUFQX0dUVAkweDI0CisjZGVmaW5lIERSTV9JOTE1X0dFVF9QSVBFX0ZST01fQ1JUQ19JRAkweDI1CisjZGVmaW5lIERSTV9JOTE1X0dFTV9NQURWSVNFCTB4MjYKKyNkZWZpbmUgRFJNX0k5MTVfT1ZFUkxBWV9QVVRfSU1BR0UJMHgyNworI2RlZmluZSBEUk1fSTkxNV9PVkVSTEFZX0FUVFJTCTB4MjgKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX0VYRUNCVUZGRVIyCTB4MjkKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX0VYRUNCVUZGRVIyX1dSCURSTV9JOTE1X0dFTV9FWEVDQlVGRkVSMgorI2RlZmluZSBEUk1fSTkxNV9HRVRfU1BSSVRFX0NPTE9SS0VZCTB4MmEKKyNkZWZpbmUgRFJNX0k5MTVfU0VUX1NQUklURV9DT0xPUktFWQkweDJiCisjZGVmaW5lIERSTV9JOTE1X0dFTV9XQUlUCTB4MmMKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX0NPTlRFWFRfQ1JFQVRFCTB4MmQKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX0NPTlRFWFRfREVTVFJPWQkweDJlCisjZGVmaW5lIERSTV9JOTE1X0dFTV9TRVRfQ0FDSElORwkweDJmCisjZGVmaW5lIERSTV9JOTE1X0dFTV9HRVRfQ0FDSElORwkweDMwCisjZGVmaW5lIERSTV9JOTE1X1JFR19SRUFECQkweDMxCisjZGVmaW5lIERSTV9JOTE1X0dFVF9SRVNFVF9TVEFUUwkweDMyCisjZGVmaW5lIERSTV9JOTE1X0dFTV9VU0VSUFRSCQkweDMzCisjZGVmaW5lIERSTV9JOTE1X0dFTV9DT05URVhUX0dFVFBBUkFNCTB4MzQKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX0NPTlRFWFRfU0VUUEFSQU0JMHgzNQorI2RlZmluZSBEUk1fSTkxNV9QRVJGX09QRU4JCTB4MzYKKworI2RlZmluZSBEUk1fSU9DVExfSTkxNV9JTklUCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfSU5JVCwgZHJtX2k5MTVfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9GTFVTSAkJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0ZMVVNIKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9GTElQCQlEUk1fSU8gKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfRkxJUCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfQkFUQ0hCVUZGRVIJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0JBVENIQlVGRkVSLCBkcm1faTkxNV9iYXRjaGJ1ZmZlcl90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9JUlFfRU1JVCAgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9JUlFfRU1JVCwgZHJtX2k5MTVfaXJxX2VtaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfSVJRX1dBSVQgICAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfSVJRX1dBSVQsIGRybV9pOTE1X2lycV93YWl0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNICAgICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFVFBBUkFNLCBkcm1faTkxNV9nZXRwYXJhbV90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9TRVRQQVJBTSAgICAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9TRVRQQVJBTSwgZHJtX2k5MTVfc2V0cGFyYW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfQUxMT0MgICAgICAgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfQUxMT0MsIGRybV9pOTE1X21lbV9hbGxvY190KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9GUkVFICAgICAgICAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9GUkVFLCBkcm1faTkxNV9tZW1fZnJlZV90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9JTklUX0hFQVAgICAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9JTklUX0hFQVAsIGRybV9pOTE1X21lbV9pbml0X2hlYXBfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfQ01EQlVGRkVSCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9DTURCVUZGRVIsIGRybV9pOTE1X2NtZGJ1ZmZlcl90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9ERVNUUk9ZX0hFQVAJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0RFU1RST1lfSEVBUCwgZHJtX2k5MTVfbWVtX2Rlc3Ryb3lfaGVhcF90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9TRVRfVkJMQU5LX1BJUEUJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X1NFVF9WQkxBTktfUElQRSwgZHJtX2k5MTVfdmJsYW5rX3BpcGVfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VUX1ZCTEFOS19QSVBFCURSTV9JT1IoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRVRfVkJMQU5LX1BJUEUsIGRybV9pOTE1X3ZibGFua19waXBlX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X1ZCTEFOS19TV0FQCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9WQkxBTktfU1dBUCwgZHJtX2k5MTVfdmJsYW5rX3N3YXBfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfSFdTX0FERFIJCURSTV9JT1coRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0hXU19BRERSLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2luaXQpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9JTklUCQlEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fSU5JVCwgc3RydWN0IGRybV9pOTE1X2dlbV9pbml0KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUglEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fRVhFQ0JVRkZFUiwgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUjIJRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX0VYRUNCVUZGRVIyLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUjJfV1IJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9FWEVDQlVGRkVSMl9XUiwgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMikKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX1BJTgkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9QSU4sIHN0cnVjdCBkcm1faTkxNV9nZW1fcGluKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fVU5QSU4JRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX1VOUElOLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3VucGluKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fQlVTWQkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9CVVNZLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2J1c3kpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9TRVRfQ0FDSElORwkJRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX1NFVF9DQUNISU5HLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NhY2hpbmcpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9HRVRfQ0FDSElORwkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9HRVRfQ0FDSElORywgc3RydWN0IGRybV9pOTE1X2dlbV9jYWNoaW5nKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fVEhST1RUTEUJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9USFJPVFRMRSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX0VOVEVSVlQJRFJNX0lPKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fRU5URVJWVCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX0xFQVZFVlQJRFJNX0lPKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fTEVBVkVWVCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX0NSRUFURQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX0NSRUFURSwgc3RydWN0IGRybV9pOTE1X2dlbV9jcmVhdGUpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9QUkVBRAlEUk1fSU9XIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX1BSRUFELCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3ByZWFkKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fUFdSSVRFCURSTV9JT1cgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fUFdSSVRFLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3B3cml0ZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX01NQVAJCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fTU1BUCwgc3RydWN0IGRybV9pOTE1X2dlbV9tbWFwKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fTU1BUF9HVFQJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9NTUFQX0dUVCwgc3RydWN0IGRybV9pOTE1X2dlbV9tbWFwX2d0dCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX1NFVF9ET01BSU4JRFJNX0lPVyAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9TRVRfRE9NQUlOLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3NldF9kb21haW4pCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9TV19GSU5JU0gJRFJNX0lPVyAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9TV19GSU5JU0gsIHN0cnVjdCBkcm1faTkxNV9nZW1fc3dfZmluaXNoKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fU0VUX1RJTElORwlEUk1fSU9XUiAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9TRVRfVElMSU5HLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3NldF90aWxpbmcpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9HRVRfVElMSU5HCURSTV9JT1dSIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX0dFVF9USUxJTkcsIHN0cnVjdCBkcm1faTkxNV9nZW1fZ2V0X3RpbGluZykKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX0dFVF9BUEVSVFVSRQlEUk1fSU9SICAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9HRVRfQVBFUlRVUkUsIHN0cnVjdCBkcm1faTkxNV9nZW1fZ2V0X2FwZXJ0dXJlKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRVRfUElQRV9GUk9NX0NSVENfSUQgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFVF9QSVBFX0ZST01fQ1JUQ19JRCwgc3RydWN0IGRybV9pOTE1X2dldF9waXBlX2Zyb21fY3J0Y19pZCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX01BRFZJU0UJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9NQURWSVNFLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21hZHZpc2UpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X09WRVJMQVlfUFVUX0lNQUdFCURSTV9JT1coRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X09WRVJMQVlfUFVUX0lNQUdFLCBzdHJ1Y3QgZHJtX2ludGVsX292ZXJsYXlfcHV0X2ltYWdlKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9PVkVSTEFZX0FUVFJTCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9PVkVSTEFZX0FUVFJTLCBzdHJ1Y3QgZHJtX2ludGVsX292ZXJsYXlfYXR0cnMpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X1NFVF9TUFJJVEVfQ09MT1JLRVkgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X1NFVF9TUFJJVEVfQ09MT1JLRVksIHN0cnVjdCBkcm1faW50ZWxfc3ByaXRlX2NvbG9ya2V5KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRVRfU1BSSVRFX0NPTE9SS0VZIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRVRfU1BSSVRFX0NPTE9SS0VZLCBzdHJ1Y3QgZHJtX2ludGVsX3Nwcml0ZV9jb2xvcmtleSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX1dBSVQJCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fV0FJVCwgc3RydWN0IGRybV9pOTE1X2dlbV93YWl0KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fQ09OVEVYVF9DUkVBVEUJRFJNX0lPV1IgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fQ09OVEVYVF9DUkVBVEUsIHN0cnVjdCBkcm1faTkxNV9nZW1fY29udGV4dF9jcmVhdGUpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9DT05URVhUX0RFU1RST1kJRFJNX0lPVyAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9DT05URVhUX0RFU1RST1ksIHN0cnVjdCBkcm1faTkxNV9nZW1fY29udGV4dF9kZXN0cm95KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9SRUdfUkVBRAkJCURSTV9JT1dSIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfUkVHX1JFQUQsIHN0cnVjdCBkcm1faTkxNV9yZWdfcmVhZCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VUX1JFU0VUX1NUQVRTCQlEUk1fSU9XUiAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFVF9SRVNFVF9TVEFUUywgc3RydWN0IGRybV9pOTE1X3Jlc2V0X3N0YXRzKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fVVNFUlBUUgkJCURSTV9JT1dSIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX1VTRVJQVFIsIHN0cnVjdCBkcm1faTkxNV9nZW1fdXNlcnB0cikKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX0NPTlRFWFRfR0VUUEFSQU0JRFJNX0lPV1IgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fQ09OVEVYVF9HRVRQQVJBTSwgc3RydWN0IGRybV9pOTE1X2dlbV9jb250ZXh0X3BhcmFtKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fQ09OVEVYVF9TRVRQQVJBTQlEUk1fSU9XUiAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9DT05URVhUX1NFVFBBUkFNLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW0pCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X1BFUkZfT1BFTglEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9QRVJGX09QRU4sIHN0cnVjdCBkcm1faTkxNV9wZXJmX29wZW5fcGFyYW0pCisKKy8qIEFsbG93IGRyaXZlcnMgdG8gc3VibWl0IGJhdGNoYnVmZmVycyBkaXJlY3RseSB0byBoYXJkd2FyZSwgcmVseWluZworICogb24gdGhlIHNlY3VyaXR5IG1lY2hhbmlzbXMgcHJvdmlkZWQgYnkgaGFyZHdhcmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X2JhdGNoYnVmZmVyIHsKKwlpbnQgc3RhcnQ7CQkvKiBhZ3Agb2Zmc2V0ICovCisJaW50IHVzZWQ7CQkvKiBuciBieXRlcyBpbiB1c2UgKi8KKwlpbnQgRFIxOwkJLyogaHcgZmxhZ3MgZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCisJaW50IERSNDsJCS8qIHdpbmRvdyBvcmlnaW4gZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCisJaW50IG51bV9jbGlwcmVjdHM7CS8qIG11bGl0cGFzcyB3aXRoIG11bHRpcGxlIGNsaXByZWN0cz8gKi8KKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqY2xpcHJlY3RzOwkvKiBwb2ludGVyIHRvIHVzZXJzcGFjZSBjbGlwcmVjdHMgKi8KK30gZHJtX2k5MTVfYmF0Y2hidWZmZXJfdDsKKworLyogQXMgYWJvdmUsIGJ1dCBwYXNzIGEgcG9pbnRlciB0byB1c2Vyc3BhY2UgYnVmZmVyIHdoaWNoIGNhbiBiZQorICogdmFsaWRhdGVkIGJ5IHRoZSBrZXJuZWwgcHJpb3IgdG8gc2VuZGluZyB0byBoYXJkd2FyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pOTE1X2NtZGJ1ZmZlciB7CisJY2hhciAqYnVmOwkvKiBwb2ludGVyIHRvIHVzZXJzcGFjZSBjb21tYW5kIGJ1ZmZlciAqLworCWludCBzejsJCQkvKiBuciBieXRlcyBpbiBidWYgKi8KKwlpbnQgRFIxOwkJLyogaHcgZmxhZ3MgZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCisJaW50IERSNDsJCS8qIHdpbmRvdyBvcmlnaW4gZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCisJaW50IG51bV9jbGlwcmVjdHM7CS8qIG11bGl0cGFzcyB3aXRoIG11bHRpcGxlIGNsaXByZWN0cz8gKi8KKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqY2xpcHJlY3RzOwkvKiBwb2ludGVyIHRvIHVzZXJzcGFjZSBjbGlwcmVjdHMgKi8KK30gZHJtX2k5MTVfY21kYnVmZmVyX3Q7CisKKy8qIFVzZXJzcGFjZSBjYW4gcmVxdWVzdCAmIHdhaXQgb24gaXJxJ3M6CisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X2lycV9lbWl0IHsKKwlpbnQgKmlycV9zZXE7Cit9IGRybV9pOTE1X2lycV9lbWl0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X2lycV93YWl0IHsKKwlpbnQgaXJxX3NlcTsKK30gZHJtX2k5MTVfaXJxX3dhaXRfdDsKKworLyogSW9jdGwgdG8gcXVlcnkga2VybmVsIHBhcmFtczoKKyAqLworI2RlZmluZSBJOTE1X1BBUkFNX0lSUV9BQ1RJVkUgICAgICAgICAgICAxCisjZGVmaW5lIEk5MTVfUEFSQU1fQUxMT1dfQkFUQ0hCVUZGRVIgICAgIDIKKyNkZWZpbmUgSTkxNV9QQVJBTV9MQVNUX0RJU1BBVENIICAgICAgICAgMworI2RlZmluZSBJOTE1X1BBUkFNX0NISVBTRVRfSUQgICAgICAgICAgICA0CisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX0dFTSAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgSTkxNV9QQVJBTV9OVU1fRkVOQ0VTX0FWQUlMICAgICAgNgorI2RlZmluZSBJOTE1X1BBUkFNX0hBU19PVkVSTEFZICAgICAgICAgICA3CisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX1BBR0VGTElQUElORwkgOAorI2RlZmluZSBJOTE1X1BBUkFNX0hBU19FWEVDQlVGMiAgICAgICAgICA5CisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX0JTRAkJIDEwCisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX0JMVAkJIDExCisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX1JFTEFYRURfRkVOQ0lORwkgMTIKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfQ09IRVJFTlRfUklOR1MJIDEzCisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX0VYRUNfQ09OU1RBTlRTCSAxNAorI2RlZmluZSBJOTE1X1BBUkFNX0hBU19SRUxBWEVEX0RFTFRBCSAxNQorI2RlZmluZSBJOTE1X1BBUkFNX0hBU19HRU43X1NPTF9SRVNFVAkgMTYKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfTExDICAgICAJIAkgMTcKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfQUxJQVNJTkdfUFBHVFQJIDE4CisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX1dBSVRfVElNRU9VVAkgMTkKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfU0VNQVBIT1JFUwkgMjAKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfUFJJTUVfVk1BUF9GTFVTSAkgMjEKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfVkVCT1gJCSAyMgorI2RlZmluZSBJOTE1X1BBUkFNX0hBU19TRUNVUkVfQkFUQ0hFUwkgMjMKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfUElOTkVEX0JBVENIRVMJIDI0CisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX0VYRUNfTk9fUkVMT0MJIDI1CisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX0VYRUNfSEFORExFX0xVVCAgIDI2CisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX1dUICAgICAJIAkgMjcKKyNkZWZpbmUgSTkxNV9QQVJBTV9DTURfUEFSU0VSX1ZFUlNJT04JIDI4CisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX0NPSEVSRU5UX1BIWVNfR1RUIDI5CisjZGVmaW5lIEk5MTVfUEFSQU1fTU1BUF9WRVJTSU9OICAgICAgICAgIDMwCisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX0JTRDIJCSAzMQorI2RlZmluZSBJOTE1X1BBUkFNX1JFVklTSU9OICAgICAgICAgICAgICAzMgorI2RlZmluZSBJOTE1X1BBUkFNX1NVQlNMSUNFX1RPVEFMCSAzMworI2RlZmluZSBJOTE1X1BBUkFNX0VVX1RPVEFMCQkgMzQKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfR1BVX1JFU0VUCSAzNQorI2RlZmluZSBJOTE1X1BBUkFNX0hBU19SRVNPVVJDRV9TVFJFQU1FUiAzNgorI2RlZmluZSBJOTE1X1BBUkFNX0hBU19FWEVDX1NPRlRQSU4JIDM3CisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX1BPT0xFRF9FVQkgMzgKKyNkZWZpbmUgSTkxNV9QQVJBTV9NSU5fRVVfSU5fUE9PTAkgMzkKKyNkZWZpbmUgSTkxNV9QQVJBTV9NTUFQX0dUVF9WRVJTSU9OCSA0MAorCisvKiBRdWVyeSB3aGV0aGVyIERSTV9JOTE1X0dFTV9FWEVDQlVGRkVSMiBzdXBwb3J0cyB1c2VyIGRlZmluZWQgZXhlY3V0aW9uCisgKiBwcmlvcml0aWVzIGFuZCB0aGUgZHJpdmVyIHdpbGwgYXR0ZW1wdCB0byBleGVjdXRlIGJhdGNoZXMgaW4gcHJpb3JpdHkgb3JkZXIuCisgKi8KKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfU0NIRURVTEVSCSA0MQorI2RlZmluZSBJOTE1X1BBUkFNX0hVQ19TVEFUVVMJCSA0MgorCisvKiBRdWVyeSB3aGV0aGVyIERSTV9JOTE1X0dFTV9FWEVDQlVGRkVSMiBzdXBwb3J0cyB0aGUgYWJpbGl0eSB0byBvcHQtb3V0IG9mCisgKiBzeW5jaHJvbmlzYXRpb24gd2l0aCBpbXBsaWNpdCBmZW5jaW5nIG9uIGluZGl2aWR1YWwgb2JqZWN0cy4KKyAqIFNlZSBFWEVDX09CSkVDVF9BU1lOQy4KKyAqLworI2RlZmluZSBJOTE1X1BBUkFNX0hBU19FWEVDX0FTWU5DCSA0MworCisvKiBRdWVyeSB3aGV0aGVyIERSTV9JOTE1X0dFTV9FWEVDQlVGRkVSMiBzdXBwb3J0cyBleHBsaWNpdCBmZW5jZSBzdXBwb3J0IC0KKyAqIGJvdGggYmVpbmcgYWJsZSB0byBwYXNzIGluIGEgc3luY19maWxlIGZkIHRvIHdhaXQgdXBvbiBiZWZvcmUgZXhlY3V0aW5nLAorICogYW5kIGJlaW5nIGFibGUgdG8gcmV0dXJuIGEgbmV3IHN5bmNfZmlsZSBmZCB0aGF0IGlzIHNpZ25hbGVkIHdoZW4gdGhlCisgKiBjdXJyZW50IHJlcXVlc3QgaXMgY29tcGxldGUuIFNlZSBJOTE1X0VYRUNfRkVOQ0VfSU4gYW5kIEk5MTVfRVhFQ19GRU5DRV9PVVQuCisgKi8KKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfRVhFQ19GRU5DRQkgNDQKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfZ2V0cGFyYW0geworCV9fczMyIHBhcmFtOworCS8qCisJICogV0FSTklORzogVXNpbmcgcG9pbnRlcnMgaW5zdGVhZCBvZiBmaXhlZC1zaXplIHU2NCBtZWFucyB3ZSBuZWVkIHRvIHdyaXRlCisJICogY29tcGF0MzIgY29kZS4gRG9uJ3QgcmVwZWF0IHRoaXMgbWlzdGFrZS4KKwkgKi8KKwlpbnQgKnZhbHVlOworfSBkcm1faTkxNV9nZXRwYXJhbV90OworCisvKiBJb2N0bCB0byBzZXQga2VybmVsIHBhcmFtczoKKyAqLworI2RlZmluZSBJOTE1X1NFVFBBUkFNX1VTRV9NSV9CQVRDSEJVRkZFUl9TVEFSVCAgICAgICAgICAgIDEKKyNkZWZpbmUgSTkxNV9TRVRQQVJBTV9URVhfTFJVX0xPR19HUkFOVUxBUklUWSAgICAgICAgICAgICAyCisjZGVmaW5lIEk5MTVfU0VUUEFSQU1fQUxMT1dfQkFUQ0hCVUZGRVIgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBJOTE1X1NFVFBBUkFNX05VTV9VU0VEX0ZFTkNFUyAgICAgICAgICAgICAgICAgICAgIDQKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfc2V0cGFyYW0geworCWludCBwYXJhbTsKKwlpbnQgdmFsdWU7Cit9IGRybV9pOTE1X3NldHBhcmFtX3Q7CisKKy8qIEEgbWVtb3J5IG1hbmFnZXIgZm9yIHJlZ2lvbnMgb2Ygc2hhcmVkIG1lbW9yeToKKyAqLworI2RlZmluZSBJOTE1X01FTV9SRUdJT05fQUdQIDEKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfbWVtX2FsbG9jIHsKKwlpbnQgcmVnaW9uOworCWludCBhbGlnbm1lbnQ7CisJaW50IHNpemU7CisJaW50ICpyZWdpb25fb2Zmc2V0OwkvKiBvZmZzZXQgZnJvbSBzdGFydCBvZiBmYiBvciBhZ3AgKi8KK30gZHJtX2k5MTVfbWVtX2FsbG9jX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X21lbV9mcmVlIHsKKwlpbnQgcmVnaW9uOworCWludCByZWdpb25fb2Zmc2V0OworfSBkcm1faTkxNV9tZW1fZnJlZV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9tZW1faW5pdF9oZWFwIHsKKwlpbnQgcmVnaW9uOworCWludCBzaXplOworCWludCBzdGFydDsKK30gZHJtX2k5MTVfbWVtX2luaXRfaGVhcF90OworCisvKiBBbGxvdyBtZW1vcnkgbWFuYWdlciB0byBiZSB0b3JuIGRvd24gYW5kIHJlLWluaXRpYWxpemVkIChlZyBvbgorICogcm90YXRlKToKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfbWVtX2Rlc3Ryb3lfaGVhcCB7CisJaW50IHJlZ2lvbjsKK30gZHJtX2k5MTVfbWVtX2Rlc3Ryb3lfaGVhcF90OworCisvKiBBbGxvdyBYIHNlcnZlciB0byBjb25maWd1cmUgd2hpY2ggcGlwZXMgdG8gbW9uaXRvciBmb3IgdmJsYW5rIHNpZ25hbHMKKyAqLworI2RlZmluZQlEUk1fSTkxNV9WQkxBTktfUElQRV9BCTEKKyNkZWZpbmUJRFJNX0k5MTVfVkJMQU5LX1BJUEVfQgkyCisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X3ZibGFua19waXBlIHsKKwlpbnQgcGlwZTsKK30gZHJtX2k5MTVfdmJsYW5rX3BpcGVfdDsKKworLyogU2NoZWR1bGUgYnVmZmVyIHN3YXAgYXQgZ2l2ZW4gdmVydGljYWwgYmxhbms6CisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X3ZibGFua19zd2FwIHsKKwlkcm1fZHJhd2FibGVfdCBkcmF3YWJsZTsKKwllbnVtIGRybV92Ymxhbmtfc2VxX3R5cGUgc2VxdHlwZTsKKwl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7Cit9IGRybV9pOTE1X3ZibGFua19zd2FwX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X2h3c19hZGRyIHsKKwlfX3U2NCBhZGRyOworfSBkcm1faTkxNV9od3NfYWRkcl90OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2luaXQgeworCS8qKgorCSAqIEJlZ2lubmluZyBvZmZzZXQgaW4gdGhlIEdUVCB0byBiZSBtYW5hZ2VkIGJ5IHRoZSBEUk0gbWVtb3J5CisJICogbWFuYWdlci4KKwkgKi8KKwlfX3U2NCBndHRfc3RhcnQ7CisJLyoqCisJICogRW5kaW5nIG9mZnNldCBpbiB0aGUgR1RUIHRvIGJlIG1hbmFnZWQgYnkgdGhlIERSTSBtZW1vcnkKKwkgKiBtYW5hZ2VyLgorCSAqLworCV9fdTY0IGd0dF9lbmQ7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NyZWF0ZSB7CisJLyoqCisJICogUmVxdWVzdGVkIHNpemUgZm9yIHRoZSBvYmplY3QuCisJICoKKwkgKiBUaGUgKHBhZ2UtYWxpZ25lZCkgYWxsb2NhdGVkIHNpemUgZm9yIHRoZSBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZC4KKwkgKi8KKwlfX3U2NCBzaXplOworCS8qKgorCSAqIFJldHVybmVkIGhhbmRsZSBmb3IgdGhlIG9iamVjdC4KKwkgKgorCSAqIE9iamVjdCBoYW5kbGVzIGFyZSBub256ZXJvLgorCSAqLworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBwYWQ7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3ByZWFkIHsKKwkvKiogSGFuZGxlIGZvciB0aGUgb2JqZWN0IGJlaW5nIHJlYWQuICovCisJX191MzIgaGFuZGxlOworCV9fdTMyIHBhZDsKKwkvKiogT2Zmc2V0IGludG8gdGhlIG9iamVjdCB0byByZWFkIGZyb20gKi8KKwlfX3U2NCBvZmZzZXQ7CisJLyoqIExlbmd0aCBvZiBkYXRhIHRvIHJlYWQgKi8KKwlfX3U2NCBzaXplOworCS8qKgorCSAqIFBvaW50ZXIgdG8gd3JpdGUgdGhlIGRhdGEgaW50by4KKwkgKgorCSAqIFRoaXMgaXMgYSBmaXhlZC1zaXplIHR5cGUgZm9yIDMyLzY0IGNvbXBhdGliaWxpdHkuCisJICovCisJX191NjQgZGF0YV9wdHI7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3B3cml0ZSB7CisJLyoqIEhhbmRsZSBmb3IgdGhlIG9iamVjdCBiZWluZyB3cml0dGVuIHRvLiAqLworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBwYWQ7CisJLyoqIE9mZnNldCBpbnRvIHRoZSBvYmplY3QgdG8gd3JpdGUgdG8gKi8KKwlfX3U2NCBvZmZzZXQ7CisJLyoqIExlbmd0aCBvZiBkYXRhIHRvIHdyaXRlICovCisJX191NjQgc2l6ZTsKKwkvKioKKwkgKiBQb2ludGVyIHRvIHJlYWQgdGhlIGRhdGEgZnJvbS4KKwkgKgorCSAqIFRoaXMgaXMgYSBmaXhlZC1zaXplIHR5cGUgZm9yIDMyLzY0IGNvbXBhdGliaWxpdHkuCisJICovCisJX191NjQgZGF0YV9wdHI7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXAgeworCS8qKiBIYW5kbGUgZm9yIHRoZSBvYmplY3QgYmVpbmcgbWFwcGVkLiAqLworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBwYWQ7CisJLyoqIE9mZnNldCBpbiB0aGUgb2JqZWN0IHRvIG1hcC4gKi8KKwlfX3U2NCBvZmZzZXQ7CisJLyoqCisJICogTGVuZ3RoIG9mIGRhdGEgdG8gbWFwLgorCSAqCisJICogVGhlIHZhbHVlIHdpbGwgYmUgcGFnZS1hbGlnbmVkLgorCSAqLworCV9fdTY0IHNpemU7CisJLyoqCisJICogUmV0dXJuZWQgcG9pbnRlciB0aGUgZGF0YSB3YXMgbWFwcGVkIGF0LgorCSAqCisJICogVGhpcyBpcyBhIGZpeGVkLXNpemUgdHlwZSBmb3IgMzIvNjQgY29tcGF0aWJpbGl0eS4KKwkgKi8KKwlfX3U2NCBhZGRyX3B0cjsKKworCS8qKgorCSAqIEZsYWdzIGZvciBleHRlbmRlZCBiZWhhdmlvdXIuCisJICoKKwkgKiBBZGRlZCBpbiB2ZXJzaW9uIDIuCisJICovCisJX191NjQgZmxhZ3M7CisjZGVmaW5lIEk5MTVfTU1BUF9XQyAweDEKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fbW1hcF9ndHQgeworCS8qKiBIYW5kbGUgZm9yIHRoZSBvYmplY3QgYmVpbmcgbWFwcGVkLiAqLworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBwYWQ7CisJLyoqCisJICogRmFrZSBvZmZzZXQgdG8gdXNlIGZvciBzdWJzZXF1ZW50IG1tYXAgY2FsbAorCSAqCisJICogVGhpcyBpcyBhIGZpeGVkLXNpemUgdHlwZSBmb3IgMzIvNjQgY29tcGF0aWJpbGl0eS4KKwkgKi8KKwlfX3U2NCBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3NldF9kb21haW4geworCS8qKiBIYW5kbGUgZm9yIHRoZSBvYmplY3QgKi8KKwlfX3UzMiBoYW5kbGU7CisKKwkvKiogTmV3IHJlYWQgZG9tYWlucyAqLworCV9fdTMyIHJlYWRfZG9tYWluczsKKworCS8qKiBOZXcgd3JpdGUgZG9tYWluICovCisJX191MzIgd3JpdGVfZG9tYWluOworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9zd19maW5pc2ggeworCS8qKiBIYW5kbGUgZm9yIHRoZSBvYmplY3QgKi8KKwlfX3UzMiBoYW5kbGU7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgeworCS8qKgorCSAqIEhhbmRsZSBvZiB0aGUgYnVmZmVyIGJlaW5nIHBvaW50ZWQgdG8gYnkgdGhpcyByZWxvY2F0aW9uIGVudHJ5LgorCSAqCisJICogSXQncyBhcHBlYWxpbmcgdG8gbWFrZSB0aGlzIGJlIGFuIGluZGV4IGludG8gdGhlIG1tX3ZhbGlkYXRlX2VudHJ5CisJICogbGlzdCB0byByZWZlciB0byB0aGUgYnVmZmVyLCBidXQgdGhpcyBhbGxvd3MgdGhlIGRyaXZlciB0byBjcmVhdGUKKwkgKiBhIHJlbG9jYXRpb24gbGlzdCBmb3Igc3RhdGUgYnVmZmVycyBhbmQgbm90IHJlLXdyaXRlIGl0IHBlcgorCSAqIGV4ZWMgdXNpbmcgdGhlIGJ1ZmZlci4KKwkgKi8KKwlfX3UzMiB0YXJnZXRfaGFuZGxlOworCisJLyoqCisJICogVmFsdWUgdG8gYmUgYWRkZWQgdG8gdGhlIG9mZnNldCBvZiB0aGUgdGFyZ2V0IGJ1ZmZlciB0byBtYWtlIHVwCisJICogdGhlIHJlbG9jYXRpb24gZW50cnkuCisJICovCisJX191MzIgZGVsdGE7CisKKwkvKiogT2Zmc2V0IGluIHRoZSBidWZmZXIgdGhlIHJlbG9jYXRpb24gZW50cnkgd2lsbCBiZSB3cml0dGVuIGludG8gKi8KKwlfX3U2NCBvZmZzZXQ7CisKKwkvKioKKwkgKiBPZmZzZXQgdmFsdWUgb2YgdGhlIHRhcmdldCBidWZmZXIgdGhhdCB0aGUgcmVsb2NhdGlvbiBlbnRyeSB3YXMgbGFzdAorCSAqIHdyaXR0ZW4gYXMuCisJICoKKwkgKiBJZiB0aGUgYnVmZmVyIGhhcyB0aGUgc2FtZSBvZmZzZXQgYXMgbGFzdCB0aW1lLCB3ZSBjYW4gc2tpcCBzeW5jaW5nCisJICogYW5kIHdyaXRpbmcgdGhlIHJlbG9jYXRpb24uICBUaGlzIHZhbHVlIGlzIHdyaXR0ZW4gYmFjayBvdXQgYnkKKwkgKiB0aGUgZXhlY2J1ZmZlciBpb2N0bCB3aGVuIHRoZSByZWxvY2F0aW9uIGlzIHdyaXR0ZW4uCisJICovCisJX191NjQgcHJlc3VtZWRfb2Zmc2V0OworCisJLyoqCisJICogVGFyZ2V0IG1lbW9yeSBkb21haW5zIHJlYWQgYnkgdGhpcyBvcGVyYXRpb24uCisJICovCisJX191MzIgcmVhZF9kb21haW5zOworCisJLyoqCisJICogVGFyZ2V0IG1lbW9yeSBkb21haW5zIHdyaXR0ZW4gYnkgdGhpcyBvcGVyYXRpb24uCisJICoKKwkgKiBOb3RlIHRoYXQgb25seSBvbmUgZG9tYWluIG1heSBiZSB3cml0dGVuIGJ5IHRoZSB3aG9sZQorCSAqIGV4ZWNidWZmZXIgb3BlcmF0aW9uLCBzbyB0aGF0IHdoZXJlIHRoZXJlIGFyZSBjb25mbGljdHMsCisJICogdGhlIGFwcGxpY2F0aW9uIHdpbGwgZ2V0IC1FSU5WQUwgYmFjay4KKwkgKi8KKwlfX3UzMiB3cml0ZV9kb21haW47Cit9OworCisvKiogQHsKKyAqIEludGVsIG1lbW9yeSBkb21haW5zCisgKgorICogTW9zdCBvZiB0aGVzZSBqdXN0IGFsaWduIHdpdGggdGhlIHZhcmlvdXMgY2FjaGVzIGluCisgKiB0aGUgc3lzdGVtIGFuZCBhcmUgdXNlZCB0byBmbHVzaCBhbmQgaW52YWxpZGF0ZSBhcworICogb2JqZWN0cyBlbmQgdXAgY2FjaGVkIGluIGRpZmZlcmVudCBkb21haW5zLgorICovCisvKiogQ1BVIGNhY2hlICovCisjZGVmaW5lIEk5MTVfR0VNX0RPTUFJTl9DUFUJCTB4MDAwMDAwMDEKKy8qKiBSZW5kZXIgY2FjaGUsIHVzZWQgYnkgMkQgYW5kIDNEIGRyYXdpbmcgKi8KKyNkZWZpbmUgSTkxNV9HRU1fRE9NQUlOX1JFTkRFUgkJMHgwMDAwMDAwMgorLyoqIFNhbXBsZXIgY2FjaGUsIHVzZWQgYnkgdGV4dHVyZSBlbmdpbmUgKi8KKyNkZWZpbmUgSTkxNV9HRU1fRE9NQUlOX1NBTVBMRVIJCTB4MDAwMDAwMDQKKy8qKiBDb21tYW5kIHF1ZXVlLCB1c2VkIHRvIGxvYWQgYmF0Y2ggYnVmZmVycyAqLworI2RlZmluZSBJOTE1X0dFTV9ET01BSU5fQ09NTUFORAkJMHgwMDAwMDAwOAorLyoqIEluc3RydWN0aW9uIGNhY2hlLCB1c2VkIGJ5IHNoYWRlciBwcm9ncmFtcyAqLworI2RlZmluZSBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04JMHgwMDAwMDAxMAorLyoqIFZlcnRleCBhZGRyZXNzIGNhY2hlICovCisjZGVmaW5lIEk5MTVfR0VNX0RPTUFJTl9WRVJURVgJCTB4MDAwMDAwMjAKKy8qKiBHVFQgZG9tYWluIC0gYXBlcnR1cmUgYW5kIHNjYW5vdXQgKi8KKyNkZWZpbmUgSTkxNV9HRU1fRE9NQUlOX0dUVAkJMHgwMDAwMDA0MAorLyoqIEB9ICovCisKK3N0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QgeworCS8qKgorCSAqIFVzZXIncyBoYW5kbGUgZm9yIGEgYnVmZmVyIHRvIGJlIGJvdW5kIGludG8gdGhlIEdUVCBmb3IgdGhpcworCSAqIG9wZXJhdGlvbi4KKwkgKi8KKwlfX3UzMiBoYW5kbGU7CisKKwkvKiogTnVtYmVyIG9mIHJlbG9jYXRpb25zIHRvIGJlIHBlcmZvcm1lZCBvbiB0aGlzIGJ1ZmZlciAqLworCV9fdTMyIHJlbG9jYXRpb25fY291bnQ7CisJLyoqCisJICogUG9pbnRlciB0byBhcnJheSBvZiBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgY29udGFpbmluZworCSAqIHRoZSByZWxvY2F0aW9ucyB0byBiZSBwZXJmb3JtZWQgaW4gdGhpcyBidWZmZXIuCisJICovCisJX191NjQgcmVsb2NzX3B0cjsKKworCS8qKiBSZXF1aXJlZCBhbGlnbm1lbnQgaW4gZ3JhcGhpY3MgYXBlcnR1cmUgKi8KKwlfX3U2NCBhbGlnbm1lbnQ7CisKKwkvKioKKwkgKiBSZXR1cm5lZCB2YWx1ZSBvZiB0aGUgdXBkYXRlZCBvZmZzZXQgb2YgdGhlIG9iamVjdCwgZm9yIGZ1dHVyZQorCSAqIHByZXN1bWVkX29mZnNldCB3cml0ZXMuCisJICovCisJX191NjQgb2Zmc2V0OworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyIHsKKwkvKioKKwkgKiBMaXN0IG9mIGJ1ZmZlcnMgdG8gYmUgdmFsaWRhdGVkIHdpdGggdGhlaXIgcmVsb2NhdGlvbnMgdG8gYmUKKwkgKiBwZXJmb3JtZW5kIG9uIHRoZW0uCisJICoKKwkgKiBUaGlzIGlzIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3ZhbGlkYXRlX2VudHJ5LgorCSAqCisJICogVGhlc2UgYnVmZmVycyBtdXN0IGJlIGxpc3RlZCBpbiBhbiBvcmRlciBzdWNoIHRoYXQgYWxsIHJlbG9jYXRpb25zCisJICogYSBidWZmZXIgaXMgcGVyZm9ybWluZyByZWZlciB0byBidWZmZXJzIHRoYXQgaGF2ZSBhbHJlYWR5IGFwcGVhcmVkCisJICogaW4gdGhlIHZhbGlkYXRlIGxpc3QuCisJICovCisJX191NjQgYnVmZmVyc19wdHI7CisJX191MzIgYnVmZmVyX2NvdW50OworCisJLyoqIE9mZnNldCBpbiB0aGUgYmF0Y2hidWZmZXIgdG8gc3RhcnQgZXhlY3V0aW9uIGZyb20uICovCisJX191MzIgYmF0Y2hfc3RhcnRfb2Zmc2V0OworCS8qKiBCeXRlcyB1c2VkIGluIGJhdGNoYnVmZmVyIGZyb20gYmF0Y2hfc3RhcnRfb2Zmc2V0ICovCisJX191MzIgYmF0Y2hfbGVuOworCV9fdTMyIERSMTsKKwlfX3UzMiBEUjQ7CisJX191MzIgbnVtX2NsaXByZWN0czsKKwkvKiogVGhpcyBpcyBhIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcmVjdHMgKi8KKwlfX3U2NCBjbGlwcmVjdHNfcHRyOworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgeworCS8qKgorCSAqIFVzZXIncyBoYW5kbGUgZm9yIGEgYnVmZmVyIHRvIGJlIGJvdW5kIGludG8gdGhlIEdUVCBmb3IgdGhpcworCSAqIG9wZXJhdGlvbi4KKwkgKi8KKwlfX3UzMiBoYW5kbGU7CisKKwkvKiogTnVtYmVyIG9mIHJlbG9jYXRpb25zIHRvIGJlIHBlcmZvcm1lZCBvbiB0aGlzIGJ1ZmZlciAqLworCV9fdTMyIHJlbG9jYXRpb25fY291bnQ7CisJLyoqCisJICogUG9pbnRlciB0byBhcnJheSBvZiBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgY29udGFpbmluZworCSAqIHRoZSByZWxvY2F0aW9ucyB0byBiZSBwZXJmb3JtZWQgaW4gdGhpcyBidWZmZXIuCisJICovCisJX191NjQgcmVsb2NzX3B0cjsKKworCS8qKiBSZXF1aXJlZCBhbGlnbm1lbnQgaW4gZ3JhcGhpY3MgYXBlcnR1cmUgKi8KKwlfX3U2NCBhbGlnbm1lbnQ7CisKKwkvKioKKwkgKiBXaGVuIHRoZSBFWEVDX09CSkVDVF9QSU5ORUQgZmxhZyBpcyBzcGVjaWZpZWQgdGhpcyBpcyBwb3B1bGF0ZWQgYnkKKwkgKiB0aGUgdXNlciB3aXRoIHRoZSBHVFQgb2Zmc2V0IGF0IHdoaWNoIHRoaXMgb2JqZWN0IHdpbGwgYmUgcGlubmVkLgorCSAqIFdoZW4gdGhlIEk5MTVfRVhFQ19OT19SRUxPQyBmbGFnIGlzIHNwZWNpZmllZCB0aGlzIG11c3QgY29udGFpbiB0aGUKKwkgKiBwcmVzdW1lZF9vZmZzZXQgb2YgdGhlIG9iamVjdC4KKwkgKiBEdXJpbmcgZXhlY2J1ZmZlcjIgdGhlIGtlcm5lbCBwb3B1bGF0ZXMgaXQgd2l0aCB0aGUgdmFsdWUgb2YgdGhlCisJICogY3VycmVudCBHVFQgb2Zmc2V0IG9mIHRoZSBvYmplY3QsIGZvciBmdXR1cmUgcHJlc3VtZWRfb2Zmc2V0IHdyaXRlcy4KKwkgKi8KKwlfX3U2NCBvZmZzZXQ7CisKKyNkZWZpbmUgRVhFQ19PQkpFQ1RfTkVFRFNfRkVOQ0UJCSAoMTw8MCkKKyNkZWZpbmUgRVhFQ19PQkpFQ1RfTkVFRFNfR1RUCQkgKDE8PDEpCisjZGVmaW5lIEVYRUNfT0JKRUNUX1dSSVRFCQkgKDE8PDIpCisjZGVmaW5lIEVYRUNfT0JKRUNUX1NVUFBPUlRTXzQ4Ql9BRERSRVNTICgxPDwzKQorI2RlZmluZSBFWEVDX09CSkVDVF9QSU5ORUQJCSAoMTw8NCkKKyNkZWZpbmUgRVhFQ19PQkpFQ1RfUEFEX1RPX1NJWkUJCSAoMTw8NSkKKy8qIFRoZSBrZXJuZWwgaW1wbGljaXRseSB0cmFja3MgR1BVIGFjdGl2aXR5IG9uIGFsbCBHRU0gb2JqZWN0cywgYW5kCisgKiBzeW5jaHJvbmlzZXMgb3BlcmF0aW9ucyB3aXRoIG91dHN0YW5kaW5nIHJlbmRlcmluZy4gVGhpcyBpbmNsdWRlcworICogcmVuZGVyaW5nIG9uIG90aGVyIGRldmljZXMgaWYgZXhwb3J0ZWQgdmlhIGRtYS1idWYuIEhvd2V2ZXIsIHNvbWV0aW1lcworICogdGhpcyB0cmFja2luZyBpcyB0b28gY29hcnNlIGFuZCB0aGUgdXNlciBrbm93cyBiZXR0ZXIuIEZvciBleGFtcGxlLAorICogaWYgdGhlIG9iamVjdCBpcyBzcGxpdCBpbnRvIG5vbi1vdmVybGFwcGluZyByYW5nZXMgc2hhcmVkIGJldHdlZW4gZGlmZmVyZW50CisgKiBjbGllbnRzIG9yIGVuZ2luZXMgKGkuZS4gc3ViYWxsb2NhdGluZyBvYmplY3RzKSwgdGhlIGltcGxpY2l0IHRyYWNraW5nCisgKiBieSBrZXJuZWwgYXNzdW1lcyB0aGF0IGVhY2ggb3BlcmF0aW9uIGFmZmVjdHMgdGhlIHdob2xlIG9iamVjdCByYXRoZXIKKyAqIHRoYW4gYW4gaW5kaXZpZHVhbCByYW5nZSwgY2F1c2luZyBuZWVkbGVzcyBzeW5jaHJvbmlzYXRpb24gYmV0d2VlbiBjbGllbnRzLgorICogVGhlIGtlcm5lbCB3aWxsIGFsc28gZm9yZ28gYW55IENQVSBjYWNoZSBmbHVzaGVzIHByaW9yIHRvIHJlbmRlcmluZyBmcm9tCisgKiB0aGUgb2JqZWN0IGFzIHRoZSBjbGllbnQgaXMgZXhwZWN0ZWQgdG8gYmUgYWxzbyBoYW5kbGluZyBzdWNoIGRvbWFpbgorICogdHJhY2tpbmcuCisgKgorICogVGhlIGtlcm5lbCBtYWludGFpbnMgdGhlIGltcGxpY2l0IHRyYWNraW5nIGluIG9yZGVyIHRvIG1hbmFnZSByZXNvdXJjZXMKKyAqIHVzZWQgYnkgdGhlIEdQVSAtIHRoaXMgZmxhZyBvbmx5IGRpc2FibGVzIHRoZSBzeW5jaHJvbmlzYXRpb24gcHJpb3IgdG8KKyAqIHJlbmRlcmluZyB3aXRoIHRoaXMgb2JqZWN0IGluIHRoaXMgZXhlY2J1Zi4KKyAqCisgKiBPcHRpbmcgb3V0IG9mIGltcGxpY2l0IHN5bmhyb25pc2F0aW9uIHJlcXVpcmVzIHRoZSB1c2VyIHRvIGRvIGl0cyBvd24KKyAqIGV4cGxpY2l0IHRyYWNraW5nIHRvIGF2b2lkIHJlbmRlcmluZyBjb3JydXB0aW9uLiBTZWUsIGZvciBleGFtcGxlLAorICogSTkxNV9QQVJBTV9IQVNfRVhFQ19GRU5DRSB0byBvcmRlciBleGVjYnVmcyBhbmQgZXhlY3V0ZSB0aGVtIGFzeW5jaHJvbm91c2x5LgorICovCisjZGVmaW5lIEVYRUNfT0JKRUNUX0FTWU5DCQkoMTw8NikKKy8qIEFsbCByZW1haW5pbmcgYml0cyBhcmUgTUJaIGFuZCBSRVNFUlZFRCBGT1IgRlVUVVJFIFVTRSAqLworI2RlZmluZSBfX0VYRUNfT0JKRUNUX1VOS05PV05fRkxBR1MgLShFWEVDX09CSkVDVF9BU1lOQzw8MSkKKwlfX3U2NCBmbGFnczsKKworCXVuaW9uIHsKKwkJX191NjQgcnN2ZDE7CisJCV9fdTY0IHBhZF90b19zaXplOworCX07CisJX191NjQgcnN2ZDI7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyIHsKKwkvKioKKwkgKiBMaXN0IG9mIGdlbV9leGVjX29iamVjdDIgc3RydWN0cworCSAqLworCV9fdTY0IGJ1ZmZlcnNfcHRyOworCV9fdTMyIGJ1ZmZlcl9jb3VudDsKKworCS8qKiBPZmZzZXQgaW4gdGhlIGJhdGNoYnVmZmVyIHRvIHN0YXJ0IGV4ZWN1dGlvbiBmcm9tLiAqLworCV9fdTMyIGJhdGNoX3N0YXJ0X29mZnNldDsKKwkvKiogQnl0ZXMgdXNlZCBpbiBiYXRjaGJ1ZmZlciBmcm9tIGJhdGNoX3N0YXJ0X29mZnNldCAqLworCV9fdTMyIGJhdGNoX2xlbjsKKwlfX3UzMiBEUjE7CisJX191MzIgRFI0OworCV9fdTMyIG51bV9jbGlwcmVjdHM7CisJLyoqIFRoaXMgaXMgYSBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqY2xpcHJlY3RzICovCisJX191NjQgY2xpcHJlY3RzX3B0cjsKKyNkZWZpbmUgSTkxNV9FWEVDX1JJTkdfTUFTSyAgICAgICAgICAgICAgKDc8PDApCisjZGVmaW5lIEk5MTVfRVhFQ19ERUZBVUxUICAgICAgICAgICAgICAgICgwPDwwKQorI2RlZmluZSBJOTE1X0VYRUNfUkVOREVSICAgICAgICAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgSTkxNV9FWEVDX0JTRCAgICAgICAgICAgICAgICAgICAgKDI8PDApCisjZGVmaW5lIEk5MTVfRVhFQ19CTFQgICAgICAgICAgICAgICAgICAgICgzPDwwKQorI2RlZmluZSBJOTE1X0VYRUNfVkVCT1ggICAgICAgICAgICAgICAgICAoNDw8MCkKKworLyogVXNlZCBmb3Igc3dpdGNoaW5nIHRoZSBjb25zdGFudHMgYWRkcmVzc2luZyBtb2RlIG9uIGdlbjQrIFJFTkRFUiByaW5nLgorICogR2VuNisgb25seSBzdXBwb3J0cyByZWxhdGl2ZSBhZGRyZXNzaW5nIHRvIGR5bmFtaWMgc3RhdGUgKGRlZmF1bHQpIGFuZAorICogYWJzb2x1dGUgYWRkcmVzc2luZy4KKyAqCisgKiBUaGVzZSBmbGFncyBhcmUgaWdub3JlZCBmb3IgdGhlIEJTRCBhbmQgQkxUIHJpbmdzLgorICovCisjZGVmaW5lIEk5MTVfRVhFQ19DT05TVEFOVFNfTUFTSyAJKDM8PDYpCisjZGVmaW5lIEk5MTVfRVhFQ19DT05TVEFOVFNfUkVMX0dFTkVSQUwgKDA8PDYpIC8qIGRlZmF1bHQgKi8KKyNkZWZpbmUgSTkxNV9FWEVDX0NPTlNUQU5UU19BQlNPTFVURSAJKDE8PDYpCisjZGVmaW5lIEk5MTVfRVhFQ19DT05TVEFOVFNfUkVMX1NVUkZBQ0UgKDI8PDYpIC8qIGdlbjQvNSBvbmx5ICovCisJX191NjQgZmxhZ3M7CisJX191NjQgcnN2ZDE7IC8qIG5vdyB1c2VkIGZvciBjb250ZXh0IGluZm8gKi8KKwlfX3U2NCByc3ZkMjsKK307CisKKy8qKiBSZXNldHMgdGhlIFNPIHdyaXRlIG9mZnNldCByZWdpc3RlcnMgZm9yIHRyYW5zZm9ybSBmZWVkYmFjayBvbiBnZW43LiAqLworI2RlZmluZSBJOTE1X0VYRUNfR0VON19TT0xfUkVTRVQJKDE8PDgpCisKKy8qKiBSZXF1ZXN0IGEgcHJpdmlsZWdlZCAoInNlY3VyZSIpIGJhdGNoIGJ1ZmZlci4gTm90ZSBvbmx5IGF2YWlsYWJsZSBmb3IKKyAqIERSTV9ST09UX09OTFkgfCBEUk1fTUFTVEVSIHByb2Nlc3Nlcy4KKyAqLworI2RlZmluZSBJOTE1X0VYRUNfU0VDVVJFCQkoMTw8OSkKKworLyoqIEluZm9ybSB0aGUga2VybmVsIHRoYXQgdGhlIGJhdGNoIGlzIGFuZCB3aWxsIGFsd2F5cyBiZSBwaW5uZWQuIFRoaXMKKyAqIG5lZ2F0ZXMgdGhlIHJlcXVpcmVtZW50IGZvciBhIHdvcmthcm91bmQgdG8gYmUgcGVyZm9ybWVkIHRvIGF2b2lkCisgKiBhbiBpbmNvaGVyZW50IENTIChzdWNoIGFzIGNhbiBiZSBmb3VuZCBvbiA4MzAvODQ1KS4gSWYgdGhpcyBmbGFnIGlzCisgKiBub3QgcGFzc2VkLCB0aGUga2VybmVsIHdpbGwgZW5kZWF2b3VyIHRvIG1ha2Ugc3VyZSB0aGUgYmF0Y2ggaXMKKyAqIGNvaGVyZW50IHdpdGggdGhlIENTIGJlZm9yZSBleGVjdXRpb24uIElmIHRoaXMgZmxhZyBpcyBwYXNzZWQsCisgKiB1c2Vyc3BhY2UgYXNzdW1lcyB0aGUgcmVzcG9uc2liaWxpdHkgZm9yIGVuc3VyaW5nIHRoZSBzYW1lLgorICovCisjZGVmaW5lIEk5MTVfRVhFQ19JU19QSU5ORUQJCSgxPDwxMCkKKworLyoqIFByb3ZpZGUgYSBoaW50IHRvIHRoZSBrZXJuZWwgdGhhdCB0aGUgY29tbWFuZCBzdHJlYW0gYW5kIGF1eGlsaWFyeQorICogc3RhdGUgYnVmZmVycyBhbHJlYWR5IGhvbGRzIHRoZSBjb3JyZWN0IHByZXN1bWVkIGFkZHJlc3NlcyBhbmQgc28gdGhlCisgKiByZWxvY2F0aW9uIHByb2Nlc3MgbWF5IGJlIHNraXBwZWQgaWYgbm8gYnVmZmVycyBuZWVkIHRvIGJlIG1vdmVkIGluCisgKiBwcmVwYXJhdGlvbiBmb3IgdGhlIGV4ZWNidWZmZXIuCisgKi8KKyNkZWZpbmUgSTkxNV9FWEVDX05PX1JFTE9DCQkoMTw8MTEpCisKKy8qKiBVc2UgdGhlIHJlbG9jLmhhbmRsZSBhcyBhbiBpbmRleCBpbnRvIHRoZSBleGVjIG9iamVjdCBhcnJheSByYXRoZXIKKyAqIHRoYW4gYXMgdGhlIHBlci1maWxlIGhhbmRsZS4KKyAqLworI2RlZmluZSBJOTE1X0VYRUNfSEFORExFX0xVVAkJKDE8PDEyKQorCisvKiogVXNlZCBmb3Igc3dpdGNoaW5nIEJTRCByaW5ncyBvbiB0aGUgcGxhdGZvcm1zIHdpdGggdHdvIEJTRCByaW5ncyAqLworI2RlZmluZSBJOTE1X0VYRUNfQlNEX1NISUZUCSAoMTMpCisjZGVmaW5lIEk5MTVfRVhFQ19CU0RfTUFTSwkgKDMgPDwgSTkxNV9FWEVDX0JTRF9TSElGVCkKKy8qIGRlZmF1bHQgcGluZy1wb25nIG1vZGUgKi8KKyNkZWZpbmUgSTkxNV9FWEVDX0JTRF9ERUZBVUxUCSAoMCA8PCBJOTE1X0VYRUNfQlNEX1NISUZUKQorI2RlZmluZSBJOTE1X0VYRUNfQlNEX1JJTkcxCSAoMSA8PCBJOTE1X0VYRUNfQlNEX1NISUZUKQorI2RlZmluZSBJOTE1X0VYRUNfQlNEX1JJTkcyCSAoMiA8PCBJOTE1X0VYRUNfQlNEX1NISUZUKQorCisvKiogVGVsbCB0aGUga2VybmVsIHRoYXQgdGhlIGJhdGNoYnVmZmVyIGlzIHByb2Nlc3NlZCBieQorICogIHRoZSByZXNvdXJjZSBzdHJlYW1lci4KKyAqLworI2RlZmluZSBJOTE1X0VYRUNfUkVTT1VSQ0VfU1RSRUFNRVIgICAgICgxPDwxNSkKKworLyogU2V0dGluZyBJOTE1X0VYRUNfRkVOQ0VfSU4gaW1wbGllcyB0aGF0IGxvd2VyXzMyX2JpdHMocnN2ZDIpIHJlcHJlc2VudAorICogYSBzeW5jX2ZpbGUgZmQgdG8gd2FpdCB1cG9uIChpbiBhIG5vbmJsb2NraW5nIG1hbm5lcikgcHJpb3IgdG8gZXhlY3V0aW5nCisgKiB0aGUgYmF0Y2guCisgKgorICogUmV0dXJucyAtRUlOVkFMIGlmIHRoZSBzeW5jX2ZpbGUgZmQgY2Fubm90IGJlIGZvdW5kLgorICovCisjZGVmaW5lIEk5MTVfRVhFQ19GRU5DRV9JTgkJKDE8PDE2KQorCisvKiBTZXR0aW5nIEk5MTVfRVhFQ19GRU5DRV9PVVQgY2F1c2VzIHRoZSBpb2N0bCB0byByZXR1cm4gYSBzeW5jX2ZpbGUgZmQKKyAqIGluIHRoZSB1cHBlcl8zMl9iaXRzKHJzdmQyKSB1cG9uIHN1Y2Nlc3MuIE93bmVyc2hpcCBvZiB0aGUgZmQgaXMgZ2l2ZW4KKyAqIHRvIHRoZSBjYWxsZXIsIGFuZCBpdCBzaG91bGQgYmUgY2xvc2UoKSBhZnRlciB1c2UuIChUaGUgZmQgaXMgYSByZWd1bGFyCisgKiBmaWxlIGRlc2NyaXB0b3IgYW5kIHdpbGwgYmUgY2xlYW5lZCB1cCBvbiBwcm9jZXNzIHRlcm1pbmF0aW9uLiBJdCBob2xkcworICogYSByZWZlcmVuY2UgdG8gdGhlIHJlcXVlc3QsIGJ1dCBub3RoaW5nIGVsc2UuKQorICoKKyAqIFRoZSBzeW5jX2ZpbGUgZmQgY2FuIGJlIGNvbWJpbmVkIHdpdGggb3RoZXIgc3luY19maWxlIGFuZCBwYXNzZWQgZWl0aGVyCisgKiB0byBleGVjYnVmIHVzaW5nIEk5MTVfRVhFQ19GRU5DRV9JTiwgdG8gYXRvbWljIEtNUyBpb2N0bHMgKHNvIHRoYXQgYSBmbGlwCisgKiB3aWxsIG9ubHkgb2NjdXIgYWZ0ZXIgdGhpcyByZXF1ZXN0IGNvbXBsZXRlcyksIG9yIHRvIG90aGVyIGRldmljZXMuCisgKgorICogVXNpbmcgSTkxNV9FWEVDX0ZFTkNFX09VVCByZXF1aXJlcyB1c2Ugb2YKKyAqIERSTV9JT0NUTF9JOTE1X0dFTV9FWEVDQlVGRkVSMl9XUiBpb2N0bCBzbyB0aGF0IHRoZSByZXN1bHQgaXMgd3JpdHRlbgorICogYmFjayB0byB1c2Vyc3BhY2UuIEZhaWx1cmUgdG8gZG8gc28gd2lsbCBjYXVzZSB0aGUgb3V0LWZlbmNlIHRvIGFsd2F5cworICogYmUgcmVwb3J0ZWQgYXMgemVybywgYW5kIHRoZSByZWFsIGZlbmNlIGZkIHRvIGJlIGxlYWtlZC4KKyAqLworI2RlZmluZSBJOTE1X0VYRUNfRkVOQ0VfT1VUCQkoMTw8MTcpCisKKyNkZWZpbmUgX19JOTE1X0VYRUNfVU5LTk9XTl9GTEFHUyAoLShJOTE1X0VYRUNfRkVOQ0VfT1VUPDwxKSkKKworI2RlZmluZSBJOTE1X0VYRUNfQ09OVEVYVF9JRF9NQVNLCSgweGZmZmZmZmZmKQorI2RlZmluZSBpOTE1X2V4ZWNidWZmZXIyX3NldF9jb250ZXh0X2lkKGViMiwgY29udGV4dCkgXAorCShlYjIpLnJzdmQxID0gY29udGV4dCAmIEk5MTVfRVhFQ19DT05URVhUX0lEX01BU0sKKyNkZWZpbmUgaTkxNV9leGVjYnVmZmVyMl9nZXRfY29udGV4dF9pZChlYjIpIFwKKwkoKGViMikucnN2ZDEgJiBJOTE1X0VYRUNfQ09OVEVYVF9JRF9NQVNLKQorCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3BpbiB7CisJLyoqIEhhbmRsZSBvZiB0aGUgYnVmZmVyIHRvIGJlIHBpbm5lZC4gKi8KKwlfX3UzMiBoYW5kbGU7CisJX191MzIgcGFkOworCisJLyoqIGFsaWdubWVudCByZXF1aXJlZCB3aXRoaW4gdGhlIGFwZXJ0dXJlICovCisJX191NjQgYWxpZ25tZW50OworCisJLyoqIFJldHVybmVkIEdUVCBvZmZzZXQgb2YgdGhlIGJ1ZmZlci4gKi8KKwlfX3U2NCBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3VucGluIHsKKwkvKiogSGFuZGxlIG9mIHRoZSBidWZmZXIgdG8gYmUgdW5waW5uZWQuICovCisJX191MzIgaGFuZGxlOworCV9fdTMyIHBhZDsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fYnVzeSB7CisJLyoqIEhhbmRsZSBvZiB0aGUgYnVmZmVyIHRvIGNoZWNrIGZvciBidXN5ICovCisJX191MzIgaGFuZGxlOworCisJLyoqIFJldHVybiBidXN5IHN0YXR1cworCSAqCisJICogQSByZXR1cm4gb2YgMCBpbXBsaWVzIHRoYXQgdGhlIG9iamVjdCBpcyBpZGxlIChhZnRlcgorCSAqIGhhdmluZyBmbHVzaGVkIGFueSBwZW5kaW5nIGFjdGl2aXR5KSwgYW5kIGEgbm9uLXplcm8gcmV0dXJuIHRoYXQKKwkgKiB0aGUgb2JqZWN0IGlzIHN0aWxsIGluLWZsaWdodCBvbiB0aGUgR1BVLiAoVGhlIEdQVSBoYXMgbm90IHlldAorCSAqIHNpZ25hbGVkIGNvbXBsZXRpb24gZm9yIGFsbCBwZW5kaW5nIHJlcXVlc3RzIHRoYXQgcmVmZXJlbmNlIHRoZQorCSAqIG9iamVjdC4pIEFuIG9iamVjdCBpcyBndWFyYW50ZWVkIHRvIGJlY29tZSBpZGxlIGV2ZW50dWFsbHkgKHNvCisJICogbG9uZyBhcyBubyBuZXcgR1BVIGNvbW1hbmRzIGFyZSBleGVjdXRlZCB1cG9uIGl0KS4gRHVlIHRvIHRoZQorCSAqIGFzeW5jaHJvbm91cyBuYXR1cmUgb2YgdGhlIGhhcmR3YXJlLCBhbiBvYmplY3QgcmVwb3J0ZWQKKwkgKiBhcyBidXN5IG1heSBiZWNvbWUgaWRsZSBiZWZvcmUgdGhlIGlvY3RsIGlzIGNvbXBsZXRlZC4KKwkgKgorCSAqIEZ1cnRoZXJtb3JlLCBpZiB0aGUgb2JqZWN0IGlzIGJ1c3ksIHdoaWNoIGVuZ2luZSBpcyBidXN5IGlzIG9ubHkKKwkgKiBwcm92aWRlZCBhcyBhIGd1aWRlLiBUaGVyZSBhcmUgcmFjZSBjb25kaXRpb25zIHdoaWNoIHByZXZlbnQgdGhlCisJICogcmVwb3J0IG9mIHdoaWNoIGVuZ2luZXMgYXJlIGJ1c3kgZnJvbSBiZWluZyBhbHdheXMgYWNjdXJhdGUuCisJICogSG93ZXZlciwgdGhlIGNvbnZlcnNlIGlzIG5vdCB0cnVlLiBJZiB0aGUgb2JqZWN0IGlzIGlkbGUsIHRoZQorCSAqIHJlc3VsdCBvZiB0aGUgaW9jdGwsIHRoYXQgYWxsIGVuZ2luZXMgYXJlIGlkbGUsIGlzIGFjY3VyYXRlLgorCSAqCisJICogVGhlIHJldHVybmVkIGR3b3JkIGlzIHNwbGl0IGludG8gdHdvIGZpZWxkcyB0byBpbmRpY2F0ZSBib3RoCisJICogdGhlIGVuZ2luZXMgb24gd2hpY2ggdGhlIG9iamVjdCBpcyBiZWluZyByZWFkLCBhbmQgdGhlCisJICogZW5naW5lIG9uIHdoaWNoIGl0IGlzIGN1cnJlbnRseSBiZWluZyB3cml0dGVuIChpZiBhbnkpLgorCSAqCisJICogVGhlIGxvdyB3b3JkIChiaXRzIDA6MTUpIGluZGljYXRlIGlmIHRoZSBvYmplY3QgaXMgYmVpbmcgd3JpdHRlbgorCSAqIHRvIGJ5IGFueSBlbmdpbmUgKHRoZXJlIGNhbiBvbmx5IGJlIG9uZSwgYXMgdGhlIEdFTSBpbXBsaWNpdAorCSAqIHN5bmNocm9uaXNhdGlvbiBydWxlcyBmb3JjZSB3cml0ZXMgdG8gYmUgc2VyaWFsaXNlZCkuIE9ubHkgdGhlCisJICogZW5naW5lIGZvciB0aGUgbGFzdCB3cml0ZSBpcyByZXBvcnRlZC4KKwkgKgorCSAqIFRoZSBoaWdoIHdvcmQgKGJpdHMgMTY6MzEpIGFyZSBhIGJpdG1hc2sgb2Ygd2hpY2ggZW5naW5lcyBhcmUKKwkgKiBjdXJyZW50bHkgcmVhZGluZyBmcm9tIHRoZSBvYmplY3QuIE11bHRpcGxlIGVuZ2luZXMgbWF5IGJlCisJICogcmVhZGluZyBmcm9tIHRoZSBvYmplY3Qgc2ltdWx0YW5lb3VzbHkuCisJICoKKwkgKiBUaGUgdmFsdWUgb2YgZWFjaCBlbmdpbmUgaXMgdGhlIHNhbWUgYXMgc3BlY2lmaWVkIGluIHRoZQorCSAqIEVYRUNCVUZGRVIyIGlvY3RsLCBpLmUuIEk5MTVfRVhFQ19SRU5ERVIsIEk5MTVfRVhFQ19CU0QgZXRjLgorCSAqIE5vdGUgSTkxNV9FWEVDX0RFRkFVTFQgaXMgYSBzeW1ib2xpYyB2YWx1ZSBhbmQgaXMgbWFwcGVkIHRvCisJICogdGhlIEk5MTVfRVhFQ19SRU5ERVIgZW5naW5lIGZvciBleGVjdXRpb24sIGFuZCBzbyBpdCBpcyBuZXZlcgorCSAqIHJlcG9ydGVkIGFzIGFjdGl2ZSBpdHNlbGYuIFNvbWUgaGFyZHdhcmUgbWF5IGhhdmUgcGFyYWxsZWwKKwkgKiBleGVjdXRpb24gZW5naW5lcywgZS5nLiBtdWx0aXBsZSBtZWRpYSBlbmdpbmVzLCB3aGljaCBhcmUKKwkgKiBtYXBwZWQgdG8gdGhlIHNhbWUgaWRlbnRpZmllciBpbiB0aGUgRVhFQ0JVRkZFUjIgaW9jdGwgYW5kCisJICogc28gYXJlIG5vdCBzZXBhcmF0ZWx5IHJlcG9ydGVkIGZvciBidXN5bmVzcy4KKwkgKgorCSAqIENhdmVhdCBlbXB0b3I6CisJICogT25seSB0aGUgYm9vbGVhbiByZXN1bHQgb2YgdGhpcyBxdWVyeSBpcyByZWxpYWJsZTsgdGhhdCBpcyB3aGV0aGVyCisJICogdGhlIG9iamVjdCBpcyBpZGxlIG9yIGJ1c3kuIFRoZSByZXBvcnQgb2Ygd2hpY2ggZW5naW5lcyBhcmUgYnVzeQorCSAqIHNob3VsZCBiZSBvbmx5IHVzZWQgYXMgYSBoZXVyaXN0aWMuCisJICovCisJX191MzIgYnVzeTsKK307CisKKy8qKgorICogSTkxNV9DQUNISU5HX05PTkUKKyAqCisgKiBHUFUgYWNjZXNzIGlzIG5vdCBjb2hlcmVudCB3aXRoIGNwdSBjYWNoZXMuIERlZmF1bHQgZm9yIG1hY2hpbmVzIHdpdGhvdXQgYW4KKyAqIExMQy4KKyAqLworI2RlZmluZSBJOTE1X0NBQ0hJTkdfTk9ORQkJMAorLyoqCisgKiBJOTE1X0NBQ0hJTkdfQ0FDSEVECisgKgorICogR1BVIGFjY2VzcyBpcyBjb2hlcmVudCB3aXRoIGNwdSBjYWNoZXMgYW5kIGZ1cnRoZXJtb3JlIHRoZSBkYXRhIGlzIGNhY2hlZCBpbgorICogbGFzdC1sZXZlbCBjYWNoZXMgc2hhcmVkIGJldHdlZW4gY3B1IGNvcmVzIGFuZCB0aGUgZ3B1IEdULiBEZWZhdWx0IG9uCisgKiBtYWNoaW5lcyB3aXRoIEhBU19MTEMuCisgKi8KKyNkZWZpbmUgSTkxNV9DQUNISU5HX0NBQ0hFRAkJMQorLyoqCisgKiBJOTE1X0NBQ0hJTkdfRElTUExBWQorICoKKyAqIFNwZWNpYWwgR1BVIGNhY2hpbmcgbW9kZSB3aGljaCBpcyBjb2hlcmVudCB3aXRoIHRoZSBzY2Fub3V0IGVuZ2luZXMuCisgKiBUcmFuc3BhcmVudGx5IGZhbGxzIGJhY2sgdG8gSTkxNV9DQUNISU5HX05PTkUgb24gcGxhdGZvcm1zIHdoZXJlIG5vIHNwZWNpYWwKKyAqIGNhY2hlIG1vZGUgKGxpa2Ugd3JpdGUtdGhyb3VnaCBvciBnZmR0IGZsdXNoaW5nKSBpcyBhdmFpbGFibGUuIFRoZSBrZXJuZWwKKyAqIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGlzIG1vZGUgd2hlbiB1c2luZyBhIGJ1ZmZlciBhcyBhIHNjYW5vdXQgdGFyZ2V0LgorICogVXNlcnNwYWNlIGNhbiBtYW51YWxseSBzZXQgdGhpcyBtb2RlIHRvIGF2b2lkIGEgY29zdGx5IHN0YWxsIGFuZCBjbGZsdXNoIGluCisgKiB0aGUgaG90cGF0aCBvZiBkcmF3aW5nIHRoZSBmaXJzdCBmcmFtZS4KKyAqLworI2RlZmluZSBJOTE1X0NBQ0hJTkdfRElTUExBWQkJMgorCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NhY2hpbmcgeworCS8qKgorCSAqIEhhbmRsZSBvZiB0aGUgYnVmZmVyIHRvIHNldC9nZXQgdGhlIGNhY2hpbmcgbGV2ZWwgb2YuICovCisJX191MzIgaGFuZGxlOworCisJLyoqCisJICogQ2FjaGVpbmcgbGV2ZWwgdG8gYXBwbHkgb3IgcmV0dXJuIHZhbHVlCisJICoKKwkgKiBiaXRzMC0xNSBhcmUgZm9yIGdlbmVyaWMgY2FjaGluZyBjb250cm9sIChpLmUuIHRoZSBhYm92ZSBkZWZpbmVkCisJICogdmFsdWVzKS4gYml0czE2LTMxIGFyZSByZXNlcnZlZCBmb3IgcGxhdGZvcm0tc3BlY2lmaWMgdmFyaWF0aW9ucworCSAqIChlLmcuIGwzJCBjYWNoaW5nIG9uIGdlbjcpLiAqLworCV9fdTMyIGNhY2hpbmc7Cit9OworCisjZGVmaW5lIEk5MTVfVElMSU5HX05PTkUJMAorI2RlZmluZSBJOTE1X1RJTElOR19YCQkxCisjZGVmaW5lIEk5MTVfVElMSU5HX1kJCTIKKyNkZWZpbmUgSTkxNV9USUxJTkdfTEFTVAlJOTE1X1RJTElOR19ZCisKKyNkZWZpbmUgSTkxNV9CSVRfNl9TV0laWkxFX05PTkUJCTAKKyNkZWZpbmUgSTkxNV9CSVRfNl9TV0laWkxFXzkJCTEKKyNkZWZpbmUgSTkxNV9CSVRfNl9TV0laWkxFXzlfMTAJCTIKKyNkZWZpbmUgSTkxNV9CSVRfNl9TV0laWkxFXzlfMTEJCTMKKyNkZWZpbmUgSTkxNV9CSVRfNl9TV0laWkxFXzlfMTBfMTEJNAorLyogTm90IHNlZW4gYnkgdXNlcmxhbmQgKi8KKyNkZWZpbmUgSTkxNV9CSVRfNl9TV0laWkxFX1VOS05PV04JNQorLyogU2VlbiBieSB1c2VybGFuZC4gKi8KKyNkZWZpbmUgSTkxNV9CSVRfNl9TV0laWkxFXzlfMTcJCTYKKyNkZWZpbmUgSTkxNV9CSVRfNl9TV0laWkxFXzlfMTBfMTcJNworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3NldF90aWxpbmcgeworCS8qKiBIYW5kbGUgb2YgdGhlIGJ1ZmZlciB0byBoYXZlIGl0cyB0aWxpbmcgc3RhdGUgdXBkYXRlZCAqLworCV9fdTMyIGhhbmRsZTsKKworCS8qKgorCSAqIFRpbGluZyBtb2RlIGZvciB0aGUgb2JqZWN0IChJOTE1X1RJTElOR19OT05FLCBJOTE1X1RJTElOR19YLAorCSAqIEk5MTVfVElMSU5HX1kpLgorCSAqCisJICogVGhpcyB2YWx1ZSBpcyB0byBiZSBzZXQgb24gcmVxdWVzdCwgYW5kIHdpbGwgYmUgdXBkYXRlZCBieSB0aGUKKwkgKiBrZXJuZWwgb24gc3VjY2Vzc2Z1bCByZXR1cm4gd2l0aCB0aGUgYWN0dWFsIGNob3NlbiB0aWxpbmcgbGF5b3V0LgorCSAqCisJICogVGhlIHRpbGluZyBtb2RlIG1heSBiZSBkZW1vdGVkIHRvIEk5MTVfVElMSU5HX05PTkUgd2hlbiB0aGUgc3lzdGVtCisJICogaGFzIGJpdCA2IHN3aXp6bGluZyB0aGF0IGNhbid0IGJlIG1hbmFnZWQgY29ycmVjdGx5IGJ5IEdFTS4KKwkgKgorCSAqIEJ1ZmZlciBjb250ZW50cyBiZWNvbWUgdW5kZWZpbmVkIHdoZW4gY2hhbmdpbmcgdGlsaW5nX21vZGUuCisJICovCisJX191MzIgdGlsaW5nX21vZGU7CisKKwkvKioKKwkgKiBTdHJpZGUgaW4gYnl0ZXMgZm9yIHRoZSBvYmplY3Qgd2hlbiBpbiBJOTE1X1RJTElOR19YIG9yCisJICogSTkxNV9USUxJTkdfWS4KKwkgKi8KKwlfX3UzMiBzdHJpZGU7CisKKwkvKioKKwkgKiBSZXR1cm5lZCBhZGRyZXNzIGJpdCA2IHN3aXp6bGluZyByZXF1aXJlZCBmb3IgQ1BVIGFjY2VzcyB0aHJvdWdoCisJICogbW1hcCBtYXBwaW5nLgorCSAqLworCV9fdTMyIHN3aXp6bGVfbW9kZTsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fZ2V0X3RpbGluZyB7CisJLyoqIEhhbmRsZSBvZiB0aGUgYnVmZmVyIHRvIGdldCB0aWxpbmcgc3RhdGUgZm9yLiAqLworCV9fdTMyIGhhbmRsZTsKKworCS8qKgorCSAqIEN1cnJlbnQgdGlsaW5nIG1vZGUgZm9yIHRoZSBvYmplY3QgKEk5MTVfVElMSU5HX05PTkUsIEk5MTVfVElMSU5HX1gsCisJICogSTkxNV9USUxJTkdfWSkuCisJICovCisJX191MzIgdGlsaW5nX21vZGU7CisKKwkvKioKKwkgKiBSZXR1cm5lZCBhZGRyZXNzIGJpdCA2IHN3aXp6bGluZyByZXF1aXJlZCBmb3IgQ1BVIGFjY2VzcyB0aHJvdWdoCisJICogbW1hcCBtYXBwaW5nLgorCSAqLworCV9fdTMyIHN3aXp6bGVfbW9kZTsKKworCS8qKgorCSAqIFJldHVybmVkIGFkZHJlc3MgYml0IDYgc3dpenpsaW5nIHJlcXVpcmVkIGZvciBDUFUgYWNjZXNzIHRocm91Z2gKKwkgKiBtbWFwIG1hcHBpbmcgd2hpbHN0IGJvdW5kLgorCSAqLworCV9fdTMyIHBoeXNfc3dpenpsZV9tb2RlOworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9nZXRfYXBlcnR1cmUgeworCS8qKiBUb3RhbCBzaXplIG9mIHRoZSBhcGVydHVyZSB1c2VkIGJ5IGk5MTVfZ2VtX2V4ZWNidWZmZXIsIGluIGJ5dGVzICovCisJX191NjQgYXBlcl9zaXplOworCisJLyoqCisJICogQXZhaWxhYmxlIHNwYWNlIGluIHRoZSBhcGVydHVyZSB1c2VkIGJ5IGk5MTVfZ2VtX2V4ZWNidWZmZXIsIGluCisJICogYnl0ZXMKKwkgKi8KKwlfX3U2NCBhcGVyX2F2YWlsYWJsZV9zaXplOworfTsKKworc3RydWN0IGRybV9pOTE1X2dldF9waXBlX2Zyb21fY3J0Y19pZCB7CisJLyoqIElEIG9mIENSVEMgYmVpbmcgcmVxdWVzdGVkICoqLworCV9fdTMyIGNydGNfaWQ7CisKKwkvKiogcGlwZSBvZiByZXF1ZXN0ZWQgQ1JUQyAqKi8KKwlfX3UzMiBwaXBlOworfTsKKworI2RlZmluZSBJOTE1X01BRFZfV0lMTE5FRUQgMAorI2RlZmluZSBJOTE1X01BRFZfRE9OVE5FRUQgMQorI2RlZmluZSBfX0k5MTVfTUFEVl9QVVJHRUQgMiAvKiBpbnRlcm5hbCBzdGF0ZSAqLworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21hZHZpc2UgeworCS8qKiBIYW5kbGUgb2YgdGhlIGJ1ZmZlciB0byBjaGFuZ2UgdGhlIGJhY2tpbmcgc3RvcmUgYWR2aWNlICovCisJX191MzIgaGFuZGxlOworCisJLyogQWR2aWNlOiBlaXRoZXIgdGhlIGJ1ZmZlciB3aWxsIGJlIG5lZWRlZCBhZ2FpbiBpbiB0aGUgbmVhciBmdXR1cmUsCisJICogICAgICAgICBvciB3b250IGJlIGFuZCBjb3VsZCBiZSBkaXNjYXJkZWQgdW5kZXIgbWVtb3J5IHByZXNzdXJlLgorCSAqLworCV9fdTMyIG1hZHY7CisKKwkvKiogV2hldGhlciB0aGUgYmFja2luZyBzdG9yZSBzdGlsbCBleGlzdHMuICovCisJX191MzIgcmV0YWluZWQ7Cit9OworCisvKiBmbGFncyAqLworI2RlZmluZSBJOTE1X09WRVJMQVlfVFlQRV9NQVNLIAkJMHhmZgorI2RlZmluZSBJOTE1X09WRVJMQVlfWVVWX1BMQU5BUiAJMHgwMQorI2RlZmluZSBJOTE1X09WRVJMQVlfWVVWX1BBQ0tFRCAJMHgwMgorI2RlZmluZSBJOTE1X09WRVJMQVlfUkdCCQkweDAzCisKKyNkZWZpbmUgSTkxNV9PVkVSTEFZX0RFUFRIX01BU0sJCTB4ZmYwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfUkdCMjQJCTB4MTAwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfUkdCMTYJCTB4MjAwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfUkdCMTUJCTB4MzAwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfWVVWNDIyCQkweDAxMDAKKyNkZWZpbmUgSTkxNV9PVkVSTEFZX1lVVjQxMQkJMHgwMjAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9ZVVY0MjAJCTB4MDMwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfWVVWNDEwCQkweDA0MDAKKworI2RlZmluZSBJOTE1X09WRVJMQVlfU1dBUF9NQVNLCQkweGZmMDAwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfTk9fU1dBUAkJMHgwMDAwMDAKKyNkZWZpbmUgSTkxNV9PVkVSTEFZX1VWX1NXQVAJCTB4MDEwMDAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9ZX1NXQVAJCTB4MDIwMDAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9ZX0FORF9VVl9TV0FQCTB4MDMwMDAwCisKKyNkZWZpbmUgSTkxNV9PVkVSTEFZX0ZMQUdTX01BU0sJCTB4ZmYwMDAwMDAKKyNkZWZpbmUgSTkxNV9PVkVSTEFZX0VOQUJMRQkJMHgwMTAwMDAwMAorCitzdHJ1Y3QgZHJtX2ludGVsX292ZXJsYXlfcHV0X2ltYWdlIHsKKwkvKiB2YXJpb3VzIGZsYWdzIGFuZCBzcmMgZm9ybWF0IGRlc2NyaXB0aW9uICovCisJX191MzIgZmxhZ3M7CisJLyogc291cmNlIHBpY3R1cmUgZGVzY3JpcHRpb24gKi8KKwlfX3UzMiBib19oYW5kbGU7CisJLyogc3RyaWRlIHZhbHVlcyBhbmQgb2Zmc2V0cyBhcmUgaW4gYnl0ZXMsIGJ1ZmZlciByZWxhdGl2ZSAqLworCV9fdTE2IHN0cmlkZV9ZOyAvKiBzdHJpZGUgZm9yIHBhY2tlZCBmb3JtYXRzICovCisJX191MTYgc3RyaWRlX1VWOworCV9fdTMyIG9mZnNldF9ZOyAvKiBvZmZzZXQgZm9yIHBhY2tldCBmb3JtYXRzICovCisJX191MzIgb2Zmc2V0X1U7CisJX191MzIgb2Zmc2V0X1Y7CisJLyogaW4gcGl4ZWxzICovCisJX191MTYgc3JjX3dpZHRoOworCV9fdTE2IHNyY19oZWlnaHQ7CisJLyogdG8gY29tcGVuc2F0ZSB0aGUgc2NhbGluZyBmYWN0b3JzIGZvciBwYXJ0aWFsbHkgY292ZXJlZCBzdXJmYWNlcyAqLworCV9fdTE2IHNyY19zY2FuX3dpZHRoOworCV9fdTE2IHNyY19zY2FuX2hlaWdodDsKKwkvKiBvdXRwdXQgY3J0YyBkZXNjcmlwdGlvbiAqLworCV9fdTMyIGNydGNfaWQ7CisJX191MTYgZHN0X3g7CisJX191MTYgZHN0X3k7CisJX191MTYgZHN0X3dpZHRoOworCV9fdTE2IGRzdF9oZWlnaHQ7Cit9OworCisvKiBmbGFncyAqLworI2RlZmluZSBJOTE1X09WRVJMQVlfVVBEQVRFX0FUVFJTCSgxPDwwKQorI2RlZmluZSBJOTE1X09WRVJMQVlfVVBEQVRFX0dBTU1BCSgxPDwxKQorI2RlZmluZSBJOTE1X09WRVJMQVlfRElTQUJMRV9ERVNUX0NPTE9SS0VZCSgxPDwyKQorc3RydWN0IGRybV9pbnRlbF9vdmVybGF5X2F0dHJzIHsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBjb2xvcl9rZXk7CisJX19zMzIgYnJpZ2h0bmVzczsKKwlfX3UzMiBjb250cmFzdDsKKwlfX3UzMiBzYXR1cmF0aW9uOworCV9fdTMyIGdhbW1hMDsKKwlfX3UzMiBnYW1tYTE7CisJX191MzIgZ2FtbWEyOworCV9fdTMyIGdhbW1hMzsKKwlfX3UzMiBnYW1tYTQ7CisJX191MzIgZ2FtbWE1OworfTsKKworLyoKKyAqIEludGVsIHNwcml0ZSBoYW5kbGluZworICoKKyAqIENvbG9yIGtleWluZyB3b3JrcyB3aXRoIGEgbWluL21hc2svbWF4IHR1cGxlLiAgQm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uCisgKiBjb2xvciBrZXlpbmcgaXMgYWxsb3dlZC4KKyAqCisgKiBTb3VyY2Uga2V5aW5nOgorICogU3ByaXRlIHBpeGVscyB3aXRoaW4gdGhlIG1pbiAmIG1heCB2YWx1ZXMsIG1hc2tlZCBhZ2FpbnN0IHRoZSBjb2xvciBjaGFubmVscworICogc3BlY2lmaWVkIGluIHRoZSBtYXNrIGZpZWxkLCB3aWxsIGJlIHRyYW5zcGFyZW50LiAgQWxsIG90aGVyIHBpeGVscyB3aWxsCisgKiBiZSBkaXNwbGF5ZWQgb24gdG9wIG9mIHRoZSBwcmltYXJ5IHBsYW5lLiAgRm9yIFJHQiBzdXJmYWNlcywgb25seSB0aGUgbWluCisgKiBhbmQgbWFzayBmaWVsZHMgd2lsbCBiZSB1c2VkOyByYW5nZWQgY29tcGFyZXMgYXJlIG5vdCBhbGxvd2VkLgorICoKKyAqIERlc3RpbmF0aW9uIGtleWluZzoKKyAqIFByaW1hcnkgcGxhbmUgcGl4ZWxzIHRoYXQgbWF0Y2ggdGhlIG1pbiB2YWx1ZSwgbWFza2VkIGFnYWluc3QgdGhlIGNvbG9yCisgKiBjaGFubmVscyBzcGVjaWZpZWQgaW4gdGhlIG1hc2sgZmllbGQsIHdpbGwgYmUgcmVwbGFjZWQgYnkgY29ycmVzcG9uZGluZworICogcGl4ZWxzIGZyb20gdGhlIHNwcml0ZSBwbGFuZS4KKyAqCisgKiBOb3RlIHRoYXQgc291cmNlICYgZGVzdGluYXRpb24ga2V5aW5nIGFyZSBleGNsdXNpdmU7IG9ubHkgb25lIGNhbiBiZQorICogYWN0aXZlIG9uIGEgZ2l2ZW4gcGxhbmUuCisgKi8KKworI2RlZmluZSBJOTE1X1NFVF9DT0xPUktFWV9OT05FCQkoMTw8MCkgLyogZGlzYWJsZSBjb2xvciBrZXkgbWF0Y2hpbmcgKi8KKyNkZWZpbmUgSTkxNV9TRVRfQ09MT1JLRVlfREVTVElOQVRJT04JKDE8PDEpCisjZGVmaW5lIEk5MTVfU0VUX0NPTE9SS0VZX1NPVVJDRQkoMTw8MikKK3N0cnVjdCBkcm1faW50ZWxfc3ByaXRlX2NvbG9ya2V5IHsKKwlfX3UzMiBwbGFuZV9pZDsKKwlfX3UzMiBtaW5fdmFsdWU7CisJX191MzIgY2hhbm5lbF9tYXNrOworCV9fdTMyIG1heF92YWx1ZTsKKwlfX3UzMiBmbGFnczsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fd2FpdCB7CisJLyoqIEhhbmRsZSBvZiBCTyB3ZSBzaGFsbCB3YWl0IG9uICovCisJX191MzIgYm9faGFuZGxlOworCV9fdTMyIGZsYWdzOworCS8qKiBOdW1iZXIgb2YgbmFub3NlY29uZHMgdG8gd2FpdCwgUmV0dXJucyB0aW1lIHJlbWFpbmluZy4gKi8KKwlfX3M2NCB0aW1lb3V0X25zOworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9jb250ZXh0X2NyZWF0ZSB7CisJLyogIG91dHB1dDogaWQgb2YgbmV3IGNvbnRleHQqLworCV9fdTMyIGN0eF9pZDsKKwlfX3UzMiBwYWQ7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfZGVzdHJveSB7CisJX191MzIgY3R4X2lkOworCV9fdTMyIHBhZDsKK307CisKK3N0cnVjdCBkcm1faTkxNV9yZWdfcmVhZCB7CisJLyoKKwkgKiBSZWdpc3RlciBvZmZzZXQuCisJICogRm9yIDY0Yml0IHdpZGUgcmVnaXN0ZXJzIHdoZXJlIHRoZSB1cHBlciAzMmJpdHMgZG9uJ3QgaW1tZWRpYXRlbHkKKwkgKiBmb2xsb3cgdGhlIGxvd2VyIDMyYml0cywgdGhlIG9mZnNldCBvZiB0aGUgbG93ZXIgMzJiaXRzIG11c3QKKwkgKiBiZSBzcGVjaWZpZWQKKwkgKi8KKwlfX3U2NCBvZmZzZXQ7CisJX191NjQgdmFsOyAvKiBSZXR1cm4gdmFsdWUgKi8KK307CisvKiBLbm93biByZWdpc3RlcnM6CisgKgorICogUmVuZGVyIGVuZ2luZSB0aW1lc3RhbXAgLSAweDIzNTggKyA2NGJpdCAtIGdlbjcrCisgKiAtIE5vdGUgdGhpcyByZWdpc3RlciByZXR1cm5zIGFuIGludmFsaWQgdmFsdWUgaWYgdXNpbmcgdGhlIGRlZmF1bHQKKyAqICAgc2luZ2xlIGluc3RydWN0aW9uIDhieXRlIHJlYWQsIGluIG9yZGVyIHRvIHdvcmthcm91bmQgdGhhdCB1c2UKKyAqICAgb2Zmc2V0ICgweDI1MzggfCAxKSBpbnN0ZWFkLgorICoKKyAqLworCitzdHJ1Y3QgZHJtX2k5MTVfcmVzZXRfc3RhdHMgeworCV9fdTMyIGN0eF9pZDsKKwlfX3UzMiBmbGFnczsKKworCS8qIEFsbCByZXNldHMgc2luY2UgYm9vdC9tb2R1bGUgcmVsb2FkLCBmb3IgYWxsIGNvbnRleHRzICovCisJX191MzIgcmVzZXRfY291bnQ7CisKKwkvKiBOdW1iZXIgb2YgYmF0Y2hlcyBsb3N0IHdoZW4gYWN0aXZlIGluIEdQVSwgZm9yIHRoaXMgY29udGV4dCAqLworCV9fdTMyIGJhdGNoX2FjdGl2ZTsKKworCS8qIE51bWJlciBvZiBiYXRjaGVzIGxvc3QgcGVuZGluZyBmb3IgZXhlY3V0aW9uLCBmb3IgdGhpcyBjb250ZXh0ICovCisJX191MzIgYmF0Y2hfcGVuZGluZzsKKworCV9fdTMyIHBhZDsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fdXNlcnB0ciB7CisJX191NjQgdXNlcl9wdHI7CisJX191NjQgdXNlcl9zaXplOworCV9fdTMyIGZsYWdzOworI2RlZmluZSBJOTE1X1VTRVJQVFJfUkVBRF9PTkxZIDB4MQorI2RlZmluZSBJOTE1X1VTRVJQVFJfVU5TWU5DSFJPTklaRUQgMHg4MDAwMDAwMAorCS8qKgorCSAqIFJldHVybmVkIGhhbmRsZSBmb3IgdGhlIG9iamVjdC4KKwkgKgorCSAqIE9iamVjdCBoYW5kbGVzIGFyZSBub256ZXJvLgorCSAqLworCV9fdTMyIGhhbmRsZTsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fY29udGV4dF9wYXJhbSB7CisJX191MzIgY3R4X2lkOworCV9fdTMyIHNpemU7CisJX191NjQgcGFyYW07CisjZGVmaW5lIEk5MTVfQ09OVEVYVF9QQVJBTV9CQU5fUEVSSU9ECTB4MQorI2RlZmluZSBJOTE1X0NPTlRFWFRfUEFSQU1fTk9fWkVST01BUAkweDIKKyNkZWZpbmUgSTkxNV9DT05URVhUX1BBUkFNX0dUVF9TSVpFCTB4MworI2RlZmluZSBJOTE1X0NPTlRFWFRfUEFSQU1fTk9fRVJST1JfQ0FQVFVSRQkweDQKKyNkZWZpbmUgSTkxNV9DT05URVhUX1BBUkFNX0JBTk5BQkxFCTB4NQorCV9fdTY0IHZhbHVlOworfTsKKworZW51bSBkcm1faTkxNV9vYV9mb3JtYXQgeworCUk5MTVfT0FfRk9STUFUX0ExMyA9IDEsCisJSTkxNV9PQV9GT1JNQVRfQTI5LAorCUk5MTVfT0FfRk9STUFUX0ExM19COF9DOCwKKwlJOTE1X09BX0ZPUk1BVF9CNF9DOCwKKwlJOTE1X09BX0ZPUk1BVF9BNDVfQjhfQzgsCisJSTkxNV9PQV9GT1JNQVRfQjRfQzhfQTE2LAorCUk5MTVfT0FfRk9STUFUX0M0X0I4LAorCisJSTkxNV9PQV9GT1JNQVRfTUFYCSAgICAvKiBub24tQUJJICovCit9OworCitlbnVtIGRybV9pOTE1X3BlcmZfcHJvcGVydHlfaWQgeworCS8qKgorCSAqIE9wZW4gdGhlIHN0cmVhbSBmb3IgYSBzcGVjaWZpYyBjb250ZXh0IGhhbmRsZSAoYXMgdXNlZCB3aXRoCisJICogZXhlY2J1ZmZlcjIpLiBBIHN0cmVhbSBvcGVuZWQgZm9yIGEgc3BlY2lmaWMgY29udGV4dCB0aGlzIHdheQorCSAqIHdvbid0IHR5cGljYWxseSByZXF1aXJlIHJvb3QgcHJpdmlsZWdlcy4KKwkgKi8KKwlEUk1fSTkxNV9QRVJGX1BST1BfQ1RYX0hBTkRMRSA9IDEsCisKKwkvKioKKwkgKiBBIHZhbHVlIG9mIDEgcmVxdWVzdHMgdGhlIGluY2x1c2lvbiBvZiByYXcgT0EgdW5pdCByZXBvcnRzIGFzCisJICogcGFydCBvZiBzdHJlYW0gc2FtcGxlcy4KKwkgKi8KKwlEUk1fSTkxNV9QRVJGX1BST1BfU0FNUExFX09BLAorCisJLyoqCisJICogVGhlIHZhbHVlIHNwZWNpZmllcyB3aGljaCBzZXQgb2YgT0EgdW5pdCBtZXRyaWNzIHNob3VsZCBiZQorCSAqIGJlIGNvbmZpZ3VyZWQsIGRlZmluaW5nIHRoZSBjb250ZW50cyBvZiBhbnkgT0EgdW5pdCByZXBvcnRzLgorCSAqLworCURSTV9JOTE1X1BFUkZfUFJPUF9PQV9NRVRSSUNTX1NFVCwKKworCS8qKgorCSAqIFRoZSB2YWx1ZSBzcGVjaWZpZXMgdGhlIHNpemUgYW5kIGxheW91dCBvZiBPQSB1bml0IHJlcG9ydHMuCisJICovCisJRFJNX0k5MTVfUEVSRl9QUk9QX09BX0ZPUk1BVCwKKworCS8qKgorCSAqIFNwZWNpZnlpbmcgdGhpcyBwcm9wZXJ0eSBpbXBsaWNpdGx5IHJlcXVlc3RzIHBlcmlvZGljIE9BIHVuaXQKKwkgKiBzYW1wbGluZyBhbmQgKGF0IGxlYXN0IG9uIEhhc3dlbGwpIHRoZSBzYW1wbGluZyBmcmVxdWVuY3kgaXMgZGVyaXZlZAorCSAqIGZyb20gdGhpcyBleHBvbmVudCBhcyBmb2xsb3dzOgorCSAqCisJICogICA4MG5zICogMl4ocGVyaW9kX2V4cG9uZW50ICsgMSkKKwkgKi8KKwlEUk1fSTkxNV9QRVJGX1BST1BfT0FfRVhQT05FTlQsCisKKwlEUk1fSTkxNV9QRVJGX1BST1BfTUFYIC8qIG5vbi1BQkkgKi8KK307CisKK3N0cnVjdCBkcm1faTkxNV9wZXJmX29wZW5fcGFyYW0geworCV9fdTMyIGZsYWdzOworI2RlZmluZSBJOTE1X1BFUkZfRkxBR19GRF9DTE9FWEVDCSgxPDwwKQorI2RlZmluZSBJOTE1X1BFUkZfRkxBR19GRF9OT05CTE9DSwkoMTw8MSkKKyNkZWZpbmUgSTkxNV9QRVJGX0ZMQUdfRElTQUJMRUQJCSgxPDwyKQorCisJLyoqIFRoZSBudW1iZXIgb2YgdTY0IChpZCwgdmFsdWUpIHBhaXJzICovCisJX191MzIgbnVtX3Byb3BlcnRpZXM7CisKKwkvKioKKwkgKiBQb2ludGVyIHRvIGFycmF5IG9mIHU2NCAoaWQsIHZhbHVlKSBwYWlycyBjb25maWd1cmluZyB0aGUgc3RyZWFtCisJICogdG8gb3Blbi4KKwkgKi8KKwlfX3U2NCBwcm9wZXJ0aWVzX3B0cjsKK307CisKKy8qKgorICogRW5hYmxlIGRhdGEgY2FwdHVyZSBmb3IgYSBzdHJlYW0gdGhhdCB3YXMgZWl0aGVyIG9wZW5lZCBpbiBhIGRpc2FibGVkIHN0YXRlCisgKiB2aWEgSTkxNV9QRVJGX0ZMQUdfRElTQUJMRUQgb3Igd2FzIGxhdGVyIGRpc2FibGVkIHZpYQorICogSTkxNV9QRVJGX0lPQ1RMX0RJU0FCTEUuCisgKgorICogSXQgaXMgaW50ZW5kZWQgdG8gYmUgY2hlYXBlciB0byBkaXNhYmxlIGFuZCBlbmFibGUgYSBzdHJlYW0gdGhhbiBpdCBtYXkgYmUKKyAqIHRvIGNsb3NlIGFuZCByZS1vcGVuIGEgc3RyZWFtIHdpdGggdGhlIHNhbWUgY29uZmlndXJhdGlvbi4KKyAqCisgKiBJdCdzIHVuZGVmaW5lZCB3aGV0aGVyIGFueSBwZW5kaW5nIGRhdGEgZm9yIHRoZSBzdHJlYW0gd2lsbCBiZSBsb3N0LgorICovCisjZGVmaW5lIEk5MTVfUEVSRl9JT0NUTF9FTkFCTEUJX0lPKCdpJywgMHgwKQorCisvKioKKyAqIERpc2FibGUgZGF0YSBjYXB0dXJlIGZvciBhIHN0cmVhbS4KKyAqCisgKiBJdCBpcyBhbiBlcnJvciB0byB0cnkgYW5kIHJlYWQgYSBzdHJlYW0gdGhhdCBpcyBkaXNhYmxlZC4KKyAqLworI2RlZmluZSBJOTE1X1BFUkZfSU9DVExfRElTQUJMRQlfSU8oJ2knLCAweDEpCisKKy8qKgorICogQ29tbW9uIHRvIGFsbCBpOTE1IHBlcmYgcmVjb3JkcworICovCitzdHJ1Y3QgZHJtX2k5MTVfcGVyZl9yZWNvcmRfaGVhZGVyIHsKKwlfX3UzMiB0eXBlOworCV9fdTE2IHBhZDsKKwlfX3UxNiBzaXplOworfTsKKworZW51bSBkcm1faTkxNV9wZXJmX3JlY29yZF90eXBlIHsKKworCS8qKgorCSAqIFNhbXBsZXMgYXJlIHRoZSB3b3JrIGhvcnNlIHJlY29yZCB0eXBlIHdob3NlIGNvbnRlbnRzIGFyZSBleHRlbnNpYmxlCisJICogYW5kIGRlZmluZWQgd2hlbiBvcGVuaW5nIGFuIGk5MTUgcGVyZiBzdHJlYW0gYmFzZWQgb24gdGhlIGdpdmVuCisJICogcHJvcGVydGllcy4KKwkgKgorCSAqIEJvb2xlYW4gcHJvcGVydGllcyBmb2xsb3dpbmcgdGhlIG5hbWluZyBjb252ZW50aW9uCisJICogRFJNX0k5MTVfUEVSRl9TQU1QTEVfeHl6X1BST1AgcmVxdWVzdCB0aGUgaW5jbHVzaW9uIG9mICd4eXonIGRhdGEgaW4KKwkgKiBldmVyeSBzYW1wbGUuCisJICoKKwkgKiBUaGUgb3JkZXIgb2YgdGhlc2Ugc2FtcGxlIHByb3BlcnRpZXMgZ2l2ZW4gYnkgdXNlcnNwYWNlIGhhcyBubworCSAqIGFmZmVjdCBvbiB0aGUgb3JkZXJpbmcgb2YgZGF0YSB3aXRoaW4gYSBzYW1wbGUuIFRoZSBvcmRlciBpcworCSAqIGRvY3VtZW50ZWQgaGVyZS4KKwkgKgorCSAqIHN0cnVjdCB7CisJICogICAgIHN0cnVjdCBkcm1faTkxNV9wZXJmX3JlY29yZF9oZWFkZXIgaGVhZGVyOworCSAqCisJICogICAgIHsgdTMyIG9hX3JlcG9ydFtdOyB9ICYmIERSTV9JOTE1X1BFUkZfUFJPUF9TQU1QTEVfT0EKKwkgKiB9OworCSAqLworCURSTV9JOTE1X1BFUkZfUkVDT1JEX1NBTVBMRSA9IDEsCisKKwkvKgorCSAqIEluZGljYXRlcyB0aGF0IG9uZSBvciBtb3JlIE9BIHJlcG9ydHMgd2VyZSBub3Qgd3JpdHRlbiBieSB0aGUKKwkgKiBoYXJkd2FyZS4gVGhpcyBjYW4gaGFwcGVuIGZvciBleGFtcGxlIGlmIGFuIE1JX1JFUE9SVF9QRVJGX0NPVU5UCisJICogY29tbWFuZCBjb2xsaWRlcyB3aXRoIHBlcmlvZGljIHNhbXBsaW5nIC0gd2hpY2ggd291bGQgYmUgbW9yZSBsaWtlbHkKKwkgKiBhdCBoaWdoZXIgc2FtcGxpbmcgZnJlcXVlbmNpZXMuCisJICovCisJRFJNX0k5MTVfUEVSRl9SRUNPUkRfT0FfUkVQT1JUX0xPU1QgPSAyLAorCisJLyoqCisJICogQW4gZXJyb3Igb2NjdXJyZWQgdGhhdCByZXN1bHRlZCBpbiBhbGwgcGVuZGluZyBPQSByZXBvcnRzIGJlaW5nIGxvc3QuCisJICovCisJRFJNX0k5MTVfUEVSRl9SRUNPUkRfT0FfQlVGRkVSX0xPU1QgPSAzLAorCisJRFJNX0k5MTVfUEVSRl9SRUNPUkRfTUFYIC8qIG5vbi1BQkkgKi8KK307CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfSTkxNV9EUk1fSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2lteF9kcm0uaCBiL2luY2x1ZGUvZHJtL2lteF9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODBjYWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0vaW14X2RybS5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBOWFAKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCisgKiBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgX1VBUElfSU1YX0RSTV9IXworI2RlZmluZSBfVUFQSV9JTVhfRFJNX0hfCisKKyNpbmNsdWRlICJkcm0uaCIKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIERwdSBmcmFtZSBpbmZvLgorICoKKyAqLworc3RydWN0IGRybV9pbXhfZHB1X2ZyYW1lX2luZm8geworCV9fdTMyICAgd2lkdGg7CisJX191MzIgICBoZWlnaHQ7CisJX191MzIJeF9vZmZzZXQ7CisJX191MzIJeV9vZmZzZXQ7CisJX191MzIJc3RyaWRlOworCV9fdTMyCWZvcm1hdDsKKwlfX3U2NCAgIG1vZGlmaWVyOworCV9fdTY0CWJhZGRyOworCV9fdTY0CXV2X2FkZHI7Cit9OworCisjZGVmaW5lIERSTV9JTVhfRFBVX1NFVF9DTURMSVNUICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIERSTV9JTVhfRFBVX1dBSVQgICAgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIERSTV9JTVhfRFBVX0dFVF9QQVJBTSAgICAgICAgICAgICAgICAgICAweDAyCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0lNWF9EUFVfU0VUX0NNRExJU1QgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgXAorCQlEUk1fSU1YX0RQVV9TRVRfQ01ETElTVCwgc3RydWN0IGRybV9pbXhfZHB1X3NldF9jbWRsaXN0KQorI2RlZmluZSBEUk1fSU9DVExfSU1YX0RQVV9XQUlUICAgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBcCisJCURSTV9JTVhfRFBVX1dBSVQsIHN0cnVjdCBkcm1faW14X2RwdV93YWl0KQorI2RlZmluZSBEUk1fSU9DVExfSU1YX0RQVV9HRVRfUEFSQU0gICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBcCisJCURSTV9JTVhfRFBVX0dFVF9QQVJBTSwgZW51bSBkcm1faW14X2RwdV9wYXJhbSkKKworLyoqCisgKiBzdHJ1Y3QgZHJtX2lteF9kcHVfc2V0X2NtZGxpc3QgLSBpb2N0bCBhcmd1bWVudCBmb3IKKyAqIERSTV9JTVhfRFBVX1NFVF9DTURMSVNULgorICovCitzdHJ1Y3QgZHJtX2lteF9kcHVfc2V0X2NtZGxpc3QgeworCV9fdTY0CWNtZDsKKwlfX3UzMgljbWRfbnI7CisKKwkvKiByZXNlcnZlZCAqLworCV9fdTY0CXVzZXJfZGF0YTsKK307CisKKy8qKgorICogc3RydWN0IGRybV9pbXhfZHB1X3dhaXQgLSBpb2N0bCBhcmd1bWVudCBmb3IKKyAqIERSTV9JTVhfRFBVX1dBSVQuCisgKgorICovCitzdHJ1Y3QgZHJtX2lteF9kcHVfd2FpdCB7CisJLyogcmVzZXJ2ZWQgKi8KKwlfX3U2NCAgIHVzZXJfZGF0YTsKK307CisKKy8qKgorICogZW51bSBkcm1faW14X2RwdV9wYXJhbSAtIGlvY3RsIGFyZ3VtZW50IGZvcgorICogRFJNX0lNWF9EUFVfR0VUX1BBUkFNLgorICoKKyAqLworZW51bSBkcm1faW14X2RwdV9wYXJhbSB7CisJRFJNX0lNWF9NQVhfRFBVUywKK307CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfVUFQSV9JTVhfRFJNX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9tYWNoNjRfZHJtLmggYi9pbmNsdWRlL2RybS9tYWNoNjRfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1ZmQ4NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL21hY2g2NF9kcm0uaApAQCAtMCwwICsxLDI1NiBAQAorLyogbWFjaDY0X2RybS5oIC0tIFB1YmxpYyBoZWFkZXIgZm9yIHRoZSBtYWNoNjQgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogVGh1IE5vdiAzMCAyMDowNDozMiAyMDAwIGJ5IGdhcmV0aEB2YWxpbnV4LmNvbQorICovCisvKgorICogQ29weXJpZ2h0IDIwMDAgR2FyZXRoIEh1Z2hlcworICogQ29weXJpZ2h0IDIwMDIgRnJhbmsgQy4gRWFybAorICogQ29weXJpZ2h0IDIwMDItMjAwMyBMZWlmIERlbGdhc3MKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICogICAgRnJhbmsgQy4gRWFybCA8ZmVhcmxAYWlybWFpbC5uZXQ+CisgKiAgICBMZWlmIERlbGdhc3MgPGxkZWxnYXNzQHJldGluYWxidXJuLm5ldD4KKyAqLworCisjaWZuZGVmIF9fTUFDSDY0X0RSTV9IX18KKyNkZWZpbmUgX19NQUNINjRfRFJNX0hfXworCisvKiBXQVJOSU5HOiBJZiB5b3UgY2hhbmdlIGFueSBvZiB0aGVzZSBkZWZpbmVzLCBtYWtlIHN1cmUgdG8gY2hhbmdlIHRoZQorICogZGVmaW5lcyBpbiB0aGUgWHNlcnZlciBmaWxlIChtYWNoNjRfc2FyZWEuaCkKKyAqLworI2lmbmRlZiBfX01BQ0g2NF9TQVJFQV9ERUZJTkVTX18KKyNkZWZpbmUgX19NQUNINjRfU0FSRUFfREVGSU5FU19fCisKKy8qIFdoYXQgbmVlZHMgdG8gYmUgY2hhbmdlZCBmb3IgdGhlIGN1cnJlbnQgdmVydGV4IGJ1ZmZlcj8KKyAqIEdIOiBXZSdyZSBnb2luZyB0byBiZSBwZWRhbnRpYyBhYm91dCB0aGlzLiAgV2Ugd2FudCB0aGUgY2FyZCB0byBkbyBhcworICogbGl0dGxlIGFzIHBvc3NpYmxlLCBzbyBsZXQncyBhdm9pZCBoYXZpbmcgaXQgZmV0Y2ggYSB3aG9sZSBidW5jaCBvZgorICogcmVnaXN0ZXIgdmFsdWVzIHRoYXQgZG9uJ3QgY2hhbmdlIGFsbCB0aGF0IG9mdGVuLCBpZiBhdCBhbGwuCisgKi8KKyNkZWZpbmUgTUFDSDY0X1VQTE9BRF9EU1RfT0ZGX1BJVENICTB4MDAwMQorI2RlZmluZSBNQUNINjRfVVBMT0FEX1pfT0ZGX1BJVENICTB4MDAwMgorI2RlZmluZSBNQUNINjRfVVBMT0FEX1pfQUxQSEFfQ05UTAkweDAwMDQKKyNkZWZpbmUgTUFDSDY0X1VQTE9BRF9TQ0FMRV8zRF9DTlRMCTB4MDAwOAorI2RlZmluZSBNQUNINjRfVVBMT0FEX0RQX0ZPR19DTFIJMHgwMDEwCisjZGVmaW5lIE1BQ0g2NF9VUExPQURfRFBfV1JJVEVfTUFTSwkweDAwMjAKKyNkZWZpbmUgTUFDSDY0X1VQTE9BRF9EUF9QSVhfV0lEVEgJMHgwMDQwCisjZGVmaW5lIE1BQ0g2NF9VUExPQURfU0VUVVBfQ05UTAkweDAwODAKKyNkZWZpbmUgTUFDSDY0X1VQTE9BRF9NSVNDCQkweDAxMDAKKyNkZWZpbmUgTUFDSDY0X1VQTE9BRF9URVhUVVJFCQkweDAyMDAKKyNkZWZpbmUgTUFDSDY0X1VQTE9BRF9URVgwSU1BR0UJCTB4MDQwMAorI2RlZmluZSBNQUNINjRfVVBMT0FEX1RFWDFJTUFHRQkJMHgwODAwCisjZGVmaW5lIE1BQ0g2NF9VUExPQURfQ0xJUFJFQ1RTCQkweDEwMDAJLyogaGFuZGxlZCBjbGllbnQtc2lkZSAqLworI2RlZmluZSBNQUNINjRfVVBMT0FEX0NPTlRFWFQJCTB4MDBmZgorI2RlZmluZSBNQUNINjRfVVBMT0FEX0FMTAkJMHgxZmZmCisKKy8qIERNQSBidWZmZXIgc2l6ZQorICovCisjZGVmaW5lIE1BQ0g2NF9CVUZGRVJfU0laRQkJMTYzODQKKworLyogTWF4IG51bWJlciBvZiBzd2FwcyBhbGxvd2VkIG9uIHRoZSByaW5nCisgKiBiZWZvcmUgdGhlIGNsaWVudCBtdXN0IHdhaXQKKyAqLworI2RlZmluZSBNQUNINjRfTUFYX1FVRVVFRF9GUkFNRVMgICAgICAgIDNVCisKKy8qIEJ5dGUgb2Zmc2V0cyBmb3IgaG9zdCBibGl0IGJ1ZmZlciBkYXRhCisgKi8KKyNkZWZpbmUgTUFDSDY0X0hPU1REQVRBX0JMSVRfT0ZGU0VUCTEwNAorCisvKiBLZWVwIHRoZXNlIHNtYWxsIGZvciB0ZXN0aW5nLgorICovCisjZGVmaW5lIE1BQ0g2NF9OUl9TQVJFQV9DTElQUkVDVFMJOAorCisjZGVmaW5lIE1BQ0g2NF9DQVJEX0hFQVAJCTAKKyNkZWZpbmUgTUFDSDY0X0FHUF9IRUFQCQkJMQorI2RlZmluZSBNQUNINjRfTlJfVEVYX0hFQVBTCQkyCisjZGVmaW5lIE1BQ0g2NF9OUl9URVhfUkVHSU9OUwkJNjQKKyNkZWZpbmUgTUFDSDY0X0xPR19URVhfR1JBTlVMQVJJVFkJMTYKKworI2RlZmluZSBNQUNINjRfVEVYX01BWExFVkVMUwkJMQorCisjZGVmaW5lIE1BQ0g2NF9OUl9DT05URVhUX1JFR1MJCTE1CisjZGVmaW5lIE1BQ0g2NF9OUl9URVhUVVJFX1JFR1MJCTQKKworI2VuZGlmCQkJCS8qIF9fTUFDSDY0X1NBUkVBX0RFRklORVNfXyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGRzdF9vZmZfcGl0Y2g7CisKKwl1bnNpZ25lZCBpbnQgel9vZmZfcGl0Y2g7CisJdW5zaWduZWQgaW50IHpfY250bDsKKwl1bnNpZ25lZCBpbnQgYWxwaGFfdHN0X2NudGw7CisKKwl1bnNpZ25lZCBpbnQgc2NhbGVfM2RfY250bDsKKworCXVuc2lnbmVkIGludCBzY19sZWZ0X3JpZ2h0OworCXVuc2lnbmVkIGludCBzY190b3BfYm90dG9tOworCisJdW5zaWduZWQgaW50IGRwX2ZvZ19jbHI7CisJdW5zaWduZWQgaW50IGRwX3dyaXRlX21hc2s7CisJdW5zaWduZWQgaW50IGRwX3BpeF93aWR0aDsKKwl1bnNpZ25lZCBpbnQgZHBfbWl4OworCXVuc2lnbmVkIGludCBkcF9zcmM7CisKKwl1bnNpZ25lZCBpbnQgY2xyX2NtcF9jbnRsOworCXVuc2lnbmVkIGludCBndWlfdHJhal9jbnRsOworCisJdW5zaWduZWQgaW50IHNldHVwX2NudGw7CisKKwl1bnNpZ25lZCBpbnQgdGV4X3NpemVfcGl0Y2g7CisJdW5zaWduZWQgaW50IHRleF9jbnRsOworCXVuc2lnbmVkIGludCBzZWNvbmRhcnlfdGV4X29mZjsKKwl1bnNpZ25lZCBpbnQgdGV4X29mZnNldDsKK30gZHJtX21hY2g2NF9jb250ZXh0X3JlZ3NfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21hY2g2NF9zYXJlYSB7CisJLyogVGhlIGNoYW5uZWwgZm9yIGNvbW11bmljYXRpb24gb2Ygc3RhdGUgaW5mb3JtYXRpb24gdG8gdGhlIGtlcm5lbAorCSAqIG9uIGZpcmluZyBhIHZlcnRleCBkbWEgYnVmZmVyLgorCSAqLworCWRybV9tYWNoNjRfY29udGV4dF9yZWdzX3QgY29udGV4dF9zdGF0ZTsKKwl1bnNpZ25lZCBpbnQgZGlydHk7CisJdW5zaWduZWQgaW50IHZlcnRzaXplOworCisJLyogVGhlIGN1cnJlbnQgY2xpcHJlY3RzLCBvciBhIHN1YnNldCB0aGVyZW9mLgorCSAqLworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGJveGVzW01BQ0g2NF9OUl9TQVJFQV9DTElQUkVDVFNdOworCXVuc2lnbmVkIGludCBuYm94OworCisJLyogQ291bnRlcnMgZm9yIGNsaWVudC1zaWRlIHRocm90dGxpbmcgb2YgcmVuZGVyaW5nIGNsaWVudHMuCisJICovCisJdW5zaWduZWQgaW50IGZyYW1lc19xdWV1ZWQ7CisKKwkvKiBUZXh0dXJlIG1lbW9yeSBMUlUuCisJICovCisJc3RydWN0IGRybV90ZXhfcmVnaW9uIHRleF9saXN0W01BQ0g2NF9OUl9URVhfSEVBUFNdW01BQ0g2NF9OUl9URVhfUkVHSU9OUyArCisJCQkJCQkgICAgICAgMV07CisJdW5zaWduZWQgaW50IHRleF9hZ2VbTUFDSDY0X05SX1RFWF9IRUFQU107CisJaW50IGN0eF9vd25lcjsKK30gZHJtX21hY2g2NF9zYXJlYV90OworCisvKiBXQVJOSU5HOiBJZiB5b3UgY2hhbmdlIGFueSBvZiB0aGVzZSBkZWZpbmVzLCBtYWtlIHN1cmUgdG8gY2hhbmdlIHRoZQorICogZGVmaW5lcyBpbiB0aGUgWHNlcnZlciBmaWxlIChtYWNoNjRfY29tbW9uLmgpCisgKi8KKworLyogTWFjaDY0IHNwZWNpZmljIGlvY3RscworICogVGhlIGRldmljZSBzcGVjaWZpYyBpb2N0bCByYW5nZSBpcyAweDQwIHRvIDB4NzkuCisgKi8KKworI2RlZmluZSBEUk1fTUFDSDY0X0lOSVQgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRFJNX01BQ0g2NF9JRExFICAgICAgICAgICAweDAxCisjZGVmaW5lIERSTV9NQUNINjRfUkVTRVQgICAgICAgICAgMHgwMgorI2RlZmluZSBEUk1fTUFDSDY0X1NXQVAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgRFJNX01BQ0g2NF9DTEVBUiAgICAgICAgICAweDA0CisjZGVmaW5lIERSTV9NQUNINjRfVkVSVEVYICAgICAgICAgMHgwNQorI2RlZmluZSBEUk1fTUFDSDY0X0JMSVQgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgRFJNX01BQ0g2NF9GTFVTSCAgICAgICAgICAweDA3CisjZGVmaW5lIERSTV9NQUNINjRfR0VUUEFSQU0gICAgICAgMHgwOAorCisjZGVmaW5lIERSTV9JT0NUTF9NQUNINjRfSU5JVCAgICAgICAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NQUNINjRfSU5JVCwgZHJtX21hY2g2NF9pbml0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9NQUNINjRfSURMRSAgICAgICAgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NQUNINjRfSURMRSApCisjZGVmaW5lIERSTV9JT0NUTF9NQUNINjRfUkVTRVQgICAgICAgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NQUNINjRfUkVTRVQgKQorI2RlZmluZSBEUk1fSU9DVExfTUFDSDY0X1NXQVAgICAgICAgICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUFDSDY0X1NXQVAgKQorI2RlZmluZSBEUk1fSU9DVExfTUFDSDY0X0NMRUFSICAgICAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUFDSDY0X0NMRUFSLCBkcm1fbWFjaDY0X2NsZWFyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9NQUNINjRfVkVSVEVYICAgICAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NQUNINjRfVkVSVEVYLCBkcm1fbWFjaDY0X3ZlcnRleF90KQorI2RlZmluZSBEUk1fSU9DVExfTUFDSDY0X0JMSVQgICAgICAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUFDSDY0X0JMSVQsIGRybV9tYWNoNjRfYmxpdF90KQorI2RlZmluZSBEUk1fSU9DVExfTUFDSDY0X0ZMVVNIICAgICAgICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUFDSDY0X0ZMVVNIICkKKyNkZWZpbmUgRFJNX0lPQ1RMX01BQ0g2NF9HRVRQQVJBTSAgICAgICBEUk1fSU9XUiggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NQUNINjRfR0VUUEFSQU0sIGRybV9tYWNoNjRfZ2V0cGFyYW1fdCkKKworLyogQnVmZmVyIGZsYWdzIGZvciBjbGVhcnMKKyAqLworI2RlZmluZSBNQUNINjRfRlJPTlQJCQkweDEKKyNkZWZpbmUgTUFDSDY0X0JBQ0sJCQkweDIKKyNkZWZpbmUgTUFDSDY0X0RFUFRICQkJMHg0CisKKy8qIFByaW1pdGl2ZSB0eXBlcyBmb3IgdmVydGV4IGJ1ZmZlcnMKKyAqLworI2RlZmluZSBNQUNINjRfUFJJTV9QT0lOVFMJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUFDSDY0X1BSSU1fTElORVMJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUFDSDY0X1BSSU1fTElORV9MT09QCQkweDAwMDAwMDAyCisjZGVmaW5lIE1BQ0g2NF9QUklNX0xJTkVfU1RSSVAJCTB4MDAwMDAwMDMKKyNkZWZpbmUgTUFDSDY0X1BSSU1fVFJJQU5HTEVTCQkweDAwMDAwMDA0CisjZGVmaW5lIE1BQ0g2NF9QUklNX1RSSUFOR0xFX1NUUklQCTB4MDAwMDAwMDUKKyNkZWZpbmUgTUFDSDY0X1BSSU1fVFJJQU5HTEVfRkFOCTB4MDAwMDAwMDYKKyNkZWZpbmUgTUFDSDY0X1BSSU1fUVVBRFMJCTB4MDAwMDAwMDcKKyNkZWZpbmUgTUFDSDY0X1BSSU1fUVVBRF9TVFJJUAkJMHgwMDAwMDAwOAorI2RlZmluZSBNQUNINjRfUFJJTV9QT0xZR09OCQkweDAwMDAwMDA5CisKK3R5cGVkZWYgZW51bSBfZHJtX21hY2g2NF9kbWFfbW9kZV90IHsKKwlNQUNINjRfTU9ERV9ETUFfQVNZTkMsCisJTUFDSDY0X01PREVfRE1BX1NZTkMsCisJTUFDSDY0X01PREVfTU1JTworfSBkcm1fbWFjaDY0X2RtYV9tb2RlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9tYWNoNjRfaW5pdCB7CisJZW51bSB7CisJCURSTV9NQUNINjRfSU5JVF9ETUEgPSAweDAxLAorCQlEUk1fTUFDSDY0X0NMRUFOVVBfRE1BID0gMHgwMgorCX0gZnVuYzsKKworCXVuc2lnbmVkIGxvbmcgc2FyZWFfcHJpdl9vZmZzZXQ7CisJaW50IGlzX3BjaTsKKwlkcm1fbWFjaDY0X2RtYV9tb2RlX3QgZG1hX21vZGU7CisKKwl1bnNpZ25lZCBpbnQgZmJfYnBwOworCXVuc2lnbmVkIGludCBmcm9udF9vZmZzZXQsIGZyb250X3BpdGNoOworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldCwgYmFja19waXRjaDsKKworCXVuc2lnbmVkIGludCBkZXB0aF9icHA7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldCwgZGVwdGhfcGl0Y2g7CisKKwl1bnNpZ25lZCBsb25nIGZiX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIG1taW9fb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgcmluZ19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBidWZmZXJzX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGFncF90ZXh0dXJlc19vZmZzZXQ7Cit9IGRybV9tYWNoNjRfaW5pdF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWFjaDY0X2NsZWFyIHsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJaW50IHgsIHksIHcsIGg7CisJdW5zaWduZWQgaW50IGNsZWFyX2NvbG9yOworCXVuc2lnbmVkIGludCBjbGVhcl9kZXB0aDsKK30gZHJtX21hY2g2NF9jbGVhcl90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWFjaDY0X3ZlcnRleCB7CisJaW50IHByaW07CisJdm9pZCAqYnVmOwkJLyogQWRkcmVzcyBvZiB2ZXJ0ZXggYnVmZmVyICovCisJdW5zaWduZWQgbG9uZyB1c2VkOwkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gYnVmZmVyICovCisJaW50IGRpc2NhcmQ7CQkvKiBDbGllbnQgZmluaXNoZWQgd2l0aCBidWZmZXI/ICovCit9IGRybV9tYWNoNjRfdmVydGV4X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9tYWNoNjRfYmxpdCB7CisJdm9pZCAqYnVmOworCWludCBwaXRjaDsKKwlpbnQgb2Zmc2V0OworCWludCBmb3JtYXQ7CisJdW5zaWduZWQgc2hvcnQgeCwgeTsKKwl1bnNpZ25lZCBzaG9ydCB3aWR0aCwgaGVpZ2h0OworfSBkcm1fbWFjaDY0X2JsaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21hY2g2NF9nZXRwYXJhbSB7CisJZW51bSB7CisJCU1BQ0g2NF9QQVJBTV9GUkFNRVNfUVVFVUVEID0gMHgwMSwKKwkJTUFDSDY0X1BBUkFNX0lSUV9OUiA9IDB4MDIKKwl9IHBhcmFtOworCXZvaWQgKnZhbHVlOworfSBkcm1fbWFjaDY0X2dldHBhcmFtX3Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vbWdhX2RybS5oIGIvaW5jbHVkZS9kcm0vbWdhX2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MzBlOGYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9tZ2FfZHJtLmgKQEAgLTAsMCArMSw0MTkgQEAKKy8qIG1nYV9kcm0uaCAtLSBQdWJsaWMgaGVhZGVyIGZvciB0aGUgTWF0cm94IGcyMDAvZzQwMCBkcml2ZXIgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBUdWUgSmFuIDI1IDAxOjUwOjAxIDE5OTkgYnkgamhhcnRtYW5uQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgSmVmZiBIYXJ0bWFubiA8amhhcnRtYW5uQHZhbGludXguY29tPgorICogICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICoKKyAqIFJld3JpdHRlbiBieToKKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisjaWZuZGVmIF9fTUdBX0RSTV9IX18KKyNkZWZpbmUgX19NR0FfRFJNX0hfXworCisjaW5jbHVkZSAiZHJtLmgiCisKKy8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlIGRlZmluZXMsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlCisgKiBkZWZpbmVzIGluIHRoZSBYc2VydmVyIGZpbGUgKG1nYV9zYXJlYS5oKQorICovCisKKyNpZm5kZWYgX19NR0FfU0FSRUFfREVGSU5FU19fCisjZGVmaW5lIF9fTUdBX1NBUkVBX0RFRklORVNfXworCisvKiBXQVJQIHBpcGUgZmxhZ3MKKyAqLworI2RlZmluZSBNR0FfRgkJCTB4MQkvKiBmb2cgKi8KKyNkZWZpbmUgTUdBX0EJCQkweDIJLyogYWxwaGEgKi8KKyNkZWZpbmUgTUdBX1MJCQkweDQJLyogc3BlY3VsYXIgKi8KKyNkZWZpbmUgTUdBX1QyCQkJMHg4CS8qIG11bHRpdGV4dHVyZSAqLworCisjZGVmaW5lIE1HQV9XQVJQX1RHWgkJMAorI2RlZmluZSBNR0FfV0FSUF9UR1pGCQkoTUdBX0YpCisjZGVmaW5lIE1HQV9XQVJQX1RHWkEJCShNR0FfQSkKKyNkZWZpbmUgTUdBX1dBUlBfVEdaQUYJCShNR0FfRnxNR0FfQSkKKyNkZWZpbmUgTUdBX1dBUlBfVEdaUwkJKE1HQV9TKQorI2RlZmluZSBNR0FfV0FSUF9UR1pTRgkJKE1HQV9TfE1HQV9GKQorI2RlZmluZSBNR0FfV0FSUF9UR1pTQQkJKE1HQV9TfE1HQV9BKQorI2RlZmluZSBNR0FfV0FSUF9UR1pTQUYJCShNR0FfU3xNR0FfRnxNR0FfQSkKKyNkZWZpbmUgTUdBX1dBUlBfVDJHWgkJKE1HQV9UMikKKyNkZWZpbmUgTUdBX1dBUlBfVDJHWkYJCShNR0FfVDJ8TUdBX0YpCisjZGVmaW5lIE1HQV9XQVJQX1QyR1pBCQkoTUdBX1QyfE1HQV9BKQorI2RlZmluZSBNR0FfV0FSUF9UMkdaQUYJCShNR0FfVDJ8TUdBX0F8TUdBX0YpCisjZGVmaW5lIE1HQV9XQVJQX1QyR1pTCQkoTUdBX1QyfE1HQV9TKQorI2RlZmluZSBNR0FfV0FSUF9UMkdaU0YJCShNR0FfVDJ8TUdBX1N8TUdBX0YpCisjZGVmaW5lIE1HQV9XQVJQX1QyR1pTQQkJKE1HQV9UMnxNR0FfU3xNR0FfQSkKKyNkZWZpbmUgTUdBX1dBUlBfVDJHWlNBRgkoTUdBX1QyfE1HQV9TfE1HQV9GfE1HQV9BKQorCisjZGVmaW5lIE1HQV9NQVhfRzIwMF9QSVBFUwk4CS8qIG5vIG11bHRpdGV4ICovCisjZGVmaW5lIE1HQV9NQVhfRzQwMF9QSVBFUwkxNgorI2RlZmluZSBNR0FfTUFYX1dBUlBfUElQRVMJTUdBX01BWF9HNDAwX1BJUEVTCisjZGVmaW5lIE1HQV9XQVJQX1VDT0RFX1NJWkUJMzI3NjgJLyogaW4gYnl0ZXMgKi8KKworI2RlZmluZSBNR0FfQ0FSRF9UWVBFX0cyMDAJMQorI2RlZmluZSBNR0FfQ0FSRF9UWVBFX0c0MDAJMgorI2RlZmluZSBNR0FfQ0FSRF9UWVBFX0c0NTAJMwkvKiBub3QgY3VycmVudGx5IHVzZWQgKi8KKyNkZWZpbmUgTUdBX0NBUkRfVFlQRV9HNTUwCTQKKworI2RlZmluZSBNR0FfRlJPTlQJCTB4MQorI2RlZmluZSBNR0FfQkFDSwkJMHgyCisjZGVmaW5lIE1HQV9ERVBUSAkJMHg0CisKKy8qIFdoYXQgbmVlZHMgdG8gYmUgY2hhbmdlZCBmb3IgdGhlIGN1cnJlbnQgdmVydGV4IGRtYSBidWZmZXI/CisgKi8KKyNkZWZpbmUgTUdBX1VQTE9BRF9DT05URVhUCTB4MQorI2RlZmluZSBNR0FfVVBMT0FEX1RFWDAJCTB4MgorI2RlZmluZSBNR0FfVVBMT0FEX1RFWDEJCTB4NAorI2RlZmluZSBNR0FfVVBMT0FEX1BJUEUJCTB4OAorI2RlZmluZSBNR0FfVVBMT0FEX1RFWDBJTUFHRQkweDEwCS8qIGhhbmRsZWQgY2xpZW50LXNpZGUgKi8KKyNkZWZpbmUgTUdBX1VQTE9BRF9URVgxSU1BR0UJMHgyMAkvKiBoYW5kbGVkIGNsaWVudC1zaWRlICovCisjZGVmaW5lIE1HQV9VUExPQURfMkQJCTB4NDAKKyNkZWZpbmUgTUdBX1dBSVRfQUdFCQkweDgwCS8qIGhhbmRsZWQgY2xpZW50LXNpZGUgKi8KKyNkZWZpbmUgTUdBX1VQTE9BRF9DTElQUkVDVFMJMHgxMDAJLyogaGFuZGxlZCBjbGllbnQtc2lkZSAqLworI2lmIDAKKyNkZWZpbmUgTUdBX0RNQV9GTFVTSAkJMHgyMDAJLyogc2V0IHdoZW4gc29tZW9uZSBnZXRzIHRoZSBsb2NrCisJCQkJCSAgIHF1aWVzY2VudCAqLworI2VuZGlmCisKKy8qIDMyIGJ1ZmZlcnMgb2YgNjRrIGVhY2gsIHRvdGFsIDIgbWVnLgorICovCisjZGVmaW5lIE1HQV9CVUZGRVJfU0laRQkJKDEgPDwgMTYpCisjZGVmaW5lIE1HQV9OVU1fQlVGRkVSUwkJMTI4CisKKy8qIEtlZXAgdGhlc2Ugc21hbGwgZm9yIHRlc3RpbmcuCisgKi8KKyNkZWZpbmUgTUdBX05SX1NBUkVBX0NMSVBSRUNUUwk4CisKKy8qIDIgaGVhcHMgKDEgZm9yIGNhcmQsIDEgZm9yIGFncCksIGVhY2ggZGl2aWRlZCBpbnRvIHVwdG8gMTI4CisgKiByZWdpb25zLCBzdWJqZWN0IHRvIGEgbWluaW11bSByZWdpb24gc2l6ZSBvZiAoMTw8MTYpID09IDY0ay4KKyAqCisgKiBDbGllbnRzIG1heSBzdWJkaXZpZGUgcmVnaW9ucyBpbnRlcm5hbGx5LCBidXQgd2hlbiBzaGFyaW5nIGJldHdlZW4KKyAqIGNsaWVudHMsIHRoZSByZWdpb24gc2l6ZSBpcyB0aGUgbWluaW11bSBncmFudWxhcml0eS4KKyAqLworCisjZGVmaW5lIE1HQV9DQVJEX0hFQVAJCQkwCisjZGVmaW5lIE1HQV9BR1BfSEVBUAkJCTEKKyNkZWZpbmUgTUdBX05SX1RFWF9IRUFQUwkJMgorI2RlZmluZSBNR0FfTlJfVEVYX1JFR0lPTlMJCTE2CisjZGVmaW5lIE1HQV9MT0dfTUlOX1RFWF9SRUdJT05fU0laRQkxNgorCisjZGVmaW5lICBEUk1fTUdBX0lETEVfUkVUUlkgICAgICAgICAgMjA0OAorCisjZW5kaWYJCQkJLyogX19NR0FfU0FSRUFfREVGSU5FU19fICovCisKKy8qIFNldHVwIHJlZ2lzdGVycyBmb3IgM0QgY29udGV4dAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGRzdG9yZzsKKwl1bnNpZ25lZCBpbnQgbWFjY2VzczsKKwl1bnNpZ25lZCBpbnQgcGxud3Q7CisJdW5zaWduZWQgaW50IGR3Z2N0bDsKKwl1bnNpZ25lZCBpbnQgYWxwaGFjdHJsOworCXVuc2lnbmVkIGludCBmb2djb2xvcjsKKwl1bnNpZ25lZCBpbnQgd2ZsYWc7CisJdW5zaWduZWQgaW50IHRkdWFsc3RhZ2UwOworCXVuc2lnbmVkIGludCB0ZHVhbHN0YWdlMTsKKwl1bnNpZ25lZCBpbnQgZmNvbDsKKwl1bnNpZ25lZCBpbnQgc3RlbmNpbDsKKwl1bnNpZ25lZCBpbnQgc3RlbmNpbGN0bDsKK30gZHJtX21nYV9jb250ZXh0X3JlZ3NfdDsKKworLyogU2V0dXAgcmVnaXN0ZXJzIGZvciAyRCwgWCBzZXJ2ZXIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBwaXRjaDsKK30gZHJtX21nYV9zZXJ2ZXJfcmVnc190OworCisvKiBTZXR1cCByZWdpc3RlcnMgZm9yIGVhY2ggdGV4dHVyZSB1bml0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgdGV4Y3RsOworCXVuc2lnbmVkIGludCB0ZXhjdGwyOworCXVuc2lnbmVkIGludCB0ZXhmaWx0ZXI7CisJdW5zaWduZWQgaW50IHRleGJvcmRlcmNvbDsKKwl1bnNpZ25lZCBpbnQgdGV4b3JnOworCXVuc2lnbmVkIGludCB0ZXh3aWR0aDsKKwl1bnNpZ25lZCBpbnQgdGV4aGVpZ2h0OworCXVuc2lnbmVkIGludCB0ZXhvcmcxOworCXVuc2lnbmVkIGludCB0ZXhvcmcyOworCXVuc2lnbmVkIGludCB0ZXhvcmczOworCXVuc2lnbmVkIGludCB0ZXhvcmc0OworfSBkcm1fbWdhX3RleHR1cmVfcmVnc190OworCisvKiBHZW5lcmFsIGFnaW5nIG1lY2hhbmlzbQorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGhlYWQ7CS8qIFBvc2l0aW9uIG9mIGhlYWQgcG9pbnRlciAgICAgICAgICAqLworCXVuc2lnbmVkIGludCB3cmFwOwkvKiBQcmltYXJ5IERNQSB3cmFwIGNvdW50ICAgICAgICAgICAgKi8KK30gZHJtX21nYV9hZ2VfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9tZ2Ffc2FyZWEgeworCS8qIFRoZSBjaGFubmVsIGZvciBjb21tdW5pY2F0aW9uIG9mIHN0YXRlIGluZm9ybWF0aW9uIHRvIHRoZSBrZXJuZWwKKwkgKiBvbiBmaXJpbmcgYSB2ZXJ0ZXggZG1hIGJ1ZmZlci4KKwkgKi8KKwlkcm1fbWdhX2NvbnRleHRfcmVnc190IGNvbnRleHRfc3RhdGU7CisJZHJtX21nYV9zZXJ2ZXJfcmVnc190IHNlcnZlcl9zdGF0ZTsKKwlkcm1fbWdhX3RleHR1cmVfcmVnc190IHRleF9zdGF0ZVsyXTsKKwl1bnNpZ25lZCBpbnQgd2FycF9waXBlOworCXVuc2lnbmVkIGludCBkaXJ0eTsKKwl1bnNpZ25lZCBpbnQgdmVydHNpemU7CisKKwkvKiBUaGUgY3VycmVudCBjbGlwcmVjdHMsIG9yIGEgc3Vic2V0IHRoZXJlb2YuCisJICovCisJc3RydWN0IGRybV9jbGlwX3JlY3QgYm94ZXNbTUdBX05SX1NBUkVBX0NMSVBSRUNUU107CisJdW5zaWduZWQgaW50IG5ib3g7CisKKwkvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbW9zdCByZWNlbnRseSB1c2VkIDNkIGRyYXdhYmxlLiAgVGhlCisJICogY2xpZW50IGZpbGxzIGluIHRoZSByZXFfKiBmaWVsZHMsIHRoZSBzZXJ2ZXIgZmlsbHMgaW4gdGhlCisJICogZXhwb3J0ZWRfIGZpZWxkcyBhbmQgcHV0cyB0aGUgY2xpcHJlY3RzIGludG8gYm94ZXMsIGFib3ZlLgorCSAqCisJICogVGhlIGNsaWVudCBjbGVhcnMgdGhlIGV4cG9ydGVkX2RyYXdhYmxlIGZpZWxkIGJlZm9yZQorCSAqIGNsb2JiZXJpbmcgdGhlIGJveGVzIGRhdGEuCisJICovCisJdW5zaWduZWQgaW50IHJlcV9kcmF3YWJsZTsJLyogdGhlIFggZHJhd2FibGUgaWQgKi8KKwl1bnNpZ25lZCBpbnQgcmVxX2RyYXdfYnVmZmVyOwkvKiBNR0FfRlJPTlQgb3IgTUdBX0JBQ0sgKi8KKworCXVuc2lnbmVkIGludCBleHBvcnRlZF9kcmF3YWJsZTsKKwl1bnNpZ25lZCBpbnQgZXhwb3J0ZWRfaW5kZXg7CisJdW5zaWduZWQgaW50IGV4cG9ydGVkX3N0YW1wOworCXVuc2lnbmVkIGludCBleHBvcnRlZF9idWZmZXJzOworCXVuc2lnbmVkIGludCBleHBvcnRlZF9uZnJvbnQ7CisJdW5zaWduZWQgaW50IGV4cG9ydGVkX25iYWNrOworCWludCBleHBvcnRlZF9iYWNrX3gsIGV4cG9ydGVkX2Zyb250X3gsIGV4cG9ydGVkX3c7CisJaW50IGV4cG9ydGVkX2JhY2tfeSwgZXhwb3J0ZWRfZnJvbnRfeSwgZXhwb3J0ZWRfaDsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBleHBvcnRlZF9ib3hlc1tNR0FfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKworCS8qIENvdW50ZXJzIGZvciBhZ2luZyB0ZXh0dXJlcyBhbmQgZm9yIGNsaWVudC1zaWRlIHRocm90dGxpbmcuCisJICovCisJdW5zaWduZWQgaW50IHN0YXR1c1s0XTsKKwl1bnNpZ25lZCBpbnQgbGFzdF93cmFwOworCisJZHJtX21nYV9hZ2VfdCBsYXN0X2ZyYW1lOworCXVuc2lnbmVkIGludCBsYXN0X2VucXVldWU7CS8qIGxhc3QgdGltZSBhIGJ1ZmZlciB3YXMgZW5xdWV1ZWQgKi8KKwl1bnNpZ25lZCBpbnQgbGFzdF9kaXNwYXRjaDsJLyogYWdlIG9mIHRoZSBtb3N0IHJlY2VudGx5IGRpc3BhdGNoZWQgYnVmZmVyICovCisJdW5zaWduZWQgaW50IGxhc3RfcXVpZXNjZW50OwkvKiAgKi8KKworCS8qIExSVSBsaXN0cyBmb3IgdGV4dHVyZSBtZW1vcnkgaW4gYWdwIHNwYWNlIGFuZCBvbiB0aGUgY2FyZC4KKwkgKi8KKwlzdHJ1Y3QgZHJtX3RleF9yZWdpb24gdGV4TGlzdFtNR0FfTlJfVEVYX0hFQVBTXVtNR0FfTlJfVEVYX1JFR0lPTlMgKyAxXTsKKwl1bnNpZ25lZCBpbnQgdGV4QWdlW01HQV9OUl9URVhfSEVBUFNdOworCisJLyogTWVjaGFuaXNtIHRvIHZhbGlkYXRlIGNhcmQgc3RhdGUuCisJICovCisJaW50IGN0eE93bmVyOworfSBkcm1fbWdhX3NhcmVhX3Q7CisKKy8qIE1HQSBzcGVjaWZpYyBpb2N0bHMKKyAqIFRoZSBkZXZpY2Ugc3BlY2lmaWMgaW9jdGwgcmFuZ2UgaXMgMHg0MCB0byAweDc5LgorICovCisjZGVmaW5lIERSTV9NR0FfSU5JVCAgICAgMHgwMAorI2RlZmluZSBEUk1fTUdBX0ZMVVNIICAgIDB4MDEKKyNkZWZpbmUgRFJNX01HQV9SRVNFVCAgICAweDAyCisjZGVmaW5lIERSTV9NR0FfU1dBUCAgICAgMHgwMworI2RlZmluZSBEUk1fTUdBX0NMRUFSICAgIDB4MDQKKyNkZWZpbmUgRFJNX01HQV9WRVJURVggICAweDA1CisjZGVmaW5lIERSTV9NR0FfSU5ESUNFUyAgMHgwNgorI2RlZmluZSBEUk1fTUdBX0lMT0FEICAgIDB4MDcKKyNkZWZpbmUgRFJNX01HQV9CTElUICAgICAweDA4CisjZGVmaW5lIERSTV9NR0FfR0VUUEFSQU0gMHgwOQorCisvKiAzLjI6CisgKiBpb2N0bHMgZm9yIG9wZXJhdGluZyBvbiBmZW5jZXMuCisgKi8KKyNkZWZpbmUgRFJNX01HQV9TRVRfRkVOQ0UgICAgICAweDBhCisjZGVmaW5lIERSTV9NR0FfV0FJVF9GRU5DRSAgICAgMHgwYgorI2RlZmluZSBEUk1fTUdBX0RNQV9CT09UU1RSQVAgIDB4MGMKKworI2RlZmluZSBEUk1fSU9DVExfTUdBX0lOSVQgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX0lOSVQsIGRybV9tZ2FfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfTUdBX0ZMVVNIICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX0ZMVVNILCBkcm1fbG9ja190KQorI2RlZmluZSBEUk1fSU9DVExfTUdBX1JFU0VUICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX1JFU0VUKQorI2RlZmluZSBEUk1fSU9DVExfTUdBX1NXQVAgICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX1NXQVApCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfQ0xFQVIgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfQ0xFQVIsIGRybV9tZ2FfY2xlYXJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9WRVJURVggICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9WRVJURVgsIGRybV9tZ2FfdmVydGV4X3QpCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfSU5ESUNFUyAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfSU5ESUNFUywgZHJtX21nYV9pbmRpY2VzX3QpCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfSUxPQUQgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfSUxPQUQsIGRybV9tZ2FfaWxvYWRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9CTElUICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9CTElULCBkcm1fbWdhX2JsaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9HRVRQQVJBTSBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9HRVRQQVJBTSwgZHJtX21nYV9nZXRwYXJhbV90KQorI2RlZmluZSBEUk1fSU9DVExfTUdBX1NFVF9GRU5DRSAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfU0VUX0ZFTkNFLCBfX3UzMikKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9XQUlUX0ZFTkNFICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX1dBSVRfRkVOQ0UsIF9fdTMyKQorI2RlZmluZSBEUk1fSU9DVExfTUdBX0RNQV9CT09UU1RSQVAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfRE1BX0JPT1RTVFJBUCwgZHJtX21nYV9kbWFfYm9vdHN0cmFwX3QpCisKK3R5cGVkZWYgc3RydWN0IF9kcm1fbWdhX3dhcnBfaW5kZXggeworCWludCBpbnN0YWxsZWQ7CisJdW5zaWduZWQgbG9uZyBwaHlzX2FkZHI7CisJaW50IHNpemU7Cit9IGRybV9tZ2Ffd2FycF9pbmRleF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2luaXQgeworCWVudW0geworCQlNR0FfSU5JVF9ETUEgPSAweDAxLAorCQlNR0FfQ0xFQU5VUF9ETUEgPSAweDAyCisJfSBmdW5jOworCisJdW5zaWduZWQgbG9uZyBzYXJlYV9wcml2X29mZnNldDsKKworCWludCBjaGlwc2V0OworCWludCBzZ3JhbTsKKworCXVuc2lnbmVkIGludCBtYWNjZXNzOworCisJdW5zaWduZWQgaW50IGZiX2NwcDsKKwl1bnNpZ25lZCBpbnQgZnJvbnRfb2Zmc2V0LCBmcm9udF9waXRjaDsKKwl1bnNpZ25lZCBpbnQgYmFja19vZmZzZXQsIGJhY2tfcGl0Y2g7CisKKwl1bnNpZ25lZCBpbnQgZGVwdGhfY3BwOworCXVuc2lnbmVkIGludCBkZXB0aF9vZmZzZXQsIGRlcHRoX3BpdGNoOworCisJdW5zaWduZWQgaW50IHRleHR1cmVfb2Zmc2V0W01HQV9OUl9URVhfSEVBUFNdOworCXVuc2lnbmVkIGludCB0ZXh0dXJlX3NpemVbTUdBX05SX1RFWF9IRUFQU107CisKKwl1bnNpZ25lZCBsb25nIGZiX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIG1taW9fb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgc3RhdHVzX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHdhcnBfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgcHJpbWFyeV9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBidWZmZXJzX29mZnNldDsKK30gZHJtX21nYV9pbml0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9tZ2FfZG1hX2Jvb3RzdHJhcCB7CisJLyoqCisJICogXG5hbWUgQUdQIHRleHR1cmUgcmVnaW9uCisJICoKKwkgKiBPbiByZXR1cm4gZnJvbSB0aGUgRFJNX01HQV9ETUFfQk9PVFNUUkFQIGlvY3RsLCB0aGVzZSBmaWVsZHMgd2lsbAorCSAqIGJlIGZpbGxlZCBpbiB3aXRoIHRoZSBhY3R1YWwgQUdQIHRleHR1cmUgc2V0dGluZ3MuCisJICoKKwkgKiBcd2FybmluZworCSAqIElmIHRoZXNlIGZpZWxkcyBhcmUgbm9uLXplcm8sIGJ1dCBkbWFfbWdhX2RtYV9ib290c3RyYXA6OmFncF9tb2RlCisJICogaXMgemVybywgaXQgbWVhbnMgdGhhdCBQQ0kgbWVtb3J5IChtb3N0IGxpa2VseSB0aHJvdWdoIHRoZSB1c2Ugb2YKKwkgKiBhbiBJT01NVSkgaXMgYmVpbmcgdXNlZCBmb3IgIkFHUCIgdGV4dHVyZXMuCisJICovCisJLypAeyAqLworCXVuc2lnbmVkIGxvbmcgdGV4dHVyZV9oYW5kbGU7IC8qKjwgSGFuZGxlIHVzZWQgdG8gbWFwIEFHUCB0ZXh0dXJlcy4gKi8KKwlfX3UzMiB0ZXh0dXJlX3NpemU7CSAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgQUdQIHRleHR1cmUgcmVnaW9uLiAqLworCS8qQH0gKi8KKworCS8qKgorCSAqIFJlcXVlc3RlZCBzaXplIG9mIHRoZSBwcmltYXJ5IERNQSByZWdpb24uCisJICoKKwkgKiBPbiByZXR1cm4gZnJvbSB0aGUgRFJNX01HQV9ETUFfQk9PVFNUUkFQIGlvY3RsLCB0aGlzIGZpZWxkIHdpbGwgYmUKKwkgKiBmaWxsZWQgaW4gd2l0aCB0aGUgYWN0dWFsIEFHUCBtb2RlLiAgSWYgQUdQIHdhcyBub3QgYXZhaWxhYmxlCisJICovCisJX191MzIgcHJpbWFyeV9zaXplOworCisJLyoqCisJICogUmVxdWVzdGVkIG51bWJlciBvZiBzZWNvbmRhcnkgRE1BIGJ1ZmZlcnMuCisJICoKKwkgKiBPbiByZXR1cm4gZnJvbSB0aGUgRFJNX01HQV9ETUFfQk9PVFNUUkFQIGlvY3RsLCB0aGlzIGZpZWxkIHdpbGwgYmUKKwkgKiBmaWxsZWQgaW4gd2l0aCB0aGUgYWN0dWFsIG51bWJlciBvZiBzZWNvbmRhcnkgRE1BIGJ1ZmZlcnMKKwkgKiBhbGxvY2F0ZWQuICBQYXJ0aWN1bGFybHkgd2hlbiBQQ0kgRE1BIGlzIHVzZWQsIHRoaXMgbWF5IGJlCisJICogKHN1YnRhbnRpYWxseSkgbGVzcyB0aGFuIHRoZSBudW1iZXIgcmVxdWVzdGVkLgorCSAqLworCV9fdTMyIHNlY29uZGFyeV9iaW5fY291bnQ7CisKKwkvKioKKwkgKiBSZXF1ZXN0ZWQgc2l6ZSBvZiBlYWNoIHNlY29uZGFyeSBETUEgYnVmZmVyLgorCSAqCisJICogV2hpbGUgdGhlIGtlcm5lbCBcYiBpcyBmcmVlIHRvIHJlZHVjZQorCSAqIGRtYV9tZ2FfZG1hX2Jvb3RzdHJhcDo6c2Vjb25kYXJ5X2Jpbl9jb3VudCwgaXQgaXMgXGIgbm90IGFsbG93ZWQKKwkgKiB0byByZWR1Y2UgZG1hX21nYV9kbWFfYm9vdHN0cmFwOjpzZWNvbmRhcnlfYmluX3NpemUuCisJICovCisJX191MzIgc2Vjb25kYXJ5X2Jpbl9zaXplOworCisJLyoqCisJICogQml0LXdpc2UgbWFzayBvZiBBR1BTVEFUMl8qIHZhbHVlcy4gIEN1cnJlbnRseSBvbmx5IFxjIEFHUFNUQVQyXzFYLAorCSAqIFxjIEFHUFNUQVQyXzJYLCBhbmQgXGMgQUdQU1RBVDJfNFggYXJlIHN1cHBvcnRlZC4gIElmIHRoaXMgdmFsdWUgaXMKKwkgKiB6ZXJvLCBpdCBtZWFucyB0aGF0IFBDSSBETUEgc2hvdWxkIGJlIHVzZWQsIGV2ZW4gaWYgQUdQIGlzCisJICogcG9zc2libGUuCisJICoKKwkgKiBPbiByZXR1cm4gZnJvbSB0aGUgRFJNX01HQV9ETUFfQk9PVFNUUkFQIGlvY3RsLCB0aGlzIGZpZWxkIHdpbGwgYmUKKwkgKiBmaWxsZWQgaW4gd2l0aCB0aGUgYWN0dWFsIEFHUCBtb2RlLiAgSWYgQUdQIHdhcyBub3QgYXZhaWxhYmxlCisJICogKGkuZS4sIFBDSSBETUEgd2FzIHVzZWQpLCB0aGlzIHZhbHVlIHdpbGwgYmUgemVyby4KKwkgKi8KKwlfX3UzMiBhZ3BfbW9kZTsKKworCS8qKgorCSAqIERlc2lyZWQgQUdQIEdBUlQgc2l6ZSwgbWVhc3VyZWQgaW4gbWVnYWJ5dGVzLgorCSAqLworCV9fdTggYWdwX3NpemU7Cit9IGRybV9tZ2FfZG1hX2Jvb3RzdHJhcF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2NsZWFyIHsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IGNsZWFyX2NvbG9yOworCXVuc2lnbmVkIGludCBjbGVhcl9kZXB0aDsKKwl1bnNpZ25lZCBpbnQgY29sb3JfbWFzazsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfbWFzazsKK30gZHJtX21nYV9jbGVhcl90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX3ZlcnRleCB7CisJaW50IGlkeDsJCS8qIGJ1ZmZlciB0byBxdWV1ZSAqLworCWludCB1c2VkOwkJLyogYnl0ZXMgaW4gdXNlICovCisJaW50IGRpc2NhcmQ7CQkvKiBjbGllbnQgZmluaXNoZWQgd2l0aCBidWZmZXI/ICAqLworfSBkcm1fbWdhX3ZlcnRleF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2luZGljZXMgeworCWludCBpZHg7CQkvKiBidWZmZXIgdG8gcXVldWUgKi8KKwl1bnNpZ25lZCBpbnQgc3RhcnQ7CisJdW5zaWduZWQgaW50IGVuZDsKKwlpbnQgZGlzY2FyZDsJCS8qIGNsaWVudCBmaW5pc2hlZCB3aXRoIGJ1ZmZlcj8gICovCit9IGRybV9tZ2FfaW5kaWNlc190OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2lsb2FkIHsKKwlpbnQgaWR4OworCXVuc2lnbmVkIGludCBkc3Rvcmc7CisJdW5zaWduZWQgaW50IGxlbmd0aDsKK30gZHJtX21nYV9pbG9hZF90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX21nYV9ibGl0IHsKKwl1bnNpZ25lZCBpbnQgcGxhbmVtYXNrOworCXVuc2lnbmVkIGludCBzcmNvcmc7CisJdW5zaWduZWQgaW50IGRzdG9yZzsKKwlpbnQgc3JjX3BpdGNoLCBkc3RfcGl0Y2g7CisJaW50IGRlbHRhX3N4LCBkZWx0YV9zeTsKKwlpbnQgZGVsdGFfZHgsIGRlbHRhX2R5OworCWludCBoZWlnaHQsIHlkaXI7CS8qIGZsaXAgaW1hZ2UgdmVydGljYWxseSAqLworCWludCBzb3VyY2VfcGl0Y2gsIGRlc3RfcGl0Y2g7Cit9IGRybV9tZ2FfYmxpdF90OworCisvKiAzLjE6IEFuIGlvY3RsIHRvIGdldCBwYXJhbWV0ZXJzIHRoYXQgYXJlbid0IGF2YWlsYWJsZSB0byB0aGUgM2QKKyAqIGNsaWVudCBhbnkgb3RoZXIgd2F5LgorICovCisjZGVmaW5lIE1HQV9QQVJBTV9JUlFfTlIgICAgICAgICAgICAxCisKKy8qIDMuMjogUXVlcnkgdGhlIGFjdHVhbCBjYXJkIHR5cGUuICBUaGUgRERYIG9ubHkgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuCisgKiBHMjAwIGNoaXBzIGFuZCBub24tRzIwMCBjaGlwcywgd2hpY2ggaXQgY2FsbHMgRzQwMC4gIEl0IHR1cm5zIG91dCB0aGF0CisgKiB0aGVyZSBhcmUgc29tZSB2ZXJ5IHN1Ymx0ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBHNHgwIGNoaXBzIGFuZCB0aGUgRzU1MAorICogY2hpcHMuICBVc2luZyB0aGlzIHBhcmFtZXRlciBxdWVyeSwgYSBjbGllbnQtc2lkZSBkcml2ZXIgY2FuIGRldGVjdCB0aGUKKyAqIGRpZmZlcmVuY2UgYmV0d2VlbiBhIEc0eDAgYW5kIGEgRzU1MC4KKyAqLworI2RlZmluZSBNR0FfUEFSQU1fQ0FSRF9UWVBFICAgICAgICAgMgorCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2dldHBhcmFtIHsKKwlpbnQgcGFyYW07CisJdm9pZCAqdmFsdWU7Cit9IGRybV9tZ2FfZ2V0cGFyYW1fdDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9ub3V2ZWF1X2RybS5oIGIvaW5jbHVkZS9kcm0vbm91dmVhdV9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDE4ZjlmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0vbm91dmVhdV9kcm0uaApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1IFN0ZXBoYW5lIE1hcmNoZXNpbi4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX05PVVZFQVVfRFJNX0hfXworI2RlZmluZSBfX05PVVZFQVVfRFJNX0hfXworCisjZGVmaW5lIE5PVVZFQVVfRFJNX0hFQURFUl9QQVRDSExFVkVMIDE2CisKK3N0cnVjdCBkcm1fbm91dmVhdV9jaGFubmVsX2FsbG9jIHsKKwl1aW50MzJfdCAgICAgZmJfY3R4ZG1hX2hhbmRsZTsKKwl1aW50MzJfdCAgICAgdHRfY3R4ZG1hX2hhbmRsZTsKKworCWludCAgICAgICAgICBjaGFubmVsOworCXVpbnQzMl90ICAgICBwdXNoYnVmX2RvbWFpbnM7CisKKwkvKiBOb3RpZmllciBtZW1vcnkgKi8KKwl1aW50MzJfdCAgICAgbm90aWZpZXJfaGFuZGxlOworCisJLyogRFJNLWVuZm9yY2VkIHN1YmNoYW5uZWwgYXNzaWdubWVudHMgKi8KKwlzdHJ1Y3QgeworCQl1aW50MzJfdCBoYW5kbGU7CisJCXVpbnQzMl90IGdyY2xhc3M7CisJfSBzdWJjaGFuWzhdOworCXVpbnQzMl90IG5yX3N1YmNoYW47Cit9OworCitzdHJ1Y3QgZHJtX25vdXZlYXVfY2hhbm5lbF9mcmVlIHsKKwlpbnQgY2hhbm5lbDsKK307CisKK3N0cnVjdCBkcm1fbm91dmVhdV9ncm9ial9hbGxvYyB7CisJaW50ICAgICAgY2hhbm5lbDsKKwl1aW50MzJfdCBoYW5kbGU7CisJaW50ICAgICAgY2xhc3M7Cit9OworCitzdHJ1Y3QgZHJtX25vdXZlYXVfbm90aWZpZXJvYmpfYWxsb2MgeworCXVpbnQzMl90IGNoYW5uZWw7CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IHNpemU7CisJdWludDMyX3Qgb2Zmc2V0OworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dwdW9ial9mcmVlIHsKKwlpbnQgICAgICBjaGFubmVsOworCXVpbnQzMl90IGhhbmRsZTsKK307CisKKy8qIEZJWE1FIDogbWF5YmUgdW5pZnkge0dFVCxTRVR9UEFSQU1zICovCisjZGVmaW5lIE5PVVZFQVVfR0VUUEFSQU1fUENJX1ZFTkRPUiAgICAgIDMKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9QQ0lfREVWSUNFICAgICAgNAorI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX0JVU19UWVBFICAgICAgICA1CisjZGVmaW5lIE5PVVZFQVVfR0VUUEFSQU1fRkJfUEhZU0lDQUwgICAgIDYKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9BR1BfUEhZU0lDQUwgICAgNworI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX0ZCX1NJWkUgICAgICAgICA4CisjZGVmaW5lIE5PVVZFQVVfR0VUUEFSQU1fQUdQX1NJWkUgICAgICAgIDkKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9QQ0lfUEhZU0lDQUwgICAgMTAKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9DSElQU0VUX0lEICAgICAgMTEKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9WTV9WUkFNX0JBU0UgICAgMTIKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9HUkFQSF9VTklUUyAgICAgMTMKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9QVElNRVJfVElNRSAgICAgMTQKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9IQVNfQk9fVVNBR0UgICAgMTUKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9IQVNfUEFHRUZMSVAgICAgMTYKK3N0cnVjdCBkcm1fbm91dmVhdV9nZXRwYXJhbSB7CisJdWludDY0X3QgcGFyYW07CisJdWludDY0X3QgdmFsdWU7Cit9OworCitzdHJ1Y3QgZHJtX25vdXZlYXVfc2V0cGFyYW0geworCXVpbnQ2NF90IHBhcmFtOworCXVpbnQ2NF90IHZhbHVlOworfTsKKworI2RlZmluZSBOT1VWRUFVX0dFTV9ET01BSU5fQ1BVICAgICAgICgxIDw8IDApCisjZGVmaW5lIE5PVVZFQVVfR0VNX0RPTUFJTl9WUkFNICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQgICAgICAoMSA8PCAyKQorI2RlZmluZSBOT1VWRUFVX0dFTV9ET01BSU5fTUFQUEFCTEUgICgxIDw8IDMpCisjZGVmaW5lIE5PVVZFQVVfR0VNX0RPTUFJTl9DT0hFUkVOVCAgKDEgPDwgNCkKKworI2RlZmluZSBOT1VWRUFVX0dFTV9USUxFX0xBWU9VVF9NQVNLIDB4MDAwMGZmMDAKKyNkZWZpbmUgTk9VVkVBVV9HRU1fVElMRV8xNkJQUCAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIE5PVVZFQVVfR0VNX1RJTEVfMzJCUFAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBOT1VWRUFVX0dFTV9USUxFX1pFVEEgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgTk9VVkVBVV9HRU1fVElMRV9OT05DT05USUcgICAweDAwMDAwMDA4CisKK3N0cnVjdCBkcm1fbm91dmVhdV9nZW1faW5mbyB7CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IGRvbWFpbjsKKwl1aW50NjRfdCBzaXplOworCXVpbnQ2NF90IG9mZnNldDsKKwl1aW50NjRfdCBtYXBfaGFuZGxlOworCXVpbnQzMl90IHRpbGVfbW9kZTsKKwl1aW50MzJfdCB0aWxlX2ZsYWdzOworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9uZXcgeworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1faW5mbyBpbmZvOworCXVpbnQzMl90IGNoYW5uZWxfaGludDsKKwl1aW50MzJfdCBhbGlnbjsKK307CisKKyNkZWZpbmUgTk9VVkVBVV9HRU1fTUFYX0JVRkZFUlMgMTAyNAorc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvX3ByZXN1bWVkIHsKKwl1aW50MzJfdCB2YWxpZDsKKwl1aW50MzJfdCBkb21haW47CisJdWludDY0X3Qgb2Zmc2V0OworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvIHsKKwl1aW50NjRfdCB1c2VyX3ByaXY7CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IHJlYWRfZG9tYWluczsKKwl1aW50MzJfdCB3cml0ZV9kb21haW5zOworCXVpbnQzMl90IHZhbGlkX2RvbWFpbnM7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvX3ByZXN1bWVkIHByZXN1bWVkOworfTsKKworI2RlZmluZSBOT1VWRUFVX0dFTV9SRUxPQ19MT1cgICgxIDw8IDApCisjZGVmaW5lIE5PVVZFQVVfR0VNX1JFTE9DX0hJR0ggKDEgPDwgMSkKKyNkZWZpbmUgTk9VVkVBVV9HRU1fUkVMT0NfT1IgICAoMSA8PCAyKQorI2RlZmluZSBOT1VWRUFVX0dFTV9NQVhfUkVMT0NTIDEwMjQKK3N0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9yZWxvYyB7CisJdWludDMyX3QgcmVsb2NfYm9faW5kZXg7CisJdWludDMyX3QgcmVsb2NfYm9fb2Zmc2V0OworCXVpbnQzMl90IGJvX2luZGV4OworCXVpbnQzMl90IGZsYWdzOworCXVpbnQzMl90IGRhdGE7CisJdWludDMyX3Qgdm9yOworCXVpbnQzMl90IHRvcjsKK307CisKKyNkZWZpbmUgTk9VVkVBVV9HRU1fTUFYX1BVU0ggNTEyCitzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfcHVzaCB7CisJdWludDMyX3QgYm9faW5kZXg7CisJdWludDMyX3QgcGFkOworCXVpbnQ2NF90IG9mZnNldDsKKwl1aW50NjRfdCBsZW5ndGg7Cit9OworCitzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWYgeworCXVpbnQzMl90IGNoYW5uZWw7CisJdWludDMyX3QgbnJfYnVmZmVyczsKKwl1aW50NjRfdCBidWZmZXJzOworCXVpbnQzMl90IG5yX3JlbG9jczsKKwl1aW50MzJfdCBucl9wdXNoOworCXVpbnQ2NF90IHJlbG9jczsKKwl1aW50NjRfdCBwdXNoOworCXVpbnQzMl90IHN1ZmZpeDA7CisJdWludDMyX3Qgc3VmZml4MTsKKwl1aW50NjRfdCB2cmFtX2F2YWlsYWJsZTsKKwl1aW50NjRfdCBnYXJ0X2F2YWlsYWJsZTsKK307CisKKyNkZWZpbmUgTk9VVkVBVV9HRU1fQ1BVX1BSRVBfTk9XQUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTk9VVkVBVV9HRU1fQ1BVX1BSRVBfTk9CTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgTk9VVkVBVV9HRU1fQ1BVX1BSRVBfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKK3N0cnVjdCBkcm1fbm91dmVhdV9nZW1fY3B1X3ByZXAgeworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCBmbGFnczsKK307CisKK3N0cnVjdCBkcm1fbm91dmVhdV9nZW1fY3B1X2ZpbmkgeworCXVpbnQzMl90IGhhbmRsZTsKK307CisKK2VudW0gbm91dmVhdV9idXNfdHlwZSB7CisJTlZfQUdQICAgICA9IDAsCisJTlZfUENJICAgICA9IDEsCisJTlZfUENJRSAgICA9IDIsCit9OworCitzdHJ1Y3QgZHJtX25vdXZlYXVfc2FyZWEgeworfTsKKworI2RlZmluZSBEUk1fTk9VVkVBVV9HRVRQQVJBTSAgICAgICAgICAgMHgwMAorI2RlZmluZSBEUk1fTk9VVkVBVV9TRVRQQVJBTSAgICAgICAgICAgMHgwMQorI2RlZmluZSBEUk1fTk9VVkVBVV9DSEFOTkVMX0FMTE9DICAgICAgMHgwMgorI2RlZmluZSBEUk1fTk9VVkVBVV9DSEFOTkVMX0ZSRUUgICAgICAgMHgwMworI2RlZmluZSBEUk1fTk9VVkVBVV9HUk9CSl9BTExPQyAgICAgICAgMHgwNAorI2RlZmluZSBEUk1fTk9VVkVBVV9OT1RJRklFUk9CSl9BTExPQyAgMHgwNQorI2RlZmluZSBEUk1fTk9VVkVBVV9HUFVPQkpfRlJFRSAgICAgICAgMHgwNgorI2RlZmluZSBEUk1fTk9VVkVBVV9OVklGICAgICAgICAgICAgICAgMHgwNworI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fTkVXICAgICAgICAgICAgMHg0MAorI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fUFVTSEJVRiAgICAgICAgMHg0MQorI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fQ1BVX1BSRVAgICAgICAgMHg0MgorI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fQ1BVX0ZJTkkgICAgICAgMHg0MworI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fSU5GTyAgICAgICAgICAgMHg0NAorCisjZW5kaWYgLyogX19OT1VWRUFVX0RSTV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL3F4bF9kcm0uaCBiL2luY2x1ZGUvZHJtL3F4bF9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTMzMWE4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0vcXhsX2RybS5oCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTMgUmVkIEhhdAorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgUVhMX0RSTV9ICisjZGVmaW5lIFFYTF9EUk1fSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSAiZHJtLmgiCisKKy8qIFBsZWFzZSBub3RlIHRoYXQgbW9kaWZpY2F0aW9ucyB0byBhbGwgc3RydWN0cyBkZWZpbmVkIGhlcmUgYXJlCisgKiBzdWJqZWN0IHRvIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGNvbnN0cmFpbnRzLgorICoKKyAqIERvIG5vdCB1c2UgcG9pbnRlcnMsIHVzZSB1aW50NjRfdCBpbnN0ZWFkIGZvciAzMiBiaXQgLyA2NCBiaXQgdXNlci9rZXJuZWwKKyAqIGNvbXBhdGliaWxpdHkgS2VlcCBmaWVsZHMgYWxpZ25lZCB0byB0aGVpciBzaXplCisgKi8KKworI2RlZmluZSBRWExfR0VNX0RPTUFJTl9DUFUgMAorI2RlZmluZSBRWExfR0VNX0RPTUFJTl9WUkFNIDEKKyNkZWZpbmUgUVhMX0dFTV9ET01BSU5fU1VSRkFDRSAyCisKKyNkZWZpbmUgRFJNX1FYTF9BTExPQyAgICAgICAweDAwCisjZGVmaW5lIERSTV9RWExfTUFQICAgICAgICAgMHgwMQorI2RlZmluZSBEUk1fUVhMX0VYRUNCVUZGRVIgIDB4MDIKKyNkZWZpbmUgRFJNX1FYTF9VUERBVEVfQVJFQSAweDAzCisjZGVmaW5lIERSTV9RWExfR0VUUEFSQU0gICAgMHgwNAorI2RlZmluZSBEUk1fUVhMX0NMSUVOVENBUCAgIDB4MDUKKworI2RlZmluZSBEUk1fUVhMX0FMTE9DX1NVUkYgIDB4MDYKKworc3RydWN0IGRybV9xeGxfYWxsb2MgeworCXVpbnQzMl90IHNpemU7CisJdWludDMyX3QgaGFuZGxlOyAvKiAwIGlzIGFuIGludmFsaWQgaGFuZGxlICovCit9OworCitzdHJ1Y3QgZHJtX3F4bF9tYXAgeworCXVpbnQ2NF90IG9mZnNldDsgLyogdXNlIGZvciBtbWFwIHN5c3RlbSBjYWxsICovCisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IHBhZDsKK307CisKKy8qCisgKiBkZXN0IGlzIHRoZSBibyB3ZSBhcmUgd3JpdGluZyB0aGUgcmVsb2NhdGlvbiBpbnRvCisgKiBzcmMgaXMgYm8gd2UgYXJlIHJlbG9jYXRpbmcuCisgKiAqKGRlc3RfaGFuZGxlLmJhc2VfYWRkciArIGRlc3Rfb2Zmc2V0KSA9IHBoeXNpY2FsX2FkZHJlc3Moc3JjX2hhbmRsZS5hZGRyICsKKyAqIHNyY19vZmZzZXQpCisgKi8KKyNkZWZpbmUgUVhMX1JFTE9DX1RZUEVfQk8gMQorI2RlZmluZSBRWExfUkVMT0NfVFlQRV9TVVJGIDIKKworc3RydWN0IGRybV9xeGxfcmVsb2MgeworCXVpbnQ2NF90IHNyY19vZmZzZXQ7IC8qIG9mZnNldCBpbnRvIHNyY19oYW5kbGUgb3Igc3JjIGJ1ZmZlciAqLworCXVpbnQ2NF90IGRzdF9vZmZzZXQ7IC8qIG9mZnNldCBpbiBkZXN0IGhhbmRsZSAqLworCXVpbnQzMl90IHNyY19oYW5kbGU7IC8qIGRlc3QgaGFuZGxlIHRvIGNvbXB1dGUgYWRkcmVzcyBmcm9tICovCisJdWludDMyX3QgZHN0X2hhbmRsZTsgLyogMCBpZiB0byBjb21tYW5kIGJ1ZmZlciAqLworCXVpbnQzMl90IHJlbG9jX3R5cGU7CisJdWludDMyX3QgcGFkOworfTsKKworc3RydWN0IGRybV9xeGxfY29tbWFuZCB7CisJdWludDY0X3QJIGNvbW1hbmQ7IC8qIHZvaWQqICovCisJdWludDY0X3QJIHJlbG9jczsgLyogc3RydWN0IGRybV9xeGxfcmVsb2MqICovCisJdWludDMyX3QJCXR5cGU7CisJdWludDMyX3QJCWNvbW1hbmRfc2l6ZTsKKwl1aW50MzJfdAkJcmVsb2NzX251bTsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICBwYWQ7Cit9OworCisvKiBYWFg6IGNhbGwgaXQgZHJtX3F4bF9jb21tYW5kcz8gKi8KK3N0cnVjdCBkcm1fcXhsX2V4ZWNidWZmZXIgeworCXVpbnQzMl90CQlmbGFnczsJCS8qIGZvciBmdXR1cmUgdXNlICovCisJdWludDMyX3QJCWNvbW1hbmRzX251bTsKKwl1aW50NjRfdAkgY29tbWFuZHM7CS8qIHN0cnVjdCBkcm1fcXhsX2NvbW1hbmQqICovCit9OworCitzdHJ1Y3QgZHJtX3F4bF91cGRhdGVfYXJlYSB7CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IHRvcDsKKwl1aW50MzJfdCBsZWZ0OworCXVpbnQzMl90IGJvdHRvbTsKKwl1aW50MzJfdCByaWdodDsKKwl1aW50MzJfdCBwYWQ7Cit9OworCisjZGVmaW5lIFFYTF9QQVJBTV9OVU1fU1VSRkFDRVMgMSAvKiByb20tPm5fc3VyZmFjZXMgKi8KKyNkZWZpbmUgUVhMX1BBUkFNX01BWF9SRUxPQ1MgMgorc3RydWN0IGRybV9xeGxfZ2V0cGFyYW0geworCXVpbnQ2NF90IHBhcmFtOworCXVpbnQ2NF90IHZhbHVlOworfTsKKworLyogdGhlc2UgYXJlIG9uZSBiaXQgdmFsdWVzICovCitzdHJ1Y3QgZHJtX3F4bF9jbGllbnRjYXAgeworCXVpbnQzMl90IGluZGV4OworCXVpbnQzMl90IHBhZDsKK307CisKK3N0cnVjdCBkcm1fcXhsX2FsbG9jX3N1cmYgeworCXVpbnQzMl90IGZvcm1hdDsKKwl1aW50MzJfdCB3aWR0aDsKKwl1aW50MzJfdCBoZWlnaHQ7CisJaW50MzJfdCBzdHJpZGU7CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IHBhZDsKK307CisKKyNkZWZpbmUgRFJNX0lPQ1RMX1FYTF9BTExPQyBcCisJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9RWExfQUxMT0MsIHN0cnVjdCBkcm1fcXhsX2FsbG9jKQorCisjZGVmaW5lIERSTV9JT0NUTF9RWExfTUFQIFwKKwlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1FYTF9NQVAsIHN0cnVjdCBkcm1fcXhsX21hcCkKKworI2RlZmluZSBEUk1fSU9DVExfUVhMX0VYRUNCVUZGRVIgXAorCURSTV9JT1coRFJNX0NPTU1BTkRfQkFTRSArIERSTV9RWExfRVhFQ0JVRkZFUixcCisJCXN0cnVjdCBkcm1fcXhsX2V4ZWNidWZmZXIpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1FYTF9VUERBVEVfQVJFQSBcCisJRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX1FYTF9VUERBVEVfQVJFQSxcCisJCXN0cnVjdCBkcm1fcXhsX3VwZGF0ZV9hcmVhKQorCisjZGVmaW5lIERSTV9JT0NUTF9RWExfR0VUUEFSQU0gXAorCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUVhMX0dFVFBBUkFNLFwKKwkJc3RydWN0IGRybV9xeGxfZ2V0cGFyYW0pCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1FYTF9DTElFTlRDQVAgXAorCURSTV9JT1coRFJNX0NPTU1BTkRfQkFTRSArIERSTV9RWExfQ0xJRU5UQ0FQLFwKKwkJc3RydWN0IGRybV9xeGxfY2xpZW50Y2FwKQorCisjZGVmaW5lIERSTV9JT0NUTF9RWExfQUxMT0NfU1VSRiBcCisJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9RWExfQUxMT0NfU1VSRixcCisJCXN0cnVjdCBkcm1fcXhsX2FsbG9jX3N1cmYpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vcjEyOF9kcm0uaCBiL2luY2x1ZGUvZHJtL3IxMjhfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlNzhmZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL3IxMjhfZHJtLmgKQEAgLTAsMCArMSwzMjYgQEAKKy8qIHIxMjhfZHJtLmggLS0gUHVibGljIGhlYWRlciBmb3IgdGhlIHIxMjggZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogV2VkIEFwciAgNSAxOToyNDoxOSAyMDAwIGJ5IGtldmluQHByZWNpc2lvbmluc2lnaHQuY29tCisgKi8KKy8qCisgKiBDb3B5cmlnaHQgMjAwMCBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICogICAgS2V2aW4gRS4gTWFydGluIDxtYXJ0aW5AdmFsaW51eC5jb20+CisgKi8KKworI2lmbmRlZiBfX1IxMjhfRFJNX0hfXworI2RlZmluZSBfX1IxMjhfRFJNX0hfXworCisvKiBXQVJOSU5HOiBJZiB5b3UgY2hhbmdlIGFueSBvZiB0aGVzZSBkZWZpbmVzLCBtYWtlIHN1cmUgdG8gY2hhbmdlIHRoZQorICogZGVmaW5lcyBpbiB0aGUgWCBzZXJ2ZXIgZmlsZSAocjEyOF9zYXJlYS5oKQorICovCisjaWZuZGVmIF9fUjEyOF9TQVJFQV9ERUZJTkVTX18KKyNkZWZpbmUgX19SMTI4X1NBUkVBX0RFRklORVNfXworCisvKiBXaGF0IG5lZWRzIHRvIGJlIGNoYW5nZWQgZm9yIHRoZSBjdXJyZW50IHZlcnRleCBidWZmZXI/CisgKi8KKyNkZWZpbmUgUjEyOF9VUExPQURfQ09OVEVYVAkJMHgwMDEKKyNkZWZpbmUgUjEyOF9VUExPQURfU0VUVVAJCTB4MDAyCisjZGVmaW5lIFIxMjhfVVBMT0FEX1RFWDAJCTB4MDA0CisjZGVmaW5lIFIxMjhfVVBMT0FEX1RFWDEJCTB4MDA4CisjZGVmaW5lIFIxMjhfVVBMT0FEX1RFWDBJTUFHRVMJCTB4MDEwCisjZGVmaW5lIFIxMjhfVVBMT0FEX1RFWDFJTUFHRVMJCTB4MDIwCisjZGVmaW5lIFIxMjhfVVBMT0FEX0NPUkUJCTB4MDQwCisjZGVmaW5lIFIxMjhfVVBMT0FEX01BU0tTCQkweDA4MAorI2RlZmluZSBSMTI4X1VQTE9BRF9XSU5ET1cJCTB4MTAwCisjZGVmaW5lIFIxMjhfVVBMT0FEX0NMSVBSRUNUUwkJMHgyMDAJLyogaGFuZGxlZCBjbGllbnQtc2lkZSAqLworI2RlZmluZSBSMTI4X1JFUVVJUkVfUVVJRVNDRU5DRQkJMHg0MDAKKyNkZWZpbmUgUjEyOF9VUExPQURfQUxMCQkJMHg3ZmYKKworI2RlZmluZSBSMTI4X0ZST05UCQkJMHgxCisjZGVmaW5lIFIxMjhfQkFDSwkJCTB4MgorI2RlZmluZSBSMTI4X0RFUFRICQkJMHg0CisKKy8qIFByaW1pdGl2ZSB0eXBlcworICovCisjZGVmaW5lIFIxMjhfUE9JTlRTCQkJMHgxCisjZGVmaW5lIFIxMjhfTElORVMJCQkweDIKKyNkZWZpbmUgUjEyOF9MSU5FX1NUUklQCQkJMHgzCisjZGVmaW5lIFIxMjhfVFJJQU5HTEVTCQkJMHg0CisjZGVmaW5lIFIxMjhfVFJJQU5HTEVfRkFOCQkweDUKKyNkZWZpbmUgUjEyOF9UUklBTkdMRV9TVFJJUAkJMHg2CisKKy8qIFZlcnRleC9pbmRpcmVjdCBidWZmZXIgc2l6ZQorICovCisjZGVmaW5lIFIxMjhfQlVGRkVSX1NJWkUJCTE2Mzg0CisKKy8qIEJ5dGUgb2Zmc2V0cyBmb3IgaW5kaXJlY3QgYnVmZmVyIGRhdGEKKyAqLworI2RlZmluZSBSMTI4X0lOREVYX1BSSU1fT0ZGU0VUCQkyMAorI2RlZmluZSBSMTI4X0hPU1REQVRBX0JMSVRfT0ZGU0VUCTMyCisKKy8qIEtlZXAgdGhlc2Ugc21hbGwgZm9yIHRlc3RpbmcuCisgKi8KKyNkZWZpbmUgUjEyOF9OUl9TQVJFQV9DTElQUkVDVFMJCTEyCisKKy8qIFRoZXJlIGFyZSAyIGhlYXBzIChsb2NhbC9BR1ApLiAgRWFjaCByZWdpb24gd2l0aGluIGEgaGVhcCBpcyBhCisgKiAgbWluaW11bSBvZiA2NGssIGFuZCB0aGVyZSBhcmUgYXQgbW9zdCA2NCBvZiB0aGVtIHBlciBoZWFwLgorICovCisjZGVmaW5lIFIxMjhfTE9DQUxfVEVYX0hFQVAJCTAKKyNkZWZpbmUgUjEyOF9BR1BfVEVYX0hFQVAJCTEKKyNkZWZpbmUgUjEyOF9OUl9URVhfSEVBUFMJCTIKKyNkZWZpbmUgUjEyOF9OUl9URVhfUkVHSU9OUwkJNjQKKyNkZWZpbmUgUjEyOF9MT0dfVEVYX0dSQU5VTEFSSVRZCTE2CisKKyNkZWZpbmUgUjEyOF9OUl9DT05URVhUX1JFR1MJCTEyCisKKyNkZWZpbmUgUjEyOF9NQVhfVEVYVFVSRV9MRVZFTFMJCTExCisjZGVmaW5lIFIxMjhfTUFYX1RFWFRVUkVfVU5JVFMJCTIKKworI2VuZGlmCQkJCS8qIF9fUjEyOF9TQVJFQV9ERUZJTkVTX18gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIENvbnRleHQgc3RhdGUgLSBjYW4gYmUgd3JpdHRlbiBpbiBvbmUgbGFyZ2UgY2h1bmsgKi8KKwl1bnNpZ25lZCBpbnQgZHN0X3BpdGNoX29mZnNldF9jOworCXVuc2lnbmVkIGludCBkcF9ndWlfbWFzdGVyX2NudGxfYzsKKwl1bnNpZ25lZCBpbnQgc2NfdG9wX2xlZnRfYzsKKwl1bnNpZ25lZCBpbnQgc2NfYm90dG9tX3JpZ2h0X2M7CisJdW5zaWduZWQgaW50IHpfb2Zmc2V0X2M7CisJdW5zaWduZWQgaW50IHpfcGl0Y2hfYzsKKwl1bnNpZ25lZCBpbnQgel9zdGVuX2NudGxfYzsKKwl1bnNpZ25lZCBpbnQgdGV4X2NudGxfYzsKKwl1bnNpZ25lZCBpbnQgbWlzY18zZF9zdGF0ZV9jbnRsX3JlZzsKKwl1bnNpZ25lZCBpbnQgdGV4dHVyZV9jbHJfY21wX2Nscl9jOworCXVuc2lnbmVkIGludCB0ZXh0dXJlX2Nscl9jbXBfbXNrX2M7CisJdW5zaWduZWQgaW50IGZvZ19jb2xvcl9jOworCisJLyogVGV4dHVyZSBzdGF0ZSAqLworCXVuc2lnbmVkIGludCB0ZXhfc2l6ZV9waXRjaF9jOworCXVuc2lnbmVkIGludCBjb25zdGFudF9jb2xvcl9jOworCisJLyogU2V0dXAgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgcG00X3ZjX2ZwdV9zZXR1cDsKKwl1bnNpZ25lZCBpbnQgc2V0dXBfY250bDsKKworCS8qIE1hc2sgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgZHBfd3JpdGVfbWFzazsKKwl1bnNpZ25lZCBpbnQgc3Rlbl9yZWZfbWFza19jOworCXVuc2lnbmVkIGludCBwbGFuZV8zZF9tYXNrX2M7CisKKwkvKiBXaW5kb3cgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgd2luZG93X3h5X29mZnNldDsKKworCS8qIENvcmUgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgc2NhbGVfM2RfY250bDsKK30gZHJtX3IxMjhfY29udGV4dF9yZWdzX3Q7CisKKy8qIFNldHVwIHJlZ2lzdGVycyBmb3IgZWFjaCB0ZXh0dXJlIHVuaXQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCB0ZXhfY250bDsKKwl1bnNpZ25lZCBpbnQgdGV4X2NvbWJpbmVfY250bDsKKwl1bnNpZ25lZCBpbnQgdGV4X3NpemVfcGl0Y2g7CisJdW5zaWduZWQgaW50IHRleF9vZmZzZXRbUjEyOF9NQVhfVEVYVFVSRV9MRVZFTFNdOworCXVuc2lnbmVkIGludCB0ZXhfYm9yZGVyX2NvbG9yOworfSBkcm1fcjEyOF90ZXh0dXJlX3JlZ3NfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfc2FyZWEgeworCS8qIFRoZSBjaGFubmVsIGZvciBjb21tdW5pY2F0aW9uIG9mIHN0YXRlIGluZm9ybWF0aW9uIHRvIHRoZSBrZXJuZWwKKwkgKiBvbiBmaXJpbmcgYSB2ZXJ0ZXggYnVmZmVyLgorCSAqLworCWRybV9yMTI4X2NvbnRleHRfcmVnc190IGNvbnRleHRfc3RhdGU7CisJZHJtX3IxMjhfdGV4dHVyZV9yZWdzX3QgdGV4X3N0YXRlW1IxMjhfTUFYX1RFWFRVUkVfVU5JVFNdOworCXVuc2lnbmVkIGludCBkaXJ0eTsKKwl1bnNpZ25lZCBpbnQgdmVydHNpemU7CisJdW5zaWduZWQgaW50IHZjX2Zvcm1hdDsKKworCS8qIFRoZSBjdXJyZW50IGNsaXByZWN0cywgb3IgYSBzdWJzZXQgdGhlcmVvZi4KKwkgKi8KKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBib3hlc1tSMTI4X05SX1NBUkVBX0NMSVBSRUNUU107CisJdW5zaWduZWQgaW50IG5ib3g7CisKKwkvKiBDb3VudGVycyBmb3IgY2xpZW50LXNpZGUgdGhyb3R0bGluZyBvZiByZW5kZXJpbmcgY2xpZW50cy4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgbGFzdF9mcmFtZTsKKwl1bnNpZ25lZCBpbnQgbGFzdF9kaXNwYXRjaDsKKworCXN0cnVjdCBkcm1fdGV4X3JlZ2lvbiB0ZXhfbGlzdFtSMTI4X05SX1RFWF9IRUFQU11bUjEyOF9OUl9URVhfUkVHSU9OUyArIDFdOworCXVuc2lnbmVkIGludCB0ZXhfYWdlW1IxMjhfTlJfVEVYX0hFQVBTXTsKKwlpbnQgY3R4X293bmVyOworCWludCBwZkFsbG93UGFnZUZsaXA7CS8qIG51bWJlciBvZiAzZCB3aW5kb3dzICgwLDEsMiBvciBtb3JlKSAqLworCWludCBwZkN1cnJlbnRQYWdlOwkvKiB3aGljaCBidWZmZXIgaXMgYmVpbmcgZGlzcGxheWVkPyAqLworfSBkcm1fcjEyOF9zYXJlYV90OworCisvKiBXQVJOSU5HOiBJZiB5b3UgY2hhbmdlIGFueSBvZiB0aGVzZSBkZWZpbmVzLCBtYWtlIHN1cmUgdG8gY2hhbmdlIHRoZQorICogZGVmaW5lcyBpbiB0aGUgWHNlcnZlciBmaWxlICh4Zjg2ZHJtUjEyOC5oKQorICovCisKKy8qIFJhZ2UgMTI4IHNwZWNpZmljIGlvY3RscworICogVGhlIGRldmljZSBzcGVjaWZpYyBpb2N0bCByYW5nZSBpcyAweDQwIHRvIDB4NzkuCisgKi8KKyNkZWZpbmUgRFJNX1IxMjhfSU5JVCAgICAgICAweDAwCisjZGVmaW5lIERSTV9SMTI4X0NDRV9TVEFSVCAgMHgwMQorI2RlZmluZSBEUk1fUjEyOF9DQ0VfU1RPUCAgIDB4MDIKKyNkZWZpbmUgRFJNX1IxMjhfQ0NFX1JFU0VUICAweDAzCisjZGVmaW5lIERSTV9SMTI4X0NDRV9JRExFICAgMHgwNAorLyogMHgwNSBub3QgdXNlZCAqLworI2RlZmluZSBEUk1fUjEyOF9SRVNFVCAgICAgIDB4MDYKKyNkZWZpbmUgRFJNX1IxMjhfU1dBUCAgICAgICAweDA3CisjZGVmaW5lIERSTV9SMTI4X0NMRUFSICAgICAgMHgwOAorI2RlZmluZSBEUk1fUjEyOF9WRVJURVggICAgIDB4MDkKKyNkZWZpbmUgRFJNX1IxMjhfSU5ESUNFUyAgICAweDBhCisjZGVmaW5lIERSTV9SMTI4X0JMSVQgICAgICAgMHgwYgorI2RlZmluZSBEUk1fUjEyOF9ERVBUSCAgICAgIDB4MGMKKyNkZWZpbmUgRFJNX1IxMjhfU1RJUFBMRSAgICAweDBkCisvKiAweDBlIG5vdCB1c2VkICovCisjZGVmaW5lIERSTV9SMTI4X0lORElSRUNUICAgMHgwZgorI2RlZmluZSBEUk1fUjEyOF9GVUxMU0NSRUVOIDB4MTAKKyNkZWZpbmUgRFJNX1IxMjhfQ0xFQVIyICAgICAweDExCisjZGVmaW5lIERSTV9SMTI4X0dFVFBBUkFNICAgMHgxMgorI2RlZmluZSBEUk1fUjEyOF9GTElQICAgICAgIDB4MTMKKworI2RlZmluZSBEUk1fSU9DVExfUjEyOF9JTklUICAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9JTklULCBkcm1fcjEyOF9pbml0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0NDRV9TVEFSVCAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0NDRV9TVEFSVCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfQ0NFX1NUT1AgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfQ0NFX1NUT1AsIGRybV9yMTI4X2NjZV9zdG9wX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0NDRV9SRVNFVCAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0NDRV9SRVNFVCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfQ0NFX0lETEUgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfQ0NFX0lETEUpCisvKiAweDA1IG5vdCB1c2VkICovCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X1JFU0VUICAgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X1JFU0VUKQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9TV0FQICAgICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9TV0FQKQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9DTEVBUiAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9DTEVBUiwgZHJtX3IxMjhfY2xlYXJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfVkVSVEVYICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfVkVSVEVYLCBkcm1fcjEyOF92ZXJ0ZXhfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfSU5ESUNFUyAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfSU5ESUNFUywgZHJtX3IxMjhfaW5kaWNlc190KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9CTElUICAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9CTElULCBkcm1fcjEyOF9ibGl0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0RFUFRIICAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0RFUFRILCBkcm1fcjEyOF9kZXB0aF90KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9TVElQUExFICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9TVElQUExFLCBkcm1fcjEyOF9zdGlwcGxlX3QpCisvKiAweDBlIG5vdCB1c2VkICovCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0lORElSRUNUICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0lORElSRUNULCBkcm1fcjEyOF9pbmRpcmVjdF90KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9GVUxMU0NSRUVOIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9GVUxMU0NSRUVOLCBkcm1fcjEyOF9mdWxsc2NyZWVuX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0NMRUFSMiAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0NMRUFSMiwgZHJtX3IxMjhfY2xlYXIyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0dFVFBBUkFNICAgRFJNX0lPV1IoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9HRVRQQVJBTSwgZHJtX3IxMjhfZ2V0cGFyYW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfRkxJUCAgICAgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfRkxJUCkKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfaW5pdCB7CisJZW51bSB7CisJCVIxMjhfSU5JVF9DQ0UgPSAweDAxLAorCQlSMTI4X0NMRUFOVVBfQ0NFID0gMHgwMgorCX0gZnVuYzsKKwl1bnNpZ25lZCBsb25nIHNhcmVhX3ByaXZfb2Zmc2V0OworCWludCBpc19wY2k7CisJaW50IGNjZV9tb2RlOworCWludCBjY2Vfc2VjdXJlOworCWludCByaW5nX3NpemU7CisJaW50IHVzZWNfdGltZW91dDsKKworCXVuc2lnbmVkIGludCBmYl9icHA7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldCwgZnJvbnRfcGl0Y2g7CisJdW5zaWduZWQgaW50IGJhY2tfb2Zmc2V0LCBiYWNrX3BpdGNoOworCXVuc2lnbmVkIGludCBkZXB0aF9icHA7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldCwgZGVwdGhfcGl0Y2g7CisJdW5zaWduZWQgaW50IHNwYW5fb2Zmc2V0OworCisJdW5zaWduZWQgbG9uZyBmYl9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBtbWlvX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHJpbmdfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgcmluZ19ycHRyX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcnNfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgYWdwX3RleHR1cmVzX29mZnNldDsKK30gZHJtX3IxMjhfaW5pdF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9jY2Vfc3RvcCB7CisJaW50IGZsdXNoOworCWludCBpZGxlOworfSBkcm1fcjEyOF9jY2Vfc3RvcF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9jbGVhciB7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBjbGVhcl9jb2xvcjsKKwl1bnNpZ25lZCBpbnQgY2xlYXJfZGVwdGg7CisJdW5zaWduZWQgaW50IGNvbG9yX21hc2s7CisJdW5zaWduZWQgaW50IGRlcHRoX21hc2s7Cit9IGRybV9yMTI4X2NsZWFyX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X3ZlcnRleCB7CisJaW50IHByaW07CisJaW50IGlkeDsJCS8qIEluZGV4IG9mIHZlcnRleCBidWZmZXIgKi8KKwlpbnQgY291bnQ7CQkvKiBOdW1iZXIgb2YgdmVydGljZXMgaW4gYnVmZmVyICovCisJaW50IGRpc2NhcmQ7CQkvKiBDbGllbnQgZmluaXNoZWQgd2l0aCBidWZmZXI/ICovCit9IGRybV9yMTI4X3ZlcnRleF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9pbmRpY2VzIHsKKwlpbnQgcHJpbTsKKwlpbnQgaWR4OworCWludCBzdGFydDsKKwlpbnQgZW5kOworCWludCBkaXNjYXJkOwkJLyogQ2xpZW50IGZpbmlzaGVkIHdpdGggYnVmZmVyPyAqLworfSBkcm1fcjEyOF9pbmRpY2VzX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2JsaXQgeworCWludCBpZHg7CisJaW50IHBpdGNoOworCWludCBvZmZzZXQ7CisJaW50IGZvcm1hdDsKKwl1bnNpZ25lZCBzaG9ydCB4LCB5OworCXVuc2lnbmVkIHNob3J0IHdpZHRoLCBoZWlnaHQ7Cit9IGRybV9yMTI4X2JsaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfZGVwdGggeworCWVudW0geworCQlSMTI4X1dSSVRFX1NQQU4gPSAweDAxLAorCQlSMTI4X1dSSVRFX1BJWEVMUyA9IDB4MDIsCisJCVIxMjhfUkVBRF9TUEFOID0gMHgwMywKKwkJUjEyOF9SRUFEX1BJWEVMUyA9IDB4MDQKKwl9IGZ1bmM7CisJaW50IG47CisJaW50ICp4OworCWludCAqeTsKKwl1bnNpZ25lZCBpbnQgKmJ1ZmZlcjsKKwl1bnNpZ25lZCBjaGFyICptYXNrOworfSBkcm1fcjEyOF9kZXB0aF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9zdGlwcGxlIHsKKwl1bnNpZ25lZCBpbnQgKm1hc2s7Cit9IGRybV9yMTI4X3N0aXBwbGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfaW5kaXJlY3QgeworCWludCBpZHg7CisJaW50IHN0YXJ0OworCWludCBlbmQ7CisJaW50IGRpc2NhcmQ7Cit9IGRybV9yMTI4X2luZGlyZWN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2Z1bGxzY3JlZW4geworCWVudW0geworCQlSMTI4X0lOSVRfRlVMTFNDUkVFTiA9IDB4MDEsCisJCVIxMjhfQ0xFQU5VUF9GVUxMU0NSRUVOID0gMHgwMgorCX0gZnVuYzsKK30gZHJtX3IxMjhfZnVsbHNjcmVlbl90OworCisvKiAyLjM6IEFuIGlvY3RsIHRvIGdldCBwYXJhbWV0ZXJzIHRoYXQgYXJlbid0IGF2YWlsYWJsZSB0byB0aGUgM2QKKyAqIGNsaWVudCBhbnkgb3RoZXIgd2F5LgorICovCisjZGVmaW5lIFIxMjhfUEFSQU1fSVJRX05SICAgICAgICAgICAgMQorCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9nZXRwYXJhbSB7CisJaW50IHBhcmFtOworCXZvaWQgKnZhbHVlOworfSBkcm1fcjEyOF9nZXRwYXJhbV90OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL3JhZGVvbl9kcm0uaCBiL2luY2x1ZGUvZHJtL3JhZGVvbl9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDljYzA0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0vcmFkZW9uX2RybS5oCkBAIC0wLDAgKzEsMTA3OSBAQAorLyogcmFkZW9uX2RybS5oIC0tIFB1YmxpYyBoZWFkZXIgZm9yIHRoZSByYWRlb24gZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICoKKyAqIENvcHlyaWdodCAyMDAwIFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIEZyZW1vbnQsIENhbGlmb3JuaWEuCisgKiBDb3B5cmlnaHQgMjAwMiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgS2V2aW4gRS4gTWFydGluIDxtYXJ0aW5AdmFsaW51eC5jb20+CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKiAgICBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKi8KKworI2lmbmRlZiBfX1JBREVPTl9EUk1fSF9fCisjZGVmaW5lIF9fUkFERU9OX0RSTV9IX18KKworI2luY2x1ZGUgImRybS5oIgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlIGRlZmluZXMsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlCisgKiBkZWZpbmVzIGluIHRoZSBYIHNlcnZlciBmaWxlIChyYWRlb25fc2FyZWEuaCkKKyAqLworI2lmbmRlZiBfX1JBREVPTl9TQVJFQV9ERUZJTkVTX18KKyNkZWZpbmUgX19SQURFT05fU0FSRUFfREVGSU5FU19fCisKKy8qIE9sZCBzdHlsZSBzdGF0ZSBmbGFncywgcmVxdWlyZWQgZm9yIHNhcmVhIGludGVyZmFjZSAoMS4xIGFuZCAxLjIKKyAqIGNsZWFycykgYW5kIDEuMiBkcm1fdmVydGV4MiBpb2N0bC4KKyAqLworI2RlZmluZSBSQURFT05fVVBMT0FEX0NPTlRFWFQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9WRVJURk1UCQkweDAwMDAwMDAyCisjZGVmaW5lIFJBREVPTl9VUExPQURfTElORQkJMHgwMDAwMDAwNAorI2RlZmluZSBSQURFT05fVVBMT0FEX0JVTVBNQVAJCTB4MDAwMDAwMDgKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9NQVNLUwkJMHgwMDAwMDAxMAorI2RlZmluZSBSQURFT05fVVBMT0FEX1ZJRVdQT1JUCQkweDAwMDAwMDIwCisjZGVmaW5lIFJBREVPTl9VUExPQURfU0VUVVAJCTB4MDAwMDAwNDAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9UQ0wJCTB4MDAwMDAwODAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9NSVNDCQkweDAwMDAwMTAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfVEVYMAkJMHgwMDAwMDIwMAorI2RlZmluZSBSQURFT05fVVBMT0FEX1RFWDEJCTB4MDAwMDA0MDAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9URVgyCQkweDAwMDAwODAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfVEVYMElNQUdFUwkweDAwMDAxMDAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfVEVYMUlNQUdFUwkweDAwMDAyMDAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfVEVYMklNQUdFUwkweDAwMDA0MDAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfQ0xJUFJFQ1RTCQkweDAwMDA4MDAwCS8qIGhhbmRsZWQgY2xpZW50LXNpZGUgKi8KKyNkZWZpbmUgUkFERU9OX1JFUVVJUkVfUVVJRVNDRU5DRQkweDAwMDEwMDAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfWkJJQVMJCTB4MDAwMjAwMDAJLyogdmVyc2lvbiAxLjIgYW5kIG5ld2VyICovCisjZGVmaW5lIFJBREVPTl9VUExPQURfQUxMCQkweDAwM2VmZmZmCisjZGVmaW5lIFJBREVPTl9VUExPQURfQ09OVEVYVF9BTEwgICAgICAgMHgwMDNlMDFmZgorCisvKiBOZXcgc3R5bGUgcGVyLXBhY2tldCBpZGVudGlmaWVycyBmb3IgdXNlIGluIGNtZF9idWZmZXIgaW9jdGwgd2l0aAorICogdGhlIFJBREVPTl9FTUlUX1BBQ0tFVCBjb21tYW5kLiAgQ29tbWVudHMgcmVsYXRlIG5ldyBwYWNrZXRzIHRvIG9sZAorICogc3RhdGUgYml0cyBhbmQgdGhlIHBhY2tldCBzaXplOgorICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX01JU0MgICAgICAgICAgICAgICAgICAgICAgICAgMAkvKiBjb250ZXh0LzcgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIGNvbnRleHQvMyAqLworI2RlZmluZSBSQURFT05fRU1JVF9SQjNEX0NPTE9SUElUQ0ggICAgICAgICAgICAgICAgIDIJLyogY29udGV4dC8xICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1JFX0xJTkVfUEFUVEVSTiAgICAgICAgICAgICAgICAgMwkvKiBsaW5lLzIgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfU0VfTElORV9XSURUSCAgICAgICAgICAgICAgICAgICA0CS8qIGxpbmUvMSAqLworI2RlZmluZSBSQURFT05fRU1JVF9QUF9MVU1fTUFUUklYICAgICAgICAgICAgICAgICAgIDUJLyogYnVtcG1hcC8xICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX1JPVF9NQVRSSVhfMCAgICAgICAgICAgICAgICAgNgkvKiBidW1wbWFwLzIgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUkIzRF9TVEVOQ0lMUkVGTUFTSyAgICAgICAgICAgICA3CS8qIG1hc2tzLzMgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfU0VfVlBPUlRfWFNDQUxFICAgICAgICAgICAgICAgICA4CS8qIHZpZXdwb3J0LzYgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfU0VfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgICA5CS8qIHNldHVwLzIgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfU0VfQ05UTF9TVEFUVVMgICAgICAgICAgICAgICAgICAxMAkvKiBzZXR1cC8xICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1JFX01JU0MgICAgICAgICAgICAgICAgICAgICAgICAgMTEJLyogbWlzYy8xICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX1RYRklMVEVSXzAgICAgICAgICAgICAgICAgICAgMTIJLyogdGV4MC82ICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0JPUkRFUl9DT0xPUl8wICAgICAgICAgICAgICAgMTMJLyogdGV4MC8xICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX1RYRklMVEVSXzEgICAgICAgICAgICAgICAgICAgMTQJLyogdGV4MS82ICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0JPUkRFUl9DT0xPUl8xICAgICAgICAgICAgICAgMTUJLyogdGV4MS8xICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX1RYRklMVEVSXzIgICAgICAgICAgICAgICAgICAgMTYJLyogdGV4Mi82ICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0JPUkRFUl9DT0xPUl8yICAgICAgICAgICAgICAgMTcJLyogdGV4Mi8xICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1NFX1pCSUFTX0ZBQ1RPUiAgICAgICAgICAgICAgICAgMTgJLyogemJpYXMvMiAqLworI2RlZmluZSBSQURFT05fRU1JVF9TRV9UQ0xfT1VUUFVUX1ZUWF9GTVQgICAgICAgICAgIDE5CS8qIHRjbC8xMSAqLworI2RlZmluZSBSQURFT05fRU1JVF9TRV9UQ0xfTUFURVJJQUxfRU1NSVNTSVZFX1JFRCAgIDIwCS8qIG1hdGVyaWFsLzE3ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENCTEVORF8wICAgICAgICAgICAgICAgICAgICAgMjEJLyogdGV4MC80ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENCTEVORF8xICAgICAgICAgICAgICAgICAgICAgMjIJLyogdGV4MS80ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENCTEVORF8yICAgICAgICAgICAgICAgICAgICAgMjMJLyogdGV4Mi80ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENCTEVORF8zICAgICAgICAgICAgICAgICAgICAgMjQJLyogdGV4My80ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENCTEVORF80ICAgICAgICAgICAgICAgICAgICAgMjUJLyogdGV4NC80ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENCTEVORF81ICAgICAgICAgICAgICAgICAgICAgMjYJLyogdGV4NS80ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENCTEVORF82ICAgICAgICAgICAgICAgICAgICAgMjcJLyogLzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzcgICAgICAgICAgICAgICAgICAgICAyOAkvKiAvNCAqLworI2RlZmluZSBSMjAwX0VNSVRfVENMX0xJR0hUX01PREVMX0NUTF8wICAgICAgICAgICAgIDI5CS8qIHRjbC83ICovCisjZGVmaW5lIFIyMDBfRU1JVF9URkFDVE9SXzAgICAgICAgICAgICAgICAgICAgICAgICAgMzAJLyogdGYvNyAqLworI2RlZmluZSBSMjAwX0VNSVRfVlRYX0ZNVF8wICAgICAgICAgICAgICAgICAgICAgICAgIDMxCS8qIHZ0eC81ICovCisjZGVmaW5lIFIyMDBfRU1JVF9WQVBfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIJLyogdmFwLzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX01BVFJJWF9TRUxFQ1RfMCAgICAgICAgICAgICAgICAgICAzMwkvKiBtc2wvNSAqLworI2RlZmluZSBSMjAwX0VNSVRfVEVYX1BST0NfQ1RMXzIgICAgICAgICAgICAgICAgICAgIDM0CS8qIHRjZy81ICovCisjZGVmaW5lIFIyMDBfRU1JVF9UQ0xfVUNQX1ZFUlRfQkxFTkRfQ1RMICAgICAgICAgICAgMzUJLyogdGNsLzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzAgICAgICAgICAgICAgICAgICAgICAzNgkvKiB0ZXgwLzYgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzEgICAgICAgICAgICAgICAgICAgICAzNwkvKiB0ZXgxLzYgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzIgICAgICAgICAgICAgICAgICAgICAzOAkvKiB0ZXgyLzYgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzMgICAgICAgICAgICAgICAgICAgICAzOQkvKiB0ZXgzLzYgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzQgICAgICAgICAgICAgICAgICAgICA0MAkvKiB0ZXg0LzYgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzUgICAgICAgICAgICAgICAgICAgICA0MQkvKiB0ZXg1LzYgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzAgICAgICAgICAgICAgICAgICAgICA0MgkvKiB0ZXgwLzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzEgICAgICAgICAgICAgICAgICAgICA0MwkvKiB0ZXgxLzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzIgICAgICAgICAgICAgICAgICAgICA0NAkvKiB0ZXgyLzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzMgICAgICAgICAgICAgICAgICAgICA0NQkvKiB0ZXgzLzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzQgICAgICAgICAgICAgICAgICAgICA0NgkvKiB0ZXg0LzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzUgICAgICAgICAgICAgICAgICAgICA0NwkvKiB0ZXg1LzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1ZURV9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICA0OAkvKiB2dGUvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfT1VUUFVUX1ZUWF9DT01QX1NFTCAgICAgICAgICAgICAgIDQ5CS8qIHZ0eC8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UQU1fREVCVUczICAgICAgICAgICAgICAgICAgICAgNTAJLyogdGFtLzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NOVExfWCAgICAgICAgICAgICAgICAgICAgICAgICA1MQkvKiBjc3QvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUkIzRF9ERVBUSFhZX09GRlNFVCAgICAgICAgICAgICAgIDUyCS8qIGNzdC8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9SRV9BVVhfU0NJU1NPUl9DTlRMICAgICAgICAgICAgICAgNTMJLyogY3N0LzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1JFX1NDSVNTT1JfVExfMCAgICAgICAgICAgICAgICAgICA1NAkvKiBjc3QvMiAqLworI2RlZmluZSBSMjAwX0VNSVRfUkVfU0NJU1NPUl9UTF8xICAgICAgICAgICAgICAgICAgIDU1CS8qIGNzdC8yICovCisjZGVmaW5lIFIyMDBfRU1JVF9SRV9TQ0lTU09SX1RMXzIgICAgICAgICAgICAgICAgICAgNTYJLyogY3N0LzIgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1NFX1ZBUF9DTlRMX1NUQVRVUyAgICAgICAgICAgICAgICA1NwkvKiBjc3QvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfU0VfVlRYX1NUQVRFX0NOVEwgICAgICAgICAgICAgICAgIDU4CS8qIGNzdC8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9SRV9QT0lOVFNJWkUgICAgICAgICAgICAgICAgICAgICAgNTkJLyogY3N0LzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1RDTF9JTlBVVF9WVFhfVkVDVE9SX0FERFJfMCAgICAgICA2MAkvKiBjc3QvNCAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMCAgICAgICAgICAgICAgICAgIDYxCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzAgICAgICAgICAgICAgICAgNjIKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzEgICAgICAgICAgICAgICAgICA2MworI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU18xICAgICAgICAgICAgICAgIDY0CisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU18yICAgICAgICAgICAgICAgICAgNjUKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfMiAgICAgICAgICAgICAgICA2NgorI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMyAgICAgICAgICAgICAgICAgIDY3CisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzMgICAgICAgICAgICAgICAgNjgKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzQgICAgICAgICAgICAgICAgICA2OQorI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU180ICAgICAgICAgICAgICAgIDcwCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU181ICAgICAgICAgICAgICAgICAgNzEKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfNSAgICAgICAgICAgICAgICA3MgorI2RlZmluZSBSQURFT05fRU1JVF9QUF9URVhfU0laRV8wICAgICAgICAgICAgICAgICAgIDczCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX1RFWF9TSVpFXzEgICAgICAgICAgICAgICAgICAgNzQKKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfVEVYX1NJWkVfMiAgICAgICAgICAgICAgICAgICA3NQorI2RlZmluZSBSMjAwX0VNSVRfUkIzRF9CTEVORENPTE9SICAgICAgICAgICAgICAgICAgIDc2CisjZGVmaW5lIFIyMDBfRU1JVF9UQ0xfUE9JTlRfU1BSSVRFX0NOVEwgICAgICAgICAgICAgNzcKKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMCAgICAgICAgICAgICAgICA3OAorI2RlZmluZSBSQURFT05fRU1JVF9QUF9DVUJJQ19PRkZTRVRTX1QwICAgICAgICAgICAgIDc5CisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0NVQklDX0ZBQ0VTXzEgICAgICAgICAgICAgICAgODAKKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU19UMSAgICAgICAgICAgICA4MQorI2RlZmluZSBSQURFT05fRU1JVF9QUF9DVUJJQ19GQUNFU18yICAgICAgICAgICAgICAgIDgyCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0NVQklDX09GRlNFVFNfVDIgICAgICAgICAgICAgODMKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RSSV9QRVJGX0NOVEwgICAgICAgICAgICAgICAgICA4NAorI2RlZmluZSBSMjAwX0VNSVRfUFBfQUZTXzAgICAgICAgICAgICAgICAgICAgICAgICAgIDg1CisjZGVmaW5lIFIyMDBfRU1JVF9QUF9BRlNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgODYKKyNkZWZpbmUgUjIwMF9FTUlUX0FURl9URkFDVE9SICAgICAgICAgICAgICAgICAgICAgICA4NworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhDVExBTExfMCAgICAgICAgICAgICAgICAgICAgIDg4CisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENUTEFMTF8xICAgICAgICAgICAgICAgICAgICAgODkKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ1RMQUxMXzIgICAgICAgICAgICAgICAgICAgICA5MAorI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhDVExBTExfMyAgICAgICAgICAgICAgICAgICAgIDkxCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENUTEFMTF80ICAgICAgICAgICAgICAgICAgICAgOTIKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ1RMQUxMXzUgICAgICAgICAgICAgICAgICAgICA5MworI2RlZmluZSBSMjAwX0VNSVRfVkFQX1BWU19DTlRMICAgICAgICAgICAgICAgICAgICAgIDk0CisjZGVmaW5lIFJBREVPTl9NQVhfU1RBVEVfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgOTUKKworLyogQ29tbWFuZHMgdW5kZXJzdG9vZCBieSBjbWRfYnVmZmVyIGlvY3RsLiAgTW9yZSBjYW4gYmUgYWRkZWQgYnV0CisgKiBvYnZpb3VzbHkgdGhlc2UgY2FuJ3QgYmUgcmVtb3ZlZCBvciBjaGFuZ2VkOgorICovCisjZGVmaW5lIFJBREVPTl9DTURfUEFDS0VUICAgICAgMQkvKiBlbWl0IG9uZSBvZiB0aGUgcmVnaXN0ZXIgcGFja2V0cyBhYm92ZSAqLworI2RlZmluZSBSQURFT05fQ01EX1NDQUxBUlMgICAgIDIJLyogZW1pdCBzY2FsYXIgZGF0YSAqLworI2RlZmluZSBSQURFT05fQ01EX1ZFQ1RPUlMgICAgIDMJLyogZW1pdCB2ZWN0b3IgZGF0YSAqLworI2RlZmluZSBSQURFT05fQ01EX0RNQV9ESVNDQVJEIDQJLyogZGlzY2FyZCBjdXJyZW50IGRtYSBidWYgKi8KKyNkZWZpbmUgUkFERU9OX0NNRF9QQUNLRVQzICAgICA1CS8qIGVtaXQgaHcgcGFja2V0ICovCisjZGVmaW5lIFJBREVPTl9DTURfUEFDS0VUM19DTElQIDYJLyogZW1pdCBodyBwYWNrZXQgd3JhcHBlZCBpbiBjbGlwcmVjdHMgKi8KKyNkZWZpbmUgUkFERU9OX0NNRF9TQ0FMQVJTMiAgICAgNwkvKiByMjAwIHN0b3BnYXAgKi8KKyNkZWZpbmUgUkFERU9OX0NNRF9XQUlUICAgICAgICAgOAkvKiBlbWl0IGh3IHdhaXQgY29tbWFuZHMgLS0gbm90ZToKKwkJCQkJICogIGRvZXNuJ3QgbWFrZSB0aGUgY3B1IHdhaXQsIGp1c3QKKwkJCQkJICogIHRoZSBncmFwaGljcyBoYXJkd2FyZSAqLworI2RlZmluZSBSQURFT05fQ01EX1ZFQ0xJTkVBUgk5ICAgICAgIC8qIGFub3RoZXIgcjIwMCBzdG9wZ2FwICovCisKK3R5cGVkZWYgdW5pb24geworCWludCBpOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIHBhZDAsIHBhZDEsIHBhZDI7CisJfSBoZWFkZXI7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgcGFja2V0X2lkLCBwYWQwLCBwYWQxOworCX0gcGFja2V0OworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIG9mZnNldCwgc3RyaWRlLCBjb3VudDsKKwl9IHNjYWxhcnM7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgb2Zmc2V0LCBzdHJpZGUsIGNvdW50OworCX0gdmVjdG9yczsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZF90eXBlLCBhZGRyX2xvLCBhZGRyX2hpLCBjb3VudDsKKwl9IHZlY2xpbmVhcjsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZF90eXBlLCBidWZfaWR4LCBwYWQwLCBwYWQxOworCX0gZG1hOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIGZsYWdzLCBwYWQwLCBwYWQxOworCX0gd2FpdDsKK30gZHJtX3JhZGVvbl9jbWRfaGVhZGVyX3Q7CisKKyNkZWZpbmUgUkFERU9OX1dBSVRfMkQgIDB4MQorI2RlZmluZSBSQURFT05fV0FJVF8zRCAgMHgyCisKKy8qIEFsbG93ZWQgcGFyYW1ldGVycyBmb3IgUjMwMF9DTURfUEFDS0VUMworICovCisjZGVmaW5lIFIzMDBfQ01EX1BBQ0tFVDNfQ0xFQVIJCTAKKyNkZWZpbmUgUjMwMF9DTURfUEFDS0VUM19SQVcJCTEKKworLyogQ29tbWFuZHMgdW5kZXJzdG9vZCBieSBjbWRfYnVmZmVyIGlvY3RsIGZvciBSMzAwLgorICogVGhlIGludGVyZmFjZSBoYXMgbm90IGJlZW4gc3RhYmlsaXplZCwgc28gc29tZSBvZiB0aGVzZSBtYXkgYmUgcmVtb3ZlZAorICogYW5kIGV2ZW50dWFsbHkgcmVvcmRlcmVkIGJlZm9yZSBzdGFiaWxpemF0aW9uLgorICovCisjZGVmaW5lIFIzMDBfQ01EX1BBQ0tFVDAJCTEKKyNkZWZpbmUgUjMwMF9DTURfVlBVCQkJMgkvKiBlbWl0IHZlcnRleCBwcm9ncmFtIHVwbG9hZCAqLworI2RlZmluZSBSMzAwX0NNRF9QQUNLRVQzCQkzCS8qIGVtaXQgYSBwYWNrZXQzICovCisjZGVmaW5lIFIzMDBfQ01EX0VORDNECQkJNAkvKiBlbWl0IHNlcXVlbmNlIGVuZGluZyAzZCByZW5kZXJpbmcgKi8KKyNkZWZpbmUgUjMwMF9DTURfQ1BfREVMQVkJCTUKKyNkZWZpbmUgUjMwMF9DTURfRE1BX0RJU0NBUkQJCTYKKyNkZWZpbmUgUjMwMF9DTURfV0FJVAkJCTcKKyMJZGVmaW5lIFIzMDBfV0FJVF8yRAkJMHgxCisjCWRlZmluZSBSMzAwX1dBSVRfM0QJCTB4MgorLyogdGhlc2UgdHdvIGRlZmluZXMgYXJlIERPSU5HIElUIFdST05HIC0gaG93ZXZlcgorICogd2UgaGF2ZSB1c2Vyc3BhY2Ugd2hpY2ggcmVsaWVzIG9uIHVzaW5nIHRoZXNlLgorICogVGhlIHdhaXQgaW50ZXJmYWNlIGlzIGJhY2t3YXJkcyBjb21wYXQgbmV3IAorICogY29kZSBzaG91bGQgdXNlIHRoZSBORVdfV0FJVCBkZWZpbmVzIGJlbG93CisgKiBUSEVTRSBBUkUgTk9UIEJJVCBGSUVMRFMKKyAqLworIwlkZWZpbmUgUjMwMF9XQUlUXzJEX0NMRUFOCTB4MworIwlkZWZpbmUgUjMwMF9XQUlUXzNEX0NMRUFOCTB4NAorCisjCWRlZmluZSBSMzAwX05FV19XQUlUXzJEXzNECTB4MworIwlkZWZpbmUgUjMwMF9ORVdfV0FJVF8yRF8yRF9DTEVBTgkweDQKKyMJZGVmaW5lIFIzMDBfTkVXX1dBSVRfM0RfM0RfQ0xFQU4JMHg2CisjCWRlZmluZSBSMzAwX05FV19XQUlUXzJEXzJEX0NMRUFOXzNEXzNEX0NMRUFOCTB4OAorCisjZGVmaW5lIFIzMDBfQ01EX1NDUkFUQ0gJCTgKKyNkZWZpbmUgUjMwMF9DTURfUjUwMEZQICAgICAgICAgICAgICAgICA5CisKK3R5cGVkZWYgdW5pb24geworCXVuc2lnbmVkIGludCB1OworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIHBhZDAsIHBhZDEsIHBhZDI7CisJfSBoZWFkZXI7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgY291bnQsIHJlZ2xvLCByZWdoaTsKKwl9IHBhY2tldDA7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgY291bnQsIGFkcmxvLCBhZHJoaTsKKwl9IHZwdTsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZF90eXBlLCBwYWNrZXQsIHBhZDAsIHBhZDE7CisJfSBwYWNrZXQzOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIHBhY2tldDsKKwkJdW5zaWduZWQgc2hvcnQgY291bnQ7CS8qIGFtb3VudCBvZiBwYWNrZXQyIHRvIGVtaXQgKi8KKwl9IGRlbGF5OworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIGJ1Zl9pZHgsIHBhZDAsIHBhZDE7CisJfSBkbWE7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgZmxhZ3MsIHBhZDAsIHBhZDE7CisJfSB3YWl0OworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIHJlZywgbl9idWZzLCBmbGFnczsKKwl9IHNjcmF0Y2g7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgY291bnQsIGFkcmxvLCBhZHJoaV9mbGFnczsKKwl9IHI1MDBmcDsKK30gZHJtX3IzMDBfY21kX2hlYWRlcl90OworCisjZGVmaW5lIFJBREVPTl9GUk9OVAkJCTB4MQorI2RlZmluZSBSQURFT05fQkFDSwkJCTB4MgorI2RlZmluZSBSQURFT05fREVQVEgJCQkweDQKKyNkZWZpbmUgUkFERU9OX1NURU5DSUwJCQkweDgKKyNkZWZpbmUgUkFERU9OX0NMRUFSX0ZBU1RaCQkweDgwMDAwMDAwCisjZGVmaW5lIFJBREVPTl9VU0VfSElFUloJCTB4NDAwMDAwMDAKKyNkZWZpbmUgUkFERU9OX1VTRV9DT01QX1pCVUYJCTB4MjAwMDAwMDAKKworI2RlZmluZSBSNTAwRlBfQ09OU1RBTlRfVFlQRSAgKDEgPDwgMSkKKyNkZWZpbmUgUjUwMEZQX0NPTlNUQU5UX0NMQU1QICgxIDw8IDIpCisKKy8qIFByaW1pdGl2ZSB0eXBlcworICovCisjZGVmaW5lIFJBREVPTl9QT0lOVFMJCQkweDEKKyNkZWZpbmUgUkFERU9OX0xJTkVTCQkJMHgyCisjZGVmaW5lIFJBREVPTl9MSU5FX1NUUklQCQkweDMKKyNkZWZpbmUgUkFERU9OX1RSSUFOR0xFUwkJMHg0CisjZGVmaW5lIFJBREVPTl9UUklBTkdMRV9GQU4JCTB4NQorI2RlZmluZSBSQURFT05fVFJJQU5HTEVfU1RSSVAJCTB4NgorCisvKiBWZXJ0ZXgvaW5kaXJlY3QgYnVmZmVyIHNpemUKKyAqLworI2RlZmluZSBSQURFT05fQlVGRkVSX1NJWkUJCTY1NTM2CisKKy8qIEJ5dGUgb2Zmc2V0cyBmb3IgaW5kaXJlY3QgYnVmZmVyIGRhdGEKKyAqLworI2RlZmluZSBSQURFT05fSU5ERVhfUFJJTV9PRkZTRVQJMjAKKworI2RlZmluZSBSQURFT05fU0NSQVRDSF9SRUdfT0ZGU0VUCTMyCisKKyNkZWZpbmUgUjYwMF9TQ1JBVENIX1JFR19PRkZTRVQgICAgICAgICAyNTYKKworI2RlZmluZSBSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTCTEyCisKKy8qIFRoZXJlIGFyZSAyIGhlYXBzIChsb2NhbC9HQVJUKS4gIEVhY2ggcmVnaW9uIHdpdGhpbiBhIGhlYXAgaXMgYQorICogbWluaW11bSBvZiA2NGssIGFuZCB0aGVyZSBhcmUgYXQgbW9zdCA2NCBvZiB0aGVtIHBlciBoZWFwLgorICovCisjZGVmaW5lIFJBREVPTl9MT0NBTF9URVhfSEVBUAkJMAorI2RlZmluZSBSQURFT05fR0FSVF9URVhfSEVBUAkJMQorI2RlZmluZSBSQURFT05fTlJfVEVYX0hFQVBTCQkyCisjZGVmaW5lIFJBREVPTl9OUl9URVhfUkVHSU9OUwkJNjQKKyNkZWZpbmUgUkFERU9OX0xPR19URVhfR1JBTlVMQVJJVFkJMTYKKworI2RlZmluZSBSQURFT05fTUFYX1RFWFRVUkVfTEVWRUxTCTEyCisjZGVmaW5lIFJBREVPTl9NQVhfVEVYVFVSRV9VTklUUwkzCisKKyNkZWZpbmUgUkFERU9OX01BWF9TVVJGQUNFUwkJOAorCisvKiBCbGl0cyBoYXZlIHN0cmljdCBvZmZzZXQgcnVsZXMuICBBbGwgYmxpdCBvZmZzZXQgbXVzdCBiZSBhbGlnbmVkIG9uCisgKiBhIDFLLWJ5dGUgYm91bmRhcnkuCisgKi8KKyNkZWZpbmUgUkFERU9OX09GRlNFVF9TSElGVCAgICAgICAgICAgICAxMAorI2RlZmluZSBSQURFT05fT0ZGU0VUX0FMSUdOICAgICAgICAgICAgICgxIDw8IFJBREVPTl9PRkZTRVRfU0hJRlQpCisjZGVmaW5lIFJBREVPTl9PRkZTRVRfTUFTSyAgICAgICAgICAgICAgKFJBREVPTl9PRkZTRVRfQUxJR04gLSAxKQorCisjZW5kaWYJCQkJLyogX19SQURFT05fU0FSRUFfREVGSU5FU19fICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgcmVkOworCXVuc2lnbmVkIGludCBncmVlbjsKKwl1bnNpZ25lZCBpbnQgYmx1ZTsKKwl1bnNpZ25lZCBpbnQgYWxwaGE7Cit9IHJhZGVvbl9jb2xvcl9yZWdzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBDb250ZXh0IHN0YXRlICovCisJdW5zaWduZWQgaW50IHBwX21pc2M7CS8qIDB4MWMxNCAqLworCXVuc2lnbmVkIGludCBwcF9mb2dfY29sb3I7CisJdW5zaWduZWQgaW50IHJlX3NvbGlkX2NvbG9yOworCXVuc2lnbmVkIGludCByYjNkX2JsZW5kY250bDsKKwl1bnNpZ25lZCBpbnQgcmIzZF9kZXB0aG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgcmIzZF9kZXB0aHBpdGNoOworCXVuc2lnbmVkIGludCByYjNkX3pzdGVuY2lsY250bDsKKworCXVuc2lnbmVkIGludCBwcF9jbnRsOwkvKiAweDFjMzggKi8KKwl1bnNpZ25lZCBpbnQgcmIzZF9jbnRsOworCXVuc2lnbmVkIGludCByYjNkX2NvbG9yb2Zmc2V0OworCXVuc2lnbmVkIGludCByZV93aWR0aF9oZWlnaHQ7CisJdW5zaWduZWQgaW50IHJiM2RfY29sb3JwaXRjaDsKKwl1bnNpZ25lZCBpbnQgc2VfY250bDsKKworCS8qIFZlcnRleCBmb3JtYXQgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgc2VfY29vcmRfZm10OwkvKiAweDFjNTAgKi8KKworCS8qIExpbmUgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgcmVfbGluZV9wYXR0ZXJuOwkvKiAweDFjZDAgKi8KKwl1bnNpZ25lZCBpbnQgcmVfbGluZV9zdGF0ZTsKKworCXVuc2lnbmVkIGludCBzZV9saW5lX3dpZHRoOwkvKiAweDFkYjggKi8KKworCS8qIEJ1bXBtYXAgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgcHBfbHVtX21hdHJpeDsJLyogMHgxZDAwICovCisKKwl1bnNpZ25lZCBpbnQgcHBfcm90X21hdHJpeF8wOwkvKiAweDFkNTggKi8KKwl1bnNpZ25lZCBpbnQgcHBfcm90X21hdHJpeF8xOworCisJLyogTWFzayBzdGF0ZSAqLworCXVuc2lnbmVkIGludCByYjNkX3N0ZW5jaWxyZWZtYXNrOwkvKiAweDFkN2MgKi8KKwl1bnNpZ25lZCBpbnQgcmIzZF9yb3BjbnRsOworCXVuc2lnbmVkIGludCByYjNkX3BsYW5lbWFzazsKKworCS8qIFZpZXdwb3J0IHN0YXRlICovCisJdW5zaWduZWQgaW50IHNlX3Zwb3J0X3hzY2FsZTsJLyogMHgxZDk4ICovCisJdW5zaWduZWQgaW50IHNlX3Zwb3J0X3hvZmZzZXQ7CisJdW5zaWduZWQgaW50IHNlX3Zwb3J0X3lzY2FsZTsKKwl1bnNpZ25lZCBpbnQgc2VfdnBvcnRfeW9mZnNldDsKKwl1bnNpZ25lZCBpbnQgc2VfdnBvcnRfenNjYWxlOworCXVuc2lnbmVkIGludCBzZV92cG9ydF96b2Zmc2V0OworCisJLyogU2V0dXAgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgc2VfY250bF9zdGF0dXM7CS8qIDB4MjE0MCAqLworCisJLyogTWlzYyBzdGF0ZSAqLworCXVuc2lnbmVkIGludCByZV90b3BfbGVmdDsJLyogMHgyNmMwICovCisJdW5zaWduZWQgaW50IHJlX21pc2M7Cit9IGRybV9yYWRlb25fY29udGV4dF9yZWdzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBaYmlhcyBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBzZV96Ymlhc19mYWN0b3I7CS8qIDB4MWRhYyAqLworCXVuc2lnbmVkIGludCBzZV96Ymlhc19jb25zdGFudDsKK30gZHJtX3JhZGVvbl9jb250ZXh0Ml9yZWdzX3Q7CisKKy8qIFNldHVwIHJlZ2lzdGVycyBmb3IgZWFjaCB0ZXh0dXJlIHVuaXQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBwcF90eGZpbHRlcjsKKwl1bnNpZ25lZCBpbnQgcHBfdHhmb3JtYXQ7CisJdW5zaWduZWQgaW50IHBwX3R4b2Zmc2V0OworCXVuc2lnbmVkIGludCBwcF90eGNibGVuZDsKKwl1bnNpZ25lZCBpbnQgcHBfdHhhYmxlbmQ7CisJdW5zaWduZWQgaW50IHBwX3RmYWN0b3I7CisJdW5zaWduZWQgaW50IHBwX2JvcmRlcl9jb2xvcjsKK30gZHJtX3JhZGVvbl90ZXh0dXJlX3JlZ3NfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzdGFydDsKKwl1bnNpZ25lZCBpbnQgZmluaXNoOworCXVuc2lnbmVkIGludCBwcmltOjg7CisJdW5zaWduZWQgaW50IHN0YXRlaWR4Ojg7CisJdW5zaWduZWQgaW50IG51bXZlcnRzOjE2OwkvKiBvdmVybG9hZGVkIGFzIG9mZnNldC82NCBmb3IgZWx0IHByaW1zICovCisJdW5zaWduZWQgaW50IHZjX2Zvcm1hdDsJLyogdmVydGV4IGZvcm1hdCAqLworfSBkcm1fcmFkZW9uX3ByaW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWRybV9yYWRlb25fY29udGV4dF9yZWdzX3QgY29udGV4dDsKKwlkcm1fcmFkZW9uX3RleHR1cmVfcmVnc190IHRleFtSQURFT05fTUFYX1RFWFRVUkVfVU5JVFNdOworCWRybV9yYWRlb25fY29udGV4dDJfcmVnc190IGNvbnRleHQyOworCXVuc2lnbmVkIGludCBkaXJ0eTsKK30gZHJtX3JhZGVvbl9zdGF0ZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisJLyogVGhlIGNoYW5uZWwgZm9yIGNvbW11bmljYXRpb24gb2Ygc3RhdGUgaW5mb3JtYXRpb24gdG8gdGhlCisJICoga2VybmVsIG9uIGZpcmluZyBhIHZlcnRleCBidWZmZXIgd2l0aCBlaXRoZXIgb2YgdGhlCisJICogb2Jzb2xldGVkIHZlcnRleC9pbmRleCBpb2N0bHMuCisJICovCisJZHJtX3JhZGVvbl9jb250ZXh0X3JlZ3NfdCBjb250ZXh0X3N0YXRlOworCWRybV9yYWRlb25fdGV4dHVyZV9yZWdzX3QgdGV4X3N0YXRlW1JBREVPTl9NQVhfVEVYVFVSRV9VTklUU107CisJdW5zaWduZWQgaW50IGRpcnR5OworCXVuc2lnbmVkIGludCB2ZXJ0c2l6ZTsKKwl1bnNpZ25lZCBpbnQgdmNfZm9ybWF0OworCisJLyogVGhlIGN1cnJlbnQgY2xpcHJlY3RzLCBvciBhIHN1YnNldCB0aGVyZW9mLgorCSAqLworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGJveGVzW1JBREVPTl9OUl9TQVJFQV9DTElQUkVDVFNdOworCXVuc2lnbmVkIGludCBuYm94OworCisJLyogQ291bnRlcnMgZm9yIGNsaWVudC1zaWRlIHRocm90dGxpbmcgb2YgcmVuZGVyaW5nIGNsaWVudHMuCisJICovCisJdW5zaWduZWQgaW50IGxhc3RfZnJhbWU7CisJdW5zaWduZWQgaW50IGxhc3RfZGlzcGF0Y2g7CisJdW5zaWduZWQgaW50IGxhc3RfY2xlYXI7CisKKwlzdHJ1Y3QgZHJtX3RleF9yZWdpb24gdGV4X2xpc3RbUkFERU9OX05SX1RFWF9IRUFQU11bUkFERU9OX05SX1RFWF9SRUdJT05TICsKKwkJCQkJCSAgICAgICAxXTsKKwl1bnNpZ25lZCBpbnQgdGV4X2FnZVtSQURFT05fTlJfVEVYX0hFQVBTXTsKKwlpbnQgY3R4X293bmVyOworCWludCBwZlN0YXRlOwkJLyogbnVtYmVyIG9mIDNkIHdpbmRvd3MgKDAsMSwyb3Jtb3JlKSAqLworCWludCBwZkN1cnJlbnRQYWdlOwkvKiB3aGljaCBidWZmZXIgaXMgYmVpbmcgZGlzcGxheWVkPyAqLworCWludCBjcnRjMl9iYXNlOwkJLyogQ1JUQzIgZnJhbWUgb2Zmc2V0ICovCisJaW50IHRpbGluZ19lbmFibGVkOwkvKiBzZXQgYnkgZHJtLCByZWFkIGJ5IDJkICsgM2QgY2xpZW50cyAqLworfSBkcm1fcmFkZW9uX3NhcmVhX3Q7CisKKy8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlIGRlZmluZXMsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlCisgKiBkZWZpbmVzIGluIHRoZSBYc2VydmVyIGZpbGUgKHhmODZkcm1SYWRlb24uaCkKKyAqCisgKiBLVzogYWN0dWFsbHkgaXQncyBpbGxlZ2FsIHRvIGNoYW5nZSBhbnkgb2YgdGhpcyAoYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpLgorICovCisKKy8qIFJhZGVvbiBzcGVjaWZpYyBpb2N0bHMKKyAqIFRoZSBkZXZpY2Ugc3BlY2lmaWMgaW9jdGwgcmFuZ2UgaXMgMHg0MCB0byAweDc5LgorICovCisjZGVmaW5lIERSTV9SQURFT05fQ1BfSU5JVCAgICAweDAwCisjZGVmaW5lIERSTV9SQURFT05fQ1BfU1RBUlQgICAweDAxCisjZGVmaW5lIERSTV9SQURFT05fQ1BfU1RPUCAgICAweDAyCisjZGVmaW5lIERSTV9SQURFT05fQ1BfUkVTRVQgICAweDAzCisjZGVmaW5lIERSTV9SQURFT05fQ1BfSURMRSAgICAweDA0CisjZGVmaW5lIERSTV9SQURFT05fUkVTRVQgICAgICAweDA1CisjZGVmaW5lIERSTV9SQURFT05fRlVMTFNDUkVFTiAweDA2CisjZGVmaW5lIERSTV9SQURFT05fU1dBUCAgICAgICAweDA3CisjZGVmaW5lIERSTV9SQURFT05fQ0xFQVIgICAgICAweDA4CisjZGVmaW5lIERSTV9SQURFT05fVkVSVEVYICAgICAweDA5CisjZGVmaW5lIERSTV9SQURFT05fSU5ESUNFUyAgICAweDBBCisjZGVmaW5lIERSTV9SQURFT05fTk9UX1VTRUQKKyNkZWZpbmUgRFJNX1JBREVPTl9TVElQUExFICAgIDB4MEMKKyNkZWZpbmUgRFJNX1JBREVPTl9JTkRJUkVDVCAgIDB4MEQKKyNkZWZpbmUgRFJNX1JBREVPTl9URVhUVVJFICAgIDB4MEUKKyNkZWZpbmUgRFJNX1JBREVPTl9WRVJURVgyICAgIDB4MEYKKyNkZWZpbmUgRFJNX1JBREVPTl9DTURCVUYgICAgIDB4MTAKKyNkZWZpbmUgRFJNX1JBREVPTl9HRVRQQVJBTSAgIDB4MTEKKyNkZWZpbmUgRFJNX1JBREVPTl9GTElQICAgICAgIDB4MTIKKyNkZWZpbmUgRFJNX1JBREVPTl9BTExPQyAgICAgIDB4MTMKKyNkZWZpbmUgRFJNX1JBREVPTl9GUkVFICAgICAgIDB4MTQKKyNkZWZpbmUgRFJNX1JBREVPTl9JTklUX0hFQVAgIDB4MTUKKyNkZWZpbmUgRFJNX1JBREVPTl9JUlFfRU1JVCAgIDB4MTYKKyNkZWZpbmUgRFJNX1JBREVPTl9JUlFfV0FJVCAgIDB4MTcKKyNkZWZpbmUgRFJNX1JBREVPTl9DUF9SRVNVTUUgIDB4MTgKKyNkZWZpbmUgRFJNX1JBREVPTl9TRVRQQVJBTSAgIDB4MTkKKyNkZWZpbmUgRFJNX1JBREVPTl9TVVJGX0FMTE9DIDB4MWEKKyNkZWZpbmUgRFJNX1JBREVPTl9TVVJGX0ZSRUUgIDB4MWIKKy8qIEtNUyBpb2N0bCAqLworI2RlZmluZSBEUk1fUkFERU9OX0dFTV9JTkZPCQkweDFjCisjZGVmaW5lIERSTV9SQURFT05fR0VNX0NSRUFURQkJMHgxZAorI2RlZmluZSBEUk1fUkFERU9OX0dFTV9NTUFQCQkweDFlCisjZGVmaW5lIERSTV9SQURFT05fR0VNX1BSRUFECQkweDIxCisjZGVmaW5lIERSTV9SQURFT05fR0VNX1BXUklURQkJMHgyMgorI2RlZmluZSBEUk1fUkFERU9OX0dFTV9TRVRfRE9NQUlOCTB4MjMKKyNkZWZpbmUgRFJNX1JBREVPTl9HRU1fV0FJVF9JRExFCTB4MjQKKyNkZWZpbmUgRFJNX1JBREVPTl9DUwkJCTB4MjYKKyNkZWZpbmUgRFJNX1JBREVPTl9JTkZPCQkJMHgyNworI2RlZmluZSBEUk1fUkFERU9OX0dFTV9TRVRfVElMSU5HCTB4MjgKKyNkZWZpbmUgRFJNX1JBREVPTl9HRU1fR0VUX1RJTElORwkweDI5CisjZGVmaW5lIERSTV9SQURFT05fR0VNX0JVU1kJCTB4MmEKKyNkZWZpbmUgRFJNX1JBREVPTl9HRU1fVkEJCTB4MmIKKyNkZWZpbmUgRFJNX1JBREVPTl9HRU1fT1AJCTB4MmMKKyNkZWZpbmUgRFJNX1JBREVPTl9HRU1fVVNFUlBUUgkJMHgyZAorCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fQ1BfSU5JVCAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9DUF9JTklULCBkcm1fcmFkZW9uX2luaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9DUF9TVEFSVCAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0NQX1NUQVJUKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0NQX1NUT1AgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fQ1BfU1RPUCwgZHJtX3JhZGVvbl9jcF9zdG9wX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fQ1BfUkVTRVQgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9DUF9SRVNFVCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9DUF9JRExFICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0NQX0lETEUpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fUkVTRVQgICAgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9SRVNFVCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9GVUxMU0NSRUVOIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0ZVTExTQ1JFRU4sIGRybV9yYWRlb25fZnVsbHNjcmVlbl90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX1NXQVAgICAgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fU1dBUCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9DTEVBUiAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0NMRUFSLCBkcm1fcmFkZW9uX2NsZWFyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fVkVSVEVYICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9WRVJURVgsIGRybV9yYWRlb25fdmVydGV4X3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fSU5ESUNFUyAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9JTkRJQ0VTLCBkcm1fcmFkZW9uX2luZGljZXNfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9TVElQUExFICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX1NUSVBQTEUsIGRybV9yYWRlb25fc3RpcHBsZV90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0lORElSRUNUICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fSU5ESVJFQ1QsIGRybV9yYWRlb25faW5kaXJlY3RfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9URVhUVVJFICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX1RFWFRVUkUsIGRybV9yYWRlb25fdGV4dHVyZV90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX1ZFUlRFWDIgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fVkVSVEVYMiwgZHJtX3JhZGVvbl92ZXJ0ZXgyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fQ01EQlVGICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9DTURCVUYsIGRybV9yYWRlb25fY21kX2J1ZmZlcl90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0dFVFBBUkFNICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fR0VUUEFSQU0sIGRybV9yYWRlb25fZ2V0cGFyYW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9GTElQICAgICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0ZMSVApCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fQUxMT0MgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9BTExPQywgZHJtX3JhZGVvbl9tZW1fYWxsb2NfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9GUkVFICAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0ZSRUUsIGRybV9yYWRlb25fbWVtX2ZyZWVfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9JTklUX0hFQVAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0lOSVRfSEVBUCwgZHJtX3JhZGVvbl9tZW1faW5pdF9oZWFwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fSVJRX0VNSVQgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9JUlFfRU1JVCwgZHJtX3JhZGVvbl9pcnFfZW1pdF90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0lSUV9XQUlUICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fSVJRX1dBSVQsIGRybV9yYWRlb25faXJxX3dhaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9DUF9SRVNVTUUgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0NQX1JFU1VNRSkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9TRVRQQVJBTSAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX1NFVFBBUkFNLCBkcm1fcmFkZW9uX3NldHBhcmFtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fU1VSRl9BTExPQyBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9TVVJGX0FMTE9DLCBkcm1fcmFkZW9uX3N1cmZhY2VfYWxsb2NfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9TVVJGX0ZSRUUgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX1NVUkZfRlJFRSwgZHJtX3JhZGVvbl9zdXJmYWNlX2ZyZWVfdCkKKy8qIEtNUyAqLworI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0dFTV9JTkZPCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0dFTV9JTkZPLCBzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1faW5mbykKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9HRU1fQ1JFQVRFCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0dFTV9DUkVBVEUsIHN0cnVjdCBkcm1fcmFkZW9uX2dlbV9jcmVhdGUpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fR0VNX01NQVAJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fR0VNX01NQVAsIHN0cnVjdCBkcm1fcmFkZW9uX2dlbV9tbWFwKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0dFTV9QUkVBRAlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9HRU1fUFJFQUQsIHN0cnVjdCBkcm1fcmFkZW9uX2dlbV9wcmVhZCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9HRU1fUFdSSVRFCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0dFTV9QV1JJVEUsIHN0cnVjdCBkcm1fcmFkZW9uX2dlbV9wd3JpdGUpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fR0VNX1NFVF9ET01BSU4JRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fR0VNX1NFVF9ET01BSU4sIHN0cnVjdCBkcm1fcmFkZW9uX2dlbV9zZXRfZG9tYWluKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0dFTV9XQUlUX0lETEUJRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9HRU1fV0FJVF9JRExFLCBzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fd2FpdF9pZGxlKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0NTCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9DUywgc3RydWN0IGRybV9yYWRlb25fY3MpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fSU5GTwkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fSU5GTywgc3RydWN0IGRybV9yYWRlb25faW5mbykKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9HRU1fU0VUX1RJTElORwlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9HRU1fU0VUX1RJTElORywgc3RydWN0IGRybV9yYWRlb25fZ2VtX3NldF90aWxpbmcpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fR0VNX0dFVF9USUxJTkcJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fR0VNX0dFVF9USUxJTkcsIHN0cnVjdCBkcm1fcmFkZW9uX2dlbV9nZXRfdGlsaW5nKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0dFTV9CVVNZCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0dFTV9CVVNZLCBzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fYnVzeSkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9HRU1fVkEJCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0dFTV9WQSwgc3RydWN0IGRybV9yYWRlb25fZ2VtX3ZhKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0dFTV9PUAkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fR0VNX09QLCBzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fb3ApCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fR0VNX1VTRVJQVFIJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fR0VNX1VTRVJQVFIsIHN0cnVjdCBkcm1fcmFkZW9uX2dlbV91c2VycHRyKQorCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2luaXQgeworCWVudW0geworCQlSQURFT05fSU5JVF9DUCA9IDB4MDEsCisJCVJBREVPTl9DTEVBTlVQX0NQID0gMHgwMiwKKwkJUkFERU9OX0lOSVRfUjIwMF9DUCA9IDB4MDMsCisJCVJBREVPTl9JTklUX1IzMDBfQ1AgPSAweDA0LAorCQlSQURFT05fSU5JVF9SNjAwX0NQID0gMHgwNQorCX0gZnVuYzsKKwl1bnNpZ25lZCBsb25nIHNhcmVhX3ByaXZfb2Zmc2V0OworCWludCBpc19wY2k7CisJaW50IGNwX21vZGU7CisJaW50IGdhcnRfc2l6ZTsKKwlpbnQgcmluZ19zaXplOworCWludCB1c2VjX3RpbWVvdXQ7CisKKwl1bnNpZ25lZCBpbnQgZmJfYnBwOworCXVuc2lnbmVkIGludCBmcm9udF9vZmZzZXQsIGZyb250X3BpdGNoOworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldCwgYmFja19waXRjaDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfYnBwOworCXVuc2lnbmVkIGludCBkZXB0aF9vZmZzZXQsIGRlcHRoX3BpdGNoOworCisJdW5zaWduZWQgbG9uZyBmYl9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBtbWlvX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHJpbmdfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgcmluZ19ycHRyX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcnNfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgZ2FydF90ZXh0dXJlc19vZmZzZXQ7Cit9IGRybV9yYWRlb25faW5pdF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2NwX3N0b3AgeworCWludCBmbHVzaDsKKwlpbnQgaWRsZTsKK30gZHJtX3JhZGVvbl9jcF9zdG9wX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fZnVsbHNjcmVlbiB7CisJZW51bSB7CisJCVJBREVPTl9JTklUX0ZVTExTQ1JFRU4gPSAweDAxLAorCQlSQURFT05fQ0xFQU5VUF9GVUxMU0NSRUVOID0gMHgwMgorCX0gZnVuYzsKK30gZHJtX3JhZGVvbl9mdWxsc2NyZWVuX3Q7CisKKyNkZWZpbmUgQ0xFQVJfWDEJMAorI2RlZmluZSBDTEVBUl9ZMQkxCisjZGVmaW5lIENMRUFSX1gyCTIKKyNkZWZpbmUgQ0xFQVJfWTIJMworI2RlZmluZSBDTEVBUl9ERVBUSAk0CisKK3R5cGVkZWYgdW5pb24gZHJtX3JhZGVvbl9jbGVhcl9yZWN0IHsKKwlmbG9hdCBmWzVdOworCXVuc2lnbmVkIGludCB1aVs1XTsKK30gZHJtX3JhZGVvbl9jbGVhcl9yZWN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fY2xlYXIgeworCXVuc2lnbmVkIGludCBmbGFnczsKKwl1bnNpZ25lZCBpbnQgY2xlYXJfY29sb3I7CisJdW5zaWduZWQgaW50IGNsZWFyX2RlcHRoOworCXVuc2lnbmVkIGludCBjb2xvcl9tYXNrOworCXVuc2lnbmVkIGludCBkZXB0aF9tYXNrOwkvKiBtaXNuYW1lZCBmaWVsZDogIHNob3VsZCBiZSBzdGVuY2lsICovCisJZHJtX3JhZGVvbl9jbGVhcl9yZWN0X3QgKmRlcHRoX2JveGVzOworfSBkcm1fcmFkZW9uX2NsZWFyX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fdmVydGV4IHsKKwlpbnQgcHJpbTsKKwlpbnQgaWR4OwkJLyogSW5kZXggb2YgdmVydGV4IGJ1ZmZlciAqLworCWludCBjb3VudDsJCS8qIE51bWJlciBvZiB2ZXJ0aWNlcyBpbiBidWZmZXIgKi8KKwlpbnQgZGlzY2FyZDsJCS8qIENsaWVudCBmaW5pc2hlZCB3aXRoIGJ1ZmZlcj8gKi8KK30gZHJtX3JhZGVvbl92ZXJ0ZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9pbmRpY2VzIHsKKwlpbnQgcHJpbTsKKwlpbnQgaWR4OworCWludCBzdGFydDsKKwlpbnQgZW5kOworCWludCBkaXNjYXJkOwkJLyogQ2xpZW50IGZpbmlzaGVkIHdpdGggYnVmZmVyPyAqLworfSBkcm1fcmFkZW9uX2luZGljZXNfdDsKKworLyogdjEuMiAtIG9ic29sZXRlcyBkcm1fcmFkZW9uX3ZlcnRleCBhbmQgZHJtX3JhZGVvbl9pbmRpY2VzCisgKiAgICAgIC0gYWxsb3dzIG11bHRpcGxlIHByaW1pdGl2ZXMgYW5kIHN0YXRlIGNoYW5nZXMgaW4gYSBzaW5nbGUgaW9jdGwKKyAqICAgICAgLSBzdXBwb3J0cyBkcml2ZXIgY2hhbmdlIHRvIGVtaXQgbmF0aXZlIHByaW1pdGl2ZXMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl92ZXJ0ZXgyIHsKKwlpbnQgaWR4OwkJLyogSW5kZXggb2YgdmVydGV4IGJ1ZmZlciAqLworCWludCBkaXNjYXJkOwkJLyogQ2xpZW50IGZpbmlzaGVkIHdpdGggYnVmZmVyPyAqLworCWludCBucl9zdGF0ZXM7CisJZHJtX3JhZGVvbl9zdGF0ZV90ICpzdGF0ZTsKKwlpbnQgbnJfcHJpbXM7CisJZHJtX3JhZGVvbl9wcmltX3QgKnByaW07Cit9IGRybV9yYWRlb25fdmVydGV4Ml90OworCisvKiB2MS4zIC0gb2Jzb2xldGVzIGRybV9yYWRlb25fdmVydGV4MgorICogICAgICAtIGFsbG93cyBhcmJpdHJhcmlseSBsYXJnZSBjbGlwcmVjdCBsaXN0CisgKiAgICAgIC0gYWxsb3dzIHVwZGF0aW5nIG9mIHRjbCBwYWNrZXQsIHZlY3RvciBhbmQgc2NhbGFyIHN0YXRlCisgKiAgICAgIC0gYWxsb3dzIG1lbW9yeS1lZmZpY2llbnQgZGVzY3JpcHRpb24gb2Ygc3RhdGUgdXBkYXRlcworICogICAgICAtIGFsbG93cyBzdGF0ZSB0byBiZSBlbWl0dGVkIHdpdGhvdXQgYSBwcmltaXRpdmUKKyAqICAgICAgICAgICAoZm9yIGNsZWFycywgY3R4IHN3aXRjaGVzKQorICogICAgICAtIGFsbG93cyBtb3JlIHRoYW4gb25lIGRtYSBidWZmZXIgdG8gYmUgcmVmZXJlbmNlZCBwZXIgaW9jdGwKKyAqICAgICAgLSBzdXBwb3J0cyB0Y2wgZHJpdmVyCisgKiAgICAgIC0gbWF5IGJlIGV4dGVuZGVkIGluIGZ1dHVyZSB2ZXJzaW9ucyB3aXRoIG5ldyBjbWQgdHlwZXMsIHBhY2tldHMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9jbWRfYnVmZmVyIHsKKwlpbnQgYnVmc3o7CisJY2hhciAqYnVmOworCWludCBuYm94OworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpib3hlczsKK30gZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fdGV4X2ltYWdlIHsKKwl1bnNpZ25lZCBpbnQgeCwgeTsJLyogQmxpdCBjb29yZGluYXRlcyAqLworCXVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0OworCWNvbnN0IHZvaWQgKmRhdGE7Cit9IGRybV9yYWRlb25fdGV4X2ltYWdlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fdGV4dHVyZSB7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwlpbnQgcGl0Y2g7CisJaW50IGZvcm1hdDsKKwlpbnQgd2lkdGg7CQkvKiBUZXh0dXJlIGltYWdlIGNvb3JkaW5hdGVzICovCisJaW50IGhlaWdodDsKKwlkcm1fcmFkZW9uX3RleF9pbWFnZV90ICppbWFnZTsKK30gZHJtX3JhZGVvbl90ZXh0dXJlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fc3RpcHBsZSB7CisJdW5zaWduZWQgaW50ICptYXNrOworfSBkcm1fcmFkZW9uX3N0aXBwbGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9pbmRpcmVjdCB7CisJaW50IGlkeDsKKwlpbnQgc3RhcnQ7CisJaW50IGVuZDsKKwlpbnQgZGlzY2FyZDsKK30gZHJtX3JhZGVvbl9pbmRpcmVjdF90OworCisvKiBlbnVtIGZvciBjYXJkIHR5cGUgcGFyYW1ldGVycyAqLworI2RlZmluZSBSQURFT05fQ0FSRF9QQ0kgMAorI2RlZmluZSBSQURFT05fQ0FSRF9BR1AgMQorI2RlZmluZSBSQURFT05fQ0FSRF9QQ0lFIDIKKworLyogMS4zOiBBbiBpb2N0bCB0byBnZXQgcGFyYW1ldGVycyB0aGF0IGFyZW4ndCBhdmFpbGFibGUgdG8gdGhlIDNkCisgKiBjbGllbnQgYW55IG90aGVyIHdheS4KKyAqLworI2RlZmluZSBSQURFT05fUEFSQU1fR0FSVF9CVUZGRVJfT0ZGU0VUICAgIDEJLyogY2FyZCBvZmZzZXQgb2YgMXN0IEdBUlQgYnVmZmVyICovCisjZGVmaW5lIFJBREVPTl9QQVJBTV9MQVNUX0ZSQU1FICAgICAgICAgICAgMgorI2RlZmluZSBSQURFT05fUEFSQU1fTEFTVF9ESVNQQVRDSCAgICAgICAgIDMKKyNkZWZpbmUgUkFERU9OX1BBUkFNX0xBU1RfQ0xFQVIgICAgICAgICAgICA0CisvKiBBZGRlZCB3aXRoIERSTSB2ZXJzaW9uIDEuNi4gKi8KKyNkZWZpbmUgUkFERU9OX1BBUkFNX0lSUV9OUiAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFJBREVPTl9QQVJBTV9HQVJUX0JBU0UgICAgICAgICAgICAgNgkvKiBjYXJkIG9mZnNldCBvZiBHQVJUIGJhc2UgKi8KKy8qIEFkZGVkIHdpdGggRFJNIHZlcnNpb24gMS44LiAqLworI2RlZmluZSBSQURFT05fUEFSQU1fUkVHSVNURVJfSEFORExFICAgICAgIDcJLyogZm9yIGRybU1hcCgpICovCisjZGVmaW5lIFJBREVPTl9QQVJBTV9TVEFUVVNfSEFORExFICAgICAgICAgOAorI2RlZmluZSBSQURFT05fUEFSQU1fU0FSRUFfSEFORExFICAgICAgICAgIDkKKyNkZWZpbmUgUkFERU9OX1BBUkFNX0dBUlRfVEVYX0hBTkRMRSAgICAgICAxMAorI2RlZmluZSBSQURFT05fUEFSQU1fU0NSQVRDSF9PRkZTRVQgICAgICAgIDExCisjZGVmaW5lIFJBREVPTl9QQVJBTV9DQVJEX1RZUEUgICAgICAgICAgICAgMTIKKyNkZWZpbmUgUkFERU9OX1BBUkFNX1ZCTEFOS19DUlRDICAgICAgICAgICAxMyAgIC8qIFZCTEFOSyBDUlRDICovCisjZGVmaW5lIFJBREVPTl9QQVJBTV9GQl9MT0NBVElPTiAgICAgICAgICAgMTQgICAvKiBGQiBsb2NhdGlvbiAqLworI2RlZmluZSBSQURFT05fUEFSQU1fTlVNX0dCX1BJUEVTICAgICAgICAgIDE1ICAgLyogbnVtIEdCIHBpcGVzICovCisjZGVmaW5lIFJBREVPTl9QQVJBTV9ERVZJQ0VfSUQgICAgICAgICAgICAgMTYKKyNkZWZpbmUgUkFERU9OX1BBUkFNX05VTV9aX1BJUEVTICAgICAgICAgICAxNyAgIC8qIG51bSBaIHBpcGVzICovCisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fZ2V0cGFyYW0geworCWludCBwYXJhbTsKKwl2b2lkICp2YWx1ZTsKK30gZHJtX3JhZGVvbl9nZXRwYXJhbV90OworCisvKiAxLjY6IFNldCB1cCBhIG1lbW9yeSBtYW5hZ2VyIGZvciByZWdpb25zIG9mIHNoYXJlZCBtZW1vcnk6CisgKi8KKyNkZWZpbmUgUkFERU9OX01FTV9SRUdJT05fR0FSVCAxCisjZGVmaW5lIFJBREVPTl9NRU1fUkVHSU9OX0ZCICAgMgorCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX21lbV9hbGxvYyB7CisJaW50IHJlZ2lvbjsKKwlpbnQgYWxpZ25tZW50OworCWludCBzaXplOworCWludCAqcmVnaW9uX29mZnNldDsJLyogb2Zmc2V0IGZyb20gc3RhcnQgb2YgZmIgb3IgR0FSVCAqLworfSBkcm1fcmFkZW9uX21lbV9hbGxvY190OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX21lbV9mcmVlIHsKKwlpbnQgcmVnaW9uOworCWludCByZWdpb25fb2Zmc2V0OworfSBkcm1fcmFkZW9uX21lbV9mcmVlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fbWVtX2luaXRfaGVhcCB7CisJaW50IHJlZ2lvbjsKKwlpbnQgc2l6ZTsKKwlpbnQgc3RhcnQ7Cit9IGRybV9yYWRlb25fbWVtX2luaXRfaGVhcF90OworCisvKiAxLjY6IFVzZXJzcGFjZSBjYW4gcmVxdWVzdCAmIHdhaXQgb24gaXJxJ3M6CisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25faXJxX2VtaXQgeworCWludCAqaXJxX3NlcTsKK30gZHJtX3JhZGVvbl9pcnFfZW1pdF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2lycV93YWl0IHsKKwlpbnQgaXJxX3NlcTsKK30gZHJtX3JhZGVvbl9pcnFfd2FpdF90OworCisvKiAxLjEwOiBDbGllbnRzIHRlbGwgdGhlIERSTSB3aGVyZSB0aGV5IHRoaW5rIHRoZSBmcmFtZWJ1ZmZlciBpcyBsb2NhdGVkIGluCisgKiB0aGUgY2FyZCdzIGFkZHJlc3Mgc3BhY2UsIHZpYSBhIG5ldyBnZW5lcmljIGlvY3RsIHRvIHNldCBwYXJhbWV0ZXJzCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9zZXRwYXJhbSB7CisJdW5zaWduZWQgaW50IHBhcmFtOworCV9fczY0IHZhbHVlOworfSBkcm1fcmFkZW9uX3NldHBhcmFtX3Q7CisKKyNkZWZpbmUgUkFERU9OX1NFVFBBUkFNX0ZCX0xPQ0FUSU9OICAgIDEJLyogZGV0ZXJtaW5lZCBmcmFtZWJ1ZmZlciBsb2NhdGlvbiAqLworI2RlZmluZSBSQURFT05fU0VUUEFSQU1fU1dJVENIX1RJTElORyAgMgkvKiBlbmFibGUvZGlzYWJsZSBjb2xvciB0aWxpbmcgKi8KKyNkZWZpbmUgUkFERU9OX1NFVFBBUkFNX1BDSUdBUlRfTE9DQVRJT04gMwkvKiBQQ0kgR2FydCBMb2NhdGlvbiAqLworI2RlZmluZSBSQURFT05fU0VUUEFSQU1fTkVXX01FTU1BUCA0CQkvKiBVc2UgbmV3IG1lbW9yeSBtYXAgKi8KKyNkZWZpbmUgUkFERU9OX1NFVFBBUkFNX1BDSUdBUlRfVEFCTEVfU0laRSA1ICAgIC8qIFBDSSBHQVJUIFRhYmxlIFNpemUgKi8KKyNkZWZpbmUgUkFERU9OX1NFVFBBUkFNX1ZCTEFOS19DUlRDIDYgICAgICAgICAgIC8qIFZCTEFOSyBDUlRDICovCisvKiAxLjE0OiBDbGllbnRzIGNhbiBhbGxvY2F0ZS9mcmVlIGEgc3VyZmFjZQorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3N1cmZhY2VfYWxsb2MgeworCXVuc2lnbmVkIGludCBhZGRyZXNzOworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGludCBmbGFnczsKK30gZHJtX3JhZGVvbl9zdXJmYWNlX2FsbG9jX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fc3VyZmFjZV9mcmVlIHsKKwl1bnNpZ25lZCBpbnQgYWRkcmVzczsKK30gZHJtX3JhZGVvbl9zdXJmYWNlX2ZyZWVfdDsKKworI2RlZmluZQlEUk1fUkFERU9OX1ZCTEFOS19DUlRDMQkJMQorI2RlZmluZQlEUk1fUkFERU9OX1ZCTEFOS19DUlRDMgkJMgorCisvKgorICogS2VybmVsIG1vZGVzZXR0aW5nIHdvcmxkIGJlbG93LgorICovCisjZGVmaW5lIFJBREVPTl9HRU1fRE9NQUlOX0NQVQkJMHgxCisjZGVmaW5lIFJBREVPTl9HRU1fRE9NQUlOX0dUVAkJMHgyCisjZGVmaW5lIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0JCTB4NAorCitzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1faW5mbyB7CisJdWludDY0X3QJZ2FydF9zaXplOworCXVpbnQ2NF90CXZyYW1fc2l6ZTsKKwl1aW50NjRfdAl2cmFtX3Zpc2libGU7Cit9OworCisjZGVmaW5lIFJBREVPTl9HRU1fTk9fQkFDS0lOR19TVE9SRQkoMSA8PCAwKQorI2RlZmluZSBSQURFT05fR0VNX0dUVF9VQwkJKDEgPDwgMSkKKyNkZWZpbmUgUkFERU9OX0dFTV9HVFRfV0MJCSgxIDw8IDIpCisvKiBCTyBpcyBleHBlY3RlZCB0byBiZSBhY2Nlc3NlZCBieSB0aGUgQ1BVICovCisjZGVmaW5lIFJBREVPTl9HRU1fQ1BVX0FDQ0VTUwkJKDEgPDwgMykKKy8qIENQVSBhY2Nlc3MgaXMgbm90IGV4cGVjdGVkIHRvIHdvcmsgZm9yIHRoaXMgQk8gKi8KKyNkZWZpbmUgUkFERU9OX0dFTV9OT19DUFVfQUNDRVNTCSgxIDw8IDQpCisKK3N0cnVjdCBkcm1fcmFkZW9uX2dlbV9jcmVhdGUgeworCXVpbnQ2NF90CXNpemU7CisJdWludDY0X3QJYWxpZ25tZW50OworCXVpbnQzMl90CWhhbmRsZTsKKwl1aW50MzJfdAlpbml0aWFsX2RvbWFpbjsKKwl1aW50MzJfdAlmbGFnczsKK307CisKKy8qCisgKiBUaGlzIGlzIG5vdCBhIHJlbGlhYmxlIEFQSSBhbmQgeW91IHNob3VsZCBleHBlY3QgaXQgdG8gZmFpbCBmb3IgYW55CisgKiBudW1iZXIgb2YgcmVhc29ucyBhbmQgaGF2ZSBmYWxsYmFjayBwYXRoIHRoYXQgZG8gbm90IHVzZSB1c2VycHRyIHRvCisgKiBwZXJmb3JtIGFueSBvcGVyYXRpb24uCisgKi8KKyNkZWZpbmUgUkFERU9OX0dFTV9VU0VSUFRSX1JFQURPTkxZCSgxIDw8IDApCisjZGVmaW5lIFJBREVPTl9HRU1fVVNFUlBUUl9BTk9OT05MWQkoMSA8PCAxKQorI2RlZmluZSBSQURFT05fR0VNX1VTRVJQVFJfVkFMSURBVEUJKDEgPDwgMikKKyNkZWZpbmUgUkFERU9OX0dFTV9VU0VSUFRSX1JFR0lTVEVSCSgxIDw8IDMpCisKK3N0cnVjdCBkcm1fcmFkZW9uX2dlbV91c2VycHRyIHsKKwl1aW50NjRfdAkJYWRkcjsKKwl1aW50NjRfdAkJc2l6ZTsKKwl1aW50MzJfdAkJZmxhZ3M7CisJdWludDMyX3QJCWhhbmRsZTsKK307CisKKyNkZWZpbmUgUkFERU9OX1RJTElOR19NQUNSTwkJCQkweDEKKyNkZWZpbmUgUkFERU9OX1RJTElOR19NSUNSTwkJCQkweDIKKyNkZWZpbmUgUkFERU9OX1RJTElOR19TV0FQXzE2QklUCQkJMHg0CisjZGVmaW5lIFJBREVPTl9USUxJTkdfUjYwMF9OT19TQ0FOT1VUICAgICAgICAgICAgICAgICAgIFJBREVPTl9USUxJTkdfU1dBUF8xNkJJVAorI2RlZmluZSBSQURFT05fVElMSU5HX1NXQVBfMzJCSVQJCQkweDgKKy8qIHRoaXMgb2JqZWN0IHJlcXVpcmVzIGEgc3VyZmFjZSB3aGVuIG1hcHBlZCAtIGkuZS4gZnJvbnQgYnVmZmVyICovCisjZGVmaW5lIFJBREVPTl9USUxJTkdfU1VSRkFDRQkJCQkweDEwCisjZGVmaW5lIFJBREVPTl9USUxJTkdfTUlDUk9fU1FVQVJFCQkJMHgyMAorI2RlZmluZSBSQURFT05fVElMSU5HX0VHX0JBTktXX1NISUZUCQkJOAorI2RlZmluZSBSQURFT05fVElMSU5HX0VHX0JBTktXX01BU0sJCQkweGYKKyNkZWZpbmUgUkFERU9OX1RJTElOR19FR19CQU5LSF9TSElGVAkJCTEyCisjZGVmaW5lIFJBREVPTl9USUxJTkdfRUdfQkFOS0hfTUFTSwkJCTB4ZgorI2RlZmluZSBSQURFT05fVElMSU5HX0VHX01BQ1JPX1RJTEVfQVNQRUNUX1NISUZUCTE2CisjZGVmaW5lIFJBREVPTl9USUxJTkdfRUdfTUFDUk9fVElMRV9BU1BFQ1RfTUFTSwkJMHhmCisjZGVmaW5lIFJBREVPTl9USUxJTkdfRUdfVElMRV9TUExJVF9TSElGVAkJMjQKKyNkZWZpbmUgUkFERU9OX1RJTElOR19FR19USUxFX1NQTElUX01BU0sJCTB4ZgorI2RlZmluZSBSQURFT05fVElMSU5HX0VHX1NURU5DSUxfVElMRV9TUExJVF9TSElGVAkyOAorI2RlZmluZSBSQURFT05fVElMSU5HX0VHX1NURU5DSUxfVElMRV9TUExJVF9NQVNLCTB4ZgorCitzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fc2V0X3RpbGluZyB7CisJdWludDMyX3QJaGFuZGxlOworCXVpbnQzMl90CXRpbGluZ19mbGFnczsKKwl1aW50MzJfdAlwaXRjaDsKK307CisKK3N0cnVjdCBkcm1fcmFkZW9uX2dlbV9nZXRfdGlsaW5nIHsKKwl1aW50MzJfdAloYW5kbGU7CisJdWludDMyX3QJdGlsaW5nX2ZsYWdzOworCXVpbnQzMl90CXBpdGNoOworfTsKKworc3RydWN0IGRybV9yYWRlb25fZ2VtX21tYXAgeworCXVpbnQzMl90CWhhbmRsZTsKKwl1aW50MzJfdAlwYWQ7CisJdWludDY0X3QJb2Zmc2V0OworCXVpbnQ2NF90CXNpemU7CisJdWludDY0X3QJYWRkcl9wdHI7Cit9OworCitzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fc2V0X2RvbWFpbiB7CisJdWludDMyX3QJaGFuZGxlOworCXVpbnQzMl90CXJlYWRfZG9tYWluczsKKwl1aW50MzJfdAl3cml0ZV9kb21haW47Cit9OworCitzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fd2FpdF9pZGxlIHsKKwl1aW50MzJfdAloYW5kbGU7CisJdWludDMyX3QJcGFkOworfTsKKworc3RydWN0IGRybV9yYWRlb25fZ2VtX2J1c3kgeworCXVpbnQzMl90CWhhbmRsZTsKKwl1aW50MzJfdCAgICAgICAgZG9tYWluOworfTsKKworc3RydWN0IGRybV9yYWRlb25fZ2VtX3ByZWFkIHsKKwkvKiogSGFuZGxlIGZvciB0aGUgb2JqZWN0IGJlaW5nIHJlYWQuICovCisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IHBhZDsKKwkvKiogT2Zmc2V0IGludG8gdGhlIG9iamVjdCB0byByZWFkIGZyb20gKi8KKwl1aW50NjRfdCBvZmZzZXQ7CisJLyoqIExlbmd0aCBvZiBkYXRhIHRvIHJlYWQgKi8KKwl1aW50NjRfdCBzaXplOworCS8qKiBQb2ludGVyIHRvIHdyaXRlIHRoZSBkYXRhIGludG8uICovCisJLyogdm9pZCAqLCBidXQgcG9pbnRlcnMgYXJlIG5vdCAzMi82NCBjb21wYXRpYmxlICovCisJdWludDY0X3QgZGF0YV9wdHI7Cit9OworCitzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fcHdyaXRlIHsKKwkvKiogSGFuZGxlIGZvciB0aGUgb2JqZWN0IGJlaW5nIHdyaXR0ZW4gdG8uICovCisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IHBhZDsKKwkvKiogT2Zmc2V0IGludG8gdGhlIG9iamVjdCB0byB3cml0ZSB0byAqLworCXVpbnQ2NF90IG9mZnNldDsKKwkvKiogTGVuZ3RoIG9mIGRhdGEgdG8gd3JpdGUgKi8KKwl1aW50NjRfdCBzaXplOworCS8qKiBQb2ludGVyIHRvIHJlYWQgdGhlIGRhdGEgZnJvbS4gKi8KKwkvKiB2b2lkICosIGJ1dCBwb2ludGVycyBhcmUgbm90IDMyLzY0IGNvbXBhdGlibGUgKi8KKwl1aW50NjRfdCBkYXRhX3B0cjsKK307CisKKy8qIFNldHMgb3IgcmV0dXJucyBhIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIGJ1ZmZlci4gKi8KK3N0cnVjdCBkcm1fcmFkZW9uX2dlbV9vcCB7CisJdWludDMyX3QJaGFuZGxlOyAvKiBidWZmZXIgKi8KKwl1aW50MzJfdAlvcDsgICAgIC8qIFJBREVPTl9HRU1fT1BfKiAqLworCXVpbnQ2NF90CXZhbHVlOyAgLyogaW5wdXQgb3IgcmV0dXJuIHZhbHVlICovCit9OworCisjZGVmaW5lIFJBREVPTl9HRU1fT1BfR0VUX0lOSVRJQUxfRE9NQUlOCTAKKyNkZWZpbmUgUkFERU9OX0dFTV9PUF9TRVRfSU5JVElBTF9ET01BSU4JMQorCisjZGVmaW5lIFJBREVPTl9WQV9NQVAJCQkxCisjZGVmaW5lIFJBREVPTl9WQV9VTk1BUAkJCTIKKworI2RlZmluZSBSQURFT05fVkFfUkVTVUxUX09LCQkwCisjZGVmaW5lIFJBREVPTl9WQV9SRVNVTFRfRVJST1IJCTEKKyNkZWZpbmUgUkFERU9OX1ZBX1JFU1VMVF9WQV9FWElTVAkyCisKKyNkZWZpbmUgUkFERU9OX1ZNX1BBR0VfVkFMSUQJCSgxIDw8IDApCisjZGVmaW5lIFJBREVPTl9WTV9QQUdFX1JFQURBQkxFCQkoMSA8PCAxKQorI2RlZmluZSBSQURFT05fVk1fUEFHRV9XUklURUFCTEUJKDEgPDwgMikKKyNkZWZpbmUgUkFERU9OX1ZNX1BBR0VfU1lTVEVNCQkoMSA8PCAzKQorI2RlZmluZSBSQURFT05fVk1fUEFHRV9TTk9PUEVECQkoMSA8PCA0KQorCitzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fdmEgeworCXVpbnQzMl90CQloYW5kbGU7CisJdWludDMyX3QJCW9wZXJhdGlvbjsKKwl1aW50MzJfdAkJdm1faWQ7CisJdWludDMyX3QJCWZsYWdzOworCXVpbnQ2NF90CQlvZmZzZXQ7Cit9OworCisjZGVmaW5lIFJBREVPTl9DSFVOS19JRF9SRUxPQ1MJMHgwMQorI2RlZmluZSBSQURFT05fQ0hVTktfSURfSUIJMHgwMgorI2RlZmluZSBSQURFT05fQ0hVTktfSURfRkxBR1MJMHgwMworI2RlZmluZSBSQURFT05fQ0hVTktfSURfQ09OU1RfSUIJMHgwNAorCisvKiBUaGUgZmlyc3QgZHdvcmQgb2YgUkFERU9OX0NIVU5LX0lEX0ZMQUdTIGlzIGEgdWludDMyIG9mIHRoZXNlIGZsYWdzOiAqLworI2RlZmluZSBSQURFT05fQ1NfS0VFUF9USUxJTkdfRkxBR1MgMHgwMQorI2RlZmluZSBSQURFT05fQ1NfVVNFX1ZNICAgICAgICAgICAgMHgwMgorI2RlZmluZSBSQURFT05fQ1NfRU5EX09GX0ZSQU1FICAgICAgMHgwNCAvKiBhIGhpbnQgZnJvbSB1c2Vyc3BhY2Ugd2hpY2ggQ1MgaXMgdGhlIGxhc3Qgb25lICovCisvKiBUaGUgc2Vjb25kIGR3b3JkIG9mIFJBREVPTl9DSFVOS19JRF9GTEFHUyBpcyBhIHVpbnQzMiB0aGF0IHNldHMgdGhlIHJpbmcgdHlwZSAqLworI2RlZmluZSBSQURFT05fQ1NfUklOR19HRlggICAgICAgICAgMAorI2RlZmluZSBSQURFT05fQ1NfUklOR19DT01QVVRFICAgICAgMQorI2RlZmluZSBSQURFT05fQ1NfUklOR19ETUEgICAgICAgICAgMgorI2RlZmluZSBSQURFT05fQ1NfUklOR19VVkQgICAgICAgICAgMworI2RlZmluZSBSQURFT05fQ1NfUklOR19WQ0UgICAgICAgICAgNAorLyogVGhlIHRoaXJkIGR3b3JkIG9mIFJBREVPTl9DSFVOS19JRF9GTEFHUyBpcyBhIHNpbnQzMiB0aGF0IHNldHMgdGhlIHByaW9yaXR5ICovCisvKiAwID0gbm9ybWFsLCArID0gaGlnaGVyIHByaW9yaXR5LCAtID0gbG93ZXIgcHJpb3JpdHkgKi8KKworc3RydWN0IGRybV9yYWRlb25fY3NfY2h1bmsgeworCXVpbnQzMl90CQljaHVua19pZDsKKwl1aW50MzJfdAkJbGVuZ3RoX2R3OworCXVpbnQ2NF90CQljaHVua19kYXRhOworfTsKKworLyogZHJtX3JhZGVvbl9jc19yZWxvYy5mbGFncyAqLworI2RlZmluZSBSQURFT05fUkVMT0NfUFJJT19NQVNLCQkoMHhmIDw8IDApCisKK3N0cnVjdCBkcm1fcmFkZW9uX2NzX3JlbG9jIHsKKwl1aW50MzJfdAkJaGFuZGxlOworCXVpbnQzMl90CQlyZWFkX2RvbWFpbnM7CisJdWludDMyX3QJCXdyaXRlX2RvbWFpbjsKKwl1aW50MzJfdAkJZmxhZ3M7Cit9OworCitzdHJ1Y3QgZHJtX3JhZGVvbl9jcyB7CisJdWludDMyX3QJCW51bV9jaHVua3M7CisJdWludDMyX3QJCWNzX2lkOworCS8qIHRoaXMgcG9pbnRzIHRvIHVpbnQ2NF90ICogd2hpY2ggcG9pbnQgdG8gY3MgY2h1bmtzICovCisJdWludDY0X3QJCWNodW5rczsKKwkvKiB1cGRhdGVzIHRvIHRoZSBsaW1pdHMgYWZ0ZXIgdGhpcyBDUyBpb2N0bCAqLworCXVpbnQ2NF90CQlnYXJ0X2xpbWl0OworCXVpbnQ2NF90CQl2cmFtX2xpbWl0OworfTsKKworI2RlZmluZSBSQURFT05fSU5GT19ERVZJQ0VfSUQJCTB4MDAKKyNkZWZpbmUgUkFERU9OX0lORk9fTlVNX0dCX1BJUEVTCTB4MDEKKyNkZWZpbmUgUkFERU9OX0lORk9fTlVNX1pfUElQRVMgCTB4MDIKKyNkZWZpbmUgUkFERU9OX0lORk9fQUNDRUxfV09SS0lORwkweDAzCisjZGVmaW5lIFJBREVPTl9JTkZPX0NSVENfRlJPTV9JRAkweDA0CisjZGVmaW5lIFJBREVPTl9JTkZPX0FDQ0VMX1dPUktJTkcyCTB4MDUKKyNkZWZpbmUgUkFERU9OX0lORk9fVElMSU5HX0NPTkZJRwkweDA2CisjZGVmaW5lIFJBREVPTl9JTkZPX1dBTlRfSFlQRVJaCQkweDA3CisjZGVmaW5lIFJBREVPTl9JTkZPX1dBTlRfQ01BU0sJCTB4MDggLyogZ2V0IGFjY2VzcyB0byBDTUFTSyBvbiByMzAwICovCisjZGVmaW5lIFJBREVPTl9JTkZPX0NMT0NLX0NSWVNUQUxfRlJFUQkweDA5IC8qIGNsb2NrIGNyeXN0YWwgZnJlcXVlbmN5ICovCisjZGVmaW5lIFJBREVPTl9JTkZPX05VTV9CQUNLRU5EUwkweDBhIC8qIERCL2JhY2tlbmRzIGZvciByNjAwKyAtIG5lZWQgZm9yIE9RICovCisjZGVmaW5lIFJBREVPTl9JTkZPX05VTV9USUxFX1BJUEVTCTB4MGIgLyogdGlsZSBwaXBlcyBmb3IgcjYwMCsgKi8KKyNkZWZpbmUgUkFERU9OX0lORk9fRlVTSU9OX0dBUlRfV09SS0lORwkweDBjIC8qIGZ1c2lvbiB3cml0ZXMgdG8gR1RUIHdlcmUgYnJva2VuIGJlZm9yZSB0aGlzICovCisjZGVmaW5lIFJBREVPTl9JTkZPX0JBQ0tFTkRfTUFQCQkweDBkIC8qIHBpcGUgdG8gYmFja2VuZCBtYXAsIG5lZWRlZCBieSBtZXNhICovCisvKiB2aXJ0dWFsIGFkZHJlc3Mgc3RhcnQsIHZhIDwgc3RhcnQgYXJlIHJlc2VydmVkIGJ5IHRoZSBrZXJuZWwgKi8KKyNkZWZpbmUgUkFERU9OX0lORk9fVkFfU1RBUlQJCTB4MGUKKy8qIG1heGltdW0gc2l6ZSBvZiBpYiB1c2luZyB0aGUgdmlydHVhbCBtZW1vcnkgY3MgKi8KKyNkZWZpbmUgUkFERU9OX0lORk9fSUJfVk1fTUFYX1NJWkUJMHgwZgorLyogbWF4IHBpcGVzIC0gbmVlZGVkIGZvciBjb21wdXRlIHNoYWRlcnMgKi8KKyNkZWZpbmUgUkFERU9OX0lORk9fTUFYX1BJUEVTCQkweDEwCisvKiB0aW1lc3RhbXAgZm9yIEdMX0FSQl90aW1lcl9xdWVyeSAoT3BlbkdMKSwgcmV0dXJucyB0aGUgY3VycmVudCBHUFUgY2xvY2sgKi8KKyNkZWZpbmUgUkFERU9OX0lORk9fVElNRVNUQU1QCQkweDExCisvKiBtYXggc2hhZGVyIGVuZ2luZXMgKFNFKSAtIG5lZWRlZCBmb3IgZ2VvbWV0cnkgc2hhZGVycywgZXRjLiAqLworI2RlZmluZSBSQURFT05fSU5GT19NQVhfU0UJCTB4MTIKKy8qIG1heCBTSCBwZXIgU0UgKi8KKyNkZWZpbmUgUkFERU9OX0lORk9fTUFYX1NIX1BFUl9TRQkweDEzCisvKiBmYXN0IGZiIGFjY2VzcyBpcyBlbmFibGVkICovCisjZGVmaW5lIFJBREVPTl9JTkZPX0ZBU1RGQl9XT1JLSU5HCTB4MTQKKy8qIHF1ZXJ5IGlmIGEgUkFERU9OX0NTX1JJTkdfKiBzdWJtaXNzaW9uIGlzIHN1cHBvcnRlZCAqLworI2RlZmluZSBSQURFT05fSU5GT19SSU5HX1dPUktJTkcJMHgxNQorLyogU0kgdGlsZSBtb2RlIGFycmF5ICovCisjZGVmaW5lIFJBREVPTl9JTkZPX1NJX1RJTEVfTU9ERV9BUlJBWQkweDE2CisvKiBxdWVyeSBpZiBDUCBETUEgaXMgc3VwcG9ydGVkIG9uIHRoZSBjb21wdXRlIHJpbmcgKi8KKyNkZWZpbmUgUkFERU9OX0lORk9fU0lfQ1BfRE1BX0NPTVBVVEUJMHgxNworLyogQ0lLIG1hY3JvdGlsZSBtb2RlIGFycmF5ICovCisjZGVmaW5lIFJBREVPTl9JTkZPX0NJS19NQUNST1RJTEVfTU9ERV9BUlJBWQkweDE4CisvKiBxdWVyeSB0aGUgbnVtYmVyIG9mIHJlbmRlciBiYWNrZW5kcyAqLworI2RlZmluZSBSQURFT05fSU5GT19TSV9CQUNLRU5EX0VOQUJMRURfTUFTSwkweDE5CisvKiBtYXggZW5naW5lIGNsb2NrIC0gbmVlZGVkIGZvciBPcGVuQ0wgKi8KKyNkZWZpbmUgUkFERU9OX0lORk9fTUFYX1NDTEsJCTB4MWEKKy8qIHZlcnNpb24gb2YgVkNFIGZpcm13YXJlICovCisjZGVmaW5lIFJBREVPTl9JTkZPX1ZDRV9GV19WRVJTSU9OCTB4MWIKKy8qIHZlcnNpb24gb2YgVkNFIGZlZWRiYWNrICovCisjZGVmaW5lIFJBREVPTl9JTkZPX1ZDRV9GQl9WRVJTSU9OCTB4MWMKKyNkZWZpbmUgUkFERU9OX0lORk9fTlVNX0JZVEVTX01PVkVECTB4MWQKKyNkZWZpbmUgUkFERU9OX0lORk9fVlJBTV9VU0FHRQkJMHgxZQorI2RlZmluZSBSQURFT05fSU5GT19HVFRfVVNBR0UJCTB4MWYKKyNkZWZpbmUgUkFERU9OX0lORk9fQUNUSVZFX0NVX0NPVU5UCTB4MjAKKyNkZWZpbmUgUkFERU9OX0lORk9fQ1VSUkVOVF9HUFVfVEVNUAkweDIxCisjZGVmaW5lIFJBREVPTl9JTkZPX0NVUlJFTlRfR1BVX1NDTEsJMHgyMgorI2RlZmluZSBSQURFT05fSU5GT19DVVJSRU5UX0dQVV9NQ0xLCTB4MjMKKyNkZWZpbmUgUkFERU9OX0lORk9fUkVBRF9SRUcJCTB4MjQKKyNkZWZpbmUgUkFERU9OX0lORk9fVkFfVU5NQVBfV09SS0lORwkweDI1CisjZGVmaW5lIFJBREVPTl9JTkZPX0dQVV9SRVNFVF9DT1VOVEVSCTB4MjYKKworc3RydWN0IGRybV9yYWRlb25faW5mbyB7CisJdWludDMyX3QJCXJlcXVlc3Q7CisJdWludDMyX3QJCXBhZDsKKwl1aW50NjRfdAkJdmFsdWU7Cit9OworCisvKiBUaG9zZSBjb3JyZXNwb25kIHRvIHRoZSB0aWxlIGluZGV4IHRvIHVzZSwgdGhpcyBpcyB0byBleHBsaWNpdGx5IHN0YXRlCisgKiB0aGUgQVBJIHRoYXQgaXMgaW1wbGljaXRseSBkZWZpbmVkIGJ5IHRoZSB0aWxlIG1vZGUgYXJyYXkuCisgKi8KKyNkZWZpbmUgU0lfVElMRV9NT0RFX0NPTE9SX0xJTkVBUl9BTElHTkVECTgKKyNkZWZpbmUgU0lfVElMRV9NT0RFX0NPTE9SXzFECQkJMTMKKyNkZWZpbmUgU0lfVElMRV9NT0RFX0NPTE9SXzFEX1NDQU5PVVQJCTkKKyNkZWZpbmUgU0lfVElMRV9NT0RFX0NPTE9SXzJEXzhCUFAJCTE0CisjZGVmaW5lIFNJX1RJTEVfTU9ERV9DT0xPUl8yRF8xNkJQUAkJMTUKKyNkZWZpbmUgU0lfVElMRV9NT0RFX0NPTE9SXzJEXzMyQlBQCQkxNgorI2RlZmluZSBTSV9USUxFX01PREVfQ09MT1JfMkRfNjRCUFAJCTE3CisjZGVmaW5lIFNJX1RJTEVfTU9ERV9DT0xPUl8yRF9TQ0FOT1VUXzE2QlBQCTExCisjZGVmaW5lIFNJX1RJTEVfTU9ERV9DT0xPUl8yRF9TQ0FOT1VUXzMyQlBQCTEyCisjZGVmaW5lIFNJX1RJTEVfTU9ERV9ERVBUSF9TVEVOQ0lMXzFECQk0CisjZGVmaW5lIFNJX1RJTEVfTU9ERV9ERVBUSF9TVEVOQ0lMXzJECQkwCisjZGVmaW5lIFNJX1RJTEVfTU9ERV9ERVBUSF9TVEVOQ0lMXzJEXzJBQQkzCisjZGVmaW5lIFNJX1RJTEVfTU9ERV9ERVBUSF9TVEVOQ0lMXzJEXzRBQQkzCisjZGVmaW5lIFNJX1RJTEVfTU9ERV9ERVBUSF9TVEVOQ0lMXzJEXzhBQQkyCisKKyNkZWZpbmUgQ0lLX1RJTEVfTU9ERV9ERVBUSF9TVEVOQ0lMXzFECQk1CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vc2F2YWdlX2RybS5oIGIvaW5jbHVkZS9kcm0vc2F2YWdlX2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YTc1ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9zYXZhZ2VfZHJtLmgKQEAgLTAsMCArMSwyMTAgQEAKKy8qIHNhdmFnZV9kcm0uaCAtLSBQdWJsaWMgaGVhZGVyIGZvciB0aGUgc2F2YWdlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDA0ICBGZWxpeCBLdWVobGluZworICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIEZFTElYIEtVRUhMSU5HIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GCisgKiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19TQVZBR0VfRFJNX0hfXworI2RlZmluZSBfX1NBVkFHRV9EUk1fSF9fCisKKyNpZm5kZWYgX19TQVZBR0VfU0FSRUFfREVGSU5FU19fCisjZGVmaW5lIF9fU0FWQUdFX1NBUkVBX0RFRklORVNfXworCisvKiAyIGhlYXBzICgxIGZvciBjYXJkLCAxIGZvciBhZ3ApLCBlYWNoIGRpdmlkZWQgaW50byB1cHRvIDEyOAorICogcmVnaW9ucywgc3ViamVjdCB0byBhIG1pbmltdW0gcmVnaW9uIHNpemUgb2YgKDE8PDE2KSA9PSA2NGsuCisgKgorICogQ2xpZW50cyBtYXkgc3ViZGl2aWRlIHJlZ2lvbnMgaW50ZXJuYWxseSwgYnV0IHdoZW4gc2hhcmluZyBiZXR3ZWVuCisgKiBjbGllbnRzLCB0aGUgcmVnaW9uIHNpemUgaXMgdGhlIG1pbmltdW0gZ3JhbnVsYXJpdHkuCisgKi8KKworI2RlZmluZSBTQVZBR0VfQ0FSRF9IRUFQCQkwCisjZGVmaW5lIFNBVkFHRV9BR1BfSEVBUAkJCTEKKyNkZWZpbmUgU0FWQUdFX05SX1RFWF9IRUFQUwkJMgorI2RlZmluZSBTQVZBR0VfTlJfVEVYX1JFR0lPTlMJCTE2CisjZGVmaW5lIFNBVkFHRV9MT0dfTUlOX1RFWF9SRUdJT05fU0laRQkxNgorCisjZW5kaWYJCQkJLyogX19TQVZBR0VfU0FSRUFfREVGSU5FU19fICovCisKK3R5cGVkZWYgc3RydWN0IF9kcm1fc2F2YWdlX3NhcmVhIHsKKwkvKiBMUlUgbGlzdHMgZm9yIHRleHR1cmUgbWVtb3J5IGluIGFncCBzcGFjZSBhbmQgb24gdGhlIGNhcmQuCisJICovCisJc3RydWN0IGRybV90ZXhfcmVnaW9uIHRleExpc3RbU0FWQUdFX05SX1RFWF9IRUFQU11bU0FWQUdFX05SX1RFWF9SRUdJT05TICsKKwkJCQkJCSAgICAgIDFdOworCXVuc2lnbmVkIGludCB0ZXhBZ2VbU0FWQUdFX05SX1RFWF9IRUFQU107CisKKwkvKiBNZWNoYW5pc20gdG8gdmFsaWRhdGUgY2FyZCBzdGF0ZS4KKwkgKi8KKwlpbnQgY3R4T3duZXI7Cit9IGRybV9zYXZhZ2Vfc2FyZWFfdCwgKmRybV9zYXZhZ2Vfc2FyZWFfcHRyOworCisvKiBTYXZhZ2Utc3BlY2lmaWMgaW9jdGxzCisgKi8KKyNkZWZpbmUgRFJNX1NBVkFHRV9CQ0lfSU5JVAkJMHgwMAorI2RlZmluZSBEUk1fU0FWQUdFX0JDSV9DTURCVUYgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRFJNX1NBVkFHRV9CQ0lfRVZFTlRfRU1JVAkweDAyCisjZGVmaW5lIERSTV9TQVZBR0VfQkNJX0VWRU5UX1dBSVQJMHgwMworCisjZGVmaW5lIERSTV9JT0NUTF9TQVZBR0VfSU5JVAkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TQVZBR0VfQkNJX0lOSVQsIGRybV9zYXZhZ2VfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfU0FWQUdFX0NNREJVRgkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TQVZBR0VfQkNJX0NNREJVRiwgZHJtX3NhdmFnZV9jbWRidWZfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NBVkFHRV9FVkVOVF9FTUlUCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fU0FWQUdFX0JDSV9FVkVOVF9FTUlULCBkcm1fc2F2YWdlX2V2ZW50X2VtaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NBVkFHRV9FVkVOVF9XQUlUCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fU0FWQUdFX0JDSV9FVkVOVF9XQUlULCBkcm1fc2F2YWdlX2V2ZW50X3dhaXRfdCkKKworI2RlZmluZSBTQVZBR0VfRE1BX1BDSQkxCisjZGVmaW5lIFNBVkFHRV9ETUFfQUdQCTMKK3R5cGVkZWYgc3RydWN0IGRybV9zYXZhZ2VfaW5pdCB7CisJZW51bSB7CisJCVNBVkFHRV9JTklUX0JDSSA9IDEsCisJCVNBVkFHRV9DTEVBTlVQX0JDSSA9IDIKKwl9IGZ1bmM7CisJdW5zaWduZWQgaW50IHNhcmVhX3ByaXZfb2Zmc2V0OworCisJLyogc29tZSBwYXJhbWV0ZXJzICovCisJdW5zaWduZWQgaW50IGNvYl9zaXplOworCXVuc2lnbmVkIGludCBiY2lfdGhyZXNob2xkX2xvLCBiY2lfdGhyZXNob2xkX2hpOworCXVuc2lnbmVkIGludCBkbWFfdHlwZTsKKworCS8qIGZyYW1lIGJ1ZmZlciBsYXlvdXQgKi8KKwl1bnNpZ25lZCBpbnQgZmJfYnBwOworCXVuc2lnbmVkIGludCBmcm9udF9vZmZzZXQsIGZyb250X3BpdGNoOworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldCwgYmFja19waXRjaDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfYnBwOworCXVuc2lnbmVkIGludCBkZXB0aF9vZmZzZXQsIGRlcHRoX3BpdGNoOworCisJLyogbG9jYWwgdGV4dHVyZXMgKi8KKwl1bnNpZ25lZCBpbnQgdGV4dHVyZV9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHRleHR1cmVfc2l6ZTsKKworCS8qIHBoeXNpY2FsIGxvY2F0aW9ucyBvZiBub24tcGVybWFuZW50IG1hcHMgKi8KKwl1bnNpZ25lZCBsb25nIHN0YXR1c19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBidWZmZXJzX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGFncF90ZXh0dXJlc19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBjbWRfZG1hX29mZnNldDsKK30gZHJtX3NhdmFnZV9pbml0X3Q7CisKK3R5cGVkZWYgdW5pb24gZHJtX3NhdmFnZV9jbWRfaGVhZGVyIGRybV9zYXZhZ2VfY21kX2hlYWRlcl90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NhdmFnZV9jbWRidWYgeworCS8qIGNvbW1hbmQgYnVmZmVyIGluIGNsaWVudCdzIGFkZHJlc3Mgc3BhY2UgKi8KKwlkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCAqY21kX2FkZHI7CisJdW5zaWduZWQgaW50IHNpemU7CS8qIHNpemUgb2YgdGhlIGNvbW1hbmQgYnVmZmVyIGluIDY0Yml0IHVuaXRzICovCisKKwl1bnNpZ25lZCBpbnQgZG1hX2lkeDsJLyogRE1BIGJ1ZmZlciBpbmRleCB0byB1c2UgKi8KKwlpbnQgZGlzY2FyZDsJCS8qIGRpc2NhcmQgRE1BIGJ1ZmZlciB3aGVuIGRvbmUgKi8KKwkvKiB2ZXJ0ZXggYnVmZmVyIGluIGNsaWVudCdzIGFkZHJlc3Mgc3BhY2UgKi8KKwl1bnNpZ25lZCBpbnQgKnZiX2FkZHI7CisJdW5zaWduZWQgaW50IHZiX3NpemU7CS8qIHNpemUgb2YgY2xpZW50IHZlcnRleCBidWZmZXIgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBpbnQgdmJfc3RyaWRlOwkvKiBzdHJpZGUgb2YgdmVydGljZXMgaW4gMzJiaXQgd29yZHMgKi8KKwkvKiBib3hlcyBpbiBjbGllbnQncyBhZGRyZXNzIHNwYWNlICovCisJc3RydWN0IGRybV9jbGlwX3JlY3QgKmJveF9hZGRyOworCXVuc2lnbmVkIGludCBuYm94OwkvKiBudW1iZXIgb2YgY2xpcHBpbmcgYm94ZXMgKi8KK30gZHJtX3NhdmFnZV9jbWRidWZfdDsKKworI2RlZmluZSBTQVZBR0VfV0FJVF8yRCAgMHgxCS8qIHdhaXQgZm9yIDJEIGlkbGUgYmVmb3JlIHVwZGF0aW5nIGV2ZW50IHRhZyAqLworI2RlZmluZSBTQVZBR0VfV0FJVF8zRCAgMHgyCS8qIHdhaXQgZm9yIDNEIGlkbGUgYmVmb3JlIHVwZGF0aW5nIGV2ZW50IHRhZyAqLworI2RlZmluZSBTQVZBR0VfV0FJVF9JUlEgMHg0CS8qIGVtaXQgb3Igd2FpdCBmb3IgSVJRLCBub3QgaW1wbGVtZW50ZWQgeWV0ICovCit0eXBlZGVmIHN0cnVjdCBkcm1fc2F2YWdlX2V2ZW50IHsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJdW5zaWduZWQgaW50IGZsYWdzOworfSBkcm1fc2F2YWdlX2V2ZW50X2VtaXRfdCwgZHJtX3NhdmFnZV9ldmVudF93YWl0X3Q7CisKKy8qIENvbW1hbmRzIGZvciB0aGUgY21kYnVmIGlvY3RsCisgKi8KKyNkZWZpbmUgU0FWQUdFX0NNRF9TVEFURQkwCS8qIGEgcmFuZ2Ugb2Ygc3RhdGUgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNBVkFHRV9DTURfRE1BX1BSSU0JMQkvKiB2ZXJ0aWNlcyBmcm9tIERNQSBidWZmZXIgKi8KKyNkZWZpbmUgU0FWQUdFX0NNRF9WQl9QUklNCTIJLyogdmVydGljZXMgZnJvbSBjbGllbnQgdmVydGV4IGJ1ZmZlciAqLworI2RlZmluZSBTQVZBR0VfQ01EX0RNQV9JRFgJMwkvKiBpbmRleGVkIHZlcnRpY2VzIGZyb20gRE1BIGJ1ZmZlciAqLworI2RlZmluZSBTQVZBR0VfQ01EX1ZCX0lEWAk0CS8qIGluZGV4ZWQgdmVydGljZXMgY2xpZW50IHZlcnRleCBidWZmZXIgKi8KKyNkZWZpbmUgU0FWQUdFX0NNRF9DTEVBUgk1CS8qIGNsZWFyIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgU0FWQUdFX0NNRF9TV0FQCQk2CS8qIHN3YXAgYnVmZmVycyAqLworCisvKiBQcmltaXRpdmUgdHlwZXMKKyovCisjZGVmaW5lIFNBVkFHRV9QUklNX1RSSUxJU1QJMAkvKiB0cmlhbmdsZSBsaXN0ICovCisjZGVmaW5lIFNBVkFHRV9QUklNX1RSSVNUUklQCTEJLyogdHJpYW5nbGUgc3RyaXAgKi8KKyNkZWZpbmUgU0FWQUdFX1BSSU1fVFJJRkFOCTIJLyogdHJpYW5nbGUgZmFuICovCisjZGVmaW5lIFNBVkFHRV9QUklNX1RSSUxJU1RfMjAxCTMJLyogcmVvcmRlciB2ZXJ0cyBmb3IgY29ycmVjdCBmbGF0CisJCQkJCSAqIHNoYWRpbmcgb24gczNkICovCisKKy8qIFNraXAgZmxhZ3MgKHZlcnRleCBmb3JtYXQpCisgKi8KKyNkZWZpbmUgU0FWQUdFX1NLSVBfWgkJMHgwMQorI2RlZmluZSBTQVZBR0VfU0tJUF9XCQkweDAyCisjZGVmaW5lIFNBVkFHRV9TS0lQX0MwCQkweDA0CisjZGVmaW5lIFNBVkFHRV9TS0lQX0MxCQkweDA4CisjZGVmaW5lIFNBVkFHRV9TS0lQX1MwCQkweDEwCisjZGVmaW5lIFNBVkFHRV9TS0lQX1QwCQkweDIwCisjZGVmaW5lIFNBVkFHRV9TS0lQX1NUMAkJMHgzMAorI2RlZmluZSBTQVZBR0VfU0tJUF9TMQkJMHg0MAorI2RlZmluZSBTQVZBR0VfU0tJUF9UMQkJMHg4MAorI2RlZmluZSBTQVZBR0VfU0tJUF9TVDEJCTB4YzAKKyNkZWZpbmUgU0FWQUdFX1NLSVBfQUxMX1MzRAkweDNmCisjZGVmaW5lIFNBVkFHRV9TS0lQX0FMTF9TNAkweGZmCisKKy8qIEJ1ZmZlciBuYW1lcyBmb3IgY2xlYXIgY29tbWFuZAorICovCisjZGVmaW5lIFNBVkFHRV9GUk9OVAkJMHgxCisjZGVmaW5lIFNBVkFHRV9CQUNLCQkweDIKKyNkZWZpbmUgU0FWQUdFX0RFUFRICQkweDQKKworLyogNjQtYml0IGNvbW1hbmQgaGVhZGVyCisgKi8KK3VuaW9uIGRybV9zYXZhZ2VfY21kX2hlYWRlciB7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWQ7CS8qIGNvbW1hbmQgKi8KKwkJdW5zaWduZWQgY2hhciBwYWQwOworCQl1bnNpZ25lZCBzaG9ydCBwYWQxOworCQl1bnNpZ25lZCBzaG9ydCBwYWQyOworCQl1bnNpZ25lZCBzaG9ydCBwYWQzOworCX0gY21kOwkJCS8qIGdlbmVyaWMgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZDsKKwkJdW5zaWduZWQgY2hhciBnbG9iYWw7CS8qIG5lZWQgaWRsZSBlbmdpbmU/ICovCisJCXVuc2lnbmVkIHNob3J0IGNvdW50OwkvKiBudW1iZXIgb2YgY29uc2VjdXRpdmUgcmVnaXN0ZXJzICovCisJCXVuc2lnbmVkIHNob3J0IHN0YXJ0OwkvKiBmaXJzdCByZWdpc3RlciAqLworCQl1bnNpZ25lZCBzaG9ydCBwYWQzOworCX0gc3RhdGU7CQkvKiBTQVZBR0VfQ01EX1NUQVRFICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWQ7CisJCXVuc2lnbmVkIGNoYXIgcHJpbTsJLyogcHJpbWl0aXZlIHR5cGUgKi8KKwkJdW5zaWduZWQgc2hvcnQgc2tpcDsJLyogdmVydGV4IGZvcm1hdCAoc2tpcCBmbGFncykgKi8KKwkJdW5zaWduZWQgc2hvcnQgY291bnQ7CS8qIG51bWJlciBvZiB2ZXJ0aWNlcyAqLworCQl1bnNpZ25lZCBzaG9ydCBzdGFydDsJLyogZmlyc3QgdmVydGV4IGluIERNQS92ZXJ0ZXggYnVmZmVyICovCisJfSBwcmltOwkJCS8qIFNBVkFHRV9DTURfRE1BX1BSSU0sIFNBVkFHRV9DTURfVkJfUFJJTSAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kOworCQl1bnNpZ25lZCBjaGFyIHByaW07CisJCXVuc2lnbmVkIHNob3J0IHNraXA7CisJCXVuc2lnbmVkIHNob3J0IGNvdW50OwkvKiBudW1iZXIgb2YgaW5kaWNlcyB0aGF0IGZvbGxvdyAqLworCQl1bnNpZ25lZCBzaG9ydCBwYWQzOworCX0gaWR4OwkJCS8qIFNBVkFHRV9DTURfRE1BX0lEWCwgU0FWQUdFX0NNRF9WQl9JRFggKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZDsKKwkJdW5zaWduZWQgY2hhciBwYWQwOworCQl1bnNpZ25lZCBzaG9ydCBwYWQxOworCQl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJfSBjbGVhcjA7CQkvKiBTQVZBR0VfQ01EX0NMRUFSICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IG1hc2s7CisJCXVuc2lnbmVkIGludCB2YWx1ZTsKKwl9IGNsZWFyMTsJCS8qIFNBVkFHRV9DTURfQ0xFQVIgZGF0YSAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9zaXNfZHJtLmggYi9pbmNsdWRlL2RybS9zaXNfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmN2IzOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL3Npc19kcm0uaApAQCAtMCwwICsxLDY3IEBACisvKiBzaXNfZHJ2LmggLS0gUHJpdmF0ZSBoZWFkZXIgZm9yIHNpcyBkcml2ZXIgLSotIGxpbnV4LWMgLSotICovCisvKgorICogQ29weXJpZ2h0IDIwMDUgRXJpYyBBbmhvbHQKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9fU0lTX0RSTV9IX18KKyNkZWZpbmUgX19TSVNfRFJNX0hfXworCisvKiBTaVMgc3BlY2lmaWMgaW9jdGxzICovCisjZGVmaW5lIE5PVF9VU0VEXzBfMworI2RlZmluZSBEUk1fU0lTX0ZCX0FMTE9DCTB4MDQKKyNkZWZpbmUgRFJNX1NJU19GQl9GUkVFCSAgICAgICAgMHgwNQorI2RlZmluZSBOT1RfVVNFRF82XzEyCisjZGVmaW5lIERSTV9TSVNfQUdQX0lOSVQJMHgxMworI2RlZmluZSBEUk1fU0lTX0FHUF9BTExPQwkweDE0CisjZGVmaW5lIERSTV9TSVNfQUdQX0ZSRUUJMHgxNQorI2RlZmluZSBEUk1fU0lTX0ZCX0lOSVQJICAgICAgICAweDE2CisKKyNkZWZpbmUgRFJNX0lPQ1RMX1NJU19GQl9BTExPQwkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TSVNfRkJfQUxMT0MsIGRybV9zaXNfbWVtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfRkJfRlJFRQkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TSVNfRkJfRlJFRSwgZHJtX3Npc19tZW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NJU19BR1BfSU5JVAkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TSVNfQUdQX0lOSVQsIGRybV9zaXNfYWdwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfQUdQX0FMTE9DCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1NJU19BR1BfQUxMT0MsIGRybV9zaXNfbWVtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfQUdQX0ZSRUUJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fU0lTX0FHUF9GUkVFLCBkcm1fc2lzX21lbV90KQorI2RlZmluZSBEUk1fSU9DVExfU0lTX0ZCX0lOSVQJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fU0lTX0ZCX0lOSVQsIGRybV9zaXNfZmJfdCkKKy8qCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfRkxJUAkJRFJNX0lPVyggMHg0OCwgZHJtX3Npc19mbGlwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfRkxJUF9JTklUCQlEUk1fSU8oICAweDQ5KQorI2RlZmluZSBEUk1fSU9DVExfU0lTX0ZMSVBfRklOQUwJRFJNX0lPKCAgMHg1MCkKKyovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgY29udGV4dDsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGxvbmcgZnJlZTsKK30gZHJtX3Npc19tZW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBvZmZzZXQsIHNpemU7Cit9IGRybV9zaXNfYWdwX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBzaXplOworfSBkcm1fc2lzX2ZiX3Q7CisKKyNlbmRpZgkJCQkvKiBfX1NJU19EUk1fSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS90ZWdyYV9kcm0uaCBiL2luY2x1ZGUvZHJtL3RlZ3JhX2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMGZlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS90ZWdyYV9kcm0uaApAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLCBOVklESUEgQ09SUE9SQVRJT04uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX1VBUElfVEVHUkFfRFJNX0hfCisjZGVmaW5lIF9VQVBJX1RFR1JBX0RSTV9IXworCisjaW5jbHVkZSA8ZHJtLmg+CisKKyNkZWZpbmUgRFJNX1RFR1JBX0dFTV9DUkVBVEVfVElMRUQgICAgICgxIDw8IDApCisjZGVmaW5lIERSTV9URUdSQV9HRU1fQ1JFQVRFX0JPVFRPTV9VUCAoMSA8PCAxKQorCitzdHJ1Y3QgZHJtX3RlZ3JhX2dlbV9jcmVhdGUgeworCV9fdTY0IHNpemU7CisJX191MzIgZmxhZ3M7CisJX191MzIgaGFuZGxlOworfTsKKworc3RydWN0IGRybV90ZWdyYV9nZW1fbW1hcCB7CisJX191MzIgaGFuZGxlOworCV9fdTMyIHBhZDsKKwlfX3U2NCBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgZHJtX3RlZ3JhX3N5bmNwdF9yZWFkIHsKKwlfX3UzMiBpZDsKKwlfX3UzMiB2YWx1ZTsKK307CisKK3N0cnVjdCBkcm1fdGVncmFfc3luY3B0X2luY3IgeworCV9fdTMyIGlkOworCV9fdTMyIHBhZDsKK307CisKK3N0cnVjdCBkcm1fdGVncmFfc3luY3B0X3dhaXQgeworCV9fdTMyIGlkOworCV9fdTMyIHRocmVzaDsKKwlfX3UzMiB0aW1lb3V0OworCV9fdTMyIHZhbHVlOworfTsKKworI2RlZmluZSBEUk1fVEVHUkFfTk9fVElNRU9VVAkoMHhmZmZmZmZmZikKKworc3RydWN0IGRybV90ZWdyYV9vcGVuX2NoYW5uZWwgeworCV9fdTMyIGNsaWVudDsKKwlfX3UzMiBwYWQ7CisJX191NjQgY29udGV4dDsKK307CisKK3N0cnVjdCBkcm1fdGVncmFfY2xvc2VfY2hhbm5lbCB7CisJX191NjQgY29udGV4dDsKK307CisKK3N0cnVjdCBkcm1fdGVncmFfZ2V0X3N5bmNwdCB7CisJX191NjQgY29udGV4dDsKKwlfX3UzMiBpbmRleDsKKwlfX3UzMiBpZDsKK307CisKK3N0cnVjdCBkcm1fdGVncmFfZ2V0X3N5bmNwdF9iYXNlIHsKKwlfX3U2NCBjb250ZXh0OworCV9fdTMyIHN5bmNwdDsKKwlfX3UzMiBpZDsKK307CisKK3N0cnVjdCBkcm1fdGVncmFfc3luY3B0IHsKKwlfX3UzMiBpZDsKKwlfX3UzMiBpbmNyczsKK307CisKK3N0cnVjdCBkcm1fdGVncmFfY21kYnVmIHsKKwlfX3UzMiBoYW5kbGU7CisJX191MzIgb2Zmc2V0OworCV9fdTMyIHdvcmRzOworCV9fdTMyIHBhZDsKK307CisKK3N0cnVjdCBkcm1fdGVncmFfcmVsb2MgeworCXN0cnVjdCB7CisJCV9fdTMyIGhhbmRsZTsKKwkJX191MzIgb2Zmc2V0OworCX0gY21kYnVmOworCXN0cnVjdCB7CisJCV9fdTMyIGhhbmRsZTsKKwkJX191MzIgb2Zmc2V0OworCX0gdGFyZ2V0OworCV9fdTMyIHNoaWZ0OworCV9fdTMyIHBhZDsKK307CisKK3N0cnVjdCBkcm1fdGVncmFfd2FpdGNoayB7CisJX191MzIgaGFuZGxlOworCV9fdTMyIG9mZnNldDsKKwlfX3UzMiBzeW5jcHQ7CisJX191MzIgdGhyZXNoOworfTsKKworc3RydWN0IGRybV90ZWdyYV9zdWJtaXQgeworCV9fdTY0IGNvbnRleHQ7CisJX191MzIgbnVtX3N5bmNwdHM7CisJX191MzIgbnVtX2NtZGJ1ZnM7CisJX191MzIgbnVtX3JlbG9jczsKKwlfX3UzMiBudW1fd2FpdGNoa3M7CisJX191MzIgd2FpdGNoa19tYXNrOworCV9fdTMyIHRpbWVvdXQ7CisJX191NjQgc3luY3B0czsKKwlfX3U2NCBjbWRidWZzOworCV9fdTY0IHJlbG9jczsKKwlfX3U2NCB3YWl0Y2hrczsKKwlfX3UzMiBmZW5jZTsJCS8qIFJldHVybiB2YWx1ZSAqLworCisJX191MzIgcmVzZXJ2ZWRbNV07CS8qIGZ1dHVyZSBleHBhbnNpb24gKi8KK307CisKKyNkZWZpbmUgRFJNX1RFR1JBX0dFTV9USUxJTkdfTU9ERV9QSVRDSCAwCisjZGVmaW5lIERSTV9URUdSQV9HRU1fVElMSU5HX01PREVfVElMRUQgMQorI2RlZmluZSBEUk1fVEVHUkFfR0VNX1RJTElOR19NT0RFX0JMT0NLIDIKKworc3RydWN0IGRybV90ZWdyYV9nZW1fc2V0X3RpbGluZyB7CisJLyogaW5wdXQgKi8KKwlfX3UzMiBoYW5kbGU7CisJX191MzIgbW9kZTsKKwlfX3UzMiB2YWx1ZTsKKwlfX3UzMiBwYWQ7Cit9OworCitzdHJ1Y3QgZHJtX3RlZ3JhX2dlbV9nZXRfdGlsaW5nIHsKKwkvKiBpbnB1dCAqLworCV9fdTMyIGhhbmRsZTsKKwkvKiBvdXRwdXQgKi8KKwlfX3UzMiBtb2RlOworCV9fdTMyIHZhbHVlOworCV9fdTMyIHBhZDsKK307CisKKyNkZWZpbmUgRFJNX1RFR1JBX0dFTV9CT1RUT01fVVAJCSgxIDw8IDApCisjZGVmaW5lIERSTV9URUdSQV9HRU1fRkxBR1MJCShEUk1fVEVHUkFfR0VNX0JPVFRPTV9VUCkKKworc3RydWN0IGRybV90ZWdyYV9nZW1fc2V0X2ZsYWdzIHsKKwkvKiBpbnB1dCAqLworCV9fdTMyIGhhbmRsZTsKKwkvKiBvdXRwdXQgKi8KKwlfX3UzMiBmbGFnczsKK307CisKK3N0cnVjdCBkcm1fdGVncmFfZ2VtX2dldF9mbGFncyB7CisJLyogaW5wdXQgKi8KKwlfX3UzMiBoYW5kbGU7CisJLyogb3V0cHV0ICovCisJX191MzIgZmxhZ3M7Cit9OworCisjZGVmaW5lIERSTV9URUdSQV9HRU1fQ1JFQVRFCQkweDAwCisjZGVmaW5lIERSTV9URUdSQV9HRU1fTU1BUAkJMHgwMQorI2RlZmluZSBEUk1fVEVHUkFfU1lOQ1BUX1JFQUQJCTB4MDIKKyNkZWZpbmUgRFJNX1RFR1JBX1NZTkNQVF9JTkNSCQkweDAzCisjZGVmaW5lIERSTV9URUdSQV9TWU5DUFRfV0FJVAkJMHgwNAorI2RlZmluZSBEUk1fVEVHUkFfT1BFTl9DSEFOTkVMCQkweDA1CisjZGVmaW5lIERSTV9URUdSQV9DTE9TRV9DSEFOTkVMCQkweDA2CisjZGVmaW5lIERSTV9URUdSQV9HRVRfU1lOQ1BUCQkweDA3CisjZGVmaW5lIERSTV9URUdSQV9TVUJNSVQJCTB4MDgKKyNkZWZpbmUgRFJNX1RFR1JBX0dFVF9TWU5DUFRfQkFTRQkweDA5CisjZGVmaW5lIERSTV9URUdSQV9HRU1fU0VUX1RJTElORwkweDBhCisjZGVmaW5lIERSTV9URUdSQV9HRU1fR0VUX1RJTElORwkweDBiCisjZGVmaW5lIERSTV9URUdSQV9HRU1fU0VUX0ZMQUdTCQkweDBjCisjZGVmaW5lIERSTV9URUdSQV9HRU1fR0VUX0ZMQUdTCQkweDBkCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1RFR1JBX0dFTV9DUkVBVEUgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9URUdSQV9HRU1fQ1JFQVRFLCBzdHJ1Y3QgZHJtX3RlZ3JhX2dlbV9jcmVhdGUpCisjZGVmaW5lIERSTV9JT0NUTF9URUdSQV9HRU1fTU1BUCBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1RFR1JBX0dFTV9NTUFQLCBzdHJ1Y3QgZHJtX3RlZ3JhX2dlbV9tbWFwKQorI2RlZmluZSBEUk1fSU9DVExfVEVHUkFfU1lOQ1BUX1JFQUQgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9URUdSQV9TWU5DUFRfUkVBRCwgc3RydWN0IGRybV90ZWdyYV9zeW5jcHRfcmVhZCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1RFR1JBX1NZTkNQVF9JTkNSIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVEVHUkFfU1lOQ1BUX0lOQ1IsIHN0cnVjdCBkcm1fdGVncmFfc3luY3B0X2luY3IpCisjZGVmaW5lIERSTV9JT0NUTF9URUdSQV9TWU5DUFRfV0FJVCBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1RFR1JBX1NZTkNQVF9XQUlULCBzdHJ1Y3QgZHJtX3RlZ3JhX3N5bmNwdF93YWl0KQorI2RlZmluZSBEUk1fSU9DVExfVEVHUkFfT1BFTl9DSEFOTkVMIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVEVHUkFfT1BFTl9DSEFOTkVMLCBzdHJ1Y3QgZHJtX3RlZ3JhX29wZW5fY2hhbm5lbCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1RFR1JBX0NMT1NFX0NIQU5ORUwgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9URUdSQV9DTE9TRV9DSEFOTkVMLCBzdHJ1Y3QgZHJtX3RlZ3JhX29wZW5fY2hhbm5lbCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1RFR1JBX0dFVF9TWU5DUFQgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9URUdSQV9HRVRfU1lOQ1BULCBzdHJ1Y3QgZHJtX3RlZ3JhX2dldF9zeW5jcHQpCisjZGVmaW5lIERSTV9JT0NUTF9URUdSQV9TVUJNSVQgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9URUdSQV9TVUJNSVQsIHN0cnVjdCBkcm1fdGVncmFfc3VibWl0KQorI2RlZmluZSBEUk1fSU9DVExfVEVHUkFfR0VUX1NZTkNQVF9CQVNFIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVEVHUkFfR0VUX1NZTkNQVF9CQVNFLCBzdHJ1Y3QgZHJtX3RlZ3JhX2dldF9zeW5jcHRfYmFzZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX1RFR1JBX0dFTV9TRVRfVElMSU5HIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVEVHUkFfR0VNX1NFVF9USUxJTkcsIHN0cnVjdCBkcm1fdGVncmFfZ2VtX3NldF90aWxpbmcpCisjZGVmaW5lIERSTV9JT0NUTF9URUdSQV9HRU1fR0VUX1RJTElORyBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1RFR1JBX0dFTV9HRVRfVElMSU5HLCBzdHJ1Y3QgZHJtX3RlZ3JhX2dlbV9nZXRfdGlsaW5nKQorI2RlZmluZSBEUk1fSU9DVExfVEVHUkFfR0VNX1NFVF9GTEFHUyBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1RFR1JBX0dFTV9TRVRfRkxBR1MsIHN0cnVjdCBkcm1fdGVncmFfZ2VtX3NldF9mbGFncykKKyNkZWZpbmUgRFJNX0lPQ1RMX1RFR1JBX0dFTV9HRVRfRkxBR1MgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9URUdSQV9HRU1fR0VUX0ZMQUdTLCBzdHJ1Y3QgZHJtX3RlZ3JhX2dlbV9nZXRfZmxhZ3MpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vdmM0X2RybS5oIGIvaW5jbHVkZS9kcm0vdmM0X2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYzRjNWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS92YzRfZHJtLmgKQEAgLTAsMCArMSwzMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNC0yMDE1IEJyb2FkY29tCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX1VBUElfVkM0X0RSTV9IXworI2RlZmluZSBfVUFQSV9WQzRfRFJNX0hfCisKKyNpbmNsdWRlICJkcm0uaCIKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIERSTV9WQzRfU1VCTUlUX0NMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRFJNX1ZDNF9XQUlUX1NFUU5PICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBEUk1fVkM0X1dBSVRfQk8gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIERSTV9WQzRfQ1JFQVRFX0JPICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgRFJNX1ZDNF9NTUFQX0JPICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBEUk1fVkM0X0NSRUFURV9TSEFERVJfQk8gICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIERSTV9WQzRfR0VUX0hBTkdfU1RBVEUgICAgICAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgRFJNX1ZDNF9HRVRfUEFSQU0gICAgICAgICAgICAgICAgICAgICAgICAgMHgwNworI2RlZmluZSBEUk1fVkM0X1NFVF9USUxJTkcgICAgICAgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIERSTV9WQzRfR0VUX1RJTElORyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkKKworI2RlZmluZSBEUk1fSU9DVExfVkM0X1NVQk1JVF9DTCAgICAgICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WQzRfU1VCTUlUX0NMLCBzdHJ1Y3QgZHJtX3ZjNF9zdWJtaXRfY2wpCisjZGVmaW5lIERSTV9JT0NUTF9WQzRfV0FJVF9TRVFOTyAgICAgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZDNF9XQUlUX1NFUU5PLCBzdHJ1Y3QgZHJtX3ZjNF93YWl0X3NlcW5vKQorI2RlZmluZSBEUk1fSU9DVExfVkM0X1dBSVRfQk8gICAgICAgICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WQzRfV0FJVF9CTywgc3RydWN0IGRybV92YzRfd2FpdF9ibykKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZDNF9DUkVBVEVfQk8gICAgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVkM0X0NSRUFURV9CTywgc3RydWN0IGRybV92YzRfY3JlYXRlX2JvKQorI2RlZmluZSBEUk1fSU9DVExfVkM0X01NQVBfQk8gICAgICAgICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WQzRfTU1BUF9CTywgc3RydWN0IGRybV92YzRfbW1hcF9ibykKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZDNF9DUkVBVEVfU0hBREVSX0JPICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVkM0X0NSRUFURV9TSEFERVJfQk8sIHN0cnVjdCBkcm1fdmM0X2NyZWF0ZV9zaGFkZXJfYm8pCisjZGVmaW5lIERSTV9JT0NUTF9WQzRfR0VUX0hBTkdfU1RBVEUgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZDNF9HRVRfSEFOR19TVEFURSwgc3RydWN0IGRybV92YzRfZ2V0X2hhbmdfc3RhdGUpCisjZGVmaW5lIERSTV9JT0NUTF9WQzRfR0VUX1BBUkFNICAgICAgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZDNF9HRVRfUEFSQU0sIHN0cnVjdCBkcm1fdmM0X2dldF9wYXJhbSkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZDNF9TRVRfVElMSU5HICAgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVkM0X1NFVF9USUxJTkcsIHN0cnVjdCBkcm1fdmM0X3NldF90aWxpbmcpCisjZGVmaW5lIERSTV9JT0NUTF9WQzRfR0VUX1RJTElORyAgICAgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZDNF9HRVRfVElMSU5HLCBzdHJ1Y3QgZHJtX3ZjNF9nZXRfdGlsaW5nKQorCitzdHJ1Y3QgZHJtX3ZjNF9zdWJtaXRfcmNsX3N1cmZhY2UgeworCV9fdTMyIGhpbmRleDsgLyogSGFuZGxlIGluZGV4LCBvciB+MCBpZiBub3QgcHJlc2VudC4gKi8KKwlfX3UzMiBvZmZzZXQ7IC8qIE9mZnNldCB0byBzdGFydCBvZiBidWZmZXIuICovCisJLyoKKwkgKiBCaXRzIGZvciBlaXRoZXIgcmVuZGVyIGNvbmZpZyAoY29sb3Jfd3JpdGUpIG9yIGxvYWQvc3RvcmUgcGFja2V0LgorCSAqIEJpdHMgc2hvdWxkIGFsbCBiZSAwIGZvciBNU0FBIGxvYWQvc3RvcmVzLgorCSAqLworCV9fdTE2IGJpdHM7CisKKyNkZWZpbmUgVkM0X1NVQk1JVF9SQ0xfU1VSRkFDRV9SRUFEX0lTX0ZVTExfUkVTCQkoMSA8PCAwKQorCV9fdTE2IGZsYWdzOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3ZjNF9zdWJtaXRfY2wgLSBpb2N0bCBhcmd1bWVudCBmb3Igc3VibWl0dGluZyBjb21tYW5kcyB0byB0aGUgM0QKKyAqIGVuZ2luZS4KKyAqCisgKiBEcml2ZXJzIHR5cGljYWxseSB1c2UgR1BVIEJPcyB0byBzdG9yZSBiYXRjaGJ1ZmZlcnMgLyBjb21tYW5kIGxpc3RzIGFuZAorICogdGhlaXIgYXNzb2NpYXRlZCBzdGF0ZS4gIEhvd2V2ZXIsIGJlY2F1c2UgdGhlIFZDNCBsYWNrcyBhbiBNTVUsIHdlIGhhdmUgdG8KKyAqIGRvIHZhbGlkYXRpb24gb2YgbWVtb3J5IGFjY2Vzc2VzIGJ5IHRoZSBHUFUgY29tbWFuZHMuICBJZiB3ZSB3ZXJlIHRvIHN0b3JlCisgKiBvdXIgY29tbWFuZHMgaW4gQk9zLCB3ZSdkIG5lZWQgdG8gZG8gdW5jYWNoZWQgcmVhZGJhY2sgZnJvbSB0aGVtIHRvIGRvIHRoZQorICogdmFsaWRhdGlvbiBwcm9jZXNzLCB3aGljaCBpcyB0b28gZXhwZW5zaXZlLiAgSW5zdGVhZCwgdXNlcnNwYWNlIGFjY3VtdWxhdGVzCisgKiBjb21tYW5kcyBhbmQgYXNzb2NpYXRlZCBzdGF0ZSBpbiBwbGFpbiBtZW1vcnksIHRoZW4gdGhlIGtlcm5lbCBjb3BpZXMgdGhlCisgKiBkYXRhIHRvIGl0cyBvd24gYWRkcmVzcyBzcGFjZSwgYW5kIHRoZW4gdmFsaWRhdGVzIGFuZCBzdG9yZXMgaXQgaW4gYSBHUFUKKyAqIEJPLgorICovCitzdHJ1Y3QgZHJtX3ZjNF9zdWJtaXRfY2wgeworCS8qIFBvaW50ZXIgdG8gdGhlIGJpbm5lciBjb21tYW5kIGxpc3QuCisJICoKKwkgKiBUaGlzIGlzIHRoZSBmaXJzdCBzZXQgb2YgY29tbWFuZHMgZXhlY3V0ZWQsIHdoaWNoIHJ1bnMgdGhlCisJICogY29vcmRpbmF0ZSBzaGFkZXIgdG8gZGV0ZXJtaW5lIHdoZXJlIHByaW1pdGl2ZXMgbGFuZCBvbiB0aGUgc2NyZWVuLAorCSAqIHRoZW4gd3JpdGVzIG91dCB0aGUgc3RhdGUgdXBkYXRlcyBhbmQgZHJhdyBjYWxscyBuZWNlc3NhcnkgcGVyIHRpbGUKKwkgKiB0byB0aGUgdGlsZSBhbGxvY2F0aW9uIEJPLgorCSAqLworCV9fdTY0IGJpbl9jbDsKKworCS8qIFBvaW50ZXIgdG8gdGhlIHNoYWRlciByZWNvcmRzLgorCSAqCisJICogU2hhZGVyIHJlY29yZHMgYXJlIHRoZSBzdHJ1Y3R1cmVzIHJlYWQgYnkgdGhlIGhhcmR3YXJlIHRoYXQgY29udGFpbgorCSAqIHBvaW50ZXJzIHRvIHVuaWZvcm1zLCBzaGFkZXJzLCBhbmQgdmVydGV4IGF0dHJpYnV0ZXMuICBUaGUKKwkgKiByZWZlcmVuY2UgdG8gdGhlIHNoYWRlciByZWNvcmQgaGFzIGVub3VnaCBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUKKwkgKiBob3cgbWFueSBwb2ludGVycyBhcmUgbmVjZXNzYXJ5IChmaXhlZCBudW1iZXIgZm9yIHNoYWRlcnMvdW5pZm9ybXMsCisJICogYW5kIGFuIGF0dHJpYnV0ZSBjb3VudCksIHNvIHRob3NlIEJPIGluZGljZXMgaW50byBib19oYW5kbGVzIGFyZQorCSAqIGp1c3Qgc3RvcmVkIGFzIF9fdTMycyBiZWZvcmUgZWFjaCBzaGFkZXIgcmVjb3JkIHBhc3NlZCBpbi4KKwkgKi8KKwlfX3U2NCBzaGFkZXJfcmVjOworCisJLyogUG9pbnRlciB0byB1bmlmb3JtIGRhdGEgYW5kIHRleHR1cmUgaGFuZGxlcyBmb3IgdGhlIHRleHR1cmVzCisJICogcmVmZXJlbmNlZCBieSB0aGUgc2hhZGVyLgorCSAqCisJICogRm9yIGVhY2ggc2hhZGVyIHN0YXRlIHJlY29yZCwgdGhlcmUgaXMgYSBzZXQgb2YgdW5pZm9ybSBkYXRhIGluIHRoZQorCSAqIG9yZGVyIHJlZmVyZW5jZWQgYnkgdGhlIHJlY29yZCAoRlMsIFZTLCB0aGVuIENTKS4gIEVhY2ggc2V0IG9mCisJICogdW5pZm9ybSBkYXRhIGhhcyBhIF9fdTMyIGluZGV4IGludG8gYm9faGFuZGxlcyBwZXIgdGV4dHVyZQorCSAqIHNhbXBsZSBvcGVyYXRpb24sIGluIHRoZSBvcmRlciB0aGUgUVBVX1dfVE1Vbl9TIHdyaXRlcyBhcHBlYXIgaW4KKwkgKiB0aGUgcHJvZ3JhbS4gIEZvbGxvd2luZyB0aGUgdGV4dHVyZSBCTyBoYW5kbGUgaW5kaWNlcyBpcyB0aGUgYWN0dWFsCisJICogdW5pZm9ybSBkYXRhLgorCSAqCisJICogVGhlIGluZGl2aWR1YWwgdW5pZm9ybSBzdGF0ZSBibG9ja3MgZG9uJ3QgaGF2ZSBzaXplcyBwYXNzZWQgaW4sCisJICogYmVjYXVzZSB0aGUga2VybmVsIGhhcyB0byBkZXRlcm1pbmUgdGhlIHNpemVzIGFueXdheSBkdXJpbmcgc2hhZGVyCisJICogY29kZSB2YWxpZGF0aW9uLgorCSAqLworCV9fdTY0IHVuaWZvcm1zOworCV9fdTY0IGJvX2hhbmRsZXM7CisKKwkvKiBTaXplIGluIGJ5dGVzIG9mIHRoZSBiaW5uZXIgY29tbWFuZCBsaXN0LiAqLworCV9fdTMyIGJpbl9jbF9zaXplOworCS8qIFNpemUgaW4gYnl0ZXMgb2YgdGhlIHNldCBvZiBzaGFkZXIgcmVjb3Jkcy4gKi8KKwlfX3UzMiBzaGFkZXJfcmVjX3NpemU7CisJLyogTnVtYmVyIG9mIHNoYWRlciByZWNvcmRzLgorCSAqCisJICogVGhpcyBjb3VsZCBqdXN0IGJlIGNvbXB1dGVkIGZyb20gdGhlIGNvbnRlbnRzIG9mIHNoYWRlcl9yZWNvcmRzIGFuZAorCSAqIHRoZSBhZGRyZXNzIGJpdHMgb2YgcmVmZXJlbmNlcyB0byB0aGVtIGZyb20gdGhlIGJpbiBDTCwgYnV0IGl0CisJICoga2VlcHMgdGhlIGtlcm5lbCBmcm9tIGhhdmluZyB0byByZXNpemUgc29tZSBhbGxvY2F0aW9ucyBpdCBtYWtlcy4KKwkgKi8KKwlfX3UzMiBzaGFkZXJfcmVjX2NvdW50OworCS8qIFNpemUgaW4gYnl0ZXMgb2YgdGhlIHVuaWZvcm0gc3RhdGUuICovCisJX191MzIgdW5pZm9ybXNfc2l6ZTsKKworCS8qIE51bWJlciBvZiBCTyBoYW5kbGVzIHBhc3NlZCBpbiAoc2l6ZSBpcyB0aGF0IHRpbWVzIDQpLiAqLworCV9fdTMyIGJvX2hhbmRsZV9jb3VudDsKKworCS8qIFJDTCBzZXR1cDogKi8KKwlfX3UxNiB3aWR0aDsKKwlfX3UxNiBoZWlnaHQ7CisJX191OCBtaW5feF90aWxlOworCV9fdTggbWluX3lfdGlsZTsKKwlfX3U4IG1heF94X3RpbGU7CisJX191OCBtYXhfeV90aWxlOworCXN0cnVjdCBkcm1fdmM0X3N1Ym1pdF9yY2xfc3VyZmFjZSBjb2xvcl9yZWFkOworCXN0cnVjdCBkcm1fdmM0X3N1Ym1pdF9yY2xfc3VyZmFjZSBjb2xvcl93cml0ZTsKKwlzdHJ1Y3QgZHJtX3ZjNF9zdWJtaXRfcmNsX3N1cmZhY2UgenNfcmVhZDsKKwlzdHJ1Y3QgZHJtX3ZjNF9zdWJtaXRfcmNsX3N1cmZhY2UgenNfd3JpdGU7CisJc3RydWN0IGRybV92YzRfc3VibWl0X3JjbF9zdXJmYWNlIG1zYWFfY29sb3Jfd3JpdGU7CisJc3RydWN0IGRybV92YzRfc3VibWl0X3JjbF9zdXJmYWNlIG1zYWFfenNfd3JpdGU7CisJX191MzIgY2xlYXJfY29sb3JbMl07CisJX191MzIgY2xlYXJfejsKKwlfX3U4IGNsZWFyX3M7CisKKwlfX3UzMiBwYWQ6MjQ7CisKKyNkZWZpbmUgVkM0X1NVQk1JVF9DTF9VU0VfQ0xFQVJfQ09MT1IJCQkoMSA8PCAwKQorCV9fdTMyIGZsYWdzOworCisJLyogUmV0dXJuZWQgdmFsdWUgb2YgdGhlIHNlcW5vIG9mIHRoaXMgcmVuZGVyIGpvYiAoZm9yIHRoZQorCSAqIHdhaXQgaW9jdGwpLgorCSAqLworCV9fdTY0IHNlcW5vOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3ZjNF93YWl0X3NlcW5vIC0gaW9jdGwgYXJndW1lbnQgZm9yIHdhaXRpbmcgZm9yCisgKiBEUk1fVkM0X1NVQk1JVF9DTCBjb21wbGV0aW9uIHVzaW5nIGl0cyByZXR1cm5lZCBzZXFuby4KKyAqCisgKiB0aW1lb3V0X25zIGlzIHRoZSB0aW1lb3V0IGluIG5hbm9zZWNvbmRzLCB3aGVyZSAiMCIgbWVhbnMgImRvbid0CisgKiBibG9jaywganVzdCByZXR1cm4gdGhlIHN0YXR1cy4iCisgKi8KK3N0cnVjdCBkcm1fdmM0X3dhaXRfc2Vxbm8geworCV9fdTY0IHNlcW5vOworCV9fdTY0IHRpbWVvdXRfbnM7Cit9OworCisvKioKKyAqIHN0cnVjdCBkcm1fdmM0X3dhaXRfYm8gLSBpb2N0bCBhcmd1bWVudCBmb3Igd2FpdGluZyBmb3IKKyAqIGNvbXBsZXRpb24gb2YgdGhlIGxhc3QgRFJNX1ZDNF9TVUJNSVRfQ0wgb24gYSBCTy4KKyAqCisgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgY2FzZXMgd2hlcmUgbXVsdGlwbGUgcHJvY2Vzc2VzIG1pZ2h0IGJlCisgKiByZW5kZXJpbmcgdG8gYSBCTyBhbmQgeW91IHdhbnQgdG8gd2FpdCBmb3IgYWxsIHJlbmRlcmluZyB0byBiZQorICogY29tcGxldGVkLgorICovCitzdHJ1Y3QgZHJtX3ZjNF93YWl0X2JvIHsKKwlfX3UzMiBoYW5kbGU7CisJX191MzIgcGFkOworCV9fdTY0IHRpbWVvdXRfbnM7Cit9OworCisvKioKKyAqIHN0cnVjdCBkcm1fdmM0X2NyZWF0ZV9ibyAtIGlvY3RsIGFyZ3VtZW50IGZvciBjcmVhdGluZyBWQzQgQk9zLgorICoKKyAqIFRoZXJlIGFyZSBjdXJyZW50bHkgbm8gdmFsdWVzIGZvciB0aGUgZmxhZ3MgYXJndW1lbnQsIGJ1dCBpdCBtYXkgYmUKKyAqIHVzZWQgaW4gYSBmdXR1cmUgZXh0ZW5zaW9uLgorICovCitzdHJ1Y3QgZHJtX3ZjNF9jcmVhdGVfYm8geworCV9fdTMyIHNpemU7CisJX191MzIgZmxhZ3M7CisJLyoqIFJldHVybmVkIEdFTSBoYW5kbGUgZm9yIHRoZSBCTy4gKi8KKwlfX3UzMiBoYW5kbGU7CisJX191MzIgcGFkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3ZjNF9tbWFwX2JvIC0gaW9jdGwgYXJndW1lbnQgZm9yIG1hcHBpbmcgVkM0IEJPcy4KKyAqCisgKiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcGVyZm9ybSBhbiBtbWFwLiAgSW5zdGVhZCwgaXQgcmV0dXJucyB0aGUKKyAqIG9mZnNldCB5b3UgbmVlZCB0byB1c2UgaW4gYW4gbW1hcCBvbiB0aGUgRFJNIGRldmljZSBub2RlLiAgVGhpcworICogbWVhbnMgdGhhdCB0b29scyBsaWtlIHZhbGdyaW5kIGVuZCB1cCBrbm93aW5nIGFib3V0IHRoZSBtYXBwZWQKKyAqIG1lbW9yeS4KKyAqCisgKiBUaGVyZSBhcmUgY3VycmVudGx5IG5vIHZhbHVlcyBmb3IgdGhlIGZsYWdzIGFyZ3VtZW50LCBidXQgaXQgbWF5IGJlCisgKiB1c2VkIGluIGEgZnV0dXJlIGV4dGVuc2lvbi4KKyAqLworc3RydWN0IGRybV92YzRfbW1hcF9ibyB7CisJLyoqIEhhbmRsZSBmb3IgdGhlIG9iamVjdCBiZWluZyBtYXBwZWQuICovCisJX191MzIgaGFuZGxlOworCV9fdTMyIGZsYWdzOworCS8qKiBvZmZzZXQgaW50byB0aGUgZHJtIG5vZGUgdG8gdXNlIGZvciBzdWJzZXF1ZW50IG1tYXAgY2FsbC4gKi8KKwlfX3U2NCBvZmZzZXQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBkcm1fdmM0X2NyZWF0ZV9zaGFkZXJfYm8gLSBpb2N0bCBhcmd1bWVudCBmb3IgY3JlYXRpbmcgVkM0CisgKiBzaGFkZXIgQk9zLgorICoKKyAqIFNpbmNlIGFsbG93aW5nIGEgc2hhZGVyIHRvIGJlIG92ZXJ3cml0dGVuIHdoaWxlIGl0J3MgYWxzbyBiZWluZworICogZXhlY3V0ZWQgZnJvbSB3b3VsZCBhbGxvdyBwcml2bGVnZSBlc2NhbGF0aW9uLCBzaGFkZXJzIG11c3QgYmUKKyAqIGNyZWF0ZWQgdXNpbmcgdGhpcyBpb2N0bCwgYW5kIHRoZXkgY2FuJ3QgYmUgbW1hcHBlZCBsYXRlci4KKyAqLworc3RydWN0IGRybV92YzRfY3JlYXRlX3NoYWRlcl9ibyB7CisJLyogU2l6ZSBvZiB0aGUgZGF0YSBhcmd1bWVudC4gKi8KKwlfX3UzMiBzaXplOworCS8qIEZsYWdzLCBjdXJyZW50bHkgbXVzdCBiZSAwLiAqLworCV9fdTMyIGZsYWdzOworCisJLyogUG9pbnRlciB0byB0aGUgZGF0YS4gKi8KKwlfX3U2NCBkYXRhOworCisJLyoqIFJldHVybmVkIEdFTSBoYW5kbGUgZm9yIHRoZSBCTy4gKi8KKwlfX3UzMiBoYW5kbGU7CisJLyogUGFkLCBtdXN0IGJlIDAuICovCisJX191MzIgcGFkOworfTsKKworc3RydWN0IGRybV92YzRfZ2V0X2hhbmdfc3RhdGVfYm8geworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBwYWRkcjsKKwlfX3UzMiBzaXplOworCV9fdTMyIHBhZDsKK307CisKKy8qKgorICogc3RydWN0IGRybV92YzRfaGFuZ19zdGF0ZSAtIGlvY3RsIGFyZ3VtZW50IGZvciBjb2xsZWN0aW5nIHN0YXRlCisgKiBmcm9tIGEgR1BVIGhhbmcgZm9yIGFuYWx5c2lzLgorKi8KK3N0cnVjdCBkcm1fdmM0X2dldF9oYW5nX3N0YXRlIHsKKwkvKiogUG9pbnRlciB0byBhcnJheSBvZiBzdHJ1Y3QgZHJtX3ZjNF9nZXRfaGFuZ19zdGF0ZV9iby4gKi8KKwlfX3U2NCBibzsKKwkvKioKKwkgKiBPbiBpbnB1dCwgdGhlIHNpemUgb2YgdGhlIGJvIGFycmF5LiAgT3V0cHV0IGlzIHRoZSBudW1iZXIKKwkgKiBvZiBib3MgdG8gYmUgcmV0dXJuZWQuCisJICovCisJX191MzIgYm9fY291bnQ7CisKKwlfX3UzMiBzdGFydF9iaW4sIHN0YXJ0X3JlbmRlcjsKKworCV9fdTMyIGN0MGNhLCBjdDBlYTsKKwlfX3UzMiBjdDFjYSwgY3QxZWE7CisJX191MzIgY3QwY3MsIGN0MWNzOworCV9fdTMyIGN0MHJhMCwgY3QxcmEwOworCisJX191MzIgYnBjYSwgYnBjczsKKwlfX3UzMiBicG9hLCBicG9zOworCisJX191MzIgdnBtYmFzZTsKKworCV9fdTMyIGRiZ2U7CisJX191MzIgZmRiZ287CisJX191MzIgZmRiZ2I7CisJX191MzIgZmRiZ3I7CisJX191MzIgZmRiZ3M7CisJX191MzIgZXJyc3RhdDsKKworCS8qIFBhZCB0aGF0IHdlIG1heSBzYXZlIG1vcmUgcmVnaXN0ZXJzIGludG8gaW4gdGhlIGZ1dHVyZS4gKi8KKwlfX3UzMiBwYWRbMTZdOworfTsKKworI2RlZmluZSBEUk1fVkM0X1BBUkFNX1YzRF9JREVOVDAJCTAKKyNkZWZpbmUgRFJNX1ZDNF9QQVJBTV9WM0RfSURFTlQxCQkxCisjZGVmaW5lIERSTV9WQzRfUEFSQU1fVjNEX0lERU5UMgkJMgorI2RlZmluZSBEUk1fVkM0X1BBUkFNX1NVUFBPUlRTX0JSQU5DSEVTCQkzCisjZGVmaW5lIERSTV9WQzRfUEFSQU1fU1VQUE9SVFNfRVRDMQkJNAorI2RlZmluZSBEUk1fVkM0X1BBUkFNX1NVUFBPUlRTX1RIUkVBREVEX0ZTCTUKKworc3RydWN0IGRybV92YzRfZ2V0X3BhcmFtIHsKKwlfX3UzMiBwYXJhbTsKKwlfX3UzMiBwYWQ7CisJX191NjQgdmFsdWU7Cit9OworCitzdHJ1Y3QgZHJtX3ZjNF9nZXRfdGlsaW5nIHsKKwlfX3UzMiBoYW5kbGU7CisJX191MzIgZmxhZ3M7CisJX191NjQgbW9kaWZpZXI7Cit9OworCitzdHJ1Y3QgZHJtX3ZjNF9zZXRfdGlsaW5nIHsKKwlfX3UzMiBoYW5kbGU7CisJX191MzIgZmxhZ3M7CisJX191NjQgbW9kaWZpZXI7Cit9OworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX1VBUElfVkM0X0RSTV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vdmlhX2RybS5oIGIvaW5jbHVkZS9kcm0vdmlhX2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MmY4NzkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS92aWFfZHJtLmgKQEAgLTAsMCArMSwyNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0yMDAzIFZJQSBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDMgUzMgR3JhcGhpY3MsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZJQSwgUzMgR1JBUEhJQ1MsIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF9WSUFfRFJNX0hfCisjZGVmaW5lIF9WSUFfRFJNX0hfCisKKyNpbmNsdWRlICJkcm0uaCIKKworLyogV0FSTklORzogVGhlc2UgZGVmaW5lcyBtdXN0IGJlIHRoZSBzYW1lIGFzIHdoYXQgdGhlIFhzZXJ2ZXIgdXNlcy4KKyAqIGlmIHlvdSBjaGFuZ2UgdGhlbSwgeW91IG11c3QgY2hhbmdlIHRoZSBkZWZpbmVzIGluIHRoZSBYc2VydmVyLgorICovCisKKyNpZm5kZWYgX1ZJQV9ERUZJTkVTXworI2RlZmluZSBfVklBX0RFRklORVNfCisKKyNpbmNsdWRlICJ2aWFfZHJtY2xpZW50LmgiCisKKyNkZWZpbmUgVklBX05SX1NBUkVBX0NMSVBSRUNUUwkJOAorI2RlZmluZSBWSUFfTlJfWFZNQ19QT1JUUyAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFZJQV9OUl9YVk1DX0xPQ0tTICAgICAgICAgICAgICAgNQorI2RlZmluZSBWSUFfTUFYX0NBQ0hFTElORV9TSVpFICAgICAgICAgIDY0CisjZGVmaW5lIFhWTUNMT0NLUFRSKHNhUHJpdixsb2NrTm8pCQkJCQlcCisJKChfX3ZvbGF0aWxlX18gc3RydWN0IGRybV9od19sb2NrICopKCgoKCh1bnNpZ25lZCBsb25nKSAoc2FQcml2KS0+WHZNQ0xvY2tBcmVhKSArIFwKKwkJCQkgICAgICAoVklBX01BWF9DQUNIRUxJTkVfU0laRSAtIDEpKSAmCVwKKwkJCQkgICAgIH4oVklBX01BWF9DQUNIRUxJTkVfU0laRSAtIDEpKSArCVwKKwkJCQkgICAgVklBX01BWF9DQUNIRUxJTkVfU0laRSoobG9ja05vKSkpCisKKy8qIEVhY2ggcmVnaW9uIGlzIGEgbWluaW11bSBvZiA2NGssIGFuZCB0aGVyZSBhcmUgYXQgbW9zdCA2NCBvZiB0aGVtLgorICovCisjZGVmaW5lIFZJQV9OUl9URVhfUkVHSU9OUyA2NAorI2RlZmluZSBWSUFfTE9HX01JTl9URVhfUkVHSU9OX1NJWkUgMTYKKyNlbmRpZgorCisjZGVmaW5lIFZJQV9VUExPQURfVEVYMElNQUdFICAweDEJLyogaGFuZGxlZCBjbGllbnRzaWRlICovCisjZGVmaW5lIFZJQV9VUExPQURfVEVYMUlNQUdFICAweDIJLyogaGFuZGxlZCBjbGllbnRzaWRlICovCisjZGVmaW5lIFZJQV9VUExPQURfQ1RYICAgICAgICAweDQKKyNkZWZpbmUgVklBX1VQTE9BRF9CVUZGRVJTICAgIDB4OAorI2RlZmluZSBWSUFfVVBMT0FEX1RFWDAgICAgICAgMHgxMAorI2RlZmluZSBWSUFfVVBMT0FEX1RFWDEgICAgICAgMHgyMAorI2RlZmluZSBWSUFfVVBMT0FEX0NMSVBSRUNUUyAgMHg0MAorI2RlZmluZSBWSUFfVVBMT0FEX0FMTCAgICAgICAgMHhmZgorCisvKiBWSUEgc3BlY2lmaWMgaW9jdGxzICovCisjZGVmaW5lIERSTV9WSUFfQUxMT0NNRU0JMHgwMAorI2RlZmluZSBEUk1fVklBX0ZSRUVNRU0JICAgICAgICAweDAxCisjZGVmaW5lIERSTV9WSUFfQUdQX0lOSVQJMHgwMgorI2RlZmluZSBEUk1fVklBX0ZCX0lOSVQJICAgICAgICAweDAzCisjZGVmaW5lIERSTV9WSUFfTUFQX0lOSVQJMHgwNAorI2RlZmluZSBEUk1fVklBX0RFQ19GVVRFWCAgICAgICAweDA1CisjZGVmaW5lIE5PVF9VU0VECisjZGVmaW5lIERSTV9WSUFfRE1BX0lOSVQJMHgwNworI2RlZmluZSBEUk1fVklBX0NNREJVRkZFUgkweDA4CisjZGVmaW5lIERSTV9WSUFfRkxVU0gJICAgICAgICAweDA5CisjZGVmaW5lIERSTV9WSUFfUENJQ01ECSAgICAgICAgMHgwYQorI2RlZmluZSBEUk1fVklBX0NNREJVRl9TSVpFCTB4MGIKKyNkZWZpbmUgTk9UX1VTRUQKKyNkZWZpbmUgRFJNX1ZJQV9XQUlUX0lSUSAgICAgICAgMHgwZAorI2RlZmluZSBEUk1fVklBX0RNQV9CTElUICAgICAgICAweDBlCisjZGVmaW5lIERSTV9WSUFfQkxJVF9TWU5DICAgICAgIDB4MGYKKworI2RlZmluZSBEUk1fSU9DVExfVklBX0FMTE9DTUVNCSAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfQUxMT0NNRU0sIGRybV92aWFfbWVtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfRlJFRU1FTQkgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0ZSRUVNRU0sIGRybV92aWFfbWVtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfQUdQX0lOSVQJICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9BR1BfSU5JVCwgZHJtX3ZpYV9hZ3BfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9GQl9JTklUCSAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfRkJfSU5JVCwgZHJtX3ZpYV9mYl90KQorI2RlZmluZSBEUk1fSU9DVExfVklBX01BUF9JTklUCSAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfTUFQX0lOSVQsIGRybV92aWFfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfVklBX0RFQ19GVVRFWCAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0RFQ19GVVRFWCwgZHJtX3ZpYV9mdXRleF90KQorI2RlZmluZSBEUk1fSU9DVExfVklBX0RNQV9JTklUCSAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfRE1BX0lOSVQsIGRybV92aWFfZG1hX2luaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9DTURCVUZGRVIJICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9DTURCVUZGRVIsIGRybV92aWFfY21kYnVmZmVyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfRkxVU0gJICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9GTFVTSCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9QQ0lDTUQJICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9QQ0lDTUQsIGRybV92aWFfY21kYnVmZmVyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfQ01EQlVGX1NJWkUgRFJNX0lPV1IoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0NNREJVRl9TSVpFLCBcCisJCQkJCSAgICBkcm1fdmlhX2NtZGJ1Zl9zaXplX3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfV0FJVF9JUlEgICAgRFJNX0lPV1IoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX1dBSVRfSVJRLCBkcm1fdmlhX2lycXdhaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9ETUFfQkxJVCAgICBEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0RNQV9CTElULCBkcm1fdmlhX2RtYWJsaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9CTElUX1NZTkMgICBEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0JMSVRfU1lOQywgZHJtX3ZpYV9ibGl0c3luY190KQorCisvKiBJbmRpY2VzIGludG8gYnVmLlNldHVwIHdoZXJlIHZhcmlvdXMgYml0cyBvZiBzdGF0ZSBhcmUgbWlycm9yZWQgcGVyCisgKiBjb250ZXh0IGFuZCBwZXIgYnVmZmVyLiAgVGhlc2UgY2FuIGJlIGZpcmVkIGF0IHRoZSBjYXJkIGFzIGEgdW5pdCwKKyAqIG9yIGluIGEgcGllY2V3aXNlIGZhc2hpb24gYXMgcmVxdWlyZWQuCisgKi8KKworI2RlZmluZSBWSUFfVEVYX1NFVFVQX1NJWkUgOAorCisvKiBGbGFncyBmb3IgY2xlYXIgaW9jdGwKKyAqLworI2RlZmluZSBWSUFfRlJPTlQgICAweDEKKyNkZWZpbmUgVklBX0JBQ0sgICAgMHgyCisjZGVmaW5lIFZJQV9ERVBUSCAgIDB4NAorI2RlZmluZSBWSUFfU1RFTkNJTCAweDgKKyNkZWZpbmUgVklBX01FTV9WSURFTyAgIDAJLyogbWF0Y2hlcyBkcm0gY29uc3RhbnQgKi8KKyNkZWZpbmUgVklBX01FTV9BR1AgICAgIDEJLyogbWF0Y2hlcyBkcm0gY29uc3RhbnQgKi8KKyNkZWZpbmUgVklBX01FTV9TWVNURU0gIDIKKyNkZWZpbmUgVklBX01FTV9NSVhFRCAgIDMKKyNkZWZpbmUgVklBX01FTV9VTktOT1dOIDQKKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fdTMyIG9mZnNldDsKKwlfX3UzMiBzaXplOworfSBkcm1fdmlhX2FncF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJX191MzIgb2Zmc2V0OworCV9fdTMyIHNpemU7Cit9IGRybV92aWFfZmJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fdTMyIGNvbnRleHQ7CisJX191MzIgdHlwZTsKKwlfX3UzMiBzaXplOworCXVuc2lnbmVkIGxvbmcgaW5kZXg7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7Cit9IGRybV92aWFfbWVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX2luaXQgeworCWVudW0geworCQlWSUFfSU5JVF9NQVAgPSAweDAxLAorCQlWSUFfQ0xFQU5VUF9NQVAgPSAweDAyCisJfSBmdW5jOworCisJdW5zaWduZWQgbG9uZyBzYXJlYV9wcml2X29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGZiX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIG1taW9fb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgYWdwQWRkcjsKK30gZHJtX3ZpYV9pbml0X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX2Z1dGV4IHsKKwllbnVtIHsKKwkJVklBX0ZVVEVYX1dBSVQgPSAweDAwLAorCQlWSUFfRlVURVhfV0FLRSA9IDBYMDEKKwl9IGZ1bmM7CisJX191MzIgbXM7CisJX191MzIgbG9jazsKKwlfX3UzMiB2YWw7Cit9IGRybV92aWFfZnV0ZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV92aWFfZG1hX2luaXQgeworCWVudW0geworCQlWSUFfSU5JVF9ETUEgPSAweDAxLAorCQlWSUFfQ0xFQU5VUF9ETUEgPSAweDAyLAorCQlWSUFfRE1BX0lOSVRJQUxJWkVEID0gMHgwMworCX0gZnVuYzsKKworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHJlZ19wYXVzZV9hZGRyOworfSBkcm1fdmlhX2RtYV9pbml0X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX2NtZGJ1ZmZlciB7CisJY2hhciAqYnVmOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKK30gZHJtX3ZpYV9jbWRidWZmZXJfdDsKKworLyogV2FybmluZzogSWYgeW91IGNoYW5nZSB0aGUgU0FSRUEgc3RydWN0dXJlIHlvdSBtdXN0IGNoYW5nZSB0aGUgWHNlcnZlcgorICogc3RydWN0dXJlIGFzIHdlbGwgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2RybV92aWFfdGV4X3JlZ2lvbiB7CisJdW5zaWduZWQgY2hhciBuZXh0LCBwcmV2OwkvKiBpbmRpY2VzIHRvIGZvcm0gYSBjaXJjdWxhciBMUlUgICovCisJdW5zaWduZWQgY2hhciBpblVzZTsJLyogb3duZWQgYnkgYSBjbGllbnQsIG9yIGZyZWU/ICovCisJaW50IGFnZTsJCS8qIHRyYWNrZWQgYnkgY2xpZW50cyB0byB1cGRhdGUgbG9jYWwgTFJVJ3MgKi8KK30gZHJtX3ZpYV90ZXhfcmVnaW9uX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX3NhcmVhIHsKKwl1bnNpZ25lZCBpbnQgZGlydHk7CisJdW5zaWduZWQgaW50IG5ib3g7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgYm94ZXNbVklBX05SX1NBUkVBX0NMSVBSRUNUU107CisJZHJtX3ZpYV90ZXhfcmVnaW9uX3QgdGV4TGlzdFtWSUFfTlJfVEVYX1JFR0lPTlMgKyAxXTsKKwlpbnQgdGV4QWdlOwkJLyogbGFzdCB0aW1lIHRleHR1cmUgd2FzIHVwbG9hZGVkICovCisJaW50IGN0eE93bmVyOwkJLyogbGFzdCBjb250ZXh0IHRvIHVwbG9hZCBzdGF0ZSAqLworCWludCB2ZXJ0ZXhQcmltOworCisJLyoKKwkgKiBCZWxvdyBpcyBmb3IgWHZNQy4KKwkgKiBXZSB3YW50IHRoZSBsb2NrIGludGVnZXJzIGFsb25lIG9uLCBhbmQgYWxpZ25lZCB0bywgYSBjYWNoZSBsaW5lLgorCSAqIFRoZXJlZm9yZSB0aGlzIHNvbWV3aGF0IHN0cmFuZ2UgY29uc3RydWN0LgorCSAqLworCisJY2hhciBYdk1DTG9ja0FyZWFbVklBX01BWF9DQUNIRUxJTkVfU0laRSAqIChWSUFfTlJfWFZNQ19MT0NLUyArIDEpXTsKKworCXVuc2lnbmVkIGludCBYdk1DRGlzcGxheWluZ1tWSUFfTlJfWFZNQ19QT1JUU107CisJdW5zaWduZWQgaW50IFh2TUNTdWJQaWNPbltWSUFfTlJfWFZNQ19QT1JUU107CisJdW5zaWduZWQgaW50IFh2TUNDdHhOb0dyYWJiZWQ7CS8qIExhc3QgY29udGV4dCB0byBob2xkIGRlY29kZXIgKi8KKworCS8qIFVzZWQgYnkgdGhlIDNkIGRyaXZlciBvbmx5IGF0IHRoaXMgcG9pbnQsIGZvciBwYWdlZmxpcHBpbmc6CisJICovCisJdW5zaWduZWQgaW50IHBmQ3VycmVudE9mZnNldDsKK30gZHJtX3ZpYV9zYXJlYV90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX3ZpYV9jbWRidWZfc2l6ZSB7CisJZW51bSB7CisJCVZJQV9DTURCVUZfU1BBQ0UgPSAweDAxLAorCQlWSUFfQ01EQlVGX0xBRyA9IDB4MDIKKwl9IGZ1bmM7CisJaW50IHdhaXQ7CisJX191MzIgc2l6ZTsKK30gZHJtX3ZpYV9jbWRidWZfc2l6ZV90OworCit0eXBlZGVmIGVudW0geworCVZJQV9JUlFfQUJTT0xVVEUgPSAweDAsCisJVklBX0lSUV9SRUxBVElWRSA9IDB4MSwKKwlWSUFfSVJRX1NJR05BTCA9IDB4MTAwMDAwMDAsCisJVklBX0lSUV9GT1JDRV9TRVFVRU5DRSA9IDB4MjAwMDAwMDAKK30gdmlhX2lycV9zZXFfdHlwZV90OworCisjZGVmaW5lIFZJQV9JUlFfRkxBR1NfTUFTSyAweEYwMDAwMDAwCisKK2VudW0gZHJtX3ZpYV9pcnFzIHsKKwlkcm1fdmlhX2lycV9ocXYwID0gMCwKKwlkcm1fdmlhX2lycV9ocXYxLAorCWRybV92aWFfaXJxX2RtYTBfZGQsCisJZHJtX3ZpYV9pcnFfZG1hMF90ZCwKKwlkcm1fdmlhX2lycV9kbWExX2RkLAorCWRybV92aWFfaXJxX2RtYTFfdGQsCisJZHJtX3ZpYV9pcnFfbnVtCit9OworCitzdHJ1Y3QgZHJtX3ZpYV93YWl0X2lycV9yZXF1ZXN0IHsKKwl1bnNpZ25lZCBpcnE7CisJdmlhX2lycV9zZXFfdHlwZV90IHR5cGU7CisJX191MzIgc2VxdWVuY2U7CisJX191MzIgc2lnbmFsOworfTsKKwordHlwZWRlZiB1bmlvbiBkcm1fdmlhX2lycXdhaXQgeworCXN0cnVjdCBkcm1fdmlhX3dhaXRfaXJxX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcGx5IHJlcGx5OworfSBkcm1fdmlhX2lycXdhaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3ZpYV9ibGl0c3luYyB7CisJX191MzIgc3luY19oYW5kbGU7CisJdW5zaWduZWQgZW5naW5lOworfSBkcm1fdmlhX2JsaXRzeW5jX3Q7CisKKy8qIC0gKiBCZWxvdywiZmxhZ3MiIGlzIGN1cnJlbnRseSB1bnVzZWQgYnV0IHdpbGwgYmUgdXNlZCBmb3IgcG9zc2libGUgZnV0dXJlCisgKiBleHRlbnNpb25zIGxpa2Uga2VybmVsIHNwYWNlIGJvdW5jZSBidWZmZXJzIGZvciBiYWQgYWxpZ25tZW50cyBhbmQKKyAqIGJsaXQgZW5naW5lIGJ1c3ktd2FpdCBwb2xsaW5nIGZvciBiZXR0ZXIgbGF0ZW5jeSBpbiB0aGUgYWJzZW5jZSBvZgorICogaW50ZXJydXB0cy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBkcm1fdmlhX2RtYWJsaXQgeworCV9fdTMyIG51bV9saW5lczsKKwlfX3UzMiBsaW5lX2xlbmd0aDsKKworCV9fdTMyIGZiX2FkZHI7CisJX191MzIgZmJfc3RyaWRlOworCisJdW5zaWduZWQgY2hhciAqbWVtX2FkZHI7CisJX191MzIgbWVtX3N0cmlkZTsKKworCV9fdTMyIGZsYWdzOworCWludCB0b19mYjsKKworCWRybV92aWFfYmxpdHN5bmNfdCBzeW5jOworfSBkcm1fdmlhX2RtYWJsaXRfdDsKKworI2VuZGlmCQkJCS8qIF9WSUFfRFJNX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS92aXJ0Z3B1X2RybS5oIGIvaW5jbHVkZS9kcm0vdmlydGdwdV9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWEzMWZmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0vdmlydGdwdV9kcm0uaApAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEzIFJlZCBIYXQKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisjaWZuZGVmIFZJUlRHUFVfRFJNX0gKKyNkZWZpbmUgVklSVEdQVV9EUk1fSAorCisjaW5jbHVkZSAiZHJtLmgiCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogUGxlYXNlIG5vdGUgdGhhdCBtb2RpZmljYXRpb25zIHRvIGFsbCBzdHJ1Y3RzIGRlZmluZWQgaGVyZSBhcmUKKyAqIHN1YmplY3QgdG8gYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgY29uc3RyYWludHMuCisgKgorICogRG8gbm90IHVzZSBwb2ludGVycywgdXNlIF9fdTY0IGluc3RlYWQgZm9yIDMyIGJpdCAvIDY0IGJpdCB1c2VyL2tlcm5lbAorICogY29tcGF0aWJpbGl0eSBLZWVwIGZpZWxkcyBhbGlnbmVkIHRvIHRoZWlyIHNpemUKKyAqLworCisjZGVmaW5lIERSTV9WSVJUR1BVX01BUCAgICAgICAgIDB4MDEKKyNkZWZpbmUgRFJNX1ZJUlRHUFVfRVhFQ0JVRkZFUiAgMHgwMgorI2RlZmluZSBEUk1fVklSVEdQVV9HRVRQQVJBTSAgICAweDAzCisjZGVmaW5lIERSTV9WSVJUR1BVX1JFU09VUkNFX0NSRUFURSAweDA0CisjZGVmaW5lIERSTV9WSVJUR1BVX1JFU09VUkNFX0lORk8gICAgIDB4MDUKKyNkZWZpbmUgRFJNX1ZJUlRHUFVfVFJBTlNGRVJfRlJPTV9IT1NUIDB4MDYKKyNkZWZpbmUgRFJNX1ZJUlRHUFVfVFJBTlNGRVJfVE9fSE9TVCAweDA3CisjZGVmaW5lIERSTV9WSVJUR1BVX1dBSVQgICAgIDB4MDgKKyNkZWZpbmUgRFJNX1ZJUlRHUFVfR0VUX0NBUFMgIDB4MDkKKworc3RydWN0IGRybV92aXJ0Z3B1X21hcCB7CisJX191NjQgb2Zmc2V0OyAvKiB1c2UgZm9yIG1tYXAgc3lzdGVtIGNhbGwgKi8KKwlfX3UzMiBoYW5kbGU7CisJX191MzIgcGFkOworfTsKKworc3RydWN0IGRybV92aXJ0Z3B1X2V4ZWNidWZmZXIgeworCV9fdTMyCQlmbGFnczsJCS8qIGZvciBmdXR1cmUgdXNlICovCisJX191MzIgc2l6ZTsKKwlfX3U2NCBjb21tYW5kOyAvKiB2b2lkKiAqLworCV9fdTY0IGJvX2hhbmRsZXM7CisJX191MzIgbnVtX2JvX2hhbmRsZXM7CisJX191MzIgcGFkOworfTsKKworI2RlZmluZSBWSVJUR1BVX1BBUkFNXzNEX0ZFQVRVUkVTIDEgLyogZG8gd2UgaGF2ZSAzRCBmZWF0dXJlcyBpbiB0aGUgaHcgKi8KKworc3RydWN0IGRybV92aXJ0Z3B1X2dldHBhcmFtIHsKKwlfX3U2NCBwYXJhbTsKKwlfX3U2NCB2YWx1ZTsKK307CisKKy8qIE5PX0JPIGZsYWdzPyBOTyByZXNvdXJjZSBmbGFnPyAqLworLyogcmVzb3VyY2UgZmxhZyBmb3IgeV8wX3RvcCAqLworc3RydWN0IGRybV92aXJ0Z3B1X3Jlc291cmNlX2NyZWF0ZSB7CisJX191MzIgdGFyZ2V0OworCV9fdTMyIGZvcm1hdDsKKwlfX3UzMiBiaW5kOworCV9fdTMyIHdpZHRoOworCV9fdTMyIGhlaWdodDsKKwlfX3UzMiBkZXB0aDsKKwlfX3UzMiBhcnJheV9zaXplOworCV9fdTMyIGxhc3RfbGV2ZWw7CisJX191MzIgbnJfc2FtcGxlczsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBib19oYW5kbGU7IC8qIGlmIHRoaXMgaXMgc2V0IC0gcmVjcmVhdGUgYSBuZXcgcmVzb3VyY2UgYXR0YWNoZWQgdG8gdGhpcyBibyA/ICovCisJX191MzIgcmVzX2hhbmRsZTsgIC8qIHJldHVybmVkIGJ5IGtlcm5lbCAqLworCV9fdTMyIHNpemU7ICAgICAgICAvKiB2YWxpZGF0ZSB0cmFuc2ZlciBpbiB0aGUgaG9zdCAqLworCV9fdTMyIHN0cmlkZTsgICAgICAvKiB2YWxpZGF0ZSB0cmFuc2ZlciBpbiB0aGUgaG9zdCAqLworfTsKKworc3RydWN0IGRybV92aXJ0Z3B1X3Jlc291cmNlX2luZm8geworCV9fdTMyIGJvX2hhbmRsZTsKKwlfX3UzMiByZXNfaGFuZGxlOworCV9fdTMyIHNpemU7CisJX191MzIgc3RyaWRlOworfTsKKworc3RydWN0IGRybV92aXJ0Z3B1XzNkX2JveCB7CisJX191MzIgeDsKKwlfX3UzMiB5OworCV9fdTMyIHo7CisJX191MzIgdzsKKwlfX3UzMiBoOworCV9fdTMyIGQ7Cit9OworCitzdHJ1Y3QgZHJtX3ZpcnRncHVfM2RfdHJhbnNmZXJfdG9faG9zdCB7CisJX191MzIgYm9faGFuZGxlOworCXN0cnVjdCBkcm1fdmlydGdwdV8zZF9ib3ggYm94OworCV9fdTMyIGxldmVsOworCV9fdTMyIG9mZnNldDsKK307CisKK3N0cnVjdCBkcm1fdmlydGdwdV8zZF90cmFuc2Zlcl9mcm9tX2hvc3QgeworCV9fdTMyIGJvX2hhbmRsZTsKKwlzdHJ1Y3QgZHJtX3ZpcnRncHVfM2RfYm94IGJveDsKKwlfX3UzMiBsZXZlbDsKKwlfX3UzMiBvZmZzZXQ7Cit9OworCisjZGVmaW5lIFZJUlRHUFVfV0FJVF9OT1dBSVQgMSAvKiBsaWtlIGl0ICovCitzdHJ1Y3QgZHJtX3ZpcnRncHVfM2Rfd2FpdCB7CisJX191MzIgaGFuZGxlOyAvKiAwIGlzIGFuIGludmFsaWQgaGFuZGxlICovCisJX191MzIgZmxhZ3M7Cit9OworCitzdHJ1Y3QgZHJtX3ZpcnRncHVfZ2V0X2NhcHMgeworCV9fdTMyIGNhcF9zZXRfaWQ7CisJX191MzIgY2FwX3NldF92ZXI7CisJX191NjQgYWRkcjsKKwlfX3UzMiBzaXplOworCV9fdTMyIHBhZDsKK307CisKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJUlRHUFVfTUFQIFwKKwlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJUlRHUFVfTUFQLCBzdHJ1Y3QgZHJtX3ZpcnRncHVfbWFwKQorCisjZGVmaW5lIERSTV9JT0NUTF9WSVJUR1BVX0VYRUNCVUZGRVIgXAorCURSTV9JT1coRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSVJUR1BVX0VYRUNCVUZGRVIsXAorCQlzdHJ1Y3QgZHJtX3ZpcnRncHVfZXhlY2J1ZmZlcikKKworI2RlZmluZSBEUk1fSU9DVExfVklSVEdQVV9HRVRQQVJBTSBcCisJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSVJUR1BVX0dFVFBBUkFNLFwKKwkJc3RydWN0IGRybV92aXJ0Z3B1X2dldHBhcmFtKQorCisjZGVmaW5lIERSTV9JT0NUTF9WSVJUR1BVX1JFU09VUkNFX0NSRUFURQkJCVwKKwlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJUlRHUFVfUkVTT1VSQ0VfQ1JFQVRFLAlcCisJCXN0cnVjdCBkcm1fdmlydGdwdV9yZXNvdXJjZV9jcmVhdGUpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJUlRHUFVfUkVTT1VSQ0VfSU5GTyBcCisJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSVJUR1BVX1JFU09VUkNFX0lORk8sIFwKKwkJIHN0cnVjdCBkcm1fdmlydGdwdV9yZXNvdXJjZV9pbmZvKQorCisjZGVmaW5lIERSTV9JT0NUTF9WSVJUR1BVX1RSQU5TRkVSX0ZST01fSE9TVCBcCisJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSVJUR1BVX1RSQU5TRkVSX0ZST01fSE9TVCwJXAorCQlzdHJ1Y3QgZHJtX3ZpcnRncHVfM2RfdHJhbnNmZXJfZnJvbV9ob3N0KQorCisjZGVmaW5lIERSTV9JT0NUTF9WSVJUR1BVX1RSQU5TRkVSX1RPX0hPU1QgXAorCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklSVEdQVV9UUkFOU0ZFUl9UT19IT1NULAlcCisJCXN0cnVjdCBkcm1fdmlydGdwdV8zZF90cmFuc2Zlcl90b19ob3N0KQorCisjZGVmaW5lIERSTV9JT0NUTF9WSVJUR1BVX1dBSVQJCQkJXAorCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklSVEdQVV9XQUlULAlcCisJCXN0cnVjdCBkcm1fdmlydGdwdV8zZF93YWl0KQorCisjZGVmaW5lIERSTV9JT0NUTF9WSVJUR1BVX0dFVF9DQVBTIFwKKwlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJUlRHUFVfR0VUX0NBUFMsIFwKKwlzdHJ1Y3QgZHJtX3ZpcnRncHVfZ2V0X2NhcHMpCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vdml2YW50ZV9kcm0uaCBiL2luY2x1ZGUvZHJtL3ZpdmFudGVfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5ZWE1MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL3ZpdmFudGVfZHJtLmgKQEAgLTAsMCArMSwxNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgIENvcHlyaWdodCAyMDEyIC0gMjAxNyBWaXZhbnRlIENvcnBvcmF0aW9uLCBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYS4KKyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyogICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisqICAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorKiAgICAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisqICAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyogICAgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworKiAgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKKyogICAgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorKgorKiAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorKiAgICBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorKiAgICBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisqCisqICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiAgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyogICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyogICAgSU4gTk8gRVZFTlQgU0hBTEwgVklWQU5URSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWQorKiAgICBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorKiAgICBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorKiAgICBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19WSVZOQVRFX0RSTV9IX18KKyNkZWZpbmUgX19WSVZOQVRFX0RSTV9IX18KKworI2luY2x1ZGUgPGRybS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIGNyZWF0aW9uIGZsYWcgYml0cy4gKi8KKyNkZWZpbmUgRFJNX1ZJVl9HRU1fQ09OVElHVU9VUyAgICAgICgxdSA8PCAwKQorI2RlZmluZSBEUk1fVklWX0dFTV9DQUNIRUQgICAgICAgICAgKDF1IDw8IDEpCisjZGVmaW5lIERSTV9WSVZfR0VNX1NFQ1VSRSAgICAgICAgICAoMXUgPDwgMikKKyNkZWZpbmUgRFJNX1ZJVl9HRU1fQ01BX0xJTUlUICAgICAgICgxdSA8PCAzKQorCitzdHJ1Y3QgZHJtX3Zpdl9nZW1fY3JlYXRlIHsKKyAgICBfX3U2NCBzaXplOworICAgIF9fdTMyIGZsYWdzOworICAgIF9fdTMyIGhhbmRsZTsKK307CisKK3N0cnVjdCBkcm1fdml2X2dlbV9sb2NrIHsKKyAgICBfX3UzMiBoYW5kbGU7CisgICAgX191MzIgY2FjaGVhYmxlOworICAgIF9fdTY0IGxvZ2ljYWw7Cit9OworCitzdHJ1Y3QgZHJtX3Zpdl9nZW1fdW5sb2NrIHsKKyAgICBfX3UzMiBoYW5kbGU7Cit9OworCisKKyNkZWZpbmUgRFJNX1ZJVl9HRU1fQ0xFQU5fQ0FDSEUgICAgICAgICAweDAxCisjZGVmaW5lIERSTV9WSVZfR0VNX0lOVkFMSURBVEVfQ0FDSEUgICAgMHgwMgorI2RlZmluZSBEUk1fVklWX0dFTV9GTFVTSF9DQUNIRSAgICAgICAgIDB4MDMKKyNkZWZpbmUgRFJNX1ZJVl9HRU1fTUVNT1JZX0JBUlJJRVIgICAgICAweDA0CisKK3N0cnVjdCBkcm1fdml2X2dlbV9jYWNoZSB7CisgICAgX191MzIgaGFuZGxlOworICAgIF9fdTMyIG9wOworICAgIF9fdTY0IGxvZ2ljYWw7CisgICAgX191NjQgYnl0ZXM7Cit9OworCisKKyNkZWZpbmUgRFJNX1ZJVl9HRU1fUEFSQU1fUE9PTCAgICAgIDB4MDAKKyNkZWZpbmUgRFJNX1ZJVl9HRU1fUEFSQU1fU0laRSAgICAgIDB4MDEKKworc3RydWN0IGRybV92aXZfZ2VtX3F1ZXJ5IHsKKyAgICBfX3UzMiBoYW5kbGU7CisgICAgX191MzIgcGFyYW07CisgICAgX191NjQgdmFsdWU7Cit9OworCisKK3N0cnVjdCBkcm1fdml2X2dlbV90aW1lc3RhbXAgeworICAgIF9fdTMyIGhhbmRsZTsKKyAgICAvKiBpbmMgY291bnQsIDAgZm9yIHF1ZXJ5IGN1cnJlbnQuICovCisgICAgX191MzIgaW5jOworICAgIC8qIG91dHB1dCBpbmMnZWQgdGltZXN0YW1wLiAqLworICAgIF9fdTY0IHRpbWVzdGFtcDsKK307CisKKworLyogYmFzaWMgdGlsaW5nIG1vZGUuICovCisjZGVmaW5lIERSTV9WSVZfR0VNX1RJTElOR19MSU5FQVIgICAgICAgMHgwMQorI2RlZmluZSBEUk1fVklWX0dFTV9USUxJTkdfVElMRUQgICAgICAgIDB4MDIKKyNkZWZpbmUgRFJNX1ZJVl9HRU1fVElMSU5HX1NVUEVSVElMRUQgICAweDA0CisjZGVmaW5lIERSTV9WSVZfR0VNX1RJTElOR19NSU5PUlRJTEVEICAgMHgwOAorCisvKiB0aWxpbmcgbW9kZSBtb2RpZmllcnMuICovCisjZGVmaW5lIERSTV9WSVZfR0VNX1RJTElOR19TUExJVCAgICAweDEwCisjZGVmaW5lIERSTV9WSVZfR0VNX1RJTElOR19YX01BSk9SICAweDIwCisjZGVmaW5lIERSTV9WSVZfR0VNX1RJTElOR19ZX01BSk9SICAweDQwCisjZGVmaW5lIERSTV9WSVZfR0VNX1RJTElOR19TV0FQICAgICAweDgwCisKKy8qIHRzIG1vZGUuICovCisjZGVmaW5lIERSTV9WSVZfR0VNX1RTX05PTkUgICAgICAgICAweDAwCisjZGVmaW5lIERSTV9WSVZfR0VNX1RTX0RJU0FCTEVEICAgICAweDAxCisjZGVmaW5lIERSTV9WSVZfR0VNX1RTX05PUk1BTCAgICAgICAweDAyCisjZGVmaW5lIERSTV9WSVZfR0VNX1RTX0NPTVBSRVNTRUQgICAweDAzCisKK3N0cnVjdCBkcm1fdml2X2dlbV9zZXRfdGlsaW5nIHsKKyAgICBfX3UzMiBoYW5kbGU7CisgICAgX191MzIgdGlsaW5nX21vZGU7CisKKyAgICBfX3UzMiB0c19tb2RlOworICAgIF9fdTY0IGNsZWFyX3ZhbHVlOworfTsKKworc3RydWN0IGRybV92aXZfZ2VtX2dldF90aWxpbmcgeworICAgIF9fdTMyIGhhbmRsZTsKKyAgICBfX3UzMiB0aWxpbmdfbW9kZTsKKworICAgIF9fdTMyIHRzX21vZGU7CisgICAgX191NjQgY2xlYXJfdmFsdWU7Cit9OworCisKK3N0cnVjdCBkcm1fdml2X2dlbV9hdHRhY2hfYXV4IHsKKyAgICBfX3UzMiBoYW5kbGU7CisgICAgX191MzIgdHNfaGFuZGxlOworfTsKKworCitzdHJ1Y3QgZHJtX3Zpdl9nZW1fcmVmX25vZGUgeworICAgIF9fdTMyIGhhbmRsZTsKKworICAgIC8qIG91dHB1dC4gKi8KKyAgICBfX3UzMiBub2RlOworICAgIF9fdTMyIHRzX25vZGU7Cit9OworCisKKyNkZWZpbmUgRFJNX1ZJVl9HRU1fQ1JFQVRFICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRFJNX1ZJVl9HRU1fTE9DSyAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRFJNX1ZJVl9HRU1fVU5MT0NLICAgICAgICAgIDB4MDIKKyNkZWZpbmUgRFJNX1ZJVl9HRU1fQ0FDSEUgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgRFJNX1ZJVl9HRU1fUVVFUlkgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRFJNX1ZJVl9HRU1fVElNRVNUQU1QICAgICAgIDB4MDUKKyNkZWZpbmUgRFJNX1ZJVl9HRU1fU0VUX1RJTElORyAgICAgIDB4MDYKKyNkZWZpbmUgRFJNX1ZJVl9HRU1fR0VUX1RJTElORyAgICAgIDB4MDcKKyNkZWZpbmUgRFJNX1ZJVl9HRU1fQVRUQUNIX0FVWCAgICAgIDB4MDgKKyNkZWZpbmUgRFJNX1ZJVl9HRU1fUkVGX05PREUgICAgICAgIDB4MDkKKyNkZWZpbmUgRFJNX1ZJVl9OVU1fSU9DVExTICAgICAgICAgIDB4MEEKKworI2RlZmluZSBEUk1fSU9DVExfVklWX0dFTV9DUkVBVEUgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklWX0dFTV9DUkVBVEUsICAgICBzdHJ1Y3QgZHJtX3Zpdl9nZW1fY3JlYXRlKQorI2RlZmluZSBEUk1fSU9DVExfVklWX0dFTV9MT0NLICAgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklWX0dFTV9MT0NLLCAgICAgICBzdHJ1Y3QgZHJtX3Zpdl9nZW1fbG9jaykKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJVl9HRU1fVU5MT0NLICAgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJVl9HRU1fVU5MT0NLLCAgICAgc3RydWN0IGRybV92aXZfZ2VtX3VubG9jaykKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJVl9HRU1fQ0FDSEUgICAgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJVl9HRU1fQ0FDSEUsICAgICAgc3RydWN0IGRybV92aXZfZ2VtX2NhY2hlKQorI2RlZmluZSBEUk1fSU9DVExfVklWX0dFTV9RVUVSWSAgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklWX0dFTV9RVUVSWSwgICAgICBzdHJ1Y3QgZHJtX3Zpdl9nZW1fcXVlcnkpCisjZGVmaW5lIERSTV9JT0NUTF9WSVZfR0VNX1RJTUVTVEFNUCAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSVZfR0VNX1RJTUVTVEFNUCwgIHN0cnVjdCBkcm1fdml2X2dlbV90aW1lc3RhbXApCisjZGVmaW5lIERSTV9JT0NUTF9WSVZfR0VNX1NFVF9USUxJTkcgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSVZfR0VNX1NFVF9USUxJTkcsIHN0cnVjdCBkcm1fdml2X2dlbV9zZXRfdGlsaW5nKQorI2RlZmluZSBEUk1fSU9DVExfVklWX0dFTV9HRVRfVElMSU5HICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklWX0dFTV9HRVRfVElMSU5HLCBzdHJ1Y3QgZHJtX3Zpdl9nZW1fZ2V0X3RpbGluZykKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJVl9HRU1fQVRUQUNIX0FVWCAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJVl9HRU1fQVRUQUNIX0FVWCwgc3RydWN0IGRybV92aXZfZ2VtX2F0dGFjaF9hdXgpCisjZGVmaW5lIERSTV9JT0NUTF9WSVZfR0VNX1JFRl9OT0RFICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSVZfR0VNX1JFRl9OT0RFLCAgIHN0cnVjdCBkcm1fdml2X2dlbV9yZWZfbm9kZSkKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fVklWTkFURV9EUk1fSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS92bXdnZnhfZHJtLmggYi9pbmNsdWRlL2RybS92bXdnZnhfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2OGI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL3Ztd2dmeF9kcm0uaApAQCAtMCwwICsxLDEwOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCDCqSAyMDA5LTIwMTUgVk13YXJlLCBJbmMuLCBQYWxvIEFsdG8sIENBLiwgVVNBCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19WTVdHRlhfRFJNX0hfXworI2RlZmluZSBfX1ZNV0dGWF9EUk1fSF9fCisKKyNpbmNsdWRlICJkcm0uaCIKKworI2RlZmluZSBEUk1fVk1XX01BWF9TVVJGQUNFX0ZBQ0VTIDYKKyNkZWZpbmUgRFJNX1ZNV19NQVhfTUlQX0xFVkVMUyAyNAorCisKKyNkZWZpbmUgRFJNX1ZNV19HRVRfUEFSQU0gICAgICAgICAgICAwCisjZGVmaW5lIERSTV9WTVdfQUxMT0NfRE1BQlVGICAgICAgICAgMQorI2RlZmluZSBEUk1fVk1XX1VOUkVGX0RNQUJVRiAgICAgICAgIDIKKyNkZWZpbmUgRFJNX1ZNV19DVVJTT1JfQllQQVNTICAgICAgICAzCisvKiBndWFyZGVkIGJ5IERSTV9WTVdfUEFSQU1fTlVNX1NUUkVBTVMgIT0gMCovCisjZGVmaW5lIERSTV9WTVdfQ09OVFJPTF9TVFJFQU0gICAgICAgNAorI2RlZmluZSBEUk1fVk1XX0NMQUlNX1NUUkVBTSAgICAgICAgIDUKKyNkZWZpbmUgRFJNX1ZNV19VTlJFRl9TVFJFQU0gICAgICAgICA2CisvKiBndWFyZGVkIGJ5IERSTV9WTVdfUEFSQU1fM0QgPT0gMSAqLworI2RlZmluZSBEUk1fVk1XX0NSRUFURV9DT05URVhUICAgICAgIDcKKyNkZWZpbmUgRFJNX1ZNV19VTlJFRl9DT05URVhUICAgICAgICA4CisjZGVmaW5lIERSTV9WTVdfQ1JFQVRFX1NVUkZBQ0UgICAgICAgOQorI2RlZmluZSBEUk1fVk1XX1VOUkVGX1NVUkZBQ0UgICAgICAgIDEwCisjZGVmaW5lIERSTV9WTVdfUkVGX1NVUkZBQ0UgICAgICAgICAgMTEKKyNkZWZpbmUgRFJNX1ZNV19FWEVDQlVGICAgICAgICAgICAgICAxMgorI2RlZmluZSBEUk1fVk1XX0dFVF8zRF9DQVAgICAgICAgICAgIDEzCisjZGVmaW5lIERSTV9WTVdfRkVOQ0VfV0FJVCAgICAgICAgICAgMTQKKyNkZWZpbmUgRFJNX1ZNV19GRU5DRV9TSUdOQUxFRCAgICAgICAxNQorI2RlZmluZSBEUk1fVk1XX0ZFTkNFX1VOUkVGICAgICAgICAgIDE2CisjZGVmaW5lIERSTV9WTVdfRkVOQ0VfRVZFTlQgICAgICAgICAgMTcKKyNkZWZpbmUgRFJNX1ZNV19QUkVTRU5UICAgICAgICAgICAgICAxOAorI2RlZmluZSBEUk1fVk1XX1BSRVNFTlRfUkVBREJBQ0sgICAgIDE5CisjZGVmaW5lIERSTV9WTVdfVVBEQVRFX0xBWU9VVCAgICAgICAgMjAKKyNkZWZpbmUgRFJNX1ZNV19DUkVBVEVfU0hBREVSICAgICAgICAyMQorI2RlZmluZSBEUk1fVk1XX1VOUkVGX1NIQURFUiAgICAgICAgIDIyCisjZGVmaW5lIERSTV9WTVdfR0JfU1VSRkFDRV9DUkVBVEUgICAgMjMKKyNkZWZpbmUgRFJNX1ZNV19HQl9TVVJGQUNFX1JFRiAgICAgICAyNAorI2RlZmluZSBEUk1fVk1XX1NZTkNDUFUgICAgICAgICAgICAgIDI1CisjZGVmaW5lIERSTV9WTVdfQ1JFQVRFX0VYVEVOREVEX0NPTlRFWFQgMjYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfR0VUX1BBUkFNIC0gZ2V0IGRldmljZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBEUk1fVk1XX1BBUkFNX0ZJRk9fT0ZGU0VUOgorICogT2Zmc2V0IHRvIHVzZSB0byBtYXAgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIEZJRk8gcmVhZC1vbmx5LgorICogVGhlIGZpZm8gaXMgbWFwcGVkIHVzaW5nIHRoZSBtbWFwKCkgc3lzdGVtIGNhbGwgb24gdGhlIGRybSBkZXZpY2UuCisgKgorICogRFJNX1ZNV19QQVJBTV9PVkVSTEFZX0lPQ1RMOgorICogRG9lcyB0aGUgZHJpdmVyIHN1cHBvcnQgdGhlIG92ZXJsYXkgaW9jdGwuCisgKi8KKworI2RlZmluZSBEUk1fVk1XX1BBUkFNX05VTV9TVFJFQU1TICAgICAgMAorI2RlZmluZSBEUk1fVk1XX1BBUkFNX05VTV9GUkVFX1NUUkVBTVMgMQorI2RlZmluZSBEUk1fVk1XX1BBUkFNXzNEICAgICAgICAgICAgICAgMgorI2RlZmluZSBEUk1fVk1XX1BBUkFNX0hXX0NBUFMgICAgICAgICAgMworI2RlZmluZSBEUk1fVk1XX1BBUkFNX0ZJRk9fQ0FQUyAgICAgICAgNAorI2RlZmluZSBEUk1fVk1XX1BBUkFNX01BWF9GQl9TSVpFICAgICAgNQorI2RlZmluZSBEUk1fVk1XX1BBUkFNX0ZJRk9fSFdfVkVSU0lPTiAgNgorI2RlZmluZSBEUk1fVk1XX1BBUkFNX01BWF9TVVJGX01FTU9SWSAgNworI2RlZmluZSBEUk1fVk1XX1BBUkFNXzNEX0NBUFNfU0laRSAgICAgOAorI2RlZmluZSBEUk1fVk1XX1BBUkFNX01BWF9NT0JfTUVNT1JZICAgOQorI2RlZmluZSBEUk1fVk1XX1BBUkFNX01BWF9NT0JfU0laRSAgICAgMTAKKyNkZWZpbmUgRFJNX1ZNV19QQVJBTV9TQ1JFRU5fVEFSR0VUICAgIDExCisjZGVmaW5lIERSTV9WTVdfUEFSQU1fRFggICAgICAgICAgICAgICAxMgorCisvKioKKyAqIGVudW0gZHJtX3Ztd19oYW5kbGVfdHlwZSAtIGhhbmRsZSB0eXBlIGZvciByZWYgaW9jdGxzCisgKgorICovCitlbnVtIGRybV92bXdfaGFuZGxlX3R5cGUgeworCURSTV9WTVdfSEFORExFX0xFR0FDWSA9IDAsCisJRFJNX1ZNV19IQU5ETEVfUFJJTUUgPSAxCit9OworCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X2dldHBhcmFtX2FyZworICoKKyAqIEB2YWx1ZTogUmV0dXJuZWQgdmFsdWUuIC8vT3V0CisgKiBAcGFyYW06IFBhcmFtZXRlciB0byBxdWVyeS4gLy9Jbi4KKyAqCisgKiBBcmd1bWVudCB0byB0aGUgRFJNX1ZNV19HRVRfUEFSQU0gSW9jdGwuCisgKi8KKworc3RydWN0IGRybV92bXdfZ2V0cGFyYW1fYXJnIHsKKwlfX3U2NCB2YWx1ZTsKKwlfX3UzMiBwYXJhbTsKKwlfX3UzMiBwYWQ2NDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX0NSRUFURV9DT05URVhUIC0gQ3JlYXRlIGEgaG9zdCBjb250ZXh0LgorICoKKyAqIEFsbG9jYXRlcyBhIGRldmljZSB1bmlxdWUgY29udGV4dCBpZCwgYW5kIHF1ZXVlcyBhIGNyZWF0ZSBjb250ZXh0IGNvbW1hbmQKKyAqIGZvciB0aGUgaG9zdC4gRG9lcyBub3Qgd2FpdCBmb3IgaG9zdCBjb21wbGV0aW9uLgorICovCisKKy8qKgorICogc3RydWN0IGRybV92bXdfY29udGV4dF9hcmcKKyAqCisgKiBAY2lkOiBEZXZpY2UgdW5pcXVlIGNvbnRleHQgSUQuCisgKgorICogT3V0cHV0IGFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX0NSRUFURV9DT05URVhUIElvY3RsLgorICogSW5wdXQgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfVU5SRUZfQ09OVEVYVCBJb2N0bC4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19jb250ZXh0X2FyZyB7CisJX19zMzIgY2lkOworCV9fdTMyIHBhZDY0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfVU5SRUZfQ09OVEVYVCAtIENyZWF0ZSBhIGhvc3QgY29udGV4dC4KKyAqCisgKiBGcmVlcyBhIGdsb2JhbCBjb250ZXh0IGlkLCBhbmQgcXVldWVzIGEgZGVzdHJveSBob3N0IGNvbW1hbmQgZm9yIHRoZSBob3N0LgorICogRG9lcyBub3Qgd2FpdCBmb3IgaG9zdCBjb21wbGV0aW9uLiBUaGUgY29udGV4dCBJRCBjYW4gYmUgdXNlZCBkaXJlY3RseQorICogaW4gdGhlIGNvbW1hbmQgc3RyZWFtIGFuZCBzaG93cyB1cCBhcyB0aGUgc2FtZSBjb250ZXh0IElEIG9uIHRoZSBob3N0LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX0NSRUFURV9TVVJGQUNFIC0gQ3JlYXRlIGEgaG9zdCBzdWZhY2UuCisgKgorICogQWxsb2NhdGVzIGEgZGV2aWNlIHVuaXF1ZSBzdXJmYWNlIGlkLCBhbmQgcXVldWVzIGEgY3JlYXRlIHN1cmZhY2UgY29tbWFuZAorICogZm9yIHRoZSBob3N0LiBEb2VzIG5vdCB3YWl0IGZvciBob3N0IGNvbXBsZXRpb24uIFRoZSBzdXJmYWNlIElEIGNhbiBiZQorICogdXNlZCBkaXJlY3RseSBpbiB0aGUgY29tbWFuZCBzdHJlYW0gYW5kIHNob3dzIHVwIGFzIHRoZSBzYW1lIHN1cmZhY2UKKyAqIElEIG9uIHRoZSBob3N0LgorICovCisKKy8qKgorICogc3RydWN0IGRybV93bXZfc3VyZmFjZV9jcmVhdGVfcmVxCisgKgorICogQGZsYWdzOiBTdXJmYWNlIGZsYWdzIGFzIHVuZGVyc3Rvb2QgYnkgdGhlIGhvc3QuCisgKiBAZm9ybWF0OiBTdXJmYWNlIGZvcm1hdCBhcyB1bmRlcnN0b29kIGJ5IHRoZSBob3N0LgorICogQG1pcF9sZXZlbHM6IE51bWJlciBvZiBtaXAgbGV2ZWxzIGZvciBlYWNoIGZhY2UuCisgKiBBbiB1bnVzZWQgZmFjZSBzaG91bGQgaGF2ZSAwIGVuY29kZWQuCisgKiBAc2l6ZV9hZGRyOiBBZGRyZXNzIG9mIGEgdXNlci1zcGFjZSBhcnJheSBvZiBzcnVjdCBkcm1fdm13X3NpemUKKyAqIGNhc3QgdG8gYW4gX191NjQgZm9yIDMyLTY0IGJpdCBjb21wYXRpYmlsaXR5LgorICogVGhlIHNpemUgb2YgdGhlIGFycmF5IHNob3VsZCBlcXVhbCB0aGUgdG90YWwgbnVtYmVyIG9mIG1pcG1hcCBsZXZlbHMuCisgKiBAc2hhcmVhYmxlOiBCb29sZWFuIHdoZXRoZXIgb3RoZXIgY2xpZW50cyAoYXMgaWRlbnRpZmllZCBieSBmaWxlIGRlc2NyaXB0b3JzKQorICogbWF5IHJlZmVyZW5jZSB0aGlzIHN1cmZhY2UuCisgKiBAc2Nhbm91dDogQm9vbGVhbiB3aGV0aGVyIHRoZSBzdXJmYWNlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgYQorICogc2Nhbm91dC4KKyAqCisgKiBJbnB1dCBkYXRhIHRvIHRoZSBEUk1fVk1XX0NSRUFURV9TVVJGQUNFIElvY3RsLgorICogT3V0cHV0IGRhdGEgZnJvbSB0aGUgRFJNX1ZNV19SRUZfU1VSRkFDRSBJb2N0bC4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19zdXJmYWNlX2NyZWF0ZV9yZXEgeworCV9fdTMyIGZsYWdzOworCV9fdTMyIGZvcm1hdDsKKwlfX3UzMiBtaXBfbGV2ZWxzW0RSTV9WTVdfTUFYX1NVUkZBQ0VfRkFDRVNdOworCV9fdTY0IHNpemVfYWRkcjsKKwlfX3MzMiBzaGFyZWFibGU7CisJX19zMzIgc2Nhbm91dDsKK307CisKKy8qKgorICogc3RydWN0IGRybV93bXZfc3VyZmFjZV9hcmcKKyAqCisgKiBAc2lkOiBTdXJmYWNlIGlkIG9mIGNyZWF0ZWQgc3VyZmFjZSBvciBzdXJmYWNlIHRvIGRlc3Ryb3kgb3IgcmVmZXJlbmNlLgorICogQGhhbmRsZV90eXBlOiBIYW5kbGUgdHlwZSBmb3IgRFJNX1ZNV19SRUZfU1VSRkFDRSBJb2N0bC4KKyAqCisgKiBPdXRwdXQgZGF0YSBmcm9tIHRoZSBEUk1fVk1XX0NSRUFURV9TVVJGQUNFIElvY3RsLgorICogSW5wdXQgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfVU5SRUZfU1VSRkFDRSBJb2N0bC4KKyAqIElucHV0IGFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX1JFRl9TVVJGQUNFIElvY3RsLgorICovCisKK3N0cnVjdCBkcm1fdm13X3N1cmZhY2VfYXJnIHsKKwlfX3MzMiBzaWQ7CisJZW51bSBkcm1fdm13X2hhbmRsZV90eXBlIGhhbmRsZV90eXBlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19zaXplIGlvY3RsLgorICoKKyAqIEB3aWR0aCAtIG1pcCBsZXZlbCB3aWR0aAorICogQGhlaWdodCAtIG1pcCBsZXZlbCBoZWlnaHQKKyAqIEBkZXB0aCAtIG1pcCBsZXZlbCBkZXB0aAorICoKKyAqIERlc2NyaXB0aW9uIG9mIGEgbWlwIGxldmVsLgorICogSW5wdXQgZGF0YSB0byB0aGUgRFJNX1dNV19DUkVBVEVfU1VSRkFDRSBJb2N0bC4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19zaXplIHsKKwlfX3UzMiB3aWR0aDsKKwlfX3UzMiBoZWlnaHQ7CisJX191MzIgZGVwdGg7CisJX191MzIgcGFkNjQ7Cit9OworCisvKioKKyAqIHVuaW9uIGRybV92bXdfc3VyZmFjZV9jcmVhdGVfYXJnCisgKgorICogQHJlcDogT3V0cHV0IGRhdGEgYXMgZGVzY3JpYmVkIGFib3ZlLgorICogQHJlcTogSW5wdXQgZGF0YSBhcyBkZXNjcmliZWQgYWJvdmUuCisgKgorICogQXJndW1lbnQgdG8gdGhlIERSTV9WTVdfQ1JFQVRFX1NVUkZBQ0UgSW9jdGwuCisgKi8KKwordW5pb24gZHJtX3Ztd19zdXJmYWNlX2NyZWF0ZV9hcmcgeworCXN0cnVjdCBkcm1fdm13X3N1cmZhY2VfYXJnIHJlcDsKKwlzdHJ1Y3QgZHJtX3Ztd19zdXJmYWNlX2NyZWF0ZV9yZXEgcmVxOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfUkVGX1NVUkZBQ0UgLSBSZWZlcmVuY2UgYSBob3N0IHN1cmZhY2UuCisgKgorICogUHV0cyBhIHJlZmVyZW5jZSBvbiBhIGhvc3Qgc3VyZmFjZSB3aXRoIGEgZ2l2ZSBzaWQsIGFzIHByZXZpb3VzbHkKKyAqIHJldHVybmVkIGJ5IHRoZSBEUk1fVk1XX0NSRUFURV9TVVJGQUNFIGlvY3RsLgorICogQSByZWZlcmVuY2Ugd2lsbCBtYWtlIHN1cmUgdGhlIHN1cmZhY2UgaXNuJ3QgZGVzdHJveWVkIHdoaWxlIHdlIGhvbGQKKyAqIGl0IGFuZCB3aWxsIGFsbG93IHRoZSBjYWxsaW5nIGNsaWVudCB0byB1c2UgdGhlIHN1cmZhY2UgSUQgaW4gdGhlIGNvbW1hbmQKKyAqIHN0cmVhbS4KKyAqCisgKiBPbiBzdWNjZXNzZnVsIHJldHVybiwgdGhlIElvY3RsIHJldHVybnMgdGhlIHN1cmZhY2UgaW5mb3JtYXRpb24gZ2l2ZW4KKyAqIGluIHRoZSBEUk1fVk1XX0NSRUFURV9TVVJGQUNFIGlvY3RsLgorICovCisKKy8qKgorICogdW5pb24gZHJtX3Ztd19zdXJmYWNlX3JlZmVyZW5jZV9hcmcKKyAqCisgKiBAcmVwOiBPdXRwdXQgZGF0YSBhcyBkZXNjcmliZWQgYWJvdmUuCisgKiBAcmVxOiBJbnB1dCBkYXRhIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAqCisgKiBBcmd1bWVudCB0byB0aGUgRFJNX1ZNV19SRUZfU1VSRkFDRSBJb2N0bC4KKyAqLworCit1bmlvbiBkcm1fdm13X3N1cmZhY2VfcmVmZXJlbmNlX2FyZyB7CisJc3RydWN0IGRybV92bXdfc3VyZmFjZV9jcmVhdGVfcmVxIHJlcDsKKwlzdHJ1Y3QgZHJtX3Ztd19zdXJmYWNlX2FyZyByZXE7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19VTlJFRl9TVVJGQUNFIC0gVW5yZWZlcmVuY2UgYSBob3N0IHN1cmZhY2UuCisgKgorICogQ2xlYXIgYSByZWZlcmVuY2UgcHJldmlvdXNseSBwdXQgb24gYSBob3N0IHN1cmZhY2UuCisgKiBXaGVuIGFsbCByZWZlcmVuY2VzIGFyZSBnb25lLCBpbmNsdWRpbmcgdGhlIG9uZSBpbXBsaWNpdGx5IHBsYWNlZAorICogb24gY3JlYXRpb24sCisgKiBhIGRlc3Ryb3kgc3VyZmFjZSBjb21tYW5kIHdpbGwgYmUgcXVldWVkIGZvciB0aGUgaG9zdC4KKyAqIERvZXMgbm90IHdhaXQgZm9yIGNvbXBsZXRpb24uCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfRVhFQ0JVRgorICoKKyAqIFN1Ym1pdCBhIGNvbW1hbmQgYnVmZmVyIGZvciBleGVjdXRpb24gb24gdGhlIGhvc3QsIGFuZCByZXR1cm4gYQorICogZmVuY2Ugc2Vxbm8gdGhhdCB3aGVuIHNpZ25hbGVkLCBpbmRpY2F0ZXMgdGhhdCB0aGUgY29tbWFuZCBidWZmZXIgaGFzCisgKiBleGVjdXRlZC4KKyAqLworCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X2V4ZWNidWZfYXJnCisgKgorICogQGNvbW1hbmRzOiBVc2VyLXNwYWNlIGFkZHJlc3Mgb2YgYSBjb21tYW5kIGJ1ZmZlciBjYXN0IHRvIGFuIF9fdTY0LgorICogQGNvbW1hbmQtc2l6ZTogU2l6ZSBpbiBieXRlcyBvZiB0aGUgY29tbWFuZCBidWZmZXIuCisgKiBAdGhyb3R0bGUtdXM6IFNsZWVwIHVudGlsIHNvZnR3YXJlIGlzIGxlc3MgdGhhbiBAdGhyb3R0bGVfdXMKKyAqIG1pY3Jvc2Vjb25kcyBhaGVhZCBvZiBoYXJkd2FyZS4gVGhlIGRyaXZlciBtYXkgcm91bmQgdGhpcyB2YWx1ZQorICogdG8gdGhlIG5lYXJlc3Qga2VybmVsIHRpY2suCisgKiBAZmVuY2VfcmVwOiBVc2VyLXNwYWNlIGFkZHJlc3Mgb2YgYSBzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9yZXAgY2FzdCB0byBhbgorICogX191NjQuCisgKiBAdmVyc2lvbjogQWxsb3dzIGV4cGFuZGluZyB0aGUgZXhlY2J1ZiBpb2N0bCBwYXJhbWV0ZXJzIHdpdGhvdXQgYnJlYWtpbmcKKyAqIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBzaW5jZSB1c2VyLXNwYWNlIHdpbGwgYWx3YXlzIHRlbGwgdGhlIGtlcm5lbAorICogd2hpY2ggdmVyc2lvbiBpdCB1c2VzLgorICogQGZsYWdzOiBFeGVjYnVmIGZsYWdzLiBOb25lIGN1cnJlbnRseS4KKyAqCisgKiBBcmd1bWVudCB0byB0aGUgRFJNX1ZNV19FWEVDQlVGIElvY3RsLgorICovCisKKyNkZWZpbmUgRFJNX1ZNV19FWEVDQlVGX1ZFUlNJT04gMgorCitzdHJ1Y3QgZHJtX3Ztd19leGVjYnVmX2FyZyB7CisJX191NjQgY29tbWFuZHM7CisJX191MzIgY29tbWFuZF9zaXplOworCV9fdTMyIHRocm90dGxlX3VzOworCV9fdTY0IGZlbmNlX3JlcDsKKwlfX3UzMiB2ZXJzaW9uOworCV9fdTMyIGZsYWdzOworCV9fdTMyIGNvbnRleHRfaGFuZGxlOworCV9fdTMyIHBhZDY0OworfTsKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9yZXAKKyAqCisgKiBAaGFuZGxlOiBGZW5jZSBvYmplY3QgaGFuZGxlIGZvciBmZW5jZSBhc3NvY2lhdGVkIHdpdGggYSBjb21tYW5kIHN1Ym1pc3Npb24uCisgKiBAbWFzazogRmVuY2UgZmxhZ3MgcmVsZXZhbnQgZm9yIHRoaXMgZmVuY2Ugb2JqZWN0LgorICogQHNlcW5vOiBGZW5jZSBzZXF1ZW5jZSBudW1iZXIgaW4gZmlmby4gQSBmZW5jZSBvYmplY3Qgd2l0aCBhIGxvd2VyCisgKiBzZXFubyB3aWxsIHNpZ25hbCB0aGUgRVhFQyBmbGFnIGJlZm9yZSBhIGZlbmNlIG9iamVjdCB3aXRoIGEgaGlnaGVyCisgKiBzZXFuby4gVGhpcyBjYW4gYmUgdXNlZCBieSB1c2VyLXNwYWNlIHRvIGF2b2lkIGtlcm5lbCBjYWxscyB0byBkZXRlcm1pbmUKKyAqIHdoZXRoZXIgYSBmZW5jZSBoYXMgc2lnbmFsZWQgdGhlIEVYRUMgZmxhZy4gTm90ZSB0aGF0IEBzZXFubyB3aWxsCisgKiB3cmFwIGF0IDMyLWJpdC4KKyAqIEBwYXNzZWRfc2Vxbm86IFRoZSBoaWdoZXN0IHNlcW5vIG51bWJlciBwcm9jZXNzZWQgYnkgdGhlIGhhcmR3YXJlCisgKiBzbyBmYXIuIFRoaXMgY2FuIGJlIHVzZWQgdG8gbWFyayB1c2VyLXNwYWNlIGZlbmNlIG9iamVjdHMgYXMgc2lnbmFsZWQsIGFuZAorICogdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBmZW5jZSBzZXFubyBtaWdodCBiZSBzdGFsZS4KKyAqIEBlcnJvcjogVGhpcyBtZW1iZXIgc2hvdWxkJ3ZlIGJlZW4gc2V0IHRvIC1FRkFVTFQgb24gc3VibWlzc2lvbi4KKyAqIFRoZSBmb2xsb3dpbmcgYWN0aW9ucyBzaG91bGQgYmUgdGFrZSBvbiBjb21wbGV0aW9uOgorICogZXJyb3IgPT0gLUVGQVVMVDogRmVuY2UgY29tbXVuaWNhdGlvbiBmYWlsZWQuIFRoZSBob3N0IGlzIHN5bmNocm9uaXplZC4KKyAqIFVzZSB0aGUgbGFzdCBmZW5jZSBpZCByZWFkIGZyb20gdGhlIEZJRk8gZmVuY2UgcmVnaXN0ZXIuCisgKiBlcnJvciAhPSAwICYmIGVycm9yICE9IC1FRkFVTFQ6CisgKiBGZW5jZSBzdWJtaXNzaW9uIGZhaWxlZC4gVGhlIGhvc3QgaXMgc3luY2hyb25pemVkLiBVc2UgdGhlIGZlbmNlX3NlcSBtZW1iZXIuCisgKiBlcnJvciA9PSAwOiBBbGwgaXMgT0ssIFRoZSBob3N0IG1heSBub3QgYmUgc3luY2hyb25pemVkLgorICogVXNlIHRoZSBmZW5jZV9zZXEgbWVtYmVyLgorICoKKyAqIElucHV0IC8gT3V0cHV0IGRhdGEgdG8gdGhlIERSTV9WTVdfRVhFQ0JVRiBJb2N0bC4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9yZXAgeworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBtYXNrOworCV9fdTMyIHNlcW5vOworCV9fdTMyIHBhc3NlZF9zZXFubzsKKwlfX3UzMiBwYWQ2NDsKKwlfX3MzMiBlcnJvcjsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX0FMTE9DX0RNQUJVRgorICoKKyAqIEFsbG9jYXRlIGEgRE1BIGJ1ZmZlciB0aGF0IGlzIHZpc2libGUgYWxzbyB0byB0aGUgaG9zdC4KKyAqIE5PVEU6IFRoZSBidWZmZXIgaXMKKyAqIGlkZW50aWZpZWQgYnkgYSBoYW5kbGUgYW5kIGFuIG9mZnNldCwgd2hpY2ggYXJlIHByaXZhdGUgdG8gdGhlIGd1ZXN0LCBidXQKKyAqIHVzZWFibGUgaW4gdGhlIGNvbW1hbmQgc3RyZWFtLiBUaGUgZ3Vlc3Qga2VybmVsIG1heSB0cmFuc2xhdGUgdGhlc2UKKyAqIGFuZCBwYXRjaCB1cCB0aGUgY29tbWFuZCBzdHJlYW0gYWNjb3JkaW5nbHkuIEluIHRoZSBmdXR1cmUsIHRoZSBvZmZzZXQgbWF5CisgKiBiZSB6ZXJvIGF0IGFsbCB0aW1lcywgb3IgaXQgbWF5IGRpc2FwcGVhciBmcm9tIHRoZSBpbnRlcmZhY2UgYmVmb3JlIGl0IGlzCisgKiBmaXhlZC4KKyAqCisgKiBUaGUgRE1BIGJ1ZmZlciBtYXkgc3RheSB1c2VyLXNwYWNlIG1hcHBlZCBpbiB0aGUgZ3Vlc3QgYXQgYWxsIHRpbWVzLAorICogYW5kIGlzIHRodXMgc3VpdGFibGUgZm9yIHN1Yi1hbGxvY2F0aW9uLgorICoKKyAqIERNQSBidWZmZXJzIGFyZSBtYXBwZWQgdXNpbmcgdGhlIG1tYXAoKSBzeXNjYWxsIG9uIHRoZSBkcm0gZGV2aWNlLgorICovCisKKy8qKgorICogc3RydWN0IGRybV92bXdfYWxsb2NfZG1hYnVmX3JlcQorICoKKyAqIEBzaXplOiBSZXF1aXJlZCBtaW5pbXVtIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyAqCisgKiBJbnB1dCBkYXRhIHRvIHRoZSBEUk1fVk1XX0FMTE9DX0RNQUJVRiBJb2N0bC4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19hbGxvY19kbWFidWZfcmVxIHsKKwlfX3UzMiBzaXplOworCV9fdTMyIHBhZDY0OworfTsKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19kbWFidWZfcmVwCisgKgorICogQG1hcF9oYW5kbGU6IE9mZnNldCB0byB1c2UgaW4gdGhlIG1tYXAoKSBjYWxsIHVzZWQgdG8gbWFwIHRoZSBidWZmZXIuCisgKiBAaGFuZGxlOiBIYW5kbGUgdW5pcXVlIHRvIHRoaXMgYnVmZmVyLiBVc2VkIGZvciB1bnJlZmVyZW5jaW5nLgorICogQGN1cl9nbXJfaWQ6IEdNUiBpZCB0byB1c2UgaW4gdGhlIGNvbW1hbmQgc3RyZWFtIHdoZW4gdGhpcyBidWZmZXIgaXMKKyAqIHJlZmVyZW5jZWQuIFNlZSBub3QgYWJvdmUuCisgKiBAY3VyX2dtcl9vZmZzZXQ6IE9mZnNldCB0byB1c2UgaW4gdGhlIGNvbW1hbmQgc3RyZWFtIHdoZW4gdGhpcyBidWZmZXIgaXMKKyAqIHJlZmVyZW5jZWQuIFNlZSBub3RlIGFib3ZlLgorICoKKyAqIE91dHB1dCBkYXRhIGZyb20gdGhlIERSTV9WTVdfQUxMT0NfRE1BQlVGIElvY3RsLgorICovCisKK3N0cnVjdCBkcm1fdm13X2RtYWJ1Zl9yZXAgeworCV9fdTY0IG1hcF9oYW5kbGU7CisJX191MzIgaGFuZGxlOworCV9fdTMyIGN1cl9nbXJfaWQ7CisJX191MzIgY3VyX2dtcl9vZmZzZXQ7CisJX191MzIgcGFkNjQ7Cit9OworCisvKioKKyAqIHVuaW9uIGRybV92bXdfZG1hYnVmX2FyZworICoKKyAqIEByZXE6IElucHV0IGRhdGEgYXMgZGVzY3JpYmVkIGFib3ZlLgorICogQHJlcDogT3V0cHV0IGRhdGEgYXMgZGVzY3JpYmVkIGFib3ZlLgorICoKKyAqIEFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX0FMTE9DX0RNQUJVRiBJb2N0bC4KKyAqLworCit1bmlvbiBkcm1fdm13X2FsbG9jX2RtYWJ1Zl9hcmcgeworCXN0cnVjdCBkcm1fdm13X2FsbG9jX2RtYWJ1Zl9yZXEgcmVxOworCXN0cnVjdCBkcm1fdm13X2RtYWJ1Zl9yZXAgcmVwOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfVU5SRUZfRE1BQlVGIC0gRnJlZSBhIERNQSBidWZmZXIuCisgKgorICovCisKKy8qKgorICogc3RydWN0IGRybV92bXdfdW5yZWZfZG1hYnVmX2FyZworICoKKyAqIEBoYW5kbGU6IEhhbmRsZSBpbmRpY2F0aW5nIHdoYXQgYnVmZmVyIHRvIGZyZWUuIE9idGFpbmVkIGZyb20gdGhlCisgKiBEUk1fVk1XX0FMTE9DX0RNQUJVRiBJb2N0bC4KKyAqCisgKiBBcmd1bWVudCB0byB0aGUgRFJNX1ZNV19VTlJFRl9ETUFCVUYgSW9jdGwuCisgKi8KKworc3RydWN0IGRybV92bXdfdW5yZWZfZG1hYnVmX2FyZyB7CisJX191MzIgaGFuZGxlOworCV9fdTMyIHBhZDY0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfQ09OVFJPTF9TVFJFQU0gLSBDb250cm9sIG92ZXJsYXlzLCBha2Egc3RyZWFtcy4KKyAqCisgKiBUaGlzIElPQ1RMIGNvbnRyb2xzIHRoZSBvdmVybGF5IHVuaXRzIG9mIHRoZSBzdmdhIGRldmljZS4KKyAqIFRoZSBTVkdBIG92ZXJsYXkgdW5pdHMgZG9lcyBub3Qgd29yayBsaWtlIHJlZ3VsYXIgaGFyZHdhcmUgdW5pdHMgaW4KKyAqIHRoYXQgdGhleSBkbyBub3QgYXV0b21hdGljYWx5IHJlYWQgYmFjayB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGRtYQorICogYnVmZmVyLiBCdXQgaW5zdGVhZCBvbmx5IHJlYWQgYmFjayBmb3IgZWFjaCBjYWxsIHRvIHRoaXMgaW9jdGwsIGFuZAorICogYXQgYW55IHBvaW50IGJldHdlZW4gdGhpcyBjYWxsIGJlaW5nIG1hZGUgYW5kIGEgZm9sbG93aW5nIGNhbGwgdGhhdAorICogZWl0aGVyIGNoYW5nZXMgdGhlIGJ1ZmZlciBvciBkaXNhYmxlcyB0aGUgc3RyZWFtLgorICovCisKKy8qKgorICogc3RydWN0IGRybV92bXdfcmVjdAorICoKKyAqIERlZmluZXMgYSByZWN0YW5nbGUuIFVzZWQgaW4gdGhlIG92ZXJsYXkgaW9jdGwgdG8gZGVmaW5lCisgKiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHJlY3RhbmdsZS4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19yZWN0IHsKKwlfX3MzMiB4OworCV9fczMyIHk7CisJX191MzIgdzsKKwlfX3UzMiBoOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19jb250cm9sX3N0cmVhbV9hcmcKKyAqCisgKiBAc3RyZWFtX2lkOiBTdGVhcm0gdG8gY29udHJvbAorICogQGVuYWJsZWQ6IElmIGZhbHNlIGFsbCBmb2xsb3dpbmcgYXJndW1lbnRzIGFyZSBpZ25vcmVkLgorICogQGhhbmRsZTogSGFuZGxlIHRvIGJ1ZmZlciBmb3IgZ2V0dGluZyBkYXRhIGZyb20uCisgKiBAZm9ybWF0OiBGb3JtYXQgb2YgdGhlIG92ZXJsYXkgYXMgdW5kZXJzdG9vZCBieSB0aGUgaG9zdC4KKyAqIEB3aWR0aDogV2lkdGggb2YgdGhlIG92ZXJsYXkuCisgKiBAaGVpZ2h0OiBIZWlnaHQgb2YgdGhlIG92ZXJsYXkuCisgKiBAc2l6ZTogU2l6ZSBvZiB0aGUgb3ZlcmxheSBpbiBieXRlcy4KKyAqIEBwaXRjaDogQXJyYXkgb2YgcGl0Y2hlcywgdGhlIHR3byBsYXN0IGFyZSBvbmx5IHVzZWQgZm9yIFlVVjEyIGZvcm1hdHMuCisgKiBAb2Zmc2V0OiBPZmZzZXQgZnJvbSBzdGFydCBvZiBkbWEgYnVmZmVyIHRvIG92ZXJsYXkuCisgKiBAc3JjOiBTb3VyY2UgcmVjdCwgbXVzdCBiZSB3aXRoaW4gdGhlIGRlZmluZWQgYXJlYSBhYm92ZS4KKyAqIEBkc3Q6IERlc3RpbmF0aW9uIHJlY3QsIHggYW5kIHkgbWF5IGJlIG5lZ2F0aXZlLgorICoKKyAqIEFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX0NPTlRST0xfU1RSRUFNIElvY3RsLgorICovCisKK3N0cnVjdCBkcm1fdm13X2NvbnRyb2xfc3RyZWFtX2FyZyB7CisJX191MzIgc3RyZWFtX2lkOworCV9fdTMyIGVuYWJsZWQ7CisKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBjb2xvcl9rZXk7CisKKwlfX3UzMiBoYW5kbGU7CisJX191MzIgb2Zmc2V0OworCV9fczMyIGZvcm1hdDsKKwlfX3UzMiBzaXplOworCV9fdTMyIHdpZHRoOworCV9fdTMyIGhlaWdodDsKKwlfX3UzMiBwaXRjaFszXTsKKworCV9fdTMyIHBhZDY0OworCXN0cnVjdCBkcm1fdm13X3JlY3Qgc3JjOworCXN0cnVjdCBkcm1fdm13X3JlY3QgZHN0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfQ1VSU09SX0JZUEFTUyAtIEdpdmUgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgY3Vyc29yIGJ5cGFzcy4KKyAqCisgKi8KKworI2RlZmluZSBEUk1fVk1XX0NVUlNPUl9CWVBBU1NfQUxMICAgICgxIDw8IDApCisjZGVmaW5lIERSTV9WTVdfQ1VSU09SX0JZUEFTU19GTEFHUyAgICAgICAoMSkKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19jdXJzb3JfYnlwYXNzX2FyZworICoKKyAqIEBmbGFnczogRmxhZ3MuCisgKiBAY3J0Y19pZDogQ3J0YyBpZCwgb25seSB1c2VkIGlmIERNUl9DVVJTT1JfQllQQVNTX0FMTCBpc24ndCBwYXNzZWQuCisgKiBAeHBvczogWCBwb3NpdGlvbiBvZiBjdXJzb3IuCisgKiBAeXBvczogWSBwb3NpdGlvbiBvZiBjdXJzb3IuCisgKiBAeGhvdDogWCBob3RzcG90LgorICogQHlob3Q6IFkgaG90c3BvdC4KKyAqCisgKiBBcmd1bWVudCB0byB0aGUgRFJNX1ZNV19DVVJTT1JfQllQQVNTIElvY3RsLgorICovCisKK3N0cnVjdCBkcm1fdm13X2N1cnNvcl9ieXBhc3NfYXJnIHsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBjcnRjX2lkOworCV9fczMyIHhwb3M7CisJX19zMzIgeXBvczsKKwlfX3MzMiB4aG90OworCV9fczMyIHlob3Q7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19DTEFJTV9TVFJFQU0gLSBDbGFpbSBhIHNpbmdsZSBzdHJlYW0uCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19jb250ZXh0X2FyZworICoKKyAqIEBzdHJlYW1faWQ6IERldmljZSB1bmlxdWUgY29udGV4dCBJRC4KKyAqCisgKiBPdXRwdXQgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfQ1JFQVRFX0NPTlRFWFQgSW9jdGwuCisgKiBJbnB1dCBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19VTlJFRl9DT05URVhUIElvY3RsLgorICovCisKK3N0cnVjdCBkcm1fdm13X3N0cmVhbV9hcmcgeworCV9fdTMyIHN0cmVhbV9pZDsKKwlfX3UzMiBwYWQ2NDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX1VOUkVGX1NUUkVBTSAtIFVuY2xhaW0gYSBzdHJlYW0uCisgKgorICogUmV0dXJuIGEgc2luZ2xlIHN0cmVhbSB0aGF0IHdhcyBjbGFpbWVkIGJ5IHRoaXMgcHJvY2Vzcy4gQWxzbyBtYWtlcworICogc3VyZSB0aGF0IHRoZSBzdHJlYW0gaGFzIGJlZW4gc3RvcHBlZC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19HRVRfM0RfQ0FQCisgKgorICogUmVhZCAzRCBjYXBhYmlsaXRpZXMgZnJvbSB0aGUgRklGTworICoKKyAqLworCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X2dldF8zZF9jYXBfYXJnCisgKgorICogQGJ1ZmZlcjogUG9pbnRlciB0byBhIGJ1ZmZlciBmb3IgY2FwYWJpbGl0eSBkYXRhLCBjYXN0IHRvIGFuIF9fdTY0CisgKiBAc2l6ZTogTWF4IHNpemUgdG8gY29weQorICoKKyAqIElucHV0IGFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX0dFVF8zRF9DQVBfSU9DVEwKKyAqIGlvY3Rscy4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19nZXRfM2RfY2FwX2FyZyB7CisJX191NjQgYnVmZmVyOworCV9fdTMyIG1heF9zaXplOworCV9fdTMyIHBhZDY0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfRkVOQ0VfV0FJVAorICoKKyAqIFdhaXRzIGZvciBhIGZlbmNlIG9iamVjdCB0byBzaWduYWwuIFRoZSB3YWl0IGlzIGludGVycnVwdGlibGUsIHNvIHRoYXQKKyAqIHNpZ25hbHMgbWF5IGJlIGRlbGl2ZXJlZCBkdXJpbmcgdGhlIGludGVycnVwdC4gVGhlIHdhaXQgbWF5IHRpbWVvdXQsCisgKiBpbiB3aGljaCBjYXNlIHRoZSBjYWxscyByZXR1cm5zIC1FQlVTWS4gSWYgdGhlIHdhaXQgaXMgcmVzdGFydGVkLAorICogdGhhdCBpcyByZXN0YXJ0aW5nIHdpdGhvdXQgcmVzZXR0aW5nIEBjb29raWVfdmFsaWQgdG8gemVybywKKyAqIHRoZSB0aW1lb3V0IGlzIGNvbXB1dGVkIGZyb20gdGhlIGZpcnN0IGNhbGwuCisgKgorICogVGhlIGZsYWdzIGFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX0ZFTkNFX1dBSVQgaW9jdGwgaW5kaWNhdGVzIHdoYXQgdG8gd2FpdAorICogb246CisgKiBEUk1fVk1XX0ZFTkNFX0ZMQUdfRVhFQzogQWxsIGNvbW1hbmRzIGFoZWFkIG9mIHRoZSBmZW5jZSBpbiB0aGUgY29tbWFuZAorICogc3RyZWFtCisgKiBoYXZlIGV4ZWN1dGVkLgorICogRFJNX1ZNV19GRU5DRV9GTEFHX1FVRVJZOiBBbGwgcXVlcnkgcmVzdWx0cyByZXN1bHRpbmcgZnJvbSBxdWVyeSBmaW5pc2gKKyAqIGNvbW1hbmRzCisgKiBpbiB0aGUgYnVmZmVyIGdpdmVuIHRvIHRoZSBFWEVDQlVGIGlvY3RsIHJldHVybmluZyB0aGUgZmVuY2Ugb2JqZWN0IGhhbmRsZQorICogYXJlIGF2YWlsYWJsZSB0byB1c2VyLXNwYWNlLgorICoKKyAqIERSTV9WTVdfV0FJVF9PUFRJT05fVU5SRUY6IElmIHRoaXMgd2FpdCBvcHRpb24gaXMgZ2l2ZW4sIGFuZCB0aGUKKyAqIGZlbmMgd2FpdCBpb2N0bCByZXR1cm5zIDAsIHRoZSBmZW5jZSBvYmplY3QgaGFzIGJlZW4gdW5yZWZlcmVuY2VkIGFmdGVyCisgKiB0aGUgd2FpdC4KKyAqLworCisjZGVmaW5lIERSTV9WTVdfRkVOQ0VfRkxBR19FWEVDICAgKDEgPDwgMCkKKyNkZWZpbmUgRFJNX1ZNV19GRU5DRV9GTEFHX1FVRVJZICAoMSA8PCAxKQorCisjZGVmaW5lIERSTV9WTVdfV0FJVF9PUFRJT05fVU5SRUYgKDEgPDwgMCkKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19mZW5jZV93YWl0X2FyZworICoKKyAqIEBoYW5kbGU6IEZlbmNlIG9iamVjdCBoYW5kbGUgYXMgcmV0dXJuZWQgYnkgdGhlIERSTV9WTVdfRVhFQ0JVRiBpb2N0bC4KKyAqIEBjb29raWVfdmFsaWQ6IE11c3QgYmUgcmVzZXQgdG8gMCBvbiBmaXJzdCBjYWxsLiBMZWZ0IGFsb25lIG9uIHJlc3RhcnQuCisgKiBAa2VybmVsX2Nvb2tpZTogU2V0IHRvIDAgb24gZmlyc3QgY2FsbC4gTGVmdCBhbG9uZSBvbiByZXN0YXJ0LgorICogQHRpbWVvdXRfdXM6IFdhaXQgdGltZW91dCBpbiBtaWNyb3NlY29uZHMuIDAgZm9yIGluZGVmaW5pdGUgdGltZW91dC4KKyAqIEBsYXp5OiBTZXQgdG8gMSBpZiB0aW1pbmcgaXMgbm90IGNyaXRpY2FsLiBBbGxvdyBtb3JlIHRoYW4gYSBrZXJuZWwgdGljaworICogYmVmb3JlIHJldHVybmluZy4KKyAqIEBmbGFnczogRmVuY2UgZmxhZ3MgdG8gd2FpdCBvbi4KKyAqIEB3YWl0X29wdGlvbnM6IE9wdGlvbnMgdGhhdCBjb250cm9sIHRoZSBiZWhhdmlvdXIgb2YgdGhlIHdhaXQgaW9jdGwuCisgKgorICogSW5wdXQgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfRkVOQ0VfV0FJVCBpb2N0bC4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19mZW5jZV93YWl0X2FyZyB7CisJX191MzIgaGFuZGxlOworCV9fczMyICBjb29raWVfdmFsaWQ7CisJX191NjQga2VybmVsX2Nvb2tpZTsKKwlfX3U2NCB0aW1lb3V0X3VzOworCV9fczMyIGxhenk7CisJX19zMzIgZmxhZ3M7CisJX19zMzIgd2FpdF9vcHRpb25zOworCV9fczMyIHBhZDY0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfRkVOQ0VfU0lHTkFMRUQKKyAqCisgKiBDaGVja3MgaWYgYSBmZW5jZSBvYmplY3QgaXMgc2lnbmFsZWQuLgorICovCisKKy8qKgorICogc3RydWN0IGRybV92bXdfZmVuY2Vfc2lnbmFsZWRfYXJnCisgKgorICogQGhhbmRsZTogRmVuY2Ugb2JqZWN0IGhhbmRsZSBhcyByZXR1cm5lZCBieSB0aGUgRFJNX1ZNV19FWEVDQlVGIGlvY3RsLgorICogQGZsYWdzOiBGZW5jZSBvYmplY3QgZmxhZ3MgaW5wdXQgdG8gRFJNX1ZNV19GRU5DRV9TSUdOQUxFRCBpb2N0bAorICogQHNpZ25hbGVkOiBPdXQ6IEZsYWdzIHNpZ25hbGVkLgorICogQHNlcXVlbmNlOiBPdXQ6IEhpZ2hlc3Qgc2VxdWVuY2UgcGFzc2VkIHNvIGZhci4gQ2FuIGJlIHVzZWQgdG8gc2lnbmFsIHRoZQorICogRVhFQyBmbGFnIG9mIHVzZXItc3BhY2UgZmVuY2Ugb2JqZWN0cy4KKyAqCisgKiBJbnB1dC9PdXRwdXQgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfRkVOQ0VfU0lHTkFMRUQgYW5kIERSTV9WTVdfRkVOQ0VfVU5SRUYKKyAqIGlvY3Rscy4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9zaWduYWxlZF9hcmcgeworCSBfX3UzMiBoYW5kbGU7CisJIF9fdTMyIGZsYWdzOworCSBfX3MzMiBzaWduYWxlZDsKKwkgX191MzIgcGFzc2VkX3NlcW5vOworCSBfX3UzMiBzaWduYWxlZF9mbGFnczsKKwkgX191MzIgcGFkNjQ7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19GRU5DRV9VTlJFRgorICoKKyAqIFVucmVmZXJlbmNlcyBhIGZlbmNlIG9iamVjdCwgYW5kIGNhdXNlcyBpdCB0byBiZSBkZXN0cm95ZWQgaWYgdGhlcmUgYXJlIG5vCisgKiBvdGhlciByZWZlcmVuY2VzIHRvIGl0LgorICoKKyAqLworCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X2ZlbmNlX2FyZworICoKKyAqIEBoYW5kbGU6IEZlbmNlIG9iamVjdCBoYW5kbGUgYXMgcmV0dXJuZWQgYnkgdGhlIERSTV9WTVdfRVhFQ0JVRiBpb2N0bC4KKyAqCisgKiBJbnB1dC9PdXRwdXQgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfRkVOQ0VfVU5SRUYgaW9jdGwuLgorICovCisKK3N0cnVjdCBkcm1fdm13X2ZlbmNlX2FyZyB7CisJIF9fdTMyIGhhbmRsZTsKKwkgX191MzIgcGFkNjQ7Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX0ZFTkNFX0VWRU5UCisgKgorICogUXVldWVzIGFuIGV2ZW50IG9uIGEgZmVuY2UgdG8gYmUgZGVsaXZlcmVkIG9uIHRoZSBkcm0gY2hhcmFjdGVyIGRldmljZQorICogd2hlbiB0aGUgZmVuY2UgaGFzIHNpZ25hbGVkIHRoZSBEUk1fVk1XX0ZFTkNFX0ZMQUdfRVhFQyBmbGFnLgorICogT3B0aW9uYWxseSB0aGUgYXBwcm94aW1hdGUgdGltZSB3aGVuIHRoZSBmZW5jZSBzaWduYWxlZCBpcworICogZ2l2ZW4gYnkgdGhlIGV2ZW50LgorICovCisKKy8qCisgKiBUaGUgZXZlbnQgdHlwZQorICovCisjZGVmaW5lIERSTV9WTVdfRVZFTlRfRkVOQ0VfU0lHTkFMRUQgMHg4MDAwMDAwMAorCitzdHJ1Y3QgZHJtX3Ztd19ldmVudF9mZW5jZSB7CisJc3RydWN0IGRybV9ldmVudCBiYXNlOworCV9fdTY0IHVzZXJfZGF0YTsKKwlfX3UzMiB0dl9zZWM7CisJX191MzIgdHZfdXNlYzsKK307CisKKy8qCisgKiBGbGFncyB0aGF0IG1heSBiZSBnaXZlbiB0byB0aGUgY29tbWFuZC4KKyAqLworLyogUmVxdWVzdCBmZW5jZSBzaWduYWxlZCB0aW1lIG9uIHRoZSBldmVudC4gKi8KKyNkZWZpbmUgRFJNX1ZNV19GRV9GTEFHX1JFUV9USU1FICgxIDw8IDApCisKKy8qKgorICogc3RydWN0IGRybV92bXdfZmVuY2VfZXZlbnRfYXJnCisgKgorICogQGZlbmNlX3JlcDogUG9pbnRlciB0byBmZW5jZV9yZXAgc3RydWN0dXJlIGNhc3QgdG8gX191NjQgb3IgMCBpZgorICogdGhlIGZlbmNlIGlzIG5vdCBzdXBwb3NlZCB0byBiZSByZWZlcmVuY2VkIGJ5IHVzZXItc3BhY2UuCisgKiBAdXNlcl9pbmZvOiBJbmZvIHRvIGJlIGRlbGl2ZXJlZCB3aXRoIHRoZSBldmVudC4KKyAqIEBoYW5kbGU6IEF0dGFjaCB0aGUgZXZlbnQgdG8gdGhpcyBmZW5jZSBvbmx5LgorICogQGZsYWdzOiBBIHNldCBvZiBmbGFncyBhcyBkZWZpbmVkIGFib3ZlLgorICovCitzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9ldmVudF9hcmcgeworCV9fdTY0IGZlbmNlX3JlcDsKKwlfX3U2NCB1c2VyX2RhdGE7CisJX191MzIgaGFuZGxlOworCV9fdTMyIGZsYWdzOworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19QUkVTRU5UCisgKgorICogRXhlY3V0ZXMgYW4gU1ZHQSBwcmVzZW50IG9uIGEgZ2l2ZW4gZmIgZm9yIGEgZ2l2ZW4gc3VyZmFjZS4gVGhlIHN1cmZhY2UKKyAqIGlzIHBsYWNlZCBvbiB0aGUgZnJhbWVidWZmZXIuIENsaXByZWN0cyBhcmUgZ2l2ZW4gcmVsYXRpdmUgdG8gdGhlIGdpdmVuCisgKiBwb2ludCAodGhlIHBvaW50IGRpc2lnbmF0ZWQgYnkgZGVzdF97eHx5fSkuCisgKgorICovCisKKy8qKgorICogc3RydWN0IGRybV92bXdfcHJlc2VudF9hcmcKKyAqIEBmYl9pZDogZnJhbWVidWZmZXIgaWQgdG8gcHJlc2VudCAvIHJlYWQgYmFjayBmcm9tLgorICogQHNpZDogU3VyZmFjZSBpZCB0byBwcmVzZW50IGZyb20uCisgKiBAZGVzdF94OiBYIHBsYWNlbWVudCBjb29yZGluYXRlIGZvciBzdXJmYWNlLgorICogQGRlc3RfeTogWSBwbGFjZW1lbnQgY29vcmRpbmF0ZSBmb3Igc3VyZmFjZS4KKyAqIEBjbGlwc19wdHI6IFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY2xpcCByZWN0cyBjYXN0IHRvIGFuIF9fdTY0LgorICogQG51bV9jbGlwczogTnVtYmVyIG9mIGNsaXByZWN0cyBnaXZlbiByZWxhdGl2ZSB0byB0aGUgZnJhbWVidWZmZXIgb3JpZ2luLAorICogaW4gdGhlIHNhbWUgY29vcmRpbmF0ZSBzcGFjZSBhcyB0aGUgZnJhbWUgYnVmZmVyLgorICogQHBhZDY0OiBVbnVzZWQgNjQtYml0IHBhZGRpbmcuCisgKgorICogSW5wdXQgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfUFJFU0VOVCBpb2N0bC4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19wcmVzZW50X2FyZyB7CisJX191MzIgZmJfaWQ7CisJX191MzIgc2lkOworCV9fczMyIGRlc3RfeDsKKwlfX3MzMiBkZXN0X3k7CisJX191NjQgY2xpcHNfcHRyOworCV9fdTMyIG51bV9jbGlwczsKKwlfX3UzMiBwYWQ2NDsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfUFJFU0VOVF9SRUFEQkFDSworICoKKyAqIEV4ZWN1dGVzIGFuIFNWR0EgcHJlc2VudCByZWFkYmFjayBmcm9tIGEgZ2l2ZW4gZmIgdG8gdGhlIGRtYSBidWZmZXIKKyAqIGN1cnJlbnRseSBib3VuZCBhcyB0aGUgZmIuIElmIHRoZXJlIGlzIG5vIGRtYSBidWZmZXIgYm91bmQgdG8gdGhlIGZiLAorICogYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAqCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19wcmVzZW50X2FyZworICogQGZiX2lkOiBmYl9pZCB0byBwcmVzZW50IC8gcmVhZCBiYWNrIGZyb20uCisgKiBAbnVtX2NsaXBzOiBOdW1iZXIgb2YgY2xpcHJlY3RzLgorICogQGNsaXBzX3B0cjogUG9pbnRlciB0byBhbiBhcnJheSBvZiBjbGlwIHJlY3RzIGNhc3QgdG8gYW4gX191NjQuCisgKiBAZmVuY2VfcmVwOiBQb2ludGVyIHRvIGEgc3RydWN0IGRybV92bXdfZmVuY2VfcmVwLCBjYXN0IHRvIGFuIF9fdTY0LgorICogSWYgdGhpcyBtZW1iZXIgaXMgTlVMTCwgdGhlbiB0aGUgaW9jdGwgc2hvdWxkIG5vdCByZXR1cm4gYSBmZW5jZS4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19wcmVzZW50X3JlYWRiYWNrX2FyZyB7CisJIF9fdTMyIGZiX2lkOworCSBfX3UzMiBudW1fY2xpcHM7CisJIF9fdTY0IGNsaXBzX3B0cjsKKwkgX191NjQgZmVuY2VfcmVwOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfVVBEQVRFX0xBWU9VVCAtIFVwZGF0ZSBsYXlvdXQKKyAqCisgKiBVcGRhdGVzIHRoZSBwcmVmZXJyZWQgbW9kZXMgYW5kIGNvbm5lY3Rpb24gc3RhdHVzIGZvciBjb25uZWN0b3JzLiBUaGUKKyAqIGNvbW1hbmQgY29uc2lzdHMgb2Ygb25lIGRybV92bXdfdXBkYXRlX2xheW91dF9hcmcgcG9pbnRpbmcgdG8gYW4gYXJyYXkKKyAqIG9mIG51bV9vdXRwdXRzIGRybV92bXdfcmVjdCdzLgorICovCisKKy8qKgorICogc3RydWN0IGRybV92bXdfdXBkYXRlX2xheW91dF9hcmcKKyAqCisgKiBAbnVtX291dHB1dHM6IG51bWJlciBvZiBhY3RpdmUgY29ubmVjdG9ycworICogQHJlY3RzOiBwb2ludGVyIHRvIGFycmF5IG9mIGRybV92bXdfcmVjdCBjYXN0IHRvIGFuIF9fdTY0CisgKgorICogSW5wdXQgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfVVBEQVRFX0xBWU9VVCBJb2N0bC4KKyAqLworc3RydWN0IGRybV92bXdfdXBkYXRlX2xheW91dF9hcmcgeworCV9fdTMyIG51bV9vdXRwdXRzOworCV9fdTMyIHBhZDY0OworCV9fdTY0IHJlY3RzOworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19DUkVBVEVfU0hBREVSIC0gQ3JlYXRlIHNoYWRlcgorICoKKyAqIENyZWF0ZXMgYSBzaGFkZXIgYW5kIG9wdGlvbmFsbHkgYmluZHMgaXQgdG8gYSBkbWEgYnVmZmVyIGNvbnRhaW5pbmcKKyAqIHRoZSBzaGFkZXIgYnl0ZS1jb2RlLgorICovCisKKy8qKgorICogZW51bSBkcm1fdm13X3NoYWRlcl90eXBlIC0gU2hhZGVyIHR5cGVzCisgKi8KK2VudW0gZHJtX3Ztd19zaGFkZXJfdHlwZSB7CisJZHJtX3Ztd19zaGFkZXJfdHlwZV92cyA9IDAsCisJZHJtX3Ztd19zaGFkZXJfdHlwZV9wcywKK307CisKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19zaGFkZXJfY3JlYXRlX2FyZworICoKKyAqIEBzaGFkZXJfdHlwZTogU2hhZGVyIHR5cGUgb2YgdGhlIHNoYWRlciB0byBjcmVhdGUuCisgKiBAc2l6ZTogU2l6ZSBvZiB0aGUgYnl0ZS1jb2RlIGluIGJ5dGVzLgorICogd2hlcmUgdGhlIHNoYWRlciBieXRlLWNvZGUgc3RhcnRzCisgKiBAYnVmZmVyX2hhbmRsZTogQnVmZmVyIGhhbmRsZSBpZGVudGlmeWluZyB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlCisgKiBzaGFkZXIgYnl0ZS1jb2RlCisgKiBAc2hhZGVyX2hhbmRsZTogT24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIGNvbnRhaW5zIGEgaGFuZGxlIHRoYXQKKyAqIGNhbiBiZSB1c2VkIHRvIHN1YnNlcXVlbnRseSBpZGVudGlmeSB0aGUgc2hhZGVyLgorICogQG9mZnNldDogT2Zmc2V0IGluIGJ5dGVzIGludG8gdGhlIGJ1ZmZlciBnaXZlbiBieSBAYnVmZmVyX2hhbmRsZSwKKyAqCisgKiBJbnB1dCAvIE91dHB1dCBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19DUkVBVEVfU0hBREVSIElvY3RsLgorICovCitzdHJ1Y3QgZHJtX3Ztd19zaGFkZXJfY3JlYXRlX2FyZyB7CisJZW51bSBkcm1fdm13X3NoYWRlcl90eXBlIHNoYWRlcl90eXBlOworCV9fdTMyIHNpemU7CisJX191MzIgYnVmZmVyX2hhbmRsZTsKKwlfX3UzMiBzaGFkZXJfaGFuZGxlOworCV9fdTY0IG9mZnNldDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX1VOUkVGX1NIQURFUiAtIFVucmVmZXJlbmNlcyBhIHNoYWRlcgorICoKKyAqIERlc3Ryb3lzIGEgdXNlci1zcGFjZSByZWZlcmVuY2UgdG8gYSBzaGFkZXIsIG9wdGlvbmFsbHkgZGVzdHJveWluZworICogaXQuCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19zaGFkZXJfYXJnCisgKgorICogQGhhbmRsZTogSGFuZGxlIGlkZW50aWZ5aW5nIHRoZSBzaGFkZXIgdG8gZGVzdHJveS4KKyAqCisgKiBJbnB1dCBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19VTlJFRl9TSEFERVIgaW9jdGwuCisgKi8KK3N0cnVjdCBkcm1fdm13X3NoYWRlcl9hcmcgeworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBwYWQ2NDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX0dCX1NVUkZBQ0VfQ1JFQVRFIC0gQ3JlYXRlIGEgaG9zdCBndWVzdC1iYWNrZWQgc3VyZmFjZS4KKyAqCisgKiBBbGxvY2F0ZXMgYSBzdXJmYWNlIGhhbmRsZSBhbmQgcXVldWVzIGEgY3JlYXRlIHN1cmZhY2UgY29tbWFuZAorICogZm9yIHRoZSBob3N0IG9uIHRoZSBmaXJzdCB1c2Ugb2YgdGhlIHN1cmZhY2UuIFRoZSBzdXJmYWNlIElEIGNhbgorICogYmUgdXNlZCBhcyB0aGUgc3VyZmFjZSBJRCBpbiBjb21tYW5kcyByZWZlcmVuY2luZyB0aGUgc3VyZmFjZS4KKyAqLworCisvKioKKyAqIGVudW0gZHJtX3Ztd19zdXJmYWNlX2ZsYWdzCisgKgorICogQGRybV92bXdfc3VyZmFjZV9mbGFnX3NoYXJlYWJsZTogICAgIFdoZXRoZXIgdGhlIHN1cmZhY2UgaXMgc2hhcmVhYmxlCisgKiBAZHJtX3Ztd19zdXJmYWNlX2ZsYWdfc2Nhbm91dDogICAgICAgV2hldGhlciB0aGUgc3VyZmFjZSBpcyBhIHNjYW5vdXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLgorICogQGRybV92bXdfc3VyZmFjZV9mbGFnX2NyZWF0ZV9idWZmZXI6IENyZWF0ZSBhIGJhY2t1cCBidWZmZXIgaWYgbm9uZSBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuLgorICovCitlbnVtIGRybV92bXdfc3VyZmFjZV9mbGFncyB7CisJZHJtX3Ztd19zdXJmYWNlX2ZsYWdfc2hhcmVhYmxlID0gKDEgPDwgMCksCisJZHJtX3Ztd19zdXJmYWNlX2ZsYWdfc2Nhbm91dCA9ICgxIDw8IDEpLAorCWRybV92bXdfc3VyZmFjZV9mbGFnX2NyZWF0ZV9idWZmZXIgPSAoMSA8PCAyKQorfTsKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19nYl9zdXJmYWNlX2NyZWF0ZV9yZXEKKyAqCisgKiBAc3ZnYTNkX2ZsYWdzOiAgICAgU1ZHQTNkIHN1cmZhY2UgZmxhZ3MgZm9yIHRoZSBkZXZpY2UuCisgKiBAZm9ybWF0OiAgICAgICAgICAgU1ZHQTNkIGZvcm1hdC4KKyAqIEBtaXBfbGV2ZWw6ICAgICAgICBOdW1iZXIgb2YgbWlwIGxldmVscyBmb3IgYWxsIGZhY2VzLgorICogQGRybV9zdXJmYWNlX2ZsYWdzIEZsYWdzIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAqIEBtdWx0aXNhbXBsZV9jb3VudCBGdXR1cmUgdXNlLiBTZXQgdG8gMC4KKyAqIEBhdXRvZ2VuX2ZpbHRlciAgICBGdXR1cmUgdXNlLiBTZXQgdG8gMC4KKyAqIEBidWZmZXJfaGFuZGxlICAgICBCdWZmZXIgaGFuZGxlIG9mIGJhY2t1cCBidWZmZXIuIFNWR0EzRF9JTlZBTElEX0lECisgKiAgICAgICAgICAgICAgICAgICAgaWYgbm9uZS4KKyAqIEBiYXNlX3NpemUgICAgICAgICBTaXplIG9mIHRoZSBiYXNlIG1pcCBsZXZlbCBmb3IgYWxsIGZhY2VzLgorICogQGFycmF5X3NpemUgICAgICAgIE11c3QgYmUgemVybyBmb3Igbm9uLURYIGhhcmR3YXJlLCBhbmQgaWYgbm9uLXplcm8KKyAqICAgICAgICAgICAgICAgICAgICBzdmdhM2RfZmxhZ3MgbXVzdCBoYXZlIHByb3BlciBiaW5kIGZsYWdzIHNldHVwLgorICoKKyAqIElucHV0IGFyZ3VtZW50IHRvIHRoZSAgRFJNX1ZNV19HQl9TVVJGQUNFX0NSRUFURSBJb2N0bC4KKyAqIFBhcnQgb2Ygb3V0cHV0IGFyZ3VtZW50IGZvciB0aGUgRFJNX1ZNV19HQl9TVVJGQUNFX1JFRiBJb2N0bC4KKyAqLworc3RydWN0IGRybV92bXdfZ2Jfc3VyZmFjZV9jcmVhdGVfcmVxIHsKKwlfX3UzMiBzdmdhM2RfZmxhZ3M7CisJX191MzIgZm9ybWF0OworCV9fdTMyIG1pcF9sZXZlbHM7CisJZW51bSBkcm1fdm13X3N1cmZhY2VfZmxhZ3MgZHJtX3N1cmZhY2VfZmxhZ3M7CisJX191MzIgbXVsdGlzYW1wbGVfY291bnQ7CisJX191MzIgYXV0b2dlbl9maWx0ZXI7CisJX191MzIgYnVmZmVyX2hhbmRsZTsKKwlfX3UzMiBhcnJheV9zaXplOworCXN0cnVjdCBkcm1fdm13X3NpemUgYmFzZV9zaXplOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19nYl9zdXJmYWNlX2NyZWF0ZV9yZXAKKyAqCisgKiBAaGFuZGxlOiAgICAgICAgICAgIFN1cmZhY2UgaGFuZGxlLgorICogQGJhY2t1cF9zaXplOiAgICAgICBTaXplIG9mIGJhY2t1cCBidWZmZXJzIGZvciB0aGlzIHN1cmZhY2UuCisgKiBAYnVmZmVyX2hhbmRsZTogICAgIEhhbmRsZSBvZiBiYWNrdXAgYnVmZmVyLiBTVkdBM0RfSU5WQUxJRF9JRCBpZiBub25lLgorICogQGJ1ZmZlcl9zaXplOiAgICAgICBBY3R1YWwgc2l6ZSBvZiB0aGUgYnVmZmVyIGlkZW50aWZpZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgQGJ1ZmZlcl9oYW5kbGUKKyAqIEBidWZmZXJfbWFwX2hhbmRsZTogT2Zmc2V0IGludG8gZGV2aWNlIGFkZHJlc3Mgc3BhY2UgZm9yIHRoZSBidWZmZXIKKyAqICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllZCBieSBAYnVmZmVyX2hhbmRsZS4KKyAqCisgKiBQYXJ0IG9mIG91dHB1dCBhcmd1bWVudCBmb3IgdGhlIERSTV9WTVdfR0JfU1VSRkFDRV9SRUYgaW9jdGwuCisgKiBPdXRwdXQgYXJndW1lbnQgZm9yIHRoZSBEUk1fVk1XX0dCX1NVUkZBQ0VfQ1JFQVRFIGlvY3RsLgorICovCitzdHJ1Y3QgZHJtX3Ztd19nYl9zdXJmYWNlX2NyZWF0ZV9yZXAgeworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBiYWNrdXBfc2l6ZTsKKwlfX3UzMiBidWZmZXJfaGFuZGxlOworCV9fdTMyIGJ1ZmZlcl9zaXplOworCV9fdTY0IGJ1ZmZlcl9tYXBfaGFuZGxlOworfTsKKworLyoqCisgKiB1bmlvbiBkcm1fdm13X2diX3N1cmZhY2VfY3JlYXRlX2FyZworICoKKyAqIEByZXE6IElucHV0IGFyZ3VtZW50IGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAqIEByZXA6IE91dHB1dCBhcmd1bWVudCBhcyBkZXNjcmliZWQgYWJvdmUuCisgKgorICogQXJndW1lbnQgdG8gdGhlIERSTV9WTVdfR0JfU1VSRkFDRV9DUkVBVEUgaW9jdGwuCisgKi8KK3VuaW9uIGRybV92bXdfZ2Jfc3VyZmFjZV9jcmVhdGVfYXJnIHsKKwlzdHJ1Y3QgZHJtX3Ztd19nYl9zdXJmYWNlX2NyZWF0ZV9yZXAgcmVwOworCXN0cnVjdCBkcm1fdm13X2diX3N1cmZhY2VfY3JlYXRlX3JlcSByZXE7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19HQl9TVVJGQUNFX1JFRiAtIFJlZmVyZW5jZSBhIGhvc3Qgc3VyZmFjZS4KKyAqCisgKiBQdXRzIGEgcmVmZXJlbmNlIG9uIGEgaG9zdCBzdXJmYWNlIHdpdGggYSBnaXZlbiBoYW5kbGUsIGFzIHByZXZpb3VzbHkKKyAqIHJldHVybmVkIGJ5IHRoZSBEUk1fVk1XX0dCX1NVUkZBQ0VfQ1JFQVRFIGlvY3RsLgorICogQSByZWZlcmVuY2Ugd2lsbCBtYWtlIHN1cmUgdGhlIHN1cmZhY2UgaXNuJ3QgZGVzdHJveWVkIHdoaWxlIHdlIGhvbGQKKyAqIGl0IGFuZCB3aWxsIGFsbG93IHRoZSBjYWxsaW5nIGNsaWVudCB0byB1c2UgdGhlIHN1cmZhY2UgaGFuZGxlIGluCisgKiB0aGUgY29tbWFuZCBzdHJlYW0uCisgKgorICogT24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBJb2N0bCByZXR1cm5zIHRoZSBzdXJmYWNlIGluZm9ybWF0aW9uIGdpdmVuCisgKiB0byBhbmQgcmV0dXJuZWQgZnJvbSB0aGUgRFJNX1ZNV19HQl9TVVJGQUNFX0NSRUFURSBpb2N0bC4KKyAqLworCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X2diX3N1cmZhY2VfcmVmZXJlbmNlX2FyZworICoKKyAqIEBjcmVxOiBUaGUgZGF0YSB1c2VkIGFzIGlucHV0IHdoZW4gdGhlIHN1cmZhY2Ugd2FzIGNyZWF0ZWQsIGFzIGRlc2NyaWJlZAorICogICAgICAgIGFib3ZlIGF0ICJzdHJ1Y3QgZHJtX3Ztd19nYl9zdXJmYWNlX2NyZWF0ZV9yZXEiCisgKiBAY3JlcDogQWRkaXRpb25hbCBkYXRhIG91dHB1dCB3aGVuIHRoZSBzdXJmYWNlIHdhcyBjcmVhdGVkLCBhcyBkZXNjcmliZWQKKyAqICAgICAgICBhYm92ZSBhdCAic3RydWN0IGRybV92bXdfZ2Jfc3VyZmFjZV9jcmVhdGVfcmVwIgorICoKKyAqIE91dHB1dCBBcmd1bWVudCB0byB0aGUgRFJNX1ZNV19HQl9TVVJGQUNFX1JFRiBpb2N0bC4KKyAqLworc3RydWN0IGRybV92bXdfZ2Jfc3VyZmFjZV9yZWZfcmVwIHsKKwlzdHJ1Y3QgZHJtX3Ztd19nYl9zdXJmYWNlX2NyZWF0ZV9yZXEgY3JlcTsKKwlzdHJ1Y3QgZHJtX3Ztd19nYl9zdXJmYWNlX2NyZWF0ZV9yZXAgY3JlcDsKK307CisKKy8qKgorICogdW5pb24gZHJtX3Ztd19nYl9zdXJmYWNlX3JlZmVyZW5jZV9hcmcKKyAqCisgKiBAcmVxOiBJbnB1dCBkYXRhIGFzIGRlc2NyaWJlZCBhYm92ZSBhdCAic3RydWN0IGRybV92bXdfc3VyZmFjZV9hcmciCisgKiBAcmVwOiBPdXRwdXQgZGF0YSBhcyBkZXNjcmliZWQgYWJvdmUgYXQgInN0cnVjdCBkcm1fdm13X2diX3N1cmZhY2VfcmVmX3JlcCIKKyAqCisgKiBBcmd1bWVudCB0byB0aGUgRFJNX1ZNV19HQl9TVVJGQUNFX1JFRiBJb2N0bC4KKyAqLwordW5pb24gZHJtX3Ztd19nYl9zdXJmYWNlX3JlZmVyZW5jZV9hcmcgeworCXN0cnVjdCBkcm1fdm13X2diX3N1cmZhY2VfcmVmX3JlcCByZXA7CisJc3RydWN0IGRybV92bXdfc3VyZmFjZV9hcmcgcmVxOworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19TWU5DQ1BVIC0gU3luYyBhIERNQSBidWZmZXIgLyBNT0IgZm9yIENQVSBhY2Nlc3MuCisgKgorICogSWRsZXMgYW55IHByZXZpb3VzbHkgc3VibWl0dGVkIEdQVSBvcGVyYXRpb25zIG9uIHRoZSBidWZmZXIgYW5kCisgKiBieSBkZWZhdWx0IGJsb2NrcyBjb21tYW5kIHN1Ym1pc3Npb25zIHRoYXQgcmVmZXJlbmNlIHRoZSBidWZmZXIuCisgKiBJZiB0aGUgZmlsZSBkZXNjcmlwdG9yIHVzZWQgdG8gZ3JhYiBhIGJsb2NraW5nIENQVSBzeW5jIGlzIGNsb3NlZCwgdGhlCisgKiBjcHUgc3luYyBpcyByZWxlYXNlZC4KKyAqIFRoZSBmbGFncyBhcmd1bWVudCBpbmRpY2F0ZXMgaG93IHRoZSBncmFiIC8gcmVsZWFzZSBvcGVyYXRpb24gc2hvdWxkIGJlCisgKiBwZXJmb3JtZWQ6CisgKi8KKworLyoqCisgKiBlbnVtIGRybV92bXdfc3luY2NwdV9mbGFncyAtIFN5bmNjcHUgZmxhZ3M6CisgKgorICogQGRybV92bXdfc3luY2NwdV9yZWFkOiBTeW5jIGZvciByZWFkLiBJZiBzeW5jIGlzIGRvbmUgZm9yIHJlYWQgb25seSwgaXQncyBhCisgKiBoaW50IHRvIHRoZSBrZXJuZWwgdG8gYWxsb3cgY29tbWFuZCBzdWJtaXNzaW9ucyB0aGF0IHJlZmVyZW5jZXMgdGhlIGJ1ZmZlcgorICogZm9yIHJlYWQtb25seS4KKyAqIEBkcm1fdm13X3N5bmNjcHVfd3JpdGU6IFN5bmMgZm9yIHdyaXRlLiBCbG9jayBhbGwgY29tbWFuZCBzdWJtaXNzaW9ucworICogcmVmZXJlbmNpbmcgdGhpcyBidWZmZXIuCisgKiBAZHJtX3Ztd19zeW5jY3B1X2RvbnRibG9jazogRG9udCB3YWl0IGZvciBHUFUgaWRsZSwgYnV0IHJhdGhlciByZXR1cm4KKyAqIC1FQlVTWSBzaG91bGQgdGhlIGJ1ZmZlciBiZSBidXN5LgorICogQGRybV92bXdfc3luY2NwdV9hbGxvd19jczogQWxsb3cgY29tbWFuZCBzdWJtaXNzaW9uIHRoYXQgdG91Y2hlcyB0aGUgYnVmZmVyCisgKiB3aGlsZSB0aGUgYnVmZmVyIGlzIHN5bmNlZCBmb3IgQ1BVLiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIEdFTSBibyBpZGxlCisgKiBiZWhhdmlvci4KKyAqLworZW51bSBkcm1fdm13X3N5bmNjcHVfZmxhZ3MgeworCWRybV92bXdfc3luY2NwdV9yZWFkID0gKDEgPDwgMCksCisJZHJtX3Ztd19zeW5jY3B1X3dyaXRlID0gKDEgPDwgMSksCisJZHJtX3Ztd19zeW5jY3B1X2RvbnRibG9jayA9ICgxIDw8IDIpLAorCWRybV92bXdfc3luY2NwdV9hbGxvd19jcyA9ICgxIDw8IDMpCit9OworCisvKioKKyAqIGVudW0gZHJtX3Ztd19zeW5jY3B1X29wIC0gU3luY2NwdSBvcGVyYXRpb25zOgorICoKKyAqIEBkcm1fdm13X3N5bmNjcHVfZ3JhYjogICAgR3JhYiB0aGUgYnVmZmVyIGZvciBDUFUgb3BlcmF0aW9ucworICogQGRybV92bXdfc3luY2NwdV9yZWxlYXNlOiBSZWxlYXNlIGEgcHJldmlvdXMgZ3JhYi4KKyAqLworZW51bSBkcm1fdm13X3N5bmNjcHVfb3AgeworCWRybV92bXdfc3luY2NwdV9ncmFiLAorCWRybV92bXdfc3luY2NwdV9yZWxlYXNlCit9OworCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X3N5bmNjcHVfYXJnCisgKgorICogQG9wOgkJCSAgICAgVGhlIHN5bmNjcHUgb3BlcmF0aW9uIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAqIEBoYW5kbGU6CQkgICAgIEhhbmRsZSBpZGVudGlmeWluZyB0aGUgYnVmZmVyIG9iamVjdC4KKyAqIEBmbGFnczoJCSAgICAgRmxhZ3MgYXMgZGVzY3JpYmVkIGFib3ZlLgorICovCitzdHJ1Y3QgZHJtX3Ztd19zeW5jY3B1X2FyZyB7CisJZW51bSBkcm1fdm13X3N5bmNjcHVfb3Agb3A7CisJZW51bSBkcm1fdm13X3N5bmNjcHVfZmxhZ3MgZmxhZ3M7CisJX191MzIgaGFuZGxlOworCV9fdTMyIHBhZDY0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfQ1JFQVRFX0VYVEVOREVEX0NPTlRFWFQgLSBDcmVhdGUgYSBob3N0IGNvbnRleHQuCisgKgorICogQWxsb2NhdGVzIGEgZGV2aWNlIHVuaXF1ZSBjb250ZXh0IGlkLCBhbmQgcXVldWVzIGEgY3JlYXRlIGNvbnRleHQgY29tbWFuZAorICogZm9yIHRoZSBob3N0LiBEb2VzIG5vdCB3YWl0IGZvciBob3N0IGNvbXBsZXRpb24uCisgKi8KK2VudW0gZHJtX3Ztd19leHRlbmRlZF9jb250ZXh0IHsKKwlkcm1fdm13X2NvbnRleHRfbGVnYWN5LAorCWRybV92bXdfY29udGV4dF9keAorfTsKKworLyoqCisgKiB1bmlvbiBkcm1fdm13X2V4dGVuZGVkX2NvbnRleHRfYXJnCisgKgorICogQHJlcTogQ29udGV4dCB0eXBlLgorICogQHJlcDogQ29udGV4dCBpZGVudGlmaWVyLgorICoKKyAqIEFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX0NSRUFURV9FWFRFTkRFRF9DT05URVhUIElvY3RsLgorICovCit1bmlvbiBkcm1fdm13X2V4dGVuZGVkX2NvbnRleHRfYXJnIHsKKwllbnVtIGRybV92bXdfZXh0ZW5kZWRfY29udGV4dCByZXE7CisJc3RydWN0IGRybV92bXdfY29udGV4dF9hcmcgcmVwOworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50ZWwvLmdpdGlnbm9yZSBiL2ludGVsLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4YjQwOAotLS0gL2Rldi9udWxsCisrKyBiL2ludGVsLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAordGVzdF9kZWNvZGUKZGlmZiAtLWdpdCBhL2ludGVsL0FuZHJvaWQubWsgYi9pbnRlbC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MDdmZjMKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlbC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgQ29weXJpZ2h0IMKpIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyMgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyMgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorIyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyMgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisjIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyMgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorIyBTb2Z0d2FyZS4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyMgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorIyBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorIyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworIyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisjIElOIFRIRSBTT0ZUV0FSRS4KKyMKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgSW1wb3J0IHZhcmlhYmxlcyBMSUJEUk1fSU5URUxfRklMRVMsIExJQkRSTV9JTlRFTF9IX0ZJTEVTCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvTWFrZWZpbGUuc291cmNlcworCitMT0NBTF9NT0RVTEUgOj0gbGliZHJtX2ludGVsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKExJQkRSTV9JTlRFTF9GSUxFUykKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliZHJtIFwKKwlsaWJwY2lhY2Nlc3MKKworaW5jbHVkZSAkKExJQkRSTV9DT01NT05fTUspCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9pbnRlbC9NYWtlZmlsZS5hbSBiL2ludGVsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MmU4YzAKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDczIEBACisjIENvcHlyaWdodCDCqSAyMDA4IEludGVsIENvcnBvcmF0aW9uCisjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisjIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisjIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyMgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisjIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorIyBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIworIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisjIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyMgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisjIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyMgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyMgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworIyBJTiBUSEUgU09GVFdBUkUuCisjCisjIEF1dGhvcnM6CisjICAgIEVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisKK2luY2x1ZGUgTWFrZWZpbGUuc291cmNlcworCitBTV9DRkxBR1MgPSBcCisJJChXQVJOX0NGTEFHUykgXAorCS1JJCh0b3Bfc3JjZGlyKSBcCisJJChQVEhSRUFEU1RVQlNfQ0ZMQUdTKSBcCisJJChQQ0lBQ0NFU1NfQ0ZMQUdTKSBcCisJJChWQUxHUklORF9DRkxBR1MpIFwKKwktSSQodG9wX3NyY2RpcikvaW5jbHVkZS9kcm0KKworbGliZHJtX2ludGVsX2xhX0xUTElCUkFSSUVTID0gbGliZHJtX2ludGVsLmxhCitsaWJkcm1faW50ZWxfbGFkaXIgPSAkKGxpYmRpcikKK2xpYmRybV9pbnRlbF9sYV9MREZMQUdTID0gLXZlcnNpb24tbnVtYmVyIDE6MDowIC1uby11bmRlZmluZWQKK2xpYmRybV9pbnRlbF9sYV9MSUJBREQgPSAuLi9saWJkcm0ubGEgXAorCUBQVEhSRUFEU1RVQlNfTElCU0AgXAorCUBQQ0lBQ0NFU1NfTElCU0AgXAorCUBDTE9DS19MSUJACisKK2xpYmRybV9pbnRlbF9sYV9TT1VSQ0VTID0gJChMSUJEUk1fSU5URUxfRklMRVMpCisKK2xpYmRybV9pbnRlbGluY2x1ZGVkaXIgPSAke2luY2x1ZGVkaXJ9L2xpYmRybQorbGliZHJtX2ludGVsaW5jbHVkZV9IRUFERVJTID0gJChMSUJEUk1fSU5URUxfSF9GSUxFUykKKworIyBUaGlzIG1heSBiZSBpbnRlcmVzdGluZyBldmVuIG91dHNpZGUgb2YgIm1ha2UgY2hlY2siLCBkdWUgdG8gdGhlIC1kdW1wIG9wdGlvbi4KK25vaW5zdF9QUk9HUkFNUyA9IHRlc3RfZGVjb2RlCisKK0JBVENIRVMgPSBcCisJdGVzdHMvZ2VuNC0zZC5iYXRjaCBcCisJdGVzdHMvZ200NS0zZC5iYXRjaCBcCisJdGVzdHMvZ2VuNS0zZC5iYXRjaCBcCisJdGVzdHMvZ2VuNi0zZC5iYXRjaCBcCisJdGVzdHMvZ2VuNy0yZC1jb3B5LmJhdGNoIFwKKwl0ZXN0cy9nZW43LTNkLmJhdGNoCisKK1RFU1RTID0gXAorCSQoQkFUQ0hFUzouYmF0Y2g9LmJhdGNoLnNoKSBcCisJaW50ZWwtc3ltYm9sLWNoZWNrCisKK0VYVFJBX0RJU1QgPSBcCisJJChCQVRDSEVTKSBcCisJJChCQVRDSEVTOi5iYXRjaD0uYmF0Y2guc2gpIFwKKwkkKEJBVENIRVM6LmJhdGNoPS5iYXRjaC1yZWYudHh0KSBcCisJJChCQVRDSEVTOi5iYXRjaD0uYmF0Y2gtcmVmLnR4dCkgXAorCXRlc3RzL3Rlc3QtYmF0Y2guc2ggXAorCSQoVEVTVFMpCisKK3Rlc3RfZGVjb2RlX0xEQUREID0gbGliZHJtX2ludGVsLmxhIC4uL2xpYmRybS5sYQorCitwa2djb25maWdfREFUQSA9IGxpYmRybV9pbnRlbC5wYwpkaWZmIC0tZ2l0IGEvaW50ZWwvTWFrZWZpbGUuc291cmNlcyBiL2ludGVsL01ha2VmaWxlLnNvdXJjZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk0N2FiNwotLS0gL2Rldi9udWxsCisrKyBiL2ludGVsL01ha2VmaWxlLnNvdXJjZXMKQEAgLTAsMCArMSwxNSBAQAorTElCRFJNX0lOVEVMX0ZJTEVTIDo9IFwKKwlpbnRlbF9idWZtZ3IuYyBcCisJaW50ZWxfYnVmbWdyX3ByaXYuaCBcCisJaW50ZWxfYnVmbWdyX2Zha2UuYyBcCisJaW50ZWxfYnVmbWdyX2dlbS5jIFwKKwlpbnRlbF9kZWNvZGUuYyBcCisJaW50ZWxfY2hpcHNldC5oIFwKKwltbS5jIFwKKwltbS5oIFwKKwl1dGhhc2guaAorCitMSUJEUk1fSU5URUxfSF9GSUxFUyA6PSBcCisJaW50ZWxfYnVmbWdyLmggXAorCWludGVsX2F1Yi5oIFwKKwlpbnRlbF9kZWJ1Zy5oCmRpZmYgLS1naXQgYS9pbnRlbC9pbnRlbC1zeW1ib2wtY2hlY2sgYi9pbnRlbC9pbnRlbC1zeW1ib2wtY2hlY2sKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmFhMmQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2ludGVsL2ludGVsLXN5bWJvbC1jaGVjawpAQCAtMCwwICsxLDEwMCBAQAorIyEvYmluL2Jhc2gKKworIyBUaGUgZm9sbG93aW5nIHN5bWJvbHMgKHBhc3QgdGhlIGZpcnN0IGZpdmUpIGFyZSB0YWtlbiBmcm9tIHRoZSBwdWJsaWMgaGVhZGVycy4KKyMgQSBsaXN0IG9mIHRoZSBsYXR0ZXIgc2hvdWxkIGJlIGF2YWlsYWJsZSBNYWtlZmlsZS5zb3VyY2VzL0xJQkRSTV9JTlRFTF9IX0ZJTEVTCisKK0ZVTkNTPSQobm0gLUQgLS1mb3JtYXQ9YnNkIC0tZGVmaW5lZC1vbmx5ICR7MS0ubGlicy9saWJkcm1faW50ZWwuc299IHwgYXdrICd7cHJpbnQgJDN9JyB8IHdoaWxlIHJlYWQgZnVuYzsgZG8KKyggZ3JlcCAtcSAiXiRmdW5jJCIgfHwgZWNobyAkZnVuYyApICA8PEVPRgorX19ic3Nfc3RhcnQKK19lZGF0YQorX2VuZAorX2ZpbmkKK19pbml0Citkcm1faW50ZWxfYm9fYWxsb2MKK2RybV9pbnRlbF9ib19hbGxvY19mb3JfcmVuZGVyCitkcm1faW50ZWxfYm9fYWxsb2NfdGlsZWQKK2RybV9pbnRlbF9ib19hbGxvY191c2VycHRyCitkcm1faW50ZWxfYm9fYnVzeQorZHJtX2ludGVsX2JvX2Rpc2FibGVfcmV1c2UKK2RybV9pbnRlbF9ib19lbWl0X3JlbG9jCitkcm1faW50ZWxfYm9fZW1pdF9yZWxvY19mZW5jZQorZHJtX2ludGVsX2JvX2V4ZWMKK2RybV9pbnRlbF9ib19mYWtlX2FsbG9jX3N0YXRpYworZHJtX2ludGVsX2JvX2Zha2VfZGlzYWJsZV9iYWNraW5nX3N0b3JlCitkcm1faW50ZWxfYm9fZmxpbmsKK2RybV9pbnRlbF9ib19nZW1fY3JlYXRlX2Zyb21fbmFtZQorZHJtX2ludGVsX2JvX2dlbV9jcmVhdGVfZnJvbV9wcmltZQorZHJtX2ludGVsX2JvX2dlbV9leHBvcnRfdG9fcHJpbWUKK2RybV9pbnRlbF9ib19nZXRfc3ViZGF0YQorZHJtX2ludGVsX2JvX2dldF90aWxpbmcKK2RybV9pbnRlbF9ib19pc19yZXVzYWJsZQorZHJtX2ludGVsX2JvX21hZHZpc2UKK2RybV9pbnRlbF9ib19tYXAKK2RybV9pbnRlbF9ib19tcmJfZXhlYworZHJtX2ludGVsX2JvX3BpbgorZHJtX2ludGVsX2JvX3JlZmVyZW5jZQorZHJtX2ludGVsX2JvX3JlZmVyZW5jZXMKK2RybV9pbnRlbF9ib19zZXRfc29mdHBpbl9vZmZzZXQKK2RybV9pbnRlbF9ib19zZXRfdGlsaW5nCitkcm1faW50ZWxfYm9fc3ViZGF0YQorZHJtX2ludGVsX2JvX3VubWFwCitkcm1faW50ZWxfYm9fdW5waW4KK2RybV9pbnRlbF9ib191bnJlZmVyZW5jZQorZHJtX2ludGVsX2JvX3VzZV80OGJfYWRkcmVzc19yYW5nZQorZHJtX2ludGVsX2JvX3dhaXRfcmVuZGVyaW5nCitkcm1faW50ZWxfYnVmbWdyX2NoZWNrX2FwZXJ0dXJlX3NwYWNlCitkcm1faW50ZWxfYnVmbWdyX2Rlc3Ryb3kKK2RybV9pbnRlbF9idWZtZ3JfZmFrZV9jb250ZW5kZWRfbG9ja190YWtlCitkcm1faW50ZWxfYnVmbWdyX2Zha2VfZXZpY3RfYWxsCitkcm1faW50ZWxfYnVmbWdyX2Zha2VfaW5pdAorZHJtX2ludGVsX2J1Zm1ncl9mYWtlX3NldF9leGVjX2NhbGxiYWNrCitkcm1faW50ZWxfYnVmbWdyX2Zha2Vfc2V0X2ZlbmNlX2NhbGxiYWNrCitkcm1faW50ZWxfYnVmbWdyX2Zha2Vfc2V0X2xhc3RfZGlzcGF0Y2gKK2RybV9pbnRlbF9idWZtZ3JfZ2VtX2Nhbl9kaXNhYmxlX2ltcGxpY2l0X3N5bmMKK2RybV9pbnRlbF9idWZtZ3JfZ2VtX2VuYWJsZV9mZW5jZWRfcmVsb2NzCitkcm1faW50ZWxfYnVmbWdyX2dlbV9lbmFibGVfcmV1c2UKK2RybV9pbnRlbF9idWZtZ3JfZ2VtX2dldF9kZXZpZAorZHJtX2ludGVsX2J1Zm1ncl9nZW1faW5pdAorZHJtX2ludGVsX2J1Zm1ncl9nZW1fc2V0X2F1Yl9hbm5vdGF0aW9ucworZHJtX2ludGVsX2J1Zm1ncl9nZW1fc2V0X2F1Yl9kdW1wCitkcm1faW50ZWxfYnVmbWdyX2dlbV9zZXRfYXViX2ZpbGVuYW1lCitkcm1faW50ZWxfYnVmbWdyX2dlbV9zZXRfdm1hX2NhY2hlX3NpemUKK2RybV9pbnRlbF9idWZtZ3Jfc2V0X2RlYnVnCitkcm1faW50ZWxfZGVjb2RlCitkcm1faW50ZWxfZGVjb2RlX2NvbnRleHRfYWxsb2MKK2RybV9pbnRlbF9kZWNvZGVfY29udGV4dF9mcmVlCitkcm1faW50ZWxfZGVjb2RlX3NldF9iYXRjaF9wb2ludGVyCitkcm1faW50ZWxfZGVjb2RlX3NldF9kdW1wX3Bhc3RfZW5kCitkcm1faW50ZWxfZGVjb2RlX3NldF9oZWFkX3RhaWwKK2RybV9pbnRlbF9kZWNvZGVfc2V0X291dHB1dF9maWxlCitkcm1faW50ZWxfZ2VtX2JvX2F1Yl9kdW1wX2JtcAorZHJtX2ludGVsX2dlbV9ib19jbGVhcl9yZWxvY3MKK2RybV9pbnRlbF9nZW1fYm9fY29udGV4dF9leGVjCitkcm1faW50ZWxfZ2VtX2JvX2Rpc2FibGVfaW1wbGljaXRfc3luYworZHJtX2ludGVsX2dlbV9ib19lbmFibGVfaW1wbGljaXRfc3luYworZHJtX2ludGVsX2dlbV9ib19mZW5jZV9leGVjCitkcm1faW50ZWxfZ2VtX2JvX2dldF9yZWxvY19jb3VudAorZHJtX2ludGVsX2dlbV9ib19tYXBfX2NwdQorZHJtX2ludGVsX2dlbV9ib19tYXBfX2d0dAorZHJtX2ludGVsX2dlbV9ib19tYXBfX3djCitkcm1faW50ZWxfZ2VtX2JvX21hcF9ndHQKK2RybV9pbnRlbF9nZW1fYm9fbWFwX3Vuc3luY2hyb25pemVkCitkcm1faW50ZWxfZ2VtX2JvX3N0YXJ0X2d0dF9hY2Nlc3MKK2RybV9pbnRlbF9nZW1fYm9fdW5tYXBfZ3R0Citkcm1faW50ZWxfZ2VtX2JvX3dhaXQKK2RybV9pbnRlbF9nZW1fY29udGV4dF9jcmVhdGUKK2RybV9pbnRlbF9nZW1fY29udGV4dF9kZXN0cm95Citkcm1faW50ZWxfZ2VtX2NvbnRleHRfZ2V0X2lkCitkcm1faW50ZWxfZ2V0X2FwZXJ0dXJlX3NpemVzCitkcm1faW50ZWxfZ2V0X2V1X3RvdGFsCitkcm1faW50ZWxfZ2V0X21pbl9ldV9pbl9wb29sCitkcm1faW50ZWxfZ2V0X3BpcGVfZnJvbV9jcnRjX2lkCitkcm1faW50ZWxfZ2V0X3Bvb2xlZF9ldQorZHJtX2ludGVsX2dldF9yZXNldF9zdGF0cworZHJtX2ludGVsX2dldF9zdWJzbGljZV90b3RhbAorZHJtX2ludGVsX3JlZ19yZWFkCitFT0YKK2RvbmUpCisKK3Rlc3QgISAtbiAiJEZVTkNTIiB8fCBlY2hvICRGVU5DUwordGVzdCAhIC1uICIkRlVOQ1MiCmRpZmYgLS1naXQgYS9pbnRlbC9pbnRlbF9hdWIuaCBiL2ludGVsL2ludGVsX2F1Yi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMGFiYTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlbC9pbnRlbF9hdWIuaApAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICoKKyAqLworCisvKiogQGZpbGUgaW50ZWxfYXViLmgKKyAqCisgKiBUaGUgQVVCIGZpbGUgaXMgYSBmaWxlIGZvcm1hdCB1c2VkIGJ5IEludGVsJ3MgaW50ZXJuYWwgc2ltdWxhdGlvbgorICogYW5kIG90aGVyIHZhbGlkYXRpb24gdG9vbHMuICBJdCBjYW4gYmUgdXNlZCBhdCB2YXJpb3VzIGxldmVscyBieSBhCisgKiBkcml2ZXIgdG8gaW5wdXQgc3RhdGUgdG8gdGhlIHNpbXVsYXRlZCBoYXJkd2FyZSBvciBhIHJlcGxheWluZworICogZGVidWdnZXIuCisgKgorICogV2UgY2hvb3NlIHRvIGR1bXAgQVVCIGZpbGVzIHVzaW5nIHRoZSB0cmFjZSBibG9jayBmb3JtYXQgZm9yIGVhc2UKKyAqIG9mIGltcGxlbWVudGF0aW9uIC0tIGR1bXAgb3V0IHRoZSBibG9ja3Mgb2YgbWVtb3J5IGFzIHBsYWluIGJsb2JzCisgKiBhbmQgaW5zZXJ0IHJpbmcgY29tbWFuZHMgdG8gZXhlY3V0ZSB0aGUgYmF0Y2hidWZmZXIgYmxvYi4KKyAqLworCisjaWZuZGVmIF9JTlRFTF9BVUJfSAorI2RlZmluZSBfSU5URUxfQVVCX0gKKworI2RlZmluZSBBVUJfTUlfTk9PUAkJCSgwKQorI2RlZmluZSBBVUJfTUlfQkFUQ0hfQlVGRkVSX1NUQVJUIAkoMHgzMSA8PCAyMykKKyNkZWZpbmUgQVVCX1BJUEVfQ09OVFJPTAkJKDB4N2EwMDAwMDIpCisKKy8qIERXMDogaW5zdHJ1Y3Rpb24gdHlwZS4gKi8KKworI2RlZmluZSBDTURfQVVCCQkJKDcgPDwgMjkpCisKKyNkZWZpbmUgQ01EX0FVQl9IRUFERVIJCShDTURfQVVCIHwgKDEgPDwgMjMpIHwgKDB4MDUgPDwgMTYpKQorLyogRFcxICovCisjIGRlZmluZSBBVUJfSEVBREVSX01BSk9SX1NISUZUCQkyNAorIyBkZWZpbmUgQVVCX0hFQURFUl9NSU5PUl9TSElGVAkJMTYKKworI2RlZmluZSBDTURfQVVCX1RSQUNFX0hFQURFUl9CTE9DSyAoQ01EX0FVQiB8ICgxIDw8IDIzKSB8ICgweDQxIDw8IDE2KSkKKyNkZWZpbmUgQ01EX0FVQl9EVU1QX0JNUCAgICAgICAgICAgKENNRF9BVUIgfCAoMSA8PCAyMykgfCAoMHg5ZSA8PCAxNikpCisKKy8qIERXMSAqLworI2RlZmluZSBBVUJfVFJBQ0VfT1BFUkFUSU9OX01BU0sJMHgwMDAwMDBmZgorI2RlZmluZSBBVUJfVFJBQ0VfT1BfQ09NTUVOVAkJMHgwMDAwMDAwMAorI2RlZmluZSBBVUJfVFJBQ0VfT1BfREFUQV9XUklURQkJMHgwMDAwMDAwMQorI2RlZmluZSBBVUJfVFJBQ0VfT1BfQ09NTUFORF9XUklURQkweDAwMDAwMDAyCisjZGVmaW5lIEFVQl9UUkFDRV9PUF9NTUlPX1dSSVRFCQkweDAwMDAwMDAzCisvLyBvcGVyYXRpb24gPSBUUkFDRV9EQVRBX1dSSVRFLCBUeXBlCisjZGVmaW5lIEFVQl9UUkFDRV9UWVBFX01BU0sJCTB4MDAwMGZmMDAKKyNkZWZpbmUgQVVCX1RSQUNFX1RZUEVfTk9UWVBFCQkoMCA8PCA4KQorI2RlZmluZSBBVUJfVFJBQ0VfVFlQRV9CQVRDSAkJKDEgPDwgOCkKKyNkZWZpbmUgQVVCX1RSQUNFX1RZUEVfVkVSVEVYX0JVRkZFUgkoNSA8PCA4KQorI2RlZmluZSBBVUJfVFJBQ0VfVFlQRV8yRF9NQVAJCSg2IDw8IDgpCisjZGVmaW5lIEFVQl9UUkFDRV9UWVBFX0NVQkVfTUFQCQkoNyA8PCA4KQorI2RlZmluZSBBVUJfVFJBQ0VfVFlQRV9WT0xVTUVfTUFQCSg5IDw8IDgpCisjZGVmaW5lIEFVQl9UUkFDRV9UWVBFXzFEX01BUAkJKDEwIDw8IDgpCisjZGVmaW5lIEFVQl9UUkFDRV9UWVBFX0NPTlNUQU5UX0JVRkZFUgkoMTEgPDwgOCkKKyNkZWZpbmUgQVVCX1RSQUNFX1RZUEVfQ09OU1RBTlRfVVJCCSgxMiA8PCA4KQorI2RlZmluZSBBVUJfVFJBQ0VfVFlQRV9JTkRFWF9CVUZGRVIJKDEzIDw8IDgpCisjZGVmaW5lIEFVQl9UUkFDRV9UWVBFX0dFTkVSQUwJCSgxNCA8PCA4KQorI2RlZmluZSBBVUJfVFJBQ0VfVFlQRV9TVVJGQUNFCQkoMTUgPDwgOCkKKworCisvLyBvcGVyYXRpb24gPSBUUkFDRV9DT01NQU5EX1dSSVRFLCBUeXBlID0KKyNkZWZpbmUgQVVCX1RSQUNFX1RZUEVfUklOR19IV0IJCSgxIDw8IDgpCisjZGVmaW5lIEFVQl9UUkFDRV9UWVBFX1JJTkdfUFJCMAkoMiA8PCA4KQorI2RlZmluZSBBVUJfVFJBQ0VfVFlQRV9SSU5HX1BSQjEJKDMgPDwgOCkKKyNkZWZpbmUgQVVCX1RSQUNFX1RZUEVfUklOR19QUkIyCSg0IDw8IDgpCisKKy8vIEFkZHJlc3Mgc3BhY2UKKyNkZWZpbmUgQVVCX1RSQUNFX0FERFJFU1NfU1BBQ0VfTUFTSwkweDAwZmYwMDAwCisjZGVmaW5lIEFVQl9UUkFDRV9NRU1UWVBFX0dUVAkJKDAgPDwgMTYpCisjZGVmaW5lIEFVQl9UUkFDRV9NRU1UWVBFX0xPQ0FMCQkoMSA8PCAxNikKKyNkZWZpbmUgQVVCX1RSQUNFX01FTVRZUEVfTk9OTE9DQUwJKDIgPDwgMTYpCisjZGVmaW5lIEFVQl9UUkFDRV9NRU1UWVBFX1BDSQkJKDMgPDwgMTYpCisjZGVmaW5lIEFVQl9UUkFDRV9NRU1UWVBFX0dUVF9FTlRSWSAgICAgKDQgPDwgMTYpCisKKy8qIERXMiAqLworCisvKioKKyAqIGF1Yl9zdGF0ZV9zdHJ1Y3RfdHlwZSBlbnVtIHZhbHVlcyBhcmUgZW5jb2RlZCB3aXRoIHRoZSB0b3AgMTYgYml0cworICogcmVwcmVzZW50aW5nIHRoZSB0eXBlIHRvIGJlIGRlbGl2ZXJlZCB0byB0aGUgLmF1YiBmaWxlLCBhbmQgdGhlIGJvdHRvbSAxNgorICogYml0cyByZXByZXNlbnRpbmcgdGhlIHN1YnR5cGUuICBUaGlzIG1hY3JvIHBlcmZvcm1zIHRoZSBlbmNvZGluZy4KKyAqLworI2RlZmluZSBFTkNPREVfU1NfVFlQRSh0eXBlLCBzdWJ0eXBlKSAoKCh0eXBlKSA8PCAxNikgfCAoc3VidHlwZSkpCisKK2VudW0gYXViX3N0YXRlX3N0cnVjdF90eXBlIHsKKyAgIEFVQl9UUkFDRV9WU19TVEFURSA9CQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfR0VORVJBTCwgMSksCisgICBBVUJfVFJBQ0VfR1NfU1RBVEUgPQkJCUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX0dFTkVSQUwsIDIpLAorICAgQVVCX1RSQUNFX0NMSVBfU1RBVEUgPQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfR0VORVJBTCwgMyksCisgICBBVUJfVFJBQ0VfU0ZfU1RBVEUgPQkJCUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX0dFTkVSQUwsIDQpLAorICAgQVVCX1RSQUNFX1dNX1NUQVRFID0JCQlFTkNPREVfU1NfVFlQRShBVUJfVFJBQ0VfVFlQRV9HRU5FUkFMLCA1KSwKKyAgIEFVQl9UUkFDRV9DQ19TVEFURSA9CQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfR0VORVJBTCwgNiksCisgICBBVUJfVFJBQ0VfQ0xJUF9WUF9TVEFURSA9CQlFTkNPREVfU1NfVFlQRShBVUJfVFJBQ0VfVFlQRV9HRU5FUkFMLCA3KSwKKyAgIEFVQl9UUkFDRV9TRl9WUF9TVEFURSA9CQlFTkNPREVfU1NfVFlQRShBVUJfVFJBQ0VfVFlQRV9HRU5FUkFMLCA4KSwKKyAgIEFVQl9UUkFDRV9DQ19WUF9TVEFURSA9CQlFTkNPREVfU1NfVFlQRShBVUJfVFJBQ0VfVFlQRV9HRU5FUkFMLCAweDkpLAorICAgQVVCX1RSQUNFX1NBTVBMRVJfU1RBVEUgPQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfR0VORVJBTCwgMHhhKSwKKyAgIEFVQl9UUkFDRV9LRVJORUxfSU5TVFJVQ1RJT05TID0JRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfR0VORVJBTCwgMHhiKSwKKyAgIEFVQl9UUkFDRV9TQ1JBVENIX1NQQUNFID0JCUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX0dFTkVSQUwsIDB4YyksCisgICBBVUJfVFJBQ0VfU0FNUExFUl9ERUZBVUxUX0NPTE9SID0JRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfR0VORVJBTCwgMHhkKSwKKworICAgQVVCX1RSQUNFX1NDSVNTT1JfU1RBVEUgPQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfR0VORVJBTCwgMHgxNSksCisgICBBVUJfVFJBQ0VfQkxFTkRfU1RBVEUgPQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfR0VORVJBTCwgMHgxNiksCisgICBBVUJfVFJBQ0VfREVQVEhfU1RFTkNJTF9TVEFURSA9CUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX0dFTkVSQUwsIDB4MTcpLAorCisgICBBVUJfVFJBQ0VfVkVSVEVYX0JVRkZFUiA9CQlFTkNPREVfU1NfVFlQRShBVUJfVFJBQ0VfVFlQRV9WRVJURVhfQlVGRkVSLCAwKSwKKyAgIEFVQl9UUkFDRV9CSU5ESU5HX1RBQkxFID0JCUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX1NVUkZBQ0UsIDB4MTAwKSwKKyAgIEFVQl9UUkFDRV9TVVJGQUNFX1NUQVRFID0JCUVOQ09ERV9TU19UWVBFKEFVQl9UUkFDRV9UWVBFX1NVUkZBQ0UsIDB4MjAwKSwKKyAgIEFVQl9UUkFDRV9WU19DT05TVEFOVFMgPQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfQ09OU1RBTlRfQlVGRkVSLCAwKSwKKyAgIEFVQl9UUkFDRV9XTV9DT05TVEFOVFMgPQkJRU5DT0RFX1NTX1RZUEUoQVVCX1RSQUNFX1RZUEVfQ09OU1RBTlRfQlVGRkVSLCAxKSwKK307CisKKyN1bmRlZiBFTkNPREVfU1NfVFlQRQorCisvKioKKyAqIERlY29kZSBhIGF1Yl9zdGF0ZV9zdHJ1Y3RfdHlwZSB2YWx1ZSB0byBkZXRlcm1pbmUgdGhlIHR5cGUgdGhhdCBzaG91bGQgYmUKKyAqIHN0b3JlZCBpbiB0aGUgLmF1YiBmaWxlLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IEFVQl9UUkFDRV9UWVBFKGVudW0gYXViX3N0YXRlX3N0cnVjdF90eXBlIHNzX3R5cGUpCit7CisgICByZXR1cm4gKHNzX3R5cGUgJiAweEZGRkYwMDAwKSA+PiAxNjsKK30KKworLyoqCisgKiBEZWNvZGUgYSBzdGF0ZV9zdHJ1Y3RfdHlwZSB2YWx1ZSB0byBkZXRlcm1pbmUgdGhlIHN1YnR5cGUgdGhhdCBzaG91bGQgYmUKKyAqIHN0b3JlZCBpbiB0aGUgLmF1YiBmaWxlLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IEFVQl9UUkFDRV9TVUJUWVBFKGVudW0gYXViX3N0YXRlX3N0cnVjdF90eXBlIHNzX3R5cGUpCit7CisgICByZXR1cm4gc3NfdHlwZSAmIDB4RkZGRjsKK30KKworLyogRFczOiBhZGRyZXNzICovCisvKiBEVzQ6IGxlbiAqLworCisjZW5kaWYgLyogX0lOVEVMX0FVQl9IICovCmRpZmYgLS1naXQgYS9pbnRlbC9pbnRlbF9idWZtZ3IuYyBiL2ludGVsL2ludGVsX2J1Zm1nci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyODUzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlbC9pbnRlbF9idWZtZ3IuYwpAQCAtMCwwICsxLDM3NCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA3IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGRybS5oPgorI2luY2x1ZGUgPGk5MTVfZHJtLmg+CisjaW5jbHVkZSA8cGNpYWNjZXNzLmg+CisjaW5jbHVkZSAibGliZHJtX21hY3Jvcy5oIgorI2luY2x1ZGUgImludGVsX2J1Zm1nci5oIgorI2luY2x1ZGUgImludGVsX2J1Zm1ncl9wcml2LmgiCisjaW5jbHVkZSAieGY4NmRybS5oIgorCisvKiogQGZpbGUgaW50ZWxfYnVmbWdyLmMKKyAqCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIGJ1ZmZlciBtYW5hZ2VtZW50IG1ldGhvZHMuCisgKi8KKworZHJtX2ludGVsX2JvICoKK2RybV9pbnRlbF9ib19hbGxvYyhkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgaW50IGFsaWdubWVudCkKK3sKKwlyZXR1cm4gYnVmbWdyLT5ib19hbGxvYyhidWZtZ3IsIG5hbWUsIHNpemUsIGFsaWdubWVudCk7Cit9CisKK2RybV9pbnRlbF9ibyAqCitkcm1faW50ZWxfYm9fYWxsb2NfZm9yX3JlbmRlcihkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGludCBhbGlnbm1lbnQpCit7CisJcmV0dXJuIGJ1Zm1nci0+Ym9fYWxsb2NfZm9yX3JlbmRlcihidWZtZ3IsIG5hbWUsIHNpemUsIGFsaWdubWVudCk7Cit9CisKK2RybV9pbnRlbF9ibyAqCitkcm1faW50ZWxfYm9fYWxsb2NfdXNlcnB0cihkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCQkgICBjb25zdCBjaGFyICpuYW1lLCB2b2lkICphZGRyLAorCQkJICAgdWludDMyX3QgdGlsaW5nX21vZGUsCisJCQkgICB1aW50MzJfdCBzdHJpZGUsCisJCQkgICB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCWlmIChidWZtZ3ItPmJvX2FsbG9jX3VzZXJwdHIpCisJCXJldHVybiBidWZtZ3ItPmJvX2FsbG9jX3VzZXJwdHIoYnVmbWdyLCBuYW1lLCBhZGRyLCB0aWxpbmdfbW9kZSwKKwkJCQkJCXN0cmlkZSwgc2l6ZSwgZmxhZ3MpOworCXJldHVybiBOVUxMOworfQorCitkcm1faW50ZWxfYm8gKgorZHJtX2ludGVsX2JvX2FsbG9jX3RpbGVkKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSwgaW50IGNwcCwgdWludDMyX3QgKnRpbGluZ19tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqcGl0Y2gsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJcmV0dXJuIGJ1Zm1nci0+Ym9fYWxsb2NfdGlsZWQoYnVmbWdyLCBuYW1lLCB4LCB5LCBjcHAsCisJCQkJICAgICAgdGlsaW5nX21vZGUsIHBpdGNoLCBmbGFncyk7Cit9CisKK3ZvaWQKK2RybV9pbnRlbF9ib19yZWZlcmVuY2UoZHJtX2ludGVsX2JvICpibykKK3sKKwliby0+YnVmbWdyLT5ib19yZWZlcmVuY2UoYm8pOworfQorCit2b2lkCitkcm1faW50ZWxfYm9fdW5yZWZlcmVuY2UoZHJtX2ludGVsX2JvICpibykKK3sKKwlpZiAoYm8gPT0gTlVMTCkKKwkJcmV0dXJuOworCisJYm8tPmJ1Zm1nci0+Ym9fdW5yZWZlcmVuY2UoYm8pOworfQorCitpbnQKK2RybV9pbnRlbF9ib19tYXAoZHJtX2ludGVsX2JvICpidWYsIGludCB3cml0ZV9lbmFibGUpCit7CisJcmV0dXJuIGJ1Zi0+YnVmbWdyLT5ib19tYXAoYnVmLCB3cml0ZV9lbmFibGUpOworfQorCitpbnQKK2RybV9pbnRlbF9ib191bm1hcChkcm1faW50ZWxfYm8gKmJ1ZikKK3sKKwlyZXR1cm4gYnVmLT5idWZtZ3ItPmJvX3VubWFwKGJ1Zik7Cit9CisKK2ludAorZHJtX2ludGVsX2JvX3N1YmRhdGEoZHJtX2ludGVsX2JvICpibywgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCB2b2lkICpkYXRhKQoreworCXJldHVybiBiby0+YnVmbWdyLT5ib19zdWJkYXRhKGJvLCBvZmZzZXQsIHNpemUsIGRhdGEpOworfQorCitpbnQKK2RybV9pbnRlbF9ib19nZXRfc3ViZGF0YShkcm1faW50ZWxfYm8gKmJvLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCSB1bnNpZ25lZCBsb25nIHNpemUsIHZvaWQgKmRhdGEpCit7CisJaW50IHJldDsKKwlpZiAoYm8tPmJ1Zm1nci0+Ym9fZ2V0X3N1YmRhdGEpCisJCXJldHVybiBiby0+YnVmbWdyLT5ib19nZXRfc3ViZGF0YShibywgb2Zmc2V0LCBzaXplLCBkYXRhKTsKKworCWlmIChzaXplID09IDAgfHwgZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGRybV9pbnRlbF9ib19tYXAoYm8sIDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJbWVtY3B5KGRhdGEsICh1bnNpZ25lZCBjaGFyICopYm8tPnZpcnR1YWwgKyBvZmZzZXQsIHNpemUpOworCWRybV9pbnRlbF9ib191bm1hcChibyk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2RybV9pbnRlbF9ib193YWl0X3JlbmRlcmluZyhkcm1faW50ZWxfYm8gKmJvKQoreworCWJvLT5idWZtZ3ItPmJvX3dhaXRfcmVuZGVyaW5nKGJvKTsKK30KKwordm9pZAorZHJtX2ludGVsX2J1Zm1ncl9kZXN0cm95KGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1ncikKK3sKKwlidWZtZ3ItPmRlc3Ryb3koYnVmbWdyKTsKK30KKworaW50Citkcm1faW50ZWxfYm9fZXhlYyhkcm1faW50ZWxfYm8gKmJvLCBpbnQgdXNlZCwKKwkJICBkcm1fY2xpcF9yZWN0X3QgKiBjbGlwcmVjdHMsIGludCBudW1fY2xpcHJlY3RzLCBpbnQgRFI0KQoreworCXJldHVybiBiby0+YnVmbWdyLT5ib19leGVjKGJvLCB1c2VkLCBjbGlwcmVjdHMsIG51bV9jbGlwcmVjdHMsIERSNCk7Cit9CisKK2ludAorZHJtX2ludGVsX2JvX21yYl9leGVjKGRybV9pbnRlbF9ibyAqYm8sIGludCB1c2VkLAorCQlkcm1fY2xpcF9yZWN0X3QgKmNsaXByZWN0cywgaW50IG51bV9jbGlwcmVjdHMsIGludCBEUjQsCisJCXVuc2lnbmVkIGludCByaW5ncykKK3sKKwlpZiAoYm8tPmJ1Zm1nci0+Ym9fbXJiX2V4ZWMpCisJCXJldHVybiBiby0+YnVmbWdyLT5ib19tcmJfZXhlYyhibywgdXNlZCwKKwkJCQkJY2xpcHJlY3RzLCBudW1fY2xpcHJlY3RzLCBEUjQsCisJCQkJCXJpbmdzKTsKKworCXN3aXRjaCAocmluZ3MpIHsKKwljYXNlIEk5MTVfRVhFQ19ERUZBVUxUOgorCWNhc2UgSTkxNV9FWEVDX1JFTkRFUjoKKwkJcmV0dXJuIGJvLT5idWZtZ3ItPmJvX2V4ZWMoYm8sIHVzZWQsCisJCQkJCSAgIGNsaXByZWN0cywgbnVtX2NsaXByZWN0cywgRFI0KTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0RFVjsKKwl9Cit9CisKK3ZvaWQKK2RybV9pbnRlbF9idWZtZ3Jfc2V0X2RlYnVnKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwgaW50IGVuYWJsZV9kZWJ1ZykKK3sKKwlidWZtZ3ItPmRlYnVnID0gZW5hYmxlX2RlYnVnOworfQorCitpbnQKK2RybV9pbnRlbF9idWZtZ3JfY2hlY2tfYXBlcnR1cmVfc3BhY2UoZHJtX2ludGVsX2JvICoqIGJvX2FycmF5LCBpbnQgY291bnQpCit7CisJcmV0dXJuIGJvX2FycmF5WzBdLT5idWZtZ3ItPmNoZWNrX2FwZXJ0dXJlX3NwYWNlKGJvX2FycmF5LCBjb3VudCk7Cit9CisKK2ludAorZHJtX2ludGVsX2JvX2ZsaW5rKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90ICogbmFtZSkKK3sKKwlpZiAoYm8tPmJ1Zm1nci0+Ym9fZmxpbmspCisJCXJldHVybiBiby0+YnVmbWdyLT5ib19mbGluayhibywgbmFtZSk7CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworaW50Citkcm1faW50ZWxfYm9fZW1pdF9yZWxvYyhkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCBvZmZzZXQsCisJCQlkcm1faW50ZWxfYm8gKnRhcmdldF9ibywgdWludDMyX3QgdGFyZ2V0X29mZnNldCwKKwkJCXVpbnQzMl90IHJlYWRfZG9tYWlucywgdWludDMyX3Qgd3JpdGVfZG9tYWluKQoreworCXJldHVybiBiby0+YnVmbWdyLT5ib19lbWl0X3JlbG9jKGJvLCBvZmZzZXQsCisJCQkJCSB0YXJnZXRfYm8sIHRhcmdldF9vZmZzZXQsCisJCQkJCSByZWFkX2RvbWFpbnMsIHdyaXRlX2RvbWFpbik7Cit9CisKKy8qIEZvciBmZW5jZSByZWdpc3RlcnMsIG5vdCBHTCBmZW5jZXMgKi8KK2ludAorZHJtX2ludGVsX2JvX2VtaXRfcmVsb2NfZmVuY2UoZHJtX2ludGVsX2JvICpibywgdWludDMyX3Qgb2Zmc2V0LAorCQkJICAgICAgZHJtX2ludGVsX2JvICp0YXJnZXRfYm8sIHVpbnQzMl90IHRhcmdldF9vZmZzZXQsCisJCQkgICAgICB1aW50MzJfdCByZWFkX2RvbWFpbnMsIHVpbnQzMl90IHdyaXRlX2RvbWFpbikKK3sKKwlyZXR1cm4gYm8tPmJ1Zm1nci0+Ym9fZW1pdF9yZWxvY19mZW5jZShibywgb2Zmc2V0LAorCQkJCQkgICAgICAgdGFyZ2V0X2JvLCB0YXJnZXRfb2Zmc2V0LAorCQkJCQkgICAgICAgcmVhZF9kb21haW5zLCB3cml0ZV9kb21haW4pOworfQorCisKK2ludAorZHJtX2ludGVsX2JvX3Bpbihkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCBhbGlnbm1lbnQpCit7CisJaWYgKGJvLT5idWZtZ3ItPmJvX3BpbikKKwkJcmV0dXJuIGJvLT5idWZtZ3ItPmJvX3BpbihibywgYWxpZ25tZW50KTsKKworCXJldHVybiAtRU5PREVWOworfQorCitpbnQKK2RybV9pbnRlbF9ib191bnBpbihkcm1faW50ZWxfYm8gKmJvKQoreworCWlmIChiby0+YnVmbWdyLT5ib191bnBpbikKKwkJcmV0dXJuIGJvLT5idWZtZ3ItPmJvX3VucGluKGJvKTsKKworCXJldHVybiAtRU5PREVWOworfQorCitpbnQKK2RybV9pbnRlbF9ib19zZXRfdGlsaW5nKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90ICogdGlsaW5nX21vZGUsCisJCQl1aW50MzJfdCBzdHJpZGUpCit7CisJaWYgKGJvLT5idWZtZ3ItPmJvX3NldF90aWxpbmcpCisJCXJldHVybiBiby0+YnVmbWdyLT5ib19zZXRfdGlsaW5nKGJvLCB0aWxpbmdfbW9kZSwgc3RyaWRlKTsKKworCSp0aWxpbmdfbW9kZSA9IEk5MTVfVElMSU5HX05PTkU7CisJcmV0dXJuIDA7Cit9CisKK2ludAorZHJtX2ludGVsX2JvX2dldF90aWxpbmcoZHJtX2ludGVsX2JvICpibywgdWludDMyX3QgKiB0aWxpbmdfbW9kZSwKKwkJCXVpbnQzMl90ICogc3dpenpsZV9tb2RlKQoreworCWlmIChiby0+YnVmbWdyLT5ib19nZXRfdGlsaW5nKQorCQlyZXR1cm4gYm8tPmJ1Zm1nci0+Ym9fZ2V0X3RpbGluZyhibywgdGlsaW5nX21vZGUsIHN3aXp6bGVfbW9kZSk7CisKKwkqdGlsaW5nX21vZGUgPSBJOTE1X1RJTElOR19OT05FOworCSpzd2l6emxlX21vZGUgPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKKwlyZXR1cm4gMDsKK30KKworaW50Citkcm1faW50ZWxfYm9fc2V0X3NvZnRwaW5fb2Zmc2V0KGRybV9pbnRlbF9ibyAqYm8sIHVpbnQ2NF90IG9mZnNldCkKK3sKKwlpZiAoYm8tPmJ1Zm1nci0+Ym9fc2V0X3NvZnRwaW5fb2Zmc2V0KQorCQlyZXR1cm4gYm8tPmJ1Zm1nci0+Ym9fc2V0X3NvZnRwaW5fb2Zmc2V0KGJvLCBvZmZzZXQpOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK2ludAorZHJtX2ludGVsX2JvX2Rpc2FibGVfcmV1c2UoZHJtX2ludGVsX2JvICpibykKK3sKKwlpZiAoYm8tPmJ1Zm1nci0+Ym9fZGlzYWJsZV9yZXVzZSkKKwkJcmV0dXJuIGJvLT5idWZtZ3ItPmJvX2Rpc2FibGVfcmV1c2UoYm8pOworCXJldHVybiAwOworfQorCitpbnQKK2RybV9pbnRlbF9ib19pc19yZXVzYWJsZShkcm1faW50ZWxfYm8gKmJvKQoreworCWlmIChiby0+YnVmbWdyLT5ib19pc19yZXVzYWJsZSkKKwkJcmV0dXJuIGJvLT5idWZtZ3ItPmJvX2lzX3JldXNhYmxlKGJvKTsKKwlyZXR1cm4gMDsKK30KKworaW50Citkcm1faW50ZWxfYm9fYnVzeShkcm1faW50ZWxfYm8gKmJvKQoreworCWlmIChiby0+YnVmbWdyLT5ib19idXN5KQorCQlyZXR1cm4gYm8tPmJ1Zm1nci0+Ym9fYnVzeShibyk7CisJcmV0dXJuIDA7Cit9CisKK2ludAorZHJtX2ludGVsX2JvX21hZHZpc2UoZHJtX2ludGVsX2JvICpibywgaW50IG1hZHYpCit7CisJaWYgKGJvLT5idWZtZ3ItPmJvX21hZHZpc2UpCisJCXJldHVybiBiby0+YnVmbWdyLT5ib19tYWR2aXNlKGJvLCBtYWR2KTsKKwlyZXR1cm4gLTE7Cit9CisKK2ludAorZHJtX2ludGVsX2JvX3VzZV80OGJfYWRkcmVzc19yYW5nZShkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCBlbmFibGUpCit7CisJaWYgKGJvLT5idWZtZ3ItPmJvX3VzZV80OGJfYWRkcmVzc19yYW5nZSkgeworCQliby0+YnVmbWdyLT5ib191c2VfNDhiX2FkZHJlc3NfcmFuZ2UoYm8sIGVuYWJsZSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRU5PREVWOworfQorCitpbnQKK2RybV9pbnRlbF9ib19yZWZlcmVuY2VzKGRybV9pbnRlbF9ibyAqYm8sIGRybV9pbnRlbF9ibyAqdGFyZ2V0X2JvKQoreworCXJldHVybiBiby0+YnVmbWdyLT5ib19yZWZlcmVuY2VzKGJvLCB0YXJnZXRfYm8pOworfQorCitpbnQKK2RybV9pbnRlbF9nZXRfcGlwZV9mcm9tX2NydGNfaWQoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLCBpbnQgY3J0Y19pZCkKK3sKKwlpZiAoYnVmbWdyLT5nZXRfcGlwZV9mcm9tX2NydGNfaWQpCisJCXJldHVybiBidWZtZ3ItPmdldF9waXBlX2Zyb21fY3J0Y19pZChidWZtZ3IsIGNydGNfaWQpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHNpemVfdAorZHJtX2ludGVsX3Byb2JlX2FncF9hcGVydHVyZV9zaXplKGludCBmZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldmljZSAqcGNpX2RldjsKKwlzaXplX3Qgc2l6ZSA9IDA7CisJaW50IHJldDsKKworCXJldCA9IHBjaV9zeXN0ZW1faW5pdCgpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJLyogWFhYIGhhbmRsZSBtdWx0aXBsZSBhZGFwdG9ycz8gKi8KKwlwY2lfZGV2ID0gcGNpX2RldmljZV9maW5kX2J5X3Nsb3QoMCwgMCwgMiwgMCk7CisJaWYgKHBjaV9kZXYgPT0gTlVMTCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBwY2lfZGV2aWNlX3Byb2JlKHBjaV9kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJc2l6ZSA9IHBjaV9kZXYtPnJlZ2lvbnNbMl0uc2l6ZTsKK2VycjoKKwlwY2lfc3lzdGVtX2NsZWFudXAgKCk7CisJcmV0dXJuIHNpemU7Cit9CisKK2ludAorZHJtX2ludGVsX2dldF9hcGVydHVyZV9zaXplcyhpbnQgZmQsIHNpemVfdCAqbWFwcGFibGUsIHNpemVfdCAqdG90YWwpCit7CisKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2dldF9hcGVydHVyZSBhcGVydHVyZTsKKwlpbnQgcmV0OworCisJcmV0ID0gZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9JOTE1X0dFTV9HRVRfQVBFUlRVUkUsICZhcGVydHVyZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCSptYXBwYWJsZSA9IDA7CisJLyogWFhYIGFkZCBhIHF1ZXJ5IGZvciB0aGUga2VybmVsIHZhbHVlPyAqLworCWlmICgqbWFwcGFibGUgPT0gMCkKKwkJKm1hcHBhYmxlID0gZHJtX2ludGVsX3Byb2JlX2FncF9hcGVydHVyZV9zaXplKGZkKTsKKwlpZiAoKm1hcHBhYmxlID09IDApCisJCSptYXBwYWJsZSA9IDY0ICogMTAyNCAqIDEwMjQ7IC8qIG1pbmltdW0gcG9zc2libGUgdmFsdWUgKi8KKwkqdG90YWwgPSBhcGVydHVyZS5hcGVyX3NpemU7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9pbnRlbC9pbnRlbF9idWZtZ3IuaCBiL2ludGVsL2ludGVsX2J1Zm1nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MzQ3MmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlbC9pbnRlbF9idWZtZ3IuaApAQCAtMCwwICsxLDM0MSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA4LTIwMTIgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKgorICovCisKKy8qKgorICogQGZpbGUgaW50ZWxfYnVmbWdyLmgKKyAqCisgKiBQdWJsaWMgZGVmaW5pdGlvbnMgb2YgSW50ZWwtc3BlY2lmaWMgYnVmbWdyIGZ1bmN0aW9ucy4KKyAqLworCisjaWZuZGVmIElOVEVMX0JVRk1HUl9ICisjZGVmaW5lIElOVEVMX0JVRk1HUl9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IGRybV9jbGlwX3JlY3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faW50ZWxfYnVmbWdyIGRybV9pbnRlbF9idWZtZ3I7Cit0eXBlZGVmIHN0cnVjdCBfZHJtX2ludGVsX2NvbnRleHQgZHJtX2ludGVsX2NvbnRleHQ7Cit0eXBlZGVmIHN0cnVjdCBfZHJtX2ludGVsX2JvIGRybV9pbnRlbF9ibzsKKworc3RydWN0IF9kcm1faW50ZWxfYm8geworCS8qKgorCSAqIFNpemUgaW4gYnl0ZXMgb2YgdGhlIGJ1ZmZlciBvYmplY3QuCisJICoKKwkgKiBUaGUgc2l6ZSBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb3JpZ2luYWxseSByZXF1ZXN0ZWQgZm9yIHRoZQorCSAqIGFsbG9jYXRpb24sIHN1Y2ggYXMgYmVpbmcgYWxpZ25lZCB0byBwYWdlIHNpemUuCisJICovCisJdW5zaWduZWQgbG9uZyBzaXplOworCisJLyoqCisJICogQWxpZ25tZW50IHJlcXVpcmVtZW50IGZvciBvYmplY3QKKwkgKgorCSAqIFVzZWQgZm9yIEdUVCBtYXBwaW5nICYgcGlubmluZyB0aGUgb2JqZWN0LgorCSAqLworCXVuc2lnbmVkIGxvbmcgYWxpZ247CisKKwkvKioKKwkgKiBEZXByZWNhdGVkIGZpZWxkIGNvbnRhaW5pbmcgKHBvc3NpYmx5IHRoZSBsb3cgMzItYml0cyBvZikgdGhlIGxhc3QKKwkgKiBzZWVuIHZpcnR1YWwgY2FyZCBhZGRyZXNzLiAgVXNlIG9mZnNldDY0IGluc3RlYWQuCisJICovCisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwkvKioKKwkgKiBWaXJ0dWFsIGFkZHJlc3MgZm9yIGFjY2Vzc2luZyB0aGUgYnVmZmVyIGRhdGEuICBPbmx5IHZhbGlkIHdoaWxlCisJICogbWFwcGVkLgorCSAqLworI2lmZGVmIF9fY3BsdXNwbHVzCisJdm9pZCAqdmlydDsKKyNlbHNlCisJdm9pZCAqdmlydHVhbDsKKyNlbmRpZgorCisJLyoqIEJ1ZmZlciBtYW5hZ2VyIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVmZmVyIG9iamVjdCAqLworCWRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1ncjsKKworCS8qKgorCSAqIE1NLXNwZWNpZmljIGhhbmRsZSBmb3IgYWNjZXNzaW5nIG9iamVjdAorCSAqLworCWludCBoYW5kbGU7CisKKwkvKioKKwkgKiBMYXN0IHNlZW4gY2FyZCB2aXJ0dWFsIGFkZHJlc3MgKG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisJICogYXBlcnR1cmUpIGZvciB0aGUgb2JqZWN0LiAgVGhpcyBzaG91bGQgYmUgdXNlZCB0byBmaWxsIHJlbG9jYXRpb24KKwkgKiBlbnRyaWVzIHdoZW4gY2FsbGluZyBkcm1faW50ZWxfYm9fZW1pdF9yZWxvYygpCisJICovCisJdWludDY0X3Qgb2Zmc2V0NjQ7Cit9OworCitlbnVtIGF1Yl9kdW1wX2JtcF9mb3JtYXQgeworCUFVQl9EVU1QX0JNUF9GT1JNQVRfOEJJVCA9IDEsCisJQVVCX0RVTVBfQk1QX0ZPUk1BVF9BUkdCXzQ0NDQgPSA0LAorCUFVQl9EVU1QX0JNUF9GT1JNQVRfQVJHQl8wODg4ID0gNiwKKwlBVUJfRFVNUF9CTVBfRk9STUFUX0FSR0JfODg4OCA9IDcsCit9OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX2ludGVsX2F1Yl9hbm5vdGF0aW9uIHsKKwl1aW50MzJfdCB0eXBlOworCXVpbnQzMl90IHN1YnR5cGU7CisJdWludDMyX3QgZW5kaW5nX29mZnNldDsKK30gZHJtX2ludGVsX2F1Yl9hbm5vdGF0aW9uOworCisjZGVmaW5lIEJPX0FMTE9DX0ZPUl9SRU5ERVIgKDE8PDApCisKK2RybV9pbnRlbF9ibyAqZHJtX2ludGVsX2JvX2FsbG9jKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBpbnQgYWxpZ25tZW50KTsKK2RybV9pbnRlbF9ibyAqZHJtX2ludGVsX2JvX2FsbG9jX2Zvcl9yZW5kZXIoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAorCQkJCQkgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkJICAgIHVuc2lnbmVkIGludCBhbGlnbm1lbnQpOworZHJtX2ludGVsX2JvICpkcm1faW50ZWxfYm9fYWxsb2NfdXNlcnB0cihkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCQkJCWNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCXZvaWQgKmFkZHIsIHVpbnQzMl90IHRpbGluZ19tb2RlLAorCQkJCQl1aW50MzJfdCBzdHJpZGUsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7Citkcm1faW50ZWxfYm8gKmRybV9pbnRlbF9ib19hbGxvY190aWxlZChkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICAgIGludCB4LCBpbnQgeSwgaW50IGNwcCwKKwkJCQkgICAgICAgdWludDMyX3QgKnRpbGluZ19tb2RlLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nICpwaXRjaCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyk7Cit2b2lkIGRybV9pbnRlbF9ib19yZWZlcmVuY2UoZHJtX2ludGVsX2JvICpibyk7Cit2b2lkIGRybV9pbnRlbF9ib191bnJlZmVyZW5jZShkcm1faW50ZWxfYm8gKmJvKTsKK2ludCBkcm1faW50ZWxfYm9fbWFwKGRybV9pbnRlbF9ibyAqYm8sIGludCB3cml0ZV9lbmFibGUpOworaW50IGRybV9pbnRlbF9ib191bm1hcChkcm1faW50ZWxfYm8gKmJvKTsKKworaW50IGRybV9pbnRlbF9ib19zdWJkYXRhKGRybV9pbnRlbF9ibyAqYm8sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY29uc3Qgdm9pZCAqZGF0YSk7CitpbnQgZHJtX2ludGVsX2JvX2dldF9zdWJkYXRhKGRybV9pbnRlbF9ibyAqYm8sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHZvaWQgKmRhdGEpOwordm9pZCBkcm1faW50ZWxfYm9fd2FpdF9yZW5kZXJpbmcoZHJtX2ludGVsX2JvICpibyk7CisKK3ZvaWQgZHJtX2ludGVsX2J1Zm1ncl9zZXRfZGVidWcoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLCBpbnQgZW5hYmxlX2RlYnVnKTsKK3ZvaWQgZHJtX2ludGVsX2J1Zm1ncl9kZXN0cm95KGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1ncik7CitpbnQgZHJtX2ludGVsX2JvX2V4ZWMoZHJtX2ludGVsX2JvICpibywgaW50IHVzZWQsCisJCSAgICAgIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcmVjdHMsIGludCBudW1fY2xpcHJlY3RzLCBpbnQgRFI0KTsKK2ludCBkcm1faW50ZWxfYm9fbXJiX2V4ZWMoZHJtX2ludGVsX2JvICpibywgaW50IHVzZWQsCisJCQlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqY2xpcHJlY3RzLCBpbnQgbnVtX2NsaXByZWN0cywgaW50IERSNCwKKwkJCXVuc2lnbmVkIGludCBmbGFncyk7CitpbnQgZHJtX2ludGVsX2J1Zm1ncl9jaGVja19hcGVydHVyZV9zcGFjZShkcm1faW50ZWxfYm8gKiogYm9fYXJyYXksIGludCBjb3VudCk7CisKK2ludCBkcm1faW50ZWxfYm9fZW1pdF9yZWxvYyhkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCBvZmZzZXQsCisJCQkgICAgZHJtX2ludGVsX2JvICp0YXJnZXRfYm8sIHVpbnQzMl90IHRhcmdldF9vZmZzZXQsCisJCQkgICAgdWludDMyX3QgcmVhZF9kb21haW5zLCB1aW50MzJfdCB3cml0ZV9kb21haW4pOworaW50IGRybV9pbnRlbF9ib19lbWl0X3JlbG9jX2ZlbmNlKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90IG9mZnNldCwKKwkJCQkgIGRybV9pbnRlbF9ibyAqdGFyZ2V0X2JvLAorCQkJCSAgdWludDMyX3QgdGFyZ2V0X29mZnNldCwKKwkJCQkgIHVpbnQzMl90IHJlYWRfZG9tYWlucywgdWludDMyX3Qgd3JpdGVfZG9tYWluKTsKK2ludCBkcm1faW50ZWxfYm9fcGluKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90IGFsaWdubWVudCk7CitpbnQgZHJtX2ludGVsX2JvX3VucGluKGRybV9pbnRlbF9ibyAqYm8pOworaW50IGRybV9pbnRlbF9ib19zZXRfdGlsaW5nKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90ICogdGlsaW5nX21vZGUsCisJCQkgICAgdWludDMyX3Qgc3RyaWRlKTsKK2ludCBkcm1faW50ZWxfYm9fZ2V0X3RpbGluZyhkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCAqIHRpbGluZ19tb2RlLAorCQkJICAgIHVpbnQzMl90ICogc3dpenpsZV9tb2RlKTsKK2ludCBkcm1faW50ZWxfYm9fZmxpbmsoZHJtX2ludGVsX2JvICpibywgdWludDMyX3QgKiBuYW1lKTsKK2ludCBkcm1faW50ZWxfYm9fYnVzeShkcm1faW50ZWxfYm8gKmJvKTsKK2ludCBkcm1faW50ZWxfYm9fbWFkdmlzZShkcm1faW50ZWxfYm8gKmJvLCBpbnQgbWFkdik7CitpbnQgZHJtX2ludGVsX2JvX3VzZV80OGJfYWRkcmVzc19yYW5nZShkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCBlbmFibGUpOworaW50IGRybV9pbnRlbF9ib19zZXRfc29mdHBpbl9vZmZzZXQoZHJtX2ludGVsX2JvICpibywgdWludDY0X3Qgb2Zmc2V0KTsKKworaW50IGRybV9pbnRlbF9ib19kaXNhYmxlX3JldXNlKGRybV9pbnRlbF9ibyAqYm8pOworaW50IGRybV9pbnRlbF9ib19pc19yZXVzYWJsZShkcm1faW50ZWxfYm8gKmJvKTsKK2ludCBkcm1faW50ZWxfYm9fcmVmZXJlbmNlcyhkcm1faW50ZWxfYm8gKmJvLCBkcm1faW50ZWxfYm8gKnRhcmdldF9ibyk7CisKKy8qIGRybV9pbnRlbF9idWZtZ3JfZ2VtLmMgKi8KK2RybV9pbnRlbF9idWZtZ3IgKmRybV9pbnRlbF9idWZtZ3JfZ2VtX2luaXQoaW50IGZkLCBpbnQgYmF0Y2hfc2l6ZSk7Citkcm1faW50ZWxfYm8gKmRybV9pbnRlbF9ib19nZW1fY3JlYXRlX2Zyb21fbmFtZShkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCQkJCQljb25zdCBjaGFyICpuYW1lLAorCQkJCQkJdW5zaWduZWQgaW50IGhhbmRsZSk7Cit2b2lkIGRybV9pbnRlbF9idWZtZ3JfZ2VtX2VuYWJsZV9yZXVzZShkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IpOwordm9pZCBkcm1faW50ZWxfYnVmbWdyX2dlbV9lbmFibGVfZmVuY2VkX3JlbG9jcyhkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IpOwordm9pZCBkcm1faW50ZWxfYnVmbWdyX2dlbV9zZXRfdm1hX2NhY2hlX3NpemUoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAorCQkJCQkgICAgIGludCBsaW1pdCk7CitpbnQgZHJtX2ludGVsX2dlbV9ib19tYXBfdW5zeW5jaHJvbml6ZWQoZHJtX2ludGVsX2JvICpibyk7CitpbnQgZHJtX2ludGVsX2dlbV9ib19tYXBfZ3R0KGRybV9pbnRlbF9ibyAqYm8pOworaW50IGRybV9pbnRlbF9nZW1fYm9fdW5tYXBfZ3R0KGRybV9pbnRlbF9ibyAqYm8pOworCisjZGVmaW5lIEhBVkVfRFJNX0lOVEVMX0dFTV9CT19ESVNBQkxFX0lNUExJQ0lUX1NZTkMgMQoraW50IGRybV9pbnRlbF9idWZtZ3JfZ2VtX2Nhbl9kaXNhYmxlX2ltcGxpY2l0X3N5bmMoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyKTsKK3ZvaWQgZHJtX2ludGVsX2dlbV9ib19kaXNhYmxlX2ltcGxpY2l0X3N5bmMoZHJtX2ludGVsX2JvICpibyk7Cit2b2lkIGRybV9pbnRlbF9nZW1fYm9fZW5hYmxlX2ltcGxpY2l0X3N5bmMoZHJtX2ludGVsX2JvICpibyk7CisKK3ZvaWQgKmRybV9pbnRlbF9nZW1fYm9fbWFwX19jcHUoZHJtX2ludGVsX2JvICpibyk7Cit2b2lkICpkcm1faW50ZWxfZ2VtX2JvX21hcF9fZ3R0KGRybV9pbnRlbF9ibyAqYm8pOwordm9pZCAqZHJtX2ludGVsX2dlbV9ib19tYXBfX3djKGRybV9pbnRlbF9ibyAqYm8pOworCitpbnQgZHJtX2ludGVsX2dlbV9ib19nZXRfcmVsb2NfY291bnQoZHJtX2ludGVsX2JvICpibyk7Cit2b2lkIGRybV9pbnRlbF9nZW1fYm9fY2xlYXJfcmVsb2NzKGRybV9pbnRlbF9ibyAqYm8sIGludCBzdGFydCk7Cit2b2lkIGRybV9pbnRlbF9nZW1fYm9fc3RhcnRfZ3R0X2FjY2Vzcyhkcm1faW50ZWxfYm8gKmJvLCBpbnQgd3JpdGVfZW5hYmxlKTsKKwordm9pZAorZHJtX2ludGVsX2J1Zm1ncl9nZW1fc2V0X2F1Yl9maWxlbmFtZShkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCQkJICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpOwordm9pZCBkcm1faW50ZWxfYnVmbWdyX2dlbV9zZXRfYXViX2R1bXAoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLCBpbnQgZW5hYmxlKTsKK3ZvaWQgZHJtX2ludGVsX2dlbV9ib19hdWJfZHVtcF9ibXAoZHJtX2ludGVsX2JvICpibywKKwkJCQkgICBpbnQgeDEsIGludCB5MSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCSAgIGVudW0gYXViX2R1bXBfYm1wX2Zvcm1hdCBmb3JtYXQsCisJCQkJICAgaW50IHBpdGNoLCBpbnQgb2Zmc2V0KTsKK3ZvaWQKK2RybV9pbnRlbF9idWZtZ3JfZ2VtX3NldF9hdWJfYW5ub3RhdGlvbnMoZHJtX2ludGVsX2JvICpibywKKwkJCQkJIGRybV9pbnRlbF9hdWJfYW5ub3RhdGlvbiAqYW5ub3RhdGlvbnMsCisJCQkJCSB1bnNpZ25lZCBjb3VudCk7CisKK2ludCBkcm1faW50ZWxfZ2V0X3BpcGVfZnJvbV9jcnRjX2lkKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwgaW50IGNydGNfaWQpOworCitpbnQgZHJtX2ludGVsX2dldF9hcGVydHVyZV9zaXplcyhpbnQgZmQsIHNpemVfdCAqbWFwcGFibGUsIHNpemVfdCAqdG90YWwpOworaW50IGRybV9pbnRlbF9idWZtZ3JfZ2VtX2dldF9kZXZpZChkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IpOworaW50IGRybV9pbnRlbF9nZW1fYm9fd2FpdChkcm1faW50ZWxfYm8gKmJvLCBpbnQ2NF90IHRpbWVvdXRfbnMpOworCitkcm1faW50ZWxfY29udGV4dCAqZHJtX2ludGVsX2dlbV9jb250ZXh0X2NyZWF0ZShkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IpOworaW50IGRybV9pbnRlbF9nZW1fY29udGV4dF9nZXRfaWQoZHJtX2ludGVsX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjdHhfaWQpOwordm9pZCBkcm1faW50ZWxfZ2VtX2NvbnRleHRfZGVzdHJveShkcm1faW50ZWxfY29udGV4dCAqY3R4KTsKK2ludCBkcm1faW50ZWxfZ2VtX2JvX2NvbnRleHRfZXhlYyhkcm1faW50ZWxfYm8gKmJvLCBkcm1faW50ZWxfY29udGV4dCAqY3R4LAorCQkJCSAgaW50IHVzZWQsIHVuc2lnbmVkIGludCBmbGFncyk7CitpbnQgZHJtX2ludGVsX2dlbV9ib19mZW5jZV9leGVjKGRybV9pbnRlbF9ibyAqYm8sCisJCQkJZHJtX2ludGVsX2NvbnRleHQgKmN0eCwKKwkJCQlpbnQgdXNlZCwKKwkJCQlpbnQgaW5fZmVuY2UsCisJCQkJaW50ICpvdXRfZmVuY2UsCisJCQkJdW5zaWduZWQgaW50IGZsYWdzKTsKKworaW50IGRybV9pbnRlbF9ib19nZW1fZXhwb3J0X3RvX3ByaW1lKGRybV9pbnRlbF9ibyAqYm8sIGludCAqcHJpbWVfZmQpOworZHJtX2ludGVsX2JvICpkcm1faW50ZWxfYm9fZ2VtX2NyZWF0ZV9mcm9tX3ByaW1lKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKKwkJCQkJCWludCBwcmltZV9mZCwgaW50IHNpemUpOworCisvKiBkcm1faW50ZWxfYnVmbWdyX2Zha2UuYyAqLworZHJtX2ludGVsX2J1Zm1nciAqZHJtX2ludGVsX2J1Zm1ncl9mYWtlX2luaXQoaW50IGZkLAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgbG93X29mZnNldCwKKwkJCQkJICAgICB2b2lkICpsb3dfdmlydHVhbCwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJCSAgICAgdm9sYXRpbGUgdW5zaWduZWQgaW50CisJCQkJCSAgICAgKmxhc3RfZGlzcGF0Y2gpOwordm9pZCBkcm1faW50ZWxfYnVmbWdyX2Zha2Vfc2V0X2xhc3RfZGlzcGF0Y2goZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAorCQkJCQkgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGludAorCQkJCQkgICAgICpsYXN0X2Rpc3BhdGNoKTsKK3ZvaWQgZHJtX2ludGVsX2J1Zm1ncl9mYWtlX3NldF9leGVjX2NhbGxiYWNrKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKKwkJCQkJICAgICBpbnQgKCpleGVjKSAoZHJtX2ludGVsX2JvICpibywKKwkJCQkJCQkgIHVuc2lnbmVkIGludCB1c2VkLAorCQkJCQkJCSAgdm9pZCAqcHJpdiksCisJCQkJCSAgICAgdm9pZCAqcHJpdik7Cit2b2lkIGRybV9pbnRlbF9idWZtZ3JfZmFrZV9zZXRfZmVuY2VfY2FsbGJhY2soZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgKCplbWl0KSAodm9pZCAqcHJpdiksCisJCQkJCSAgICAgIHZvaWQgKCp3YWl0KSAodW5zaWduZWQgaW50IGZlbmNlLAorCQkJCQkJCSAgICB2b2lkICpwcml2KSwKKwkJCQkJICAgICAgdm9pZCAqcHJpdik7Citkcm1faW50ZWxfYm8gKmRybV9pbnRlbF9ib19mYWtlX2FsbG9jX3N0YXRpYyhkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCQkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHZvaWQgKnZpcnQpOwordm9pZCBkcm1faW50ZWxfYm9fZmFrZV9kaXNhYmxlX2JhY2tpbmdfc3RvcmUoZHJtX2ludGVsX2JvICpibywKKwkJCQkJICAgICB2b2lkICgqaW52YWxpZGF0ZV9jYikgKGRybV9pbnRlbF9ibworCQkJCQkJCQkgICAgKiBibywKKwkJCQkJCQkJICAgIHZvaWQgKnB0ciksCisJCQkJCSAgICAgdm9pZCAqcHRyKTsKKwordm9pZCBkcm1faW50ZWxfYnVmbWdyX2Zha2VfY29udGVuZGVkX2xvY2tfdGFrZShkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IpOwordm9pZCBkcm1faW50ZWxfYnVmbWdyX2Zha2VfZXZpY3RfYWxsKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1ncik7CisKK3N0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpkcm1faW50ZWxfZGVjb2RlX2NvbnRleHRfYWxsb2ModWludDMyX3QgZGV2aWQpOwordm9pZCBkcm1faW50ZWxfZGVjb2RlX2NvbnRleHRfZnJlZShzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KTsKK3ZvaWQgZHJtX2ludGVsX2RlY29kZV9zZXRfYmF0Y2hfcG9pbnRlcihzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4LAorCQkJCQl2b2lkICpkYXRhLCB1aW50MzJfdCBod19vZmZzZXQsCisJCQkJCWludCBjb3VudCk7Cit2b2lkIGRybV9pbnRlbF9kZWNvZGVfc2V0X2R1bXBfcGFzdF9lbmQoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCwKKwkJCQkJaW50IGR1bXBfcGFzdF9lbmQpOwordm9pZCBkcm1faW50ZWxfZGVjb2RlX3NldF9oZWFkX3RhaWwoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCwKKwkJCQkgICAgdWludDMyX3QgaGVhZCwgdWludDMyX3QgdGFpbCk7Cit2b2lkIGRybV9pbnRlbF9kZWNvZGVfc2V0X291dHB1dF9maWxlKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgsIEZJTEUgKm91dCk7Cit2b2lkIGRybV9pbnRlbF9kZWNvZGUoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCk7CisKK2ludCBkcm1faW50ZWxfcmVnX3JlYWQoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAorCQkgICAgICAgdWludDMyX3Qgb2Zmc2V0LAorCQkgICAgICAgdWludDY0X3QgKnJlc3VsdCk7CisKK2ludCBkcm1faW50ZWxfZ2V0X3Jlc2V0X3N0YXRzKGRybV9pbnRlbF9jb250ZXh0ICpjdHgsCisJCQkgICAgICB1aW50MzJfdCAqcmVzZXRfY291bnQsCisJCQkgICAgICB1aW50MzJfdCAqYWN0aXZlLAorCQkJICAgICAgdWludDMyX3QgKnBlbmRpbmcpOworCitpbnQgZHJtX2ludGVsX2dldF9zdWJzbGljZV90b3RhbChpbnQgZmQsIHVuc2lnbmVkIGludCAqc3Vic2xpY2VfdG90YWwpOworaW50IGRybV9pbnRlbF9nZXRfZXVfdG90YWwoaW50IGZkLCB1bnNpZ25lZCBpbnQgKmV1X3RvdGFsKTsKKworaW50IGRybV9pbnRlbF9nZXRfcG9vbGVkX2V1KGludCBmZCk7CitpbnQgZHJtX2ludGVsX2dldF9taW5fZXVfaW5fcG9vbChpbnQgZmQpOworCisvKiogQHsgQ29tcGF0aWJpbGl0eSBkZWZpbmVzIHRvIGtlZXAgb2xkIGNvZGUgYnVpbGRpbmcgZGVzcGl0ZSB0aGUgc3ltYm9sIHJlbmFtZQorICogZnJvbSBkcmlfKiB0byBkcm1faW50ZWxfKgorICovCisjZGVmaW5lIGRyaV9ibyBkcm1faW50ZWxfYm8KKyNkZWZpbmUgZHJpX2J1Zm1nciBkcm1faW50ZWxfYnVmbWdyCisjZGVmaW5lIGRyaV9ib19hbGxvYyBkcm1faW50ZWxfYm9fYWxsb2MKKyNkZWZpbmUgZHJpX2JvX3JlZmVyZW5jZSBkcm1faW50ZWxfYm9fcmVmZXJlbmNlCisjZGVmaW5lIGRyaV9ib191bnJlZmVyZW5jZSBkcm1faW50ZWxfYm9fdW5yZWZlcmVuY2UKKyNkZWZpbmUgZHJpX2JvX21hcCBkcm1faW50ZWxfYm9fbWFwCisjZGVmaW5lIGRyaV9ib191bm1hcCBkcm1faW50ZWxfYm9fdW5tYXAKKyNkZWZpbmUgZHJpX2JvX3N1YmRhdGEgZHJtX2ludGVsX2JvX3N1YmRhdGEKKyNkZWZpbmUgZHJpX2JvX2dldF9zdWJkYXRhIGRybV9pbnRlbF9ib19nZXRfc3ViZGF0YQorI2RlZmluZSBkcmlfYm9fd2FpdF9yZW5kZXJpbmcgZHJtX2ludGVsX2JvX3dhaXRfcmVuZGVyaW5nCisjZGVmaW5lIGRyaV9idWZtZ3Jfc2V0X2RlYnVnIGRybV9pbnRlbF9idWZtZ3Jfc2V0X2RlYnVnCisjZGVmaW5lIGRyaV9idWZtZ3JfZGVzdHJveSBkcm1faW50ZWxfYnVmbWdyX2Rlc3Ryb3kKKyNkZWZpbmUgZHJpX2JvX2V4ZWMgZHJtX2ludGVsX2JvX2V4ZWMKKyNkZWZpbmUgZHJpX2J1Zm1ncl9jaGVja19hcGVydHVyZV9zcGFjZSBkcm1faW50ZWxfYnVmbWdyX2NoZWNrX2FwZXJ0dXJlX3NwYWNlCisjZGVmaW5lIGRyaV9ib19lbWl0X3JlbG9jKHJlbG9jX2JvLCByZWFkLCB3cml0ZSwgdGFyZ2V0X29mZnNldCwJCVwKKwkJCSAgcmVsb2Nfb2Zmc2V0LCB0YXJnZXRfYm8pCQkJXAorCWRybV9pbnRlbF9ib19lbWl0X3JlbG9jKHJlbG9jX2JvLCByZWxvY19vZmZzZXQsCQkJXAorCQkJCXRhcmdldF9ibywgdGFyZ2V0X29mZnNldCwJCVwKKwkJCQlyZWFkLCB3cml0ZSk7CisjZGVmaW5lIGRyaV9ib19waW4gZHJtX2ludGVsX2JvX3BpbgorI2RlZmluZSBkcmlfYm9fdW5waW4gZHJtX2ludGVsX2JvX3VucGluCisjZGVmaW5lIGRyaV9ib19nZXRfdGlsaW5nIGRybV9pbnRlbF9ib19nZXRfdGlsaW5nCisjZGVmaW5lIGRyaV9ib19zZXRfdGlsaW5nKGJvLCBtb2RlKSBkcm1faW50ZWxfYm9fc2V0X3RpbGluZyhibywgbW9kZSwgMCkKKyNkZWZpbmUgZHJpX2JvX2ZsaW5rIGRybV9pbnRlbF9ib19mbGluaworI2RlZmluZSBpbnRlbF9idWZtZ3JfZ2VtX2luaXQgZHJtX2ludGVsX2J1Zm1ncl9nZW1faW5pdAorI2RlZmluZSBpbnRlbF9ib19nZW1fY3JlYXRlX2Zyb21fbmFtZSBkcm1faW50ZWxfYm9fZ2VtX2NyZWF0ZV9mcm9tX25hbWUKKyNkZWZpbmUgaW50ZWxfYnVmbWdyX2dlbV9lbmFibGVfcmV1c2UgZHJtX2ludGVsX2J1Zm1ncl9nZW1fZW5hYmxlX3JldXNlCisjZGVmaW5lIGludGVsX2J1Zm1ncl9mYWtlX2luaXQgZHJtX2ludGVsX2J1Zm1ncl9mYWtlX2luaXQKKyNkZWZpbmUgaW50ZWxfYnVmbWdyX2Zha2Vfc2V0X2xhc3RfZGlzcGF0Y2ggZHJtX2ludGVsX2J1Zm1ncl9mYWtlX3NldF9sYXN0X2Rpc3BhdGNoCisjZGVmaW5lIGludGVsX2J1Zm1ncl9mYWtlX3NldF9leGVjX2NhbGxiYWNrIGRybV9pbnRlbF9idWZtZ3JfZmFrZV9zZXRfZXhlY19jYWxsYmFjaworI2RlZmluZSBpbnRlbF9idWZtZ3JfZmFrZV9zZXRfZmVuY2VfY2FsbGJhY2sgZHJtX2ludGVsX2J1Zm1ncl9mYWtlX3NldF9mZW5jZV9jYWxsYmFjaworI2RlZmluZSBpbnRlbF9ib19mYWtlX2FsbG9jX3N0YXRpYyBkcm1faW50ZWxfYm9fZmFrZV9hbGxvY19zdGF0aWMKKyNkZWZpbmUgaW50ZWxfYm9fZmFrZV9kaXNhYmxlX2JhY2tpbmdfc3RvcmUgZHJtX2ludGVsX2JvX2Zha2VfZGlzYWJsZV9iYWNraW5nX3N0b3JlCisjZGVmaW5lIGludGVsX2J1Zm1ncl9mYWtlX2NvbnRlbmRlZF9sb2NrX3Rha2UgZHJtX2ludGVsX2J1Zm1ncl9mYWtlX2NvbnRlbmRlZF9sb2NrX3Rha2UKKyNkZWZpbmUgaW50ZWxfYnVmbWdyX2Zha2VfZXZpY3RfYWxsIGRybV9pbnRlbF9idWZtZ3JfZmFrZV9ldmljdF9hbGwKKworLyoqIEB7ICovCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZiAvKiBJTlRFTF9CVUZNR1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW50ZWwvaW50ZWxfYnVmbWdyX2Zha2UuYyBiL2ludGVsL2ludGVsX2J1Zm1ncl9mYWtlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxZGY2YQotLS0gL2Rldi9udWxsCisrKyBiL2ludGVsL2ludGVsX2J1Zm1ncl9mYWtlLmMKQEAgLTAsMCArMSwxNjMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDYgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBPcmlnaW5hbGx5IGEgZmFrZSB2ZXJzaW9uIG9mIHRoZSBidWZmZXIgbWFuYWdlciBzbyB0aGF0IHdlIGNhbgorICogcHJvdG90eXBlIHRoZSBjaGFuZ2VzIGluIGEgZHJpdmVyIGZhaXJseSBxdWlja2x5LCBoYXMgYmVlbiBmbGVzaGVkCisgKiBvdXQgdG8gYSBmdWxseSBmdW5jdGlvbmFsIGludGVyaW0gc29sdXRpb24uCisgKgorICogQmFzaWNhbGx5IHdyYXBzIHRoZSBvbGQgc3R5bGUgbWVtb3J5IG1hbmFnZW1lbnQgaW4gdGhlIG5ldworICogcHJvZ3JhbW1pbmcgaW50ZXJmYWNlLCBidXQgaXMgbW9yZSBleHByZXNzaXZlIGFuZCBhdm9pZHMgbWFueSBvZgorICogdGhlIGJ1Z3MgaW4gdGhlIG9sZCB0ZXh0dXJlIG1hbmFnZXIuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjaW5jbHVkZSA8eGY4NmRybS5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlICJpbnRlbF9idWZtZ3IuaCIKKyNpbmNsdWRlICJpbnRlbF9idWZtZ3JfcHJpdi5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImk5MTVfZHJtLmgiCisjaW5jbHVkZSAibW0uaCIKKyNpbmNsdWRlICJsaWJkcm1fbWFjcm9zLmgiCisjaW5jbHVkZSAibGliZHJtX2xpc3RzLmgiCisKKyNkZWZpbmUgREJHKC4uLikgZG8gewkJCQkJXAorCWlmIChidWZtZ3JfZmFrZS0+YnVmbWdyLmRlYnVnKQkJCVwKKwkJZHJtTXNnKF9fVkFfQVJHU19fKTsJCQlcCit9IHdoaWxlICgwKQorCisvKiBJbnRlcm5hbCBmbGFnczoKKyAqLworI2RlZmluZSBCTV9OT19CQUNLSU5HX1NUT1JFCQkJMHgwMDAwMDAwMQorI2RlZmluZSBCTV9OT19GRU5DRV9TVUJEQVRBCQkJMHgwMDAwMDAwMgorI2RlZmluZSBCTV9QSU5ORUQJCQkJMHgwMDAwMDAwNAorCisvKiBXcmFwcGVyIGFyb3VuZCBtbS5jJ3MgbWVtX2Jsb2NrLCB3aGljaCB1bmRlcnN0YW5kcyB0aGF0IHlvdSBtdXN0CisgKiB3YWl0IGZvciBmZW5jZXMgdG8gZXhwaXJlIGJlZm9yZSBtZW1vcnkgY2FuIGJlIGZyZWVkLiAgVGhpcyBpcworICogc3BlY2lmaWMgdG8gb3VyIHVzZSBvZiBtZW1jcHkgZm9yIHVwbG9hZHMgLSBhbiB1cGxvYWQgdGhhdCB3YXMKKyAqIHByb2Nlc3NlZCB0aHJvdWdoIHRoZSBjb21tYW5kIHF1ZXVlIHdvdWxkbid0IG5lZWQgdG8gY2FyZSBhYm91dAorICogZmVuY2VzLgorICovCisjZGVmaW5lIE1BWF9SRUxPQ1MgNDA5NgorCitzdHJ1Y3QgZmFrZV9idWZmZXJfcmVsb2MgeworCS8qKiBCdWZmZXIgb2JqZWN0IHRoYXQgdGhlIHJlbG9jYXRpb24gcG9pbnRzIGF0LiAqLworCWRybV9pbnRlbF9ibyAqdGFyZ2V0X2J1ZjsKKwkvKiogT2Zmc2V0IG9mIHRoZSByZWxvY2F0aW9uIGVudHJ5IHdpdGhpbiByZWxvY19idWYuICovCisJdWludDMyX3Qgb2Zmc2V0OworCS8qKgorCSAqIENhY2hlZCB2YWx1ZSBvZiB0aGUgb2Zmc2V0IHdoZW4gd2UgbGFzdCBwZXJmb3JtZWQgdGhpcyByZWxvY2F0aW9uLgorCSAqLworCXVpbnQzMl90IGxhc3RfdGFyZ2V0X29mZnNldDsKKwkvKiogVmFsdWUgYWRkZWQgdG8gdGFyZ2V0X2J1ZidzIG9mZnNldCB0byBnZXQgdGhlIHJlbG9jYXRpb24gZW50cnkuICovCisJdWludDMyX3QgZGVsdGE7CisJLyoqIENhY2hlIGRvbWFpbnMgdGhlIHRhcmdldCBidWZmZXIgaXMgcmVhZCBpbnRvLiAqLworCXVpbnQzMl90IHJlYWRfZG9tYWluczsKKwkvKiogQ2FjaGUgZG9tYWluIHRoZSB0YXJnZXQgYnVmZmVyIHdpbGwgaGF2ZSBkaXJ0eSBjYWNoZWxpbmVzIGluLiAqLworCXVpbnQzMl90IHdyaXRlX2RvbWFpbjsKK307CisKK3N0cnVjdCBibG9jayB7CisJc3RydWN0IGJsb2NrICpuZXh0LCAqcHJldjsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICptZW07CS8qIEJNX01FTV9BR1AgKi8KKworCS8qKgorCSAqIE1hcmtzIHRoYXQgdGhlIGJsb2NrIGlzIGN1cnJlbnRseSBpbiB0aGUgYXBlcnR1cmUgYW5kIGhhcyB5ZXQgdG8gYmUKKwkgKiBmZW5jZWQuCisJICovCisJdW5zaWduZWQgb25faGFyZHdhcmU6MTsKKwkvKioKKwkgKiBNYXJrcyB0aGF0IHRoZSBibG9jayBpcyBjdXJyZW50bHkgZmVuY2VkIChiZWluZyB1c2VkIGJ5IHJlbmRlcmluZykKKwkgKiBhbmQgY2FuJ3QgYmUgZnJlZWQgdW50aWwgQGZlbmNlIGlzIHBhc3NlZC4KKwkgKi8KKwl1bnNpZ25lZCBmZW5jZWQ6MTsKKworCS8qKiBGZW5jZSBjb29raWUgZm9yIHRoZSBibG9jay4gKi8KKwl1bnNpZ25lZCBmZW5jZTsJCS8qIFNwbGl0IHRvIHJlYWRfZmVuY2UsIHdyaXRlX2ZlbmNlICovCisKKwlkcm1faW50ZWxfYm8gKmJvOworCXZvaWQgKnZpcnR1YWw7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfYnVmbWdyX2Zha2UgeworCWRybV9pbnRlbF9idWZtZ3IgYnVmbWdyOworCisJcHRocmVhZF9tdXRleF90IGxvY2s7CisKKwl1bnNpZ25lZCBsb25nIGxvd19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXZvaWQgKnZpcnR1YWw7CisKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwOworCisJdW5zaWduZWQgYnVmX25yOwkvKiBmb3IgZ2VuZXJhdGluZyBpZHMgKi8KKworCS8qKgorCSAqIExpc3Qgb2YgYmxvY2tzIHdoaWNoIGFyZSBjdXJyZW50bHkgaW4gdGhlIEdBUlQgYnV0IGhhdmVuJ3QgYmVlbgorCSAqIGZlbmNlZCB5ZXQuCisJICovCisJc3RydWN0IGJsb2NrIG9uX2hhcmR3YXJlOworCS8qKgorCSAqIExpc3Qgb2YgYmxvY2tzIHdoaWNoIGFyZSBpbiB0aGUgR0FSVCBhbmQgaGF2ZSBhbiBhY3RpdmUgZmVuY2Ugb24KKwkgKiB0aGVtLgorCSAqLworCXN0cnVjdCBibG9jayBmZW5jZWQ7CisJLyoqCisJICogTGlzdCBvZiBibG9ja3Mgd2hpY2ggaGF2ZSBhbiBleHBpcmVkIGZlbmNlIGFuZCBhcmUgcmVhZHkgdG8gYmUKKwkgKiBldmljdGVkLgorCSAqLworCXN0cnVjdCBibG9jayBscnU7CisKKwl1bnNpZ25lZCBpbnQgbGFzdF9mZW5jZTsKKworCXVuc2lnbmVkIGZhaWw6MTsKKwl1bnNpZ25lZCBuZWVkX2ZlbmNlOjE7CisJaW50IHRocmFzaGluZzsKKworCS8qKgorCSAqIERyaXZlciBjYWxsYmFjayB0byBlbWl0IGEgZmVuY2UsIHJldHVybmluZyB0aGUgY29va2llLgorCSAqCisJICogVGhpcyBhbGxvd3MgdGhlIGRyaXZlciB0byBob29rIGluIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBEUk0gdXNhZ2UgaW4KKwkgKiBidWZtZ3JfZmFrZS4KKwkgKgorCSAqIEN1cnJlbnRseSwgdGhpcyBhbHNvIHJlcXVpcmVzIHRoYXQgYSB3cml0ZSBmbHVzaCBiZSBlbWl0dGVkIGJlZm9yZQorCSAqIGVtaXR0aW5nIHRoZSBmZW5jZSwgYnV0IHRoaXMgc2hvdWxkIGNoYW5nZS4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgKCpmZW5jZV9lbWl0KSAodm9pZCAqcHJpdmF0ZSk7CisJLyoqIERyaXZlciBjYWxsYmFjayB0byB3YWl0IGZvciBhIGZlbmNlIGNvb2tpZSB0byBoYXZlIHBhc3NlZC4gKi8KKwl2b2lkICgqZmVuY2Vfd2FpdCkgKHVuc2lnbmVkIGludCBmZW5jZSwgdm9pZCAqcHJpdmF0ZSk7CisJdm9pZCAqZmVuY2VfcHJpdjsKKworCS8qKgorCSAqIERyaXZlciBjYWxsYmFjayB0byBleGVjdXRlIGEgYnVmZmVyLgorCSAqCisJICogVGhpcyBhbGxvd3MgdGhlIGRyaXZlciB0byBob29rIGluIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBEUk0gdXNhZ2UgaW4KKwkgKiBidWZtZ3JfZmFrZS4KKwkgKi8KKwlpbnQgKCpleGVjKSAoZHJtX2ludGVsX2JvICpibywgdW5zaWduZWQgaW50IHVzZWQsIHZvaWQgKnByaXYpOworCXZvaWQgKmV4ZWNfcHJpdjsKKworCS8qKiBEcml2ZXItc3VwcGxpZWQgYXJndW1lbnQgdG8gZHJpdmVyIGNhbGxiYWNrcyAqLworCXZvaWQgKmRyaXZlcl9wcml2OworCS8qKgorCSAqIFBvaW50ZXIgdG8ga2VybmVsLXVwZGF0ZWQgc2FyZWEgZGF0YSBmb3IgdGhlIGxhc3QgY29tcGxldGVkIHVzZXIgaXJxCisJICovCisJdm9sYXRpbGUgaW50ICpsYXN0X2Rpc3BhdGNoOworCisJaW50IGZkOworCisJaW50IGRlYnVnOworCisJaW50IHBlcmZvcm1lZF9yZW5kZXJpbmc7Cit9IGRybV9pbnRlbF9idWZtZ3JfZmFrZTsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pbnRlbF9ib19mYWtlIHsKKwlkcm1faW50ZWxfYm8gYm87CisKKwl1bnNpZ25lZCBpZDsJCS8qIGRlYnVnIG9ubHkgKi8KKwljb25zdCBjaGFyICpuYW1lOworCisJdW5zaWduZWQgZGlydHk6MTsKKwkvKioKKwkgKiBoYXMgdGhlIGNhcmQgd3JpdHRlbiB0byB0aGlzIGJ1ZmZlciAtIHdlIG1ha2UgbmVlZCB0byBjb3B5IGl0IGJhY2sKKwkgKi8KKwl1bnNpZ25lZCBjYXJkX2RpcnR5OjE7CisJdW5zaWduZWQgaW50IHJlZmNvdW50OworCS8qIEZsYWdzIG1heSBjb25zaXN0IG9mIGFueSBvZiB0aGUgRFJNX0JPIGZsYWdzLCBwbHVzCisJICogRFJNX0JPX05PX0JBQ0tJTkdfU1RPUkUgYW5kIEJNX05PX0ZFTkNFX1NVQkRBVEEsIHdoaWNoIGFyZSB0aGUKKwkgKiBmaXJzdCB0d28gZHJpdmVyIHByaXZhdGUgZmxhZ3MuCisJICovCisJdWludDY0X3QgZmxhZ3M7CisJLyoqIENhY2hlIGRvbWFpbnMgdGhlIHRhcmdldCBidWZmZXIgaXMgcmVhZCBpbnRvLiAqLworCXVpbnQzMl90IHJlYWRfZG9tYWluczsKKwkvKiogQ2FjaGUgZG9tYWluIHRoZSB0YXJnZXQgYnVmZmVyIHdpbGwgaGF2ZSBkaXJ0eSBjYWNoZWxpbmVzIGluLiAqLworCXVpbnQzMl90IHdyaXRlX2RvbWFpbjsKKworCXVuc2lnbmVkIGludCBhbGlnbm1lbnQ7CisJaW50IGlzX3N0YXRpYywgdmFsaWRhdGVkOworCXVuc2lnbmVkIGludCBtYXBfY291bnQ7CisKKwkvKiogcmVsb2NhdGlvbiBsaXN0ICovCisJc3RydWN0IGZha2VfYnVmZmVyX3JlbG9jICpyZWxvY3M7CisJaW50IG5yX3JlbG9jczsKKwkvKioKKwkgKiBUb3RhbCBzaXplIG9mIHRoZSB0YXJnZXRfYm9zIG9mIHRoaXMgYnVmZmVyLgorCSAqCisJICogVXNlZCBmb3IgZXN0aW1hdGlvbiBpbiBjaGVja19hcGVydHVyZS4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgY2hpbGRfc2l6ZTsKKworCXN0cnVjdCBibG9jayAqYmxvY2s7CisJdm9pZCAqYmFja2luZ19zdG9yZTsKKwl2b2lkICgqaW52YWxpZGF0ZV9jYikgKGRybV9pbnRlbF9ibyAqYm8sIHZvaWQgKnB0cik7CisJdm9pZCAqaW52YWxpZGF0ZV9wdHI7Cit9IGRybV9pbnRlbF9ib19mYWtlOworCitzdGF0aWMgaW50IGNsZWFyX2ZlbmNlZChkcm1faW50ZWxfYnVmbWdyX2Zha2UgKmJ1Zm1ncl9mYWtlLAorCQkJdW5zaWduZWQgaW50IGZlbmNlX2Nvb2tpZSk7CisKKyNkZWZpbmUgTUFYRkVOQ0UgMHg3ZmZmZmZmZgorCitzdGF0aWMgaW50CitGRU5DRV9MVEUodW5zaWduZWQgYSwgdW5zaWduZWQgYikKK3sKKwlpZiAoYSA9PSBiKQorCQlyZXR1cm4gMTsKKworCWlmIChhIDwgYiAmJiBiIC0gYSA8ICgxIDw8IDI0KSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoYSA+IGIgJiYgTUFYRkVOQ0UgLSBhICsgYiA8ICgxIDw8IDI0KSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorZHJtX2ludGVsX2J1Zm1ncl9mYWtlX3NldF9mZW5jZV9jYWxsYmFjayhkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCQkJCSB1bnNpZ25lZCBpbnQgKCplbWl0KSAodm9pZCAqcHJpdiksCisJCQkJCSB2b2lkICgqd2FpdCkgKHVuc2lnbmVkIGludCBmZW5jZSwKKwkJCQkJCSAgICAgICB2b2lkICpwcml2KSwKKwkJCQkJIHZvaWQgKnByaXYpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9mYWtlICpidWZtZ3JfZmFrZSA9IChkcm1faW50ZWxfYnVmbWdyX2Zha2UgKikgYnVmbWdyOworCisJYnVmbWdyX2Zha2UtPmZlbmNlX2VtaXQgPSBlbWl0OworCWJ1Zm1ncl9mYWtlLT5mZW5jZV93YWl0ID0gd2FpdDsKKwlidWZtZ3JfZmFrZS0+ZmVuY2VfcHJpdiA9IHByaXY7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK19mZW5jZV9lbWl0X2ludGVybmFsKGRybV9pbnRlbF9idWZtZ3JfZmFrZSAqYnVmbWdyX2Zha2UpCit7CisJc3RydWN0IGRybV9pOTE1X2lycV9lbWl0IGllOworCWludCByZXQsIHNlcSA9IDE7CisKKwlpZiAoYnVmbWdyX2Zha2UtPmZlbmNlX2VtaXQgIT0gTlVMTCkgeworCQlzZXEgPSBidWZtZ3JfZmFrZS0+ZmVuY2VfZW1pdChidWZtZ3JfZmFrZS0+ZmVuY2VfcHJpdik7CisJCXJldHVybiBzZXE7CisJfQorCisJaWUuaXJxX3NlcSA9ICZzZXE7CisJcmV0ID0gZHJtQ29tbWFuZFdyaXRlUmVhZChidWZtZ3JfZmFrZS0+ZmQsIERSTV9JOTE1X0lSUV9FTUlULAorCQkJCSAgJmllLCBzaXplb2YoaWUpKTsKKwlpZiAocmV0KSB7CisJCWRybU1zZygiJXM6IGRybV9pOTE1X2lycV9lbWl0OiAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCWFib3J0KCk7CisJfQorCisJREJHKCJlbWl0IDB4JTA4eFxuIiwgc2VxKTsKKwlyZXR1cm4gc2VxOworfQorCitzdGF0aWMgdm9pZAorX2ZlbmNlX3dhaXRfaW50ZXJuYWwoZHJtX2ludGVsX2J1Zm1ncl9mYWtlICpidWZtZ3JfZmFrZSwgaW50IHNlcSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfaXJxX3dhaXQgaXc7CisJaW50IGh3X3NlcSwgYnVzeV9jb3VudCA9IDA7CisJaW50IHJldDsKKwlpbnQga2VybmVsX2xpZWQ7CisKKwlpZiAoYnVmbWdyX2Zha2UtPmZlbmNlX3dhaXQgIT0gTlVMTCkgeworCQlidWZtZ3JfZmFrZS0+ZmVuY2Vfd2FpdChzZXEsIGJ1Zm1ncl9mYWtlLT5mZW5jZV9wcml2KTsKKwkJY2xlYXJfZmVuY2VkKGJ1Zm1ncl9mYWtlLCBzZXEpOworCQlyZXR1cm47CisJfQorCisJaXcuaXJxX3NlcSA9IHNlcTsKKworCURCRygid2FpdCAweCUwOHhcbiIsIGl3LmlycV9zZXEpOworCisJLyogVGhlIGtlcm5lbCBJUlFfV0FJVCBpbXBsZW1lbnRhdGlvbiBpcyBhbGwgc29ydHMgb2YgYnJva2VuLgorCSAqIDEpIEl0IHJldHVybnMgMSB0byAweDdmZmZmZmZmIGluc3RlYWQgb2YgdXNpbmcgdGhlIGZ1bGwgMzItYml0CisJICogICAgdW5zaWduZWQgcmFuZ2UuCisJICogMikgSXQgcmV0dXJucyAwIGlmIGh3X3NlcSA+PSBzZXEsIG5vdCBzZXEgLSBod19zZXEgPCAwIG9uIHRoZSAzMi1iaXQKKwkgKiAgICBzaWduZWQgcmFuZ2UuCisJICogMykgSXQgd2FpdHMgaWYgc2VxIDwgaHdfc2VxLCBub3Qgc2VxIC0gaHdfc2VxID4gMCBvbiB0aGUgMzItYml0CisJICogICAgc2lnbmVkIHJhbmdlLgorCSAqIDQpIEl0IHJldHVybnMgLUVCVVNZIGluIDMgc2Vjb25kcyBldmVuIGlmIHRoZSBoYXJkd2FyZSBpcyBzdGlsbAorCSAqICAgIHN1Y2Nlc3NmdWxseSBjaGV3aW5nIHRocm91Z2ggYnVmZmVycy4KKwkgKgorCSAqIEFzc3VtZSB0aGF0IGluIHVzZXJsYW5kIHdlIHRyZWF0IHNlcXVlbmNlIG51bWJlcnMgYXMgaW50cywgd2hpY2gKKwkgKiBtYWtlcyBzb21lIG9mIHRoZSBjb21wYXJpc29ucyBjb252ZW5pZW50LCBzaW5jZSB0aGUgc2VxdWVuY2UKKwkgKiBudW1iZXJzIGFyZSBhbGwgcG9zaXRpdmUgc2lnbmVkIGludGVnZXJzLgorCSAqCisJICogRnJvbSB0aGlzIHdlIGdldCBzZXZlcmFsIGNhc2VzIHdlIG5lZWQgdG8gaGFuZGxlLiAgSGVyZSdzIGEgdGltZWxpbmUuCisJICogMHgyICAgMHg3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZmZmZmZmOCAgIDB4N2ZmZmZmZmQKKwkgKiAgIHwgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgfAorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqCisJICogQSkgTm9ybWFsIHdhaXQgZm9yIGh3IHRvIGNhdGNoIHVwCisJICogaHdfc2VxIHNlcQorCSAqICAgfCAgICB8CisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogc2VxIC0gaHdfc2VxID0gNS4gIElmIHdlIGNhbGwgSVJRX1dBSVQsIGl0IHdpbGwgd2FpdCBmb3IgaHcgdG8KKwkgKiBjYXRjaCB1cC4KKwkgKgorCSAqIEIpIE5vcm1hbCB3YWl0IGZvciBhIHNlcXVlbmNlIG51bWJlciB0aGF0J3MgYWxyZWFkeSBwYXNzZWQuCisJICogc2VxICAgIGh3X3NlcQorCSAqICAgfCAgICB8CisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogc2VxIC0gaHdfc2VxID0gLTUuICBJZiB3ZSBjYWxsIElSUV9XQUlULCBpdCByZXR1cm5zIDAgcXVpY2tseS4KKwkgKgorCSAqIEMpIEhhcmR3YXJlIGhhcyBhbHJlYWR5IHdyYXBwZWQgYXJvdW5kIGFoZWFkIG9mIHVzCisJICogaHdfc2VxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcQorCSAqICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogc2VxIC0gaHdfc2VxID0gMHg4MDAwMDAwMCAtIDUuICBJZiB3ZSBjYWxsZWQgSVJRX1dBSVQsIGl0IHdvdWxkIHdhaXQKKwkgKiBmb3IgaHdfc2VxID49IHNlcSwgd2hpY2ggbWF5IG5ldmVyIG9jY3VyLiAgVGh1cywgd2Ugd2FudCB0byBjYXRjaAorCSAqIHRoaXMgaW4gdXNlcmxhbmQgYW5kIHJldHVybiAwLgorCSAqCisJICogRCkgV2UndmUgd3JhcHBlZCBhcm91bmQgYWhlYWQgb2YgdGhlIGhhcmR3YXJlLgorCSAqIHNlcSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3X3NlcQorCSAqICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogc2VxIC0gaHdfc2VxID0gLSgweDgwMDAwMDAwIC0gNSkuICBJZiB3ZSBjYWxsZWQgSVJRX1dBSVQsIGl0IHdvdWxkCisJICogcmV0dXJuIDAgcXVpY2tseSBiZWNhdXNlIGh3X3NlcSA+PSBzZXEsIGV2ZW4gdGhvdWdoIHRoZSBoYXJkd2FyZQorCSAqIGlzbid0IGNhdWdodCB1cC4gVGh1cywgd2UgbmVlZCB0byBjYXRjaCB0aGlzIGVhcmx5IHJldHVybiBpbgorCSAqIHVzZXJsYW5kIGFuZCBib3RoZXIgdGhlIGtlcm5lbCB1bnRpbCB0aGUgaGFyZHdhcmUgcmVhbGx5IGRvZXMKKwkgKiBjYXRjaCB1cC4KKwkgKgorCSAqIEUpIEhhcmR3YXJlIG1pZ2h0IHdyYXAgYWZ0ZXIgd2UgdGVzdCBpbiB1c2VybGFuZC4KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdfc2VxICBzZXEKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgfAorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIHNlcSAtIGh3X3NlcSA9IDUuICBJZiB3ZSBjYWxsIElSUV9XQUlULCBpdCB3aWxsIGxpa2VseSBzZWUgc2VxID49CisJICogaHdfc2VxIGFuZCB3YWl0LiAgSG93ZXZlciwgc3VwcG9zZSBod19zZXEgd3JhcHMgYmVmb3JlIHdlIG1ha2UgaXQKKwkgKiBpbnRvIHRoZSBrZXJuZWwuICBUaGUga2VybmVsIHNlZXMgaHdfc2VxID49IHNlcSBhbmQgd2FpdHMgZm9yIDMKKwkgKiBzZWNvbmRzIHRoZW4gcmV0dXJucyAtRUJVU1kuICBUaGlzIGlzIGNhc2UgQykuICBXZSBzaG91bGQgY2F0Y2gKKwkgKiB0aGlzIGFuZCB0aGVuIHJldHVybiBzdWNjZXNzZnVsbHkuCisJICoKKwkgKiBGKSBIYXJkd2FyZSBtaWdodCB0YWtlIGEgbG9uZyB0aW1lIG9uIGEgYnVmZmVyLgorCSAqIGh3X3NlcSBzZXEKKwkgKiAgIHwgICAgfAorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBzZXEgLSBod19zZXEgPSA1LiAgSWYgd2UgY2FsbCBJUlFfV0FJVCwgaWYgc2VxdWVuY2UgMiB0aHJvdWdoIDUKKwkgKiB0YWtlIHRvbyBsb25nLCBpdCB3aWxsIHJldHVybiAtRUJVU1kuICBCYXRjaGJ1ZmZlcnMgaW4gdGhlCisJICogZ2x0ZXN0cGVyZiBkZW1vIHdlcmUgc2VlbiB0byB0YWtlIHVwIHRvIDcgc2Vjb25kcy4gIFdlIHNob3VsZAorCSAqIGNhdGNoIGVhcmx5IC1FQlVTWSByZXR1cm4gYW5kIGtlZXAgdHJ5aW5nLgorCSAqLworCisJZG8geworCQkvKiBLZWVwIGEgY29weSBvZiBsYXN0X2Rpc3BhdGNoIHNvIHRoYXQgaWYgdGhlIHdhaXQgLUVCVVNZcworCQkgKiBiZWNhdXNlIHRoZSBoYXJkd2FyZSBkaWRuJ3QgY2F0Y2ggdXAgaW4gMyBzZWNvbmRzLCB3ZSBjYW4KKwkJICogc2VlIGlmIGl0IGF0IGxlYXN0IG1hZGUgcHJvZ3Jlc3MgYW5kIHJldHJ5LgorCQkgKi8KKwkJaHdfc2VxID0gKmJ1Zm1ncl9mYWtlLT5sYXN0X2Rpc3BhdGNoOworCisJCS8qIENhdGNoIGNhc2UgQyAqLworCQlpZiAoc2VxIC0gaHdfc2VxID4gMHg0MDAwMDAwMCkKKwkJCXJldHVybjsKKworCQlyZXQgPSBkcm1Db21tYW5kV3JpdGUoYnVmbWdyX2Zha2UtPmZkLCBEUk1fSTkxNV9JUlFfV0FJVCwKKwkJCQkgICAgICAmaXcsIHNpemVvZihpdykpOworCQkvKiBDYXRjaCBjYXNlIEQgKi8KKwkJa2VybmVsX2xpZWQgPSAocmV0ID09IDApICYmIChzZXEgLSAqYnVmbWdyX2Zha2UtPmxhc3RfZGlzcGF0Y2ggPAorCQkJCQkgICAgIC0weDQwMDAwMDAwKTsKKworCQkvKiBDYXRjaCBjYXNlIEUgKi8KKwkJaWYgKHJldCA9PSAtRUJVU1kKKwkJICAgICYmIChzZXEgLSAqYnVmbWdyX2Zha2UtPmxhc3RfZGlzcGF0Y2ggPiAweDQwMDAwMDAwKSkKKwkJCXJldCA9IDA7CisKKwkJLyogQ2F0Y2ggY2FzZSBGOiBBbGxvdyB1cCB0byAxNSBzZWNvbmRzIGNoZXdpbmcgb24gb25lIGJ1ZmZlci4gKi8KKwkJaWYgKChyZXQgPT0gLUVCVVNZKSAmJiAoaHdfc2VxICE9ICpidWZtZ3JfZmFrZS0+bGFzdF9kaXNwYXRjaCkpCisJCQlidXN5X2NvdW50ID0gMDsKKwkJZWxzZQorCQkJYnVzeV9jb3VudCsrOworCX0gd2hpbGUgKGtlcm5lbF9saWVkIHx8IHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIgfHwKKwkJIChyZXQgPT0gLUVCVVNZICYmIGJ1c3lfY291bnQgPCA1KSk7CisKKwlpZiAocmV0ICE9IDApIHsKKwkJZHJtTXNnKCIlczolZDogRXJyb3Igd2FpdGluZyBmb3IgZmVuY2U6ICVzLlxuIiwgX19GSUxFX18sCisJCSAgICAgICBfX0xJTkVfXywgc3RyZXJyb3IoLXJldCkpOworCQlhYm9ydCgpOworCX0KKwljbGVhcl9mZW5jZWQoYnVmbWdyX2Zha2UsIHNlcSk7Cit9CisKK3N0YXRpYyBpbnQKK19mZW5jZV90ZXN0KGRybV9pbnRlbF9idWZtZ3JfZmFrZSAqYnVmbWdyX2Zha2UsIHVuc2lnbmVkIGZlbmNlKQoreworCS8qIFNsaWdodCBwcm9ibGVtIHdpdGggd3JhcC1hcm91bmQ6CisJICovCisJcmV0dXJuIGZlbmNlID09IDAgfHwgRkVOQ0VfTFRFKGZlbmNlLCBidWZtZ3JfZmFrZS0+bGFzdF9mZW5jZSk7Cit9CisKKy8qKgorICogQWxsb2NhdGUgYSBtZW1vcnkgbWFuYWdlciBibG9jayBmb3IgdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIGludAorYWxsb2NfYmxvY2soZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYm9fZmFrZSAqYm9fZmFrZSA9IChkcm1faW50ZWxfYm9fZmFrZSAqKSBibzsKKwlkcm1faW50ZWxfYnVmbWdyX2Zha2UgKmJ1Zm1ncl9mYWtlID0KKwkgICAgKGRybV9pbnRlbF9idWZtZ3JfZmFrZSAqKSBiby0+YnVmbWdyOworCXN0cnVjdCBibG9jayAqYmxvY2sgPSAoc3RydWN0IGJsb2NrICopY2FsbG9jKHNpemVvZiAqYmxvY2ssIDEpOworCXVuc2lnbmVkIGludCBhbGlnbl9sb2cyID0gZmZzKGJvX2Zha2UtPmFsaWdubWVudCkgLSAxOworCXVuc2lnbmVkIGludCBzejsKKworCWlmICghYmxvY2spCisJCXJldHVybiAxOworCisJc3ogPSAoYm8tPnNpemUgKyBib19mYWtlLT5hbGlnbm1lbnQgLSAxKSAmIH4oYm9fZmFrZS0+YWxpZ25tZW50IC0gMSk7CisKKwlibG9jay0+bWVtID0gbW1BbGxvY01lbShidWZtZ3JfZmFrZS0+aGVhcCwgc3osIGFsaWduX2xvZzIsIDApOworCWlmICghYmxvY2stPm1lbSkgeworCQlmcmVlKGJsb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJRFJNSU5JVExJU1RIRUFEKGJsb2NrKTsKKworCS8qIEluc2VydCBhdCBoZWFkIG9yIGF0IHRhaWw/Pz8gKi8KKwlEUk1MSVNUQUREVEFJTChibG9jaywgJmJ1Zm1ncl9mYWtlLT5scnUpOworCisJYmxvY2stPnZpcnR1YWwgPSAodWludDhfdCAqKSBidWZtZ3JfZmFrZS0+dmlydHVhbCArCisJICAgIGJsb2NrLT5tZW0tPm9mcyAtIGJ1Zm1ncl9mYWtlLT5sb3dfb2Zmc2V0OworCWJsb2NrLT5ibyA9IGJvOworCisJYm9fZmFrZS0+YmxvY2sgPSBibG9jazsKKworCXJldHVybiAxOworfQorCisvKiBSZWxlYXNlIHRoZSBjYXJkIHN0b3JhZ2UgYXNzb2NpYXRlZCB3aXRoIGJ1ZjoKKyAqLworc3RhdGljIHZvaWQKK2ZyZWVfYmxvY2soZHJtX2ludGVsX2J1Zm1ncl9mYWtlICpidWZtZ3JfZmFrZSwgc3RydWN0IGJsb2NrICpibG9jaywKKwkgICBpbnQgc2tpcF9kaXJ0eV9jb3B5KQoreworCWRybV9pbnRlbF9ib19mYWtlICpib19mYWtlOworCURCRygiZnJlZSBibG9jayAlcCAlMDh4ICVkICVkXG4iLCBibG9jaywgYmxvY2stPm1lbS0+b2ZzLAorCSAgICBibG9jay0+b25faGFyZHdhcmUsIGJsb2NrLT5mZW5jZWQpOworCisJaWYgKCFibG9jaykKKwkJcmV0dXJuOworCisJYm9fZmFrZSA9IChkcm1faW50ZWxfYm9fZmFrZSAqKSBibG9jay0+Ym87CisKKwlpZiAoYm9fZmFrZS0+ZmxhZ3MgJiAoQk1fUElOTkVEIHwgQk1fTk9fQkFDS0lOR19TVE9SRSkpCisJCXNraXBfZGlydHlfY29weSA9IDE7CisKKwlpZiAoIXNraXBfZGlydHlfY29weSAmJiAoYm9fZmFrZS0+Y2FyZF9kaXJ0eSA9PSAxKSkgeworCQltZW1jcHkoYm9fZmFrZS0+YmFja2luZ19zdG9yZSwgYmxvY2stPnZpcnR1YWwsIGJsb2NrLT5iby0+c2l6ZSk7CisJCWJvX2Zha2UtPmNhcmRfZGlydHkgPSAwOworCQlib19mYWtlLT5kaXJ0eSA9IDE7CisJfQorCisJaWYgKGJsb2NrLT5vbl9oYXJkd2FyZSkgeworCQlibG9jay0+Ym8gPSBOVUxMOworCX0gZWxzZSBpZiAoYmxvY2stPmZlbmNlZCkgeworCQlibG9jay0+Ym8gPSBOVUxMOworCX0gZWxzZSB7CisJCURCRygiICAgIC0gZnJlZSBpbW1lZGlhdGVseVxuIik7CisJCURSTUxJU1RERUwoYmxvY2spOworCisJCW1tRnJlZU1lbShibG9jay0+bWVtKTsKKwkJZnJlZShibG9jayk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWxsb2NfYmFja2luZ19zdG9yZShkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9idWZtZ3JfZmFrZSAqYnVmbWdyX2Zha2UgPQorCSAgICAoZHJtX2ludGVsX2J1Zm1ncl9mYWtlICopIGJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2Zha2UgKmJvX2Zha2UgPSAoZHJtX2ludGVsX2JvX2Zha2UgKikgYm87CisJYXNzZXJ0KCFib19mYWtlLT5iYWNraW5nX3N0b3JlKTsKKwlhc3NlcnQoIShib19mYWtlLT5mbGFncyAmIChCTV9QSU5ORUQgfCBCTV9OT19CQUNLSU5HX1NUT1JFKSkpOworCisJYm9fZmFrZS0+YmFja2luZ19zdG9yZSA9IG1hbGxvYyhiby0+c2l6ZSk7CisKKwlEQkcoImFsbG9jX2JhY2tpbmcgLSBidWYgJWQgJXAgJWx1XG4iLCBib19mYWtlLT5pZCwKKwkgICAgYm9fZmFrZS0+YmFja2luZ19zdG9yZSwgYm8tPnNpemUpOworCWFzc2VydChib19mYWtlLT5iYWNraW5nX3N0b3JlKTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfYmFja2luZ19zdG9yZShkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9ib19mYWtlICpib19mYWtlID0gKGRybV9pbnRlbF9ib19mYWtlICopIGJvOworCisJaWYgKGJvX2Zha2UtPmJhY2tpbmdfc3RvcmUpIHsKKwkJYXNzZXJ0KCEoYm9fZmFrZS0+ZmxhZ3MgJiAoQk1fUElOTkVEIHwgQk1fTk9fQkFDS0lOR19TVE9SRSkpKTsKKwkJZnJlZShib19mYWtlLT5iYWNraW5nX3N0b3JlKTsKKwkJYm9fZmFrZS0+YmFja2luZ19zdG9yZSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZAorc2V0X2RpcnR5KGRybV9pbnRlbF9ibyAqYm8pCit7CisJZHJtX2ludGVsX2J1Zm1ncl9mYWtlICpidWZtZ3JfZmFrZSA9CisJICAgIChkcm1faW50ZWxfYnVmbWdyX2Zha2UgKikgYm8tPmJ1Zm1ncjsKKwlkcm1faW50ZWxfYm9fZmFrZSAqYm9fZmFrZSA9IChkcm1faW50ZWxfYm9fZmFrZSAqKSBibzsKKworCWlmIChib19mYWtlLT5mbGFncyAmIEJNX05PX0JBQ0tJTkdfU1RPUkUKKwkgICAgJiYgYm9fZmFrZS0+aW52YWxpZGF0ZV9jYiAhPSBOVUxMKQorCQlib19mYWtlLT5pbnZhbGlkYXRlX2NiKGJvLCBib19mYWtlLT5pbnZhbGlkYXRlX3B0cik7CisKKwlhc3NlcnQoIShib19mYWtlLT5mbGFncyAmIEJNX1BJTk5FRCkpOworCisJREJHKCJzZXRfZGlydHkgLSBidWYgJWRcbiIsIGJvX2Zha2UtPmlkKTsKKwlib19mYWtlLT5kaXJ0eSA9IDE7Cit9CisKK3N0YXRpYyBpbnQKK2V2aWN0X2xydShkcm1faW50ZWxfYnVmbWdyX2Zha2UgKmJ1Zm1ncl9mYWtlLCB1bnNpZ25lZCBpbnQgbWF4X2ZlbmNlKQoreworCXN0cnVjdCBibG9jayAqYmxvY2ssICp0bXA7CisKKwlEQkcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlEUk1MSVNURk9SRUFDSFNBRkUoYmxvY2ssIHRtcCwgJmJ1Zm1ncl9mYWtlLT5scnUpIHsKKwkJZHJtX2ludGVsX2JvX2Zha2UgKmJvX2Zha2UgPSAoZHJtX2ludGVsX2JvX2Zha2UgKikgYmxvY2stPmJvOworCisJCWlmIChib19mYWtlICE9IE5VTEwgJiYgKGJvX2Zha2UtPmZsYWdzICYgQk1fTk9fRkVOQ0VfU1VCREFUQSkpCisJCQljb250aW51ZTsKKworCQlpZiAoYmxvY2stPmZlbmNlICYmIG1heF9mZW5jZSAmJiAhRkVOQ0VfTFRFKGJsb2NrLT5mZW5jZSwKKwkJCQkJCQkgICAgbWF4X2ZlbmNlKSkKKwkJCXJldHVybiAwOworCisJCXNldF9kaXJ0eSgmYm9fZmFrZS0+Ym8pOworCQlib19mYWtlLT5ibG9jayA9IE5VTEw7CisKKwkJZnJlZV9ibG9jayhidWZtZ3JfZmFrZSwgYmxvY2ssIDApOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZXZpY3RfbXJ1KGRybV9pbnRlbF9idWZtZ3JfZmFrZSAqYnVmbWdyX2Zha2UpCit7CisJc3RydWN0IGJsb2NrICpibG9jaywgKnRtcDsKKworCURCRygiJXNcbiIsIF9fZnVuY19fKTsKKworCURSTUxJU1RGT1JFQUNIU0FGRVJFVkVSU0UoYmxvY2ssIHRtcCwgJmJ1Zm1ncl9mYWtlLT5scnUpIHsKKwkJZHJtX2ludGVsX2JvX2Zha2UgKmJvX2Zha2UgPSAoZHJtX2ludGVsX2JvX2Zha2UgKikgYmxvY2stPmJvOworCisJCWlmIChib19mYWtlICYmIChib19mYWtlLT5mbGFncyAmIEJNX05PX0ZFTkNFX1NVQkRBVEEpKQorCQkJY29udGludWU7CisKKwkJc2V0X2RpcnR5KCZib19mYWtlLT5ibyk7CisJCWJvX2Zha2UtPmJsb2NrID0gTlVMTDsKKworCQlmcmVlX2Jsb2NrKGJ1Zm1ncl9mYWtlLCBibG9jaywgMCk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIFJlbW92ZXMgYWxsIG9iamVjdHMgZnJvbSB0aGUgZmVuY2VkIGxpc3Qgb2xkZXIgdGhhbiB0aGUgZ2l2ZW4gZmVuY2UuCisgKi8KK3N0YXRpYyBpbnQKK2NsZWFyX2ZlbmNlZChkcm1faW50ZWxfYnVmbWdyX2Zha2UgKmJ1Zm1ncl9mYWtlLCB1bnNpZ25lZCBpbnQgZmVuY2VfY29va2llKQoreworCXN0cnVjdCBibG9jayAqYmxvY2ssICp0bXA7CisJaW50IHJldCA9IDA7CisKKwlidWZtZ3JfZmFrZS0+bGFzdF9mZW5jZSA9IGZlbmNlX2Nvb2tpZTsKKwlEUk1MSVNURk9SRUFDSFNBRkUoYmxvY2ssIHRtcCwgJmJ1Zm1ncl9mYWtlLT5mZW5jZWQpIHsKKwkJYXNzZXJ0KGJsb2NrLT5mZW5jZWQpOworCisJCWlmIChfZmVuY2VfdGVzdChidWZtZ3JfZmFrZSwgYmxvY2stPmZlbmNlKSkgeworCisJCQlibG9jay0+ZmVuY2VkID0gMDsKKworCQkJaWYgKCFibG9jay0+Ym8pIHsKKwkJCQlEQkcoImRlbGF5ZWQgZnJlZTogb2Zmc2V0ICV4IHN6ICV4XG4iLAorCQkJCSAgICBibG9jay0+bWVtLT5vZnMsIGJsb2NrLT5tZW0tPnNpemUpOworCQkJCURSTUxJU1RERUwoYmxvY2spOworCQkJCW1tRnJlZU1lbShibG9jay0+bWVtKTsKKwkJCQlmcmVlKGJsb2NrKTsKKwkJCX0gZWxzZSB7CisJCQkJREJHKCJyZXR1cm4gdG8gbHJ1OiBvZmZzZXQgJXggc3ogJXhcbiIsCisJCQkJICAgIGJsb2NrLT5tZW0tPm9mcywgYmxvY2stPm1lbS0+c2l6ZSk7CisJCQkJRFJNTElTVERFTChibG9jayk7CisJCQkJRFJNTElTVEFERFRBSUwoYmxvY2ssICZidWZtZ3JfZmFrZS0+bHJ1KTsKKwkJCX0KKworCQkJcmV0ID0gMTsKKwkJfSBlbHNlIHsKKwkJCS8qIEJsb2NrcyBhcmUgb3JkZXJlZCBieSBmZW5jZSwgc28gaWYgb25lIGZhaWxzLCBhbGwKKwkJCSAqIGZyb20gaGVyZSB3aWxsIGZhaWwgYWxzbzoKKwkJCSAqLworCQkJREJHKCJmZW5jZSBub3QgcGFzc2VkOiBvZmZzZXQgJXggc3ogJXggJWQgJWQgXG4iLAorCQkJICAgIGJsb2NrLT5tZW0tPm9mcywgYmxvY2stPm1lbS0+c2l6ZSwgYmxvY2stPmZlbmNlLAorCQkJICAgIGJ1Zm1ncl9mYWtlLT5sYXN0X2ZlbmNlKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJREJHKCIlczogJWRcbiIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitmZW5jZV9ibG9ja3MoZHJtX2ludGVsX2J1Zm1ncl9mYWtlICpidWZtZ3JfZmFrZSwgdW5zaWduZWQgZmVuY2UpCit7CisJc3RydWN0IGJsb2NrICpibG9jaywgKnRtcDsKKworCURSTUxJU1RGT1JFQUNIU0FGRShibG9jaywgdG1wLCAmYnVmbWdyX2Zha2UtPm9uX2hhcmR3YXJlKSB7CisJCURCRygiRmVuY2UgYmxvY2sgJXAgKHN6IDB4JXggb2ZzICV4IGJ1ZiAlcCkgd2l0aCBmZW5jZSAlZFxuIiwKKwkJICAgIGJsb2NrLCBibG9jay0+bWVtLT5zaXplLCBibG9jay0+bWVtLT5vZnMsIGJsb2NrLT5ibywgZmVuY2UpOworCQlibG9jay0+ZmVuY2UgPSBmZW5jZTsKKworCQlibG9jay0+b25faGFyZHdhcmUgPSAwOworCQlibG9jay0+ZmVuY2VkID0gMTsKKworCQkvKiBNb3ZlIHRvIHRhaWwgb2YgcGVuZGluZyBsaXN0IGhlcmUKKwkJICovCisJCURSTUxJU1RERUwoYmxvY2spOworCQlEUk1MSVNUQUREVEFJTChibG9jaywgJmJ1Zm1ncl9mYWtlLT5mZW5jZWQpOworCX0KKworCWFzc2VydChEUk1MSVNURU1QVFkoJmJ1Zm1ncl9mYWtlLT5vbl9oYXJkd2FyZSkpOworfQorCitzdGF0aWMgaW50CitldmljdF9hbmRfYWxsb2NfYmxvY2soZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2Zha2UgKmJ1Zm1ncl9mYWtlID0KKwkgICAgKGRybV9pbnRlbF9idWZtZ3JfZmFrZSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19mYWtlICpib19mYWtlID0gKGRybV9pbnRlbF9ib19mYWtlICopIGJvOworCisJYXNzZXJ0KGJvX2Zha2UtPmJsb2NrID09IE5VTEwpOworCisJLyogU2VhcmNoIGZvciBhbHJlYWR5IGZyZWUgbWVtb3J5OgorCSAqLworCWlmIChhbGxvY19ibG9jayhibykpCisJCXJldHVybiAxOworCisJLyogSWYgd2UncmUgbm90IHRocmFzaGluZywgYWxsb3cgbHJ1IGV2aWN0aW9uIHRvIGRpZyBkZWVwZXIgaW50bworCSAqIHJlY2VudGx5IHVzZWQgdGV4dHVyZXMuICBXZSdsbCBwcm9iYWJseSBiZSB0aHJhc2hpbmcgc29vbjoKKwkgKi8KKwlpZiAoIWJ1Zm1ncl9mYWtlLT50aHJhc2hpbmcpIHsKKwkJd2hpbGUgKGV2aWN0X2xydShidWZtZ3JfZmFrZSwgMCkpCisJCQlpZiAoYWxsb2NfYmxvY2soYm8pKQorCQkJCXJldHVybiAxOworCX0KKworCS8qIEtlZXAgdGhyYXNoaW5nIGNvdW50ZXIgYWxpdmU/CisJICovCisJaWYgKGJ1Zm1ncl9mYWtlLT50aHJhc2hpbmcpCisJCWJ1Zm1ncl9mYWtlLT50aHJhc2hpbmcgPSAyMDsKKworCS8qIFdhaXQgb24gYW55IGFscmVhZHkgcGVuZGluZyBmZW5jZXMgLSBoZXJlIHdlIGFyZSB3YWl0aW5nIGZvciBhbnkKKwkgKiBmcmVlZCBtZW1vcnkgdGhhdCBoYXMgYmVlbiBzdWJtaXR0ZWQgdG8gaGFyZHdhcmUgYW5kIGZlbmNlZCB0bworCSAqIGJlY29tZSBhdmFpbGFibGU6CisJICovCisJd2hpbGUgKCFEUk1MSVNURU1QVFkoJmJ1Zm1ncl9mYWtlLT5mZW5jZWQpKSB7CisJCXVpbnQzMl90IGZlbmNlID0gYnVmbWdyX2Zha2UtPmZlbmNlZC5uZXh0LT5mZW5jZTsKKwkJX2ZlbmNlX3dhaXRfaW50ZXJuYWwoYnVmbWdyX2Zha2UsIGZlbmNlKTsKKworCQlpZiAoYWxsb2NfYmxvY2soYm8pKQorCQkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFEUk1MSVNURU1QVFkoJmJ1Zm1ncl9mYWtlLT5vbl9oYXJkd2FyZSkpIHsKKwkJd2hpbGUgKCFEUk1MSVNURU1QVFkoJmJ1Zm1ncl9mYWtlLT5mZW5jZWQpKSB7CisJCQl1aW50MzJfdCBmZW5jZSA9IGJ1Zm1ncl9mYWtlLT5mZW5jZWQubmV4dC0+ZmVuY2U7CisJCQlfZmVuY2Vfd2FpdF9pbnRlcm5hbChidWZtZ3JfZmFrZSwgZmVuY2UpOworCQl9CisKKwkJaWYgKCFidWZtZ3JfZmFrZS0+dGhyYXNoaW5nKSB7CisJCQlEQkcoInRocmFzaGluZ1xuIik7CisJCX0KKwkJYnVmbWdyX2Zha2UtPnRocmFzaGluZyA9IDIwOworCisJCWlmIChhbGxvY19ibG9jayhibykpCisJCQlyZXR1cm4gMTsKKwl9CisKKwl3aGlsZSAoZXZpY3RfbXJ1KGJ1Zm1ncl9mYWtlKSkKKwkJaWYgKGFsbG9jX2Jsb2NrKGJvKSkKKwkJCXJldHVybiAxOworCisJREJHKCIlcyAweCVseCBieXRlcyBmYWlsZWRcbiIsIF9fZnVuY19fLCBiby0+c2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQdWJsaWMgZnVuY3Rpb25zCisgKi8KKworLyoqCisgKiBXYWl0IGZvciBoYXJkd2FyZSBpZGxlIGJ5IGVtaXR0aW5nIGEgZmVuY2UgYW5kIHdhaXRpbmcgZm9yIGl0LgorICovCitzdGF0aWMgdm9pZAorZHJtX2ludGVsX2J1Zm1ncl9mYWtlX3dhaXRfaWRsZShkcm1faW50ZWxfYnVmbWdyX2Zha2UgKmJ1Zm1ncl9mYWtlKQoreworCXVuc2lnbmVkIGludCBjb29raWU7CisKKwljb29raWUgPSBfZmVuY2VfZW1pdF9pbnRlcm5hbChidWZtZ3JfZmFrZSk7CisJX2ZlbmNlX3dhaXRfaW50ZXJuYWwoYnVmbWdyX2Zha2UsIGNvb2tpZSk7Cit9CisKKy8qKgorICogV2FpdCBmb3IgcmVuZGVyaW5nIHRvIGEgYnVmZmVyIHRvIGNvbXBsZXRlLgorICoKKyAqIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgYmF0Y2hidWZmZXIgd2hpY2ggcGVyZm9ybWVkIHRoZSByZW5kZXJpbmcgaW5jbHVkZWQKKyAqIHRoZSBuZWNlc3NhcnkgZmx1c2hpbmcuCisgKi8KK3N0YXRpYyB2b2lkCitkcm1faW50ZWxfZmFrZV9ib193YWl0X3JlbmRlcmluZ19sb2NrZWQoZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2Zha2UgKmJ1Zm1ncl9mYWtlID0KKwkgICAgKGRybV9pbnRlbF9idWZtZ3JfZmFrZSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19mYWtlICpib19mYWtlID0gKGRybV9pbnRlbF9ib19mYWtlICopIGJvOworCisJaWYgKGJvX2Zha2UtPmJsb2NrID09IE5VTEwgfHwgIWJvX2Zha2UtPmJsb2NrLT5mZW5jZWQpCisJCXJldHVybjsKKworCV9mZW5jZV93YWl0X2ludGVybmFsKGJ1Zm1ncl9mYWtlLCBib19mYWtlLT5ibG9jay0+ZmVuY2UpOworfQorCitzdGF0aWMgdm9pZAorZHJtX2ludGVsX2Zha2VfYm9fd2FpdF9yZW5kZXJpbmcoZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2Zha2UgKmJ1Zm1ncl9mYWtlID0KKwkgICAgKGRybV9pbnRlbF9idWZtZ3JfZmFrZSAqKSBiby0+YnVmbWdyOworCisJcHRocmVhZF9tdXRleF9sb2NrKCZidWZtZ3JfZmFrZS0+bG9jayk7CisJZHJtX2ludGVsX2Zha2VfYm9fd2FpdF9yZW5kZXJpbmdfbG9ja2VkKGJvKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2Zha2UtPmxvY2spOworfQorCisvKiBTcGVjaWZpY2FsbHkgaWdub3JlIHRleHR1cmUgbWVtb3J5IHNoYXJpbmcuCisgKiAgLS0ganVzdCBldmljdCBldmVyeXRoaW5nCisgKiAgLS0gYW5kIHdhaXQgZm9yIGlkbGUKKyAqLwordm9pZAorZHJtX2ludGVsX2J1Zm1ncl9mYWtlX2NvbnRlbmRlZF9sb2NrX3Rha2UoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyKQoreworCWRybV9pbnRlbF9idWZtZ3JfZmFrZSAqYnVmbWdyX2Zha2UgPSAoZHJtX2ludGVsX2J1Zm1ncl9mYWtlICopIGJ1Zm1ncjsKKwlzdHJ1Y3QgYmxvY2sgKmJsb2NrLCAqdG1wOworCisJcHRocmVhZF9tdXRleF9sb2NrKCZidWZtZ3JfZmFrZS0+bG9jayk7CisKKwlidWZtZ3JfZmFrZS0+bmVlZF9mZW5jZSA9IDE7CisJYnVmbWdyX2Zha2UtPmZhaWwgPSAwOworCisJLyogV2FpdCBmb3IgaGFyZHdhcmUgaWRsZS4gIFdlIGRvbid0IGtub3cgd2hlcmUgYWNjZWxlcmF0aW9uIGhhcyBiZWVuCisJICogaGFwcGVuaW5nLCBzbyB3ZSdsbCBuZWVkIHRvIHdhaXQgYW55d2F5IGJlZm9yZSBsZXR0aW5nIGFueXRoaW5nIGdldAorCSAqIHB1dCBvbiB0aGUgY2FyZCBhZ2Fpbi4KKwkgKi8KKwlkcm1faW50ZWxfYnVmbWdyX2Zha2Vfd2FpdF9pZGxlKGJ1Zm1ncl9mYWtlKTsKKworCS8qIENoZWNrIHRoYXQgd2UgaGFkbid0IHJlbGVhc2VkIHRoZSBsb2NrIHdpdGhvdXQgaGF2aW5nIGZlbmNlZCB0aGUgbGFzdAorCSAqIHNldCBvZiBidWZmZXJzLgorCSAqLworCWFzc2VydChEUk1MSVNURU1QVFkoJmJ1Zm1ncl9mYWtlLT5mZW5jZWQpKTsKKwlhc3NlcnQoRFJNTElTVEVNUFRZKCZidWZtZ3JfZmFrZS0+b25faGFyZHdhcmUpKTsKKworCURSTUxJU1RGT1JFQUNIU0FGRShibG9jaywgdG1wLCAmYnVmbWdyX2Zha2UtPmxydSkgeworCQlhc3NlcnQoX2ZlbmNlX3Rlc3QoYnVmbWdyX2Zha2UsIGJsb2NrLT5mZW5jZSkpOworCQlzZXRfZGlydHkoYmxvY2stPmJvKTsKKwl9CisKKwlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2Zha2UtPmxvY2spOworfQorCitzdGF0aWMgZHJtX2ludGVsX2JvICoKK2RybV9pbnRlbF9mYWtlX2JvX2FsbG9jKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKKwkJCWNvbnN0IGNoYXIgKm5hbWUsCisJCQl1bnNpZ25lZCBsb25nIHNpemUsCisJCQl1bnNpZ25lZCBpbnQgYWxpZ25tZW50KQoreworCWRybV9pbnRlbF9idWZtZ3JfZmFrZSAqYnVmbWdyX2Zha2U7CisJZHJtX2ludGVsX2JvX2Zha2UgKmJvX2Zha2U7CisKKwlidWZtZ3JfZmFrZSA9IChkcm1faW50ZWxfYnVmbWdyX2Zha2UgKikgYnVmbWdyOworCisJYXNzZXJ0KHNpemUgIT0gMCk7CisKKwlib19mYWtlID0gY2FsbG9jKDEsIHNpemVvZigqYm9fZmFrZSkpOworCWlmICghYm9fZmFrZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlib19mYWtlLT5iby5zaXplID0gc2l6ZTsKKwlib19mYWtlLT5iby5vZmZzZXQgPSAtMTsKKwlib19mYWtlLT5iby52aXJ0dWFsID0gTlVMTDsKKwlib19mYWtlLT5iby5idWZtZ3IgPSBidWZtZ3I7CisJYm9fZmFrZS0+cmVmY291bnQgPSAxOworCisJLyogQWxpZ25tZW50IG11c3QgYmUgYSBwb3dlciBvZiB0d28gKi8KKwlhc3NlcnQoKGFsaWdubWVudCAmIChhbGlnbm1lbnQgLSAxKSkgPT0gMCk7CisJaWYgKGFsaWdubWVudCA9PSAwKQorCQlhbGlnbm1lbnQgPSAxOworCWJvX2Zha2UtPmFsaWdubWVudCA9IGFsaWdubWVudDsKKwlib19mYWtlLT5pZCA9ICsrYnVmbWdyX2Zha2UtPmJ1Zl9ucjsKKwlib19mYWtlLT5uYW1lID0gbmFtZTsKKwlib19mYWtlLT5mbGFncyA9IDA7CisJYm9fZmFrZS0+aXNfc3RhdGljID0gMDsKKworCURCRygiZHJtX2JvX2FsbG9jOiAoYnVmICVkOiAlcywgJWx1IGtiKVxuIiwgYm9fZmFrZS0+aWQsIGJvX2Zha2UtPm5hbWUsCisJICAgIGJvX2Zha2UtPmJvLnNpemUgLyAxMDI0KTsKKworCXJldHVybiAmYm9fZmFrZS0+Ym87Cit9CisKK3N0YXRpYyBkcm1faW50ZWxfYm8gKgorZHJtX2ludGVsX2Zha2VfYm9fYWxsb2NfdGlsZWQoZHJtX2ludGVsX2J1Zm1nciAqIGJ1Zm1nciwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgICBpbnQgeCwgaW50IHksIGludCBjcHAsCisJCQkgICAgICB1aW50MzJfdCAqdGlsaW5nX21vZGUsCisJCQkgICAgICB1bnNpZ25lZCBsb25nICpwaXRjaCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJdW5zaWduZWQgbG9uZyBzdHJpZGUsIGFsaWduZWRfeTsKKworCS8qIE5vIHJ1bnRpbWUgdGlsaW5nIHN1cHBvcnQgZm9yIGZha2UuICovCisJKnRpbGluZ19tb2RlID0gSTkxNV9USUxJTkdfTk9ORTsKKworCS8qIEFsaWduIGl0IGZvciBiZWluZyBhIHJlbmRlciB0YXJnZXQuICBTaG91bGRuJ3QgbmVlZCBhbnl0aGluZyBlbHNlLiAqLworCXN0cmlkZSA9IHggKiBjcHA7CisJc3RyaWRlID0gUk9VTkRfVVBfVE8oc3RyaWRlLCA2NCk7CisKKwkvKiA5NjUgc3Vic3BhbiBsb2FkaW5nIGFsaWdubWVudCAqLworCWFsaWduZWRfeSA9IEFMSUdOKHksIDIpOworCisJKnBpdGNoID0gc3RyaWRlOworCisJcmV0dXJuIGRybV9pbnRlbF9mYWtlX2JvX2FsbG9jKGJ1Zm1nciwgbmFtZSwgc3RyaWRlICogYWxpZ25lZF95LAorCQkJCSAgICAgICA0MDk2KTsKK30KKworZHJtX2ludGVsX2JvICoKK2RybV9pbnRlbF9ib19mYWtlX2FsbG9jX3N0YXRpYyhkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHZvaWQgKnZpcnR1YWwpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9mYWtlICpidWZtZ3JfZmFrZTsKKwlkcm1faW50ZWxfYm9fZmFrZSAqYm9fZmFrZTsKKworCWJ1Zm1ncl9mYWtlID0gKGRybV9pbnRlbF9idWZtZ3JfZmFrZSAqKSBidWZtZ3I7CisKKwlhc3NlcnQoc2l6ZSAhPSAwKTsKKworCWJvX2Zha2UgPSBjYWxsb2MoMSwgc2l6ZW9mKCpib19mYWtlKSk7CisJaWYgKCFib19mYWtlKQorCQlyZXR1cm4gTlVMTDsKKworCWJvX2Zha2UtPmJvLnNpemUgPSBzaXplOworCWJvX2Zha2UtPmJvLm9mZnNldCA9IG9mZnNldDsKKwlib19mYWtlLT5iby52aXJ0dWFsID0gdmlydHVhbDsKKwlib19mYWtlLT5iby5idWZtZ3IgPSBidWZtZ3I7CisJYm9fZmFrZS0+cmVmY291bnQgPSAxOworCWJvX2Zha2UtPmlkID0gKytidWZtZ3JfZmFrZS0+YnVmX25yOworCWJvX2Zha2UtPm5hbWUgPSBuYW1lOworCWJvX2Zha2UtPmZsYWdzID0gQk1fUElOTkVEOworCWJvX2Zha2UtPmlzX3N0YXRpYyA9IDE7CisKKwlEQkcoImRybV9ib19hbGxvY19zdGF0aWM6IChidWYgJWQ6ICVzLCAlbHUga2IpXG4iLCBib19mYWtlLT5pZCwKKwkgICAgYm9fZmFrZS0+bmFtZSwgYm9fZmFrZS0+Ym8uc2l6ZSAvIDEwMjQpOworCisJcmV0dXJuICZib19mYWtlLT5ibzsKK30KKworc3RhdGljIHZvaWQKK2RybV9pbnRlbF9mYWtlX2JvX3JlZmVyZW5jZShkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9idWZtZ3JfZmFrZSAqYnVmbWdyX2Zha2UgPQorCSAgICAoZHJtX2ludGVsX2J1Zm1ncl9mYWtlICopIGJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2Zha2UgKmJvX2Zha2UgPSAoZHJtX2ludGVsX2JvX2Zha2UgKikgYm87CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9mYWtlLT5sb2NrKTsKKwlib19mYWtlLT5yZWZjb3VudCsrOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZmFrZS0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCitkcm1faW50ZWxfZmFrZV9ib19yZWZlcmVuY2VfbG9ja2VkKGRybV9pbnRlbF9ibyAqYm8pCit7CisJZHJtX2ludGVsX2JvX2Zha2UgKmJvX2Zha2UgPSAoZHJtX2ludGVsX2JvX2Zha2UgKikgYm87CisKKwlib19mYWtlLT5yZWZjb3VudCsrOworfQorCitzdGF0aWMgdm9pZAorZHJtX2ludGVsX2Zha2VfYm9fdW5yZWZlcmVuY2VfbG9ja2VkKGRybV9pbnRlbF9ibyAqYm8pCit7CisJZHJtX2ludGVsX2J1Zm1ncl9mYWtlICpidWZtZ3JfZmFrZSA9CisJICAgIChkcm1faW50ZWxfYnVmbWdyX2Zha2UgKikgYm8tPmJ1Zm1ncjsKKwlkcm1faW50ZWxfYm9fZmFrZSAqYm9fZmFrZSA9IChkcm1faW50ZWxfYm9fZmFrZSAqKSBibzsKKwlpbnQgaTsKKworCWlmICgtLWJvX2Zha2UtPnJlZmNvdW50ID09IDApIHsKKwkJYXNzZXJ0KGJvX2Zha2UtPm1hcF9jb3VudCA9PSAwKTsKKwkJLyogTm8gcmVtYWluaW5nIHJlZmVyZW5jZXMsIHNvIGZyZWUgaXQgKi8KKwkJaWYgKGJvX2Zha2UtPmJsb2NrKQorCQkJZnJlZV9ibG9jayhidWZtZ3JfZmFrZSwgYm9fZmFrZS0+YmxvY2ssIDEpOworCQlmcmVlX2JhY2tpbmdfc3RvcmUoYm8pOworCisJCWZvciAoaSA9IDA7IGkgPCBib19mYWtlLT5ucl9yZWxvY3M7IGkrKykKKwkJCWRybV9pbnRlbF9mYWtlX2JvX3VucmVmZXJlbmNlX2xvY2tlZChib19mYWtlLT5yZWxvY3NbaV0uCisJCQkJCQkJICAgICB0YXJnZXRfYnVmKTsKKworCQlEQkcoImRybV9ib191bnJlZmVyZW5jZTogZnJlZSBidWYgJWQgJXNcbiIsIGJvX2Zha2UtPmlkLAorCQkgICAgYm9fZmFrZS0+bmFtZSk7CisKKwkJZnJlZShib19mYWtlLT5yZWxvY3MpOworCQlmcmVlKGJvKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitkcm1faW50ZWxfZmFrZV9ib191bnJlZmVyZW5jZShkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9idWZtZ3JfZmFrZSAqYnVmbWdyX2Zha2UgPQorCSAgICAoZHJtX2ludGVsX2J1Zm1ncl9mYWtlICopIGJvLT5idWZtZ3I7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9mYWtlLT5sb2NrKTsKKwlkcm1faW50ZWxfZmFrZV9ib191bnJlZmVyZW5jZV9sb2NrZWQoYm8pOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZmFrZS0+bG9jayk7Cit9CisKKy8qKgorICogU2V0IHRoZSBidWZmZXIgYXMgbm90IHJlcXVpcmluZyBiYWNraW5nIHN0b3JlLCBhbmQgaW5zdGVhZCBnZXQgdGhlIGNhbGxiYWNrCisgKiBpbnZva2VkIHdoZW5ldmVyIGl0IHdvdWxkIGJlIHNldCBkaXJ0eS4KKyAqLwordm9pZAorZHJtX2ludGVsX2JvX2Zha2VfZGlzYWJsZV9iYWNraW5nX3N0b3JlKGRybV9pbnRlbF9ibyAqYm8sCisJCQkJCXZvaWQgKCppbnZhbGlkYXRlX2NiKSAoZHJtX2ludGVsX2JvICpibywKKwkJCQkJCQkgICAgICAgdm9pZCAqcHRyKSwKKwkJCQkJdm9pZCAqcHRyKQoreworCWRybV9pbnRlbF9idWZtZ3JfZmFrZSAqYnVmbWdyX2Zha2UgPQorCSAgICAoZHJtX2ludGVsX2J1Zm1ncl9mYWtlICopIGJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2Zha2UgKmJvX2Zha2UgPSAoZHJtX2ludGVsX2JvX2Zha2UgKikgYm87CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9mYWtlLT5sb2NrKTsKKworCWlmIChib19mYWtlLT5iYWNraW5nX3N0b3JlKQorCQlmcmVlX2JhY2tpbmdfc3RvcmUoYm8pOworCisJYm9fZmFrZS0+ZmxhZ3MgfD0gQk1fTk9fQkFDS0lOR19TVE9SRTsKKworCURCRygiZGlzYWJsZV9iYWNraW5nX3N0b3JlIHNldCBidWYgJWQgZGlydHlcbiIsIGJvX2Zha2UtPmlkKTsKKwlib19mYWtlLT5kaXJ0eSA9IDE7CisJYm9fZmFrZS0+aW52YWxpZGF0ZV9jYiA9IGludmFsaWRhdGVfY2I7CisJYm9fZmFrZS0+aW52YWxpZGF0ZV9wdHIgPSBwdHI7CisKKwkvKiBOb3RlIHRoYXQgaXQgaXMgaW52YWxpZCByaWdodCBmcm9tIHRoZSBzdGFydC4gIEFsc28gbm90ZQorCSAqIGludmFsaWRhdGVfY2IgaXMgY2FsbGVkIHdpdGggdGhlIGJ1Zm1nciBsb2NrZWQsIHNvIGNhbm5vdAorCSAqIGl0c2VsZiBtYWtlIGJ1Zm1nciBjYWxscy4KKwkgKi8KKwlpZiAoaW52YWxpZGF0ZV9jYiAhPSBOVUxMKQorCQlpbnZhbGlkYXRlX2NiKGJvLCBwdHIpOworCisJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9mYWtlLT5sb2NrKTsKK30KKworLyoqCisgKiBNYXAgYSBidWZmZXIgaW50byBiby0+dmlydHVhbCwgYWxsb2NhdGluZyBlaXRoZXIgY2FyZCBtZW1vcnkgc3BhY2UgKElmCisgKiBCTV9OT19CQUNLSU5HX1NUT1JFIG9yIEJNX1BJTk5FRCkgb3IgYmFja2luZyBzdG9yZSwgYXMgbmVjZXNzYXJ5LgorICovCitzdGF0aWMgaW50CisgZHJtX2ludGVsX2Zha2VfYm9fbWFwX2xvY2tlZChkcm1faW50ZWxfYm8gKmJvLCBpbnQgd3JpdGVfZW5hYmxlKQoreworCWRybV9pbnRlbF9idWZtZ3JfZmFrZSAqYnVmbWdyX2Zha2UgPQorCSAgICAoZHJtX2ludGVsX2J1Zm1ncl9mYWtlICopIGJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2Zha2UgKmJvX2Zha2UgPSAoZHJtX2ludGVsX2JvX2Zha2UgKikgYm87CisKKwkvKiBTdGF0aWMgYnVmZmVycyBhcmUgYWx3YXlzIG1hcHBlZC4gKi8KKwlpZiAoYm9fZmFrZS0+aXNfc3RhdGljKSB7CisJCWlmIChib19mYWtlLT5jYXJkX2RpcnR5KSB7CisJCQlkcm1faW50ZWxfYnVmbWdyX2Zha2Vfd2FpdF9pZGxlKGJ1Zm1ncl9mYWtlKTsKKwkJCWJvX2Zha2UtPmNhcmRfZGlydHkgPSAwOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qIEFsbG93IHJlY3Vyc2l2ZSBtYXBwaW5nLiAgTWVzYSBtYXkgcmVjdXJzaXZlbHkgbWFwIGJ1ZmZlcnMgd2l0aAorCSAqIG5lc3RlZCBkaXNwbGF5IGxvb3BzLCBhbmQgaXQgaXMgdXNlZCBpbnRlcm5hbGx5IGluIGJ1Zm1ncl9mYWtlCisJICogZm9yIHJlbG9jYXRpb24uCisJICovCisJaWYgKGJvX2Zha2UtPm1hcF9jb3VudCsrICE9IDApCisJCXJldHVybiAwOworCisJeworCQlEQkcoImRybV9ib19tYXA6IChidWYgJWQ6ICVzLCAlbHUga2IpXG4iLCBib19mYWtlLT5pZCwKKwkJICAgIGJvX2Zha2UtPm5hbWUsIGJvX2Zha2UtPmJvLnNpemUgLyAxMDI0KTsKKworCQlpZiAoYm8tPnZpcnR1YWwgIT0gTlVMTCkgeworCQkJZHJtTXNnKCIlczogYWxyZWFkeSBtYXBwZWRcbiIsIF9fZnVuY19fKTsKKwkJCWFib3J0KCk7CisJCX0gZWxzZSBpZiAoYm9fZmFrZS0+ZmxhZ3MgJiAoQk1fTk9fQkFDS0lOR19TVE9SRSB8IEJNX1BJTk5FRCkpIHsKKworCQkJaWYgKCFib19mYWtlLT5ibG9jayAmJiAhZXZpY3RfYW5kX2FsbG9jX2Jsb2NrKGJvKSkgeworCQkJCURCRygiJXM6IGFsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJCWJ1Zm1ncl9mYWtlLT5mYWlsID0gMTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0gZWxzZSB7CisJCQkJYXNzZXJ0KGJvX2Zha2UtPmJsb2NrKTsKKwkJCQlib19mYWtlLT5kaXJ0eSA9IDA7CisKKwkJCQlpZiAoIShib19mYWtlLT5mbGFncyAmIEJNX05PX0ZFTkNFX1NVQkRBVEEpICYmCisJCQkJICAgIGJvX2Zha2UtPmJsb2NrLT5mZW5jZWQpIHsKKwkJCQkJZHJtX2ludGVsX2Zha2VfYm9fd2FpdF9yZW5kZXJpbmdfbG9ja2VkCisJCQkJCSAgICAoYm8pOworCQkJCX0KKworCQkJCWJvLT52aXJ0dWFsID0gYm9fZmFrZS0+YmxvY2stPnZpcnR1YWw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAod3JpdGVfZW5hYmxlKQorCQkJCXNldF9kaXJ0eShibyk7CisKKwkJCWlmIChib19mYWtlLT5iYWNraW5nX3N0b3JlID09IDApCisJCQkJYWxsb2NfYmFja2luZ19zdG9yZShibyk7CisKKwkJCWlmICgoYm9fZmFrZS0+Y2FyZF9kaXJ0eSA9PSAxKSAmJiBib19mYWtlLT5ibG9jaykgeworCQkJCWlmIChib19mYWtlLT5ibG9jay0+ZmVuY2VkKQorCQkJCQlkcm1faW50ZWxfZmFrZV9ib193YWl0X3JlbmRlcmluZ19sb2NrZWQKKwkJCQkJICAgIChibyk7CisKKwkJCQltZW1jcHkoYm9fZmFrZS0+YmFja2luZ19zdG9yZSwKKwkJCQkgICAgICAgYm9fZmFrZS0+YmxvY2stPnZpcnR1YWwsCisJCQkJICAgICAgIGJvX2Zha2UtPmJsb2NrLT5iby0+c2l6ZSk7CisJCQkJYm9fZmFrZS0+Y2FyZF9kaXJ0eSA9IDA7CisJCQl9CisKKwkJCWJvLT52aXJ0dWFsID0gYm9fZmFrZS0+YmFja2luZ19zdG9yZTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CisgZHJtX2ludGVsX2Zha2VfYm9fbWFwKGRybV9pbnRlbF9ibyAqYm8sIGludCB3cml0ZV9lbmFibGUpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9mYWtlICpidWZtZ3JfZmFrZSA9CisJICAgIChkcm1faW50ZWxfYnVmbWdyX2Zha2UgKikgYm8tPmJ1Zm1ncjsKKwlpbnQgcmV0OworCisJcHRocmVhZF9tdXRleF9sb2NrKCZidWZtZ3JfZmFrZS0+bG9jayk7CisJcmV0ID0gZHJtX2ludGVsX2Zha2VfYm9fbWFwX2xvY2tlZChibywgd3JpdGVfZW5hYmxlKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2Zha2UtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorIGRybV9pbnRlbF9mYWtlX2JvX3VubWFwX2xvY2tlZChkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9idWZtZ3JfZmFrZSAqYnVmbWdyX2Zha2UgPQorCSAgICAoZHJtX2ludGVsX2J1Zm1ncl9mYWtlICopIGJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2Zha2UgKmJvX2Zha2UgPSAoZHJtX2ludGVsX2JvX2Zha2UgKikgYm87CisKKwkvKiBTdGF0aWMgYnVmZmVycyBhcmUgYWx3YXlzIG1hcHBlZC4gKi8KKwlpZiAoYm9fZmFrZS0+aXNfc3RhdGljKQorCQlyZXR1cm4gMDsKKworCWFzc2VydChib19mYWtlLT5tYXBfY291bnQgIT0gMCk7CisJaWYgKC0tYm9fZmFrZS0+bWFwX2NvdW50ICE9IDApCisJCXJldHVybiAwOworCisJREJHKCJkcm1fYm9fdW5tYXA6IChidWYgJWQ6ICVzLCAlbHUga2IpXG4iLCBib19mYWtlLT5pZCwgYm9fZmFrZS0+bmFtZSwKKwkgICAgYm9fZmFrZS0+Ym8uc2l6ZSAvIDEwMjQpOworCisJYm8tPnZpcnR1YWwgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJtX2ludGVsX2Zha2VfYm9fdW5tYXAoZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2Zha2UgKmJ1Zm1ncl9mYWtlID0KKwkgICAgKGRybV9pbnRlbF9idWZtZ3JfZmFrZSAqKSBiby0+YnVmbWdyOworCWludCByZXQ7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9mYWtlLT5sb2NrKTsKKwlyZXQgPSBkcm1faW50ZWxfZmFrZV9ib191bm1hcF9sb2NrZWQoYm8pOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZmFrZS0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZmFrZV9ib19zdWJkYXRhKGRybV9pbnRlbF9ibyAqYm8sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJICB1bnNpZ25lZCBsb25nIHNpemUsIGNvbnN0IHZvaWQgKmRhdGEpCit7CisJaW50IHJldDsKKworCWlmIChzaXplID09IDAgfHwgZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGRybV9pbnRlbF9ib19tYXAoYm8sIDEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopYm8tPnZpcnR1YWwgKyBvZmZzZXQsIGRhdGEsIHNpemUpOworCWRybV9pbnRlbF9ib191bm1hcChibyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCisgZHJtX2ludGVsX2Zha2Vfa2lja19hbGxfbG9ja2VkKGRybV9pbnRlbF9idWZtZ3JfZmFrZSAqYnVmbWdyX2Zha2UpCit7CisJc3RydWN0IGJsb2NrICpibG9jaywgKnRtcDsKKworCWJ1Zm1ncl9mYWtlLT5wZXJmb3JtZWRfcmVuZGVyaW5nID0gMDsKKwkvKiBva2F5IGZvciBldmVyIEJPIHRoYXQgaXMgb24gdGhlIEhXIGtpY2sgaXQgb2ZmLgorCSAgIHNlcmlvdXNseSBub3QgYWZyYWlkIG9mIHRoZSBQT0xJQ0UgcmlnaHQgbm93ICovCisJRFJNTElTVEZPUkVBQ0hTQUZFKGJsb2NrLCB0bXAsICZidWZtZ3JfZmFrZS0+b25faGFyZHdhcmUpIHsKKwkJZHJtX2ludGVsX2JvX2Zha2UgKmJvX2Zha2UgPSAoZHJtX2ludGVsX2JvX2Zha2UgKikgYmxvY2stPmJvOworCisJCWJsb2NrLT5vbl9oYXJkd2FyZSA9IDA7CisJCWZyZWVfYmxvY2soYnVmbWdyX2Zha2UsIGJsb2NrLCAwKTsKKwkJYm9fZmFrZS0+YmxvY2sgPSBOVUxMOworCQlib19mYWtlLT52YWxpZGF0ZWQgPSAwOworCQlpZiAoIShib19mYWtlLT5mbGFncyAmIEJNX05PX0JBQ0tJTkdfU1RPUkUpKQorCQkJYm9fZmFrZS0+ZGlydHkgPSAxOworCX0KKworfQorCitzdGF0aWMgaW50CisgZHJtX2ludGVsX2Zha2VfYm9fdmFsaWRhdGUoZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2Zha2UgKmJ1Zm1ncl9mYWtlOworCWRybV9pbnRlbF9ib19mYWtlICpib19mYWtlID0gKGRybV9pbnRlbF9ib19mYWtlICopIGJvOworCisJYnVmbWdyX2Zha2UgPSAoZHJtX2ludGVsX2J1Zm1ncl9mYWtlICopIGJvLT5idWZtZ3I7CisKKwlEQkcoImRybV9ib192YWxpZGF0ZTogKGJ1ZiAlZDogJXMsICVsdSBrYilcbiIsIGJvX2Zha2UtPmlkLAorCSAgICBib19mYWtlLT5uYW1lLCBib19mYWtlLT5iby5zaXplIC8gMTAyNCk7CisKKwkvKiBTYW5pdHkgY2hlY2s6IEJ1ZmZlcnMgc2hvdWxkIGJlIHVubWFwcGVkIGJlZm9yZSBiZWluZyB2YWxpZGF0ZWQuCisJICogVGhpcyBpcyBub3Qgc28gbXVjaCBvZiBhIHByb2JsZW0gZm9yIGJ1Zm1ncl9mYWtlLCBidXQgVFRNIHJlZnVzZXMsCisJICogYW5kIHRoZSBwcm9ibGVtIGlzIGhhcmRlciB0byBkZWJ1ZyB0aGVyZS4KKwkgKi8KKwlhc3NlcnQoYm9fZmFrZS0+bWFwX2NvdW50ID09IDApOworCisJaWYgKGJvX2Zha2UtPmlzX3N0YXRpYykgeworCQkvKiBBZGQgaXQgdG8gdGhlIG5lZWRzLWZlbmNlIGxpc3QgKi8KKwkJYnVmbWdyX2Zha2UtPm5lZWRfZmVuY2UgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBBbGxvY2F0ZSB0aGUgY2FyZCBtZW1vcnkgKi8KKwlpZiAoIWJvX2Zha2UtPmJsb2NrICYmICFldmljdF9hbmRfYWxsb2NfYmxvY2soYm8pKSB7CisJCWJ1Zm1ncl9mYWtlLT5mYWlsID0gMTsKKwkJREJHKCJGYWlsZWQgdG8gdmFsaWRhdGUgYnVmICVkOiVzXG4iLCBib19mYWtlLT5pZCwKKwkJICAgIGJvX2Zha2UtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJYXNzZXJ0KGJvX2Zha2UtPmJsb2NrKTsKKwlhc3NlcnQoYm9fZmFrZS0+YmxvY2stPmJvID09ICZib19mYWtlLT5ibyk7CisKKwliby0+b2Zmc2V0ID0gYm9fZmFrZS0+YmxvY2stPm1lbS0+b2ZzOworCisJLyogVXBsb2FkIHRoZSBidWZmZXIgY29udGVudHMgaWYgbmVjZXNzYXJ5ICovCisJaWYgKGJvX2Zha2UtPmRpcnR5KSB7CisJCURCRygiVXBsb2FkIGRpcnR5IGJ1ZiAlZDolcywgc3ogJWx1IG9mZnNldCAweCV4XG4iLCBib19mYWtlLT5pZCwKKwkJICAgIGJvX2Zha2UtPm5hbWUsIGJvLT5zaXplLCBib19mYWtlLT5ibG9jay0+bWVtLT5vZnMpOworCisJCWFzc2VydCghKGJvX2Zha2UtPmZsYWdzICYgKEJNX05PX0JBQ0tJTkdfU1RPUkUgfCBCTV9QSU5ORUQpKSk7CisKKwkJLyogQWN0dWFsbHksIHNob3VsZCBiZSBhYmxlIHRvIGp1c3Qgd2FpdCBmb3IgYSBmZW5jZSBvbiB0aGUKKwkJICogbWVtb3J5LCB3aGljaCB3ZSB3b3VsZCBiZSB0cmFja2luZyB3aGVuIHdlIGZyZWUgaXQuIFdhaXRpbmcKKwkJICogZm9yIGlkbGUgaXMgYSBzdWZmaWNpZW50bHkgbGFyZ2UgaGFtbWVyIGZvciBub3cuCisJCSAqLworCQlkcm1faW50ZWxfYnVmbWdyX2Zha2Vfd2FpdF9pZGxlKGJ1Zm1ncl9mYWtlKTsKKworCQkvKiB3ZSBtYXkgbmV2ZXIgaGF2ZSBtYXBwZWQgdGhpcyBCTyBzbyBpdCBtaWdodCBub3QgaGF2ZSBhbnkKKwkJICogYmFja2luZyBzdG9yZSBpZiB0aGlzIGhhcHBlbnMgaXQgc2hvdWxkIGJlIHJhcmUsIGJ1dCAwIHRoZQorCQkgKiBjYXJkIG1lbW9yeSBpbiBhbnkgY2FzZSAqLworCQlpZiAoYm9fZmFrZS0+YmFja2luZ19zdG9yZSkKKwkJCW1lbWNweShib19mYWtlLT5ibG9jay0+dmlydHVhbCwgYm9fZmFrZS0+YmFja2luZ19zdG9yZSwKKwkJCSAgICAgICBiby0+c2l6ZSk7CisJCWVsc2UKKwkJCW1lbXNldChib19mYWtlLT5ibG9jay0+dmlydHVhbCwgMCwgYm8tPnNpemUpOworCisJCWJvX2Zha2UtPmRpcnR5ID0gMDsKKwl9CisKKwlib19mYWtlLT5ibG9jay0+ZmVuY2VkID0gMDsKKwlib19mYWtlLT5ibG9jay0+b25faGFyZHdhcmUgPSAxOworCURSTUxJU1RERUwoYm9fZmFrZS0+YmxvY2spOworCURSTUxJU1RBRERUQUlMKGJvX2Zha2UtPmJsb2NrLCAmYnVmbWdyX2Zha2UtPm9uX2hhcmR3YXJlKTsKKworCWJvX2Zha2UtPnZhbGlkYXRlZCA9IDE7CisJYnVmbWdyX2Zha2UtPm5lZWRfZmVuY2UgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitkcm1faW50ZWxfZmFrZV9mZW5jZV92YWxpZGF0ZWQoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyKQoreworCWRybV9pbnRlbF9idWZtZ3JfZmFrZSAqYnVmbWdyX2Zha2UgPSAoZHJtX2ludGVsX2J1Zm1ncl9mYWtlICopIGJ1Zm1ncjsKKwl1bnNpZ25lZCBpbnQgY29va2llOworCisJY29va2llID0gX2ZlbmNlX2VtaXRfaW50ZXJuYWwoYnVmbWdyX2Zha2UpOworCWZlbmNlX2Jsb2NrcyhidWZtZ3JfZmFrZSwgY29va2llKTsKKworCURCRygiZHJtX2ZlbmNlX3ZhbGlkYXRlZDogMHglMDh4IGNvb2tpZVxuIiwgY29va2llKTsKK30KKworc3RhdGljIHZvaWQKK2RybV9pbnRlbF9mYWtlX2Rlc3Ryb3koZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyKQoreworCWRybV9pbnRlbF9idWZtZ3JfZmFrZSAqYnVmbWdyX2Zha2UgPSAoZHJtX2ludGVsX2J1Zm1ncl9mYWtlICopIGJ1Zm1ncjsKKworCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmYnVmbWdyX2Zha2UtPmxvY2spOworCW1tRGVzdHJveShidWZtZ3JfZmFrZS0+aGVhcCk7CisJZnJlZShidWZtZ3IpOworfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZmFrZV9lbWl0X3JlbG9jKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90IG9mZnNldCwKKwkJCSAgZHJtX2ludGVsX2JvICp0YXJnZXRfYm8sIHVpbnQzMl90IHRhcmdldF9vZmZzZXQsCisJCQkgIHVpbnQzMl90IHJlYWRfZG9tYWlucywgdWludDMyX3Qgd3JpdGVfZG9tYWluKQoreworCWRybV9pbnRlbF9idWZtZ3JfZmFrZSAqYnVmbWdyX2Zha2UgPQorCSAgICAoZHJtX2ludGVsX2J1Zm1ncl9mYWtlICopIGJvLT5idWZtZ3I7CisJc3RydWN0IGZha2VfYnVmZmVyX3JlbG9jICpyOworCWRybV9pbnRlbF9ib19mYWtlICpib19mYWtlID0gKGRybV9pbnRlbF9ib19mYWtlICopIGJvOworCWRybV9pbnRlbF9ib19mYWtlICp0YXJnZXRfZmFrZSA9IChkcm1faW50ZWxfYm9fZmFrZSAqKSB0YXJnZXRfYm87CisJaW50IGk7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9mYWtlLT5sb2NrKTsKKworCWFzc2VydChibyk7CisJYXNzZXJ0KHRhcmdldF9ibyk7CisKKwlpZiAoYm9fZmFrZS0+cmVsb2NzID09IE5VTEwpIHsKKwkJYm9fZmFrZS0+cmVsb2NzID0KKwkJICAgIG1hbGxvYyhzaXplb2Yoc3RydWN0IGZha2VfYnVmZmVyX3JlbG9jKSAqIE1BWF9SRUxPQ1MpOworCX0KKworCXIgPSAmYm9fZmFrZS0+cmVsb2NzW2JvX2Zha2UtPm5yX3JlbG9jcysrXTsKKworCWFzc2VydChib19mYWtlLT5ucl9yZWxvY3MgPD0gTUFYX1JFTE9DUyk7CisKKwlkcm1faW50ZWxfZmFrZV9ib19yZWZlcmVuY2VfbG9ja2VkKHRhcmdldF9ibyk7CisKKwlpZiAoIXRhcmdldF9mYWtlLT5pc19zdGF0aWMpIHsKKwkJYm9fZmFrZS0+Y2hpbGRfc2l6ZSArPQorCQkgICAgQUxJR04odGFyZ2V0X2JvLT5zaXplLCB0YXJnZXRfZmFrZS0+YWxpZ25tZW50KTsKKwkJYm9fZmFrZS0+Y2hpbGRfc2l6ZSArPSB0YXJnZXRfZmFrZS0+Y2hpbGRfc2l6ZTsKKwl9CisJci0+dGFyZ2V0X2J1ZiA9IHRhcmdldF9ibzsKKwlyLT5vZmZzZXQgPSBvZmZzZXQ7CisJci0+bGFzdF90YXJnZXRfb2Zmc2V0ID0gdGFyZ2V0X2JvLT5vZmZzZXQ7CisJci0+ZGVsdGEgPSB0YXJnZXRfb2Zmc2V0OworCXItPnJlYWRfZG9tYWlucyA9IHJlYWRfZG9tYWluczsKKwlyLT53cml0ZV9kb21haW4gPSB3cml0ZV9kb21haW47CisKKwlpZiAoYnVmbWdyX2Zha2UtPmRlYnVnKSB7CisJCS8qIENoZWNrIHRoYXQgYSBjb25mbGljdGluZyByZWxvY2F0aW9uIGhhc24ndCBhbHJlYWR5IGJlZW4KKwkJICogZW1pdHRlZC4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBib19mYWtlLT5ucl9yZWxvY3MgLSAxOyBpKyspIHsKKwkJCXN0cnVjdCBmYWtlX2J1ZmZlcl9yZWxvYyAqcjIgPSAmYm9fZmFrZS0+cmVsb2NzW2ldOworCisJCQlhc3NlcnQoci0+b2Zmc2V0ICE9IHIyLT5vZmZzZXQpOworCQl9CisJfQorCisJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9mYWtlLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIEluY29ycG9yYXRlcyB0aGUgdmFsaWRhdGlvbiBmbGFncyBhc3NvY2lhdGVkIHdpdGggZWFjaCByZWxvY2F0aW9uIGludG8KKyAqIHRoZSBjb21iaW5lZCB2YWxpZGF0aW9uIGZsYWdzIGZvciB0aGUgYnVmZmVyIG9uIHRoaXMgYmF0Y2hidWZmZXIgc3VibWlzc2lvbi4KKyAqLworc3RhdGljIHZvaWQKK2RybV9pbnRlbF9mYWtlX2NhbGN1bGF0ZV9kb21haW5zKGRybV9pbnRlbF9ibyAqYm8pCit7CisJZHJtX2ludGVsX2JvX2Zha2UgKmJvX2Zha2UgPSAoZHJtX2ludGVsX2JvX2Zha2UgKikgYm87CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYm9fZmFrZS0+bnJfcmVsb2NzOyBpKyspIHsKKwkJc3RydWN0IGZha2VfYnVmZmVyX3JlbG9jICpyID0gJmJvX2Zha2UtPnJlbG9jc1tpXTsKKwkJZHJtX2ludGVsX2JvX2Zha2UgKnRhcmdldF9mYWtlID0KKwkJICAgIChkcm1faW50ZWxfYm9fZmFrZSAqKSByLT50YXJnZXRfYnVmOworCisJCS8qIERvIHRoZSBzYW1lIGZvciB0aGUgdHJlZSBvZiBidWZmZXJzIHdlIGRlcGVuZCBvbiAqLworCQlkcm1faW50ZWxfZmFrZV9jYWxjdWxhdGVfZG9tYWlucyhyLT50YXJnZXRfYnVmKTsKKworCQl0YXJnZXRfZmFrZS0+cmVhZF9kb21haW5zIHw9IHItPnJlYWRfZG9tYWluczsKKwkJdGFyZ2V0X2Zha2UtPndyaXRlX2RvbWFpbiB8PSByLT53cml0ZV9kb21haW47CisJfQorfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZmFrZV9yZWxvY19hbmRfdmFsaWRhdGVfYnVmZmVyKGRybV9pbnRlbF9ibyAqYm8pCit7CisJZHJtX2ludGVsX2J1Zm1ncl9mYWtlICpidWZtZ3JfZmFrZSA9CisJICAgIChkcm1faW50ZWxfYnVmbWdyX2Zha2UgKikgYm8tPmJ1Zm1ncjsKKwlkcm1faW50ZWxfYm9fZmFrZSAqYm9fZmFrZSA9IChkcm1faW50ZWxfYm9fZmFrZSAqKSBibzsKKwlpbnQgaSwgcmV0OworCisJYXNzZXJ0KGJvX2Zha2UtPm1hcF9jb3VudCA9PSAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBib19mYWtlLT5ucl9yZWxvY3M7IGkrKykgeworCQlzdHJ1Y3QgZmFrZV9idWZmZXJfcmVsb2MgKnIgPSAmYm9fZmFrZS0+cmVsb2NzW2ldOworCQlkcm1faW50ZWxfYm9fZmFrZSAqdGFyZ2V0X2Zha2UgPQorCQkgICAgKGRybV9pbnRlbF9ib19mYWtlICopIHItPnRhcmdldF9idWY7CisJCXVpbnQzMl90IHJlbG9jX2RhdGE7CisKKwkJLyogVmFsaWRhdGUgdGhlIHRhcmdldCBidWZmZXIgaWYgdGhhdCBoYXNuJ3QgYmVlbiBkb25lLiAqLworCQlpZiAoIXRhcmdldF9mYWtlLT52YWxpZGF0ZWQpIHsKKwkJCXJldCA9CisJCQkgICAgZHJtX2ludGVsX2Zha2VfcmVsb2NfYW5kX3ZhbGlkYXRlX2J1ZmZlcihyLT50YXJnZXRfYnVmKTsKKwkJCWlmIChyZXQgIT0gMCkgeworCQkJCWlmIChiby0+dmlydHVhbCAhPSBOVUxMKQorCQkJCQlkcm1faW50ZWxfZmFrZV9ib191bm1hcF9sb2NrZWQoYm8pOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKworCQkvKiBDYWxjdWxhdGUgdGhlIHZhbHVlIG9mIHRoZSByZWxvY2F0aW9uIGVudHJ5LiAqLworCQlpZiAoci0+dGFyZ2V0X2J1Zi0+b2Zmc2V0ICE9IHItPmxhc3RfdGFyZ2V0X29mZnNldCkgeworCQkJcmVsb2NfZGF0YSA9IHItPnRhcmdldF9idWYtPm9mZnNldCArIHItPmRlbHRhOworCisJCQlpZiAoYm8tPnZpcnR1YWwgPT0gTlVMTCkKKwkJCQlkcm1faW50ZWxfZmFrZV9ib19tYXBfbG9ja2VkKGJvLCAxKTsKKworCQkJKih1aW50MzJfdCAqKSAoKHVpbnQ4X3QgKikgYm8tPnZpcnR1YWwgKyByLT5vZmZzZXQpID0KKwkJCSAgICByZWxvY19kYXRhOworCisJCQlyLT5sYXN0X3RhcmdldF9vZmZzZXQgPSByLT50YXJnZXRfYnVmLT5vZmZzZXQ7CisJCX0KKwl9CisKKwlpZiAoYm8tPnZpcnR1YWwgIT0gTlVMTCkKKwkJZHJtX2ludGVsX2Zha2VfYm9fdW5tYXBfbG9ja2VkKGJvKTsKKworCWlmIChib19mYWtlLT53cml0ZV9kb21haW4gIT0gMCkgeworCQlpZiAoIShib19mYWtlLT5mbGFncyAmIChCTV9OT19CQUNLSU5HX1NUT1JFIHwgQk1fUElOTkVEKSkpIHsKKwkJCWlmIChib19mYWtlLT5iYWNraW5nX3N0b3JlID09IDApCisJCQkJYWxsb2NfYmFja2luZ19zdG9yZShibyk7CisJCX0KKwkJYm9fZmFrZS0+Y2FyZF9kaXJ0eSA9IDE7CisJCWJ1Zm1ncl9mYWtlLT5wZXJmb3JtZWRfcmVuZGVyaW5nID0gMTsKKwl9CisKKwlyZXR1cm4gZHJtX2ludGVsX2Zha2VfYm9fdmFsaWRhdGUoYm8pOworfQorCitzdGF0aWMgdm9pZAorZHJtX2ludGVsX2JvX2Zha2VfcG9zdF9zdWJtaXQoZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2Zha2UgKmJ1Zm1ncl9mYWtlID0KKwkgICAgKGRybV9pbnRlbF9idWZtZ3JfZmFrZSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19mYWtlICpib19mYWtlID0gKGRybV9pbnRlbF9ib19mYWtlICopIGJvOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGJvX2Zha2UtPm5yX3JlbG9jczsgaSsrKSB7CisJCXN0cnVjdCBmYWtlX2J1ZmZlcl9yZWxvYyAqciA9ICZib19mYWtlLT5yZWxvY3NbaV07CisJCWRybV9pbnRlbF9ib19mYWtlICp0YXJnZXRfZmFrZSA9CisJCSAgICAoZHJtX2ludGVsX2JvX2Zha2UgKikgci0+dGFyZ2V0X2J1ZjsKKworCQlpZiAodGFyZ2V0X2Zha2UtPnZhbGlkYXRlZCkKKwkJCWRybV9pbnRlbF9ib19mYWtlX3Bvc3Rfc3VibWl0KHItPnRhcmdldF9idWYpOworCisJCURCRygiJXNAMHglMDh4ICsgMHglMDh4IC0+ICVzQDB4JTA4eCArIDB4JTA4eFxuIiwKKwkJICAgIGJvX2Zha2UtPm5hbWUsICh1aW50MzJfdCkgYm8tPm9mZnNldCwgci0+b2Zmc2V0LAorCQkgICAgdGFyZ2V0X2Zha2UtPm5hbWUsICh1aW50MzJfdCkgci0+dGFyZ2V0X2J1Zi0+b2Zmc2V0LAorCQkgICAgci0+ZGVsdGEpOworCX0KKworCWFzc2VydChib19mYWtlLT5tYXBfY291bnQgPT0gMCk7CisJYm9fZmFrZS0+dmFsaWRhdGVkID0gMDsKKwlib19mYWtlLT5yZWFkX2RvbWFpbnMgPSAwOworCWJvX2Zha2UtPndyaXRlX2RvbWFpbiA9IDA7Cit9CisKK3ZvaWQKK2RybV9pbnRlbF9idWZtZ3JfZmFrZV9zZXRfZXhlY19jYWxsYmFjayhkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCQkJCSAgICAgaW50ICgqZXhlYykgKGRybV9pbnRlbF9ibyAqYm8sCisJCQkJCQkJICB1bnNpZ25lZCBpbnQgdXNlZCwKKwkJCQkJCQkgIHZvaWQgKnByaXYpLAorCQkJCQkgICAgIHZvaWQgKnByaXYpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9mYWtlICpidWZtZ3JfZmFrZSA9IChkcm1faW50ZWxfYnVmbWdyX2Zha2UgKikgYnVmbWdyOworCisJYnVmbWdyX2Zha2UtPmV4ZWMgPSBleGVjOworCWJ1Zm1ncl9mYWtlLT5leGVjX3ByaXYgPSBwcml2OworfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZmFrZV9ib19leGVjKGRybV9pbnRlbF9ibyAqYm8sIGludCB1c2VkLAorCQkgICAgICAgZHJtX2NsaXBfcmVjdF90ICogY2xpcHJlY3RzLCBpbnQgbnVtX2NsaXByZWN0cywgaW50IERSNCkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2Zha2UgKmJ1Zm1ncl9mYWtlID0KKwkgICAgKGRybV9pbnRlbF9idWZtZ3JfZmFrZSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19mYWtlICpiYXRjaF9mYWtlID0gKGRybV9pbnRlbF9ib19mYWtlICopIGJvOworCXN0cnVjdCBkcm1faTkxNV9iYXRjaGJ1ZmZlciBiYXRjaDsKKwlpbnQgcmV0OworCWludCByZXRyeV9jb3VudCA9IDA7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9mYWtlLT5sb2NrKTsKKworCWJ1Zm1ncl9mYWtlLT5wZXJmb3JtZWRfcmVuZGVyaW5nID0gMDsKKworCWRybV9pbnRlbF9mYWtlX2NhbGN1bGF0ZV9kb21haW5zKGJvKTsKKworCWJhdGNoX2Zha2UtPnJlYWRfZG9tYWlucyA9IEk5MTVfR0VNX0RPTUFJTl9DT01NQU5EOworCisJLyogd2UndmUgcmFuIG91dCBvZiBSQU0gc28gYmxvdyB0aGUgd2hvbGUgbG90IGF3YXkgYW5kIHJldHJ5ICovCityZXN0YXJ0OgorCXJldCA9IGRybV9pbnRlbF9mYWtlX3JlbG9jX2FuZF92YWxpZGF0ZV9idWZmZXIoYm8pOworCWlmIChidWZtZ3JfZmFrZS0+ZmFpbCA9PSAxKSB7CisJCWlmIChyZXRyeV9jb3VudCA9PSAwKSB7CisJCQlyZXRyeV9jb3VudCsrOworCQkJZHJtX2ludGVsX2Zha2Vfa2lja19hbGxfbG9ja2VkKGJ1Zm1ncl9mYWtlKTsKKwkJCWJ1Zm1ncl9mYWtlLT5mYWlsID0gMDsKKwkJCWdvdG8gcmVzdGFydDsKKwkJfSBlbHNlCQkvKiBkdW1wIG91dCB0aGUgbWVtb3J5IGhlcmUgKi8KKwkJCW1tRHVtcE1lbUluZm8oYnVmbWdyX2Zha2UtPmhlYXApOworCX0KKworCWFzc2VydChyZXQgPT0gMCk7CisKKwlpZiAoYnVmbWdyX2Zha2UtPmV4ZWMgIT0gTlVMTCkgeworCQlyZXQgPSBidWZtZ3JfZmFrZS0+ZXhlYyhibywgdXNlZCwgYnVmbWdyX2Zha2UtPmV4ZWNfcHJpdik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9mYWtlLT5sb2NrKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgeworCQliYXRjaC5zdGFydCA9IGJvLT5vZmZzZXQ7CisJCWJhdGNoLnVzZWQgPSB1c2VkOworCQliYXRjaC5jbGlwcmVjdHMgPSBjbGlwcmVjdHM7CisJCWJhdGNoLm51bV9jbGlwcmVjdHMgPSBudW1fY2xpcHJlY3RzOworCQliYXRjaC5EUjEgPSAwOworCQliYXRjaC5EUjQgPSBEUjQ7CisKKwkJaWYgKGRybUNvbW1hbmRXcml0ZQorCQkgICAgKGJ1Zm1ncl9mYWtlLT5mZCwgRFJNX0k5MTVfQkFUQ0hCVUZGRVIsICZiYXRjaCwKKwkJICAgICBzaXplb2YoYmF0Y2gpKSkgeworCQkJZHJtTXNnKCJEUk1fSTkxNV9CQVRDSEJVRkZFUjogJWRcbiIsIC1lcnJubyk7CisJCQlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2Zha2UtPmxvY2spOworCQkJcmV0dXJuIC1lcnJubzsKKwkJfQorCX0KKworCWRybV9pbnRlbF9mYWtlX2ZlbmNlX3ZhbGlkYXRlZChiby0+YnVmbWdyKTsKKworCWRybV9pbnRlbF9ib19mYWtlX3Bvc3Rfc3VibWl0KGJvKTsKKworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZmFrZS0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBSZXR1cm4gYW4gZXJyb3IgaWYgdGhlIGxpc3Qgb2YgQk9zIHdpbGwgZXhjZWVkIHRoZSBhcGVydHVyZSBzaXplLgorICoKKyAqIFRoaXMgaXMgYSByb3VnaCBndWVzcyBhbmQgbGlrZWx5IHRvIGZhaWwsIGFzIGR1cmluZyB0aGUgdmFsaWRhdGUgc2VxdWVuY2Ugd2UKKyAqIG1heSBwbGFjZSBhIGJ1ZmZlciBpbiBhbiBpbm9wcG9ydHVuZSBzcG90IGVhcmx5IG9uIGFuZCB0aGVuIGZhaWwgdG8gZml0CisgKiBhIHNldCBzbWFsbGVyIHRoYW4gdGhlIGFwZXJ0dXJlLgorICovCitzdGF0aWMgaW50Citkcm1faW50ZWxfZmFrZV9jaGVja19hcGVydHVyZV9zcGFjZShkcm1faW50ZWxfYm8gKiogYm9fYXJyYXksIGludCBjb3VudCkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2Zha2UgKmJ1Zm1ncl9mYWtlID0KKwkgICAgKGRybV9pbnRlbF9idWZtZ3JfZmFrZSAqKSBib19hcnJheVswXS0+YnVmbWdyOworCXVuc2lnbmVkIGludCBzeiA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlkcm1faW50ZWxfYm9fZmFrZSAqYm9fZmFrZSA9IChkcm1faW50ZWxfYm9fZmFrZSAqKSBib19hcnJheVtpXTsKKworCQlpZiAoYm9fZmFrZSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJaWYgKCFib19mYWtlLT5pc19zdGF0aWMpCisJCQlzeiArPSBBTElHTihib19hcnJheVtpXS0+c2l6ZSwgYm9fZmFrZS0+YWxpZ25tZW50KTsKKwkJc3ogKz0gYm9fZmFrZS0+Y2hpbGRfc2l6ZTsKKwl9CisKKwlpZiAoc3ogPiBidWZtZ3JfZmFrZS0+c2l6ZSkgeworCQlEQkcoImNoZWNrX3NwYWNlOiBvdmVyZmxvd2VkIGJ1Zm1nciBzaXplLCAldWtiIHZzICVsdWtiXG4iLAorCQkgICAgc3ogLyAxMDI0LCBidWZtZ3JfZmFrZS0+c2l6ZSAvIDEwMjQpOworCQlyZXR1cm4gLTE7CisJfQorCisJREJHKCJkcm1fY2hlY2tfc3BhY2U6IHN6ICV1a2IgdnMgYnVmZ3IgJWx1a2JcbiIsIHN6IC8gMTAyNCwKKwkgICAgYnVmbWdyX2Zha2UtPnNpemUgLyAxMDI0KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBFdmljdHMgYWxsIGJ1ZmZlcnMsIHdhaXRpbmcgZm9yIGZlbmNlcyB0byBwYXNzIGFuZCBjb3B5aW5nIGNvbnRlbnRzIG91dAorICogYXMgbmVjZXNzYXJ5LgorICoKKyAqIFVzZWQgYnkgdGhlIFggU2VydmVyIG9uIExlYXZlVlQsIHdoZW4gdGhlIGNhcmQgbWVtb3J5IGlzIG5vIGxvbmdlciBvdXIKKyAqIG93bi4KKyAqLwordm9pZAorZHJtX2ludGVsX2J1Zm1ncl9mYWtlX2V2aWN0X2FsbChkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9mYWtlICpidWZtZ3JfZmFrZSA9IChkcm1faW50ZWxfYnVmbWdyX2Zha2UgKikgYnVmbWdyOworCXN0cnVjdCBibG9jayAqYmxvY2ssICp0bXA7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9mYWtlLT5sb2NrKTsKKworCWJ1Zm1ncl9mYWtlLT5uZWVkX2ZlbmNlID0gMTsKKwlidWZtZ3JfZmFrZS0+ZmFpbCA9IDA7CisKKwkvKiBXYWl0IGZvciBoYXJkd2FyZSBpZGxlLiAgV2UgZG9uJ3Qga25vdyB3aGVyZSBhY2NlbGVyYXRpb24gaGFzIGJlZW4KKwkgKiBoYXBwZW5pbmcsIHNvIHdlJ2xsIG5lZWQgdG8gd2FpdCBhbnl3YXkgYmVmb3JlIGxldHRpbmcgYW55dGhpbmcgZ2V0CisJICogcHV0IG9uIHRoZSBjYXJkIGFnYWluLgorCSAqLworCWRybV9pbnRlbF9idWZtZ3JfZmFrZV93YWl0X2lkbGUoYnVmbWdyX2Zha2UpOworCisJLyogQ2hlY2sgdGhhdCB3ZSBoYWRuJ3QgcmVsZWFzZWQgdGhlIGxvY2sgd2l0aG91dCBoYXZpbmcgZmVuY2VkIHRoZSBsYXN0CisJICogc2V0IG9mIGJ1ZmZlcnMuCisJICovCisJYXNzZXJ0KERSTUxJU1RFTVBUWSgmYnVmbWdyX2Zha2UtPmZlbmNlZCkpOworCWFzc2VydChEUk1MSVNURU1QVFkoJmJ1Zm1ncl9mYWtlLT5vbl9oYXJkd2FyZSkpOworCisJRFJNTElTVEZPUkVBQ0hTQUZFKGJsb2NrLCB0bXAsICZidWZtZ3JfZmFrZS0+bHJ1KSB7CisJCWRybV9pbnRlbF9ib19mYWtlICpib19mYWtlID0gKGRybV9pbnRlbF9ib19mYWtlICopIGJsb2NrLT5ibzsKKwkJLyogUmVsZWFzZXMgdGhlIG1lbW9yeSwgYW5kIG1lbWNweXMgZGlydHkgY29udGVudHMgb3V0IGlmCisJCSAqIG5lY2Vzc2FyeS4KKwkJICovCisJCWZyZWVfYmxvY2soYnVmbWdyX2Zha2UsIGJsb2NrLCAwKTsKKwkJYm9fZmFrZS0+YmxvY2sgPSBOVUxMOworCX0KKworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZmFrZS0+bG9jayk7Cit9CisKK3ZvaWQKK2RybV9pbnRlbF9idWZtZ3JfZmFrZV9zZXRfbGFzdF9kaXNwYXRjaChkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCQkJCXZvbGF0aWxlIHVuc2lnbmVkIGludAorCQkJCQkqbGFzdF9kaXNwYXRjaCkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2Zha2UgKmJ1Zm1ncl9mYWtlID0gKGRybV9pbnRlbF9idWZtZ3JfZmFrZSAqKSBidWZtZ3I7CisKKwlidWZtZ3JfZmFrZS0+bGFzdF9kaXNwYXRjaCA9ICh2b2xhdGlsZSBpbnQgKilsYXN0X2Rpc3BhdGNoOworfQorCitkcm1faW50ZWxfYnVmbWdyICoKK2RybV9pbnRlbF9idWZtZ3JfZmFrZV9pbml0KGludCBmZCwgdW5zaWduZWQgbG9uZyBsb3dfb2Zmc2V0LAorCQkJICAgdm9pZCAqbG93X3ZpcnR1YWwsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCSAgIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqbGFzdF9kaXNwYXRjaCkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2Zha2UgKmJ1Zm1ncl9mYWtlOworCisJYnVmbWdyX2Zha2UgPSBjYWxsb2MoMSwgc2l6ZW9mKCpidWZtZ3JfZmFrZSkpOworCisJaWYgKHB0aHJlYWRfbXV0ZXhfaW5pdCgmYnVmbWdyX2Zha2UtPmxvY2ssIE5VTEwpICE9IDApIHsKKwkJZnJlZShidWZtZ3JfZmFrZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEluaXRpYWxpemUgYWxsb2NhdG9yICovCisJRFJNSU5JVExJU1RIRUFEKCZidWZtZ3JfZmFrZS0+ZmVuY2VkKTsKKwlEUk1JTklUTElTVEhFQUQoJmJ1Zm1ncl9mYWtlLT5vbl9oYXJkd2FyZSk7CisJRFJNSU5JVExJU1RIRUFEKCZidWZtZ3JfZmFrZS0+bHJ1KTsKKworCWJ1Zm1ncl9mYWtlLT5sb3dfb2Zmc2V0ID0gbG93X29mZnNldDsKKwlidWZtZ3JfZmFrZS0+dmlydHVhbCA9IGxvd192aXJ0dWFsOworCWJ1Zm1ncl9mYWtlLT5zaXplID0gc2l6ZTsKKwlidWZtZ3JfZmFrZS0+aGVhcCA9IG1tSW5pdChsb3dfb2Zmc2V0LCBzaXplKTsKKworCS8qIEhvb2sgaW4gbWV0aG9kcyAqLworCWJ1Zm1ncl9mYWtlLT5idWZtZ3IuYm9fYWxsb2MgPSBkcm1faW50ZWxfZmFrZV9ib19hbGxvYzsKKwlidWZtZ3JfZmFrZS0+YnVmbWdyLmJvX2FsbG9jX2Zvcl9yZW5kZXIgPSBkcm1faW50ZWxfZmFrZV9ib19hbGxvYzsKKwlidWZtZ3JfZmFrZS0+YnVmbWdyLmJvX2FsbG9jX3RpbGVkID0gZHJtX2ludGVsX2Zha2VfYm9fYWxsb2NfdGlsZWQ7CisJYnVmbWdyX2Zha2UtPmJ1Zm1nci5ib19yZWZlcmVuY2UgPSBkcm1faW50ZWxfZmFrZV9ib19yZWZlcmVuY2U7CisJYnVmbWdyX2Zha2UtPmJ1Zm1nci5ib191bnJlZmVyZW5jZSA9IGRybV9pbnRlbF9mYWtlX2JvX3VucmVmZXJlbmNlOworCWJ1Zm1ncl9mYWtlLT5idWZtZ3IuYm9fbWFwID0gZHJtX2ludGVsX2Zha2VfYm9fbWFwOworCWJ1Zm1ncl9mYWtlLT5idWZtZ3IuYm9fdW5tYXAgPSBkcm1faW50ZWxfZmFrZV9ib191bm1hcDsKKwlidWZtZ3JfZmFrZS0+YnVmbWdyLmJvX3N1YmRhdGEgPSBkcm1faW50ZWxfZmFrZV9ib19zdWJkYXRhOworCWJ1Zm1ncl9mYWtlLT5idWZtZ3IuYm9fd2FpdF9yZW5kZXJpbmcgPQorCSAgICBkcm1faW50ZWxfZmFrZV9ib193YWl0X3JlbmRlcmluZzsKKwlidWZtZ3JfZmFrZS0+YnVmbWdyLmJvX2VtaXRfcmVsb2MgPSBkcm1faW50ZWxfZmFrZV9lbWl0X3JlbG9jOworCWJ1Zm1ncl9mYWtlLT5idWZtZ3IuZGVzdHJveSA9IGRybV9pbnRlbF9mYWtlX2Rlc3Ryb3k7CisJYnVmbWdyX2Zha2UtPmJ1Zm1nci5ib19leGVjID0gZHJtX2ludGVsX2Zha2VfYm9fZXhlYzsKKwlidWZtZ3JfZmFrZS0+YnVmbWdyLmNoZWNrX2FwZXJ0dXJlX3NwYWNlID0KKwkgICAgZHJtX2ludGVsX2Zha2VfY2hlY2tfYXBlcnR1cmVfc3BhY2U7CisJYnVmbWdyX2Zha2UtPmJ1Zm1nci5kZWJ1ZyA9IDA7CisKKwlidWZtZ3JfZmFrZS0+ZmQgPSBmZDsKKwlidWZtZ3JfZmFrZS0+bGFzdF9kaXNwYXRjaCA9ICh2b2xhdGlsZSBpbnQgKilsYXN0X2Rpc3BhdGNoOworCisJcmV0dXJuICZidWZtZ3JfZmFrZS0+YnVmbWdyOworfQpkaWZmIC0tZ2l0IGEvaW50ZWwvaW50ZWxfYnVmbWdyX2dlbS5jIGIvaW50ZWwvaW50ZWxfYnVmbWdyX2dlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZjE0MGYKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlbC9pbnRlbF9idWZtZ3JfZ2VtLmMKQEAgLTAsMCArMSwzODIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDA3IFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IKkgMjAwNy0yMDEyIEludGVsIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgMjAwNiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQmlzbWFyY2ssIE5ELiwgVVNBCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEF1dGhvcnM6IFRob21hcyBIZWxsc3Ry9m0gPHRob21hcy1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+CisgKiAgICAgICAgICBLZWl0aCBXaGl0d2VsbCA8a2VpdGh3LWF0LXR1bmdzdGVuZ3JhcGhpY3MtZG90LWNvbT4KKyAqCSAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICoJICAgIERhdmUgQWlybGllIDxhaXJsaWVkQGxpbnV4LmllPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHhmODZkcm0uaD4KKyNpbmNsdWRlIDx4Zjg2YXRvbWljLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2luY2x1ZGUgImVycm5vLmgiCisjaWZuZGVmIEVUSU1FCisjZGVmaW5lIEVUSU1FIEVUSU1FRE9VVAorI2VuZGlmCisjaW5jbHVkZSAibGliZHJtX21hY3Jvcy5oIgorI2luY2x1ZGUgImxpYmRybV9saXN0cy5oIgorI2luY2x1ZGUgImludGVsX2J1Zm1nci5oIgorI2luY2x1ZGUgImludGVsX2J1Zm1ncl9wcml2LmgiCisjaW5jbHVkZSAiaW50ZWxfY2hpcHNldC5oIgorI2luY2x1ZGUgInN0cmluZy5oIgorCisjaW5jbHVkZSAiaTkxNV9kcm0uaCIKKyNpbmNsdWRlICJ1dGhhc2guaCIKKworI2lmZGVmIEhBVkVfVkFMR1JJTkQKKyNpbmNsdWRlIDx2YWxncmluZC5oPgorI2luY2x1ZGUgPG1lbWNoZWNrLmg+CisjZGVmaW5lIFZHKHgpIHgKKyNlbHNlCisjZGVmaW5lIFZHKHgpCisjZW5kaWYKKworI2RlZmluZSBtZW1jbGVhcihzKSBtZW1zZXQoJnMsIDAsIHNpemVvZihzKSkKKworI2RlZmluZSBEQkcoLi4uKSBkbyB7CQkJCQlcCisJaWYgKGJ1Zm1ncl9nZW0tPmJ1Zm1nci5kZWJ1ZykJCQlcCisJCWZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXyk7CQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KSAvIHNpemVvZigoeClbMF0pKQorI2RlZmluZSBNQVgyKEEsIEIpICgoQSkgPiAoQikgPyAoQSkgOiAoQikpCisKKy8qKgorICogdXBwZXJfMzJfYml0cyAtIHJldHVybiBiaXRzIDMyLTYzIG9mIGEgbnVtYmVyCisgKiBAbjogdGhlIG51bWJlciB3ZSdyZSBhY2Nlc3NpbmcKKyAqCisgKiBBIGJhc2ljIHNoaWZ0LXJpZ2h0IG9mIGEgNjQtIG9yIDMyLWJpdCBxdWFudGl0eS4gIFVzZSB0aGlzIHRvIHN1cHByZXNzCisgKiB0aGUgInJpZ2h0IHNoaWZ0IGNvdW50ID49IHdpZHRoIG9mIHR5cGUiIHdhcm5pbmcgd2hlbiB0aGF0IHF1YW50aXR5IGlzCisgKiAzMi1iaXRzLgorICovCisjZGVmaW5lIHVwcGVyXzMyX2JpdHMobikgKChfX3UzMikoKChuKSA+PiAxNikgPj4gMTYpKQorCisvKioKKyAqIGxvd2VyXzMyX2JpdHMgLSByZXR1cm4gYml0cyAwLTMxIG9mIGEgbnVtYmVyCisgKiBAbjogdGhlIG51bWJlciB3ZSdyZSBhY2Nlc3NpbmcKKyAqLworI2RlZmluZSBsb3dlcl8zMl9iaXRzKG4pICgoX191MzIpKG4pKQorCit0eXBlZGVmIHN0cnVjdCBfZHJtX2ludGVsX2JvX2dlbSBkcm1faW50ZWxfYm9fZ2VtOworCitzdHJ1Y3QgZHJtX2ludGVsX2dlbV9ib19idWNrZXQgeworCWRybU1NTGlzdEhlYWQgaGVhZDsKKwl1bnNpZ25lZCBsb25nIHNpemU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX2ludGVsX2J1Zm1ncl9nZW0geworCWRybV9pbnRlbF9idWZtZ3IgYnVmbWdyOworCisJYXRvbWljX3QgcmVmY291bnQ7CisKKwlpbnQgZmQ7CisKKwlpbnQgbWF4X3JlbG9jczsKKworCXB0aHJlYWRfbXV0ZXhfdCBsb2NrOworCisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdCAqZXhlY19vYmplY3RzOworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICpleGVjMl9vYmplY3RzOworCWRybV9pbnRlbF9ibyAqKmV4ZWNfYm9zOworCWludCBleGVjX3NpemU7CisJaW50IGV4ZWNfY291bnQ7CisKKwkvKiogQXJyYXkgb2YgbGlzdHMgb2YgY2FjaGVkIGdlbSBvYmplY3RzIG9mIHBvd2VyLW9mLXR3byBzaXplcyAqLworCXN0cnVjdCBkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldCBjYWNoZV9idWNrZXRbMTQgKiA0XTsKKwlpbnQgbnVtX2J1Y2tldHM7CisJdGltZV90IHRpbWU7CisKKwlkcm1NTUxpc3RIZWFkIG1hbmFnZXJzOworCisJZHJtX2ludGVsX2JvX2dlbSAqbmFtZV90YWJsZTsKKwlkcm1faW50ZWxfYm9fZ2VtICpoYW5kbGVfdGFibGU7CisKKwlkcm1NTUxpc3RIZWFkIHZtYV9jYWNoZTsKKwlpbnQgdm1hX2NvdW50LCB2bWFfb3Blbiwgdm1hX21heDsKKworCXVpbnQ2NF90IGd0dF9zaXplOworCWludCBhdmFpbGFibGVfZmVuY2VzOworCWludCBwY2lfZGV2aWNlOworCWludCBnZW47CisJdW5zaWduZWQgaW50IGhhc19ic2QgOiAxOworCXVuc2lnbmVkIGludCBoYXNfYmx0IDogMTsKKwl1bnNpZ25lZCBpbnQgaGFzX3JlbGF4ZWRfZmVuY2luZyA6IDE7CisJdW5zaWduZWQgaW50IGhhc19sbGMgOiAxOworCXVuc2lnbmVkIGludCBoYXNfd2FpdF90aW1lb3V0IDogMTsKKwl1bnNpZ25lZCBpbnQgYm9fcmV1c2UgOiAxOworCXVuc2lnbmVkIGludCBub19leGVjIDogMTsKKwl1bnNpZ25lZCBpbnQgaGFzX3ZlYm94IDogMTsKKwl1bnNpZ25lZCBpbnQgaGFzX2V4ZWNfYXN5bmMgOiAxOworCWJvb2wgZmVuY2VkX3JlbG9jczsKKworCXN0cnVjdCB7CisJCXZvaWQgKnB0cjsKKwkJdWludDMyX3QgaGFuZGxlOworCX0gdXNlcnB0cl9hY3RpdmU7CisKK30gZHJtX2ludGVsX2J1Zm1ncl9nZW07CisKKyNkZWZpbmUgRFJNX0lOVEVMX1JFTE9DX0ZFTkNFICgxPDwwKQorCit0eXBlZGVmIHN0cnVjdCBfZHJtX2ludGVsX3JlbG9jX3RhcmdldF9pbmZvIHsKKwlkcm1faW50ZWxfYm8gKmJvOworCWludCBmbGFnczsKK30gZHJtX2ludGVsX3JlbG9jX3RhcmdldDsKKworc3RydWN0IF9kcm1faW50ZWxfYm9fZ2VtIHsKKwlkcm1faW50ZWxfYm8gYm87CisKKwlhdG9taWNfdCByZWZjb3VudDsKKwl1aW50MzJfdCBnZW1faGFuZGxlOworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkvKioKKwkgKiBLZW5lbC1hc3NpZ25lZCBnbG9iYWwgbmFtZSBmb3IgdGhpcyBvYmplY3QKKyAgICAgICAgICoKKyAgICAgICAgICogTGlzdCBjb250YWlucyBib3RoIGZsaW5rIG5hbWVkIGFuZCBwcmltZSBmZCdkIG9iamVjdHMKKwkgKi8KKwl1bnNpZ25lZCBpbnQgZ2xvYmFsX25hbWU7CisKKwlVVF9oYXNoX2hhbmRsZSBoYW5kbGVfaGg7CisJVVRfaGFzaF9oYW5kbGUgbmFtZV9oaDsKKworCS8qKgorCSAqIEluZGV4IG9mIHRoZSBidWZmZXIgd2l0aGluIHRoZSB2YWxpZGF0aW9uIGxpc3Qgd2hpbGUgcHJlcGFyaW5nIGEKKwkgKiBiYXRjaGJ1ZmZlciBleGVjdXRpb24uCisJICovCisJaW50IHZhbGlkYXRlX2luZGV4OworCisJLyoqCisJICogQ3VycmVudCB0aWxpbmcgbW9kZQorCSAqLworCXVpbnQzMl90IHRpbGluZ19tb2RlOworCXVpbnQzMl90IHN3aXp6bGVfbW9kZTsKKwl1bnNpZ25lZCBsb25nIHN0cmlkZTsKKworCXVuc2lnbmVkIGxvbmcga2ZsYWdzOworCisJdGltZV90IGZyZWVfdGltZTsKKworCS8qKiBBcnJheSBwYXNzZWQgdG8gdGhlIERSTSBjb250YWluaW5nIHJlbG9jYXRpb24gaW5mb3JtYXRpb24uICovCisJc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5ICpyZWxvY3M7CisJLyoqCisJICogQXJyYXkgb2YgaW5mbyBzdHJ1Y3RzIGNvcnJlc3BvbmRpbmcgdG8gcmVsb2NzW2ldLnRhcmdldF9oYW5kbGUgZXRjCisJICovCisJZHJtX2ludGVsX3JlbG9jX3RhcmdldCAqcmVsb2NfdGFyZ2V0X2luZm87CisJLyoqIE51bWJlciBvZiBlbnRyaWVzIGluIHJlbG9jcyAqLworCWludCByZWxvY19jb3VudDsKKwkvKiogQXJyYXkgb2YgQk9zIHRoYXQgYXJlIHJlZmVyZW5jZWQgYnkgdGhpcyBidWZmZXIgYW5kIHdpbGwgYmUgc29mdHBpbm5lZCAqLworCWRybV9pbnRlbF9ibyAqKnNvZnRwaW5fdGFyZ2V0OworCS8qKiBOdW1iZXIgc29mdHBpbm5lZCBCT3MgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSB0aGlzIGJ1ZmZlciAqLworCWludCBzb2Z0cGluX3RhcmdldF9jb3VudDsKKwkvKiogTWF4aW11bSBhbW91bnQgb2Ygc29mdHBpbm5lZCBCT3MgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSB0aGlzIGJ1ZmZlciAqLworCWludCBzb2Z0cGluX3RhcmdldF9zaXplOworCisJLyoqIE1hcHBlZCBhZGRyZXNzIGZvciB0aGUgYnVmZmVyLCBzYXZlZCBhY3Jvc3MgbWFwL3VubWFwIGN5Y2xlcyAqLworCXZvaWQgKm1lbV92aXJ0dWFsOworCS8qKiBHVFQgdmlydHVhbCBhZGRyZXNzIGZvciB0aGUgYnVmZmVyLCBzYXZlZCBhY3Jvc3MgbWFwL3VubWFwIGN5Y2xlcyAqLworCXZvaWQgKmd0dF92aXJ0dWFsOworCS8qKiBXQyBDUFUgYWRkcmVzcyBmb3IgdGhlIGJ1ZmZlciwgc2F2ZWQgYWNyb3NzIG1hcC91bm1hcCBjeWNsZXMgKi8KKwl2b2lkICp3Y192aXJ0dWFsOworCS8qKgorCSAqIFZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieSB1c2VyLCB1c2VkIGZvciB1c2VycHRyCisJICogb2JqZWN0cyBvbmx5LgorCSAqLworCXZvaWQgKnVzZXJfdmlydHVhbDsKKwlpbnQgbWFwX2NvdW50OworCWRybU1NTGlzdEhlYWQgdm1hX2xpc3Q7CisKKwkvKiogQk8gY2FjaGUgbGlzdCAqLworCWRybU1NTGlzdEhlYWQgaGVhZDsKKworCS8qKgorCSAqIEJvb2xlYW4gb2Ygd2hldGhlciB0aGlzIEJPIGFuZCBpdHMgY2hpbGRyZW4gaGF2ZSBiZWVuIGluY2x1ZGVkIGluCisJICogdGhlIGN1cnJlbnQgZHJtX2ludGVsX2J1Zm1ncl9jaGVja19hcGVydHVyZV9zcGFjZSgpIHRvdGFsLgorCSAqLworCWJvb2wgaW5jbHVkZWRfaW5fY2hlY2tfYXBlcnR1cmU7CisKKwkvKioKKwkgKiBCb29sZWFuIG9mIHdoZXRoZXIgdGhpcyBidWZmZXIgaGFzIGJlZW4gdXNlZCBhcyBhIHJlbG9jYXRpb24KKwkgKiB0YXJnZXQgYW5kIGhhZCBpdHMgc2l6ZSBhY2NvdW50ZWQgZm9yLCBhbmQgdGh1cyBjYW4ndCBoYXZlIGFueQorCSAqIGZ1cnRoZXIgcmVsb2NhdGlvbnMgYWRkZWQgdG8gaXQuCisJICovCisJYm9vbCB1c2VkX2FzX3JlbG9jX3RhcmdldDsKKworCS8qKgorCSAqIEJvb2xlYW4gb2Ygd2hldGhlciB3ZSBoYXZlIGVuY291bnRlcmVkIGFuIGVycm9yIHdoaWxzdCBidWlsZGluZyB0aGUgcmVsb2NhdGlvbiB0cmVlLgorCSAqLworCWJvb2wgaGFzX2Vycm9yOworCisJLyoqCisJICogQm9vbGVhbiBvZiB3aGV0aGVyIHRoaXMgYnVmZmVyIGNhbiBiZSByZS11c2VkCisJICovCisJYm9vbCByZXVzYWJsZTsKKworCS8qKgorCSAqIEJvb2xlYW4gb2Ygd2hldGhlciB0aGUgR1BVIGlzIGRlZmluaXRlbHkgbm90IGFjY2Vzc2luZyB0aGUgYnVmZmVyLgorCSAqCisJICogVGhpcyBpcyBvbmx5IHZhbGlkIHdoZW4gcmV1c2FibGUsIHNpbmNlIG5vbi1yZXVzYWJsZQorCSAqIGJ1ZmZlcnMgYXJlIHRob3NlIHRoYXQgaGF2ZSBiZWVuIHNoYXJlZCB3aXRoIG90aGVyCisJICogcHJvY2Vzc2VzLCBzbyB3ZSBkb24ndCBrbm93IHRoZWlyIHN0YXRlLgorCSAqLworCWJvb2wgaWRsZTsKKworCS8qKgorCSAqIEJvb2xlYW4gb2Ygd2hldGhlciB0aGlzIGJ1ZmZlciB3YXMgYWxsb2NhdGVkIHdpdGggdXNlcnB0cgorCSAqLworCWJvb2wgaXNfdXNlcnB0cjsKKworCS8qKgorCSAqIFNpemUgaW4gYnl0ZXMgb2YgdGhpcyBidWZmZXIgYW5kIGl0cyByZWxvY2F0aW9uIGRlc2NlbmRlbnRzLgorCSAqCisJICogVXNlZCB0byBhdm9pZCBjb3N0bHkgdHJlZSB3YWxraW5nIGluCisJICogZHJtX2ludGVsX2J1Zm1ncl9jaGVja19hcGVydHVyZSBpbiB0aGUgY29tbW9uIGNhc2UuCisJICovCisJaW50IHJlbG9jX3RyZWVfc2l6ZTsKKworCS8qKgorCSAqIE51bWJlciBvZiBwb3RlbnRpYWwgZmVuY2UgcmVnaXN0ZXJzIHJlcXVpcmVkIGJ5IHRoaXMgYnVmZmVyIGFuZCBpdHMKKwkgKiByZWxvY2F0aW9ucy4KKwkgKi8KKwlpbnQgcmVsb2NfdHJlZV9mZW5jZXM7CisKKwkvKiogRmxhZ3MgdGhhdCB3ZSBtYXkgbmVlZCB0byBkbyB0aGUgU1dfRklOSVNIIGlvY3RsIG9uIHVubWFwLiAqLworCWJvb2wgbWFwcGVkX2NwdV93cml0ZTsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2RybV9pbnRlbF9nZW1fZXN0aW1hdGVfYmF0Y2hfc3BhY2UoZHJtX2ludGVsX2JvICoqIGJvX2FycmF5LCBpbnQgY291bnQpOworCitzdGF0aWMgdW5zaWduZWQgaW50Citkcm1faW50ZWxfZ2VtX2NvbXB1dGVfYmF0Y2hfc3BhY2UoZHJtX2ludGVsX2JvICoqIGJvX2FycmF5LCBpbnQgY291bnQpOworCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2JvX2dldF90aWxpbmcoZHJtX2ludGVsX2JvICpibywgdWludDMyX3QgKiB0aWxpbmdfbW9kZSwKKwkJCSAgICB1aW50MzJfdCAqIHN3aXp6bGVfbW9kZSk7CisKK3N0YXRpYyBpbnQKK2RybV9pbnRlbF9nZW1fYm9fc2V0X3RpbGluZ19pbnRlcm5hbChkcm1faW50ZWxfYm8gKmJvLAorCQkJCSAgICAgdWludDMyX3QgdGlsaW5nX21vZGUsCisJCQkJICAgICB1aW50MzJfdCBzdHJpZGUpOworCitzdGF0aWMgdm9pZCBkcm1faW50ZWxfZ2VtX2JvX3VucmVmZXJlbmNlX2xvY2tlZF90aW1lZChkcm1faW50ZWxfYm8gKmJvLAorCQkJCQkJICAgICAgdGltZV90IHRpbWUpOworCitzdGF0aWMgdm9pZCBkcm1faW50ZWxfZ2VtX2JvX3VucmVmZXJlbmNlKGRybV9pbnRlbF9ibyAqYm8pOworCitzdGF0aWMgdm9pZCBkcm1faW50ZWxfZ2VtX2JvX2ZyZWUoZHJtX2ludGVsX2JvICpibyk7CisKK3N0YXRpYyBpbmxpbmUgZHJtX2ludGVsX2JvX2dlbSAqdG9fYm9fZ2VtKGRybV9pbnRlbF9ibyAqYm8pCit7CisgICAgICAgIHJldHVybiAoZHJtX2ludGVsX2JvX2dlbSAqKWJvOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworZHJtX2ludGVsX2dlbV9ib190aWxlX3NpemUoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCSAgIHVpbnQzMl90ICp0aWxpbmdfbW9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIG1pbl9zaXplLCBtYXhfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwlpZiAoKnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX05PTkUpCisJCXJldHVybiBzaXplOworCisJLyogOTY1KyBqdXN0IG5lZWQgbXVsdGlwbGVzIG9mIHBhZ2Ugc2l6ZSBmb3IgdGlsaW5nICovCisJaWYgKGJ1Zm1ncl9nZW0tPmdlbiA+PSA0KQorCQlyZXR1cm4gUk9VTkRfVVBfVE8oc2l6ZSwgNDA5Nik7CisKKwkvKiBPbGRlciBjaGlwcyBuZWVkIHBvd2VycyBvZiB0d28sIG9mIGF0IGxlYXN0IDUxMmsgb3IgMU0gKi8KKwlpZiAoYnVmbWdyX2dlbS0+Z2VuID09IDMpIHsKKwkJbWluX3NpemUgPSAxMDI0KjEwMjQ7CisJCW1heF9zaXplID0gMTI4KjEwMjQqMTAyNDsKKwl9IGVsc2UgeworCQltaW5fc2l6ZSA9IDUxMioxMDI0OworCQltYXhfc2l6ZSA9IDY0KjEwMjQqMTAyNDsKKwl9CisKKwlpZiAoc2l6ZSA+IG1heF9zaXplKSB7CisJCSp0aWxpbmdfbW9kZSA9IEk5MTVfVElMSU5HX05PTkU7CisJCXJldHVybiBzaXplOworCX0KKworCS8qIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgZXZlcnkgcGFnZSBmb3IgdGhlIGZlbmNlPyAqLworCWlmIChidWZtZ3JfZ2VtLT5oYXNfcmVsYXhlZF9mZW5jaW5nKQorCQlyZXR1cm4gUk9VTkRfVVBfVE8oc2l6ZSwgNDA5Nik7CisKKwlmb3IgKGkgPSBtaW5fc2l6ZTsgaSA8IHNpemU7IGkgPDw9IDEpCisJCTsKKworCXJldHVybiBpOworfQorCisvKgorICogUm91bmQgYSBnaXZlbiBwaXRjaCB1cCB0byB0aGUgbWluaW11bSByZXF1aXJlZCBmb3IgWCB0aWxpbmcgb24gYQorICogZ2l2ZW4gY2hpcC4gIFdlIHVzZSA1MTIgYXMgdGhlIG1pbmltdW0gdG8gYWxsb3cgZm9yIGEgbGF0ZXIgdGlsaW5nCisgKiBjaGFuZ2UuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nCitkcm1faW50ZWxfZ2VtX2JvX3RpbGVfcGl0Y2goZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0sCisJCQkgICAgdW5zaWduZWQgbG9uZyBwaXRjaCwgdWludDMyX3QgKnRpbGluZ19tb2RlKQoreworCXVuc2lnbmVkIGxvbmcgdGlsZV93aWR0aDsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwkvKiBJZiB1bnRpbGVkLCB0aGVuIGp1c3QgYWxpZ24gaXQgc28gdGhhdCB3ZSBjYW4gZG8gcmVuZGVyaW5nCisJICogdG8gaXQgd2l0aCB0aGUgM0QgZW5naW5lLgorCSAqLworCWlmICgqdGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfTk9ORSkKKwkJcmV0dXJuIEFMSUdOKHBpdGNoLCA2NCk7CisKKwlpZiAoKnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX1gKKwkJCXx8IChJU185MTUoYnVmbWdyX2dlbS0+cGNpX2RldmljZSkKKwkJCSAgICAmJiAqdGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfWSkpCisJCXRpbGVfd2lkdGggPSA1MTI7CisJZWxzZQorCQl0aWxlX3dpZHRoID0gMTI4OworCisJLyogOTY1IGlzIGZsZXhpYmxlICovCisJaWYgKGJ1Zm1ncl9nZW0tPmdlbiA+PSA0KQorCQlyZXR1cm4gUk9VTkRfVVBfVE8ocGl0Y2gsIHRpbGVfd2lkdGgpOworCisJLyogVGhlIG9sZGVyIGhhcmR3YXJlIGhhcyBhIG1heGltdW0gcGl0Y2ggb2YgODE5MiB3aXRoIHRpbGVkCisJICogc3VyZmFjZXMsIHNvIGZhbGxiYWNrIHRvIHVudGlsZWQgaWYgaXQncyB0b28gbGFyZ2UuCisJICovCisJaWYgKHBpdGNoID4gODE5MikgeworCQkqdGlsaW5nX21vZGUgPSBJOTE1X1RJTElOR19OT05FOworCQlyZXR1cm4gQUxJR04ocGl0Y2gsIDY0KTsKKwl9CisKKwkvKiBQcmUtOTY1IG5lZWRzIHBvd2VyIG9mIHR3byB0aWxlIHdpZHRoICovCisJZm9yIChpID0gdGlsZV93aWR0aDsgaSA8IHBpdGNoOyBpIDw8PSAxKQorCQk7CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHN0cnVjdCBkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldCAqCitkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldF9mb3Jfc2l6ZShkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSwKKwkJCQkgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGJ1Zm1ncl9nZW0tPm51bV9idWNrZXRzOyBpKyspIHsKKwkJc3RydWN0IGRybV9pbnRlbF9nZW1fYm9fYnVja2V0ICpidWNrZXQgPQorCQkgICAgJmJ1Zm1ncl9nZW0tPmNhY2hlX2J1Y2tldFtpXTsKKwkJaWYgKGJ1Y2tldC0+c2l6ZSA+PSBzaXplKSB7CisJCQlyZXR1cm4gYnVja2V0OworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitkcm1faW50ZWxfZ2VtX2R1bXBfdmFsaWRhdGlvbl9saXN0KGRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtKQoreworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IGJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQ7IGkrKykgeworCQlkcm1faW50ZWxfYm8gKmJvID0gYnVmbWdyX2dlbS0+ZXhlY19ib3NbaV07CisJCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCisJCWlmIChib19nZW0tPnJlbG9jcyA9PSBOVUxMICYmIGJvX2dlbS0+c29mdHBpbl90YXJnZXQgPT0gTlVMTCkgeworCQkJREJHKCIlMmQ6ICVkICVzKCVzKVxuIiwgaSwgYm9fZ2VtLT5nZW1faGFuZGxlLAorCQkJICAgIGJvX2dlbS0+a2ZsYWdzICYgRVhFQ19PQkpFQ1RfUElOTkVEID8gIioiIDogIiIsCisJCQkgICAgYm9fZ2VtLT5uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZm9yIChqID0gMDsgaiA8IGJvX2dlbS0+cmVsb2NfY291bnQ7IGorKykgeworCQkJZHJtX2ludGVsX2JvICp0YXJnZXRfYm8gPSBib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvW2pdLmJvOworCQkJZHJtX2ludGVsX2JvX2dlbSAqdGFyZ2V0X2dlbSA9CisJCQkgICAgKGRybV9pbnRlbF9ib19nZW0gKikgdGFyZ2V0X2JvOworCisJCQlEQkcoIiUyZDogJWQgJXMoJXMpQDB4JTA4eCAlMDh4IC0+ICIKKwkJCSAgICAiJWQgKCVzKUAweCUwOHggJTA4eCArIDB4JTA4eFxuIiwKKwkJCSAgICBpLAorCQkJICAgIGJvX2dlbS0+Z2VtX2hhbmRsZSwKKwkJCSAgICBib19nZW0tPmtmbGFncyAmIEVYRUNfT0JKRUNUX1BJTk5FRCA/ICIqIiA6ICIiLAorCQkJICAgIGJvX2dlbS0+bmFtZSwKKwkJCSAgICB1cHBlcl8zMl9iaXRzKGJvX2dlbS0+cmVsb2NzW2pdLm9mZnNldCksCisJCQkgICAgbG93ZXJfMzJfYml0cyhib19nZW0tPnJlbG9jc1tqXS5vZmZzZXQpLAorCQkJICAgIHRhcmdldF9nZW0tPmdlbV9oYW5kbGUsCisJCQkgICAgdGFyZ2V0X2dlbS0+bmFtZSwKKwkJCSAgICB1cHBlcl8zMl9iaXRzKHRhcmdldF9iby0+b2Zmc2V0NjQpLAorCQkJICAgIGxvd2VyXzMyX2JpdHModGFyZ2V0X2JvLT5vZmZzZXQ2NCksCisJCQkgICAgYm9fZ2VtLT5yZWxvY3Nbal0uZGVsdGEpOworCQl9CisKKwkJZm9yIChqID0gMDsgaiA8IGJvX2dlbS0+c29mdHBpbl90YXJnZXRfY291bnQ7IGorKykgeworCQkJZHJtX2ludGVsX2JvICp0YXJnZXRfYm8gPSBib19nZW0tPnNvZnRwaW5fdGFyZ2V0W2pdOworCQkJZHJtX2ludGVsX2JvX2dlbSAqdGFyZ2V0X2dlbSA9CisJCQkgICAgKGRybV9pbnRlbF9ib19nZW0gKikgdGFyZ2V0X2JvOworCQkJREJHKCIlMmQ6ICVkICVzKCVzKSAtPiAiCisJCQkgICAgIiVkICooJXMpQDB4JTA4eCAlMDh4XG4iLAorCQkJICAgIGksCisJCQkgICAgYm9fZ2VtLT5nZW1faGFuZGxlLAorCQkJICAgIGJvX2dlbS0+a2ZsYWdzICYgRVhFQ19PQkpFQ1RfUElOTkVEID8gIioiIDogIiIsCisJCQkgICAgYm9fZ2VtLT5uYW1lLAorCQkJICAgIHRhcmdldF9nZW0tPmdlbV9oYW5kbGUsCisJCQkgICAgdGFyZ2V0X2dlbS0+bmFtZSwKKwkJCSAgICB1cHBlcl8zMl9iaXRzKHRhcmdldF9iby0+b2Zmc2V0NjQpLAorCQkJICAgIGxvd2VyXzMyX2JpdHModGFyZ2V0X2JvLT5vZmZzZXQ2NCkpOworCQl9CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2RybV9pbnRlbF9nZW1fYm9fcmVmZXJlbmNlKGRybV9pbnRlbF9ibyAqYm8pCit7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisKKwlhdG9taWNfaW5jKCZib19nZW0tPnJlZmNvdW50KTsKK30KKworLyoqCisgKiBBZGRzIHRoZSBnaXZlbiBidWZmZXIgdG8gdGhlIGxpc3Qgb2YgYnVmZmVycyB0byBiZSB2YWxpZGF0ZWQgKG1vdmVkIGludG8gdGhlCisgKiBhcHByb3ByaWF0ZSBtZW1vcnkgdHlwZSkgd2l0aCB0aGUgbmV4dCBiYXRjaCBzdWJtaXNzaW9uLgorICoKKyAqIElmIGEgYnVmZmVyIGlzIHZhbGlkYXRlZCBtdWx0aXBsZSB0aW1lcyBpbiBhIGJhdGNoIHN1Ym1pc3Npb24sIGl0IGVuZHMgdXAKKyAqIHdpdGggdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgbWVtb3J5IHR5cGUgZmxhZ3MgYW5kIHRoZSB1bmlvbiBvZiB0aGUKKyAqIGFjY2VzcyBmbGFncy4KKyAqLworc3RhdGljIHZvaWQKK2RybV9pbnRlbF9hZGRfdmFsaWRhdGVfYnVmZmVyKGRybV9pbnRlbF9ibyAqYm8pCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKwlpbnQgaW5kZXg7CisKKwlpZiAoYm9fZ2VtLT52YWxpZGF0ZV9pbmRleCAhPSAtMSkKKwkJcmV0dXJuOworCisJLyogRXh0ZW5kIHRoZSBhcnJheSBvZiB2YWxpZGF0aW9uIGVudHJpZXMgYXMgbmVjZXNzYXJ5LiAqLworCWlmIChidWZtZ3JfZ2VtLT5leGVjX2NvdW50ID09IGJ1Zm1ncl9nZW0tPmV4ZWNfc2l6ZSkgeworCQlpbnQgbmV3X3NpemUgPSBidWZtZ3JfZ2VtLT5leGVjX3NpemUgKiAyOworCisJCWlmIChuZXdfc2l6ZSA9PSAwKQorCQkJbmV3X3NpemUgPSA1OworCisJCWJ1Zm1ncl9nZW0tPmV4ZWNfb2JqZWN0cyA9CisJCSAgICByZWFsbG9jKGJ1Zm1ncl9nZW0tPmV4ZWNfb2JqZWN0cywKKwkJCSAgICBzaXplb2YoKmJ1Zm1ncl9nZW0tPmV4ZWNfb2JqZWN0cykgKiBuZXdfc2l6ZSk7CisJCWJ1Zm1ncl9nZW0tPmV4ZWNfYm9zID0KKwkJICAgIHJlYWxsb2MoYnVmbWdyX2dlbS0+ZXhlY19ib3MsCisJCQkgICAgc2l6ZW9mKCpidWZtZ3JfZ2VtLT5leGVjX2JvcykgKiBuZXdfc2l6ZSk7CisJCWJ1Zm1ncl9nZW0tPmV4ZWNfc2l6ZSA9IG5ld19zaXplOworCX0KKworCWluZGV4ID0gYnVmbWdyX2dlbS0+ZXhlY19jb3VudDsKKwlib19nZW0tPnZhbGlkYXRlX2luZGV4ID0gaW5kZXg7CisJLyogRmlsbCBpbiBhcnJheSBlbnRyeSAqLworCWJ1Zm1ncl9nZW0tPmV4ZWNfb2JqZWN0c1tpbmRleF0uaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOworCWJ1Zm1ncl9nZW0tPmV4ZWNfb2JqZWN0c1tpbmRleF0ucmVsb2NhdGlvbl9jb3VudCA9IGJvX2dlbS0+cmVsb2NfY291bnQ7CisJYnVmbWdyX2dlbS0+ZXhlY19vYmplY3RzW2luZGV4XS5yZWxvY3NfcHRyID0gKHVpbnRwdHJfdCkgYm9fZ2VtLT5yZWxvY3M7CisJYnVmbWdyX2dlbS0+ZXhlY19vYmplY3RzW2luZGV4XS5hbGlnbm1lbnQgPSBiby0+YWxpZ247CisJYnVmbWdyX2dlbS0+ZXhlY19vYmplY3RzW2luZGV4XS5vZmZzZXQgPSAwOworCWJ1Zm1ncl9nZW0tPmV4ZWNfYm9zW2luZGV4XSA9IGJvOworCWJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQrKzsKK30KKworc3RhdGljIHZvaWQKK2RybV9pbnRlbF9hZGRfdmFsaWRhdGVfYnVmZmVyMihkcm1faW50ZWxfYm8gKmJvLCBpbnQgbmVlZF9mZW5jZSkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKWJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKilibzsKKwlpbnQgaW5kZXg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZsYWdzID0gMDsKKwlpZiAobmVlZF9mZW5jZSkKKwkJZmxhZ3MgfD0gRVhFQ19PQkpFQ1RfTkVFRFNfRkVOQ0U7CisKKwlpZiAoYm9fZ2VtLT52YWxpZGF0ZV9pbmRleCAhPSAtMSkgeworCQlidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzW2JvX2dlbS0+dmFsaWRhdGVfaW5kZXhdLmZsYWdzIHw9IGZsYWdzOworCQlyZXR1cm47CisJfQorCisJLyogRXh0ZW5kIHRoZSBhcnJheSBvZiB2YWxpZGF0aW9uIGVudHJpZXMgYXMgbmVjZXNzYXJ5LiAqLworCWlmIChidWZtZ3JfZ2VtLT5leGVjX2NvdW50ID09IGJ1Zm1ncl9nZW0tPmV4ZWNfc2l6ZSkgeworCQlpbnQgbmV3X3NpemUgPSBidWZtZ3JfZ2VtLT5leGVjX3NpemUgKiAyOworCisJCWlmIChuZXdfc2l6ZSA9PSAwKQorCQkJbmV3X3NpemUgPSA1OworCisJCWJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHMgPQorCQkJcmVhbGxvYyhidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzLAorCQkJCXNpemVvZigqYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0cykgKiBuZXdfc2l6ZSk7CisJCWJ1Zm1ncl9nZW0tPmV4ZWNfYm9zID0KKwkJCXJlYWxsb2MoYnVmbWdyX2dlbS0+ZXhlY19ib3MsCisJCQkJc2l6ZW9mKCpidWZtZ3JfZ2VtLT5leGVjX2JvcykgKiBuZXdfc2l6ZSk7CisJCWJ1Zm1ncl9nZW0tPmV4ZWNfc2l6ZSA9IG5ld19zaXplOworCX0KKworCWluZGV4ID0gYnVmbWdyX2dlbS0+ZXhlY19jb3VudDsKKwlib19nZW0tPnZhbGlkYXRlX2luZGV4ID0gaW5kZXg7CisJLyogRmlsbCBpbiBhcnJheSBlbnRyeSAqLworCWJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHNbaW5kZXhdLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKKwlidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzW2luZGV4XS5yZWxvY2F0aW9uX2NvdW50ID0gYm9fZ2VtLT5yZWxvY19jb3VudDsKKwlidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzW2luZGV4XS5yZWxvY3NfcHRyID0gKHVpbnRwdHJfdClib19nZW0tPnJlbG9jczsKKwlidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzW2luZGV4XS5hbGlnbm1lbnQgPSBiby0+YWxpZ247CisJYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0c1tpbmRleF0ub2Zmc2V0ID0gYm8tPm9mZnNldDY0OworCWJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHNbaW5kZXhdLmZsYWdzID0gYm9fZ2VtLT5rZmxhZ3MgfCBmbGFnczsKKwlidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzW2luZGV4XS5yc3ZkMSA9IDA7CisJYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0c1tpbmRleF0ucnN2ZDIgPSAwOworCWJ1Zm1ncl9nZW0tPmV4ZWNfYm9zW2luZGV4XSA9IGJvOworCWJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQrKzsKK30KKworI2RlZmluZSBSRUxPQ19CVUZfU0laRSh4KSAoKEk5MTVfUkVMT0NfSEVBREVSICsgeCAqIEk5MTVfUkVMT0MwX1NUUklERSkgKiBcCisJc2l6ZW9mKHVpbnQzMl90KSkKKworc3RhdGljIHZvaWQKK2RybV9pbnRlbF9ib19nZW1fc2V0X2luX2FwZXJ0dXJlX3NpemUoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0sCisJCQkJICAgICAgZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBhbGlnbm1lbnQpCit7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwlhc3NlcnQoIWJvX2dlbS0+dXNlZF9hc19yZWxvY190YXJnZXQpOworCisJLyogVGhlIG9sZGVyIGNoaXBzZXRzIGFyZSBmYXItbGVzcyBmbGV4aWJsZSBpbiB0ZXJtcyBvZiB0aWxpbmcsCisJICogYW5kIHJlcXVpcmUgdGlsZWQgYnVmZmVyIHRvIGJlIHNpemUgYWxpZ25lZCBpbiB0aGUgYXBlcnR1cmUuCisJICogVGhpcyBtZWFucyB0aGF0IGluIHRoZSB3b3JzdCBwb3NzaWJsZSBjYXNlIHdlIHdpbGwgbmVlZCBhIGhvbGUKKwkgKiB0d2ljZSBhcyBsYXJnZSBhcyB0aGUgb2JqZWN0IGluIG9yZGVyIGZvciBpdCB0byBmaXQgaW50byB0aGUKKwkgKiBhcGVydHVyZS4gT3B0aW1hbCBwYWNraW5nIGlzIGZvciB3aW1wcy4KKwkgKi8KKwlzaXplID0gYm9fZ2VtLT5iby5zaXplOworCWlmIChidWZtZ3JfZ2VtLT5nZW4gPCA0ICYmIGJvX2dlbS0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkgeworCQl1bnNpZ25lZCBpbnQgbWluX3NpemU7CisKKwkJaWYgKGJ1Zm1ncl9nZW0tPmhhc19yZWxheGVkX2ZlbmNpbmcpIHsKKwkJCWlmIChidWZtZ3JfZ2VtLT5nZW4gPT0gMykKKwkJCQltaW5fc2l6ZSA9IDEwMjQqMTAyNDsKKwkJCWVsc2UKKwkJCQltaW5fc2l6ZSA9IDUxMioxMDI0OworCisJCQl3aGlsZSAobWluX3NpemUgPCBzaXplKQorCQkJCW1pbl9zaXplICo9IDI7CisJCX0gZWxzZQorCQkJbWluX3NpemUgPSBzaXplOworCisJCS8qIEFjY291bnQgZm9yIHdvcnN0LWNhc2UgYWxpZ25tZW50LiAqLworCQlhbGlnbm1lbnQgPSBNQVgyKGFsaWdubWVudCwgbWluX3NpemUpOworCX0KKworCWJvX2dlbS0+cmVsb2NfdHJlZV9zaXplID0gc2l6ZSArIGFsaWdubWVudDsKK30KKworc3RhdGljIGludAorZHJtX2ludGVsX3NldHVwX3JlbG9jX2xpc3QoZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCXVuc2lnbmVkIGludCBtYXhfcmVsb2NzID0gYnVmbWdyX2dlbS0+bWF4X3JlbG9jczsKKworCWlmIChiby0+c2l6ZSAvIDQgPCBtYXhfcmVsb2NzKQorCQltYXhfcmVsb2NzID0gYm8tPnNpemUgLyA0OworCisJYm9fZ2VtLT5yZWxvY3MgPSBtYWxsb2MobWF4X3JlbG9jcyAqCisJCQkJc2l6ZW9mKHN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSkpOworCWJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm8gPSBtYWxsb2MobWF4X3JlbG9jcyAqCisJCQkJCSAgIHNpemVvZihkcm1faW50ZWxfcmVsb2NfdGFyZ2V0KSk7CisJaWYgKGJvX2dlbS0+cmVsb2NzID09IE5VTEwgfHwgYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mbyA9PSBOVUxMKSB7CisJCWJvX2dlbS0+aGFzX2Vycm9yID0gdHJ1ZTsKKworCQlmcmVlIChib19nZW0tPnJlbG9jcyk7CisJCWJvX2dlbS0+cmVsb2NzID0gTlVMTDsKKworCQlmcmVlIChib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvKTsKKwkJYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mbyA9IE5VTEw7CisKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RybV9pbnRlbF9nZW1fYm9fYnVzeShkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisJc3RydWN0IGRybV9pOTE1X2dlbV9idXN5IGJ1c3k7CisJaW50IHJldDsKKworCWlmIChib19nZW0tPnJldXNhYmxlICYmIGJvX2dlbS0+aWRsZSkKKwkJcmV0dXJuIGZhbHNlOworCisJbWVtY2xlYXIoYnVzeSk7CisJYnVzeS5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CisKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VNX0JVU1ksICZidXN5KTsKKwlpZiAocmV0ID09IDApIHsKKwkJYm9fZ2VtLT5pZGxlID0gIWJ1c3kuYnVzeTsKKwkJcmV0dXJuIGJ1c3kuYnVzeTsKKwl9IGVsc2UgeworCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2JvX21hZHZpc2VfaW50ZXJuYWwoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0sCisJCQkJICBkcm1faW50ZWxfYm9fZ2VtICpib19nZW0sIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21hZHZpc2UgbWFkdjsKKworCW1lbWNsZWFyKG1hZHYpOworCW1hZHYuaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOworCW1hZHYubWFkdiA9IHN0YXRlOworCW1hZHYucmV0YWluZWQgPSAxOworCWRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfSTkxNV9HRU1fTUFEVklTRSwgJm1hZHYpOworCisJcmV0dXJuIG1hZHYucmV0YWluZWQ7Cit9CisKK3N0YXRpYyBpbnQKK2RybV9pbnRlbF9nZW1fYm9fbWFkdmlzZShkcm1faW50ZWxfYm8gKmJvLCBpbnQgbWFkdikKK3sKKwlyZXR1cm4gZHJtX2ludGVsX2dlbV9ib19tYWR2aXNlX2ludGVybmFsCisJCSgoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1nciwKKwkJIChkcm1faW50ZWxfYm9fZ2VtICopIGJvLAorCQkgbWFkdik7Cit9CisKKy8qIGRyb3AgdGhlIG9sZGVzdCBlbnRyaWVzIHRoYXQgaGF2ZSBiZWVuIHB1cmdlZCBieSB0aGUga2VybmVsICovCitzdGF0aWMgdm9pZAorZHJtX2ludGVsX2dlbV9ib19jYWNoZV9wdXJnZV9idWNrZXQoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0sCisJCQkJICAgIHN0cnVjdCBkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldCAqYnVja2V0KQoreworCXdoaWxlICghRFJNTElTVEVNUFRZKCZidWNrZXQtPmhlYWQpKSB7CisJCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbTsKKworCQlib19nZW0gPSBEUk1MSVNURU5UUlkoZHJtX2ludGVsX2JvX2dlbSwKKwkJCQkgICAgICBidWNrZXQtPmhlYWQubmV4dCwgaGVhZCk7CisJCWlmIChkcm1faW50ZWxfZ2VtX2JvX21hZHZpc2VfaW50ZXJuYWwKKwkJICAgIChidWZtZ3JfZ2VtLCBib19nZW0sIEk5MTVfTUFEVl9ET05UTkVFRCkpCisJCQlicmVhazsKKworCQlEUk1MSVNUREVMKCZib19nZW0tPmhlYWQpOworCQlkcm1faW50ZWxfZ2VtX2JvX2ZyZWUoJmJvX2dlbS0+Ym8pOworCX0KK30KKworc3RhdGljIGRybV9pbnRlbF9ibyAqCitkcm1faW50ZWxfZ2VtX2JvX2FsbG9jX2ludGVybmFsKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKKwkJCQljb25zdCBjaGFyICpuYW1lLAorCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQl1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJCXVpbnQzMl90IHRpbGluZ19tb2RlLAorCQkJCXVuc2lnbmVkIGxvbmcgc3RyaWRlLAorCQkJCXVuc2lnbmVkIGludCBhbGlnbm1lbnQpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbTsKKwl1bnNpZ25lZCBpbnQgcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTsKKwlpbnQgcmV0OworCXN0cnVjdCBkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldCAqYnVja2V0OworCWJvb2wgYWxsb2NfZnJvbV9jYWNoZTsKKwl1bnNpZ25lZCBsb25nIGJvX3NpemU7CisJYm9vbCBmb3JfcmVuZGVyID0gZmFsc2U7CisKKwlpZiAoZmxhZ3MgJiBCT19BTExPQ19GT1JfUkVOREVSKQorCQlmb3JfcmVuZGVyID0gdHJ1ZTsKKworCS8qIFJvdW5kIHRoZSBhbGxvY2F0ZWQgc2l6ZSB1cCB0byBhIHBvd2VyIG9mIHR3byBudW1iZXIgb2YgcGFnZXMuICovCisJYnVja2V0ID0gZHJtX2ludGVsX2dlbV9ib19idWNrZXRfZm9yX3NpemUoYnVmbWdyX2dlbSwgc2l6ZSk7CisKKwkvKiBJZiB3ZSBkb24ndCBoYXZlIGNhY2hpbmcgYXQgdGhpcyBzaXplLCBkb24ndCBhY3R1YWxseSByb3VuZCB0aGUKKwkgKiBhbGxvY2F0aW9uIHVwLgorCSAqLworCWlmIChidWNrZXQgPT0gTlVMTCkgeworCQlib19zaXplID0gc2l6ZTsKKwkJaWYgKGJvX3NpemUgPCBwYWdlX3NpemUpCisJCQlib19zaXplID0gcGFnZV9zaXplOworCX0gZWxzZSB7CisJCWJvX3NpemUgPSBidWNrZXQtPnNpemU7CisJfQorCisJcHRocmVhZF9tdXRleF9sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKKwkvKiBHZXQgYSBidWZmZXIgb3V0IG9mIHRoZSBjYWNoZSBpZiBhdmFpbGFibGUgKi8KK3JldHJ5OgorCWFsbG9jX2Zyb21fY2FjaGUgPSBmYWxzZTsKKwlpZiAoYnVja2V0ICE9IE5VTEwgJiYgIURSTUxJU1RFTVBUWSgmYnVja2V0LT5oZWFkKSkgeworCQlpZiAoZm9yX3JlbmRlcikgeworCQkJLyogQWxsb2NhdGUgbmV3IHJlbmRlci10YXJnZXQgQk9zIGZyb20gdGhlIHRhaWwgKE1SVSkKKwkJCSAqIG9mIHRoZSBsaXN0LCBhcyBpdCB3aWxsIGxpa2VseSBiZSBob3QgaW4gdGhlIEdQVQorCQkJICogY2FjaGUgYW5kIGluIHRoZSBhcGVydHVyZSBmb3IgdXMuCisJCQkgKi8KKwkJCWJvX2dlbSA9IERSTUxJU1RFTlRSWShkcm1faW50ZWxfYm9fZ2VtLAorCQkJCQkgICAgICBidWNrZXQtPmhlYWQucHJldiwgaGVhZCk7CisJCQlEUk1MSVNUREVMKCZib19nZW0tPmhlYWQpOworCQkJYWxsb2NfZnJvbV9jYWNoZSA9IHRydWU7CisJCQlib19nZW0tPmJvLmFsaWduID0gYWxpZ25tZW50OworCQl9IGVsc2UgeworCQkJYXNzZXJ0KGFsaWdubWVudCA9PSAwKTsKKwkJCS8qIEZvciBub24tcmVuZGVyLXRhcmdldCBCT3MgKHdoZXJlIHdlJ3JlIHByb2JhYmx5CisJCQkgKiBnb2luZyB0byBtYXAgaXQgZmlyc3QgdGhpbmcgaW4gb3JkZXIgdG8gZmlsbCBpdAorCQkJICogd2l0aCBkYXRhKSwgY2hlY2sgaWYgdGhlIGxhc3QgQk8gaW4gdGhlIGNhY2hlIGlzCisJCQkgKiB1bmJ1c3ksIGFuZCBvbmx5IHJldXNlIGluIHRoYXQgY2FzZS4gT3RoZXJ3aXNlLAorCQkJICogYWxsb2NhdGluZyBhIG5ldyBidWZmZXIgaXMgcHJvYmFibHkgZmFzdGVyIHRoYW4KKwkJCSAqIHdhaXRpbmcgZm9yIHRoZSBHUFUgdG8gZmluaXNoLgorCQkJICovCisJCQlib19nZW0gPSBEUk1MSVNURU5UUlkoZHJtX2ludGVsX2JvX2dlbSwKKwkJCQkJICAgICAgYnVja2V0LT5oZWFkLm5leHQsIGhlYWQpOworCQkJaWYgKCFkcm1faW50ZWxfZ2VtX2JvX2J1c3koJmJvX2dlbS0+Ym8pKSB7CisJCQkJYWxsb2NfZnJvbV9jYWNoZSA9IHRydWU7CisJCQkJRFJNTElTVERFTCgmYm9fZ2VtLT5oZWFkKTsKKwkJCX0KKwkJfQorCisJCWlmIChhbGxvY19mcm9tX2NhY2hlKSB7CisJCQlpZiAoIWRybV9pbnRlbF9nZW1fYm9fbWFkdmlzZV9pbnRlcm5hbAorCQkJICAgIChidWZtZ3JfZ2VtLCBib19nZW0sIEk5MTVfTUFEVl9XSUxMTkVFRCkpIHsKKwkJCQlkcm1faW50ZWxfZ2VtX2JvX2ZyZWUoJmJvX2dlbS0+Ym8pOworCQkJCWRybV9pbnRlbF9nZW1fYm9fY2FjaGVfcHVyZ2VfYnVja2V0KGJ1Zm1ncl9nZW0sCisJCQkJCQkJCSAgICBidWNrZXQpOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisKKwkJCWlmIChkcm1faW50ZWxfZ2VtX2JvX3NldF90aWxpbmdfaW50ZXJuYWwoJmJvX2dlbS0+Ym8sCisJCQkJCQkJCSB0aWxpbmdfbW9kZSwKKwkJCQkJCQkJIHN0cmlkZSkpIHsKKwkJCQlkcm1faW50ZWxfZ2VtX2JvX2ZyZWUoJmJvX2dlbS0+Ym8pOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIWFsbG9jX2Zyb21fY2FjaGUpIHsKKwkJc3RydWN0IGRybV9pOTE1X2dlbV9jcmVhdGUgY3JlYXRlOworCisJCWJvX2dlbSA9IGNhbGxvYygxLCBzaXplb2YoKmJvX2dlbSkpOworCQlpZiAoIWJvX2dlbSkKKwkJCWdvdG8gZXJyOworCisJCS8qIGRybV9pbnRlbF9nZW1fYm9fZnJlZSBjYWxscyBEUk1MSVNUREVMKCkgZm9yIGFuIHVuaW5pdGlhbGl6ZWQKKwkJICAgbGlzdCAodm1hX2xpc3QpLCBzbyBiZXR0ZXIgc2V0IHRoZSBsaXN0IGhlYWQgaGVyZSAqLworCQlEUk1JTklUTElTVEhFQUQoJmJvX2dlbS0+dm1hX2xpc3QpOworCisJCWJvX2dlbS0+Ym8uc2l6ZSA9IGJvX3NpemU7CisKKwkJbWVtY2xlYXIoY3JlYXRlKTsKKwkJY3JlYXRlLnNpemUgPSBib19zaXplOworCisJCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAorCQkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9DUkVBVEUsCisJCQkgICAgICAgJmNyZWF0ZSk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZnJlZShib19nZW0pOworCQkJZ290byBlcnI7CisJCX0KKworCQlib19nZW0tPmdlbV9oYW5kbGUgPSBjcmVhdGUuaGFuZGxlOworCQlIQVNIX0FERChoYW5kbGVfaGgsIGJ1Zm1ncl9nZW0tPmhhbmRsZV90YWJsZSwKKwkJCSBnZW1faGFuZGxlLCBzaXplb2YoYm9fZ2VtLT5nZW1faGFuZGxlKSwKKwkJCSBib19nZW0pOworCisJCWJvX2dlbS0+Ym8uaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOworCQlib19nZW0tPmJvLmJ1Zm1nciA9IGJ1Zm1ncjsKKwkJYm9fZ2VtLT5iby5hbGlnbiA9IGFsaWdubWVudDsKKworCQlib19nZW0tPnRpbGluZ19tb2RlID0gSTkxNV9USUxJTkdfTk9ORTsKKwkJYm9fZ2VtLT5zd2l6emxlX21vZGUgPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKKwkJYm9fZ2VtLT5zdHJpZGUgPSAwOworCisJCWlmIChkcm1faW50ZWxfZ2VtX2JvX3NldF90aWxpbmdfaW50ZXJuYWwoJmJvX2dlbS0+Ym8sCisJCQkJCQkJIHRpbGluZ19tb2RlLAorCQkJCQkJCSBzdHJpZGUpKQorCQkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlib19nZW0tPm5hbWUgPSBuYW1lOworCWF0b21pY19zZXQoJmJvX2dlbS0+cmVmY291bnQsIDEpOworCWJvX2dlbS0+dmFsaWRhdGVfaW5kZXggPSAtMTsKKwlib19nZW0tPnJlbG9jX3RyZWVfZmVuY2VzID0gMDsKKwlib19nZW0tPnVzZWRfYXNfcmVsb2NfdGFyZ2V0ID0gZmFsc2U7CisJYm9fZ2VtLT5oYXNfZXJyb3IgPSBmYWxzZTsKKwlib19nZW0tPnJldXNhYmxlID0gdHJ1ZTsKKworCWRybV9pbnRlbF9ib19nZW1fc2V0X2luX2FwZXJ0dXJlX3NpemUoYnVmbWdyX2dlbSwgYm9fZ2VtLCBhbGlnbm1lbnQpOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKKworCURCRygiYm9fY3JlYXRlOiBidWYgJWQgKCVzKSAlbGRiXG4iLAorCSAgICBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwgc2l6ZSk7CisKKwlyZXR1cm4gJmJvX2dlbS0+Ym87CisKK2Vycl9mcmVlOgorCWRybV9pbnRlbF9nZW1fYm9fZnJlZSgmYm9fZ2VtLT5ibyk7CitlcnI6CisJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgZHJtX2ludGVsX2JvICoKK2RybV9pbnRlbF9nZW1fYm9fYWxsb2NfZm9yX3JlbmRlcihkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCQkJICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCSAgdW5zaWduZWQgaW50IGFsaWdubWVudCkKK3sKKwlyZXR1cm4gZHJtX2ludGVsX2dlbV9ib19hbGxvY19pbnRlcm5hbChidWZtZ3IsIG5hbWUsIHNpemUsCisJCQkJCSAgICAgICBCT19BTExPQ19GT1JfUkVOREVSLAorCQkJCQkgICAgICAgSTkxNV9USUxJTkdfTk9ORSwgMCwKKwkJCQkJICAgICAgIGFsaWdubWVudCk7Cit9CisKK3N0YXRpYyBkcm1faW50ZWxfYm8gKgorZHJtX2ludGVsX2dlbV9ib19hbGxvYyhkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLAorCQkgICAgICAgdW5zaWduZWQgaW50IGFsaWdubWVudCkKK3sKKwlyZXR1cm4gZHJtX2ludGVsX2dlbV9ib19hbGxvY19pbnRlcm5hbChidWZtZ3IsIG5hbWUsIHNpemUsIDAsCisJCQkJCSAgICAgICBJOTE1X1RJTElOR19OT05FLCAwLCAwKTsKK30KKworc3RhdGljIGRybV9pbnRlbF9ibyAqCitkcm1faW50ZWxfZ2VtX2JvX2FsbG9jX3RpbGVkKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgaW50IHgsIGludCB5LCBpbnQgY3BwLCB1aW50MzJfdCAqdGlsaW5nX21vZGUsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgKnBpdGNoLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopYnVmbWdyOworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgc3RyaWRlOworCXVpbnQzMl90IHRpbGluZzsKKworCWRvIHsKKwkJdW5zaWduZWQgbG9uZyBhbGlnbmVkX3ksIGhlaWdodF9hbGlnbm1lbnQ7CisKKwkJdGlsaW5nID0gKnRpbGluZ19tb2RlOworCisJCS8qIElmIHdlJ3JlIHRpbGVkLCBvdXIgYWxsb2NhdGlvbnMgYXJlIGluIDggb3IgMzItcm93IGJsb2NrcywKKwkJICogc28gZmFpbHVyZSB0byBhbGlnbiBvdXIgaGVpZ2h0IG1lYW5zIHRoYXQgd2Ugd29uJ3QgYWxsb2NhdGUKKwkJICogZW5vdWdoIHBhZ2VzLgorCQkgKgorCQkgKiBJZiB3ZSdyZSB1bnRpbGVkLCB3ZSBzdGlsbCBoYXZlIHRvIGFsaWduIHRvIDIgcm93cyBoaWdoCisJCSAqIGJlY2F1c2UgdGhlIGRhdGEgcG9ydCBhY2Nlc3NlcyAyeDIgYmxvY2tzIGV2ZW4gaWYgdGhlCisJCSAqIGJvdHRvbSByb3cgaXNuJ3QgdG8gYmUgcmVuZGVyZWQsIHNvIGZhaWx1cmUgdG8gYWxpZ24gbWVhbnMKKwkJICogd2UgY291bGQgd2FsayBvZmYgdGhlIGVuZCBvZiB0aGUgR1RUIGFuZCBmYXVsdC4gIFRoaXMgaXMKKwkJICogZG9jdW1lbnRlZCBvbiA5NjUsIGFuZCBtYXkgYmUgdGhlIGNhc2Ugb24gb2xkZXIgY2hpcHNldHMKKwkJICogdG9vIHNvIHdlIHRyeSB0byBiZSBjYXJlZnVsLgorCQkgKi8KKwkJYWxpZ25lZF95ID0geTsKKwkJaGVpZ2h0X2FsaWdubWVudCA9IDI7CisKKwkJaWYgKChidWZtZ3JfZ2VtLT5nZW4gPT0gMikgJiYgdGlsaW5nICE9IEk5MTVfVElMSU5HX05PTkUpCisJCQloZWlnaHRfYWxpZ25tZW50ID0gMTY7CisJCWVsc2UgaWYgKHRpbGluZyA9PSBJOTE1X1RJTElOR19YCisJCQl8fCAoSVNfOTE1KGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpCisJCQkgICAgJiYgdGlsaW5nID09IEk5MTVfVElMSU5HX1kpKQorCQkJaGVpZ2h0X2FsaWdubWVudCA9IDg7CisJCWVsc2UgaWYgKHRpbGluZyA9PSBJOTE1X1RJTElOR19ZKQorCQkJaGVpZ2h0X2FsaWdubWVudCA9IDMyOworCQlhbGlnbmVkX3kgPSBBTElHTih5LCBoZWlnaHRfYWxpZ25tZW50KTsKKworCQlzdHJpZGUgPSB4ICogY3BwOworCQlzdHJpZGUgPSBkcm1faW50ZWxfZ2VtX2JvX3RpbGVfcGl0Y2goYnVmbWdyX2dlbSwgc3RyaWRlLCB0aWxpbmdfbW9kZSk7CisJCXNpemUgPSBzdHJpZGUgKiBhbGlnbmVkX3k7CisJCXNpemUgPSBkcm1faW50ZWxfZ2VtX2JvX3RpbGVfc2l6ZShidWZtZ3JfZ2VtLCBzaXplLCB0aWxpbmdfbW9kZSk7CisJfSB3aGlsZSAoKnRpbGluZ19tb2RlICE9IHRpbGluZyk7CisJKnBpdGNoID0gc3RyaWRlOworCisJaWYgKHRpbGluZyA9PSBJOTE1X1RJTElOR19OT05FKQorCQlzdHJpZGUgPSAwOworCisJcmV0dXJuIGRybV9pbnRlbF9nZW1fYm9fYWxsb2NfaW50ZXJuYWwoYnVmbWdyLCBuYW1lLCBzaXplLCBmbGFncywKKwkJCQkJICAgICAgIHRpbGluZywgc3RyaWRlLCAwKTsKK30KKworc3RhdGljIGRybV9pbnRlbF9ibyAqCitkcm1faW50ZWxfZ2VtX2JvX2FsbG9jX3VzZXJwdHIoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAorCQkJCWNvbnN0IGNoYXIgKm5hbWUsCisJCQkJdm9pZCAqYWRkciwKKwkJCQl1aW50MzJfdCB0aWxpbmdfbW9kZSwKKwkJCQl1aW50MzJfdCBzdHJpZGUsCisJCQkJdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbTsKKwlpbnQgcmV0OworCXN0cnVjdCBkcm1faTkxNV9nZW1fdXNlcnB0ciB1c2VycHRyOworCisJLyogVGlsaW5nIHdpdGggdXNlcnB0ciBzdXJmYWNlcyBpcyBub3Qgc3VwcG9ydGVkCisJICogb24gYWxsIGhhcmR3YXJlIHNvIHJlZnVzZSBpdCBmb3IgdGltZSBiZWluZy4KKwkgKi8KKwlpZiAodGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkKKwkJcmV0dXJuIE5VTEw7CisKKwlib19nZW0gPSBjYWxsb2MoMSwgc2l6ZW9mKCpib19nZW0pKTsKKwlpZiAoIWJvX2dlbSkKKwkJcmV0dXJuIE5VTEw7CisKKwlhdG9taWNfc2V0KCZib19nZW0tPnJlZmNvdW50LCAxKTsKKwlEUk1JTklUTElTVEhFQUQoJmJvX2dlbS0+dm1hX2xpc3QpOworCisJYm9fZ2VtLT5iby5zaXplID0gc2l6ZTsKKworCW1lbWNsZWFyKHVzZXJwdHIpOworCXVzZXJwdHIudXNlcl9wdHIgPSAoX191NjQpKCh1bnNpZ25lZCBsb25nKWFkZHIpOworCXVzZXJwdHIudXNlcl9zaXplID0gc2l6ZTsKKwl1c2VycHRyLmZsYWdzID0gZmxhZ3M7CisKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKKwkJCURSTV9JT0NUTF9JOTE1X0dFTV9VU0VSUFRSLAorCQkJJnVzZXJwdHIpOworCWlmIChyZXQgIT0gMCkgeworCQlEQkcoImJvX2NyZWF0ZV91c2VycHRyOiAiCisJCSAgICAiaW9jdGwgZmFpbGVkIHdpdGggdXNlciBwdHIgJXAgc2l6ZSAweCVseCwgIgorCQkgICAgInVzZXIgZmxhZ3MgMHglbHhcbiIsIGFkZHIsIHNpemUsIGZsYWdzKTsKKwkJZnJlZShib19nZW0pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJYm9fZ2VtLT5nZW1faGFuZGxlID0gdXNlcnB0ci5oYW5kbGU7CisJYm9fZ2VtLT5iby5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CisJYm9fZ2VtLT5iby5idWZtZ3IgICAgPSBidWZtZ3I7CisJYm9fZ2VtLT5pc191c2VycHRyICAgPSB0cnVlOworCWJvX2dlbS0+Ym8udmlydHVhbCAgID0gYWRkcjsKKwkvKiBTYXZlIHRoZSBhZGRyZXNzIHByb3ZpZGVkIGJ5IHVzZXIgKi8KKwlib19nZW0tPnVzZXJfdmlydHVhbCA9IGFkZHI7CisJYm9fZ2VtLT50aWxpbmdfbW9kZSAgPSBJOTE1X1RJTElOR19OT05FOworCWJvX2dlbS0+c3dpenpsZV9tb2RlID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7CisJYm9fZ2VtLT5zdHJpZGUgICAgICAgPSAwOworCisJSEFTSF9BREQoaGFuZGxlX2hoLCBidWZtZ3JfZ2VtLT5oYW5kbGVfdGFibGUsCisJCSBnZW1faGFuZGxlLCBzaXplb2YoYm9fZ2VtLT5nZW1faGFuZGxlKSwKKwkJIGJvX2dlbSk7CisKKwlib19nZW0tPm5hbWUgPSBuYW1lOworCWJvX2dlbS0+dmFsaWRhdGVfaW5kZXggPSAtMTsKKwlib19nZW0tPnJlbG9jX3RyZWVfZmVuY2VzID0gMDsKKwlib19nZW0tPnVzZWRfYXNfcmVsb2NfdGFyZ2V0ID0gZmFsc2U7CisJYm9fZ2VtLT5oYXNfZXJyb3IgPSBmYWxzZTsKKwlib19nZW0tPnJldXNhYmxlID0gZmFsc2U7CisKKwlkcm1faW50ZWxfYm9fZ2VtX3NldF9pbl9hcGVydHVyZV9zaXplKGJ1Zm1ncl9nZW0sIGJvX2dlbSwgMCk7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJREJHKCJib19jcmVhdGVfdXNlcnB0cjogIgorCSAgICAicHRyICVwIGJ1ZiAlZCAoJXMpIHNpemUgJWxkYiwgc3RyaWRlIDB4JXgsIHRpbGUgbW9kZSAlZFxuIiwKKwkJYWRkciwgYm9fZ2VtLT5nZW1faGFuZGxlLCBib19nZW0tPm5hbWUsCisJCXNpemUsIHN0cmlkZSwgdGlsaW5nX21vZGUpOworCisJcmV0dXJuICZib19nZW0tPmJvOworfQorCitzdGF0aWMgYm9vbAoraGFzX3VzZXJwdHIoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0pCit7CisJaW50IHJldDsKKwl2b2lkICpwdHI7CisJbG9uZyBwZ3N6OworCXN0cnVjdCBkcm1faTkxNV9nZW1fdXNlcnB0ciB1c2VycHRyOworCisJcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKKwlhc3NlcnQocGdzeiA+IDApOworCisJcmV0ID0gcG9zaXhfbWVtYWxpZ24oJnB0ciwgcGdzeiwgcGdzeik7CisJaWYgKHJldCkgeworCQlEQkcoIkZhaWxlZCB0byBnZXQgYSBwYWdlICglbGQpIGZvciB1c2VycHRyIGRldGVjdGlvbiFcbiIsCisJCQlwZ3N6KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCW1lbWNsZWFyKHVzZXJwdHIpOworCXVzZXJwdHIudXNlcl9wdHIgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpcHRyOworCXVzZXJwdHIudXNlcl9zaXplID0gcGdzejsKKworcmV0cnk6CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFTV9VU0VSUFRSLCAmdXNlcnB0cik7CisJaWYgKHJldCkgeworCQlpZiAoZXJybm8gPT0gRU5PREVWICYmIHVzZXJwdHIuZmxhZ3MgPT0gMCkgeworCQkJdXNlcnB0ci5mbGFncyA9IEk5MTVfVVNFUlBUUl9VTlNZTkNIUk9OSVpFRDsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwkJZnJlZShwdHIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyogV2UgZG9uJ3QgcmVsZWFzZSB0aGUgdXNlcnB0ciBibyBoZXJlIGFzIHdlIHdhbnQgdG8ga2VlcCB0aGUKKwkgKiBrZXJuZWwgbW0gdHJhY2tpbmcgYWxpdmUgZm9yIG91ciBsaWZldGltZS4gVGhlIGZpcnN0IHRpbWUgd2UKKwkgKiBjcmVhdGUgYSB1c2VycHRyIG9iamVjdCB0aGUga2VybmVsIGhhcyB0byBpbnN0YWxsIGEgbW11X25vdGlmZXIKKwkgKiB3aGljaCBpcyBhIGhlYXZ5d2VpZ2h0IG9wZXJhdGlvbiAoZS5nLiBpdCByZXF1aXJlcyB0YWtpbmcgYWxsCisJICogbW1fbG9ja3MgYW5kIHN0b3BfbWFjaGluZSgpKS4KKwkgKi8KKworCWJ1Zm1ncl9nZW0tPnVzZXJwdHJfYWN0aXZlLnB0ciA9IHB0cjsKKwlidWZtZ3JfZ2VtLT51c2VycHRyX2FjdGl2ZS5oYW5kbGUgPSB1c2VycHRyLmhhbmRsZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgZHJtX2ludGVsX2JvICoKK2NoZWNrX2JvX2FsbG9jX3VzZXJwdHIoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAorCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIHZvaWQgKmFkZHIsCisJCSAgICAgICB1aW50MzJfdCB0aWxpbmdfbW9kZSwKKwkJICAgICAgIHVpbnQzMl90IHN0cmlkZSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJaWYgKGhhc191c2VycHRyKChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKWJ1Zm1ncikpCisJCWJ1Zm1nci0+Ym9fYWxsb2NfdXNlcnB0ciA9IGRybV9pbnRlbF9nZW1fYm9fYWxsb2NfdXNlcnB0cjsKKwllbHNlCisJCWJ1Zm1nci0+Ym9fYWxsb2NfdXNlcnB0ciA9IE5VTEw7CisKKwlyZXR1cm4gZHJtX2ludGVsX2JvX2FsbG9jX3VzZXJwdHIoYnVmbWdyLCBuYW1lLCBhZGRyLAorCQkJCQkgIHRpbGluZ19tb2RlLCBzdHJpZGUsIHNpemUsIGZsYWdzKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgZHJtX2ludGVsX2JvIHdyYXBwaW5nIHRoZSBnaXZlbiBidWZmZXIgb2JqZWN0IGhhbmRsZS4KKyAqCisgKiBUaGlzIGNhbiBiZSB1c2VkIHdoZW4gb25lIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHBhc3MgYSBidWZmZXIgb2JqZWN0CisgKiB0byBhbm90aGVyLgorICovCitkcm1faW50ZWxfYm8gKgorZHJtX2ludGVsX2JvX2dlbV9jcmVhdGVfZnJvbV9uYW1lKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKKwkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICB1bnNpZ25lZCBpbnQgaGFuZGxlKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJ1Zm1ncjsKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW07CisJaW50IHJldDsKKwlzdHJ1Y3QgZHJtX2dlbV9vcGVuIG9wZW5fYXJnOworCXN0cnVjdCBkcm1faTkxNV9nZW1fZ2V0X3RpbGluZyBnZXRfdGlsaW5nOworCisJLyogQXQgdGhlIG1vbWVudCBtb3N0IGFwcGxpY2F0aW9ucyBvbmx5IGhhdmUgYSBmZXcgbmFtZWQgYm8uCisJICogRm9yIGluc3RhbmNlLCBpbiBhIERSSSBjbGllbnQgb25seSB0aGUgcmVuZGVyIGJ1ZmZlcnMgcGFzc2VkCisJICogYmV0d2VlbiBYIGFuZCB0aGUgY2xpZW50IGFyZSBuYW1lZC4gQW5kIHNpbmNlIFggcmV0dXJucyB0aGUKKwkgKiBhbHRlcm5hdGluZyBuYW1lcyBmb3IgdGhlIGZyb250L2JhY2sgYnVmZmVyIGEgbGluZWFyIHNlYXJjaAorCSAqIHByb3ZpZGVzIGEgc3VmZmljaWVudGx5IGZhc3QgbWF0Y2guCisJICovCisJcHRocmVhZF9tdXRleF9sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKKwlIQVNIX0ZJTkQobmFtZV9oaCwgYnVmbWdyX2dlbS0+bmFtZV90YWJsZSwKKwkJICAmaGFuZGxlLCBzaXplb2YoaGFuZGxlKSwgYm9fZ2VtKTsKKwlpZiAoYm9fZ2VtKSB7CisJCWRybV9pbnRlbF9nZW1fYm9fcmVmZXJlbmNlKCZib19nZW0tPmJvKTsKKwkJZ290byBvdXQ7CisJfQorCisJbWVtY2xlYXIob3Blbl9hcmcpOworCW9wZW5fYXJnLm5hbWUgPSBoYW5kbGU7CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCisJCSAgICAgICBEUk1fSU9DVExfR0VNX09QRU4sCisJCSAgICAgICAmb3Blbl9hcmcpOworCWlmIChyZXQgIT0gMCkgeworCQlEQkcoIkNvdWxkbid0IHJlZmVyZW5jZSAlcyBoYW5kbGUgMHglMDh4OiAlc1xuIiwKKwkJICAgIG5hbWUsIGhhbmRsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJYm9fZ2VtID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorICAgICAgICAvKiBOb3cgc2VlIGlmIHNvbWVvbmUgaGFzIHVzZWQgYSBwcmltZSBoYW5kbGUgdG8gZ2V0IHRoaXMKKyAgICAgICAgICogb2JqZWN0IGZyb20gdGhlIGtlcm5lbCBiZWZvcmUgYnkgbG9va2luZyB0aHJvdWdoIHRoZSBsaXN0CisgICAgICAgICAqIGFnYWluIGZvciBhIG1hdGNoaW5nIGdlbV9oYW5kbGUKKyAgICAgICAgICovCisJSEFTSF9GSU5EKGhhbmRsZV9oaCwgYnVmbWdyX2dlbS0+aGFuZGxlX3RhYmxlLAorCQkgICZvcGVuX2FyZy5oYW5kbGUsIHNpemVvZihvcGVuX2FyZy5oYW5kbGUpLCBib19nZW0pOworCWlmIChib19nZW0pIHsKKwkJZHJtX2ludGVsX2dlbV9ib19yZWZlcmVuY2UoJmJvX2dlbS0+Ym8pOworCQlnb3RvIG91dDsKKwl9CisKKwlib19nZW0gPSBjYWxsb2MoMSwgc2l6ZW9mKCpib19nZW0pKTsKKwlpZiAoIWJvX2dlbSkKKwkJZ290byBvdXQ7CisKKwlhdG9taWNfc2V0KCZib19nZW0tPnJlZmNvdW50LCAxKTsKKwlEUk1JTklUTElTVEhFQUQoJmJvX2dlbS0+dm1hX2xpc3QpOworCisJYm9fZ2VtLT5iby5zaXplID0gb3Blbl9hcmcuc2l6ZTsKKwlib19nZW0tPmJvLm9mZnNldCA9IDA7CisJYm9fZ2VtLT5iby5vZmZzZXQ2NCA9IDA7CisJYm9fZ2VtLT5iby52aXJ0dWFsID0gTlVMTDsKKwlib19nZW0tPmJvLmJ1Zm1nciA9IGJ1Zm1ncjsKKwlib19nZW0tPm5hbWUgPSBuYW1lOworCWJvX2dlbS0+dmFsaWRhdGVfaW5kZXggPSAtMTsKKwlib19nZW0tPmdlbV9oYW5kbGUgPSBvcGVuX2FyZy5oYW5kbGU7CisJYm9fZ2VtLT5iby5oYW5kbGUgPSBvcGVuX2FyZy5oYW5kbGU7CisJYm9fZ2VtLT5nbG9iYWxfbmFtZSA9IGhhbmRsZTsKKwlib19nZW0tPnJldXNhYmxlID0gZmFsc2U7CisKKwlIQVNIX0FERChoYW5kbGVfaGgsIGJ1Zm1ncl9nZW0tPmhhbmRsZV90YWJsZSwKKwkJIGdlbV9oYW5kbGUsIHNpemVvZihib19nZW0tPmdlbV9oYW5kbGUpLCBib19nZW0pOworCUhBU0hfQUREKG5hbWVfaGgsIGJ1Zm1ncl9nZW0tPm5hbWVfdGFibGUsCisJCSBnbG9iYWxfbmFtZSwgc2l6ZW9mKGJvX2dlbS0+Z2xvYmFsX25hbWUpLCBib19nZW0pOworCisJbWVtY2xlYXIoZ2V0X3RpbGluZyk7CisJZ2V0X3RpbGluZy5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCisJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fR0VUX1RJTElORywKKwkJICAgICAgICZnZXRfdGlsaW5nKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gZXJyX3VucmVmOworCisJYm9fZ2VtLT50aWxpbmdfbW9kZSA9IGdldF90aWxpbmcudGlsaW5nX21vZGU7CisJYm9fZ2VtLT5zd2l6emxlX21vZGUgPSBnZXRfdGlsaW5nLnN3aXp6bGVfbW9kZTsKKwkvKiBYWFggc3RyaWRlIGlzIHVua25vd24gKi8KKwlkcm1faW50ZWxfYm9fZ2VtX3NldF9pbl9hcGVydHVyZV9zaXplKGJ1Zm1ncl9nZW0sIGJvX2dlbSwgMCk7CisJREJHKCJib19jcmVhdGVfZnJvbV9oYW5kbGU6ICVkICglcylcbiIsIGhhbmRsZSwgYm9fZ2VtLT5uYW1lKTsKKworb3V0OgorCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKKwlyZXR1cm4gJmJvX2dlbS0+Ym87CisKK2Vycl91bnJlZjoKKwlkcm1faW50ZWxfZ2VtX2JvX2ZyZWUoJmJvX2dlbS0+Ym8pOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2RybV9pbnRlbF9nZW1fYm9fZnJlZShkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisJc3RydWN0IGRybV9nZW1fY2xvc2UgY2xvc2U7CisJaW50IHJldDsKKworCURSTUxJU1RERUwoJmJvX2dlbS0+dm1hX2xpc3QpOworCWlmIChib19nZW0tPm1lbV92aXJ0dWFsKSB7CisJCVZHKFZBTEdSSU5EX0ZSRUVMSUtFX0JMT0NLKGJvX2dlbS0+bWVtX3ZpcnR1YWwsIDApKTsKKwkJZHJtX211bm1hcChib19nZW0tPm1lbV92aXJ0dWFsLCBib19nZW0tPmJvLnNpemUpOworCQlidWZtZ3JfZ2VtLT52bWFfY291bnQtLTsKKwl9CisJaWYgKGJvX2dlbS0+d2NfdmlydHVhbCkgeworCQlWRyhWQUxHUklORF9GUkVFTElLRV9CTE9DSyhib19nZW0tPndjX3ZpcnR1YWwsIDApKTsKKwkJZHJtX211bm1hcChib19nZW0tPndjX3ZpcnR1YWwsIGJvX2dlbS0+Ym8uc2l6ZSk7CisJCWJ1Zm1ncl9nZW0tPnZtYV9jb3VudC0tOworCX0KKwlpZiAoYm9fZ2VtLT5ndHRfdmlydHVhbCkgeworCQlkcm1fbXVubWFwKGJvX2dlbS0+Z3R0X3ZpcnR1YWwsIGJvX2dlbS0+Ym8uc2l6ZSk7CisJCWJ1Zm1ncl9nZW0tPnZtYV9jb3VudC0tOworCX0KKworCWlmIChib19nZW0tPmdsb2JhbF9uYW1lKQorCQlIQVNIX0RFTEVURShuYW1lX2hoLCBidWZtZ3JfZ2VtLT5uYW1lX3RhYmxlLCBib19nZW0pOworCUhBU0hfREVMRVRFKGhhbmRsZV9oaCwgYnVmbWdyX2dlbS0+aGFuZGxlX3RhYmxlLCBib19nZW0pOworCisJLyogQ2xvc2UgdGhpcyBvYmplY3QgKi8KKwltZW1jbGVhcihjbG9zZSk7CisJY2xvc2UuaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOworCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfR0VNX0NMT1NFLCAmY2xvc2UpOworCWlmIChyZXQgIT0gMCkgeworCQlEQkcoIkRSTV9JT0NUTF9HRU1fQ0xPU0UgJWQgZmFpbGVkICglcyk6ICVzXG4iLAorCQkgICAgYm9fZ2VtLT5nZW1faGFuZGxlLCBib19nZW0tPm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJfQorCWZyZWUoYm8pOworfQorCitzdGF0aWMgdm9pZAorZHJtX2ludGVsX2dlbV9ib19tYXJrX21tYXBzX2luY29oZXJlbnQoZHJtX2ludGVsX2JvICpibykKK3sKKyNpZiBIQVZFX1ZBTEdSSU5ECisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisKKwlpZiAoYm9fZ2VtLT5tZW1fdmlydHVhbCkKKwkJVkFMR1JJTkRfTUFLRV9NRU1fTk9BQ0NFU1MoYm9fZ2VtLT5tZW1fdmlydHVhbCwgYm8tPnNpemUpOworCisJaWYgKGJvX2dlbS0+d2NfdmlydHVhbCkKKwkJVkFMR1JJTkRfTUFLRV9NRU1fTk9BQ0NFU1MoYm9fZ2VtLT53Y192aXJ0dWFsLCBiby0+c2l6ZSk7CisKKwlpZiAoYm9fZ2VtLT5ndHRfdmlydHVhbCkKKwkJVkFMR1JJTkRfTUFLRV9NRU1fTk9BQ0NFU1MoYm9fZ2VtLT5ndHRfdmlydHVhbCwgYm8tPnNpemUpOworI2VuZGlmCit9CisKKy8qKiBGcmVlcyBhbGwgY2FjaGVkIGJ1ZmZlcnMgc2lnbmlmaWNhbnRseSBvbGRlciB0aGFuIEB0aW1lLiAqLworc3RhdGljIHZvaWQKK2RybV9pbnRlbF9nZW1fY2xlYW51cF9ib19jYWNoZShkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSwgdGltZV90IHRpbWUpCit7CisJaW50IGk7CisKKwlpZiAoYnVmbWdyX2dlbS0+dGltZSA9PSB0aW1lKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgYnVmbWdyX2dlbS0+bnVtX2J1Y2tldHM7IGkrKykgeworCQlzdHJ1Y3QgZHJtX2ludGVsX2dlbV9ib19idWNrZXQgKmJ1Y2tldCA9CisJCSAgICAmYnVmbWdyX2dlbS0+Y2FjaGVfYnVja2V0W2ldOworCisJCXdoaWxlICghRFJNTElTVEVNUFRZKCZidWNrZXQtPmhlYWQpKSB7CisJCQlkcm1faW50ZWxfYm9fZ2VtICpib19nZW07CisKKwkJCWJvX2dlbSA9IERSTUxJU1RFTlRSWShkcm1faW50ZWxfYm9fZ2VtLAorCQkJCQkgICAgICBidWNrZXQtPmhlYWQubmV4dCwgaGVhZCk7CisJCQlpZiAodGltZSAtIGJvX2dlbS0+ZnJlZV90aW1lIDw9IDEpCisJCQkJYnJlYWs7CisKKwkJCURSTUxJU1RERUwoJmJvX2dlbS0+aGVhZCk7CisKKwkJCWRybV9pbnRlbF9nZW1fYm9fZnJlZSgmYm9fZ2VtLT5ibyk7CisJCX0KKwl9CisKKwlidWZtZ3JfZ2VtLT50aW1lID0gdGltZTsKK30KKworc3RhdGljIHZvaWQgZHJtX2ludGVsX2dlbV9ib19wdXJnZV92bWFfY2FjaGUoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0pCit7CisJaW50IGxpbWl0OworCisJREJHKCIlczogY2FjaGVkPSVkLCBvcGVuPSVkLCBsaW1pdD0lZFxuIiwgX19GVU5DVElPTl9fLAorCSAgICBidWZtZ3JfZ2VtLT52bWFfY291bnQsIGJ1Zm1ncl9nZW0tPnZtYV9vcGVuLCBidWZtZ3JfZ2VtLT52bWFfbWF4KTsKKworCWlmIChidWZtZ3JfZ2VtLT52bWFfbWF4IDwgMCkKKwkJcmV0dXJuOworCisJLyogV2UgbWF5IG5lZWQgdG8gZXZpY3QgYSBmZXcgZW50cmllcyBpbiBvcmRlciB0byBjcmVhdGUgbmV3IG1tYXBzICovCisJbGltaXQgPSBidWZtZ3JfZ2VtLT52bWFfbWF4IC0gMipidWZtZ3JfZ2VtLT52bWFfb3BlbjsKKwlpZiAobGltaXQgPCAwKQorCQlsaW1pdCA9IDA7CisKKwl3aGlsZSAoYnVmbWdyX2dlbS0+dm1hX2NvdW50ID4gbGltaXQpIHsKKwkJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtOworCisJCWJvX2dlbSA9IERSTUxJU1RFTlRSWShkcm1faW50ZWxfYm9fZ2VtLAorCQkJCSAgICAgIGJ1Zm1ncl9nZW0tPnZtYV9jYWNoZS5uZXh0LAorCQkJCSAgICAgIHZtYV9saXN0KTsKKwkJYXNzZXJ0KGJvX2dlbS0+bWFwX2NvdW50ID09IDApOworCQlEUk1MSVNUREVMSU5JVCgmYm9fZ2VtLT52bWFfbGlzdCk7CisKKwkJaWYgKGJvX2dlbS0+bWVtX3ZpcnR1YWwpIHsKKwkJCWRybV9tdW5tYXAoYm9fZ2VtLT5tZW1fdmlydHVhbCwgYm9fZ2VtLT5iby5zaXplKTsKKwkJCWJvX2dlbS0+bWVtX3ZpcnR1YWwgPSBOVUxMOworCQkJYnVmbWdyX2dlbS0+dm1hX2NvdW50LS07CisJCX0KKwkJaWYgKGJvX2dlbS0+d2NfdmlydHVhbCkgeworCQkJZHJtX211bm1hcChib19nZW0tPndjX3ZpcnR1YWwsIGJvX2dlbS0+Ym8uc2l6ZSk7CisJCQlib19nZW0tPndjX3ZpcnR1YWwgPSBOVUxMOworCQkJYnVmbWdyX2dlbS0+dm1hX2NvdW50LS07CisJCX0KKwkJaWYgKGJvX2dlbS0+Z3R0X3ZpcnR1YWwpIHsKKwkJCWRybV9tdW5tYXAoYm9fZ2VtLT5ndHRfdmlydHVhbCwgYm9fZ2VtLT5iby5zaXplKTsKKwkJCWJvX2dlbS0+Z3R0X3ZpcnR1YWwgPSBOVUxMOworCQkJYnVmbWdyX2dlbS0+dm1hX2NvdW50LS07CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRybV9pbnRlbF9nZW1fYm9fY2xvc2Vfdm1hKGRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtLAorCQkJCSAgICAgICBkcm1faW50ZWxfYm9fZ2VtICpib19nZW0pCit7CisJYnVmbWdyX2dlbS0+dm1hX29wZW4tLTsKKwlEUk1MSVNUQUREVEFJTCgmYm9fZ2VtLT52bWFfbGlzdCwgJmJ1Zm1ncl9nZW0tPnZtYV9jYWNoZSk7CisJaWYgKGJvX2dlbS0+bWVtX3ZpcnR1YWwpCisJCWJ1Zm1ncl9nZW0tPnZtYV9jb3VudCsrOworCWlmIChib19nZW0tPndjX3ZpcnR1YWwpCisJCWJ1Zm1ncl9nZW0tPnZtYV9jb3VudCsrOworCWlmIChib19nZW0tPmd0dF92aXJ0dWFsKQorCQlidWZtZ3JfZ2VtLT52bWFfY291bnQrKzsKKwlkcm1faW50ZWxfZ2VtX2JvX3B1cmdlX3ZtYV9jYWNoZShidWZtZ3JfZ2VtKTsKK30KKworc3RhdGljIHZvaWQgZHJtX2ludGVsX2dlbV9ib19vcGVuX3ZtYShkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSwKKwkJCQkgICAgICBkcm1faW50ZWxfYm9fZ2VtICpib19nZW0pCit7CisJYnVmbWdyX2dlbS0+dm1hX29wZW4rKzsKKwlEUk1MSVNUREVMKCZib19nZW0tPnZtYV9saXN0KTsKKwlpZiAoYm9fZ2VtLT5tZW1fdmlydHVhbCkKKwkJYnVmbWdyX2dlbS0+dm1hX2NvdW50LS07CisJaWYgKGJvX2dlbS0+d2NfdmlydHVhbCkKKwkJYnVmbWdyX2dlbS0+dm1hX2NvdW50LS07CisJaWYgKGJvX2dlbS0+Z3R0X3ZpcnR1YWwpCisJCWJ1Zm1ncl9nZW0tPnZtYV9jb3VudC0tOworCWRybV9pbnRlbF9nZW1fYm9fcHVyZ2Vfdm1hX2NhY2hlKGJ1Zm1ncl9nZW0pOworfQorCitzdGF0aWMgdm9pZAorZHJtX2ludGVsX2dlbV9ib191bnJlZmVyZW5jZV9maW5hbChkcm1faW50ZWxfYm8gKmJvLCB0aW1lX3QgdGltZSkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCXN0cnVjdCBkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldCAqYnVja2V0OworCWludCBpOworCisJLyogVW5yZWZlcmVuY2UgYWxsIHRoZSB0YXJnZXQgYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBib19nZW0tPnJlbG9jX2NvdW50OyBpKyspIHsKKwkJaWYgKGJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm9baV0uYm8gIT0gYm8pIHsKKwkJCWRybV9pbnRlbF9nZW1fYm9fdW5yZWZlcmVuY2VfbG9ja2VkX3RpbWVkKGJvX2dlbS0+CisJCQkJCQkJCSAgcmVsb2NfdGFyZ2V0X2luZm9baV0uYm8sCisJCQkJCQkJCSAgdGltZSk7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IGJvX2dlbS0+c29mdHBpbl90YXJnZXRfY291bnQ7IGkrKykKKwkJZHJtX2ludGVsX2dlbV9ib191bnJlZmVyZW5jZV9sb2NrZWRfdGltZWQoYm9fZ2VtLT5zb2Z0cGluX3RhcmdldFtpXSwKKwkJCQkJCQkJICB0aW1lKTsKKwlib19nZW0tPmtmbGFncyA9IDA7CisJYm9fZ2VtLT5yZWxvY19jb3VudCA9IDA7CisJYm9fZ2VtLT51c2VkX2FzX3JlbG9jX3RhcmdldCA9IGZhbHNlOworCWJvX2dlbS0+c29mdHBpbl90YXJnZXRfY291bnQgPSAwOworCisJREJHKCJib191bnJlZmVyZW5jZSBmaW5hbDogJWQgKCVzKVxuIiwKKwkgICAgYm9fZ2VtLT5nZW1faGFuZGxlLCBib19nZW0tPm5hbWUpOworCisJLyogcmVsZWFzZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0ICovCisJaWYgKGJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm8pIHsKKwkJZnJlZShib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvKTsKKwkJYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mbyA9IE5VTEw7CisJfQorCWlmIChib19nZW0tPnJlbG9jcykgeworCQlmcmVlKGJvX2dlbS0+cmVsb2NzKTsKKwkJYm9fZ2VtLT5yZWxvY3MgPSBOVUxMOworCX0KKwlpZiAoYm9fZ2VtLT5zb2Z0cGluX3RhcmdldCkgeworCQlmcmVlKGJvX2dlbS0+c29mdHBpbl90YXJnZXQpOworCQlib19nZW0tPnNvZnRwaW5fdGFyZ2V0ID0gTlVMTDsKKwkJYm9fZ2VtLT5zb2Z0cGluX3RhcmdldF9zaXplID0gMDsKKwl9CisKKwkvKiBDbGVhciBhbnkgbGVmdC1vdmVyIG1hcHBpbmdzICovCisJaWYgKGJvX2dlbS0+bWFwX2NvdW50KSB7CisJCURCRygiYm8gZnJlZWQgd2l0aCBub24temVybyBtYXAtY291bnQgJWRcbiIsIGJvX2dlbS0+bWFwX2NvdW50KTsKKwkJYm9fZ2VtLT5tYXBfY291bnQgPSAwOworCQlkcm1faW50ZWxfZ2VtX2JvX2Nsb3NlX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOworCQlkcm1faW50ZWxfZ2VtX2JvX21hcmtfbW1hcHNfaW5jb2hlcmVudChibyk7CisJfQorCisJYnVja2V0ID0gZHJtX2ludGVsX2dlbV9ib19idWNrZXRfZm9yX3NpemUoYnVmbWdyX2dlbSwgYm8tPnNpemUpOworCS8qIFB1dCB0aGUgYnVmZmVyIGludG8gb3VyIGludGVybmFsIGNhY2hlIGZvciByZXVzZSBpZiB3ZSBjYW4uICovCisJaWYgKGJ1Zm1ncl9nZW0tPmJvX3JldXNlICYmIGJvX2dlbS0+cmV1c2FibGUgJiYgYnVja2V0ICE9IE5VTEwgJiYKKwkgICAgZHJtX2ludGVsX2dlbV9ib19tYWR2aXNlX2ludGVybmFsKGJ1Zm1ncl9nZW0sIGJvX2dlbSwKKwkJCQkJICAgICAgSTkxNV9NQURWX0RPTlRORUVEKSkgeworCQlib19nZW0tPmZyZWVfdGltZSA9IHRpbWU7CisKKwkJYm9fZ2VtLT5uYW1lID0gTlVMTDsKKwkJYm9fZ2VtLT52YWxpZGF0ZV9pbmRleCA9IC0xOworCisJCURSTUxJU1RBRERUQUlMKCZib19nZW0tPmhlYWQsICZidWNrZXQtPmhlYWQpOworCX0gZWxzZSB7CisJCWRybV9pbnRlbF9nZW1fYm9fZnJlZShibyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkcm1faW50ZWxfZ2VtX2JvX3VucmVmZXJlbmNlX2xvY2tlZF90aW1lZChkcm1faW50ZWxfYm8gKmJvLAorCQkJCQkJICAgICAgdGltZV90IHRpbWUpCit7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisKKwlhc3NlcnQoYXRvbWljX3JlYWQoJmJvX2dlbS0+cmVmY291bnQpID4gMCk7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJvX2dlbS0+cmVmY291bnQpKQorCQlkcm1faW50ZWxfZ2VtX2JvX3VucmVmZXJlbmNlX2ZpbmFsKGJvLCB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgZHJtX2ludGVsX2dlbV9ib191bnJlZmVyZW5jZShkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCisJYXNzZXJ0KGF0b21pY19yZWFkKCZib19nZW0tPnJlZmNvdW50KSA+IDApOworCisJaWYgKGF0b21pY19hZGRfdW5sZXNzKCZib19nZW0tPnJlZmNvdW50LCAtMSwgMSkpIHsKKwkJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPQorCQkgICAgKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7CisJCXN0cnVjdCB0aW1lc3BlYyB0aW1lOworCisJCWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdGltZSk7CisKKwkJcHRocmVhZF9tdXRleF9sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKKworCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYm9fZ2VtLT5yZWZjb3VudCkpIHsKKwkJCWRybV9pbnRlbF9nZW1fYm9fdW5yZWZlcmVuY2VfZmluYWwoYm8sIHRpbWUudHZfc2VjKTsKKwkJCWRybV9pbnRlbF9nZW1fY2xlYW51cF9ib19jYWNoZShidWZtZ3JfZ2VtLCB0aW1lLnR2X3NlYyk7CisJCX0KKworCQlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisJfQorfQorCitzdGF0aWMgaW50IGRybV9pbnRlbF9nZW1fYm9fbWFwKGRybV9pbnRlbF9ibyAqYm8sIGludCB3cml0ZV9lbmFibGUpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3NldF9kb21haW4gc2V0X2RvbWFpbjsKKwlpbnQgcmV0OworCisJaWYgKGJvX2dlbS0+aXNfdXNlcnB0cikgeworCQkvKiBSZXR1cm4gdGhlIHNhbWUgdXNlciBwdHIgKi8KKwkJYm8tPnZpcnR1YWwgPSBib19nZW0tPnVzZXJfdmlydHVhbDsKKwkJcmV0dXJuIDA7CisJfQorCisJcHRocmVhZF9tdXRleF9sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKKworCWlmIChib19nZW0tPm1hcF9jb3VudCsrID09IDApCisJCWRybV9pbnRlbF9nZW1fYm9fb3Blbl92bWEoYnVmbWdyX2dlbSwgYm9fZ2VtKTsKKworCWlmICghYm9fZ2VtLT5tZW1fdmlydHVhbCkgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXAgbW1hcF9hcmc7CisKKwkJREJHKCJib19tYXA6ICVkICglcyksIG1hcF9jb3VudD0lZFxuIiwKKwkJICAgIGJvX2dlbS0+Z2VtX2hhbmRsZSwgYm9fZ2VtLT5uYW1lLCBib19nZW0tPm1hcF9jb3VudCk7CisKKwkJbWVtY2xlYXIobW1hcF9hcmcpOworCQltbWFwX2FyZy5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CisJCW1tYXBfYXJnLnNpemUgPSBiby0+c2l6ZTsKKwkJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCisJCQkgICAgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX01NQVAsCisJCQkgICAgICAgJm1tYXBfYXJnKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlyZXQgPSAtZXJybm87CisJCQlEQkcoIiVzOiVkOiBFcnJvciBtYXBwaW5nIGJ1ZmZlciAlZCAoJXMpOiAlcyAuXG4iLAorCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgYm9fZ2VtLT5nZW1faGFuZGxlLAorCQkJICAgIGJvX2dlbS0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWlmICgtLWJvX2dlbS0+bWFwX2NvdW50ID09IDApCisJCQkJZHJtX2ludGVsX2dlbV9ib19jbG9zZV92bWEoYnVmbWdyX2dlbSwgYm9fZ2VtKTsKKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJVkcoVkFMR1JJTkRfTUFMTE9DTElLRV9CTE9DSyhtbWFwX2FyZy5hZGRyX3B0ciwgbW1hcF9hcmcuc2l6ZSwgMCwgMSkpOworCQlib19nZW0tPm1lbV92aXJ0dWFsID0gKHZvaWQgKikodWludHB0cl90KSBtbWFwX2FyZy5hZGRyX3B0cjsKKwl9CisJREJHKCJib19tYXA6ICVkICglcykgLT4gJXBcbiIsIGJvX2dlbS0+Z2VtX2hhbmRsZSwgYm9fZ2VtLT5uYW1lLAorCSAgICBib19nZW0tPm1lbV92aXJ0dWFsKTsKKwliby0+dmlydHVhbCA9IGJvX2dlbS0+bWVtX3ZpcnR1YWw7CisKKwltZW1jbGVhcihzZXRfZG9tYWluKTsKKwlzZXRfZG9tYWluLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKKwlzZXRfZG9tYWluLnJlYWRfZG9tYWlucyA9IEk5MTVfR0VNX0RPTUFJTl9DUFU7CisJaWYgKHdyaXRlX2VuYWJsZSkKKwkJc2V0X2RvbWFpbi53cml0ZV9kb21haW4gPSBJOTE1X0dFTV9ET01BSU5fQ1BVOworCWVsc2UKKwkJc2V0X2RvbWFpbi53cml0ZV9kb21haW4gPSAwOworCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAorCQkgICAgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX1NFVF9ET01BSU4sCisJCSAgICAgICAmc2V0X2RvbWFpbik7CisJaWYgKHJldCAhPSAwKSB7CisJCURCRygiJXM6JWQ6IEVycm9yIHNldHRpbmcgdG8gQ1BVIGRvbWFpbiAlZDogJXNcbiIsCisJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGJvX2dlbS0+Z2VtX2hhbmRsZSwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJfQorCisJaWYgKHdyaXRlX2VuYWJsZSkKKwkJYm9fZ2VtLT5tYXBwZWRfY3B1X3dyaXRlID0gdHJ1ZTsKKworCWRybV9pbnRlbF9nZW1fYm9fbWFya19tbWFwc19pbmNvaGVyZW50KGJvKTsKKwlWRyhWQUxHUklORF9NQUtFX01FTV9ERUZJTkVEKGJvX2dlbS0+bWVtX3ZpcnR1YWwsIGJvLT5zaXplKSk7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK21hcF9ndHQoZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCWludCByZXQ7CisKKwlpZiAoYm9fZ2VtLT5pc191c2VycHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChib19nZW0tPm1hcF9jb3VudCsrID09IDApCisJCWRybV9pbnRlbF9nZW1fYm9fb3Blbl92bWEoYnVmbWdyX2dlbSwgYm9fZ2VtKTsKKworCS8qIEdldCBhIG1hcHBpbmcgb2YgdGhlIGJ1ZmZlciBpZiB3ZSBoYXZlbid0IGJlZm9yZS4gKi8KKwlpZiAoYm9fZ2VtLT5ndHRfdmlydHVhbCA9PSBOVUxMKSB7CisJCXN0cnVjdCBkcm1faTkxNV9nZW1fbW1hcF9ndHQgbW1hcF9hcmc7CisKKwkJREJHKCJib19tYXBfZ3R0OiBtbWFwICVkICglcyksIG1hcF9jb3VudD0lZFxuIiwKKwkJICAgIGJvX2dlbS0+Z2VtX2hhbmRsZSwgYm9fZ2VtLT5uYW1lLCBib19nZW0tPm1hcF9jb3VudCk7CisKKwkJbWVtY2xlYXIobW1hcF9hcmcpOworCQltbWFwX2FyZy5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CisKKwkJLyogR2V0IHRoZSBmYWtlIG9mZnNldCBiYWNrLi4uICovCisJCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAorCQkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9NTUFQX0dUVCwKKwkJCSAgICAgICAmbW1hcF9hcmcpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXJldCA9IC1lcnJubzsKKwkJCURCRygiJXM6JWQ6IEVycm9yIHByZXBhcmluZyBidWZmZXIgbWFwICVkICglcyk6ICVzIC5cbiIsCisJCQkgICAgX19GSUxFX18sIF9fTElORV9fLAorCQkJICAgIGJvX2dlbS0+Z2VtX2hhbmRsZSwgYm9fZ2VtLT5uYW1lLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCQlpZiAoLS1ib19nZW0tPm1hcF9jb3VudCA9PSAwKQorCQkJCWRybV9pbnRlbF9nZW1fYm9fY2xvc2Vfdm1hKGJ1Zm1ncl9nZW0sIGJvX2dlbSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJLyogYW5kIG1tYXAgaXQgKi8KKwkJYm9fZ2VtLT5ndHRfdmlydHVhbCA9IGRybV9tbWFwKDAsIGJvLT5zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCQkJCQkgICAgICAgTUFQX1NIQVJFRCwgYnVmbWdyX2dlbS0+ZmQsCisJCQkJCSAgICAgICBtbWFwX2FyZy5vZmZzZXQpOworCQlpZiAoYm9fZ2VtLT5ndHRfdmlydHVhbCA9PSBNQVBfRkFJTEVEKSB7CisJCQlib19nZW0tPmd0dF92aXJ0dWFsID0gTlVMTDsKKwkJCXJldCA9IC1lcnJubzsKKwkJCURCRygiJXM6JWQ6IEVycm9yIG1hcHBpbmcgYnVmZmVyICVkICglcyk6ICVzIC5cbiIsCisJCQkgICAgX19GSUxFX18sIF9fTElORV9fLAorCQkJICAgIGJvX2dlbS0+Z2VtX2hhbmRsZSwgYm9fZ2VtLT5uYW1lLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCQlpZiAoLS1ib19nZW0tPm1hcF9jb3VudCA9PSAwKQorCQkJCWRybV9pbnRlbF9nZW1fYm9fY2xvc2Vfdm1hKGJ1Zm1ncl9nZW0sIGJvX2dlbSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJYm8tPnZpcnR1YWwgPSBib19nZW0tPmd0dF92aXJ0dWFsOworCisJREJHKCJib19tYXBfZ3R0OiAlZCAoJXMpIC0+ICVwXG4iLCBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwKKwkgICAgYm9fZ2VtLT5ndHRfdmlydHVhbCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50Citkcm1faW50ZWxfZ2VtX2JvX21hcF9ndHQoZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCXN0cnVjdCBkcm1faTkxNV9nZW1fc2V0X2RvbWFpbiBzZXRfZG9tYWluOworCWludCByZXQ7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJcmV0ID0gbWFwX2d0dChibyk7CisJaWYgKHJldCkgeworCQlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogTm93IG1vdmUgaXQgdG8gdGhlIEdUVCBkb21haW4gc28gdGhhdCB0aGUgR1BVIGFuZCBDUFUKKwkgKiBjYWNoZXMgYXJlIGZsdXNoZWQgYW5kIHRoZSBHUFUgaXNuJ3QgYWN0aXZlbHkgdXNpbmcgdGhlCisJICogYnVmZmVyLgorCSAqCisJICogVGhlIHBhZ2VmYXVsdCBoYW5kbGVyIGRvZXMgdGhpcyBkb21haW4gY2hhbmdlIGZvciB1cyB3aGVuCisJICogaXQgaGFzIHVuYm91bmQgdGhlIEJPIGZyb20gdGhlIEdUVCwgYnV0IGl0J3MgdXAgdG8gdXMgdG8KKwkgKiB0ZWxsIGl0IHdoZW4gd2UncmUgYWJvdXQgdG8gdXNlIHRoaW5ncyBpZiB3ZSBoYWQgZG9uZQorCSAqIHJlbmRlcmluZyBhbmQgaXQgc3RpbGwgaGFwcGVucyB0byBiZSBib3VuZCB0byB0aGUgR1RULgorCSAqLworCW1lbWNsZWFyKHNldF9kb21haW4pOworCXNldF9kb21haW4uaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOworCXNldF9kb21haW4ucmVhZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlOX0dUVDsKKwlzZXRfZG9tYWluLndyaXRlX2RvbWFpbiA9IEk5MTVfR0VNX0RPTUFJTl9HVFQ7CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCisJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fU0VUX0RPTUFJTiwKKwkJICAgICAgICZzZXRfZG9tYWluKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJREJHKCIlczolZDogRXJyb3Igc2V0dGluZyBkb21haW4gJWQ6ICVzXG4iLAorCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBib19nZW0tPmdlbV9oYW5kbGUsCisJCSAgICBzdHJlcnJvcihlcnJubykpOworCX0KKworCWRybV9pbnRlbF9nZW1fYm9fbWFya19tbWFwc19pbmNvaGVyZW50KGJvKTsKKwlWRyhWQUxHUklORF9NQUtFX01FTV9ERUZJTkVEKGJvX2dlbS0+Z3R0X3ZpcnR1YWwsIGJvLT5zaXplKSk7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUGVyZm9ybXMgYSBtYXBwaW5nIG9mIHRoZSBidWZmZXIgb2JqZWN0IGxpa2UgdGhlIG5vcm1hbCBHVFQKKyAqIG1hcHBpbmcsIGJ1dCBhdm9pZHMgd2FpdGluZyBmb3IgdGhlIEdQVSB0byBiZSBkb25lIHJlYWRpbmcgZnJvbSBvcgorICogcmVuZGVyaW5nIHRvIHRoZSBidWZmZXIuCisgKgorICogVGhpcyBpcyB1c2VkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBHTF9BUkJfbWFwX2J1ZmZlcl9yYW5nZTogVGhlCisgKiB1c2VyIGFza3MgdG8gY3JlYXRlIGEgYnVmZmVyLCB0aGVuIGRvZXMgYSBtYXBwaW5nLCBmaWxscyBzb21lCisgKiBzcGFjZSwgcnVucyBhIGRyYXdpbmcgY29tbWFuZCwgdGhlbiBhc2tzIHRvIG1hcCBpdCBhZ2FpbiB3aXRob3V0CisgKiBzeW5jaHJvbml6aW5nIGJlY2F1c2UgaXQgZ3VhcmFudGVlcyB0aGF0IGl0IHdvbid0IHdyaXRlIG92ZXIgdGhlCisgKiBkYXRhIHRoYXQgdGhlIEdQVSBpcyBidXN5IHVzaW5nIChvciwgbW9yZSBzcGVjaWZpY2FsbHksIHRoYXQgaWYgaXQKKyAqIGRvZXMgd3JpdGUgb3ZlciB0aGUgZGF0YSwgaXQgYWNrbm93bGVkZ2VzIHRoYXQgcmVuZGVyaW5nIGlzCisgKiB1bmRlZmluZWQpLgorICovCisKK2ludAorZHJtX2ludGVsX2dlbV9ib19tYXBfdW5zeW5jaHJvbml6ZWQoZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworI2lmZGVmIEhBVkVfVkFMR1JJTkQKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKyNlbmRpZgorCWludCByZXQ7CisKKwkvKiBJZiB0aGUgQ1BVIGNhY2hlIGlzbid0IGNvaGVyZW50IHdpdGggdGhlIEdUVCwgdGhlbiB1c2UgYQorCSAqIHJlZ3VsYXIgc3luY2hyb25pemVkIG1hcHBpbmcuICBUaGUgcHJvYmxlbSBpcyB0aGF0IHdlIGRvbid0CisJICogdHJhY2sgd2hlcmUgdGhlIGJ1ZmZlciB3YXMgbGFzdCB1c2VkIG9uIHRoZSBDUFUgc2lkZSBpbgorCSAqIHRlcm1zIG9mIGRybV9pbnRlbF9ib19tYXAgdnMgZHJtX2ludGVsX2dlbV9ib19tYXBfZ3R0LCBzbworCSAqIHdlIHdvdWxkIHBvdGVudGlhbGx5IGNvcnJ1cHQgdGhlIGJ1ZmZlciBldmVuIHdoZW4gdGhlIHVzZXIKKwkgKiBkb2VzIHJlYXNvbmFibGUgdGhpbmdzLgorCSAqLworCWlmICghYnVmbWdyX2dlbS0+aGFzX2xsYykKKwkJcmV0dXJuIGRybV9pbnRlbF9nZW1fYm9fbWFwX2d0dChibyk7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJcmV0ID0gbWFwX2d0dChibyk7CisJaWYgKHJldCA9PSAwKSB7CisJCWRybV9pbnRlbF9nZW1fYm9fbWFya19tbWFwc19pbmNvaGVyZW50KGJvKTsKKwkJVkcoVkFMR1JJTkRfTUFLRV9NRU1fREVGSU5FRChib19nZW0tPmd0dF92aXJ0dWFsLCBiby0+c2l6ZSkpOworCX0KKworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJtX2ludGVsX2dlbV9ib191bm1hcChkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCWludCByZXQgPSAwOworCisJaWYgKGJvID09IE5VTEwpCisJCXJldHVybiAwOworCisJaWYgKGJvX2dlbS0+aXNfdXNlcnB0cikKKwkJcmV0dXJuIDA7CisKKwlidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJaWYgKGJvX2dlbS0+bWFwX2NvdW50IDw9IDApIHsKKwkJREJHKCJhdHRlbXB0ZWQgdG8gdW5tYXAgYW4gdW5tYXBwZWQgYm9cbiIpOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisJCS8qIFByZXNlcnZlIHRoZSBvbGQgYmVoYXZpb3VyIG9mIGp1c3QgdHJlYXRpbmcgdGhpcyBhcyBhCisJCSAqIG5vLW9wIHJhdGhlciB0aGFuIHJlcG9ydGluZyB0aGUgZXJyb3IuCisJCSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoYm9fZ2VtLT5tYXBwZWRfY3B1X3dyaXRlKSB7CisJCXN0cnVjdCBkcm1faTkxNV9nZW1fc3dfZmluaXNoIHN3X2ZpbmlzaDsKKworCQkvKiBDYXVzZSBhIGZsdXNoIHRvIGhhcHBlbiBpZiB0aGUgYnVmZmVyJ3MgcGlubmVkIGZvcgorCQkgKiBzY2Fub3V0LCBzbyB0aGUgcmVzdWx0cyBzaG93IHVwIGluIGEgdGltZWx5IG1hbm5lci4KKwkJICogVW5saWtlIEdUVCBzZXQgZG9tYWlucywgdGhpcyBvbmx5IGRvZXMgd29yayBpZiB0aGUKKwkJICogYnVmZmVyIHNob3VsZCBiZSBzY2Fub3V0LXJlbGF0ZWQuCisJCSAqLworCQltZW1jbGVhcihzd19maW5pc2gpOworCQlzd19maW5pc2guaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOworCQlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKKwkJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fU1dfRklOSVNILAorCQkJICAgICAgICZzd19maW5pc2gpOworCQlyZXQgPSByZXQgPT0gLTEgPyAtZXJybm8gOiAwOworCisJCWJvX2dlbS0+bWFwcGVkX2NwdV93cml0ZSA9IGZhbHNlOworCX0KKworCS8qIFdlIG5lZWQgdG8gdW5tYXAgYWZ0ZXIgZXZlcnkgaW5ub3ZhdGlvbiBhcyB3ZSBjYW5ub3QgdHJhY2sKKwkgKiBhbiBvcGVuIHZtYSBmb3IgZXZlcnkgYm8gYXMgdGhhdCB3aWxsIGV4aGF1c3QgdGhlIHN5c3RlbQorCSAqIGxpbWl0cyBhbmQgY2F1c2UgbGF0ZXIgZmFpbHVyZXMuCisJICovCisJaWYgKC0tYm9fZ2VtLT5tYXBfY291bnQgPT0gMCkgeworCQlkcm1faW50ZWxfZ2VtX2JvX2Nsb3NlX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOworCQlkcm1faW50ZWxfZ2VtX2JvX21hcmtfbW1hcHNfaW5jb2hlcmVudChibyk7CisJCWJvLT52aXJ0dWFsID0gTlVMTDsKKwl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworaW50Citkcm1faW50ZWxfZ2VtX2JvX3VubWFwX2d0dChkcm1faW50ZWxfYm8gKmJvKQoreworCXJldHVybiBkcm1faW50ZWxfZ2VtX2JvX3VubWFwKGJvKTsKK30KKworc3RhdGljIGludAorZHJtX2ludGVsX2dlbV9ib19zdWJkYXRhKGRybV9pbnRlbF9ibyAqYm8sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCXN0cnVjdCBkcm1faTkxNV9nZW1fcHdyaXRlIHB3cml0ZTsKKwlpbnQgcmV0OworCisJaWYgKGJvX2dlbS0+aXNfdXNlcnB0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1jbGVhcihwd3JpdGUpOworCXB3cml0ZS5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CisJcHdyaXRlLm9mZnNldCA9IG9mZnNldDsKKwlwd3JpdGUuc2l6ZSA9IHNpemU7CisJcHdyaXRlLmRhdGFfcHRyID0gKHVpbnQ2NF90KSAodWludHB0cl90KSBkYXRhOworCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAorCQkgICAgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX1BXUklURSwKKwkJICAgICAgICZwd3JpdGUpOworCWlmIChyZXQgIT0gMCkgeworCQlyZXQgPSAtZXJybm87CisJCURCRygiJXM6JWQ6IEVycm9yIHdyaXRpbmcgZGF0YSB0byBidWZmZXIgJWQ6ICglZCAlZCkgJXMgLlxuIiwKKwkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgYm9fZ2VtLT5nZW1faGFuZGxlLCAoaW50KW9mZnNldCwKKwkJICAgIChpbnQpc2l6ZSwgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2dldF9waXBlX2Zyb21fY3J0Y19pZChkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsIGludCBjcnRjX2lkKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJ1Zm1ncjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2V0X3BpcGVfZnJvbV9jcnRjX2lkIGdldF9waXBlX2Zyb21fY3J0Y19pZDsKKwlpbnQgcmV0OworCisJbWVtY2xlYXIoZ2V0X3BpcGVfZnJvbV9jcnRjX2lkKTsKKwlnZXRfcGlwZV9mcm9tX2NydGNfaWQuY3J0Y19pZCA9IGNydGNfaWQ7CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCisJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRVRfUElQRV9GUk9NX0NSVENfSUQsCisJCSAgICAgICAmZ2V0X3BpcGVfZnJvbV9jcnRjX2lkKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJLyogV2UgcmV0dXJuIC0xIGhlcmUgdG8gc2lnbmFsIHRoYXQgd2UgZG9uJ3QKKwkJICoga25vdyB3aGljaCBwaXBlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNydGMuCisJCSAqIFRoaXMgbGV0cyB0aGUgY2FsbGVyIGtub3cgdGhhdCB0aGlzIGluZm9ybWF0aW9uCisJCSAqIGlzbid0IGF2YWlsYWJsZTsgdXNpbmcgdGhlIHdyb25nIHBpcGUgZm9yCisJCSAqIHZibGFuayB3YWl0aW5nIGNhbiBjYXVzZSB0aGUgY2hpcHNldCB0byBsb2NrIHVwCisJCSAqLworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIGdldF9waXBlX2Zyb21fY3J0Y19pZC5waXBlOworfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2JvX2dldF9zdWJkYXRhKGRybV9pbnRlbF9ibyAqYm8sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHZvaWQgKmRhdGEpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3ByZWFkIHByZWFkOworCWludCByZXQ7CisKKwlpZiAoYm9fZ2VtLT5pc191c2VycHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbWNsZWFyKHByZWFkKTsKKwlwcmVhZC5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CisJcHJlYWQub2Zmc2V0ID0gb2Zmc2V0OworCXByZWFkLnNpemUgPSBzaXplOworCXByZWFkLmRhdGFfcHRyID0gKHVpbnQ2NF90KSAodWludHB0cl90KSBkYXRhOworCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAorCQkgICAgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX1BSRUFELAorCQkgICAgICAgJnByZWFkKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcmV0ID0gLWVycm5vOworCQlEQkcoIiVzOiVkOiBFcnJvciByZWFkaW5nIGRhdGEgZnJvbSBidWZmZXIgJWQ6ICglZCAlZCkgJXMgLlxuIiwKKwkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgYm9fZ2VtLT5nZW1faGFuZGxlLCAoaW50KW9mZnNldCwKKwkJICAgIChpbnQpc2l6ZSwgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiogV2FpdHMgZm9yIGFsbCBHUFUgcmVuZGVyaW5nIHdpdGggdGhlIG9iamVjdCB0byBoYXZlIGNvbXBsZXRlZC4gKi8KK3N0YXRpYyB2b2lkCitkcm1faW50ZWxfZ2VtX2JvX3dhaXRfcmVuZGVyaW5nKGRybV9pbnRlbF9ibyAqYm8pCit7CisJZHJtX2ludGVsX2dlbV9ib19zdGFydF9ndHRfYWNjZXNzKGJvLCAxKTsKK30KKworLyoqCisgKiBXYWl0cyBvbiBhIEJPIGZvciB0aGUgZ2l2ZW4gYW1vdW50IG9mIHRpbWUuCisgKgorICogQGJvOiBidWZmZXIgb2JqZWN0IHRvIHdhaXQgZm9yCisgKiBAdGltZW91dF9uczogYW1vdW50IG9mIHRpbWUgdG8gd2FpdCBpbiBuYW5vc2Vjb25kcy4KKyAqICAgSWYgdmFsdWUgaXMgbGVzcyB0aGFuIDAsIGFuIGluZmluaXRlIHdhaXQgd2lsbCBvY2N1ci4KKyAqCisgKiBSZXR1cm5zIDAgaWYgdGhlIHdhaXQgd2FzIHN1Y2Nlc3NmdWwgaWUuIHRoZSBsYXN0IGJhdGNoIHJlZmVyZW5jaW5nIHRoZQorICogb2JqZWN0IGhhcyBjb21wbGV0ZWQgd2l0aGluIHRoZSBhbGxvdHRlZCB0aW1lLiBPdGhlcndpc2Ugc29tZSBuZWdhdGl2ZSByZXR1cm4KKyAqIHZhbHVlIGRlc2NyaWJlcyB0aGUgZXJyb3IuIE9mIHBhcnRpY3VsYXIgaW50ZXJlc3QgaXMgLUVUSU1FIHdoZW4gdGhlIHdhaXQgaGFzCisgKiBmYWlsZWQgdG8geWllbGQgdGhlIGRlc2lyZWQgcmVzdWx0LgorICoKKyAqIFNpbWlsYXIgdG8gZHJtX2ludGVsX2dlbV9ib193YWl0X3JlbmRlcmluZyBleGNlcHQgYSB0aW1lb3V0IHBhcmFtZXRlciBhbGxvd3MKKyAqIHRoZSBvcGVyYXRpb24gdG8gZ2l2ZSB1cCBhZnRlciBhIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUuIEFub3RoZXIgc3VidGxlCisgKiBkaWZmZXJlbmNlIGlzIHRoZSBpbnRlcm5hbCBsb2NraW5nIHNlbWFudGljcyBhcmUgZGlmZmVyZW50ICh0aGlzIHZhcmlhbnQgZG9lcworICogbm90IGhvbGQgdGhlIGxvY2sgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgd2FpdCkuIFRoaXMgbWFrZXMgdGhlIHdhaXQgc3ViamVjdAorICogdG8gYSBsYXJnZXIgdXNlcnNwYWNlIHJhY2Ugd2luZG93LgorICoKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBzaGFsbCB3YWl0IHVudGlsIHRoZSBvYmplY3QgaXMgbm8gbG9uZ2VyIGFjdGl2ZWx5CisgKiByZWZlcmVuY2VkIHdpdGhpbiBhIGJhdGNoIGJ1ZmZlciBhdCB0aGUgdGltZSBvZiB0aGUgY2FsbC4gVGhlIHdhaXQgd2lsbAorICogbm90IGd1YXJhbnRlZSB0aGF0IHRoZSBidWZmZXIgaXMgcmUtaXNzdWVkIHZpYSBhbm90aGVyIHRocmVhZCwgb3IgYW4gZmxpbmtlZAorICogaGFuZGxlLiBVc2Vyc3BhY2UgbXVzdCBtYWtlIHN1cmUgdGhpcyByYWNlIGRvZXMgbm90IG9jY3VyIGlmIHN1Y2ggcHJlY2lzaW9uCisgKiBpcyBpbXBvcnRhbnQuCisgKgorICogTm90ZSB0aGF0IHNvbWUga2VybmVscyBoYXZlIGJyb2tlbiB0aGUgaW5pZml0ZSB3YWl0IGZvciBuZWdhdGl2ZSB2YWx1ZXMKKyAqIHByb21pc2UsIHVwZ3JhZGUgdG8gbGF0ZXN0IHN0YWJsZSBrZXJuZWxzIGlmIHRoaXMgaXMgdGhlIGNhc2UuCisgKi8KK2ludAorZHJtX2ludGVsX2dlbV9ib193YWl0KGRybV9pbnRlbF9ibyAqYm8sIGludDY0X3QgdGltZW91dF9ucykKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCXN0cnVjdCBkcm1faTkxNV9nZW1fd2FpdCB3YWl0OworCWludCByZXQ7CisKKwlpZiAoIWJ1Zm1ncl9nZW0tPmhhc193YWl0X3RpbWVvdXQpIHsKKwkJREJHKCIlczolZDogVGltZWQgd2FpdCBpcyBub3Qgc3VwcG9ydGVkLiBGYWxsaW5nIGJhY2sgdG8gIgorCQkgICAgImluZmluaXRlIHdhaXRcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJCWlmICh0aW1lb3V0X25zKSB7CisJCQlkcm1faW50ZWxfZ2VtX2JvX3dhaXRfcmVuZGVyaW5nKGJvKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGRybV9pbnRlbF9nZW1fYm9fYnVzeShibykgPyAtRVRJTUUgOiAwOworCQl9CisJfQorCisJbWVtY2xlYXIod2FpdCk7CisJd2FpdC5ib19oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CisJd2FpdC50aW1lb3V0X25zID0gdGltZW91dF9uczsKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VNX1dBSVQsICZ3YWl0KTsKKwlpZiAocmV0ID09IC0xKQorCQlyZXR1cm4gLWVycm5vOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBTZXRzIHRoZSBvYmplY3QgdG8gdGhlIEdUVCByZWFkIGFuZCBwb3NzaWJseSB3cml0ZSBkb21haW4sIHVzZWQgYnkgdGhlIFgKKyAqIDJEIGRyaXZlciBpbiB0aGUgYWJzZW5jZSBvZiBrZXJuZWwgc3VwcG9ydCB0byBkbyBkcm1faW50ZWxfZ2VtX2JvX21hcF9ndHQoKS4KKyAqCisgKiBJbiBjb21iaW5hdGlvbiB3aXRoIGRybV9pbnRlbF9nZW1fYm9fcGluKCkgYW5kIG1hbnVhbCBmZW5jZSBtYW5hZ2VtZW50LCB3ZQorICogY2FuIGRvIHRpbGVkIHBpeG1hcHMgdGhpcyB3YXkuCisgKi8KK3ZvaWQKK2RybV9pbnRlbF9nZW1fYm9fc3RhcnRfZ3R0X2FjY2Vzcyhkcm1faW50ZWxfYm8gKmJvLCBpbnQgd3JpdGVfZW5hYmxlKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisJc3RydWN0IGRybV9pOTE1X2dlbV9zZXRfZG9tYWluIHNldF9kb21haW47CisJaW50IHJldDsKKworCW1lbWNsZWFyKHNldF9kb21haW4pOworCXNldF9kb21haW4uaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOworCXNldF9kb21haW4ucmVhZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlOX0dUVDsKKwlzZXRfZG9tYWluLndyaXRlX2RvbWFpbiA9IHdyaXRlX2VuYWJsZSA/IEk5MTVfR0VNX0RPTUFJTl9HVFQgOiAwOworCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAorCQkgICAgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX1NFVF9ET01BSU4sCisJCSAgICAgICAmc2V0X2RvbWFpbik7CisJaWYgKHJldCAhPSAwKSB7CisJCURCRygiJXM6JWQ6IEVycm9yIHNldHRpbmcgbWVtb3J5IGRvbWFpbnMgJWQgKCUwOHggJTA4eCk6ICVzIC5cbiIsCisJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGJvX2dlbS0+Z2VtX2hhbmRsZSwKKwkJICAgIHNldF9kb21haW4ucmVhZF9kb21haW5zLCBzZXRfZG9tYWluLndyaXRlX2RvbWFpbiwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorZHJtX2ludGVsX2J1Zm1ncl9nZW1fZGVzdHJveShkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYnVmbWdyOworCXN0cnVjdCBkcm1fZ2VtX2Nsb3NlIGNsb3NlX2JvOworCWludCBpLCByZXQ7CisKKwlmcmVlKGJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHMpOworCWZyZWUoYnVmbWdyX2dlbS0+ZXhlY19vYmplY3RzKTsKKwlmcmVlKGJ1Zm1ncl9nZW0tPmV4ZWNfYm9zKTsKKworCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmYnVmbWdyX2dlbS0+bG9jayk7CisKKwkvKiBGcmVlIGFueSBjYWNoZWQgYnVmZmVyIG9iamVjdHMgd2Ugd2VyZSBnb2luZyB0byByZXVzZSAqLworCWZvciAoaSA9IDA7IGkgPCBidWZtZ3JfZ2VtLT5udW1fYnVja2V0czsgaSsrKSB7CisJCXN0cnVjdCBkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldCAqYnVja2V0ID0KKwkJICAgICZidWZtZ3JfZ2VtLT5jYWNoZV9idWNrZXRbaV07CisJCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbTsKKworCQl3aGlsZSAoIURSTUxJU1RFTVBUWSgmYnVja2V0LT5oZWFkKSkgeworCQkJYm9fZ2VtID0gRFJNTElTVEVOVFJZKGRybV9pbnRlbF9ib19nZW0sCisJCQkJCSAgICAgIGJ1Y2tldC0+aGVhZC5uZXh0LCBoZWFkKTsKKwkJCURSTUxJU1RERUwoJmJvX2dlbS0+aGVhZCk7CisKKwkJCWRybV9pbnRlbF9nZW1fYm9fZnJlZSgmYm9fZ2VtLT5ibyk7CisJCX0KKwl9CisKKwkvKiBSZWxlYXNlIHVzZXJwdHIgYm8ga2VwdCBoYW5naW5nIGFyb3VuZCBmb3Igb3B0aW1pc2F0aW9uLiAqLworCWlmIChidWZtZ3JfZ2VtLT51c2VycHRyX2FjdGl2ZS5wdHIpIHsKKwkJbWVtY2xlYXIoY2xvc2VfYm8pOworCQljbG9zZV9iby5oYW5kbGUgPSBidWZtZ3JfZ2VtLT51c2VycHRyX2FjdGl2ZS5oYW5kbGU7CisJCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfR0VNX0NMT1NFLCAmY2xvc2VfYm8pOworCQlmcmVlKGJ1Zm1ncl9nZW0tPnVzZXJwdHJfYWN0aXZlLnB0cik7CisJCWlmIChyZXQpCisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiRmFpbGVkIHRvIHJlbGVhc2UgdGVzdCB1c2VycHRyIG9iamVjdCEgKCVkKSAiCisJCQkJImk5MTUga2VybmVsIGRyaXZlciBtYXkgbm90IGJlIHNhbmUhXG4iLCBlcnJubyk7CisJfQorCisJZnJlZShidWZtZ3IpOworfQorCisvKioKKyAqIEFkZHMgdGhlIHRhcmdldCBidWZmZXIgdG8gdGhlIHZhbGlkYXRpb24gbGlzdCBhbmQgYWRkcyB0aGUgcmVsb2NhdGlvbgorICogdG8gdGhlIHJlbG9jX2J1ZmZlcidzIHJlbG9jYXRpb24gbGlzdC4KKyAqCisgKiBUaGUgcmVsb2NhdGlvbiBlbnRyeSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IG11c3QgYWxyZWFkeSBjb250YWluIHRoZQorICogcHJlY29tcHV0ZWQgcmVsb2NhdGlvbiB2YWx1ZSwgYmVjYXVzZSB0aGUga2VybmVsIHdpbGwgb3B0aW1pemUgb3V0CisgKiB0aGUgcmVsb2NhdGlvbiBlbnRyeSB3cml0ZSB3aGVuIHRoZSBidWZmZXIgaGFzbid0IG1vdmVkIGZyb20gdGhlCisgKiBsYXN0IGtub3duIG9mZnNldCBpbiB0YXJnZXRfYm8uCisgKi8KK3N0YXRpYyBpbnQKK2RvX2JvX2VtaXRfcmVsb2MoZHJtX2ludGVsX2JvICpibywgdWludDMyX3Qgb2Zmc2V0LAorCQkgZHJtX2ludGVsX2JvICp0YXJnZXRfYm8sIHVpbnQzMl90IHRhcmdldF9vZmZzZXQsCisJCSB1aW50MzJfdCByZWFkX2RvbWFpbnMsIHVpbnQzMl90IHdyaXRlX2RvbWFpbiwKKwkJIGJvb2wgbmVlZF9mZW5jZSkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCWRybV9pbnRlbF9ib19nZW0gKnRhcmdldF9ib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSB0YXJnZXRfYm87CisJYm9vbCBmZW5jZWRfY29tbWFuZDsKKworCWlmIChib19nZW0tPmhhc19lcnJvcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAodGFyZ2V0X2JvX2dlbS0+aGFzX2Vycm9yKSB7CisJCWJvX2dlbS0+aGFzX2Vycm9yID0gdHJ1ZTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogV2UgbmV2ZXIgdXNlIEhXIGZlbmNlcyBmb3IgcmVuZGVyaW5nIG9uIDk2NSsgKi8KKwlpZiAoYnVmbWdyX2dlbS0+Z2VuID49IDQpCisJCW5lZWRfZmVuY2UgPSBmYWxzZTsKKworCWZlbmNlZF9jb21tYW5kID0gbmVlZF9mZW5jZTsKKwlpZiAodGFyZ2V0X2JvX2dlbS0+dGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfTk9ORSkKKwkJbmVlZF9mZW5jZSA9IGZhbHNlOworCisJLyogQ3JlYXRlIGEgbmV3IHJlbG9jYXRpb24gbGlzdCBpZiBuZWVkZWQgKi8KKwlpZiAoYm9fZ2VtLT5yZWxvY3MgPT0gTlVMTCAmJiBkcm1faW50ZWxfc2V0dXBfcmVsb2NfbGlzdChibykpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogQ2hlY2sgb3ZlcmZsb3cgKi8KKwlhc3NlcnQoYm9fZ2VtLT5yZWxvY19jb3VudCA8IGJ1Zm1ncl9nZW0tPm1heF9yZWxvY3MpOworCisJLyogQ2hlY2sgYXJncyAqLworCWFzc2VydChvZmZzZXQgPD0gYm8tPnNpemUgLSA0KTsKKwlhc3NlcnQoKHdyaXRlX2RvbWFpbiAmICh3cml0ZV9kb21haW4gLSAxKSkgPT0gMCk7CisKKwkvKiBBbiBvYmplY3QgbmVlZGluZyBhIGZlbmNlIGlzIGEgdGlsZWQgYnVmZmVyLCBzbyBpdCB3b24ndCBoYXZlCisJICogcmVsb2NzIHRvIG90aGVyIGJ1ZmZlcnMuCisJICovCisJaWYgKG5lZWRfZmVuY2UpIHsKKwkJYXNzZXJ0KHRhcmdldF9ib19nZW0tPnJlbG9jX2NvdW50ID09IDApOworCQl0YXJnZXRfYm9fZ2VtLT5yZWxvY190cmVlX2ZlbmNlcyA9IDE7CisJfQorCisJLyogTWFrZSBzdXJlIHRoYXQgd2UncmUgbm90IGFkZGluZyBhIHJlbG9jIHRvIHNvbWV0aGluZyB3aG9zZSBzaXplIGhhcworCSAqIGFscmVhZHkgYmVlbiBhY2NvdW50ZWQgZm9yLgorCSAqLworCWFzc2VydCghYm9fZ2VtLT51c2VkX2FzX3JlbG9jX3RhcmdldCk7CisJaWYgKHRhcmdldF9ib19nZW0gIT0gYm9fZ2VtKSB7CisJCXRhcmdldF9ib19nZW0tPnVzZWRfYXNfcmVsb2NfdGFyZ2V0ID0gdHJ1ZTsKKwkJYm9fZ2VtLT5yZWxvY190cmVlX3NpemUgKz0gdGFyZ2V0X2JvX2dlbS0+cmVsb2NfdHJlZV9zaXplOworCQlib19nZW0tPnJlbG9jX3RyZWVfZmVuY2VzICs9IHRhcmdldF9ib19nZW0tPnJlbG9jX3RyZWVfZmVuY2VzOworCX0KKworCWJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm9bYm9fZ2VtLT5yZWxvY19jb3VudF0uYm8gPSB0YXJnZXRfYm87CisJaWYgKHRhcmdldF9ibyAhPSBibykKKwkJZHJtX2ludGVsX2dlbV9ib19yZWZlcmVuY2UodGFyZ2V0X2JvKTsKKwlpZiAoZmVuY2VkX2NvbW1hbmQpCisJCWJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm9bYm9fZ2VtLT5yZWxvY19jb3VudF0uZmxhZ3MgPQorCQkJRFJNX0lOVEVMX1JFTE9DX0ZFTkNFOworCWVsc2UKKwkJYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mb1tib19nZW0tPnJlbG9jX2NvdW50XS5mbGFncyA9IDA7CisKKwlib19nZW0tPnJlbG9jc1tib19nZW0tPnJlbG9jX2NvdW50XS5vZmZzZXQgPSBvZmZzZXQ7CisJYm9fZ2VtLT5yZWxvY3NbYm9fZ2VtLT5yZWxvY19jb3VudF0uZGVsdGEgPSB0YXJnZXRfb2Zmc2V0OworCWJvX2dlbS0+cmVsb2NzW2JvX2dlbS0+cmVsb2NfY291bnRdLnRhcmdldF9oYW5kbGUgPQorCSAgICB0YXJnZXRfYm9fZ2VtLT5nZW1faGFuZGxlOworCWJvX2dlbS0+cmVsb2NzW2JvX2dlbS0+cmVsb2NfY291bnRdLnJlYWRfZG9tYWlucyA9IHJlYWRfZG9tYWluczsKKwlib19nZW0tPnJlbG9jc1tib19nZW0tPnJlbG9jX2NvdW50XS53cml0ZV9kb21haW4gPSB3cml0ZV9kb21haW47CisJYm9fZ2VtLT5yZWxvY3NbYm9fZ2VtLT5yZWxvY19jb3VudF0ucHJlc3VtZWRfb2Zmc2V0ID0gdGFyZ2V0X2JvLT5vZmZzZXQ2NDsKKwlib19nZW0tPnJlbG9jX2NvdW50Kys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2RybV9pbnRlbF9nZW1fYm9fdXNlXzQ4Yl9hZGRyZXNzX3JhbmdlKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90IGVuYWJsZSkKK3sKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKworCWlmIChlbmFibGUpCisJCWJvX2dlbS0+a2ZsYWdzIHw9IEVYRUNfT0JKRUNUX1NVUFBPUlRTXzQ4Ql9BRERSRVNTOworCWVsc2UKKwkJYm9fZ2VtLT5rZmxhZ3MgJj0gfkVYRUNfT0JKRUNUX1NVUFBPUlRTXzQ4Ql9BRERSRVNTOworfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2JvX2FkZF9zb2Z0cGluX3RhcmdldChkcm1faW50ZWxfYm8gKmJvLCBkcm1faW50ZWxfYm8gKnRhcmdldF9ibykKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCWRybV9pbnRlbF9ib19nZW0gKnRhcmdldF9ib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSB0YXJnZXRfYm87CisJaWYgKGJvX2dlbS0+aGFzX2Vycm9yKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICh0YXJnZXRfYm9fZ2VtLT5oYXNfZXJyb3IpIHsKKwkJYm9fZ2VtLT5oYXNfZXJyb3IgPSB0cnVlOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoISh0YXJnZXRfYm9fZ2VtLT5rZmxhZ3MgJiBFWEVDX09CSkVDVF9QSU5ORUQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodGFyZ2V0X2JvX2dlbSA9PSBib19nZW0pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGJvX2dlbS0+c29mdHBpbl90YXJnZXRfY291bnQgPT0gYm9fZ2VtLT5zb2Z0cGluX3RhcmdldF9zaXplKSB7CisJCWludCBuZXdfc2l6ZSA9IGJvX2dlbS0+c29mdHBpbl90YXJnZXRfc2l6ZSAqIDI7CisJCWlmIChuZXdfc2l6ZSA9PSAwKQorCQkJbmV3X3NpemUgPSBidWZtZ3JfZ2VtLT5tYXhfcmVsb2NzOworCisJCWJvX2dlbS0+c29mdHBpbl90YXJnZXQgPSByZWFsbG9jKGJvX2dlbS0+c29mdHBpbl90YXJnZXQsIG5ld19zaXplICoKKwkJCQlzaXplb2YoZHJtX2ludGVsX2JvICopKTsKKwkJaWYgKCFib19nZW0tPnNvZnRwaW5fdGFyZ2V0KQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJYm9fZ2VtLT5zb2Z0cGluX3RhcmdldF9zaXplID0gbmV3X3NpemU7CisJfQorCWJvX2dlbS0+c29mdHBpbl90YXJnZXRbYm9fZ2VtLT5zb2Z0cGluX3RhcmdldF9jb3VudF0gPSB0YXJnZXRfYm87CisJZHJtX2ludGVsX2dlbV9ib19yZWZlcmVuY2UodGFyZ2V0X2JvKTsKKwlib19nZW0tPnNvZnRwaW5fdGFyZ2V0X2NvdW50Kys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZHJtX2ludGVsX2dlbV9ib19lbWl0X3JlbG9jKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90IG9mZnNldCwKKwkJCSAgICBkcm1faW50ZWxfYm8gKnRhcmdldF9ibywgdWludDMyX3QgdGFyZ2V0X29mZnNldCwKKwkJCSAgICB1aW50MzJfdCByZWFkX2RvbWFpbnMsIHVpbnQzMl90IHdyaXRlX2RvbWFpbikKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKWJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2dlbSAqdGFyZ2V0X2JvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopdGFyZ2V0X2JvOworCisJaWYgKHRhcmdldF9ib19nZW0tPmtmbGFncyAmIEVYRUNfT0JKRUNUX1BJTk5FRCkKKwkJcmV0dXJuIGRybV9pbnRlbF9nZW1fYm9fYWRkX3NvZnRwaW5fdGFyZ2V0KGJvLCB0YXJnZXRfYm8pOworCWVsc2UKKwkJcmV0dXJuIGRvX2JvX2VtaXRfcmVsb2MoYm8sIG9mZnNldCwgdGFyZ2V0X2JvLCB0YXJnZXRfb2Zmc2V0LAorCQkJCQlyZWFkX2RvbWFpbnMsIHdyaXRlX2RvbWFpbiwKKwkJCQkJIWJ1Zm1ncl9nZW0tPmZlbmNlZF9yZWxvY3MpOworfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2JvX2VtaXRfcmVsb2NfZmVuY2UoZHJtX2ludGVsX2JvICpibywgdWludDMyX3Qgb2Zmc2V0LAorCQkJCSAgZHJtX2ludGVsX2JvICp0YXJnZXRfYm8sCisJCQkJICB1aW50MzJfdCB0YXJnZXRfb2Zmc2V0LAorCQkJCSAgdWludDMyX3QgcmVhZF9kb21haW5zLCB1aW50MzJfdCB3cml0ZV9kb21haW4pCit7CisJcmV0dXJuIGRvX2JvX2VtaXRfcmVsb2MoYm8sIG9mZnNldCwgdGFyZ2V0X2JvLCB0YXJnZXRfb2Zmc2V0LAorCQkJCXJlYWRfZG9tYWlucywgd3JpdGVfZG9tYWluLCB0cnVlKTsKK30KKworaW50Citkcm1faW50ZWxfZ2VtX2JvX2dldF9yZWxvY19jb3VudChkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCisJcmV0dXJuIGJvX2dlbS0+cmVsb2NfY291bnQ7Cit9CisKKy8qKgorICogUmVtb3ZlcyBleGlzdGluZyByZWxvY2F0aW9uIGVudHJpZXMgaW4gdGhlIEJPIGFmdGVyICJzdGFydCIuCisgKgorICogVGhpcyBhbGxvd3MgYSB1c2VyIHRvIGF2b2lkIGEgdHdvLXN0ZXAgcHJvY2VzcyBmb3Igc3RhdGUgc2V0dXAgd2l0aAorICogY291bnRpbmcgdXAgYWxsIHRoZSBidWZmZXIgb2JqZWN0cyBhbmQgZG9pbmcgYQorICogZHJtX2ludGVsX2J1Zm1ncl9jaGVja19hcGVydHVyZV9zcGFjZSgpIGJlZm9yZSBlbWl0dGluZyBhbnkgb2YgdGhlCisgKiByZWxvY2F0aW9ucyBmb3IgdGhlIHN0YXRlIHNldHVwLiAgSW5zdGVhZCwgc2F2ZSB0aGUgc3RhdGUgb2YgdGhlCisgKiBiYXRjaGJ1ZmZlciBpbmNsdWRpbmcgZHJtX2ludGVsX2dlbV9nZXRfcmVsb2NfY291bnQoKSwgZW1pdCBhbGwgdGhlCisgKiBzdGF0ZSwgYW5kIHRoZW4gY2hlY2sgaWYgaXQgc3RpbGwgZml0cyBpbiB0aGUgYXBlcnR1cmUuCisgKgorICogQW55IGZ1cnRoZXIgZHJtX2ludGVsX2J1Zm1ncl9jaGVja19hcGVydHVyZV9zcGFjZSgpIHF1ZXJpZXMKKyAqIGludm9sdmluZyB0aGlzIGJ1ZmZlciBpbiB0aGUgdHJlZSBhcmUgdW5kZWZpbmVkIGFmdGVyIHRoaXMgY2FsbC4KKyAqCisgKiBUaGlzIGFsc28gcmVtb3ZlcyBhbGwgc29mdHBpbm5lZCB0YXJnZXRzIGJlaW5nIHJlZmVyZW5jZWQgYnkgdGhlIEJPLgorICovCit2b2lkCitkcm1faW50ZWxfZ2VtX2JvX2NsZWFyX3JlbG9jcyhkcm1faW50ZWxfYm8gKmJvLCBpbnQgc3RhcnQpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKwlpbnQgaTsKKwlzdHJ1Y3QgdGltZXNwZWMgdGltZTsKKworCWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdGltZSk7CisKKwlhc3NlcnQoYm9fZ2VtLT5yZWxvY19jb3VudCA+PSBzdGFydCk7CisKKwkvKiBVbnJlZmVyZW5jZSB0aGUgY2xlYXJlZCB0YXJnZXQgYnVmZmVycyAqLworCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisKKwlmb3IgKGkgPSBzdGFydDsgaSA8IGJvX2dlbS0+cmVsb2NfY291bnQ7IGkrKykgeworCQlkcm1faW50ZWxfYm9fZ2VtICp0YXJnZXRfYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mb1tpXS5ibzsKKwkJaWYgKCZ0YXJnZXRfYm9fZ2VtLT5ibyAhPSBibykgeworCQkJYm9fZ2VtLT5yZWxvY190cmVlX2ZlbmNlcyAtPSB0YXJnZXRfYm9fZ2VtLT5yZWxvY190cmVlX2ZlbmNlczsKKwkJCWRybV9pbnRlbF9nZW1fYm9fdW5yZWZlcmVuY2VfbG9ja2VkX3RpbWVkKCZ0YXJnZXRfYm9fZ2VtLT5ibywKKwkJCQkJCQkJICB0aW1lLnR2X3NlYyk7CisJCX0KKwl9CisJYm9fZ2VtLT5yZWxvY19jb3VudCA9IHN0YXJ0OworCisJZm9yIChpID0gMDsgaSA8IGJvX2dlbS0+c29mdHBpbl90YXJnZXRfY291bnQ7IGkrKykgeworCQlkcm1faW50ZWxfYm9fZ2VtICp0YXJnZXRfYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm9fZ2VtLT5zb2Z0cGluX3RhcmdldFtpXTsKKwkJZHJtX2ludGVsX2dlbV9ib191bnJlZmVyZW5jZV9sb2NrZWRfdGltZWQoJnRhcmdldF9ib19nZW0tPmJvLCB0aW1lLnR2X3NlYyk7CisJfQorCWJvX2dlbS0+c29mdHBpbl90YXJnZXRfY291bnQgPSAwOworCisJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCit9CisKKy8qKgorICogV2FsayB0aGUgdHJlZSBvZiByZWxvY2F0aW9ucyByb290ZWQgYXQgQk8gYW5kIGFjY3VtdWxhdGUgdGhlIGxpc3Qgb2YKKyAqIHZhbGlkYXRpb25zIHRvIGJlIHBlcmZvcm1lZCBhbmQgdXBkYXRlIHRoZSByZWxvY2F0aW9uIGJ1ZmZlcnMgd2l0aAorICogaW5kZXggdmFsdWVzIGludG8gdGhlIHZhbGlkYXRpb24gbGlzdC4KKyAqLworc3RhdGljIHZvaWQKK2RybV9pbnRlbF9nZW1fYm9fcHJvY2Vzc19yZWxvYyhkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCWludCBpOworCisJaWYgKGJvX2dlbS0+cmVsb2NzID09IE5VTEwpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBib19nZW0tPnJlbG9jX2NvdW50OyBpKyspIHsKKwkJZHJtX2ludGVsX2JvICp0YXJnZXRfYm8gPSBib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvW2ldLmJvOworCisJCWlmICh0YXJnZXRfYm8gPT0gYm8pCisJCQljb250aW51ZTsKKworCQlkcm1faW50ZWxfZ2VtX2JvX21hcmtfbW1hcHNfaW5jb2hlcmVudChibyk7CisKKwkJLyogQ29udGludWUgd2Fsa2luZyB0aGUgdHJlZSBkZXB0aC1maXJzdC4gKi8KKwkJZHJtX2ludGVsX2dlbV9ib19wcm9jZXNzX3JlbG9jKHRhcmdldF9ibyk7CisKKwkJLyogQWRkIHRoZSB0YXJnZXQgdG8gdGhlIHZhbGlkYXRlIGxpc3QgKi8KKwkJZHJtX2ludGVsX2FkZF92YWxpZGF0ZV9idWZmZXIodGFyZ2V0X2JvKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitkcm1faW50ZWxfZ2VtX2JvX3Byb2Nlc3NfcmVsb2MyKGRybV9pbnRlbF9ibyAqYm8pCit7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKilibzsKKwlpbnQgaTsKKworCWlmIChib19nZW0tPnJlbG9jcyA9PSBOVUxMICYmIGJvX2dlbS0+c29mdHBpbl90YXJnZXQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IGJvX2dlbS0+cmVsb2NfY291bnQ7IGkrKykgeworCQlkcm1faW50ZWxfYm8gKnRhcmdldF9ibyA9IGJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm9baV0uYm87CisJCWludCBuZWVkX2ZlbmNlOworCisJCWlmICh0YXJnZXRfYm8gPT0gYm8pCisJCQljb250aW51ZTsKKworCQlkcm1faW50ZWxfZ2VtX2JvX21hcmtfbW1hcHNfaW5jb2hlcmVudChibyk7CisKKwkJLyogQ29udGludWUgd2Fsa2luZyB0aGUgdHJlZSBkZXB0aC1maXJzdC4gKi8KKwkJZHJtX2ludGVsX2dlbV9ib19wcm9jZXNzX3JlbG9jMih0YXJnZXRfYm8pOworCisJCW5lZWRfZmVuY2UgPSAoYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mb1tpXS5mbGFncyAmCisJCQkgICAgICBEUk1fSU5URUxfUkVMT0NfRkVOQ0UpOworCisJCS8qIEFkZCB0aGUgdGFyZ2V0IHRvIHRoZSB2YWxpZGF0ZSBsaXN0ICovCisJCWRybV9pbnRlbF9hZGRfdmFsaWRhdGVfYnVmZmVyMih0YXJnZXRfYm8sIG5lZWRfZmVuY2UpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBib19nZW0tPnNvZnRwaW5fdGFyZ2V0X2NvdW50OyBpKyspIHsKKwkJZHJtX2ludGVsX2JvICp0YXJnZXRfYm8gPSBib19nZW0tPnNvZnRwaW5fdGFyZ2V0W2ldOworCisJCWlmICh0YXJnZXRfYm8gPT0gYm8pCisJCQljb250aW51ZTsKKworCQlkcm1faW50ZWxfZ2VtX2JvX21hcmtfbW1hcHNfaW5jb2hlcmVudChibyk7CisJCWRybV9pbnRlbF9nZW1fYm9fcHJvY2Vzc19yZWxvYzIodGFyZ2V0X2JvKTsKKwkJZHJtX2ludGVsX2FkZF92YWxpZGF0ZV9idWZmZXIyKHRhcmdldF9ibywgZmFsc2UpOworCX0KK30KKworCitzdGF0aWMgdm9pZAorZHJtX2ludGVsX3VwZGF0ZV9idWZmZXJfb2Zmc2V0cyhkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBidWZtZ3JfZ2VtLT5leGVjX2NvdW50OyBpKyspIHsKKwkJZHJtX2ludGVsX2JvICpibyA9IGJ1Zm1ncl9nZW0tPmV4ZWNfYm9zW2ldOworCQlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKworCQkvKiBVcGRhdGUgdGhlIGJ1ZmZlciBvZmZzZXQgKi8KKwkJaWYgKGJ1Zm1ncl9nZW0tPmV4ZWNfb2JqZWN0c1tpXS5vZmZzZXQgIT0gYm8tPm9mZnNldDY0KSB7CisJCQlEQkcoIkJPICVkICglcykgbWlncmF0ZWQ6IDB4JTA4eCAlMDh4IC0+IDB4JTA4eCAlMDh4XG4iLAorCQkJICAgIGJvX2dlbS0+Z2VtX2hhbmRsZSwgYm9fZ2VtLT5uYW1lLAorCQkJICAgIHVwcGVyXzMyX2JpdHMoYm8tPm9mZnNldDY0KSwKKwkJCSAgICBsb3dlcl8zMl9iaXRzKGJvLT5vZmZzZXQ2NCksCisJCQkgICAgdXBwZXJfMzJfYml0cyhidWZtZ3JfZ2VtLT5leGVjX29iamVjdHNbaV0ub2Zmc2V0KSwKKwkJCSAgICBsb3dlcl8zMl9iaXRzKGJ1Zm1ncl9nZW0tPmV4ZWNfb2JqZWN0c1tpXS5vZmZzZXQpKTsKKwkJCWJvLT5vZmZzZXQ2NCA9IGJ1Zm1ncl9nZW0tPmV4ZWNfb2JqZWN0c1tpXS5vZmZzZXQ7CisJCQliby0+b2Zmc2V0ID0gYnVmbWdyX2dlbS0+ZXhlY19vYmplY3RzW2ldLm9mZnNldDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK2RybV9pbnRlbF91cGRhdGVfYnVmZmVyX29mZnNldHMyIChkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBidWZtZ3JfZ2VtLT5leGVjX2NvdW50OyBpKyspIHsKKwkJZHJtX2ludGVsX2JvICpibyA9IGJ1Zm1ncl9nZW0tPmV4ZWNfYm9zW2ldOworCQlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKWJvOworCisJCS8qIFVwZGF0ZSB0aGUgYnVmZmVyIG9mZnNldCAqLworCQlpZiAoYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0c1tpXS5vZmZzZXQgIT0gYm8tPm9mZnNldDY0KSB7CisJCQkvKiBJZiB3ZSdyZSBzZWVpbmcgc29mdHBpbm5lZCBvYmplY3QgaGVyZSBpdCBtZWFucyB0aGF0IHRoZSBrZXJuZWwKKwkJCSAqIGhhcyByZWxvY2F0ZWQgb3VyIG9iamVjdC4uLiBJbmRpY2F0aW5nIGEgcHJvZ3JhbW1pbmcgZXJyb3IKKwkJCSAqLworCQkJYXNzZXJ0KCEoYm9fZ2VtLT5rZmxhZ3MgJiBFWEVDX09CSkVDVF9QSU5ORUQpKTsKKwkJCURCRygiQk8gJWQgKCVzKSBtaWdyYXRlZDogMHglMDh4ICUwOHggLT4gMHglMDh4ICUwOHhcbiIsCisJCQkgICAgYm9fZ2VtLT5nZW1faGFuZGxlLCBib19nZW0tPm5hbWUsCisJCQkgICAgdXBwZXJfMzJfYml0cyhiby0+b2Zmc2V0NjQpLAorCQkJICAgIGxvd2VyXzMyX2JpdHMoYm8tPm9mZnNldDY0KSwKKwkJCSAgICB1cHBlcl8zMl9iaXRzKGJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHNbaV0ub2Zmc2V0KSwKKwkJCSAgICBsb3dlcl8zMl9iaXRzKGJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHNbaV0ub2Zmc2V0KSk7CisJCQliby0+b2Zmc2V0NjQgPSBidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzW2ldLm9mZnNldDsKKwkJCWJvLT5vZmZzZXQgPSBidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzW2ldLm9mZnNldDsKKwkJfQorCX0KK30KKwordm9pZAorZHJtX2ludGVsX2dlbV9ib19hdWJfZHVtcF9ibXAoZHJtX2ludGVsX2JvICpibywKKwkJCSAgICAgIGludCB4MSwgaW50IHkxLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJCQkgICAgICBlbnVtIGF1Yl9kdW1wX2JtcF9mb3JtYXQgZm9ybWF0LAorCQkJICAgICAgaW50IHBpdGNoLCBpbnQgb2Zmc2V0KQoreworfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2JvX2V4ZWMoZHJtX2ludGVsX2JvICpibywgaW50IHVzZWQsCisJCSAgICAgIGRybV9jbGlwX3JlY3RfdCAqIGNsaXByZWN0cywgaW50IG51bV9jbGlwcmVjdHMsIGludCBEUjQpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIgZXhlY2J1ZjsKKwlpbnQgcmV0LCBpOworCisJaWYgKHRvX2JvX2dlbShibyktPmhhc19lcnJvcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCS8qIFVwZGF0ZSBpbmRpY2VzIGFuZCBzZXQgdXAgdGhlIHZhbGlkYXRlIGxpc3QuICovCisJZHJtX2ludGVsX2dlbV9ib19wcm9jZXNzX3JlbG9jKGJvKTsKKworCS8qIEFkZCB0aGUgYmF0Y2ggYnVmZmVyIHRvIHRoZSB2YWxpZGF0aW9uIGxpc3QuICBUaGVyZSBhcmUgbm8KKwkgKiByZWxvY2F0aW9ucyBwb2ludGluZyB0byBpdC4KKwkgKi8KKwlkcm1faW50ZWxfYWRkX3ZhbGlkYXRlX2J1ZmZlcihibyk7CisKKwltZW1jbGVhcihleGVjYnVmKTsKKwlleGVjYnVmLmJ1ZmZlcnNfcHRyID0gKHVpbnRwdHJfdCkgYnVmbWdyX2dlbS0+ZXhlY19vYmplY3RzOworCWV4ZWNidWYuYnVmZmVyX2NvdW50ID0gYnVmbWdyX2dlbS0+ZXhlY19jb3VudDsKKwlleGVjYnVmLmJhdGNoX3N0YXJ0X29mZnNldCA9IDA7CisJZXhlY2J1Zi5iYXRjaF9sZW4gPSB1c2VkOworCWV4ZWNidWYuY2xpcHJlY3RzX3B0ciA9ICh1aW50cHRyX3QpIGNsaXByZWN0czsKKwlleGVjYnVmLm51bV9jbGlwcmVjdHMgPSBudW1fY2xpcHJlY3RzOworCWV4ZWNidWYuRFIxID0gMDsKKwlleGVjYnVmLkRSNCA9IERSNDsKKworCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAorCQkgICAgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX0VYRUNCVUZGRVIsCisJCSAgICAgICAmZXhlY2J1Zik7CisJaWYgKHJldCAhPSAwKSB7CisJCXJldCA9IC1lcnJubzsKKwkJaWYgKGVycm5vID09IEVOT1NQQykgeworCQkJREJHKCJFeGVjYnVmZmVyIGZhaWxzIHRvIHBpbi4gIgorCQkJICAgICJFc3RpbWF0ZTogJXUuIEFjdHVhbDogJXUuIEF2YWlsYWJsZTogJXVcbiIsCisJCQkgICAgZHJtX2ludGVsX2dlbV9lc3RpbWF0ZV9iYXRjaF9zcGFjZShidWZtZ3JfZ2VtLT5leGVjX2JvcywKKwkJCQkJCQkgICAgICAgYnVmbWdyX2dlbS0+CisJCQkJCQkJICAgICAgIGV4ZWNfY291bnQpLAorCQkJICAgIGRybV9pbnRlbF9nZW1fY29tcHV0ZV9iYXRjaF9zcGFjZShidWZtZ3JfZ2VtLT5leGVjX2JvcywKKwkJCQkJCQkgICAgICBidWZtZ3JfZ2VtLT4KKwkJCQkJCQkgICAgICBleGVjX2NvdW50KSwKKwkJCSAgICAodW5zaWduZWQgaW50KWJ1Zm1ncl9nZW0tPmd0dF9zaXplKTsKKwkJfQorCX0KKwlkcm1faW50ZWxfdXBkYXRlX2J1ZmZlcl9vZmZzZXRzKGJ1Zm1ncl9nZW0pOworCisJaWYgKGJ1Zm1ncl9nZW0tPmJ1Zm1nci5kZWJ1ZykKKwkJZHJtX2ludGVsX2dlbV9kdW1wX3ZhbGlkYXRpb25fbGlzdChidWZtZ3JfZ2VtKTsKKworCWZvciAoaSA9IDA7IGkgPCBidWZtZ3JfZ2VtLT5leGVjX2NvdW50OyBpKyspIHsKKwkJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gdG9fYm9fZ2VtKGJ1Zm1ncl9nZW0tPmV4ZWNfYm9zW2ldKTsKKworCQlib19nZW0tPmlkbGUgPSBmYWxzZTsKKworCQkvKiBEaXNjb25uZWN0IHRoZSBidWZmZXIgZnJvbSB0aGUgdmFsaWRhdGUgbGlzdCAqLworCQlib19nZW0tPnZhbGlkYXRlX2luZGV4ID0gLTE7CisJCWJ1Zm1ncl9nZW0tPmV4ZWNfYm9zW2ldID0gTlVMTDsKKwl9CisJYnVmbWdyX2dlbS0+ZXhlY19jb3VudCA9IDA7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorZG9fZXhlYzIoZHJtX2ludGVsX2JvICpibywgaW50IHVzZWQsIGRybV9pbnRlbF9jb250ZXh0ICpjdHgsCisJIGRybV9jbGlwX3JlY3RfdCAqY2xpcHJlY3RzLCBpbnQgbnVtX2NsaXByZWN0cywgaW50IERSNCwKKwkgaW50IGluX2ZlbmNlLCBpbnQgKm91dF9mZW5jZSwKKwkgdW5zaWduZWQgaW50IGZsYWdzKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopYm8tPmJ1Zm1ncjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyIGV4ZWNidWY7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlpZiAodG9fYm9fZ2VtKGJvKS0+aGFzX2Vycm9yKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN3aXRjaCAoZmxhZ3MgJiAweDcpIHsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIEk5MTVfRVhFQ19CTFQ6CisJCWlmICghYnVmbWdyX2dlbS0+aGFzX2JsdCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIEk5MTVfRVhFQ19CU0Q6CisJCWlmICghYnVmbWdyX2dlbS0+aGFzX2JzZCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIEk5MTVfRVhFQ19WRUJPWDoKKwkJaWYgKCFidWZtZ3JfZ2VtLT5oYXNfdmVib3gpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBJOTE1X0VYRUNfUkVOREVSOgorCWNhc2UgSTkxNV9FWEVDX0RFRkFVTFQ6CisJCWJyZWFrOworCX0KKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisJLyogVXBkYXRlIGluZGljZXMgYW5kIHNldCB1cCB0aGUgdmFsaWRhdGUgbGlzdC4gKi8KKwlkcm1faW50ZWxfZ2VtX2JvX3Byb2Nlc3NfcmVsb2MyKGJvKTsKKworCS8qIEFkZCB0aGUgYmF0Y2ggYnVmZmVyIHRvIHRoZSB2YWxpZGF0aW9uIGxpc3QuICBUaGVyZSBhcmUgbm8gcmVsb2NhdGlvbnMKKwkgKiBwb2ludGluZyB0byBpdC4KKwkgKi8KKwlkcm1faW50ZWxfYWRkX3ZhbGlkYXRlX2J1ZmZlcjIoYm8sIDApOworCisJbWVtY2xlYXIoZXhlY2J1Zik7CisJZXhlY2J1Zi5idWZmZXJzX3B0ciA9ICh1aW50cHRyX3QpYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0czsKKwlleGVjYnVmLmJ1ZmZlcl9jb3VudCA9IGJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQ7CisJZXhlY2J1Zi5iYXRjaF9zdGFydF9vZmZzZXQgPSAwOworCWV4ZWNidWYuYmF0Y2hfbGVuID0gdXNlZDsKKwlleGVjYnVmLmNsaXByZWN0c19wdHIgPSAodWludHB0cl90KWNsaXByZWN0czsKKwlleGVjYnVmLm51bV9jbGlwcmVjdHMgPSBudW1fY2xpcHJlY3RzOworCWV4ZWNidWYuRFIxID0gMDsKKwlleGVjYnVmLkRSNCA9IERSNDsKKwlleGVjYnVmLmZsYWdzID0gZmxhZ3M7CisJaWYgKGN0eCA9PSBOVUxMKQorCQlpOTE1X2V4ZWNidWZmZXIyX3NldF9jb250ZXh0X2lkKGV4ZWNidWYsIDApOworCWVsc2UKKwkJaTkxNV9leGVjYnVmZmVyMl9zZXRfY29udGV4dF9pZChleGVjYnVmLCBjdHgtPmN0eF9pZCk7CisJZXhlY2J1Zi5yc3ZkMiA9IDA7CisJaWYgKGluX2ZlbmNlICE9IC0xKSB7CisJCWV4ZWNidWYucnN2ZDIgPSBpbl9mZW5jZTsKKwkJZXhlY2J1Zi5mbGFncyB8PSBJOTE1X0VYRUNfRkVOQ0VfSU47CisJfQorCWlmIChvdXRfZmVuY2UgIT0gTlVMTCkgeworCQkqb3V0X2ZlbmNlID0gLTE7CisJCWV4ZWNidWYuZmxhZ3MgfD0gSTkxNV9FWEVDX0ZFTkNFX09VVDsKKwl9CisKKwlpZiAoYnVmbWdyX2dlbS0+bm9fZXhlYykKKwkJZ290byBza2lwX2V4ZWN1dGlvbjsKKworCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAorCQkgICAgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX0VYRUNCVUZGRVIyX1dSLAorCQkgICAgICAgJmV4ZWNidWYpOworCWlmIChyZXQgIT0gMCkgeworCQlyZXQgPSAtZXJybm87CisJCWlmIChyZXQgPT0gLUVOT1NQQykgeworCQkJREJHKCJFeGVjYnVmZmVyIGZhaWxzIHRvIHBpbi4gIgorCQkJICAgICJFc3RpbWF0ZTogJXUuIEFjdHVhbDogJXUuIEF2YWlsYWJsZTogJXVcbiIsCisJCQkgICAgZHJtX2ludGVsX2dlbV9lc3RpbWF0ZV9iYXRjaF9zcGFjZShidWZtZ3JfZ2VtLT5leGVjX2JvcywKKwkJCQkJCQkgICAgICAgYnVmbWdyX2dlbS0+ZXhlY19jb3VudCksCisJCQkgICAgZHJtX2ludGVsX2dlbV9jb21wdXRlX2JhdGNoX3NwYWNlKGJ1Zm1ncl9nZW0tPmV4ZWNfYm9zLAorCQkJCQkJCSAgICAgIGJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQpLAorCQkJICAgICh1bnNpZ25lZCBpbnQpIGJ1Zm1ncl9nZW0tPmd0dF9zaXplKTsKKwkJfQorCX0KKwlkcm1faW50ZWxfdXBkYXRlX2J1ZmZlcl9vZmZzZXRzMihidWZtZ3JfZ2VtKTsKKworCWlmIChyZXQgPT0gMCAmJiBvdXRfZmVuY2UgIT0gTlVMTCkKKwkJKm91dF9mZW5jZSA9IGV4ZWNidWYucnN2ZDIgPj4gMzI7CisKK3NraXBfZXhlY3V0aW9uOgorCWlmIChidWZtZ3JfZ2VtLT5idWZtZ3IuZGVidWcpCisJCWRybV9pbnRlbF9nZW1fZHVtcF92YWxpZGF0aW9uX2xpc3QoYnVmbWdyX2dlbSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnVmbWdyX2dlbS0+ZXhlY19jb3VudDsgaSsrKSB7CisJCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IHRvX2JvX2dlbShidWZtZ3JfZ2VtLT5leGVjX2Jvc1tpXSk7CisKKwkJYm9fZ2VtLT5pZGxlID0gZmFsc2U7CisKKwkJLyogRGlzY29ubmVjdCB0aGUgYnVmZmVyIGZyb20gdGhlIHZhbGlkYXRlIGxpc3QgKi8KKwkJYm9fZ2VtLT52YWxpZGF0ZV9pbmRleCA9IC0xOworCQlidWZtZ3JfZ2VtLT5leGVjX2Jvc1tpXSA9IE5VTEw7CisJfQorCWJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQgPSAwOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2RybV9pbnRlbF9nZW1fYm9fZXhlYzIoZHJtX2ludGVsX2JvICpibywgaW50IHVzZWQsCisJCSAgICAgICBkcm1fY2xpcF9yZWN0X3QgKmNsaXByZWN0cywgaW50IG51bV9jbGlwcmVjdHMsCisJCSAgICAgICBpbnQgRFI0KQoreworCXJldHVybiBkb19leGVjMihibywgdXNlZCwgTlVMTCwgY2xpcHJlY3RzLCBudW1fY2xpcHJlY3RzLCBEUjQsCisJCQktMSwgTlVMTCwgSTkxNV9FWEVDX1JFTkRFUik7Cit9CisKK3N0YXRpYyBpbnQKK2RybV9pbnRlbF9nZW1fYm9fbXJiX2V4ZWMyKGRybV9pbnRlbF9ibyAqYm8sIGludCB1c2VkLAorCQkJZHJtX2NsaXBfcmVjdF90ICpjbGlwcmVjdHMsIGludCBudW1fY2xpcHJlY3RzLCBpbnQgRFI0LAorCQkJdW5zaWduZWQgaW50IGZsYWdzKQoreworCXJldHVybiBkb19leGVjMihibywgdXNlZCwgTlVMTCwgY2xpcHJlY3RzLCBudW1fY2xpcHJlY3RzLCBEUjQsCisJCQktMSwgTlVMTCwgZmxhZ3MpOworfQorCitpbnQKK2RybV9pbnRlbF9nZW1fYm9fY29udGV4dF9leGVjKGRybV9pbnRlbF9ibyAqYm8sIGRybV9pbnRlbF9jb250ZXh0ICpjdHgsCisJCQkgICAgICBpbnQgdXNlZCwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXJldHVybiBkb19leGVjMihibywgdXNlZCwgY3R4LCBOVUxMLCAwLCAwLCAtMSwgTlVMTCwgZmxhZ3MpOworfQorCitpbnQKK2RybV9pbnRlbF9nZW1fYm9fZmVuY2VfZXhlYyhkcm1faW50ZWxfYm8gKmJvLAorCQkJICAgIGRybV9pbnRlbF9jb250ZXh0ICpjdHgsCisJCQkgICAgaW50IHVzZWQsCisJCQkgICAgaW50IGluX2ZlbmNlLAorCQkJICAgIGludCAqb3V0X2ZlbmNlLAorCQkJICAgIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlyZXR1cm4gZG9fZXhlYzIoYm8sIHVzZWQsIGN0eCwgTlVMTCwgMCwgMCwgaW5fZmVuY2UsIG91dF9mZW5jZSwgZmxhZ3MpOworfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2JvX3Bpbihkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCBhbGlnbm1lbnQpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3BpbiBwaW47CisJaW50IHJldDsKKworCW1lbWNsZWFyKHBpbik7CisJcGluLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKKwlwaW4uYWxpZ25tZW50ID0gYWxpZ25tZW50OworCisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCisJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fUElOLAorCQkgICAgICAgJnBpbik7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gLWVycm5vOworCisJYm8tPm9mZnNldDY0ID0gcGluLm9mZnNldDsKKwliby0+b2Zmc2V0ID0gcGluLm9mZnNldDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZHJtX2ludGVsX2dlbV9ib191bnBpbihkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisJc3RydWN0IGRybV9pOTE1X2dlbV91bnBpbiB1bnBpbjsKKwlpbnQgcmV0OworCisJbWVtY2xlYXIodW5waW4pOworCXVucGluLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKKworCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfSTkxNV9HRU1fVU5QSU4sICZ1bnBpbik7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gLWVycm5vOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RybV9pbnRlbF9nZW1fYm9fc2V0X3RpbGluZ19pbnRlcm5hbChkcm1faW50ZWxfYm8gKmJvLAorCQkJCSAgICAgdWludDMyX3QgdGlsaW5nX21vZGUsCisJCQkJICAgICB1aW50MzJfdCBzdHJpZGUpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3NldF90aWxpbmcgc2V0X3RpbGluZzsKKwlpbnQgcmV0OworCisJaWYgKGJvX2dlbS0+Z2xvYmFsX25hbWUgPT0gMCAmJgorCSAgICB0aWxpbmdfbW9kZSA9PSBib19nZW0tPnRpbGluZ19tb2RlICYmCisJICAgIHN0cmlkZSA9PSBib19nZW0tPnN0cmlkZSkKKwkJcmV0dXJuIDA7CisKKwltZW1zZXQoJnNldF90aWxpbmcsIDAsIHNpemVvZihzZXRfdGlsaW5nKSk7CisJZG8geworCQkvKiBzZXRfdGlsaW5nIGlzIHNsaWdodGx5IGJyb2tlbiBhbmQgb3ZlcndyaXRlcyB0aGUKKwkJICogaW5wdXQgb24gdGhlIGVycm9yIHBhdGgsIHNvIHdlIGhhdmUgdG8gb3BlbiBjb2RlCisJCSAqIHJtSW9jdGwuCisJCSAqLworCQlzZXRfdGlsaW5nLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKKwkJc2V0X3RpbGluZy50aWxpbmdfbW9kZSA9IHRpbGluZ19tb2RlOworCQlzZXRfdGlsaW5nLnN0cmlkZSA9IHN0cmlkZTsKKworCQlyZXQgPSBpb2N0bChidWZtZ3JfZ2VtLT5mZCwKKwkJCSAgICBEUk1fSU9DVExfSTkxNV9HRU1fU0VUX1RJTElORywKKwkJCSAgICAmc2V0X3RpbGluZyk7CisJfSB3aGlsZSAocmV0ID09IC0xICYmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQUdBSU4pKTsKKwlpZiAocmV0ID09IC0xKQorCQlyZXR1cm4gLWVycm5vOworCisJYm9fZ2VtLT50aWxpbmdfbW9kZSA9IHNldF90aWxpbmcudGlsaW5nX21vZGU7CisJYm9fZ2VtLT5zd2l6emxlX21vZGUgPSBzZXRfdGlsaW5nLnN3aXp6bGVfbW9kZTsKKwlib19nZW0tPnN0cmlkZSA9IHNldF90aWxpbmcuc3RyaWRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2JvX3NldF90aWxpbmcoZHJtX2ludGVsX2JvICpibywgdWludDMyX3QgKiB0aWxpbmdfbW9kZSwKKwkJCSAgICB1aW50MzJfdCBzdHJpZGUpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKwlpbnQgcmV0OworCisJLyogVGlsaW5nIHdpdGggdXNlcnB0ciBzdXJmYWNlcyBpcyBub3Qgc3VwcG9ydGVkCisJICogb24gYWxsIGhhcmR3YXJlIHNvIHJlZnVzZSBpdCBmb3IgdGltZSBiZWluZy4KKwkgKi8KKwlpZiAoYm9fZ2VtLT5pc191c2VycHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIExpbmVhciBidWZmZXJzIGhhdmUgbm8gc3RyaWRlLiBCeSBlbnN1cmluZyB0aGF0IHdlIG9ubHkgZXZlciB1c2UKKwkgKiBzdHJpZGUgMCB3aXRoIGxpbmVhciBidWZmZXJzLCB3ZSBzaW1wbGlmeSBvdXIgY29kZS4KKwkgKi8KKwlpZiAoKnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX05PTkUpCisJCXN0cmlkZSA9IDA7CisKKwlyZXQgPSBkcm1faW50ZWxfZ2VtX2JvX3NldF90aWxpbmdfaW50ZXJuYWwoYm8sICp0aWxpbmdfbW9kZSwgc3RyaWRlKTsKKwlpZiAocmV0ID09IDApCisJCWRybV9pbnRlbF9ib19nZW1fc2V0X2luX2FwZXJ0dXJlX3NpemUoYnVmbWdyX2dlbSwgYm9fZ2VtLCAwKTsKKworCSp0aWxpbmdfbW9kZSA9IGJvX2dlbS0+dGlsaW5nX21vZGU7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorZHJtX2ludGVsX2dlbV9ib19nZXRfdGlsaW5nKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90ICogdGlsaW5nX21vZGUsCisJCQkgICAgdWludDMyX3QgKiBzd2l6emxlX21vZGUpCit7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisKKwkqdGlsaW5nX21vZGUgPSBib19nZW0tPnRpbGluZ19tb2RlOworCSpzd2l6emxlX21vZGUgPSBib19nZW0tPnN3aXp6bGVfbW9kZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZHJtX2ludGVsX2dlbV9ib19zZXRfc29mdHBpbl9vZmZzZXQoZHJtX2ludGVsX2JvICpibywgdWludDY0X3Qgb2Zmc2V0KQoreworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCisJYm8tPm9mZnNldDY0ID0gb2Zmc2V0OworCWJvLT5vZmZzZXQgPSBvZmZzZXQ7CisJYm9fZ2VtLT5rZmxhZ3MgfD0gRVhFQ19PQkpFQ1RfUElOTkVEOworCisJcmV0dXJuIDA7Cit9CisKK2RybV9pbnRlbF9ibyAqCitkcm1faW50ZWxfYm9fZ2VtX2NyZWF0ZV9mcm9tX3ByaW1lKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwgaW50IHByaW1lX2ZkLCBpbnQgc2l6ZSkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBidWZtZ3I7CisJaW50IHJldDsKKwl1aW50MzJfdCBoYW5kbGU7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtOworCXN0cnVjdCBkcm1faTkxNV9nZW1fZ2V0X3RpbGluZyBnZXRfdGlsaW5nOworCisJcHRocmVhZF9tdXRleF9sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKKwlyZXQgPSBkcm1QcmltZUZEVG9IYW5kbGUoYnVmbWdyX2dlbS0+ZmQsIHByaW1lX2ZkLCAmaGFuZGxlKTsKKwlpZiAocmV0KSB7CisJCURCRygiY3JlYXRlX2Zyb21fcHJpbWU6IGZhaWxlZCB0byBvYnRhaW4gaGFuZGxlIGZyb20gZmQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogU2VlIGlmIHRoZSBrZXJuZWwgaGFzIGFscmVhZHkgcmV0dXJuZWQgdGhpcyBidWZmZXIgdG8gdXMuIEp1c3QgYXMKKwkgKiBmb3IgbmFtZWQgYnVmZmVycywgd2UgbXVzdCBub3QgY3JlYXRlIHR3byBibydzIHBvaW50aW5nIGF0IHRoZSBzYW1lCisJICoga2VybmVsIG9iamVjdAorCSAqLworCUhBU0hfRklORChoYW5kbGVfaGgsIGJ1Zm1ncl9nZW0tPmhhbmRsZV90YWJsZSwKKwkJICAmaGFuZGxlLCBzaXplb2YoaGFuZGxlKSwgYm9fZ2VtKTsKKwlpZiAoYm9fZ2VtKSB7CisJCWRybV9pbnRlbF9nZW1fYm9fcmVmZXJlbmNlKCZib19nZW0tPmJvKTsKKwkJZ290byBvdXQ7CisJfQorCisJYm9fZ2VtID0gY2FsbG9jKDEsIHNpemVvZigqYm9fZ2VtKSk7CisJaWYgKCFib19nZW0pCisJCWdvdG8gb3V0OworCisJYXRvbWljX3NldCgmYm9fZ2VtLT5yZWZjb3VudCwgMSk7CisJRFJNSU5JVExJU1RIRUFEKCZib19nZW0tPnZtYV9saXN0KTsKKworCS8qIERldGVybWluZSBzaXplIG9mIGJvLiAgVGhlIGZkLXRvLWhhbmRsZSBpb2N0bCByZWFsbHkgc2hvdWxkCisJICogcmV0dXJuIHRoZSBzaXplLCBidXQgaXQgZG9lc24ndC4gIElmIHdlIGhhdmUga2VybmVsIDMuMTIgb3IKKwkgKiBsYXRlciwgd2UgY2FuIGxzZWVrIG9uIHRoZSBwcmltZSBmZCB0byBnZXQgdGhlIHNpemUuICBPbGRlcgorCSAqIGtlcm5lbHMgd2lsbCBqdXN0IGZhaWwsIGluIHdoaWNoIGNhc2Ugd2UgZmFsbCBiYWNrIHRvIHRoZQorCSAqIHByb3ZpZGVkIChlc3RpbWF0ZWQgb3IgZ3Vlc3Mgc2l6ZSkuICovCisJcmV0ID0gbHNlZWsocHJpbWVfZmQsIDAsIFNFRUtfRU5EKTsKKwlpZiAocmV0ICE9IC0xKQorCQlib19nZW0tPmJvLnNpemUgPSByZXQ7CisJZWxzZQorCQlib19nZW0tPmJvLnNpemUgPSBzaXplOworCisJYm9fZ2VtLT5iby5oYW5kbGUgPSBoYW5kbGU7CisJYm9fZ2VtLT5iby5idWZtZ3IgPSBidWZtZ3I7CisKKwlib19nZW0tPmdlbV9oYW5kbGUgPSBoYW5kbGU7CisJSEFTSF9BREQoaGFuZGxlX2hoLCBidWZtZ3JfZ2VtLT5oYW5kbGVfdGFibGUsCisJCSBnZW1faGFuZGxlLCBzaXplb2YoYm9fZ2VtLT5nZW1faGFuZGxlKSwgYm9fZ2VtKTsKKworCWJvX2dlbS0+bmFtZSA9ICJwcmltZSI7CisJYm9fZ2VtLT52YWxpZGF0ZV9pbmRleCA9IC0xOworCWJvX2dlbS0+cmVsb2NfdHJlZV9mZW5jZXMgPSAwOworCWJvX2dlbS0+dXNlZF9hc19yZWxvY190YXJnZXQgPSBmYWxzZTsKKwlib19nZW0tPmhhc19lcnJvciA9IGZhbHNlOworCWJvX2dlbS0+cmV1c2FibGUgPSBmYWxzZTsKKworCW1lbWNsZWFyKGdldF90aWxpbmcpOworCWdldF90aWxpbmcuaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOworCWlmIChkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKKwkJICAgICBEUk1fSU9DVExfSTkxNV9HRU1fR0VUX1RJTElORywKKwkJICAgICAmZ2V0X3RpbGluZykpCisJCWdvdG8gZXJyOworCisJYm9fZ2VtLT50aWxpbmdfbW9kZSA9IGdldF90aWxpbmcudGlsaW5nX21vZGU7CisJYm9fZ2VtLT5zd2l6emxlX21vZGUgPSBnZXRfdGlsaW5nLnN3aXp6bGVfbW9kZTsKKwkvKiBYWFggc3RyaWRlIGlzIHVua25vd24gKi8KKwlkcm1faW50ZWxfYm9fZ2VtX3NldF9pbl9hcGVydHVyZV9zaXplKGJ1Zm1ncl9nZW0sIGJvX2dlbSwgMCk7CisKK291dDoKKwlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisJcmV0dXJuICZib19nZW0tPmJvOworCitlcnI6CisJZHJtX2ludGVsX2dlbV9ib19mcmVlKCZib19nZW0tPmJvKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludAorZHJtX2ludGVsX2JvX2dlbV9leHBvcnRfdG9fcHJpbWUoZHJtX2ludGVsX2JvICpibywgaW50ICpwcmltZV9mZCkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCisJaWYgKGRybVByaW1lSGFuZGxlVG9GRChidWZtZ3JfZ2VtLT5mZCwgYm9fZ2VtLT5nZW1faGFuZGxlLAorCQkJICAgICAgIERSTV9DTE9FWEVDLCBwcmltZV9mZCkgIT0gMCkKKwkJcmV0dXJuIC1lcnJubzsKKworCWJvX2dlbS0+cmV1c2FibGUgPSBmYWxzZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2JvX2ZsaW5rKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90ICogbmFtZSkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCisJaWYgKCFib19nZW0tPmdsb2JhbF9uYW1lKSB7CisJCXN0cnVjdCBkcm1fZ2VtX2ZsaW5rIGZsaW5rOworCisJCW1lbWNsZWFyKGZsaW5rKTsKKwkJZmxpbmsuaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOworCQlpZiAoZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9HRU1fRkxJTkssICZmbGluaykpCisJCQlyZXR1cm4gLWVycm5vOworCisJCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisJCWlmICghYm9fZ2VtLT5nbG9iYWxfbmFtZSkgeworCQkJYm9fZ2VtLT5nbG9iYWxfbmFtZSA9IGZsaW5rLm5hbWU7CisJCQlib19nZW0tPnJldXNhYmxlID0gZmFsc2U7CisKKwkJCUhBU0hfQUREKG5hbWVfaGgsIGJ1Zm1ncl9nZW0tPm5hbWVfdGFibGUsCisJCQkJIGdsb2JhbF9uYW1lLCBzaXplb2YoYm9fZ2VtLT5nbG9iYWxfbmFtZSksCisJCQkJIGJvX2dlbSk7CisJCX0KKwkJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCX0KKworCSpuYW1lID0gYm9fZ2VtLT5nbG9iYWxfbmFtZTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBFbmFibGVzIHVubGltaXRlZCBjYWNoaW5nIG9mIGJ1ZmZlciBvYmplY3RzIGZvciByZXVzZS4KKyAqCisgKiBUaGlzIGlzIHBvdGVudGlhbGx5IHZlcnkgbWVtb3J5IGV4cGVuc2l2ZSwgYXMgdGhlIGNhY2hlIGF0IGVhY2ggYnVja2V0CisgKiBzaXplIGlzIG9ubHkgYm91bmRlZCBieSBob3cgbWFueSBidWZmZXJzIG9mIHRoYXQgc2l6ZSB3ZSd2ZSBtYW5hZ2VkIHRvIGhhdmUKKyAqIGluIGZsaWdodCBhdCBvbmNlLgorICovCit2b2lkCitkcm1faW50ZWxfYnVmbWdyX2dlbV9lbmFibGVfcmV1c2UoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJ1Zm1ncjsKKworCWJ1Zm1ncl9nZW0tPmJvX3JldXNlID0gdHJ1ZTsKK30KKworLyoqCisgKiBEaXNhYmxlcyBpbXBsaWNpdCBzeW5jaHJvbmlzYXRpb24gYmVmb3JlIGV4ZWN1dGluZyB0aGUgYm8KKyAqCisgKiBUaGlzIHdpbGwgY2F1c2UgcmVuZGVyaW5nIGNvcnJ1cHRpb24gdW5sZXNzIHlvdSBjb3JyZWN0bHkgbWFuYWdlIGV4cGxpY2l0CisgKiBmZW5jZXMgZm9yIGFsbCByZW5kZXJpbmcgaW52b2x2aW5nIHRoaXMgYnVmZmVyIC0gaW5jbHVkaW5nIHVzZSBieSBvdGhlcnMuCisgKiBEaXNhYmxpbmcgdGhlIGltcGxpY2l0IHNlcmlhbGlzYXRpb24gaXMgb25seSByZXF1aXJlZCBpZiB0aGF0IHNlcmlhbGlzYXRpb24KKyAqIGlzIHRvbyBjb2Fyc2UgKGZvciBleGFtcGxlLCB5b3UgaGF2ZSBzcGxpdCB0aGUgYnVmZmVyIGludG8gbWFueQorICogbm9uLW92ZXJsYXBwaW5nIHJlZ2lvbnMgYW5kIGFyZSBzaGFyaW5nIHRoZSB3aG9sZSBidWZmZXIgYmV0d2VlbiBjb25jdXJyZW50CisgKiBpbmRlcGVuZGVudCBjb21tYW5kIHN0cmVhbXMpLgorICoKKyAqIE5vdGUgdGhlIGtlcm5lbCBtdXN0IGFkdmVydGlzZSBzdXBwb3J0IHZpYSBJOTE1X1BBUkFNX0hBU19FWEVDX0FTWU5DLAorICogd2hpY2ggY2FuIGJlIGNoZWNrZWQgdXNpbmcgZHJtX2ludGVsX2J1Zm1ncl9jYW5fZGlzYWJsZV9pbXBsaWNpdF9zeW5jLAorICogb3Igc3Vic2VxdWVudCBleGVjYnVmcyBpbnZvbHZpbmcgdGhlIGJvIHdpbGwgZ2VuZXJhdGUgRUlOVkFMLgorICovCit2b2lkCitkcm1faW50ZWxfZ2VtX2JvX2Rpc2FibGVfaW1wbGljaXRfc3luYyhkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCisJYm9fZ2VtLT5rZmxhZ3MgfD0gRVhFQ19PQkpFQ1RfQVNZTkM7Cit9CisKKy8qKgorICogRW5hYmxlcyBpbXBsaWNpdCBzeW5jaHJvbmlzYXRpb24gYmVmb3JlIGV4ZWN1dGluZyB0aGUgYm8KKyAqCisgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiB0aGUga2VybmVsLCB0byB3YWl0IHVwb24gcHJpb3Igd3JpdGVzCisgKiBjb21wbGV0aW5nIG9uIHRoZSBvYmplY3QgYmVmb3JlIHJlbmRlcmluZyB3aXRoIGl0LCBvciB0byB3YWl0IGZvciBwcmlvcgorICogcmVhZHMgdG8gY29tcGxldGUgYmVmb3JlIHdyaXRpbmcgaW50byB0aGUgb2JqZWN0LgorICogZHJtX2ludGVsX2dlbV9ib19kaXNhYmxlX2ltcGxpY2l0X3N5bmMoKSBjYW4gc3RvcCB0aGlzIGJlaGF2aW91ciwgdGVsbGluZworICogdGhlIGtlcm5lbCBuZXZlciB0byBpbnNlcnQgYSBzdGFsbCBiZWZvcmUgdXNpbmcgdGhlIG9iamVjdC4gVGhlbiB0aGlzCisgKiBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN0b3JlIHRoZSBpbXBsaWNpdCBzeW5jIGJlZm9yZSBzdWJzZXF1ZW50CisgKiByZW5kZXJpbmcuCisgKi8KK3ZvaWQKK2RybV9pbnRlbF9nZW1fYm9fZW5hYmxlX2ltcGxpY2l0X3N5bmMoZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKworCWJvX2dlbS0+a2ZsYWdzICY9IH5FWEVDX09CSkVDVF9BU1lOQzsKK30KKworLyoqCisgKiBRdWVyeSB3aGV0aGVyIHRoZSBrZXJuZWwgc3VwcG9ydHMgZGlzYWJsaW5nIG9mIGl0cyBpbXBsaWNpdCBzeW5jaHJvbmlzYXRpb24KKyAqIGJlZm9yZSBleGVjYnVmLiBTZWUgZHJtX2ludGVsX2dlbV9ib19kaXNhYmxlX2ltcGxpY2l0X3N5bmMoKQorICovCitpbnQKK2RybV9pbnRlbF9idWZtZ3JfZ2VtX2Nhbl9kaXNhYmxlX2ltcGxpY2l0X3N5bmMoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJ1Zm1ncjsKKworCXJldHVybiBidWZtZ3JfZ2VtLT5oYXNfZXhlY19hc3luYzsKK30KKworLyoqCisgKiBFbmFibGUgdXNlIG9mIGZlbmNlZCByZWxvYyB0eXBlLgorICoKKyAqIE5ldyBjb2RlIHNob3VsZCBlbmFibGUgdGhpcyB0byBhdm9pZCB1bm5lY2Vzc2FyeSBmZW5jZSByZWdpc3RlcgorICogYWxsb2NhdGlvbi4gIElmIHRoaXMgb3B0aW9uIGlzIG5vdCBlbmFibGVkLCBhbGwgcmVsb2NzIHdpbGwgaGF2ZSBmZW5jZQorICogcmVnaXN0ZXIgYWxsb2NhdGVkLgorICovCit2b2lkCitkcm1faW50ZWxfYnVmbWdyX2dlbV9lbmFibGVfZmVuY2VkX3JlbG9jcyhkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKilidWZtZ3I7CisKKwlpZiAoYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2V4ZWMgPT0gZHJtX2ludGVsX2dlbV9ib19leGVjMikKKwkJYnVmbWdyX2dlbS0+ZmVuY2VkX3JlbG9jcyA9IHRydWU7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBhZGRpdGlvbmFsIGFwZXJ0dXJlIHNwYWNlIHJlcXVpcmVkIGJ5IHRoZSB0cmVlIG9mIGJ1ZmZlciBvYmplY3RzCisgKiByb290ZWQgYXQgYm8uCisgKi8KK3N0YXRpYyBpbnQKK2RybV9pbnRlbF9nZW1fYm9fZ2V0X2FwZXJ0dXJlX3NwYWNlKGRybV9pbnRlbF9ibyAqYm8pCit7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisJaW50IGk7CisJaW50IHRvdGFsID0gMDsKKworCWlmIChibyA9PSBOVUxMIHx8IGJvX2dlbS0+aW5jbHVkZWRfaW5fY2hlY2tfYXBlcnR1cmUpCisJCXJldHVybiAwOworCisJdG90YWwgKz0gYm8tPnNpemU7CisJYm9fZ2VtLT5pbmNsdWRlZF9pbl9jaGVja19hcGVydHVyZSA9IHRydWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgYm9fZ2VtLT5yZWxvY19jb3VudDsgaSsrKQorCQl0b3RhbCArPQorCQkgICAgZHJtX2ludGVsX2dlbV9ib19nZXRfYXBlcnR1cmVfc3BhY2UoYm9fZ2VtLT4KKwkJCQkJCQlyZWxvY190YXJnZXRfaW5mb1tpXS5ibyk7CisKKwlyZXR1cm4gdG90YWw7Cit9CisKKy8qKgorICogQ291bnQgdGhlIG51bWJlciBvZiBidWZmZXJzIGluIHRoaXMgbGlzdCB0aGF0IG5lZWQgYSBmZW5jZSByZWcKKyAqCisgKiBJZiB0aGUgY291bnQgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHJlZ3MsIHdlJ2xsIGhhdmUKKyAqIHRvIGFzayB0aGUgY2FsbGVyIHRvIHJlc3VibWl0IGEgYmF0Y2ggd2l0aCBmZXdlciB0aWxlZCBidWZmZXJzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gb3Zlci1jb3VudHMgaWYgdGhlIHNhbWUgYnVmZmVyIGlzIHVzZWQgbXVsdGlwbGUgdGltZXMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2RybV9pbnRlbF9nZW1fdG90YWxfZmVuY2VzKGRybV9pbnRlbF9ibyAqKiBib19hcnJheSwgaW50IGNvdW50KQoreworCWludCBpOworCXVuc2lnbmVkIGludCB0b3RhbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBib19hcnJheVtpXTsKKworCQlpZiAoYm9fZ2VtID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQl0b3RhbCArPSBib19nZW0tPnJlbG9jX3RyZWVfZmVuY2VzOworCX0KKwlyZXR1cm4gdG90YWw7Cit9CisKKy8qKgorICogQ2xlYXIgdGhlIGZsYWcgc2V0IGJ5IGRybV9pbnRlbF9nZW1fYm9fZ2V0X2FwZXJ0dXJlX3NwYWNlKCkgc28gd2UncmUgcmVhZHkKKyAqIGZvciB0aGUgbmV4dCBkcm1faW50ZWxfYnVmbWdyX2NoZWNrX2FwZXJ0dXJlX3NwYWNlKCkgY2FsbC4KKyAqLworc3RhdGljIHZvaWQKK2RybV9pbnRlbF9nZW1fYm9fY2xlYXJfYXBlcnR1cmVfc3BhY2VfZmxhZyhkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCWludCBpOworCisJaWYgKGJvID09IE5VTEwgfHwgIWJvX2dlbS0+aW5jbHVkZWRfaW5fY2hlY2tfYXBlcnR1cmUpCisJCXJldHVybjsKKworCWJvX2dlbS0+aW5jbHVkZWRfaW5fY2hlY2tfYXBlcnR1cmUgPSBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCBib19nZW0tPnJlbG9jX2NvdW50OyBpKyspCisJCWRybV9pbnRlbF9nZW1fYm9fY2xlYXJfYXBlcnR1cmVfc3BhY2VfZmxhZyhib19nZW0tPgorCQkJCQkJCSAgIHJlbG9jX3RhcmdldF9pbmZvW2ldLmJvKTsKK30KKworLyoqCisgKiBSZXR1cm4gYSBjb25zZXJ2YXRpdmUgZXN0aW1hdGUgZm9yIHRoZSBhbW91bnQgb2YgYXBlcnR1cmUgcmVxdWlyZWQKKyAqIGZvciBhIGNvbGxlY3Rpb24gb2YgYnVmZmVycy4gVGhpcyBtYXkgZG91YmxlLWNvdW50IHNvbWUgYnVmZmVycy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludAorZHJtX2ludGVsX2dlbV9lc3RpbWF0ZV9iYXRjaF9zcGFjZShkcm1faW50ZWxfYm8gKipib19hcnJheSwgaW50IGNvdW50KQoreworCWludCBpOworCXVuc2lnbmVkIGludCB0b3RhbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBib19hcnJheVtpXTsKKwkJaWYgKGJvX2dlbSAhPSBOVUxMKQorCQkJdG90YWwgKz0gYm9fZ2VtLT5yZWxvY190cmVlX3NpemU7CisJfQorCXJldHVybiB0b3RhbDsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBhcGVydHVyZSBuZWVkZWQgZm9yIGEgY29sbGVjdGlvbiBvZiBidWZmZXJzLgorICogVGhpcyBhdm9pZHMgZG91YmxlIGNvdW50aW5nIGFueSBidWZmZXJzLCBhdCB0aGUgY29zdCBvZiBsb29raW5nCisgKiBhdCBldmVyeSBidWZmZXIgaW4gdGhlIHNldC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludAorZHJtX2ludGVsX2dlbV9jb21wdXRlX2JhdGNoX3NwYWNlKGRybV9pbnRlbF9ibyAqKmJvX2FycmF5LCBpbnQgY291bnQpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IHRvdGFsID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXRvdGFsICs9IGRybV9pbnRlbF9nZW1fYm9fZ2V0X2FwZXJ0dXJlX3NwYWNlKGJvX2FycmF5W2ldKTsKKwkJLyogRm9yIHRoZSBmaXJzdCBidWZmZXIgb2JqZWN0IGluIHRoZSBhcnJheSwgd2UgZ2V0IGFuCisJCSAqIGFjY3VyYXRlIGNvdW50IGJhY2sgZm9yIGl0cyByZWxvY190cmVlIHNpemUgKHNpbmNlIG5vdGhpbmcKKwkJICogaGFkIGJlZW4gZmxhZ2dlZCBhcyBiZWluZyBjb3VudGVkIHlldCkuICBXZSBjYW4gc2F2ZSB0aGF0CisJCSAqIHZhbHVlIG91dCBhcyBhIG1vcmUgY29uc2VydmF0aXZlIHJlbG9jX3RyZWVfc2l6ZSB0aGF0CisJCSAqIGF2b2lkcyBkb3VibGUtY291bnRpbmcgdGFyZ2V0IGJ1ZmZlcnMuICBTaW5jZSB0aGUgZmlyc3QKKwkJICogYnVmZmVyIGhhcHBlbnMgdG8gdXN1YWxseSBiZSB0aGUgYmF0Y2ggYnVmZmVyIGluIG91cgorCQkgKiBjYWxsZXJzLCB0aGlzIGNhbiBwdWxsIHVzIGJhY2sgZnJvbSBkb2luZyB0aGUgdHJlZQorCQkgKiB3YWxrIG9uIGV2ZXJ5IG5ldyBiYXRjaCBlbWl0LgorCQkgKi8KKwkJaWYgKGkgPT0gMCkgeworCQkJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0KKwkJCSAgICAoZHJtX2ludGVsX2JvX2dlbSAqKSBib19hcnJheVtpXTsKKwkJCWJvX2dlbS0+cmVsb2NfdHJlZV9zaXplID0gdG90YWw7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJZHJtX2ludGVsX2dlbV9ib19jbGVhcl9hcGVydHVyZV9zcGFjZV9mbGFnKGJvX2FycmF5W2ldKTsKKwlyZXR1cm4gdG90YWw7Cit9CisKKy8qKgorICogUmV0dXJuIC0xIGlmIHRoZSBiYXRjaGJ1ZmZlciBzaG91bGQgYmUgZmx1c2hlZCBiZWZvcmUgYXR0ZW1wdGluZyB0bworICogZW1pdCByZW5kZXJpbmcgcmVmZXJlbmNpbmcgdGhlIGJ1ZmZlcnMgcG9pbnRlZCB0byBieSBib19hcnJheS4KKyAqCisgKiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgaWYgd2UgdHJ5IHRvIGVtaXQgYSBiYXRjaGJ1ZmZlciB3aXRoIHJlbG9jYXRpb25zCisgKiB0byBhIHRyZWUgb2YgYnVmZmVycyB0aGF0IHdvbid0IHNpbXVsdGFuZW91c2x5IGZpdCBpbiB0aGUgYXBlcnR1cmUsCisgKiB0aGUgcmVuZGVyaW5nIHdpbGwgcmV0dXJuIGFuIGVycm9yIGF0IGEgcG9pbnQgd2hlcmUgdGhlIHNvZnR3YXJlIGlzIG5vdAorICogcHJlcGFyZWQgdG8gcmVjb3ZlciBmcm9tIGl0LgorICoKKyAqIEhvd2V2ZXIsIHdlIGFsc28gd2FudCB0byBlbWl0IHRoZSBiYXRjaGJ1ZmZlciBzaWduaWZpY2FudGx5IGJlZm9yZSB3ZSByZWFjaAorICogdGhlIGxpbWl0LCBhcyBhIHNlcmllcyBvZiBiYXRjaGJ1ZmZlcnMgZWFjaCBvZiB3aGljaCByZWZlcmVuY2VzIGJ1ZmZlcnMKKyAqIGNvdmVyaW5nIGFsbW9zdCBhbGwgb2YgdGhlIGFwZXJ0dXJlIG1lYW5zIHRoYXQgYXQgZWFjaCBlbWl0IHdlIGVuZCB1cAorICogd2FpdGluZyB0byBldmljdCBhIGJ1ZmZlciBmcm9tIHRoZSBsYXN0IHJlbmRlcmluZywgYW5kIHdlIGdldCBzeW5jaHJvbm91cworICogcGVyZm9ybWFuY2UuICBCeSBlbWl0dGluZyBzbWFsbGVyIGJhdGNoYnVmZmVycywgd2UgZWF0IHNvbWUgQ1BVIG92ZXJoZWFkIHRvCisgKiBnZXQgYmV0dGVyIHBhcmFsbGVsaXNtLgorICovCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2NoZWNrX2FwZXJ0dXJlX3NwYWNlKGRybV9pbnRlbF9ibyAqKmJvX2FycmF5LCBpbnQgY291bnQpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPQorCSAgICAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm9fYXJyYXlbMF0tPmJ1Zm1ncjsKKwl1bnNpZ25lZCBpbnQgdG90YWwgPSAwOworCXVuc2lnbmVkIGludCB0aHJlc2hvbGQgPSBidWZtZ3JfZ2VtLT5ndHRfc2l6ZSAqIDMgLyA0OworCWludCB0b3RhbF9mZW5jZXM7CisKKwkvKiBDaGVjayBmb3IgZmVuY2UgcmVnIGNvbnN0cmFpbnRzIGlmIG5lY2Vzc2FyeSAqLworCWlmIChidWZtZ3JfZ2VtLT5hdmFpbGFibGVfZmVuY2VzKSB7CisJCXRvdGFsX2ZlbmNlcyA9IGRybV9pbnRlbF9nZW1fdG90YWxfZmVuY2VzKGJvX2FycmF5LCBjb3VudCk7CisJCWlmICh0b3RhbF9mZW5jZXMgPiBidWZtZ3JfZ2VtLT5hdmFpbGFibGVfZmVuY2VzKQorCQkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJdG90YWwgPSBkcm1faW50ZWxfZ2VtX2VzdGltYXRlX2JhdGNoX3NwYWNlKGJvX2FycmF5LCBjb3VudCk7CisKKwlpZiAodG90YWwgPiB0aHJlc2hvbGQpCisJCXRvdGFsID0gZHJtX2ludGVsX2dlbV9jb21wdXRlX2JhdGNoX3NwYWNlKGJvX2FycmF5LCBjb3VudCk7CisKKwlpZiAodG90YWwgPiB0aHJlc2hvbGQpIHsKKwkJREJHKCJjaGVja19zcGFjZTogb3ZlcmZsb3dlZCBhdmFpbGFibGUgYXBlcnR1cmUsICIKKwkJICAgICIlZGtiIHZzICVka2JcbiIsCisJCSAgICB0b3RhbCAvIDEwMjQsIChpbnQpYnVmbWdyX2dlbS0+Z3R0X3NpemUgLyAxMDI0KTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfSBlbHNlIHsKKwkJREJHKCJkcm1fY2hlY2tfc3BhY2U6IHRvdGFsICVka2IgdnMgYnVmZ3IgJWRrYlxuIiwgdG90YWwgLyAxMDI0LAorCQkgICAgKGludClidWZtZ3JfZ2VtLT5ndHRfc2l6ZSAvIDEwMjQpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qCisgKiBEaXNhYmxlIGJ1ZmZlciByZXVzZSBmb3Igb2JqZWN0cyB3aGljaCBhcmUgc2hhcmVkIHdpdGggdGhlIGtlcm5lbAorICogYXMgc2Nhbm91dCBidWZmZXJzCisgKi8KK3N0YXRpYyBpbnQKK2RybV9pbnRlbF9nZW1fYm9fZGlzYWJsZV9yZXVzZShkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCisJYm9fZ2VtLT5yZXVzYWJsZSA9IGZhbHNlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citkcm1faW50ZWxfZ2VtX2JvX2lzX3JldXNhYmxlKGRybV9pbnRlbF9ibyAqYm8pCit7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisKKwlyZXR1cm4gYm9fZ2VtLT5yZXVzYWJsZTsKK30KKworc3RhdGljIGludAorX2RybV9pbnRlbF9nZW1fYm9fcmVmZXJlbmNlcyhkcm1faW50ZWxfYm8gKmJvLCBkcm1faW50ZWxfYm8gKnRhcmdldF9ibykKK3sKKwlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBib19nZW0tPnJlbG9jX2NvdW50OyBpKyspIHsKKwkJaWYgKGJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm9baV0uYm8gPT0gdGFyZ2V0X2JvKQorCQkJcmV0dXJuIDE7CisJCWlmIChibyA9PSBib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvW2ldLmJvKQorCQkJY29udGludWU7CisJCWlmIChfZHJtX2ludGVsX2dlbV9ib19yZWZlcmVuY2VzKGJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm9baV0uYm8sCisJCQkJCQl0YXJnZXRfYm8pKQorCQkJcmV0dXJuIDE7CisJfQorCisJZm9yIChpID0gMDsgaTwgYm9fZ2VtLT5zb2Z0cGluX3RhcmdldF9jb3VudDsgaSsrKSB7CisJCWlmIChib19nZW0tPnNvZnRwaW5fdGFyZ2V0W2ldID09IHRhcmdldF9ibykKKwkJCXJldHVybiAxOworCQlpZiAoX2RybV9pbnRlbF9nZW1fYm9fcmVmZXJlbmNlcyhib19nZW0tPnNvZnRwaW5fdGFyZ2V0W2ldLCB0YXJnZXRfYm8pKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKiBSZXR1cm4gdHJ1ZSBpZiB0YXJnZXRfYm8gaXMgcmVmZXJlbmNlZCBieSBibydzIHJlbG9jYXRpb24gdHJlZS4gKi8KK3N0YXRpYyBpbnQKK2RybV9pbnRlbF9nZW1fYm9fcmVmZXJlbmNlcyhkcm1faW50ZWxfYm8gKmJvLCBkcm1faW50ZWxfYm8gKnRhcmdldF9ibykKK3sKKwlkcm1faW50ZWxfYm9fZ2VtICp0YXJnZXRfYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgdGFyZ2V0X2JvOworCisJaWYgKGJvID09IE5VTEwgfHwgdGFyZ2V0X2JvID09IE5VTEwpCisJCXJldHVybiAwOworCWlmICh0YXJnZXRfYm9fZ2VtLT51c2VkX2FzX3JlbG9jX3RhcmdldCkKKwkJcmV0dXJuIF9kcm1faW50ZWxfZ2VtX2JvX3JlZmVyZW5jZXMoYm8sIHRhcmdldF9ibyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCithZGRfYnVja2V0KGRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtLCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgaSA9IGJ1Zm1ncl9nZW0tPm51bV9idWNrZXRzOworCisJYXNzZXJ0KGkgPCBBUlJBWV9TSVpFKGJ1Zm1ncl9nZW0tPmNhY2hlX2J1Y2tldCkpOworCisJRFJNSU5JVExJU1RIRUFEKCZidWZtZ3JfZ2VtLT5jYWNoZV9idWNrZXRbaV0uaGVhZCk7CisJYnVmbWdyX2dlbS0+Y2FjaGVfYnVja2V0W2ldLnNpemUgPSBzaXplOworCWJ1Zm1ncl9nZW0tPm51bV9idWNrZXRzKys7Cit9CisKK3N0YXRpYyB2b2lkCitpbml0X2NhY2hlX2J1Y2tldHMoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0pCit7CisJdW5zaWduZWQgbG9uZyBzaXplLCBjYWNoZV9tYXhfc2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQ7CisKKwkvKiBPSywgc28gcG93ZXIgb2YgdHdvIGJ1Y2tldHMgd2FzIHRvbyB3YXN0ZWZ1bCBvZiBtZW1vcnkuCisJICogR2l2ZSAzIG90aGVyIHNpemVzIGJldHdlZW4gZWFjaCBwb3dlciBvZiB0d28sIHRvIGhvcGVmdWxseQorCSAqIGNvdmVyIHRoaW5ncyBhY2N1cmF0ZWx5IGVub3VnaC4gIChUaGUgYWx0ZXJuYXRpdmUgaXMKKwkgKiBwcm9iYWJseSB0byBqdXN0IGdvIGZvciBleGFjdCBtYXRjaGluZyBvZiBzaXplcywgYW5kIGFzc3VtZQorCSAqIHRoYXQgZm9yIHRoaW5ncyBsaWtlIGNvbXBvc2l0ZWQgd2luZG93IHJlc2l6ZSB0aGUgdGlsZWQKKwkgKiB3aWR0aC9oZWlnaHQgYWxpZ25tZW50IGFuZCByb3VuZGluZyBvZiBzaXplcyB0byBwYWdlcyB3aWxsCisJICogZ2V0IHVzIHVzZWZ1bCBjYWNoZSBoaXQgcmF0ZXMgYW55d2F5KQorCSAqLworCWFkZF9idWNrZXQoYnVmbWdyX2dlbSwgNDA5Nik7CisJYWRkX2J1Y2tldChidWZtZ3JfZ2VtLCA0MDk2ICogMik7CisJYWRkX2J1Y2tldChidWZtZ3JfZ2VtLCA0MDk2ICogMyk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBsaW5rZWQgbGlzdHMgZm9yIEJPIHJldXNlIGNhY2hlLiAqLworCWZvciAoc2l6ZSA9IDQgKiA0MDk2OyBzaXplIDw9IGNhY2hlX21heF9zaXplOyBzaXplICo9IDIpIHsKKwkJYWRkX2J1Y2tldChidWZtZ3JfZ2VtLCBzaXplKTsKKworCQlhZGRfYnVja2V0KGJ1Zm1ncl9nZW0sIHNpemUgKyBzaXplICogMSAvIDQpOworCQlhZGRfYnVja2V0KGJ1Zm1ncl9nZW0sIHNpemUgKyBzaXplICogMiAvIDQpOworCQlhZGRfYnVja2V0KGJ1Zm1ncl9nZW0sIHNpemUgKyBzaXplICogMyAvIDQpOworCX0KK30KKwordm9pZAorZHJtX2ludGVsX2J1Zm1ncl9nZW1fc2V0X3ZtYV9jYWNoZV9zaXplKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwgaW50IGxpbWl0KQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopYnVmbWdyOworCisJYnVmbWdyX2dlbS0+dm1hX21heCA9IGxpbWl0OworCisJZHJtX2ludGVsX2dlbV9ib19wdXJnZV92bWFfY2FjaGUoYnVmbWdyX2dlbSk7Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNlX2RldmlkX292ZXJyaWRlKGNvbnN0IGNoYXIgKmRldmlkX292ZXJyaWRlKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQljb25zdCBjaGFyICpuYW1lOworCQlpbnQgcGNpX2lkOworCX0gbmFtZV9tYXBbXSA9IHsKKwkJeyAiYnJ3IiwgUENJX0NISVBfSTk2NV9HTSB9LAorCQl7ICJnNHgiLCBQQ0lfQ0hJUF9HTTQ1X0dNIH0sCisJCXsgImlsayIsIFBDSV9DSElQX0lMRF9HIH0sCisJCXsgInNuYiIsIFBDSV9DSElQX1NBTkRZQlJJREdFX01fR1QyX1BMVVMgfSwKKwkJeyAiaXZiIiwgUENJX0NISVBfSVZZQlJJREdFX1NfR1QyIH0sCisJCXsgImhzdyIsIFBDSV9DSElQX0hBU1dFTExfQ1JXX0VfR1QzIH0sCisJCXsgImJ5dCIsIFBDSV9DSElQX1ZBTExFWVZJRVdfMyB9LAorCQl7ICJiZHciLCAweDE2MjAgfCBCRFdfVUxYIH0sCisJCXsgInNrbCIsIFBDSV9DSElQX1NLWUxBS0VfRFRfR1QyIH0sCisJCXsgImtibCIsIFBDSV9DSElQX0tBQllMQUtFX0RUX0dUMiB9LAorCX07CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShuYW1lX21hcCk7IGkrKykgeworCQlpZiAoIXN0cmNtcChuYW1lX21hcFtpXS5uYW1lLCBkZXZpZF9vdmVycmlkZSkpCisJCQlyZXR1cm4gbmFtZV9tYXBbaV0ucGNpX2lkOworCX0KKworCXJldHVybiBzdHJ0b2QoZGV2aWRfb3ZlcnJpZGUsIE5VTEwpOworfQorCisvKioKKyAqIEdldCB0aGUgUENJIElEIGZvciB0aGUgZGV2aWNlLiAgVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzZXR0aW5nIHRoZQorICogSU5URUxfREVWSURfT1ZFUlJJREUgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGRlc2lyZWQgSUQuCisgKi8KK3N0YXRpYyBpbnQKK2dldF9wY2lfZGV2aWNlX2lkKGRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtKQoreworCWNoYXIgKmRldmlkX292ZXJyaWRlOworCWludCBkZXZpZCA9IDA7CisJaW50IHJldDsKKwlkcm1faTkxNV9nZXRwYXJhbV90IGdwOworCisJaWYgKGdldGV1aWQoKSA9PSBnZXR1aWQoKSkgeworCQlkZXZpZF9vdmVycmlkZSA9IGdldGVudigiSU5URUxfREVWSURfT1ZFUlJJREUiKTsKKwkJaWYgKGRldmlkX292ZXJyaWRlKSB7CisJCQlidWZtZ3JfZ2VtLT5ub19leGVjID0gdHJ1ZTsKKwkJCXJldHVybiBwYXJzZV9kZXZpZF9vdmVycmlkZShkZXZpZF9vdmVycmlkZSk7CisJCX0KKwl9CisKKwltZW1jbGVhcihncCk7CisJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0NISVBTRVRfSUQ7CisJZ3AudmFsdWUgPSAmZGV2aWQ7CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNLCAmZ3ApOworCWlmIChyZXQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJnZXQgY2hpcCBpZCBmYWlsZWQ6ICVkIFslZF1cbiIsIHJldCwgZXJybm8pOworCQlmcHJpbnRmKHN0ZGVyciwgInBhcmFtOiAlZCwgdmFsOiAlZFxuIiwgZ3AucGFyYW0sICpncC52YWx1ZSk7CisJfQorCXJldHVybiBkZXZpZDsKK30KKworaW50Citkcm1faW50ZWxfYnVmbWdyX2dlbV9nZXRfZGV2aWQoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopYnVmbWdyOworCisJcmV0dXJuIGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2U7Cit9CisKKy8qKgorICogU2V0cyB0aGUgQVVCIGZpbGVuYW1lLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGJlIGNhbGxlZCBiZWZvcmUgZHJtX2ludGVsX2J1Zm1ncl9nZW1fc2V0X2F1Yl9kdW1wKCkKKyAqIGZvciBpdCB0byBoYXZlIGFueSBlZmZlY3QuCisgKi8KK3ZvaWQKK2RybV9pbnRlbF9idWZtZ3JfZ2VtX3NldF9hdWJfZmlsZW5hbWUoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworfQorCisvKioKKyAqIFNldHMgdXAgQVVCIGR1bXBpbmcuCisgKgorICogVGhpcyBpcyBhIHRyYWNlIGZpbGUgZm9ybWF0IHRoYXQgY2FuIGJlIHVzZWQgd2l0aCB0aGUgc2ltdWxhdG9yLgorICogUGFja2V0cyBhcmUgZW1pdHRlZCBpbiBhIGZvcm1hdCBzb21ld2hhdCBsaWtlIEdQVSBjb21tYW5kIHBhY2tldHMuCisgKiBZb3UgY2FuIHNldCB1cCBhIEdUVCBhbmQgdXBsb2FkIHlvdXIgb2JqZWN0cyBpbnRvIHRoZSByZWZlcmVuY2VkCisgKiBzcGFjZSwgdGhlbiBzZW5kIG9mZiBiYXRjaGJ1ZmZlcnMgYW5kIGdldCBCTVBzIG91dCB0aGUgb3RoZXIgZW5kLgorICovCit2b2lkCitkcm1faW50ZWxfYnVmbWdyX2dlbV9zZXRfYXViX2R1bXAoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLCBpbnQgZW5hYmxlKQoreworCWZwcmludGYoc3RkZXJyLCAibGliZHJtIGF1YiBkdW1waW5nIGlzIGRlcHJlY2F0ZWQuXG5cbiIKKwkJIlVzZSBpbnRlbF9hdWJkdW1wIGZyb20gaW50ZWwtZ3B1LXRvb2xzIGluc3RlYWQuICBJbnN0YWxsIGludGVsLWdwdS10b29scyxcbiIKKwkJInRoZW4gcnVuIChmb3IgZXhhbXBsZSlcblxuIgorCQkiXHQkIGludGVsX2F1YmR1bXAgLS1vdXRwdXQ9dHJhY2UuYXViIGdseGdlYXJzIC1nZW9tZXRyeSA1MDB4NTAwXG5cbiIKKwkJIlNlZSB0aGUgaW50ZWxfYXViZHVtcCBtYW4gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLlxuIik7Cit9CisKK2RybV9pbnRlbF9jb250ZXh0ICoKK2RybV9pbnRlbF9nZW1fY29udGV4dF9jcmVhdGUoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopYnVmbWdyOworCXN0cnVjdCBkcm1faTkxNV9nZW1fY29udGV4dF9jcmVhdGUgY3JlYXRlOworCWRybV9pbnRlbF9jb250ZXh0ICpjb250ZXh0ID0gTlVMTDsKKwlpbnQgcmV0OworCisJY29udGV4dCA9IGNhbGxvYygxLCBzaXplb2YoKmNvbnRleHQpKTsKKwlpZiAoIWNvbnRleHQpCisJCXJldHVybiBOVUxMOworCisJbWVtY2xlYXIoY3JlYXRlKTsKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VNX0NPTlRFWFRfQ1JFQVRFLCAmY3JlYXRlKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJREJHKCJEUk1fSU9DVExfSTkxNV9HRU1fQ09OVEVYVF9DUkVBVEUgZmFpbGVkOiAlc1xuIiwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCWZyZWUoY29udGV4dCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWNvbnRleHQtPmN0eF9pZCA9IGNyZWF0ZS5jdHhfaWQ7CisJY29udGV4dC0+YnVmbWdyID0gYnVmbWdyOworCisJcmV0dXJuIGNvbnRleHQ7Cit9CisKK2ludAorZHJtX2ludGVsX2dlbV9jb250ZXh0X2dldF9pZChkcm1faW50ZWxfY29udGV4dCAqY3R4LCB1aW50MzJfdCAqY3R4X2lkKQoreworCWlmIChjdHggPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqY3R4X2lkID0gY3R4LT5jdHhfaWQ7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorZHJtX2ludGVsX2dlbV9jb250ZXh0X2Rlc3Ryb3koZHJtX2ludGVsX2NvbnRleHQgKmN0eCkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfZGVzdHJveSBkZXN0cm95OworCWludCByZXQ7CisKKwlpZiAoY3R4ID09IE5VTEwpCisJCXJldHVybjsKKworCW1lbWNsZWFyKGRlc3Ryb3kpOworCisJYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKWN0eC0+YnVmbWdyOworCWRlc3Ryb3kuY3R4X2lkID0gY3R4LT5jdHhfaWQ7CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFTV9DT05URVhUX0RFU1RST1ksCisJCSAgICAgICAmZGVzdHJveSk7CisJaWYgKHJldCAhPSAwKQorCQlmcHJpbnRmKHN0ZGVyciwgIkRSTV9JT0NUTF9JOTE1X0dFTV9DT05URVhUX0RFU1RST1kgZmFpbGVkOiAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisKKwlmcmVlKGN0eCk7Cit9CisKK2ludAorZHJtX2ludGVsX2dldF9yZXNldF9zdGF0cyhkcm1faW50ZWxfY29udGV4dCAqY3R4LAorCQkJICB1aW50MzJfdCAqcmVzZXRfY291bnQsCisJCQkgIHVpbnQzMl90ICphY3RpdmUsCisJCQkgIHVpbnQzMl90ICpwZW5kaW5nKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtOworCXN0cnVjdCBkcm1faTkxNV9yZXNldF9zdGF0cyBzdGF0czsKKwlpbnQgcmV0OworCisJaWYgKGN0eCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbWNsZWFyKHN0YXRzKTsKKworCWJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKiljdHgtPmJ1Zm1ncjsKKwlzdGF0cy5jdHhfaWQgPSBjdHgtPmN0eF9pZDsKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKKwkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFVF9SRVNFVF9TVEFUUywKKwkJICAgICAgICZzdGF0cyk7CisJaWYgKHJldCA9PSAwKSB7CisJCWlmIChyZXNldF9jb3VudCAhPSBOVUxMKQorCQkJKnJlc2V0X2NvdW50ID0gc3RhdHMucmVzZXRfY291bnQ7CisKKwkJaWYgKGFjdGl2ZSAhPSBOVUxMKQorCQkJKmFjdGl2ZSA9IHN0YXRzLmJhdGNoX2FjdGl2ZTsKKworCQlpZiAocGVuZGluZyAhPSBOVUxMKQorCQkJKnBlbmRpbmcgPSBzdGF0cy5iYXRjaF9wZW5kaW5nOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludAorZHJtX2ludGVsX3JlZ19yZWFkKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKKwkJICAgdWludDMyX3Qgb2Zmc2V0LAorCQkgICB1aW50NjRfdCAqcmVzdWx0KQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopYnVmbWdyOworCXN0cnVjdCBkcm1faTkxNV9yZWdfcmVhZCByZWdfcmVhZDsKKwlpbnQgcmV0OworCisJbWVtY2xlYXIocmVnX3JlYWQpOworCXJlZ19yZWFkLm9mZnNldCA9IG9mZnNldDsKKworCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfSTkxNV9SRUdfUkVBRCwgJnJlZ19yZWFkKTsKKworCSpyZXN1bHQgPSByZWdfcmVhZC52YWw7CisJcmV0dXJuIHJldDsKK30KKworaW50Citkcm1faW50ZWxfZ2V0X3N1YnNsaWNlX3RvdGFsKGludCBmZCwgdW5zaWduZWQgaW50ICpzdWJzbGljZV90b3RhbCkKK3sKKwlkcm1faTkxNV9nZXRwYXJhbV90IGdwOworCWludCByZXQ7CisKKwltZW1jbGVhcihncCk7CisJZ3AudmFsdWUgPSAoaW50KilzdWJzbGljZV90b3RhbDsKKwlncC5wYXJhbSA9IEk5MTVfUEFSQU1fU1VCU0xJQ0VfVE9UQUw7CisJcmV0ID0gZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNLCAmZ3ApOworCWlmIChyZXQpCisJCXJldHVybiAtZXJybm87CisKKwlyZXR1cm4gMDsKK30KKworaW50Citkcm1faW50ZWxfZ2V0X2V1X3RvdGFsKGludCBmZCwgdW5zaWduZWQgaW50ICpldV90b3RhbCkKK3sKKwlkcm1faTkxNV9nZXRwYXJhbV90IGdwOworCWludCByZXQ7CisKKwltZW1jbGVhcihncCk7CisJZ3AudmFsdWUgPSAoaW50KilldV90b3RhbDsKKwlncC5wYXJhbSA9IEk5MTVfUEFSQU1fRVVfVE9UQUw7CisJcmV0ID0gZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNLCAmZ3ApOworCWlmIChyZXQpCisJCXJldHVybiAtZXJybm87CisKKwlyZXR1cm4gMDsKK30KKworaW50Citkcm1faW50ZWxfZ2V0X3Bvb2xlZF9ldShpbnQgZmQpCit7CisJZHJtX2k5MTVfZ2V0cGFyYW1fdCBncDsKKwlpbnQgcmV0ID0gLTE7CisKKwltZW1jbGVhcihncCk7CisJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0hBU19QT09MRURfRVU7CisJZ3AudmFsdWUgPSAmcmV0OworCWlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCkpCisJCXJldHVybiAtZXJybm87CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK2RybV9pbnRlbF9nZXRfbWluX2V1X2luX3Bvb2woaW50IGZkKQoreworCWRybV9pOTE1X2dldHBhcmFtX3QgZ3A7CisJaW50IHJldCA9IC0xOworCisJbWVtY2xlYXIoZ3ApOworCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9NSU5fRVVfSU5fUE9PTDsKKwlncC52YWx1ZSA9ICZyZXQ7CisJaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSwgJmdwKSkKKwkJcmV0dXJuIC1lcnJubzsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogQW5ub3RhdGUgdGhlIGdpdmVuIGJvIGZvciB1c2UgaW4gYXViIGR1bXBpbmcuCisgKgorICogXHBhcmFtIGFubm90YXRpb25zIGlzIGFuIGFycmF5IG9mIGRybV9pbnRlbF9hdWJfYW5ub3RhdGlvbiBvYmplY3RzCisgKiBkZXNjcmliaW5nIHRoZSB0eXBlIG9mIGRhdGEgaW4gdmFyaW91cyBzZWN0aW9ucyBvZiB0aGUgYm8uICBFYWNoCisgKiBlbGVtZW50IG9mIHRoZSBhcnJheSBzcGVjaWZpZXMgdGhlIHR5cGUgYW5kIHN1YnR5cGUgb2YgYSBzZWN0aW9uIG9mCisgKiB0aGUgYm8sIGFuZCB0aGUgcGFzdC10aGUtZW5kIG9mZnNldCBvZiB0aGF0IHNlY3Rpb24uICBUaGUgZWxlbWVudHMKKyAqIG9mIFxjIGFubm90YXRpb25zIG11c3QgYmUgc29ydGVkIHNvIHRoYXQgZW5kaW5nX29mZnNldCBpcworICogaW5jcmVhc2luZy4KKyAqCisgKiBccGFyYW0gY291bnQgaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgXGMgYW5ub3RhdGlvbnMgYXJyYXkuCisgKiBJZiBcYyBjb3VudCBpcyB6ZXJvLCB0aGVuIFxjIGFubm90YXRpb25zIHdpbGwgbm90IGJlIGRlcmVmZXJlbmNlZC4KKyAqCisgKiBBbm5vdGF0aW9ucyBhcmUgY29waWVkIGludG8gYSBwcml2YXRlIGRhdGEgc3RydWN0dXJlLCBzbyBjYWxsZXIgbWF5CisgKiByZS11c2UgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IFxjIGFubm90YXRpb25zIGFmdGVyIHRoZSBjYWxsCisgKiByZXR1cm5zLgorICoKKyAqIEFubm90YXRpb25zIGFyZSBzdG9yZWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgYm87IHRvIHJlc2V0IHRvIHRoZQorICogZGVmYXVsdCBzdGF0ZSAobm8gYW5ub3RhdGlvbnMpLCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBhIFxjIGNvdW50CisgKiBvZiB6ZXJvLgorICovCit2b2lkCitkcm1faW50ZWxfYnVmbWdyX2dlbV9zZXRfYXViX2Fubm90YXRpb25zKGRybV9pbnRlbF9ibyAqYm8sCisJCQkJCSBkcm1faW50ZWxfYXViX2Fubm90YXRpb24gKmFubm90YXRpb25zLAorCQkJCQkgdW5zaWduZWQgY291bnQpCit7Cit9CisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgYnVmbWdyX2xpc3RfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworc3RhdGljIGRybU1NTGlzdEhlYWQgYnVmbWdyX2xpc3QgPSB7ICZidWZtZ3JfbGlzdCwgJmJ1Zm1ncl9saXN0IH07CisKK3N0YXRpYyBkcm1faW50ZWxfYnVmbWdyX2dlbSAqCitkcm1faW50ZWxfYnVmbWdyX2dlbV9maW5kKGludCBmZCkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbTsKKworCURSTUxJU1RGT1JFQUNIRU5UUlkoYnVmbWdyX2dlbSwgJmJ1Zm1ncl9saXN0LCBtYW5hZ2VycykgeworCQlpZiAoYnVmbWdyX2dlbS0+ZmQgPT0gZmQpIHsKKwkJCWF0b21pY19pbmMoJmJ1Zm1ncl9nZW0tPnJlZmNvdW50KTsKKwkJCXJldHVybiBidWZtZ3JfZ2VtOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitkcm1faW50ZWxfYnVmbWdyX2dlbV91bnJlZihkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IpCit7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKilidWZtZ3I7CisKKwlpZiAoYXRvbWljX2FkZF91bmxlc3MoJmJ1Zm1ncl9nZW0tPnJlZmNvdW50LCAtMSwgMSkpIHsKKwkJcHRocmVhZF9tdXRleF9sb2NrKCZidWZtZ3JfbGlzdF9tdXRleCk7CisKKwkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJ1Zm1ncl9nZW0tPnJlZmNvdW50KSkgeworCQkJRFJNTElTVERFTCgmYnVmbWdyX2dlbS0+bWFuYWdlcnMpOworCQkJZHJtX2ludGVsX2J1Zm1ncl9nZW1fZGVzdHJveShidWZtZ3IpOworCQl9CisKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9saXN0X211dGV4KTsKKwl9Cit9CisKK3ZvaWQgKmRybV9pbnRlbF9nZW1fYm9fbWFwX19ndHQoZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCisJaWYgKGJvX2dlbS0+Z3R0X3ZpcnR1YWwpCisJCXJldHVybiBib19nZW0tPmd0dF92aXJ0dWFsOworCisJaWYgKGJvX2dlbS0+aXNfdXNlcnB0cikKKwkJcmV0dXJuIE5VTEw7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCWlmIChib19nZW0tPmd0dF92aXJ0dWFsID09IE5VTEwpIHsKKwkJc3RydWN0IGRybV9pOTE1X2dlbV9tbWFwX2d0dCBtbWFwX2FyZzsKKwkJdm9pZCAqcHRyOworCisJCURCRygiYm9fbWFwX2d0dDogbW1hcCAlZCAoJXMpLCBtYXBfY291bnQ9JWRcbiIsCisJCSAgICBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwgYm9fZ2VtLT5tYXBfY291bnQpOworCisJCWlmIChib19nZW0tPm1hcF9jb3VudCsrID09IDApCisJCQlkcm1faW50ZWxfZ2VtX2JvX29wZW5fdm1hKGJ1Zm1ncl9nZW0sIGJvX2dlbSk7CisKKwkJbWVtY2xlYXIobW1hcF9hcmcpOworCQltbWFwX2FyZy5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CisKKwkJLyogR2V0IHRoZSBmYWtlIG9mZnNldCBiYWNrLi4uICovCisJCXB0ciA9IE1BUF9GQUlMRUQ7CisJCWlmIChkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKKwkJCSAgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX01NQVBfR1RULAorCQkJICAgICAmbW1hcF9hcmcpID09IDApIHsKKwkJCS8qIGFuZCBtbWFwIGl0ICovCisJCQlwdHIgPSBkcm1fbW1hcCgwLCBiby0+c2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkJCQkgICAgICAgTUFQX1NIQVJFRCwgYnVmbWdyX2dlbS0+ZmQsCisJCQkJICAgICAgIG1tYXBfYXJnLm9mZnNldCk7CisJCX0KKwkJaWYgKHB0ciA9PSBNQVBfRkFJTEVEKSB7CisJCQlpZiAoLS1ib19nZW0tPm1hcF9jb3VudCA9PSAwKQorCQkJCWRybV9pbnRlbF9nZW1fYm9fY2xvc2Vfdm1hKGJ1Zm1ncl9nZW0sIGJvX2dlbSk7CisJCQlwdHIgPSBOVUxMOworCQl9CisKKwkJYm9fZ2VtLT5ndHRfdmlydHVhbCA9IHB0cjsKKwl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJcmV0dXJuIGJvX2dlbS0+Z3R0X3ZpcnR1YWw7Cit9CisKK3ZvaWQgKmRybV9pbnRlbF9nZW1fYm9fbWFwX19jcHUoZHJtX2ludGVsX2JvICpibykKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOworCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOworCisJaWYgKGJvX2dlbS0+bWVtX3ZpcnR1YWwpCisJCXJldHVybiBib19nZW0tPm1lbV92aXJ0dWFsOworCisJaWYgKGJvX2dlbS0+aXNfdXNlcnB0cikgeworCQkvKiBSZXR1cm4gdGhlIHNhbWUgdXNlciBwdHIgKi8KKwkJcmV0dXJuIGJvX2dlbS0+dXNlcl92aXJ0dWFsOworCX0KKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CisJaWYgKCFib19nZW0tPm1lbV92aXJ0dWFsKSB7CisJCXN0cnVjdCBkcm1faTkxNV9nZW1fbW1hcCBtbWFwX2FyZzsKKworCQlpZiAoYm9fZ2VtLT5tYXBfY291bnQrKyA9PSAwKQorCQkJZHJtX2ludGVsX2dlbV9ib19vcGVuX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOworCisJCURCRygiYm9fbWFwOiAlZCAoJXMpLCBtYXBfY291bnQ9JWRcbiIsCisJCSAgICBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwgYm9fZ2VtLT5tYXBfY291bnQpOworCisJCW1lbWNsZWFyKG1tYXBfYXJnKTsKKwkJbW1hcF9hcmcuaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOworCQltbWFwX2FyZy5zaXplID0gYm8tPnNpemU7CisJCWlmIChkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKKwkJCSAgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX01NQVAsCisJCQkgICAgICZtbWFwX2FyZykpIHsKKwkJCURCRygiJXM6JWQ6IEVycm9yIG1hcHBpbmcgYnVmZmVyICVkICglcyk6ICVzIC5cbiIsCisJCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBib19nZW0tPmdlbV9oYW5kbGUsCisJCQkgICAgYm9fZ2VtLT5uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQkJaWYgKC0tYm9fZ2VtLT5tYXBfY291bnQgPT0gMCkKKwkJCQlkcm1faW50ZWxfZ2VtX2JvX2Nsb3NlX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOworCQl9IGVsc2UgeworCQkJVkcoVkFMR1JJTkRfTUFMTE9DTElLRV9CTE9DSyhtbWFwX2FyZy5hZGRyX3B0ciwgbW1hcF9hcmcuc2l6ZSwgMCwgMSkpOworCQkJYm9fZ2VtLT5tZW1fdmlydHVhbCA9ICh2b2lkICopKHVpbnRwdHJfdCkgbW1hcF9hcmcuYWRkcl9wdHI7CisJCX0KKwl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJcmV0dXJuIGJvX2dlbS0+bWVtX3ZpcnR1YWw7Cit9CisKK3ZvaWQgKmRybV9pbnRlbF9nZW1fYm9fbWFwX193Yyhkcm1faW50ZWxfYm8gKmJvKQoreworCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7CisJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CisKKwlpZiAoYm9fZ2VtLT53Y192aXJ0dWFsKQorCQlyZXR1cm4gYm9fZ2VtLT53Y192aXJ0dWFsOworCisJaWYgKGJvX2dlbS0+aXNfdXNlcnB0cikKKwkJcmV0dXJuIE5VTEw7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCWlmICghYm9fZ2VtLT53Y192aXJ0dWFsKSB7CisJCXN0cnVjdCBkcm1faTkxNV9nZW1fbW1hcCBtbWFwX2FyZzsKKworCQlpZiAoYm9fZ2VtLT5tYXBfY291bnQrKyA9PSAwKQorCQkJZHJtX2ludGVsX2dlbV9ib19vcGVuX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOworCisJCURCRygiYm9fbWFwOiAlZCAoJXMpLCBtYXBfY291bnQ9JWRcbiIsCisJCSAgICBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwgYm9fZ2VtLT5tYXBfY291bnQpOworCisJCW1lbWNsZWFyKG1tYXBfYXJnKTsKKwkJbW1hcF9hcmcuaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOworCQltbWFwX2FyZy5zaXplID0gYm8tPnNpemU7CisJCW1tYXBfYXJnLmZsYWdzID0gSTkxNV9NTUFQX1dDOworCQlpZiAoZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCisJCQkgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9NTUFQLAorCQkJICAgICAmbW1hcF9hcmcpKSB7CisJCQlEQkcoIiVzOiVkOiBFcnJvciBtYXBwaW5nIGJ1ZmZlciAlZCAoJXMpOiAlcyAuXG4iLAorCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgYm9fZ2VtLT5nZW1faGFuZGxlLAorCQkJICAgIGJvX2dlbS0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWlmICgtLWJvX2dlbS0+bWFwX2NvdW50ID09IDApCisJCQkJZHJtX2ludGVsX2dlbV9ib19jbG9zZV92bWEoYnVmbWdyX2dlbSwgYm9fZ2VtKTsKKwkJfSBlbHNlIHsKKwkJCVZHKFZBTEdSSU5EX01BTExPQ0xJS0VfQkxPQ0sobW1hcF9hcmcuYWRkcl9wdHIsIG1tYXBfYXJnLnNpemUsIDAsIDEpKTsKKwkJCWJvX2dlbS0+d2NfdmlydHVhbCA9ICh2b2lkICopKHVpbnRwdHJfdCkgbW1hcF9hcmcuYWRkcl9wdHI7CisJCX0KKwl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOworCisJcmV0dXJuIGJvX2dlbS0+d2NfdmlydHVhbDsKK30KKworLyoqCisgKiBJbml0aWFsaXplcyB0aGUgR0VNIGJ1ZmZlciBtYW5hZ2VyLCB3aGljaCB1c2VzIHRoZSBrZXJuZWwgdG8gYWxsb2NhdGUsIG1hcCwKKyAqIGFuZCBtYW5hZ2UgbWFwIGJ1ZmZlciBvYmplY3Rpb25zLgorICoKKyAqIFxwYXJhbSBmZCBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIG9wZW5lZCBEUk0gZGV2aWNlLgorICovCitkcm1faW50ZWxfYnVmbWdyICoKK2RybV9pbnRlbF9idWZtZ3JfZ2VtX2luaXQoaW50IGZkLCBpbnQgYmF0Y2hfc2l6ZSkKK3sKKwlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2dldF9hcGVydHVyZSBhcGVydHVyZTsKKwlkcm1faTkxNV9nZXRwYXJhbV90IGdwOworCWludCByZXQsIHRtcDsKKwlib29sIGV4ZWMyID0gZmFsc2U7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9saXN0X211dGV4KTsKKworCWJ1Zm1ncl9nZW0gPSBkcm1faW50ZWxfYnVmbWdyX2dlbV9maW5kKGZkKTsKKwlpZiAoYnVmbWdyX2dlbSkKKwkJZ290byBleGl0OworCisJYnVmbWdyX2dlbSA9IGNhbGxvYygxLCBzaXplb2YoKmJ1Zm1ncl9nZW0pKTsKKwlpZiAoYnVmbWdyX2dlbSA9PSBOVUxMKQorCQlnb3RvIGV4aXQ7CisKKwlidWZtZ3JfZ2VtLT5mZCA9IGZkOworCWF0b21pY19zZXQoJmJ1Zm1ncl9nZW0tPnJlZmNvdW50LCAxKTsKKworCWlmIChwdGhyZWFkX211dGV4X2luaXQoJmJ1Zm1ncl9nZW0tPmxvY2ssIE5VTEwpICE9IDApIHsKKwkJZnJlZShidWZtZ3JfZ2VtKTsKKwkJYnVmbWdyX2dlbSA9IE5VTEw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwltZW1jbGVhcihhcGVydHVyZSk7CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCisJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fR0VUX0FQRVJUVVJFLAorCQkgICAgICAgJmFwZXJ0dXJlKTsKKworCWlmIChyZXQgPT0gMCkKKwkJYnVmbWdyX2dlbS0+Z3R0X3NpemUgPSBhcGVydHVyZS5hcGVyX2F2YWlsYWJsZV9zaXplOworCWVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIkRSTV9JT0NUTF9JOTE1X0dFTV9BUEVSVFVSRSBmYWlsZWQ6ICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJYnVmbWdyX2dlbS0+Z3R0X3NpemUgPSAxMjggKiAxMDI0ICogMTAyNDsKKwkJZnByaW50ZihzdGRlcnIsICJBc3N1bWluZyAlZGtCIGF2YWlsYWJsZSBhcGVydHVyZSBzaXplLlxuIgorCQkJIk1heSBsZWFkIHRvIHJlZHVjZWQgcGVyZm9ybWFuY2Ugb3IgaW5jb3JyZWN0ICIKKwkJCSJyZW5kZXJpbmcuXG4iLAorCQkJKGludClidWZtZ3JfZ2VtLT5ndHRfc2l6ZSAvIDEwMjQpOworCX0KKworCWJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UgPSBnZXRfcGNpX2RldmljZV9pZChidWZtZ3JfZ2VtKTsKKworCWlmIChJU19HRU4yKGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpKQorCQlidWZtZ3JfZ2VtLT5nZW4gPSAyOworCWVsc2UgaWYgKElTX0dFTjMoYnVmbWdyX2dlbS0+cGNpX2RldmljZSkpCisJCWJ1Zm1ncl9nZW0tPmdlbiA9IDM7CisJZWxzZSBpZiAoSVNfR0VONChidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlKSkKKwkJYnVmbWdyX2dlbS0+Z2VuID0gNDsKKwllbHNlIGlmIChJU19HRU41KGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpKQorCQlidWZtZ3JfZ2VtLT5nZW4gPSA1OworCWVsc2UgaWYgKElTX0dFTjYoYnVmbWdyX2dlbS0+cGNpX2RldmljZSkpCisJCWJ1Zm1ncl9nZW0tPmdlbiA9IDY7CisJZWxzZSBpZiAoSVNfR0VONyhidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlKSkKKwkJYnVmbWdyX2dlbS0+Z2VuID0gNzsKKwllbHNlIGlmIChJU19HRU44KGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpKQorCQlidWZtZ3JfZ2VtLT5nZW4gPSA4OworCWVsc2UgaWYgKElTX0dFTjkoYnVmbWdyX2dlbS0+cGNpX2RldmljZSkpCisJCWJ1Zm1ncl9nZW0tPmdlbiA9IDk7CisJZWxzZSBpZiAoSVNfR0VOMTAoYnVmbWdyX2dlbS0+cGNpX2RldmljZSkpCisJCWJ1Zm1ncl9nZW0tPmdlbiA9IDEwOworCWVsc2UgeworCQlmcmVlKGJ1Zm1ncl9nZW0pOworCQlidWZtZ3JfZ2VtID0gTlVMTDsKKwkJZ290byBleGl0OworCX0KKworCWlmIChJU19HRU4zKGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpICYmCisJICAgIGJ1Zm1ncl9nZW0tPmd0dF9zaXplID4gMjU2KjEwMjQqMTAyNCkgeworCQkvKiBUaGUgdW5tYXBwYWJsZSBwYXJ0IG9mIGd0dCBvbiBnZW4gMyAoaS5lLiBhYm92ZSAyNTZNQikgY2FuJ3QKKwkJICogYmUgdXNlZCBmb3IgdGlsZWQgYmxpdHMuIFRvIHNpbXBsaWZ5IHRoZSBhY2NvdW50aW5nLCBqdXN0CisJCSAqIHN1YnRyYWN0IHRoZSB1bm1hcHBhYmxlIHBhcnQgKGZpeGVkIHRvIDI1Nk1CIG9uIGFsbCBrbm93bgorCQkgKiBnZW4zIGRldmljZXMpIGlmIHRoZSBrZXJuZWwgYWR2ZXJ0aXNlcyBpdC4gKi8KKwkJYnVmbWdyX2dlbS0+Z3R0X3NpemUgLT0gMjU2KjEwMjQqMTAyNDsKKwl9CisKKwltZW1jbGVhcihncCk7CisJZ3AudmFsdWUgPSAmdG1wOworCisJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0hBU19FWEVDQlVGMjsKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CisJaWYgKCFyZXQpCisJCWV4ZWMyID0gdHJ1ZTsKKworCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9IQVNfQlNEOworCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSwgJmdwKTsKKwlidWZtZ3JfZ2VtLT5oYXNfYnNkID0gcmV0ID09IDA7CisKKwlncC5wYXJhbSA9IEk5MTVfUEFSQU1fSEFTX0JMVDsKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CisJYnVmbWdyX2dlbS0+aGFzX2JsdCA9IHJldCA9PSAwOworCisJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0hBU19SRUxBWEVEX0ZFTkNJTkc7CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNLCAmZ3ApOworCWJ1Zm1ncl9nZW0tPmhhc19yZWxheGVkX2ZlbmNpbmcgPSByZXQgPT0gMDsKKworCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9IQVNfRVhFQ19BU1lOQzsKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CisJYnVmbWdyX2dlbS0+aGFzX2V4ZWNfYXN5bmMgPSByZXQgPT0gMDsKKworCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19hbGxvY191c2VycHRyID0gY2hlY2tfYm9fYWxsb2NfdXNlcnB0cjsKKworCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9IQVNfV0FJVF9USU1FT1VUOworCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSwgJmdwKTsKKwlidWZtZ3JfZ2VtLT5oYXNfd2FpdF90aW1lb3V0ID0gcmV0ID09IDA7CisKKwlncC5wYXJhbSA9IEk5MTVfUEFSQU1fSEFTX0xMQzsKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CisJaWYgKHJldCAhPSAwKSB7CisJCS8qIEtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0cyBIQVNfTExDIHF1ZXJ5LCBmYWxsYmFjayB0byBHUFUKKwkJICogZ2VuZXJhdGlvbiBkZXRlY3Rpb24gYW5kIGFzc3VtZSB0aGF0IHdlIGhhdmUgTExDIG9uIEdFTjYvNworCQkgKi8KKwkJYnVmbWdyX2dlbS0+aGFzX2xsYyA9IChJU19HRU42KGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpIHwKKwkJCQlJU19HRU43KGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpKTsKKwl9IGVsc2UKKwkJYnVmbWdyX2dlbS0+aGFzX2xsYyA9ICpncC52YWx1ZTsKKworCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9IQVNfVkVCT1g7CisJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNLCAmZ3ApOworCWJ1Zm1ncl9nZW0tPmhhc192ZWJveCA9IChyZXQgPT0gMCkgJiAoKmdwLnZhbHVlID4gMCk7CisKKwlncC5wYXJhbSA9IEk5MTVfUEFSQU1fSEFTX0VYRUNfU09GVFBJTjsKKwlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CisJaWYgKHJldCA9PSAwICYmICpncC52YWx1ZSA+IDApCisJCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19zZXRfc29mdHBpbl9vZmZzZXQgPSBkcm1faW50ZWxfZ2VtX2JvX3NldF9zb2Z0cGluX29mZnNldDsKKworCWlmIChidWZtZ3JfZ2VtLT5nZW4gPCA0KSB7CisJCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9OVU1fRkVOQ0VTX0FWQUlMOworCQlncC52YWx1ZSA9ICZidWZtZ3JfZ2VtLT5hdmFpbGFibGVfZmVuY2VzOworCQlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CisJCWlmIChyZXQpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiZ2V0IGZlbmNlcyBmYWlsZWQ6ICVkIFslZF1cbiIsIHJldCwKKwkJCQllcnJubyk7CisJCQlmcHJpbnRmKHN0ZGVyciwgInBhcmFtOiAlZCwgdmFsOiAlZFxuIiwgZ3AucGFyYW0sCisJCQkJKmdwLnZhbHVlKTsKKwkJCWJ1Zm1ncl9nZW0tPmF2YWlsYWJsZV9mZW5jZXMgPSAwOworCQl9IGVsc2UgeworCQkJLyogWFhYIFRoZSBrZXJuZWwgcmVwb3J0cyB0aGUgdG90YWwgbnVtYmVyIG9mIGZlbmNlcywKKwkJCSAqIGluY2x1ZGluZyBhbnkgdGhhdCBtYXkgYmUgcGlubmVkLgorCQkJICoKKwkJCSAqIFdlIHByZXN1bWUgdGhhdCB0aGVyZSB3aWxsIGJlIGF0IGxlYXN0IG9uZSBwaW5uZWQKKwkJCSAqIGZlbmNlIGZvciB0aGUgc2Nhbm91dCBidWZmZXIsIGJ1dCB0aGVyZSBtYXkgYmUgbW9yZQorCQkJICogdGhhbiBvbmUgc2Nhbm91dCBhbmQgdGhlIHVzZXIgbWF5IGJlIG1hbnVhbGx5CisJCQkgKiBwaW5uaW5nIGJ1ZmZlcnMuIExldCdzIG1vdmUgdG8gZXhlY2J1ZmZlcjIgYW5kCisJCQkgKiB0aGVyZWJ5IGZvcmdldCB0aGUgaW5zYW5pdHkgb2YgdXNpbmcgZmVuY2VzLi4uCisJCQkgKi8KKwkJCWJ1Zm1ncl9nZW0tPmF2YWlsYWJsZV9mZW5jZXMgLT0gMjsKKwkJCWlmIChidWZtZ3JfZ2VtLT5hdmFpbGFibGVfZmVuY2VzIDwgMCkKKwkJCQlidWZtZ3JfZ2VtLT5hdmFpbGFibGVfZmVuY2VzID0gMDsKKwkJfQorCX0KKworCWlmIChidWZtZ3JfZ2VtLT5nZW4gPj0gOCkgeworCQlncC5wYXJhbSA9IEk5MTVfUEFSQU1fSEFTX0FMSUFTSU5HX1BQR1RUOworCQlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CisJCWlmIChyZXQgPT0gMCAmJiAqZ3AudmFsdWUgPT0gMykKKwkJCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib191c2VfNDhiX2FkZHJlc3NfcmFuZ2UgPSBkcm1faW50ZWxfZ2VtX2JvX3VzZV80OGJfYWRkcmVzc19yYW5nZTsKKwl9CisKKwkvKiBMZXQncyBnbyB3aXRoIG9uZSByZWxvY2F0aW9uIHBlciBldmVyeSAyIGR3b3JkcyAoYnV0IHJvdW5kIGRvd24gYSBiaXQKKwkgKiBzaW5jZSBhIHBvd2VyIG9mIHR3byB3aWxsIG1lYW4gYW4gZXh0cmEgcGFnZSBhbGxvY2F0aW9uIGZvciB0aGUgcmVsb2MKKwkgKiBidWZmZXIpLgorCSAqCisJICogRXZlcnkgNCB3YXMgdG9vIGZldyBmb3IgdGhlIGJsZW5kZXIgYmVuY2htYXJrLgorCSAqLworCWJ1Zm1ncl9nZW0tPm1heF9yZWxvY3MgPSBiYXRjaF9zaXplIC8gc2l6ZW9mKHVpbnQzMl90KSAvIDIgLSAyOworCisJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2FsbG9jID0gZHJtX2ludGVsX2dlbV9ib19hbGxvYzsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fYWxsb2NfZm9yX3JlbmRlciA9CisJICAgIGRybV9pbnRlbF9nZW1fYm9fYWxsb2NfZm9yX3JlbmRlcjsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fYWxsb2NfdGlsZWQgPSBkcm1faW50ZWxfZ2VtX2JvX2FsbG9jX3RpbGVkOworCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19yZWZlcmVuY2UgPSBkcm1faW50ZWxfZ2VtX2JvX3JlZmVyZW5jZTsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fdW5yZWZlcmVuY2UgPSBkcm1faW50ZWxfZ2VtX2JvX3VucmVmZXJlbmNlOworCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19tYXAgPSBkcm1faW50ZWxfZ2VtX2JvX21hcDsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fdW5tYXAgPSBkcm1faW50ZWxfZ2VtX2JvX3VubWFwOworCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19zdWJkYXRhID0gZHJtX2ludGVsX2dlbV9ib19zdWJkYXRhOworCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19nZXRfc3ViZGF0YSA9IGRybV9pbnRlbF9nZW1fYm9fZ2V0X3N1YmRhdGE7CisJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX3dhaXRfcmVuZGVyaW5nID0gZHJtX2ludGVsX2dlbV9ib193YWl0X3JlbmRlcmluZzsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fZW1pdF9yZWxvYyA9IGRybV9pbnRlbF9nZW1fYm9fZW1pdF9yZWxvYzsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fZW1pdF9yZWxvY19mZW5jZSA9IGRybV9pbnRlbF9nZW1fYm9fZW1pdF9yZWxvY19mZW5jZTsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fcGluID0gZHJtX2ludGVsX2dlbV9ib19waW47CisJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX3VucGluID0gZHJtX2ludGVsX2dlbV9ib191bnBpbjsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fZ2V0X3RpbGluZyA9IGRybV9pbnRlbF9nZW1fYm9fZ2V0X3RpbGluZzsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fc2V0X3RpbGluZyA9IGRybV9pbnRlbF9nZW1fYm9fc2V0X3RpbGluZzsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fZmxpbmsgPSBkcm1faW50ZWxfZ2VtX2JvX2ZsaW5rOworCS8qIFVzZSB0aGUgbmV3IG9uZSBpZiBhdmFpbGFibGUgKi8KKwlpZiAoZXhlYzIpIHsKKwkJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2V4ZWMgPSBkcm1faW50ZWxfZ2VtX2JvX2V4ZWMyOworCQlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fbXJiX2V4ZWMgPSBkcm1faW50ZWxfZ2VtX2JvX21yYl9leGVjMjsKKwl9IGVsc2UKKwkJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2V4ZWMgPSBkcm1faW50ZWxfZ2VtX2JvX2V4ZWM7CisJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2J1c3kgPSBkcm1faW50ZWxfZ2VtX2JvX2J1c3k7CisJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX21hZHZpc2UgPSBkcm1faW50ZWxfZ2VtX2JvX21hZHZpc2U7CisJYnVmbWdyX2dlbS0+YnVmbWdyLmRlc3Ryb3kgPSBkcm1faW50ZWxfYnVmbWdyX2dlbV91bnJlZjsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuZGVidWcgPSAwOworCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5jaGVja19hcGVydHVyZV9zcGFjZSA9CisJICAgIGRybV9pbnRlbF9nZW1fY2hlY2tfYXBlcnR1cmVfc3BhY2U7CisJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2Rpc2FibGVfcmV1c2UgPSBkcm1faW50ZWxfZ2VtX2JvX2Rpc2FibGVfcmV1c2U7CisJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2lzX3JldXNhYmxlID0gZHJtX2ludGVsX2dlbV9ib19pc19yZXVzYWJsZTsKKwlidWZtZ3JfZ2VtLT5idWZtZ3IuZ2V0X3BpcGVfZnJvbV9jcnRjX2lkID0KKwkgICAgZHJtX2ludGVsX2dlbV9nZXRfcGlwZV9mcm9tX2NydGNfaWQ7CisJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX3JlZmVyZW5jZXMgPSBkcm1faW50ZWxfZ2VtX2JvX3JlZmVyZW5jZXM7CisKKwlpbml0X2NhY2hlX2J1Y2tldHMoYnVmbWdyX2dlbSk7CisKKwlEUk1JTklUTElTVEhFQUQoJmJ1Zm1ncl9nZW0tPnZtYV9jYWNoZSk7CisJYnVmbWdyX2dlbS0+dm1hX21heCA9IC0xOyAvKiB1bmxpbWl0ZWQgYnkgZGVmYXVsdCAqLworCisJRFJNTElTVEFERCgmYnVmbWdyX2dlbS0+bWFuYWdlcnMsICZidWZtZ3JfbGlzdCk7CisKK2V4aXQ6CisJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9saXN0X211dGV4KTsKKworCXJldHVybiBidWZtZ3JfZ2VtICE9IE5VTEwgPyAmYnVmbWdyX2dlbS0+YnVmbWdyIDogTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ludGVsL2ludGVsX2J1Zm1ncl9wcml2LmggYi9pbnRlbC9pbnRlbF9idWZtZ3JfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMzYwYTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlbC9pbnRlbF9idWZtZ3JfcHJpdi5oCkBAIC0wLDAgKzEsMzI1IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDggSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKgorICovCisKKy8qKgorICogQGZpbGUgaW50ZWxfYnVmbWdyX3ByaXYuaAorICoKKyAqIFByaXZhdGUgZGVmaW5pdGlvbnMgb2YgSW50ZWwtc3BlY2lmaWMgYnVmbWdyIGZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlcy4KKyAqLworCisjaWZuZGVmIElOVEVMX0JVRk1HUl9QUklWX0gKKyNkZWZpbmUgSU5URUxfQlVGTUdSX1BSSVZfSAorCisvKioKKyAqIENvbnRleHQgZm9yIGEgYnVmZmVyIG1hbmFnZXIgaW5zdGFuY2UuCisgKgorICogQ29udGFpbnMgcHVibGljIG1ldGhvZHMgZm9sbG93ZWQgYnkgcHJpdmF0ZSBzdG9yYWdlIGZvciB0aGUgYnVmZmVyIG1hbmFnZXIuCisgKi8KK3N0cnVjdCBfZHJtX2ludGVsX2J1Zm1nciB7CisJLyoqCisJICogQWxsb2NhdGUgYSBidWZmZXIgb2JqZWN0LgorCSAqCisJICogQnVmZmVyIG9iamVjdHMgYXJlIG5vdCBuZWNlc3NhcmlseSBpbml0aWFsbHkgbWFwcGVkIGludG8gQ1BVIHZpcnR1YWwKKwkgKiBhZGRyZXNzIHNwYWNlIG9yIGdyYXBoaWNzIGRldmljZSBhcGVydHVyZS4gIFRoZXkgbXVzdCBiZSBtYXBwZWQKKwkgKiB1c2luZyBib19tYXAoKSBvciBkcm1faW50ZWxfZ2VtX2JvX21hcF9ndHQoKSB0byBiZSB1c2VkIGJ5IHRoZSBDUFUuCisJICovCisJZHJtX2ludGVsX2JvICooKmJvX2FsbG9jKSAoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgaW50IGFsaWdubWVudCk7CisKKwkvKioKKwkgKiBBbGxvY2F0ZSBhIGJ1ZmZlciBvYmplY3QsIGhpbnRpbmcgdGhhdCBpdCB3aWxsIGJlIHVzZWQgYXMgYQorCSAqIHJlbmRlciB0YXJnZXQuCisJICoKKwkgKiBUaGlzIGlzIG90aGVyd2lzZSB0aGUgc2FtZSBhcyBib19hbGxvYy4KKwkgKi8KKwlkcm1faW50ZWxfYm8gKigqYm9fYWxsb2NfZm9yX3JlbmRlcikgKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKKwkJCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50KTsKKworCS8qKgorCSAqIEFsbG9jYXRlIGEgYnVmZmVyIG9iamVjdCBmcm9tIGFuIGV4aXN0aW5nIHVzZXIgYWNjZXNzaWJsZQorCSAqIGFkZHJlc3MgbWFsbG9jJ2Qgd2l0aCB0aGUgcHJvdmlkZWQgc2l6ZS4KKwkgKiBBbGlnbm1lbnQgaXMgdXNlZCB3aGVuIG1hcHBpbmcgdG8gdGhlIGd0dC4KKwkgKiBGbGFncyBtYXkgYmUgSTkxNV9WTUFQX1JFQURfT05MWSBvciBJOTE1X1VTRVJQVFJfVU5TWU5DSFJPTklaRUQKKwkgKi8KKwlkcm1faW50ZWxfYm8gKigqYm9fYWxsb2NfdXNlcnB0cikoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAorCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmFkZHIsCisJCQkJCSAgdWludDMyX3QgdGlsaW5nX21vZGUsIHVpbnQzMl90IHN0cmlkZSwKKwkJCQkJICB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJCSAgdW5zaWduZWQgbG9uZyBmbGFncyk7CisKKwkvKioKKwkgKiBBbGxvY2F0ZSBhIHRpbGVkIGJ1ZmZlciBvYmplY3QuCisJICoKKwkgKiBBbGlnbm1lbnQgZm9yIHRpbGVkIG9iamVjdHMgaXMgc2V0IGF1dG9tYXRpY2FsbHk7IHRoZSAnZmxhZ3MnCisJICogYXJndW1lbnQgcHJvdmlkZXMgYSBoaW50IGFib3V0IGhvdyB0aGUgb2JqZWN0IHdpbGwgYmUgdXNlZCBpbml0aWFsbHkuCisJICoKKwkgKiBWYWxpZCB0aWxpbmcgZm9ybWF0cyBhcmU6CisJICogIEk5MTVfVElMSU5HX05PTkUKKwkgKiAgSTkxNV9USUxJTkdfWAorCSAqICBJOTE1X1RJTElOR19ZCisJICoKKwkgKiBOb3RlIHRoZSB0aWxpbmcgZm9ybWF0IG1heSBiZSByZWplY3RlZDsgY2FsbGVycyBzaG91bGQgY2hlY2sgdGhlCisJICogJ3RpbGluZ19tb2RlJyBmaWVsZCBvbiByZXR1cm4sIGFzIHdlbGwgYXMgdGhlIHBpdGNoIHZhbHVlLCB3aGljaAorCSAqIG1heSBoYXZlIGJlZW4gcm91bmRlZCB1cCB0byBhY2NvbW1vZGF0ZSBmb3IgdGlsaW5nIHJlc3RyaWN0aW9ucy4KKwkgKi8KKwlkcm1faW50ZWxfYm8gKigqYm9fYWxsb2NfdGlsZWQpIChkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCQkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgaW50IHgsIGludCB5LCBpbnQgY3BwLAorCQkJCQkgdWludDMyX3QgKnRpbGluZ19tb2RlLAorCQkJCQkgdW5zaWduZWQgbG9uZyAqcGl0Y2gsCisJCQkJCSB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKworCS8qKiBUYWtlcyBhIHJlZmVyZW5jZSBvbiBhIGJ1ZmZlciBvYmplY3QgKi8KKwl2b2lkICgqYm9fcmVmZXJlbmNlKSAoZHJtX2ludGVsX2JvICpibyk7CisKKwkvKioKKwkgKiBSZWxlYXNlcyBhIHJlZmVyZW5jZSBvbiBhIGJ1ZmZlciBvYmplY3QsIGZyZWVpbmcgdGhlIGRhdGEgaWYKKwkgKiBubyByZWZlcmVuY2VzIHJlbWFpbi4KKwkgKi8KKwl2b2lkICgqYm9fdW5yZWZlcmVuY2UpIChkcm1faW50ZWxfYm8gKmJvKTsKKworCS8qKgorCSAqIE1hcHMgdGhlIGJ1ZmZlciBpbnRvIHVzZXJzcGFjZS4KKwkgKgorCSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBibG9jayB3YWl0aW5nIGZvciBhbnkgZXhpc3RpbmcgZXhlY3V0aW9uIG9uIHRoZQorCSAqIGJ1ZmZlciB0byBjb21wbGV0ZSwgZmlyc3QuICBUaGUgcmVzdWx0aW5nIG1hcHBpbmcgaXMgYXZhaWxhYmxlIGF0CisJICogYnVmLT52aXJ0dWFsLgorCSAqLworCWludCAoKmJvX21hcCkgKGRybV9pbnRlbF9ibyAqYm8sIGludCB3cml0ZV9lbmFibGUpOworCisJLyoqCisJICogUmVkdWNlcyB0aGUgcmVmY291bnQgb24gdGhlIHVzZXJzcGFjZSBtYXBwaW5nIG9mIHRoZSBidWZmZXIKKwkgKiBvYmplY3QuCisJICovCisJaW50ICgqYm9fdW5tYXApIChkcm1faW50ZWxfYm8gKmJvKTsKKworCS8qKgorCSAqIFdyaXRlIGRhdGEgaW50byBhbiBvYmplY3QuCisJICoKKwkgKiBUaGlzIGlzIGFuIG9wdGlvbmFsIGZ1bmN0aW9uLCBpZiBtaXNzaW5nLAorCSAqIGRybV9pbnRlbF9ibyB3aWxsIG1hcC9tZW1jcHkvdW5tYXAuCisJICovCisJaW50ICgqYm9fc3ViZGF0YSkgKGRybV9pbnRlbF9ibyAqYm8sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJICAgdW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCB2b2lkICpkYXRhKTsKKworCS8qKgorCSAqIFJlYWQgZGF0YSBmcm9tIGFuIG9iamVjdAorCSAqCisJICogVGhpcyBpcyBhbiBvcHRpb25hbCBmdW5jdGlvbiwgaWYgbWlzc2luZywKKwkgKiBkcm1faW50ZWxfYm8gd2lsbCBtYXAvbWVtY3B5L3VubWFwLgorCSAqLworCWludCAoKmJvX2dldF9zdWJkYXRhKSAoZHJtX2ludGVsX2JvICpibywgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB2b2lkICpkYXRhKTsKKworCS8qKgorCSAqIFdhaXRzIGZvciByZW5kZXJpbmcgdG8gYW4gb2JqZWN0IGJ5IHRoZSBHUFUgdG8gaGF2ZSBjb21wbGV0ZWQuCisJICoKKwkgKiBUaGlzIGlzIG5vdCByZXF1aXJlZCBmb3IgYW55IGFjY2VzcyB0byB0aGUgQk8gYnkgYm9fbWFwLAorCSAqIGJvX3N1YmRhdGEsIGV0Yy4gIEl0IGlzIG1lcmVseSBhIHdheSBmb3IgdGhlIGRyaXZlciB0byBpbXBsZW1lbnQKKwkgKiBnbEZpbmlzaC4KKwkgKi8KKwl2b2lkICgqYm9fd2FpdF9yZW5kZXJpbmcpIChkcm1faW50ZWxfYm8gKmJvKTsKKworCS8qKgorCSAqIFRlYXJzIGRvd24gdGhlIGJ1ZmZlciBtYW5hZ2VyIGluc3RhbmNlLgorCSAqLworCXZvaWQgKCpkZXN0cm95KSAoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyKTsKKworCS8qKgorCSAqIEluZGljYXRlIGlmIHRoZSBidWZmZXIgY2FuIGJlIHBsYWNlZCBhbnl3aGVyZSBpbiB0aGUgZnVsbCBwcGd0dAorCSAqIGFkZHJlc3MgcmFuZ2UgKDJeNDgpLgorCSAqCisJICogQW55IHJlc291cmNlIHVzZWQgd2l0aCBmbGF0L2hlYXBsZXNzICgweDAwMDAwMDAwLTB4ZmZmZmYwMDApCisJICogR2VuZXJhbCBTdGF0ZSBIZWFwIChHU0gpIG9yIEludHJ1Y3Rpb25zIFN0YXRlIEhlYXAgKElTSCkgbXVzdAorCSAqIGJlIGluIGEgMzItYml0IHJhbmdlLiA0OC1iaXQgcmFuZ2Ugd2lsbCBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5CisJICogcmVxdWVzdGVkLgorCSAqCisJICogXHBhcmFtIGJvIEJ1ZmZlciB0byBzZXQgdGhlIHVzZV80OGJfYWRkcmVzc19yYW5nZSBmbGFnLgorCSAqIFxwYXJhbSBlbmFibGUgVGhlIGZsYWcgdmFsdWUuCisJICovCisJdm9pZCAoKmJvX3VzZV80OGJfYWRkcmVzc19yYW5nZSkgKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90IGVuYWJsZSk7CisKKwkvKioKKwkgKiBBZGQgcmVsb2NhdGlvbiBlbnRyeSBpbiByZWxvY19idWYsIHdoaWNoIHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZQorCSAqIHRhcmdldCBidWZmZXIncyByZWFsIG9mZnNldCBvbiBvbiBjb21tYW5kIHN1Ym1pc3Npb24uCisJICoKKwkgKiBSZWxvY2F0aW9ucyByZW1haW4gaW4gcGxhY2UgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgYnVmZmVyIG9iamVjdC4KKwkgKgorCSAqIFxwYXJhbSBibyBCdWZmZXIgdG8gd3JpdGUgdGhlIHJlbG9jYXRpb24gaW50by4KKwkgKiBccGFyYW0gb2Zmc2V0IEJ5dGUgb2Zmc2V0IHdpdGhpbiByZWxvY19ibyBvZiB0aGUgcG9pbnRlciB0bworCSAqCQkJdGFyZ2V0X2JvLgorCSAqIFxwYXJhbSB0YXJnZXRfYm8gQnVmZmVyIHdob3NlIG9mZnNldCBzaG91bGQgYmUgd3JpdHRlbiBpbnRvIHRoZQorCSAqICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiBlbnRyeS4KKwkgKiBccGFyYW0gdGFyZ2V0X29mZnNldCBDb25zdGFudCB2YWx1ZSB0byBiZSBhZGRlZCB0byB0YXJnZXRfYm8ncworCSAqCQkJb2Zmc2V0IGluIHJlbG9jYXRpb24gZW50cnkuCisJICogXHBhcmFtIHJlYWRfZG9tYWlucyBHRU0gcmVhZCBkb21haW5zIHdoaWNoIHRoZSBidWZmZXIgd2lsbCBiZQorCSAqCQkJcmVhZCBpbnRvIGJ5IHRoZSBjb21tYW5kIHRoYXQgdGhpcyByZWxvY2F0aW9uCisJICoJCQlpcyBwYXJ0IG9mLgorCSAqIFxwYXJhbSB3cml0ZV9kb21haW5zIEdFTSByZWFkIGRvbWFpbnMgd2hpY2ggdGhlIGJ1ZmZlciB3aWxsIGJlCisJICoJCQlkaXJ0aWVkIGluIGJ5IHRoZSBjb21tYW5kIHRoYXQgdGhpcworCSAqCQkJcmVsb2NhdGlvbiBpcyBwYXJ0IG9mLgorCSAqLworCWludCAoKmJvX2VtaXRfcmVsb2MpIChkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCBvZmZzZXQsCisJCQkgICAgICBkcm1faW50ZWxfYm8gKnRhcmdldF9ibywgdWludDMyX3QgdGFyZ2V0X29mZnNldCwKKwkJCSAgICAgIHVpbnQzMl90IHJlYWRfZG9tYWlucywgdWludDMyX3Qgd3JpdGVfZG9tYWluKTsKKwlpbnQgKCpib19lbWl0X3JlbG9jX2ZlbmNlKShkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCBvZmZzZXQsCisJCQkJICAgZHJtX2ludGVsX2JvICp0YXJnZXRfYm8sCisJCQkJICAgdWludDMyX3QgdGFyZ2V0X29mZnNldCwKKwkJCQkgICB1aW50MzJfdCByZWFkX2RvbWFpbnMsCisJCQkJICAgdWludDMyX3Qgd3JpdGVfZG9tYWluKTsKKworCS8qKiBFeGVjdXRlcyB0aGUgY29tbWFuZCBidWZmZXIgcG9pbnRlZCB0byBieSBiby4gKi8KKwlpbnQgKCpib19leGVjKSAoZHJtX2ludGVsX2JvICpibywgaW50IHVzZWQsCisJCQlkcm1fY2xpcF9yZWN0X3QgKmNsaXByZWN0cywgaW50IG51bV9jbGlwcmVjdHMsCisJCQlpbnQgRFI0KTsKKworCS8qKiBFeGVjdXRlcyB0aGUgY29tbWFuZCBidWZmZXIgcG9pbnRlZCB0byBieSBibyBvbiB0aGUgc2VsZWN0ZWQKKwkgKiByaW5nIGJ1ZmZlcgorCSAqLworCWludCAoKmJvX21yYl9leGVjKSAoZHJtX2ludGVsX2JvICpibywgaW50IHVzZWQsCisJCQkgICAgZHJtX2NsaXBfcmVjdF90ICpjbGlwcmVjdHMsIGludCBudW1fY2xpcHJlY3RzLAorCQkJICAgIGludCBEUjQsIHVuc2lnbmVkIGZsYWdzKTsKKworCS8qKgorCSAqIFBpbiBhIGJ1ZmZlciB0byB0aGUgYXBlcnR1cmUgYW5kIGZpeCB0aGUgb2Zmc2V0IHVudGlsIHVucGlubmVkCisJICoKKwkgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byBwaW4KKwkgKiBccGFyYW0gYWxpZ25tZW50IFJlcXVpcmVkIGFsaWdubWVudCBmb3IgYXBlcnR1cmUsIGluIGJ5dGVzCisJICovCisJaW50ICgqYm9fcGluKSAoZHJtX2ludGVsX2JvICpibywgdWludDMyX3QgYWxpZ25tZW50KTsKKworCS8qKgorCSAqIFVucGluIGEgYnVmZmVyIGZyb20gdGhlIGFwZXJ0dXJlLCBhbGxvd2luZyBpdCB0byBiZSByZW1vdmVkCisJICoKKwkgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byB1bnBpbgorCSAqLworCWludCAoKmJvX3VucGluKSAoZHJtX2ludGVsX2JvICpibyk7CisKKwkvKioKKwkgKiBBc2sgdGhhdCB0aGUgYnVmZmVyIGJlIHBsYWNlZCBpbiB0aWxpbmcgbW9kZQorCSAqCisJICogXHBhcmFtIGJ1ZiBCdWZmZXIgdG8gc2V0IHRpbGluZyBtb2RlIGZvcgorCSAqIFxwYXJhbSB0aWxpbmdfbW9kZSBkZXNpcmVkLCBhbmQgcmV0dXJuZWQgdGlsaW5nIG1vZGUKKwkgKi8KKwlpbnQgKCpib19zZXRfdGlsaW5nKSAoZHJtX2ludGVsX2JvICpibywgdWludDMyX3QgKiB0aWxpbmdfbW9kZSwKKwkJCSAgICAgIHVpbnQzMl90IHN0cmlkZSk7CisKKwkvKioKKwkgKiBHZXQgdGhlIGN1cnJlbnQgdGlsaW5nIChhbmQgcmVzdWx0aW5nIHN3aXp6bGluZykgbW9kZSBmb3IgdGhlIGJvLgorCSAqCisJICogXHBhcmFtIGJ1ZiBCdWZmZXIgdG8gZ2V0IHRpbGluZyBtb2RlIGZvcgorCSAqIFxwYXJhbSB0aWxpbmdfbW9kZSByZXR1cm5lZCB0aWxpbmcgbW9kZQorCSAqIFxwYXJhbSBzd2l6emxlX21vZGUgcmV0dXJuZWQgc3dpenpsaW5nIG1vZGUKKwkgKi8KKwlpbnQgKCpib19nZXRfdGlsaW5nKSAoZHJtX2ludGVsX2JvICpibywgdWludDMyX3QgKiB0aWxpbmdfbW9kZSwKKwkJCSAgICAgIHVpbnQzMl90ICogc3dpenpsZV9tb2RlKTsKKworCS8qKgorCSAqIFNldCB0aGUgb2Zmc2V0IGF0IHdoaWNoIHRoaXMgYnVmZmVyIHdpbGwgYmUgc29mdHBpbm5lZAorCSAqIFxwYXJhbSBibyBCdWZmZXIgdG8gc2V0IHRoZSBzb2Z0cGluIG9mZnNldCBmb3IKKwkgKiBccGFyYW0gb2Zmc2V0IFNvZnRwaW4gb2Zmc2V0CisJICovCisJaW50ICgqYm9fc2V0X3NvZnRwaW5fb2Zmc2V0KSAoZHJtX2ludGVsX2JvICpibywgdWludDY0X3Qgb2Zmc2V0KTsKKworCS8qKgorCSAqIENyZWF0ZSBhIHZpc2libGUgbmFtZSBmb3IgYSBidWZmZXIgd2hpY2ggY2FuIGJlIHVzZWQgYnkgb3RoZXIgYXBwcworCSAqCisJICogXHBhcmFtIGJ1ZiBCdWZmZXIgdG8gY3JlYXRlIGEgbmFtZSBmb3IKKwkgKiBccGFyYW0gbmFtZSBSZXR1cm5lZCBuYW1lCisJICovCisJaW50ICgqYm9fZmxpbmspIChkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCAqIG5hbWUpOworCisJLyoqCisJICogUmV0dXJucyAxIGlmIG1hcHBpbmcgdGhlIGJ1ZmZlciBmb3Igd3JpdGUgY291bGQgY2F1c2UgdGhlIHByb2Nlc3MKKwkgKiB0byBibG9jaywgZHVlIHRvIHRoZSBvYmplY3QgYmVpbmcgYWN0aXZlIGluIHRoZSBHUFUuCisJICovCisJaW50ICgqYm9fYnVzeSkgKGRybV9pbnRlbF9ibyAqYm8pOworCisJLyoqCisJICogU3BlY2lmeSB0aGUgdm9sYXRpbGl0eSBvZiB0aGUgYnVmZmVyLgorCSAqIFxwYXJhbSBibyBCdWZmZXIgdG8gY3JlYXRlIGEgbmFtZSBmb3IKKwkgKiBccGFyYW0gbWFkdiBUaGUgcHVyZ2VhYmxlIHN0YXR1cworCSAqCisJICogVXNlIEk5MTVfTUFEVl9ET05UTkVFRCB0byBtYXJrIHRoZSBidWZmZXIgYXMgcHVyZ2VhYmxlLCBhbmQgaXQgd2lsbCBiZQorCSAqIHJlY2xhaW1lZCB1bmRlciBtZW1vcnkgcHJlc3N1cmUuIElmIHlvdSBzdWJzZXF1ZW50bHkgcmVxdWlyZSB0aGUgYnVmZmVyLAorCSAqIHRoZW4geW91IG11c3QgcGFzcyBJOTE1X01BRFZfV0lMTE5FRUQgdG8gbWFyayB0aGUgYnVmZmVyIGFzIHJlcXVpcmVkLgorCSAqCisJICogUmV0dXJucyAxIGlmIHRoZSBidWZmZXIgd2FzIHJldGFpbmVkLCBvciAwIGlmIGl0IHdhcyBkaXNjYXJkZWQgd2hpbHN0CisJICogbWFya2VkIGFzIEk5MTVfTUFEVl9ET05UTkVFRC4KKwkgKi8KKwlpbnQgKCpib19tYWR2aXNlKSAoZHJtX2ludGVsX2JvICpibywgaW50IG1hZHYpOworCisJaW50ICgqY2hlY2tfYXBlcnR1cmVfc3BhY2UpIChkcm1faW50ZWxfYm8gKiogYm9fYXJyYXksIGludCBjb3VudCk7CisKKwkvKioKKwkgKiBEaXNhYmxlIGJ1ZmZlciByZXVzZSBmb3IgYnVmZmVycyB3aGljaCB3aWxsIGJlIHNoYXJlZCBpbiBzb21lIHdheSwKKwkgKiBhcyB3aXRoIHNjYW5vdXQgYnVmZmVycy4gV2hlbiB0aGUgYnVmZmVyIHJlZmVyZW5jZSBjb3VudCBnb2VzIHRvCisJICogemVybywgaXQgd2lsbCBiZSBmcmVlZCBhbmQgbm90IHBsYWNlZCBpbiB0aGUgcmV1c2UgbGlzdC4KKwkgKgorCSAqIFxwYXJhbSBibyBCdWZmZXIgdG8gZGlzYWJsZSByZXVzZSBmb3IKKwkgKi8KKwlpbnQgKCpib19kaXNhYmxlX3JldXNlKSAoZHJtX2ludGVsX2JvICpibyk7CisKKwkvKioKKwkgKiBRdWVyeSB3aGV0aGVyIGEgYnVmZmVyIGlzIHJldXNhYmxlLgorCSAqCisJICogXHBhcmFtIGJvIEJ1ZmZlciB0byBxdWVyeQorCSAqLworCWludCAoKmJvX2lzX3JldXNhYmxlKSAoZHJtX2ludGVsX2JvICpibyk7CisKKwkvKioKKwkgKgorCSAqIFJldHVybiB0aGUgcGlwZSBhc3NvY2lhdGVkIHdpdGggYSBjcnRjX2lkIHNvIHRoYXQgdmJsYW5rCisJICogc3luY2hyb25pemF0aW9uIGNhbiB1c2UgdGhlIGNvcnJlY3QgZGF0YSBpbiB0aGUgcmVxdWVzdC4KKwkgKiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBLTVMgYW5kIGdlbSBhdCB0aGlzIHBvaW50LCB3aGVuCisJICogdW5zdXBwb3J0ZWQsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAtMSBhbmQgbGVhdmVzIHRoZSBkZWNpc2lvbgorCSAqIG9mIHdoYXQgdG8gZG8gaW4gdGhhdCBjYXNlIHRvIHRoZSBjYWxsZXIKKwkgKgorCSAqIFxwYXJhbSBidWZtZ3IgdGhlIGFzc29jaWF0ZWQgYnVmZmVyIG1hbmFnZXIKKwkgKiBccGFyYW0gY3J0Y19pZCB0aGUgY3J0YyBpZGVudGlmaWVyCisJICovCisJaW50ICgqZ2V0X3BpcGVfZnJvbV9jcnRjX2lkKSAoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLCBpbnQgY3J0Y19pZCk7CisKKwkvKiogUmV0dXJucyB0cnVlIGlmIHRhcmdldF9ibyBpcyBpbiB0aGUgcmVsb2NhdGlvbiB0cmVlIHJvb3RlZCBhdCBiby4gKi8KKwlpbnQgKCpib19yZWZlcmVuY2VzKSAoZHJtX2ludGVsX2JvICpibywgZHJtX2ludGVsX2JvICp0YXJnZXRfYm8pOworCisJLyoqPCBFbmFibGVzIHZlcmJvc2UgZGVidWdnaW5nIHByaW50b3V0cyAqLworCWludCBkZWJ1ZzsKK307CisKK3N0cnVjdCBfZHJtX2ludGVsX2NvbnRleHQgeworCXVuc2lnbmVkIGludCBjdHhfaWQ7CisJc3RydWN0IF9kcm1faW50ZWxfYnVmbWdyICpidWZtZ3I7Cit9OworCisjZGVmaW5lIEFMSUdOKHZhbHVlLCBhbGlnbm1lbnQpCSgodmFsdWUgKyBhbGlnbm1lbnQgLSAxKSAmIH4oYWxpZ25tZW50IC0gMSkpCisjZGVmaW5lIFJPVU5EX1VQX1RPKHgsIHkpCSgoKHgpICsgKHkpIC0gMSkgLyAoeSkgKiAoeSkpCisjZGVmaW5lIFJPVU5EX1VQX1RPX01CKHgpCVJPVU5EX1VQX1RPKCh4KSwgMTAyNCoxMDI0KQorCisjZW5kaWYgLyogSU5URUxfQlVGTUdSX1BSSVZfSCAqLwpkaWZmIC0tZ2l0IGEvaW50ZWwvaW50ZWxfY2hpcHNldC5oIGIvaW50ZWwvaW50ZWxfY2hpcHNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MWIxNjQKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlbC9pbnRlbF9jaGlwc2V0LmgKQEAgLTAsMCArMSw1MjggQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfSU5URUxfQ0hJUFNFVF9ICisjZGVmaW5lIF9JTlRFTF9DSElQU0VUX0gKKworI2RlZmluZSBQQ0lfQ0hJUF9JODEwCQkJMHg3MTIxCisjZGVmaW5lIFBDSV9DSElQX0k4MTBfREMxMDAJCTB4NzEyMworI2RlZmluZSBQQ0lfQ0hJUF9JODEwX0UJCQkweDcxMjUKKyNkZWZpbmUgUENJX0NISVBfSTgxNQkJCTB4MTEzMgorCisjZGVmaW5lIFBDSV9DSElQX0k4MzBfTQkJCTB4MzU3NworI2RlZmluZSBQQ0lfQ0hJUF84NDVfRwkJCTB4MjU2MgorI2RlZmluZSBQQ0lfQ0hJUF9JODU1X0dNCQkweDM1ODIKKyNkZWZpbmUgUENJX0NISVBfSTg2NV9HCQkJMHgyNTcyCisKKyNkZWZpbmUgUENJX0NISVBfSTkxNV9HCQkJMHgyNTgyCisjZGVmaW5lIFBDSV9DSElQX0U3MjIxX0cJCTB4MjU4QQorI2RlZmluZSBQQ0lfQ0hJUF9JOTE1X0dNCQkweDI1OTIKKyNkZWZpbmUgUENJX0NISVBfSTk0NV9HCQkJMHgyNzcyCisjZGVmaW5lIFBDSV9DSElQX0k5NDVfR00JCTB4MjdBMgorI2RlZmluZSBQQ0lfQ0hJUF9JOTQ1X0dNRQkJMHgyN0FFCisKKyNkZWZpbmUgUENJX0NISVBfUTM1X0cJCQkweDI5QjIKKyNkZWZpbmUgUENJX0NISVBfRzMzX0cJCQkweDI5QzIKKyNkZWZpbmUgUENJX0NISVBfUTMzX0cJCQkweDI5RDIKKworI2RlZmluZSBQQ0lfQ0hJUF9JR0RfR00JCQkweEEwMTEKKyNkZWZpbmUgUENJX0NISVBfSUdEX0cJCQkweEEwMDEKKworI2RlZmluZSBJU19JR0RHTShkZXZpZCkJCSgoZGV2aWQpID09IFBDSV9DSElQX0lHRF9HTSkKKyNkZWZpbmUgSVNfSUdERyhkZXZpZCkJCSgoZGV2aWQpID09IFBDSV9DSElQX0lHRF9HKQorI2RlZmluZSBJU19JR0QoZGV2aWQpCQkoSVNfSUdERyhkZXZpZCkgfHwgSVNfSUdER00oZGV2aWQpKQorCisjZGVmaW5lIFBDSV9DSElQX0k5NjVfRwkJCTB4MjlBMgorI2RlZmluZSBQQ0lfQ0hJUF9JOTY1X1EJCQkweDI5OTIKKyNkZWZpbmUgUENJX0NISVBfSTk2NV9HXzEJCTB4Mjk4MgorI2RlZmluZSBQQ0lfQ0hJUF9JOTQ2X0daCQkweDI5NzIKKyNkZWZpbmUgUENJX0NISVBfSTk2NV9HTQkJMHgyQTAyCisjZGVmaW5lIFBDSV9DSElQX0k5NjVfR01FCQkweDJBMTIKKworI2RlZmluZSBQQ0lfQ0hJUF9HTTQ1X0dNCQkweDJBNDIKKworI2RlZmluZSBQQ0lfQ0hJUF9JR0RfRV9HCQkweDJFMDIKKyNkZWZpbmUgUENJX0NISVBfUTQ1X0cJCQkweDJFMTIKKyNkZWZpbmUgUENJX0NISVBfRzQ1X0cJCQkweDJFMjIKKyNkZWZpbmUgUENJX0NISVBfRzQxX0cJCQkweDJFMzIKKworI2RlZmluZSBQQ0lfQ0hJUF9JTERfRwkJCTB4MDA0MgorI2RlZmluZSBQQ0lfQ0hJUF9JTE1fRwkJCTB4MDA0NgorCisjZGVmaW5lIFBDSV9DSElQX1NBTkRZQlJJREdFX0dUMQkweDAxMDIgLyogZGVza3RvcCAqLworI2RlZmluZSBQQ0lfQ0hJUF9TQU5EWUJSSURHRV9HVDIJMHgwMTEyCisjZGVmaW5lIFBDSV9DSElQX1NBTkRZQlJJREdFX0dUMl9QTFVTCTB4MDEyMgorI2RlZmluZSBQQ0lfQ0hJUF9TQU5EWUJSSURHRV9NX0dUMQkweDAxMDYgLyogbW9iaWxlICovCisjZGVmaW5lIFBDSV9DSElQX1NBTkRZQlJJREdFX01fR1QyCTB4MDExNgorI2RlZmluZSBQQ0lfQ0hJUF9TQU5EWUJSSURHRV9NX0dUMl9QTFVTCTB4MDEyNgorI2RlZmluZSBQQ0lfQ0hJUF9TQU5EWUJSSURHRV9TCQkweDAxMEEgLyogc2VydmVyICovCisKKyNkZWZpbmUgUENJX0NISVBfSVZZQlJJREdFX0dUMQkJMHgwMTUyIC8qIGRlc2t0b3AgKi8KKyNkZWZpbmUgUENJX0NISVBfSVZZQlJJREdFX0dUMgkJMHgwMTYyCisjZGVmaW5lIFBDSV9DSElQX0lWWUJSSURHRV9NX0dUMQkweDAxNTYgLyogbW9iaWxlICovCisjZGVmaW5lIFBDSV9DSElQX0lWWUJSSURHRV9NX0dUMgkweDAxNjYKKyNkZWZpbmUgUENJX0NISVBfSVZZQlJJREdFX1MJCTB4MDE1YSAvKiBzZXJ2ZXIgKi8KKyNkZWZpbmUgUENJX0NISVBfSVZZQlJJREdFX1NfR1QyCTB4MDE2YSAvKiBzZXJ2ZXIgKi8KKworI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0dUMQkJMHgwNDAyIC8qIERlc2t0b3AgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9HVDIJCTB4MDQxMgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0dUMwkJMHgwNDIyCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfTV9HVDEJCTB4MDQwNiAvKiBNb2JpbGUgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9NX0dUMgkJMHgwNDE2CisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfTV9HVDMJCTB4MDQyNgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NfR1QxCQkweDA0MEEgLyogU2VydmVyICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfU19HVDIJCTB4MDQxQQorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NfR1QzCQkweDA0MkEKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9CX0dUMQkJMHgwNDBCIC8qIFJlc2VydmVkICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQl9HVDIJCTB4MDQxQgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0JfR1QzCQkweDA0MkIKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9FX0dUMQkJMHgwNDBFIC8qIFJlc2VydmVkICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfRV9HVDIJCTB4MDQxRQorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0VfR1QzCQkweDA0MkUKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9TRFZfR1QxCTB4MEMwMiAvKiBEZXNrdG9wICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfU0RWX0dUMgkweDBDMTIKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9TRFZfR1QzCTB4MEMyMgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9NX0dUMQkweDBDMDYgLyogTW9iaWxlICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfU0RWX01fR1QyCTB4MEMxNgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9NX0dUMwkweDBDMjYKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9TRFZfU19HVDEJMHgwQzBBIC8qIFNlcnZlciAqLworI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9TX0dUMgkweDBDMUEKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9TRFZfU19HVDMJMHgwQzJBCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfU0RWX0JfR1QxCTB4MEMwQiAvKiBSZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9CX0dUMgkweDBDMUIKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9TRFZfQl9HVDMJMHgwQzJCCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfU0RWX0VfR1QxCTB4MEMwRSAvKiBSZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9FX0dUMgkweDBDMUUKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9TRFZfRV9HVDMJMHgwQzJFCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfVUxUX0dUMQkweDBBMDIgLyogRGVza3RvcCAqLworI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9HVDIJMHgwQTEyCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfVUxUX0dUMwkweDBBMjIKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9VTFRfTV9HVDEJMHgwQTA2IC8qIE1vYmlsZSAqLworI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9NX0dUMgkweDBBMTYKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9VTFRfTV9HVDMJMHgwQTI2CisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfVUxUX1NfR1QxCTB4MEEwQSAvKiBTZXJ2ZXIgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9VTFRfU19HVDIJMHgwQTFBCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfVUxUX1NfR1QzCTB4MEEyQQorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9CX0dUMQkweDBBMEIgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9VTFRfQl9HVDIJMHgwQTFCCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfVUxUX0JfR1QzCTB4MEEyQgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9FX0dUMQkweDBBMEUgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9VTFRfRV9HVDIJMHgwQTFFCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfVUxUX0VfR1QzCTB4MEEyRQorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19HVDEJMHgwRDAyIC8qIERlc2t0b3AgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9DUldfR1QyCTB4MEQxMgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19HVDMJMHgwRDIyCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQ1JXX01fR1QxCTB4MEQwNiAvKiBNb2JpbGUgKi8KKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9DUldfTV9HVDIJMHgwRDE2CisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQ1JXX01fR1QzCTB4MEQyNgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19TX0dUMQkweDBEMEEgLyogU2VydmVyICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQ1JXX1NfR1QyCTB4MEQxQQorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19TX0dUMwkweDBEMkEKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9DUldfQl9HVDEJMHgwRDBCIC8qIFJlc2VydmVkICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQ1JXX0JfR1QyCTB4MEQxQgorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19CX0dUMwkweDBEMkIKKyNkZWZpbmUgUENJX0NISVBfSEFTV0VMTF9DUldfRV9HVDEJMHgwRDBFIC8qIFJlc2VydmVkICovCisjZGVmaW5lIFBDSV9DSElQX0hBU1dFTExfQ1JXX0VfR1QyCTB4MEQxRQorI2RlZmluZSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19FX0dUMwkweDBEMkUKKyNkZWZpbmUgQkRXX1NQQVJFCQkJMHgyCisjZGVmaW5lIEJEV19VTFQJCQkJMHg2CisjZGVmaW5lIEJEV19TRVJWRVIJCQkweGEKKyNkZWZpbmUgQkRXX0lSSVMJCQkweGIKKyNkZWZpbmUgQkRXX1dPUktTVEFUSU9OCQkJMHhkCisjZGVmaW5lIEJEV19VTFgJCQkJMHhlCisKKyNkZWZpbmUgUENJX0NISVBfVkFMTEVZVklFV19QTwkJMHgwZjMwIC8qIFZMViBQTyBib2FyZCAqLworI2RlZmluZSBQQ0lfQ0hJUF9WQUxMRVlWSUVXXzEJCTB4MGYzMQorI2RlZmluZSBQQ0lfQ0hJUF9WQUxMRVlWSUVXXzIJCTB4MGYzMgorI2RlZmluZSBQQ0lfQ0hJUF9WQUxMRVlWSUVXXzMJCTB4MGYzMworCisjZGVmaW5lIFBDSV9DSElQX0NIRVJSWVZJRVdfMAkJMHgyMmIwCisjZGVmaW5lIFBDSV9DSElQX0NIRVJSWVZJRVdfMQkJMHgyMmIxCisjZGVmaW5lIFBDSV9DSElQX0NIRVJSWVZJRVdfMgkJMHgyMmIyCisjZGVmaW5lIFBDSV9DSElQX0NIRVJSWVZJRVdfMwkJMHgyMmIzCisKKyNkZWZpbmUgUENJX0NISVBfU0tZTEFLRV9EVF9HVDEJCTB4MTkwMgorI2RlZmluZSBQQ0lfQ0hJUF9TS1lMQUtFX1VMVF9HVDEJMHgxOTA2CisjZGVmaW5lIFBDSV9DSElQX1NLWUxBS0VfU1JWX0dUMQkweDE5MEEgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0NISVBfU0tZTEFLRV9IX0dUMQkJMHgxOTBCCisjZGVmaW5lIFBDSV9DSElQX1NLWUxBS0VfVUxYX0dUMQkweDE5MEUgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0NISVBfU0tZTEFLRV9EVF9HVDIJCTB4MTkxMgorI2RlZmluZSBQQ0lfQ0hJUF9TS1lMQUtFX0ZVU0VEMF9HVDIJMHgxOTEzIC8qIFJlc2VydmVkICovCisjZGVmaW5lIFBDSV9DSElQX1NLWUxBS0VfRlVTRUQxX0dUMgkweDE5MTUgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0NISVBfU0tZTEFLRV9VTFRfR1QyCTB4MTkxNgorI2RlZmluZSBQQ0lfQ0hJUF9TS1lMQUtFX0ZVU0VEMl9HVDIJMHgxOTE3IC8qIFJlc2VydmVkICovCisjZGVmaW5lIFBDSV9DSElQX1NLWUxBS0VfU1JWX0dUMgkweDE5MUEgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0NISVBfU0tZTEFLRV9IQUxPX0dUMgkweDE5MUIKKyNkZWZpbmUgUENJX0NISVBfU0tZTEFLRV9XS1NfR1QyIAkweDE5MUQKKyNkZWZpbmUgUENJX0NISVBfU0tZTEFLRV9VTFhfR1QyCTB4MTkxRQorI2RlZmluZSBQQ0lfQ0hJUF9TS1lMQUtFX01PQklMRV9HVDIJMHgxOTIxIC8qIFJlc2VydmVkICovCisjZGVmaW5lIFBDSV9DSElQX1NLWUxBS0VfVUxUX0dUM18wCTB4MTkyMworI2RlZmluZSBQQ0lfQ0hJUF9TS1lMQUtFX1VMVF9HVDNfMQkweDE5MjYKKyNkZWZpbmUgUENJX0NISVBfU0tZTEFLRV9VTFRfR1QzXzIJMHgxOTI3CisjZGVmaW5lIFBDSV9DSElQX1NLWUxBS0VfU1JWX0dUNAkweDE5MkEKKyNkZWZpbmUgUENJX0NISVBfU0tZTEFLRV9IQUxPX0dUMwkweDE5MkIgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0NISVBfU0tZTEFLRV9TUlZfR1QzCTB4MTkyRAorI2RlZmluZSBQQ0lfQ0hJUF9TS1lMQUtFX0RUX0dUNAkJMHgxOTMyCisjZGVmaW5lIFBDSV9DSElQX1NLWUxBS0VfU1JWX0dUNFgJMHgxOTNBCisjZGVmaW5lIFBDSV9DSElQX1NLWUxBS0VfSF9HVDQJCTB4MTkzQgorI2RlZmluZSBQQ0lfQ0hJUF9TS1lMQUtFX1dLU19HVDQJMHgxOTNECisKKyNkZWZpbmUgUENJX0NISVBfS0FCWUxBS0VfVUxUX0dUMgkweDU5MTYKKyNkZWZpbmUgUENJX0NISVBfS0FCWUxBS0VfVUxUX0dUMV81CTB4NTkxMworI2RlZmluZSBQQ0lfQ0hJUF9LQUJZTEFLRV9VTFRfR1QxCTB4NTkwNgorI2RlZmluZSBQQ0lfQ0hJUF9LQUJZTEFLRV9VTFRfR1QzXzAJMHg1OTIzCisjZGVmaW5lIFBDSV9DSElQX0tBQllMQUtFX1VMVF9HVDNfMQkweDU5MjYKKyNkZWZpbmUgUENJX0NISVBfS0FCWUxBS0VfVUxUX0dUM18yCTB4NTkyNworI2RlZmluZSBQQ0lfQ0hJUF9LQUJZTEFLRV9VTFRfR1QyRgkweDU5MjEKKyNkZWZpbmUgUENJX0NISVBfS0FCWUxBS0VfVUxYX0dUMV81CTB4NTkxNQorI2RlZmluZSBQQ0lfQ0hJUF9LQUJZTEFLRV9VTFhfR1QxCTB4NTkwRQorI2RlZmluZSBQQ0lfQ0hJUF9LQUJZTEFLRV9VTFhfR1QyCTB4NTkxRQorI2RlZmluZSBQQ0lfQ0hJUF9LQUJZTEFLRV9EVF9HVDIJMHg1OTEyCisjZGVmaW5lIFBDSV9DSElQX0tBQllMQUtFX01fR1QyCQkweDU5MTcKKyNkZWZpbmUgUENJX0NISVBfS0FCWUxBS0VfRFRfR1QxCTB4NTkwMgorI2RlZmluZSBQQ0lfQ0hJUF9LQUJZTEFLRV9IQUxPX0dUMgkweDU5MUIKKyNkZWZpbmUgUENJX0NISVBfS0FCWUxBS0VfSEFMT19HVDQJMHg1OTNCCisjZGVmaW5lIFBDSV9DSElQX0tBQllMQUtFX0hBTE9fR1QxXzAJMHg1OTA4CisjZGVmaW5lIFBDSV9DSElQX0tBQllMQUtFX0hBTE9fR1QxXzEJMHg1OTBCCisjZGVmaW5lIFBDSV9DSElQX0tBQllMQUtFX1NSVl9HVDIJMHg1OTFBCisjZGVmaW5lIFBDSV9DSElQX0tBQllMQUtFX1NSVl9HVDEJMHg1OTBBCisjZGVmaW5lIFBDSV9DSElQX0tBQllMQUtFX1dLU19HVDIJMHg1OTFECisKKyNkZWZpbmUgUENJX0NISVBfQlJPWFRPTl8wCQkweDBBODQKKyNkZWZpbmUgUENJX0NISVBfQlJPWFRPTl8xCQkweDFBODQKKyNkZWZpbmUgUENJX0NISVBfQlJPWFRPTl8yCQkweDVBODQKKyNkZWZpbmUgUENJX0NISVBfQlJPWFRPTl8zCQkweDFBODUKKyNkZWZpbmUgUENJX0NISVBfQlJPWFRPTl80CQkweDVBODUKKworI2RlZmluZSBQQ0lfQ0hJUF9HTEsJCQkweDMxODQKKyNkZWZpbmUgUENJX0NISVBfR0xLXzJYNgkJMHgzMTg1CisKKyNkZWZpbmUgUENJX0NISVBfQ09GRkVFTEFLRV9TX0dUMV8xICAgICAweDNFOTAKKyNkZWZpbmUgUENJX0NISVBfQ09GRkVFTEFLRV9TX0dUMV8yICAgICAweDNFOTMKKyNkZWZpbmUgUENJX0NISVBfQ09GRkVFTEFLRV9TX0dUMl8xICAgICAweDNFOTEKKyNkZWZpbmUgUENJX0NISVBfQ09GRkVFTEFLRV9TX0dUMl8yICAgICAweDNFOTIKKyNkZWZpbmUgUENJX0NISVBfQ09GRkVFTEFLRV9TX0dUMl8zICAgICAweDNFOTYKKyNkZWZpbmUgUENJX0NISVBfQ09GRkVFTEFLRV9IX0dUMl8xICAgICAweDNFOUIKKyNkZWZpbmUgUENJX0NISVBfQ09GRkVFTEFLRV9IX0dUMl8yICAgICAweDNFOTQKKyNkZWZpbmUgUENJX0NISVBfQ09GRkVFTEFLRV9VX0dUM18xICAgICAweDNFQTUKKyNkZWZpbmUgUENJX0NISVBfQ09GRkVFTEFLRV9VX0dUM18yICAgICAweDNFQTYKKyNkZWZpbmUgUENJX0NISVBfQ09GRkVFTEFLRV9VX0dUM18zICAgICAweDNFQTcKKyNkZWZpbmUgUENJX0NISVBfQ09GRkVFTEFLRV9VX0dUM180ICAgICAweDNFQTgKKworI2RlZmluZSBQQ0lfQ0hJUF9DQU5OT05MQUtFX1VfR1QyXzAJMHg1QTUyCisjZGVmaW5lIFBDSV9DSElQX0NBTk5PTkxBS0VfVV9HVDJfMQkweDVBNUEKKyNkZWZpbmUgUENJX0NISVBfQ0FOTk9OTEFLRV9VX0dUMl8yCTB4NUE0MgorI2RlZmluZSBQQ0lfQ0hJUF9DQU5OT05MQUtFX1VfR1QyXzMJMHg1QTRBCisjZGVmaW5lIFBDSV9DSElQX0NBTk5PTkxBS0VfWV9HVDJfMAkweDVBNTEKKyNkZWZpbmUgUENJX0NISVBfQ0FOTk9OTEFLRV9ZX0dUMl8xCTB4NUE1OQorI2RlZmluZSBQQ0lfQ0hJUF9DQU5OT05MQUtFX1lfR1QyXzIJMHg1QTQxCisjZGVmaW5lIFBDSV9DSElQX0NBTk5PTkxBS0VfWV9HVDJfMwkweDVBNDkKKyNkZWZpbmUgUENJX0NISVBfQ0FOTk9OTEFLRV9ZX0dUMl80CTB4NUE3MQorI2RlZmluZSBQQ0lfQ0hJUF9DQU5OT05MQUtFX1lfR1QyXzUJMHg1QTc5CisKKyNkZWZpbmUgSVNfTU9CSUxFKGRldmlkKQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9JODU1X0dNIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9JOTE1X0dNIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9JOTQ1X0dNIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9JOTQ1X0dNRSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSTk2NV9HTSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSTk2NV9HTUUgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0dNNDVfR00gfHwgSVNfSUdEKGRldmlkKSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSVZZQlJJREdFX01fR1QxIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9JVllCUklER0VfTV9HVDIpCisKKyNkZWZpbmUgSVNfRzQ1KGRldmlkKQkJKChkZXZpZCkgPT0gUENJX0NISVBfSUdEX0VfRyB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfUTQ1X0cgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0c0NV9HIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9HNDFfRykKKyNkZWZpbmUgSVNfR000NShkZXZpZCkJCSgoZGV2aWQpID09IFBDSV9DSElQX0dNNDVfR00pCisjZGVmaW5lIElTX0c0WChkZXZpZCkJCShJU19HNDUoZGV2aWQpIHx8IElTX0dNNDUoZGV2aWQpKQorCisjZGVmaW5lIElTX0lMRChkZXZpZCkJCSgoZGV2aWQpID09IFBDSV9DSElQX0lMRF9HKQorI2RlZmluZSBJU19JTE0oZGV2aWQpCQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9JTE1fRykKKworI2RlZmluZSBJU185MTUoZGV2aWQpCQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9JOTE1X0cgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0U3MjIxX0cgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0k5MTVfR00pCisKKyNkZWZpbmUgSVNfOTQ1R00oZGV2aWQpCQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9JOTQ1X0dNIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9JOTQ1X0dNRSkKKworI2RlZmluZSBJU185NDUoZGV2aWQpCQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9JOTQ1X0cgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0k5NDVfR00gfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0k5NDVfR01FIHx8IFwKKwkJCQkgSVNfRzMzKGRldmlkKSkKKworI2RlZmluZSBJU19HMzMoZGV2aWQpCQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9HMzNfRyB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfUTMzX0cgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1EzNV9HIHx8IElTX0lHRChkZXZpZCkpCisKKyNkZWZpbmUgSVNfR0VOMihkZXZpZCkJCSgoZGV2aWQpID09IFBDSV9DSElQX0k4MzBfTSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfODQ1X0cgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0k4NTVfR00gfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0k4NjVfRykKKworI2RlZmluZSBJU19HRU4zKGRldmlkKQkJKElTXzk0NShkZXZpZCkgfHwgSVNfOTE1KGRldmlkKSkKKworI2RlZmluZSBJU19HRU40KGRldmlkKQkJKChkZXZpZCkgPT0gUENJX0NISVBfSTk2NV9HIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9JOTY1X1EgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0k5NjVfR18xIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9JOTY1X0dNIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9JOTY1X0dNRSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSTk0Nl9HWiB8fCBcCisJCQkJIElTX0c0WChkZXZpZCkpCisKKyNkZWZpbmUgSVNfR0VONShkZXZpZCkJCShJU19JTEQoZGV2aWQpIHx8IElTX0lMTShkZXZpZCkpCisKKyNkZWZpbmUgSVNfR0VONihkZXZpZCkJCSgoZGV2aWQpID09IFBDSV9DSElQX1NBTkRZQlJJREdFX0dUMSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfU0FORFlCUklER0VfR1QyIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9TQU5EWUJSSURHRV9HVDJfUExVUyB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfU0FORFlCUklER0VfTV9HVDEgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1NBTkRZQlJJREdFX01fR1QyIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9TQU5EWUJSSURHRV9NX0dUMl9QTFVTIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9TQU5EWUJSSURHRV9TKQorCisjZGVmaW5lIElTX0dFTjcoZGV2aWQpCQkoSVNfSVZZQlJJREdFKGRldmlkKSB8fCBcCisJCQkJIElTX0hBU1dFTEwoZGV2aWQpIHx8IFwKKwkJCQkgSVNfVkFMTEVZVklFVyhkZXZpZCkpCisKKyNkZWZpbmUgSVNfSVZZQlJJREdFKGRldmlkKQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9JVllCUklER0VfR1QxIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9JVllCUklER0VfR1QyIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9JVllCUklER0VfTV9HVDEgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0lWWUJSSURHRV9NX0dUMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSVZZQlJJREdFX1MgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0lWWUJSSURHRV9TX0dUMikKKworI2RlZmluZSBJU19WQUxMRVlWSUVXKGRldmlkKQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9WQUxMRVlWSUVXX1BPIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9WQUxMRVlWSUVXXzEgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1ZBTExFWVZJRVdfMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfVkFMTEVZVklFV18zKQorCisjZGVmaW5lIElTX0hTV19HVDEoZGV2aWQpCSgoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfR1QxIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX01fR1QxIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1NfR1QxIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0JfR1QxIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0VfR1QxIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9HVDEgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfU0RWX01fR1QxIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9TX0dUMSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9TRFZfQl9HVDEgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfU0RWX0VfR1QxIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9HVDEgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfVUxUX01fR1QxIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9TX0dUMSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9VTFRfQl9HVDEgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfVUxUX0VfR1QxIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19HVDEgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfQ1JXX01fR1QxIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19TX0dUMSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9DUldfQl9HVDEgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfQ1JXX0VfR1QxKQorI2RlZmluZSBJU19IU1dfR1QyKGRldmlkKQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0dUMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9NX0dUMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9TX0dUMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9CX0dUMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9FX0dUMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9TRFZfR1QyIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9NX0dUMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9TRFZfU19HVDIgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfU0RWX0JfR1QyIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9FX0dUMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9VTFRfR1QyIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9NX0dUMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9VTFRfU19HVDIgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfVUxUX0JfR1QyIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9FX0dUMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9DUldfR1QyIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19NX0dUMiB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9DUldfU19HVDIgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfQ1JXX0JfR1QyIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19FX0dUMikKKyNkZWZpbmUgSVNfSFNXX0dUMyhkZXZpZCkJKChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9HVDMgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfTV9HVDMgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfU19HVDMgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfQl9HVDMgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfRV9HVDMgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfU0RWX0dUMyB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9TRFZfTV9HVDMgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfU0RWX1NfR1QzIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1NEVl9CX0dUMyB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9TRFZfRV9HVDMgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfVUxUX0dUMyB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9VTFRfTV9HVDMgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfVUxUX1NfR1QzIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX1VMVF9CX0dUMyB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9VTFRfRV9HVDMgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfQ1JXX0dUMyB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9DUldfTV9HVDMgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0hBU1dFTExfQ1JXX1NfR1QzIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9IQVNXRUxMX0NSV19CX0dUMyB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfSEFTV0VMTF9DUldfRV9HVDMpCisKKyNkZWZpbmUgSVNfSEFTV0VMTChkZXZpZCkJKElTX0hTV19HVDEoZGV2aWQpIHx8IFwKKwkJCQkgSVNfSFNXX0dUMihkZXZpZCkgfHwgXAorCQkJCSBJU19IU1dfR1QzKGRldmlkKSkKKworI2RlZmluZSBJU19CUk9BRFdFTEwoZGV2aWQpICAgICAoKChkZXZpZCAmIDB4ZmYwMCkgIT0gMHgxNjAwKSA/IDAgOiBcCisJCQkJKCgoZGV2aWQgJiAweDAwZjApID4+IDQpID4gMykgPyAwIDogXAorCQkJCSgoZGV2aWQgJiAweDAwMGYpID09IEJEV19TUEFSRSkgPyAxIDogXAorCQkJCSgoZGV2aWQgJiAweDAwMGYpID09IEJEV19VTFQpID8gMSA6IFwKKwkJCQkoKGRldmlkICYgMHgwMDBmKSA9PSBCRFdfSVJJUykgPyAxIDogXAorCQkJCSgoZGV2aWQgJiAweDAwMGYpID09IEJEV19TRVJWRVIpID8gMSA6IFwKKwkJCQkoKGRldmlkICYgMHgwMDBmKSA9PSBCRFdfV09SS1NUQVRJT04pID8gMSA6IFwKKwkJCQkoKGRldmlkICYgMHgwMDBmKSA9PSBCRFdfVUxYKSA/IDEgOiAwKQorCisjZGVmaW5lIElTX0NIRVJSWVZJRVcoZGV2aWQpCSgoZGV2aWQpID09IFBDSV9DSElQX0NIRVJSWVZJRVdfMCB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfQ0hFUlJZVklFV18xIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9DSEVSUllWSUVXXzIgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0NIRVJSWVZJRVdfMykKKworI2RlZmluZSBJU19HRU44KGRldmlkKQkJKElTX0JST0FEV0VMTChkZXZpZCkgfHwgXAorCQkJCSBJU19DSEVSUllWSUVXKGRldmlkKSkKKworI2RlZmluZSBJU19TS0xfR1QxKGRldmlkKQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9TS1lMQUtFX0RUX0dUMQl8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfU0tZTEFLRV9VTFRfR1QxCXx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9TS1lMQUtFX1NSVl9HVDEJfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1NLWUxBS0VfSF9HVDEJfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1NLWUxBS0VfVUxYX0dUMSkKKworI2RlZmluZSBJU19TS0xfR1QyKGRldmlkKQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9TS1lMQUtFX0RUX0dUMgl8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfU0tZTEFLRV9GVVNFRDBfR1QyCXx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9TS1lMQUtFX0ZVU0VEMV9HVDIJfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1NLWUxBS0VfVUxUX0dUMgl8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfU0tZTEFLRV9GVVNFRDJfR1QyCXx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9TS1lMQUtFX1NSVl9HVDIJfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1NLWUxBS0VfSEFMT19HVDIJfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1NLWUxBS0VfV0tTX0dUMgl8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfU0tZTEFLRV9VTFhfR1QyCXx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9TS1lMQUtFX01PQklMRV9HVDIpCisKKyNkZWZpbmUgSVNfU0tMX0dUMyhkZXZpZCkJKChkZXZpZCkgPT0gUENJX0NISVBfU0tZTEFLRV9VTFRfR1QzXzAJfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1NLWUxBS0VfVUxUX0dUM18xCXx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9TS1lMQUtFX1VMVF9HVDNfMgl8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfU0tZTEFLRV9IQUxPX0dUMwl8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfU0tZTEFLRV9TUlZfR1QzKQorCisjZGVmaW5lIElTX1NLTF9HVDQoZGV2aWQpCSgoZGV2aWQpID09IFBDSV9DSElQX1NLWUxBS0VfU1JWX0dUNAl8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfU0tZTEFLRV9EVF9HVDQJfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1NLWUxBS0VfU1JWX0dUNFgJfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1NLWUxBS0VfSF9HVDQJfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX1NLWUxBS0VfV0tTX0dUNCkKKworI2RlZmluZSBJU19LQkxfR1QxKGRldmlkKQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9LQUJZTEFLRV9VTFRfR1QxXzUJfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0tBQllMQUtFX1VMWF9HVDFfNQl8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfS0FCWUxBS0VfVUxUX0dUMQl8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfS0FCWUxBS0VfVUxYX0dUMQl8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfS0FCWUxBS0VfRFRfR1QxCXx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9LQUJZTEFLRV9IQUxPX0dUMV8wIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9LQUJZTEFLRV9IQUxPX0dUMV8xIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9LQUJZTEFLRV9TUlZfR1QxKQorCisjZGVmaW5lIElTX0tCTF9HVDIoZGV2aWQpCSgoZGV2aWQpID09IFBDSV9DSElQX0tBQllMQUtFX1VMVF9HVDIJfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0tBQllMQUtFX1VMVF9HVDJGCXx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9LQUJZTEFLRV9VTFhfR1QyCXx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9LQUJZTEFLRV9EVF9HVDIJfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0tBQllMQUtFX01fR1QyCXx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9LQUJZTEFLRV9IQUxPX0dUMgl8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfS0FCWUxBS0VfU1JWX0dUMgl8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfS0FCWUxBS0VfV0tTX0dUMikKKworI2RlZmluZSBJU19LQkxfR1QzKGRldmlkKQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9LQUJZTEFLRV9VTFRfR1QzXzAJfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0tBQllMQUtFX1VMVF9HVDNfMQl8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfS0FCWUxBS0VfVUxUX0dUM18yKQorCisjZGVmaW5lIElTX0tCTF9HVDQoZGV2aWQpCSgoZGV2aWQpID09IFBDSV9DSElQX0tBQllMQUtFX0hBTE9fR1Q0KQorCisjZGVmaW5lIElTX0tBQllMQUtFKGRldmlkKQkoSVNfS0JMX0dUMShkZXZpZCkgfHwgXAorCQkJCSBJU19LQkxfR1QyKGRldmlkKSB8fCBcCisJCQkJIElTX0tCTF9HVDMoZGV2aWQpIHx8IFwKKwkJCQkgSVNfS0JMX0dUNChkZXZpZCkpCisKKyNkZWZpbmUgSVNfU0tZTEFLRShkZXZpZCkJKElTX1NLTF9HVDEoZGV2aWQpIHx8IFwKKwkJCQkgSVNfU0tMX0dUMihkZXZpZCkgfHwgXAorCQkJCSBJU19TS0xfR1QzKGRldmlkKSB8fCBcCisJCQkJIElTX1NLTF9HVDQoZGV2aWQpKQorCisjZGVmaW5lIElTX0JST1hUT04oZGV2aWQpCSgoZGV2aWQpID09IFBDSV9DSElQX0JST1hUT05fMAl8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfQlJPWFRPTl8xCXx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9CUk9YVE9OXzIJfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0JST1hUT05fMwl8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfQlJPWFRPTl80KQorCisjZGVmaW5lIElTX0dFTUlOSUxBS0UoZGV2aWQpCSgoZGV2aWQpID09IFBDSV9DSElQX0dMSyB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfR0xLXzJYNikKKworI2RlZmluZSBJU19DRkxfUyhkZXZpZCkgICAgICAgICAoKGRldmlkKSA9PSBQQ0lfQ0hJUF9DT0ZGRUVMQUtFX1NfR1QxXzEgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRldmlkKSA9PSBQQ0lfQ0hJUF9DT0ZGRUVMQUtFX1NfR1QxXzIgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRldmlkKSA9PSBQQ0lfQ0hJUF9DT0ZGRUVMQUtFX1NfR1QyXzEgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRldmlkKSA9PSBQQ0lfQ0hJUF9DT0ZGRUVMQUtFX1NfR1QyXzIgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRldmlkKSA9PSBQQ0lfQ0hJUF9DT0ZGRUVMQUtFX1NfR1QyXzMpCisKKyNkZWZpbmUgSVNfQ0ZMX0goZGV2aWQpICAgICAgICAgKChkZXZpZCkgPT0gUENJX0NISVBfQ09GRkVFTEFLRV9IX0dUMl8xIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXZpZCkgPT0gUENJX0NISVBfQ09GRkVFTEFLRV9IX0dUMl8yKQorCisjZGVmaW5lIElTX0NGTF9VKGRldmlkKSAgICAgICAgICgoZGV2aWQpID09IFBDSV9DSElQX0NPRkZFRUxBS0VfVV9HVDNfMSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGV2aWQpID09IFBDSV9DSElQX0NPRkZFRUxBS0VfVV9HVDNfMiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGV2aWQpID09IFBDSV9DSElQX0NPRkZFRUxBS0VfVV9HVDNfMyB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGV2aWQpID09IFBDSV9DSElQX0NPRkZFRUxBS0VfVV9HVDNfNCkKKworI2RlZmluZSBJU19DT0ZGRUVMQUtFKGRldmlkKSAgIChJU19DRkxfUyhkZXZpZCkgfHwgXAorCQkJCUlTX0NGTF9IKGRldmlkKSB8fCBcCisJCQkJSVNfQ0ZMX1UoZGV2aWQpKQorCisjZGVmaW5lIElTX0dFTjkoZGV2aWQpCQkoSVNfU0tZTEFLRShkZXZpZCkgIHx8IFwKKwkJCQkgSVNfQlJPWFRPTihkZXZpZCkgIHx8IFwKKwkJCQkgSVNfS0FCWUxBS0UoZGV2aWQpIHx8IFwKKwkJCQkgSVNfR0VNSU5JTEFLRShkZXZpZCkgfHwgXAorCQkJCSBJU19DT0ZGRUVMQUtFKGRldmlkKSkKKworI2RlZmluZSBJU19DTkxfWShkZXZpZCkJCSgoZGV2aWQpID09IFBDSV9DSElQX0NBTk5PTkxBS0VfWV9HVDJfMCB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfQ0FOTk9OTEFLRV9ZX0dUMl8xIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9DQU5OT05MQUtFX1lfR1QyXzIgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0NBTk5PTkxBS0VfWV9HVDJfMyB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfQ0FOTk9OTEFLRV9ZX0dUMl80IHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9DQU5OT05MQUtFX1lfR1QyXzUpCisKKyNkZWZpbmUgSVNfQ05MX1UoZGV2aWQpCQkoKGRldmlkKSA9PSBQQ0lfQ0hJUF9DQU5OT05MQUtFX1VfR1QyXzAgfHwgXAorCQkJCSAoZGV2aWQpID09IFBDSV9DSElQX0NBTk5PTkxBS0VfVV9HVDJfMSB8fCBcCisJCQkJIChkZXZpZCkgPT0gUENJX0NISVBfQ0FOTk9OTEFLRV9VX0dUMl8yIHx8IFwKKwkJCQkgKGRldmlkKSA9PSBQQ0lfQ0hJUF9DQU5OT05MQUtFX1VfR1QyXzMpCisKKyNkZWZpbmUgSVNfQ0FOTk9OTEFLRShkZXZpZCkJKElTX0NOTF9VKGRldmlkKSB8fCBcCisJCQkJIElTX0NOTF9ZKGRldmlkKSkKKworI2RlZmluZSBJU19HRU4xMChkZXZpZCkJCShJU19DQU5OT05MQUtFKGRldmlkKSkKKworI2RlZmluZSBJU185WFgoZGV2KQkJKElTX0dFTjMoZGV2KSB8fCBcCisJCQkJIElTX0dFTjQoZGV2KSB8fCBcCisJCQkJIElTX0dFTjUoZGV2KSB8fCBcCisJCQkJIElTX0dFTjYoZGV2KSB8fCBcCisJCQkJIElTX0dFTjcoZGV2KSB8fCBcCisJCQkJIElTX0dFTjgoZGV2KSB8fCBcCisJCQkJIElTX0dFTjkoZGV2KSB8fCBcCisJCQkJIElTX0dFTjEwKGRldikpCisKKyNlbmRpZiAvKiBfSU5URUxfQ0hJUFNFVF9IICovCmRpZmYgLS1naXQgYS9pbnRlbC9pbnRlbF9kZWJ1Zy5oIGIvaW50ZWwvaW50ZWxfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTA3MzdjCi0tLSAvZGV2L251bGwKKysrIGIvaW50ZWwvaW50ZWxfZGVidWcuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEJlbiBXaWRhd3NreSA8YmVuQGJ3aWRhd3NrLm5ldD4KKyAqCisgKi8KKworI2lmbmRlZiBJTlRFTF9ERUJVR19ICisjZGVmaW5lIElOVEVMX0RFQlVHX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIFNIQURFUl9ERUJVR19TT0NLRVQgIi92YXIvcnVuL2dlbl9kZWJ1ZyIKKyNkZWZpbmUgREVCVUdfSEFORFNIQUtFX1ZFUlNJT04gMHgzCisjZGVmaW5lIERFQlVHX0hBTkRTSEFLRV9BQ0sgIm9rYXkiCisKKy8qIEZpcnN0IGJ5dGUgbXVzdCBhbHdheXMgYmUgdGhlIDEgYnl0ZSB2ZXJzaW9uICovCitzdHJ1Y3QgaW50ZWxfZGVidWdfaGFuZHNoYWtlIHsKKwl1aW50MzJfdCB2ZXJzaW9uOworCWludCBmbGlua19oYW5kbGU7CisJdWludDMyX3QgcGVyX3RocmVhZF9zY3JhdGNoOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRlbC9pbnRlbF9kZWNvZGUuYyBiL2ludGVsL2ludGVsX2RlY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhODE1MDAKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlbC9pbnRlbF9kZWNvZGUuYwpAQCAtMCwwICsxLDM5ODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOS0yMDExIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliZHJtX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmODZkcm0uaCIKKyNpbmNsdWRlICJpbnRlbF9jaGlwc2V0LmgiCisjaW5jbHVkZSAiaW50ZWxfYnVmbWdyLmgiCisKKworLyogU3RydWN0IGZvciB0cmFja2luZyBkcm1faW50ZWxfZGVjb2RlIHN0YXRlLiAqLworc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgeworCS8qKiBzdGRpbyBmaWxlIHdoZXJlIHRoZSBvdXRwdXQgc2hvdWxkIGxhbmQuICBEZWZhdWx0cyB0byBzdGRvdXQuICovCisJRklMRSAqb3V0OworCisJLyoqIFBDSSBkZXZpY2UgSUQuICovCisJdWludDMyX3QgZGV2aWQ7CisKKwkvKioKKwkgKiBTaG9ydGhhbmQgZGV2aWNlIGlkZW50aWZpZXI6IDMgaXMgOTE1LCA0IGlzIDk2NSwgNSBpcworCSAqIElyb25sYWtlLCBldGMuCisJICovCisJaW50IGdlbjsKKworCS8qKiBHUFUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgcGFja2V0LiAqLworCXVpbnQzMl90IGh3X29mZnNldDsKKwkvKiogQ1BVIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgcGFja2V0LiAqLworCXVpbnQzMl90ICpkYXRhOworCS8qKiBEV09SRHMgb2YgcmVtYWluaW5nIGJhdGNoYnVmZmVyIGRhdGEgc3RhcnRpbmcgZnJvbSB0aGUgcGFja2V0LiAqLworCXVpbnQzMl90IGNvdW50OworCisJLyoqIEdQVSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgYmF0Y2hidWZmZXIgZGF0YS4gKi8KKwl1aW50MzJfdCBiYXNlX2h3X29mZnNldDsKKwkvKiogQ1BVIFZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGJhdGNoYnVmZmVyIGRhdGEuICovCisJdWludDMyX3QgKmJhc2VfZGF0YTsKKwkvKiogTnVtYmVyIG9mIERXT1JEcyBvZiBiYXRjaGJ1ZmZlciBkYXRhLiAqLworCXVpbnQzMl90IGJhc2VfY291bnQ7CisKKwkvKiogQHsKKwkgKiBHUFUgaGVhZCBhbmQgdGFpbCBwb2ludGVycywgd2hpY2ggd2lsbCBiZSBub3RlZCBpbiB0aGUgZHVtcCwgb3IgfjAuCisJICovCisJdWludDMyX3QgaGVhZCwgdGFpbDsKKwkvKiogQH0gKi8KKworCS8qKgorCSAqIFdoZXRoZXIgdG8gZHVtcCB0aGUgZHdvcmRzIGFmdGVyIE1JX0JBVENIQlVGRkVSX0VORC4KKwkgKgorCSAqIFRoaXMgc29tZXRpbWVzIHByb3ZpZGVzIGNsdWVzIGluIGNvcnJ1cHRlZCBiYXRjaGJ1ZmZlcnMsCisJICogYW5kIGlzIHVzZWQgYnkgdGhlIGludGVsLWdwdS10b29scy4KKwkgKi8KKwlib29sIGR1bXBfcGFzdF9lbmQ7CisKKwlib29sIG92ZXJmbG93ZWQ7Cit9OworCitzdGF0aWMgRklMRSAqb3V0Oworc3RhdGljIHVpbnQzMl90IHNhdmVkX3MyID0gMCwgc2F2ZWRfczQgPSAwOworc3RhdGljIGNoYXIgc2F2ZWRfczJfc2V0ID0gMCwgc2F2ZWRfczRfc2V0ID0gMDsKK3N0YXRpYyB1aW50MzJfdCBoZWFkX29mZnNldCA9IDB4ZmZmZmZmZmY7CS8qIHVuZGVmaW5lZCAqLworc3RhdGljIHVpbnQzMl90IHRhaWxfb2Zmc2V0ID0gMHhmZmZmZmZmZjsJLyogdW5kZWZpbmVkICovCisKKyNpZm5kZWYgQVJSQVlfU0laRQorI2RlZmluZSBBUlJBWV9TSVpFKEEpIChzaXplb2YoQSkvc2l6ZW9mKEFbMF0pKQorI2VuZGlmCisKKyNkZWZpbmUgQlVGRkVSX0ZBSUwoX2NvdW50LCBfbGVuLCBfbmFtZSkgZG8gewkJCVwKKyAgICBmcHJpbnRmKG91dCwgIkJ1ZmZlciBzaXplIHRvbyBzbWFsbCBpbiAlcyAoJWQgPCAlZClcbiIsCVwKKwkgICAgKF9uYW1lKSwgKF9jb3VudCksIChfbGVuKSk7CQkJCVwKKyAgICByZXR1cm4gX2NvdW50OwkJCQkJCVwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBmbG9hdCBpbnRfYXNfZmxvYXQodWludDMyX3QgaW50dmFsKQoreworCXVuaW9uIGludGZsb2F0IHsKKwkJdWludDMyX3QgaTsKKwkJZmxvYXQgZjsKKwl9IHV2YWw7CisKKwl1dmFsLmkgPSBpbnR2YWw7CisJcmV0dXJuIHV2YWwuZjsKK30KKworc3RhdGljIHZvaWQgRFJNX1BSSU5URkxJS0UoMywgNCkKK2luc3RyX291dChzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4LCB1bnNpZ25lZCBpbnQgaW5kZXgsCisJICBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IHZhOworCWNvbnN0IGNoYXIgKnBhcnNlaW5mbzsKKwl1aW50MzJfdCBvZmZzZXQgPSBjdHgtPmh3X29mZnNldCArIGluZGV4ICogNDsKKworCWlmIChpbmRleCA+IGN0eC0+Y291bnQpIHsKKwkJaWYgKCFjdHgtPm92ZXJmbG93ZWQpIHsKKwkJCWZwcmludGYob3V0LCAiRVJST1I6IERlY29kZSBhdHRlbXB0ZWQgdG8gY29udGludWUgYmV5b25kIGVuZCBvZiBiYXRjaGJ1ZmZlclxuIik7CisJCQljdHgtPm92ZXJmbG93ZWQgPSB0cnVlOworCQl9CisJCXJldHVybjsKKwl9CisKKwlpZiAob2Zmc2V0ID09IGhlYWRfb2Zmc2V0KQorCQlwYXJzZWluZm8gPSAiSEVBRCI7CisJZWxzZSBpZiAob2Zmc2V0ID09IHRhaWxfb2Zmc2V0KQorCQlwYXJzZWluZm8gPSAiVEFJTCI7CisJZWxzZQorCQlwYXJzZWluZm8gPSAiICAgICI7CisKKwlmcHJpbnRmKG91dCwgIjB4JTA4eDogJXMgMHglMDh4OiAlcyIsIG9mZnNldCwgcGFyc2VpbmZvLAorCQljdHgtPmRhdGFbaW5kZXhdLCBpbmRleCA9PSAwID8gIiIgOiAiICAgIik7CisJdmFfc3RhcnQodmEsIGZtdCk7CisJdmZwcmludGYob3V0LCBmbXQsIHZhKTsKKwl2YV9lbmQodmEpOworfQorCitzdGF0aWMgaW50CitkZWNvZGVfTUlfU0VUX0NPTlRFWFQoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCkKK3sKKwl1aW50MzJfdCBkYXRhID0gY3R4LT5kYXRhWzFdOworCWlmIChjdHgtPmdlbiA+IDcpCisJCXJldHVybiAxOworCisJaW5zdHJfb3V0KGN0eCwgMCwgIk1JX1NFVF9DT05URVhUXG4iKTsKKwlpbnN0cl9vdXQoY3R4LCAxLCAiZ3R0IG9mZnNldCA9IDB4JXglcyVzXG4iLAorCQkgIGRhdGEgJiB+MHhmZmYsCisJCSAgZGF0YSAmICgxPDwxKT8gIiwgRm9yY2UgUmVzdG9yZSI6ICIiLAorCQkgIGRhdGEgJiAoMTw8MCk/ICIsIFJlc3RvcmUgSW5oaWJpdCI6ICIiKTsKKworCXJldHVybiAyOworfQorCitzdGF0aWMgaW50CitkZWNvZGVfTUlfV0FJVF9GT1JfRVZFTlQoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCkKK3sKKwljb25zdCBjaGFyICpjY193YWl0OworCWludCBjY19zaGlmdCA9IDA7CisJdWludDMyX3QgZGF0YSA9IGN0eC0+ZGF0YVswXTsKKworCWlmIChjdHgtPmdlbiA8PSA1KQorCQljY19zaGlmdCA9IDk7CisJZWxzZQorCQljY19zaGlmdCA9IDE2OworCisJc3dpdGNoICgoZGF0YSA+PiBjY19zaGlmdCkgJiAweDFmKSB7CisJY2FzZSAxOgorCQljY193YWl0ID0gIiwgY2Mgd2FpdCAxIjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQljY193YWl0ID0gIiwgY2Mgd2FpdCAyIjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQljY193YWl0ID0gIiwgY2Mgd2FpdCAzIjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQljY193YWl0ID0gIiwgY2Mgd2FpdCA0IjsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQljY193YWl0ID0gIiwgY2Mgd2FpdCA0IjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2Nfd2FpdCA9ICIiOworCQlicmVhazsKKwl9CisKKwlpZiAoY3R4LT5nZW4gPD0gNSkgeworCQlpbnN0cl9vdXQoY3R4LCAwLCAiTUlfV0FJVF9GT1JfRVZFTlQlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzXG4iLAorCQkJICBkYXRhICYgKDE8PDE4KT8gIiwgcGlwZSBCIHN0YXJ0IHZibGFuayB3YWl0IjogIiIsCisJCQkgIGRhdGEgJiAoMTw8MTcpPyAiLCBwaXBlIEEgc3RhcnQgdmJsYW5rIHdhaXQiOiAiIiwKKwkJCSAgZGF0YSAmICgxPDwxNik/ICIsIG92ZXJsYXkgZmxpcCBwZW5kaW5nIHdhaXQiOiAiIiwKKwkJCSAgZGF0YSAmICgxPDwxNCk/ICIsIHBpcGUgQiBoYmxhbmsgd2FpdCI6ICIiLAorCQkJICBkYXRhICYgKDE8PDEzKT8gIiwgcGlwZSBBIGhibGFuayB3YWl0IjogIiIsCisJCQkgIGNjX3dhaXQsCisJCQkgIGRhdGEgJiAoMTw8OCk/ICIsIHBsYW5lIEMgcGVuZGluZyBmbGlwIHdhaXQiOiAiIiwKKwkJCSAgZGF0YSAmICgxPDw3KT8gIiwgcGlwZSBCIHZibGFuayB3YWl0IjogIiIsCisJCQkgIGRhdGEgJiAoMTw8Nik/ICIsIHBsYW5lIEIgcGVuZGluZyBmbGlwIHdhaXQiOiAiIiwKKwkJCSAgZGF0YSAmICgxPDw1KT8gIiwgcGlwZSBCIHNjYW4gbGluZSB3YWl0IjogIiIsCisJCQkgIGRhdGEgJiAoMTw8NCk/ICIsIGZiYyBpZGxlIHdhaXQiOiAiIiwKKwkJCSAgZGF0YSAmICgxPDwzKT8gIiwgcGlwZSBBIHZibGFuayB3YWl0IjogIiIsCisJCQkgIGRhdGEgJiAoMTw8Mik/ICIsIHBsYW5lIEEgcGVuZGluZyBmbGlwIHdhaXQiOiAiIiwKKwkJCSAgZGF0YSAmICgxPDwxKT8gIiwgcGxhbmUgQSBzY2FuIGxpbmUgd2FpdCI6ICIiKTsKKwl9IGVsc2UgeworCQlpbnN0cl9vdXQoY3R4LCAwLCAiTUlfV0FJVF9GT1JfRVZFTlQlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXNcbiIsCisJCQkgIGRhdGEgJiAoMTw8MjApPyAiLCBzcHJpdGUgQyBwZW5kaW5nIGZsaXAgd2FpdCI6ICIiLCAvKiBpdmIgKi8KKwkJCSAgY2Nfd2FpdCwKKwkJCSAgZGF0YSAmICgxPDwxMyk/ICIsIHBpcGUgQiBoYmxhbmsgd2FpdCI6ICIiLAorCQkJICBkYXRhICYgKDE8PDExKT8gIiwgcGlwZSBCIHZibGFuayB3YWl0IjogIiIsCisJCQkgIGRhdGEgJiAoMTw8MTApPyAiLCBzcHJpdGUgQiBwZW5kaW5nIGZsaXAgd2FpdCI6ICIiLAorCQkJICBkYXRhICYgKDE8PDkpPyAiLCBwbGFuZSBCIHBlbmRpbmcgZmxpcCB3YWl0IjogIiIsCisJCQkgIGRhdGEgJiAoMTw8OCk/ICIsIHBsYW5lIEIgc2NhbiBsaW5lIHdhaXQiOiAiIiwKKwkJCSAgZGF0YSAmICgxPDw1KT8gIiwgcGlwZSBBIGhibGFuayB3YWl0IjogIiIsCisJCQkgIGRhdGEgJiAoMTw8Myk/ICIsIHBpcGUgQSB2Ymxhbmsgd2FpdCI6ICIiLAorCQkJICBkYXRhICYgKDE8PDIpPyAiLCBzcHJpdGUgQSBwZW5kaW5nIGZsaXAgd2FpdCI6ICIiLAorCQkJICBkYXRhICYgKDE8PDEpPyAiLCBwbGFuZSBBIHBlbmRpbmcgZmxpcCB3YWl0IjogIiIsCisJCQkgIGRhdGEgJiAoMTw8MCk/ICIsIHBsYW5lIEEgc2NhbiBsaW5lIHdhaXQiOiAiIik7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2RlY29kZV9taShzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCXVuc2lnbmVkIGludCBvcGNvZGUsIGxlbiA9IC0xOworCWNvbnN0IGNoYXIgKnBvc3Rfc3luY19vcCA9ICIiOworCXVpbnQzMl90ICpkYXRhID0gY3R4LT5kYXRhOworCisJc3RydWN0IHsKKwkJdWludDMyX3Qgb3Bjb2RlOworCQlpbnQgbGVuX21hc2s7CisJCXVuc2lnbmVkIGludCBtaW5fbGVuOworCQl1bnNpZ25lZCBpbnQgbWF4X2xlbjsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwkJaW50ICgqZnVuYykoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCk7CisJfSBvcGNvZGVzX21pW10gPSB7CisJCXsgMHgwOCwgMCwgMSwgMSwgIk1JX0FSQl9PTl9PRkYiIH0sCisJCXsgMHgwYSwgMCwgMSwgMSwgIk1JX0JBVENIX0JVRkZFUl9FTkQiIH0sCisJCXsgMHgzMCwgMHgzZiwgMywgMywgIk1JX0JBVENIX0JVRkZFUiIgfSwKKwkJeyAweDMxLCAweDNmLCAyLCAyLCAiTUlfQkFUQ0hfQlVGRkVSX1NUQVJUIiB9LAorCQl7IDB4MTQsIDB4M2YsIDMsIDMsICJNSV9ESVNQTEFZX0JVRkZFUl9JTkZPIiB9LAorCQl7IDB4MDQsIDAsIDEsIDEsICJNSV9GTFVTSCIgfSwKKwkJeyAweDIyLCAweDFmLCAzLCAzLCAiTUlfTE9BRF9SRUdJU1RFUl9JTU0iIH0sCisJCXsgMHgxMywgMHgzZiwgMiwgMiwgIk1JX0xPQURfU0NBTl9MSU5FU19FWENMIiB9LAorCQl7IDB4MTIsIDB4M2YsIDIsIDIsICJNSV9MT0FEX1NDQU5fTElORVNfSU5DTCIgfSwKKwkJeyAweDAwLCAwLCAxLCAxLCAiTUlfTk9PUCIgfSwKKwkJeyAweDExLCAweDNmLCAyLCAyLCAiTUlfT1ZFUkxBWV9GTElQIiB9LAorCQl7IDB4MDcsIDAsIDEsIDEsICJNSV9SRVBPUlRfSEVBRCIgfSwKKwkJeyAweDE4LCAweDNmLCAyLCAyLCAiTUlfU0VUX0NPTlRFWFQiLCBkZWNvZGVfTUlfU0VUX0NPTlRFWFQgfSwKKwkJeyAweDIwLCAweDNmLCAzLCA0LCAiTUlfU1RPUkVfREFUQV9JTU0iIH0sCisJCXsgMHgyMSwgMHgzZiwgMywgNCwgIk1JX1NUT1JFX0RBVEFfSU5ERVgiIH0sCisJCXsgMHgyNCwgMHgzZiwgMywgMywgIk1JX1NUT1JFX1JFR0lTVEVSX01FTSIgfSwKKwkJeyAweDAyLCAwLCAxLCAxLCAiTUlfVVNFUl9JTlRFUlJVUFQiIH0sCisJCXsgMHgwMywgMCwgMSwgMSwgIk1JX1dBSVRfRk9SX0VWRU5UIiwgZGVjb2RlX01JX1dBSVRfRk9SX0VWRU5UIH0sCisJCXsgMHgxNiwgMHg3ZiwgMywgMywgIk1JX1NFTUFQSE9SRV9NQk9YIiB9LAorCQl7IDB4MjYsIDB4MWYsIDMsIDQsICJNSV9GTFVTSF9EVyIgfSwKKwkJeyAweDI4LCAweDNmLCAzLCAzLCAiTUlfUkVQT1JUX1BFUkZfQ09VTlQiIH0sCisJCXsgMHgyOSwgMHhmZiwgMywgMywgIk1JX0xPQURfUkVHSVNURVJfTUVNIiB9LAorCQl7IDB4MGIsIDAsIDEsIDEsICJNSV9TVVNQRU5EX0ZMVVNIIn0sCisJfSwgKm9wY29kZV9taSA9IE5VTEw7CisKKwkvKiBjaGVjayBpbnN0cnVjdGlvbiBsZW5ndGggKi8KKwlmb3IgKG9wY29kZSA9IDA7IG9wY29kZSA8IHNpemVvZihvcGNvZGVzX21pKSAvIHNpemVvZihvcGNvZGVzX21pWzBdKTsKKwkgICAgIG9wY29kZSsrKSB7CisJCWlmICgoZGF0YVswXSAmIDB4MWY4MDAwMDApID4+IDIzID09IG9wY29kZXNfbWlbb3Bjb2RlXS5vcGNvZGUpIHsKKwkJCWxlbiA9IDE7CisJCQlpZiAob3Bjb2Rlc19taVtvcGNvZGVdLm1heF9sZW4gPiAxKSB7CisJCQkJbGVuID0KKwkJCQkgICAgKGRhdGFbMF0gJiBvcGNvZGVzX21pW29wY29kZV0ubGVuX21hc2spICsgMjsKKwkJCQlpZiAobGVuIDwgb3Bjb2Rlc19taVtvcGNvZGVdLm1pbl9sZW4KKwkJCQkgICAgfHwgbGVuID4gb3Bjb2Rlc19taVtvcGNvZGVdLm1heF9sZW4pIHsKKwkJCQkJZnByaW50ZihvdXQsCisJCQkJCQkiQmFkIGxlbmd0aCAoJWQpIGluICVzLCBbJWQsICVkXVxuIiwKKwkJCQkJCWxlbiwgb3Bjb2Rlc19taVtvcGNvZGVdLm5hbWUsCisJCQkJCQlvcGNvZGVzX21pW29wY29kZV0ubWluX2xlbiwKKwkJCQkJCW9wY29kZXNfbWlbb3Bjb2RlXS5tYXhfbGVuKTsKKwkJCQl9CisJCQl9CisJCQlvcGNvZGVfbWkgPSAmb3Bjb2Rlc19taVtvcGNvZGVdOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAob3Bjb2RlX21pICYmIG9wY29kZV9taS0+ZnVuYykKKwkJcmV0dXJuIG9wY29kZV9taS0+ZnVuYyhjdHgpOworCisJc3dpdGNoICgoZGF0YVswXSAmIDB4MWY4MDAwMDApID4+IDIzKSB7CisJY2FzZSAweDBhOgorCQlpbnN0cl9vdXQoY3R4LCAwLCAiTUlfQkFUQ0hfQlVGRkVSX0VORFxuIik7CisJCXJldHVybiAtMTsKKwljYXNlIDB4MTY6CisJCWluc3RyX291dChjdHgsIDAsICJNSV9TRU1BUEhPUkVfTUJPWCVzJXMlcyVzICV1XG4iLAorCQkJICBkYXRhWzBdICYgKDEgPDwgMjIpID8gIiBnbG9iYWwgZ3R0LCIgOiAiIiwKKwkJCSAgZGF0YVswXSAmICgxIDw8IDIxKSA/ICIgdXBkYXRlIHNlbWFwaG9yZSwiIDogIiIsCisJCQkgIGRhdGFbMF0gJiAoMSA8PCAyMCkgPyAiIGNvbXBhcmUgc2VtYXBob3JlLCIgOiAiIiwKKwkJCSAgZGF0YVswXSAmICgxIDw8IDE4KSA/ICIgdXNlIGNvbXBhcmUgcmVnIiA6ICIiLAorCQkJICAoZGF0YVswXSAmICgweDMgPDwgMTYpKSA+PiAxNik7CisJCWluc3RyX291dChjdHgsIDEsICJ2YWx1ZVxuIik7CisJCWluc3RyX291dChjdHgsIDIsICJhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4MjE6CisJCWluc3RyX291dChjdHgsIDAsICJNSV9TVE9SRV9EQVRBX0lOREVYJXNcbiIsCisJCQkgIGRhdGFbMF0gJiAoMSA8PCAyMSkgPyAiIHVzZSBwZXItcHJvY2VzcyBIV1MsIiA6ICIiKTsKKwkJaW5zdHJfb3V0KGN0eCwgMSwgImluZGV4XG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMiwgImR3b3JkXG4iKTsKKwkJaWYgKGxlbiA9PSA0KQorCQkJaW5zdHJfb3V0KGN0eCwgMywgInVwcGVyIGR3b3JkXG4iKTsKKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4MDA6CisJCWlmIChkYXRhWzBdICYgKDEgPDwgMjIpKQorCQkJaW5zdHJfb3V0KGN0eCwgMCwKKwkJCQkgICJNSV9OT09QIHdyaXRlIE5PUElEIHJlZywgdmFsPTB4JXhcbiIsCisJCQkJICBkYXRhWzBdICYgKCgxIDw8IDIyKSAtIDEpKTsKKwkJZWxzZQorCQkJaW5zdHJfb3V0KGN0eCwgMCwgIk1JX05PT1BcbiIpOworCQlyZXR1cm4gbGVuOworCWNhc2UgMHgyNjoKKwkJc3dpdGNoIChkYXRhWzBdICYgKDB4MyA8PCAxNCkpIHsKKwkJY2FzZSAoMCA8PCAxNCk6CisJCQlwb3N0X3N5bmNfb3AgPSAibm8gd3JpdGUiOworCQkJYnJlYWs7CisJCWNhc2UgKDEgPDwgMTQpOgorCQkJcG9zdF9zeW5jX29wID0gIndyaXRlIGRhdGEiOworCQkJYnJlYWs7CisJCWNhc2UgKDIgPDwgMTQpOgorCQkJcG9zdF9zeW5jX29wID0gInJlc2VydmVkIjsKKwkJCWJyZWFrOworCQljYXNlICgzIDw8IDE0KToKKwkJCXBvc3Rfc3luY19vcCA9ICJ3cml0ZSBUSU1FU1RBTVAiOworCQkJYnJlYWs7CisJCX0KKwkJaW5zdHJfb3V0KGN0eCwgMCwKKwkJCSAgIk1JX0ZMVVNIX0RXJXMlcyVzJXMgcG9zdF9zeW5jX29wPSclcycgJXMlc1xuIiwKKwkJCSAgZGF0YVswXSAmICgxIDw8IDIyKSA/CisJCQkgICIgZW5hYmxlIHByb3RlY3RlZCBtZW0gKEJDUy1vbmx5KSwiIDogIiIsCisJCQkgIGRhdGFbMF0gJiAoMSA8PCAyMSkgPyAiIHN0b3JlIGluIGh3cywiIDogIiIsCisJCQkgIGRhdGFbMF0gJiAoMSA8PCAxOCkgPyAiIGludmFsaWRhdGUgdGxiLCIgOiAiIiwKKwkJCSAgZGF0YVswXSAmICgxIDw8IDE3KSA/ICIgZmx1c2ggZ2ZkdCwiIDogIiIsCisJCQkgIHBvc3Rfc3luY19vcCwKKwkJCSAgZGF0YVswXSAmICgxIDw8IDgpID8gIiBlbmFibGUgbm90aWZ5IGludGVycnVwdCwiIDogIiIsCisJCQkgIGRhdGFbMF0gJiAoMSA8PCA3KSA/CisJCQkgICIgaW52YWxpZGF0ZSB2aWRlbyBzdGF0ZSAoQkNTLW9ubHkpLCIgOiAiIik7CisJCWlmIChkYXRhWzBdICYgKDEgPDwgMjEpKQorCQkJaW5zdHJfb3V0KGN0eCwgMSwgImh3cyBpbmRleFxuIik7CisJCWVsc2UKKwkJCWluc3RyX291dChjdHgsIDEsICJhZGRyZXNzXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMiwgImR3b3JkXG4iKTsKKwkJaWYgKGxlbiA9PSA0KQorCQkJaW5zdHJfb3V0KGN0eCwgMywgInVwcGVyIGR3b3JkXG4iKTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlmb3IgKG9wY29kZSA9IDA7IG9wY29kZSA8IHNpemVvZihvcGNvZGVzX21pKSAvIHNpemVvZihvcGNvZGVzX21pWzBdKTsKKwkgICAgIG9wY29kZSsrKSB7CisJCWlmICgoZGF0YVswXSAmIDB4MWY4MDAwMDApID4+IDIzID09IG9wY29kZXNfbWlbb3Bjb2RlXS5vcGNvZGUpIHsKKwkJCXVuc2lnbmVkIGludCBpOworCisJCQlpbnN0cl9vdXQoY3R4LCAwLCAiJXNcbiIsCisJCQkJICBvcGNvZGVzX21pW29wY29kZV0ubmFtZSk7CisJCQlmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKKwkJCQlpbnN0cl9vdXQoY3R4LCBpLCAiZHdvcmQgJWRcbiIsIGkpOworCQkJfQorCisJCQlyZXR1cm4gbGVuOworCQl9CisJfQorCisJaW5zdHJfb3V0KGN0eCwgMCwgIk1JIFVOS05PV05cbiIpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorZGVjb2RlXzJkX2JyMDAoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCwgY29uc3QgY2hhciAqY21kKQoreworCWluc3RyX291dChjdHgsIDAsCisJCSAgIiVzIChyZ2IgJXNhYmxlZCwgYWxwaGEgJXNhYmxlZCwgc3JjIHRpbGUgJWQsIGRzdCB0aWxlICVkKVxuIiwKKwkJICBjbWQsCisJCSAgKGN0eC0+ZGF0YVswXSAmICgxIDw8IDIwKSkgPyAiZW4iIDogImRpcyIsCisJCSAgKGN0eC0+ZGF0YVswXSAmICgxIDw8IDIxKSkgPyAiZW4iIDogImRpcyIsCisJCSAgKGN0eC0+ZGF0YVswXSA+PiAxNSkgJiAxLAorCQkgIChjdHgtPmRhdGFbMF0gPj4gMTEpICYgMSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWNvZGVfMmRfYnIwMShzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCWNvbnN0IGNoYXIgKmZvcm1hdDsKKwlzd2l0Y2ggKChjdHgtPmRhdGFbMV0gPj4gMjQpICYgMHgzKSB7CisJY2FzZSAwOgorCQlmb3JtYXQgPSAiOCI7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZm9ybWF0ID0gIjU2NSI7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZm9ybWF0ID0gIjE1NTUiOworCQlicmVhazsKKwljYXNlIDM6CisJCWZvcm1hdCA9ICI4ODg4IjsKKwkJYnJlYWs7CisJfQorCisJaW5zdHJfb3V0KGN0eCwgMSwKKwkJICAiZm9ybWF0ICVzLCBwaXRjaCAlZCwgcm9wIDB4JTAyeCwgIgorCQkgICJjbGlwcGluZyAlc2FibGVkLCAlcyVzIFxuIiwKKwkJICBmb3JtYXQsCisJCSAgKHNob3J0KShjdHgtPmRhdGFbMV0gJiAweGZmZmYpLAorCQkgIChjdHgtPmRhdGFbMV0gPj4gMTYpICYgMHhmZiwKKwkJICBjdHgtPmRhdGFbMV0gJiAoMSA8PCAzMCkgPyAiZW4iIDogImRpcyIsCisJCSAgY3R4LT5kYXRhWzFdICYgKDEgPDwgMzEpID8gInNvbGlkIHBhdHRlcm4gZW5hYmxlZCwgIiA6ICIiLAorCQkgIGN0eC0+ZGF0YVsxXSAmICgxIDw8IDMxKSA/CisJCSAgIm1vbm8gcGF0dGVybiB0cmFuc3BhcmVuY3kgZW5hYmxlZCwgIiA6ICIiKTsKKworfQorCitzdGF0aWMgaW50CitkZWNvZGVfMmQoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCkKK3sKKwl1bnNpZ25lZCBpbnQgb3Bjb2RlLCBsZW47CisJdWludDMyX3QgKmRhdGEgPSBjdHgtPmRhdGE7CisKKwlzdHJ1Y3QgeworCQl1aW50MzJfdCBvcGNvZGU7CisJCXVuc2lnbmVkIGludCBtaW5fbGVuOworCQl1bnNpZ25lZCBpbnQgbWF4X2xlbjsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwl9IG9wY29kZXNfMmRbXSA9IHsKKwkJeyAweDQwLCA1LCA1LCAiQ09MT1JfQkxUIiB9LAorCQl7IDB4NDMsIDYsIDYsICJTUkNfQ09QWV9CTFQiIH0sCisJCXsgMHgwMSwgOCwgOCwgIlhZX1NFVFVQX0JMVCIgfSwKKwkJeyAweDExLCA5LCA5LCAiWFlfU0VUVVBfTU9OT19QQVRURVJOX1NMX0JMVCIgfSwKKwkJeyAweDAzLCAzLCAzLCAiWFlfU0VUVVBfQ0xJUF9CTFQiIH0sCisJCXsgMHgyNCwgMiwgMiwgIlhZX1BJWEVMX0JMVCIgfSwKKwkJeyAweDI1LCAzLCAzLCAiWFlfU0NBTkxJTkVTX0JMVCIgfSwKKwkJeyAweDI2LCA0LCA0LCAiWV9URVhUX0JMVCIgfSwKKwkJeyAweDMxLCA1LCAxMzQsICJYWV9URVhUX0lNTUVESUFURV9CTFQiIH0sCisJCXsgMHg1MCwgNiwgNiwgIlhZX0NPTE9SX0JMVCIgfSwKKwkJeyAweDUxLCA2LCA2LCAiWFlfUEFUX0JMVCIgfSwKKwkJeyAweDc2LCA4LCA4LCAiWFlfUEFUX0NIUk9NQV9CTFQiIH0sCisJCXsgMHg3MiwgNywgMTM1LCAiWFlfUEFUX0JMVF9JTU1FRElBVEUiIH0sCisJCXsgMHg3NywgOSwgMTM3LCAiWFlfUEFUX0NIUk9NQV9CTFRfSU1NRURJQVRFIiB9LAorCQl7IDB4NTIsIDksIDksICJYWV9NT05PX1BBVF9CTFQiIH0sCisJCXsgMHg1OSwgNywgNywgIlhZX01PTk9fUEFUX0ZJWEVEX0JMVCIgfSwKKwkJeyAweDUzLCA4LCA4LCAiWFlfU1JDX0NPUFlfQkxUIiB9LAorCQl7IDB4NTQsIDgsIDgsICJYWV9NT05PX1NSQ19DT1BZX0JMVCIgfSwKKwkJeyAweDcxLCA5LCAxMzcsICJYWV9NT05PX1NSQ19DT1BZX0lNTUVESUFURV9CTFQiIH0sCisJCXsgMHg1NSwgOSwgOSwgIlhZX0ZVTExfQkxUIiB9LAorCQl7IDB4NTUsIDksIDEzNywgIlhZX0ZVTExfSU1NRURJQVRFX1BBVFRFUk5fQkxUIiB9LAorCQl7IDB4NTYsIDksIDksICJYWV9GVUxMX01PTk9fU1JDX0JMVCIgfSwKKwkJeyAweDc1LCAxMCwgMTM4LCAiWFlfRlVMTF9NT05PX1NSQ19JTU1FRElBVEVfUEFUVEVSTl9CTFQiIH0sCisJCXsgMHg1NywgMTIsIDEyLCAiWFlfRlVMTF9NT05PX1BBVFRFUk5fQkxUIiB9LAorCQl7IDB4NTgsIDEyLCAxMiwgIlhZX0ZVTExfTU9OT19QQVRURVJOX01PTk9fU1JDX0JMVCJ9LAorCX07CisKKwlzd2l0Y2ggKChkYXRhWzBdICYgMHgxZmMwMDAwMCkgPj4gMjIpIHsKKwljYXNlIDB4MjU6CisJCWluc3RyX291dChjdHgsIDAsCisJCQkgICJYWV9TQ0FOTElORVNfQkxUIChwYXR0ZXJuIHNlZWQgKCVkLCAlZCksIGRzdCB0aWxlICVkKVxuIiwKKwkJCSAgKGRhdGFbMF0gPj4gMTIpICYgMHg4LAorCQkJICAoZGF0YVswXSA+PiA4KSAmIDB4OCwgKGRhdGFbMF0gPj4gMTEpICYgMSk7CisKKwkJbGVuID0gKGRhdGFbMF0gJiAweDAwMDAwMGZmKSArIDI7CisJCWlmIChsZW4gIT0gMykKKwkJCWZwcmludGYob3V0LCAiQmFkIGNvdW50IGluIFhZX1NDQU5MSU5FU19CTFRcbiIpOworCisJCWluc3RyX291dChjdHgsIDEsICJkZXN0ICglZCwlZClcbiIsCisJCQkgIGRhdGFbMV0gJiAweGZmZmYsIGRhdGFbMV0gPj4gMTYpOworCQlpbnN0cl9vdXQoY3R4LCAyLCAiZGVzdCAoJWQsJWQpXG4iLAorCQkJICBkYXRhWzJdICYgMHhmZmZmLCBkYXRhWzJdID4+IDE2KTsKKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4MDE6CisJCWRlY29kZV8yZF9icjAwKGN0eCwgIlhZX1NFVFVQX0JMVCIpOworCisJCWxlbiA9IChkYXRhWzBdICYgMHgwMDAwMDBmZikgKyAyOworCQlpZiAobGVuICE9IDgpCisJCQlmcHJpbnRmKG91dCwgIkJhZCBjb3VudCBpbiBYWV9TRVRVUF9CTFRcbiIpOworCisJCWRlY29kZV8yZF9icjAxKGN0eCk7CisJCWluc3RyX291dChjdHgsIDIsICJjbGlwcmVjdCAoJWQsJWQpXG4iLAorCQkJICBkYXRhWzJdICYgMHhmZmZmLCBkYXRhWzJdID4+IDE2KTsKKwkJaW5zdHJfb3V0KGN0eCwgMywgImNsaXByZWN0ICglZCwlZClcbiIsCisJCQkgIGRhdGFbM10gJiAweGZmZmYsIGRhdGFbM10gPj4gMTYpOworCQlpbnN0cl9vdXQoY3R4LCA0LCAic2V0dXAgZHN0IG9mZnNldCAweCUwOHhcbiIsCisJCQkgIGRhdGFbNF0pOworCQlpbnN0cl9vdXQoY3R4LCA1LCAic2V0dXAgYmFja2dyb3VuZCBjb2xvclxuIik7CisJCWluc3RyX291dChjdHgsIDYsICJzZXR1cCBmb3JlZ3JvdW5kIGNvbG9yXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgNywgImNvbG9yIHBhdHRlcm4gb2Zmc2V0XG4iKTsKKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4MDM6CisJCWRlY29kZV8yZF9icjAwKGN0eCwgIlhZX1NFVFVQX0NMSVBfQkxUIik7CisKKwkJbGVuID0gKGRhdGFbMF0gJiAweDAwMDAwMGZmKSArIDI7CisJCWlmIChsZW4gIT0gMykKKwkJCWZwcmludGYob3V0LCAiQmFkIGNvdW50IGluIFhZX1NFVFVQX0NMSVBfQkxUXG4iKTsKKworCQlpbnN0cl9vdXQoY3R4LCAxLCAiY2xpcHJlY3QgKCVkLCVkKVxuIiwKKwkJCSAgZGF0YVsxXSAmIDB4ZmZmZiwgZGF0YVsyXSA+PiAxNik7CisJCWluc3RyX291dChjdHgsIDIsICJjbGlwcmVjdCAoJWQsJWQpXG4iLAorCQkJICBkYXRhWzJdICYgMHhmZmZmLCBkYXRhWzNdID4+IDE2KTsKKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4MTE6CisJCWRlY29kZV8yZF9icjAwKGN0eCwgIlhZX1NFVFVQX01PTk9fUEFUVEVSTl9TTF9CTFQiKTsKKworCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwZmYpICsgMjsKKwkJaWYgKGxlbiAhPSA5KQorCQkJZnByaW50ZihvdXQsCisJCQkJIkJhZCBjb3VudCBpbiBYWV9TRVRVUF9NT05PX1BBVFRFUk5fU0xfQkxUXG4iKTsKKworCQlkZWNvZGVfMmRfYnIwMShjdHgpOworCQlpbnN0cl9vdXQoY3R4LCAyLCAiY2xpcHJlY3QgKCVkLCVkKVxuIiwKKwkJCSAgZGF0YVsyXSAmIDB4ZmZmZiwgZGF0YVsyXSA+PiAxNik7CisJCWluc3RyX291dChjdHgsIDMsICJjbGlwcmVjdCAoJWQsJWQpXG4iLAorCQkJICBkYXRhWzNdICYgMHhmZmZmLCBkYXRhWzNdID4+IDE2KTsKKwkJaW5zdHJfb3V0KGN0eCwgNCwgInNldHVwIGRzdCBvZmZzZXQgMHglMDh4XG4iLAorCQkJICBkYXRhWzRdKTsKKwkJaW5zdHJfb3V0KGN0eCwgNSwgInNldHVwIGJhY2tncm91bmQgY29sb3JcbiIpOworCQlpbnN0cl9vdXQoY3R4LCA2LCAic2V0dXAgZm9yZWdyb3VuZCBjb2xvclxuIik7CisJCWluc3RyX291dChjdHgsIDcsICJtb25vIHBhdHRlcm4gZHcwXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgOCwgIm1vbm8gcGF0dGVybiBkdzFcbiIpOworCQlyZXR1cm4gbGVuOworCWNhc2UgMHg1MDoKKwkJZGVjb2RlXzJkX2JyMDAoY3R4LCAiWFlfQ09MT1JfQkxUIik7CisKKwkJbGVuID0gKGRhdGFbMF0gJiAweDAwMDAwMGZmKSArIDI7CisJCWlmIChsZW4gIT0gNikKKwkJCWZwcmludGYob3V0LCAiQmFkIGNvdW50IGluIFhZX0NPTE9SX0JMVFxuIik7CisKKwkJZGVjb2RlXzJkX2JyMDEoY3R4KTsKKwkJaW5zdHJfb3V0KGN0eCwgMiwgIiglZCwlZClcbiIsCisJCQkgIGRhdGFbMl0gJiAweGZmZmYsIGRhdGFbMl0gPj4gMTYpOworCQlpbnN0cl9vdXQoY3R4LCAzLCAiKCVkLCVkKVxuIiwKKwkJCSAgZGF0YVszXSAmIDB4ZmZmZiwgZGF0YVszXSA+PiAxNik7CisJCWluc3RyX291dChjdHgsIDQsICJvZmZzZXQgMHglMDh4XG4iLCBkYXRhWzRdKTsKKwkJaW5zdHJfb3V0KGN0eCwgNSwgImNvbG9yXG4iKTsKKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4NTM6CisJCWRlY29kZV8yZF9icjAwKGN0eCwgIlhZX1NSQ19DT1BZX0JMVCIpOworCisJCWxlbiA9IChkYXRhWzBdICYgMHgwMDAwMDBmZikgKyAyOworCQlpZiAobGVuICE9IDgpCisJCQlmcHJpbnRmKG91dCwgIkJhZCBjb3VudCBpbiBYWV9TUkNfQ09QWV9CTFRcbiIpOworCisJCWRlY29kZV8yZF9icjAxKGN0eCk7CisJCWluc3RyX291dChjdHgsIDIsICJkc3QgKCVkLCVkKVxuIiwKKwkJCSAgZGF0YVsyXSAmIDB4ZmZmZiwgZGF0YVsyXSA+PiAxNik7CisJCWluc3RyX291dChjdHgsIDMsICJkc3QgKCVkLCVkKVxuIiwKKwkJCSAgZGF0YVszXSAmIDB4ZmZmZiwgZGF0YVszXSA+PiAxNik7CisJCWluc3RyX291dChjdHgsIDQsICJkc3Qgb2Zmc2V0IDB4JTA4eFxuIiwgZGF0YVs0XSk7CisJCWluc3RyX291dChjdHgsIDUsICJzcmMgKCVkLCVkKVxuIiwKKwkJCSAgZGF0YVs1XSAmIDB4ZmZmZiwgZGF0YVs1XSA+PiAxNik7CisJCWluc3RyX291dChjdHgsIDYsICJzcmMgcGl0Y2ggJWRcbiIsCisJCQkgIChzaG9ydCkoZGF0YVs2XSAmIDB4ZmZmZikpOworCQlpbnN0cl9vdXQoY3R4LCA3LCAic3JjIG9mZnNldCAweCUwOHhcbiIsIGRhdGFbN10pOworCQlyZXR1cm4gbGVuOworCX0KKworCWZvciAob3Bjb2RlID0gMDsgb3Bjb2RlIDwgc2l6ZW9mKG9wY29kZXNfMmQpIC8gc2l6ZW9mKG9wY29kZXNfMmRbMF0pOworCSAgICAgb3Bjb2RlKyspIHsKKwkJaWYgKChkYXRhWzBdICYgMHgxZmMwMDAwMCkgPj4gMjIgPT0gb3Bjb2Rlc18yZFtvcGNvZGVdLm9wY29kZSkgeworCQkJdW5zaWduZWQgaW50IGk7CisKKwkJCWxlbiA9IDE7CisJCQlpbnN0cl9vdXQoY3R4LCAwLCAiJXNcbiIsCisJCQkJICBvcGNvZGVzXzJkW29wY29kZV0ubmFtZSk7CisJCQlpZiAob3Bjb2Rlc18yZFtvcGNvZGVdLm1heF9sZW4gPiAxKSB7CisJCQkJbGVuID0gKGRhdGFbMF0gJiAweDAwMDAwMGZmKSArIDI7CisJCQkJaWYgKGxlbiA8IG9wY29kZXNfMmRbb3Bjb2RlXS5taW5fbGVuIHx8CisJCQkJICAgIGxlbiA+IG9wY29kZXNfMmRbb3Bjb2RlXS5tYXhfbGVuKSB7CisJCQkJCWZwcmludGYob3V0LCAiQmFkIGNvdW50IGluICVzXG4iLAorCQkJCQkJb3Bjb2Rlc18yZFtvcGNvZGVdLm5hbWUpOworCQkJCX0KKwkJCX0KKworCQkJZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKSB7CisJCQkJaW5zdHJfb3V0KGN0eCwgaSwgImR3b3JkICVkXG4iLCBpKTsKKwkJCX0KKworCQkJcmV0dXJuIGxlbjsKKwkJfQorCX0KKworCWluc3RyX291dChjdHgsIDAsICIyRCBVTktOT1dOXG4iKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorZGVjb2RlXzNkXzFjKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJdWludDMyX3QgKmRhdGEgPSBjdHgtPmRhdGE7CisJdWludDMyX3Qgb3Bjb2RlOworCisJb3Bjb2RlID0gKGRhdGFbMF0gJiAweDAwZjgwMDAwKSA+PiAxOTsKKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSAweDExOgorCQlpbnN0cl9vdXQoY3R4LCAwLAorCQkJICAiM0RTVEFURV9ERVBUSF9TVUJSRUNUQU5HTEVfRElTQUJMRVxuIik7CisJCXJldHVybiAxOworCWNhc2UgMHgxMDoKKwkJaW5zdHJfb3V0KGN0eCwgMCwgIjNEU1RBVEVfU0NJU1NPUl9FTkFCTEUgJXNcbiIsCisJCQkgIGRhdGFbMF0gJiAxID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJCXJldHVybiAxOworCWNhc2UgMHgwMToKKwkJaW5zdHJfb3V0KGN0eCwgMCwgIjNEU1RBVEVfTUFQX0NPT1JEX1NFVF9JODMwXG4iKTsKKwkJcmV0dXJuIDE7CisJY2FzZSAweDBhOgorCQlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9NQVBfQ1VCRV9JODMwXG4iKTsKKwkJcmV0dXJuIDE7CisJY2FzZSAweDA1OgorCQlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9NQVBfVEVYX1NUUkVBTV9JODMwXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaW5zdHJfb3V0KGN0eCwgMCwgIjNEIFVOS05PV046IDNkXzFjIG9wY29kZSA9IDB4JXhcbiIsCisJCSAgb3Bjb2RlKTsKKwlyZXR1cm4gMTsKK30KKworLyoqIFNldHMgdGhlIHN0cmluZyBkc3RuYW1lIHRvIGRlc2NyaWJlIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgUFMgaW5zdHJ1Y3Rpb24gKi8KK3N0YXRpYyB2b2lkCitpOTE1X2dldF9pbnN0cnVjdGlvbl9kc3QodWludDMyX3QgKmRhdGEsIGludCBpLCBjaGFyICpkc3RuYW1lLCBpbnQgZG9fbWFzaykKK3sKKwl1aW50MzJfdCBhMCA9IGRhdGFbaV07CisJaW50IGRzdF9uciA9IChhMCA+PiAxNCkgJiAweGY7CisJY2hhciBkc3RtYXNrWzhdOworCWNvbnN0IGNoYXIgKnNhdDsKKworCWlmIChkb19tYXNrKSB7CisJCWlmICgoKGEwID4+IDEwKSAmIDB4ZikgPT0gMHhmKSB7CisJCQlkc3RtYXNrWzBdID0gMDsKKwkJfSBlbHNlIHsKKwkJCWludCBkc3RtYXNrX2luZGV4ID0gMDsKKworCQkJZHN0bWFza1tkc3RtYXNrX2luZGV4KytdID0gJy4nOworCQkJaWYgKGEwICYgKDEgPDwgMTApKQorCQkJCWRzdG1hc2tbZHN0bWFza19pbmRleCsrXSA9ICd4JzsKKwkJCWlmIChhMCAmICgxIDw8IDExKSkKKwkJCQlkc3RtYXNrW2RzdG1hc2tfaW5kZXgrK10gPSAneSc7CisJCQlpZiAoYTAgJiAoMSA8PCAxMikpCisJCQkJZHN0bWFza1tkc3RtYXNrX2luZGV4KytdID0gJ3onOworCQkJaWYgKGEwICYgKDEgPDwgMTMpKQorCQkJCWRzdG1hc2tbZHN0bWFza19pbmRleCsrXSA9ICd3JzsKKwkJCWRzdG1hc2tbZHN0bWFza19pbmRleCsrXSA9IDA7CisJCX0KKworCQlpZiAoYTAgJiAoMSA8PCAyMikpCisJCQlzYXQgPSAiLnNhdCI7CisJCWVsc2UKKwkJCXNhdCA9ICIiOworCX0gZWxzZSB7CisJCWRzdG1hc2tbMF0gPSAwOworCQlzYXQgPSAiIjsKKwl9CisKKwlzd2l0Y2ggKChhMCA+PiAxOSkgJiAweDcpIHsKKwljYXNlIDA6CisJCWlmIChkc3RfbnIgPiAxNSkKKwkJCWZwcmludGYob3V0LCAiYmFkIGRlc3RpbmF0aW9uIHJlZyBSJWRcbiIsIGRzdF9ucik7CisJCXNwcmludGYoZHN0bmFtZSwgIlIlZCVzJXMiLCBkc3RfbnIsIGRzdG1hc2ssIHNhdCk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJaWYgKGRzdF9uciA+IDApCisJCQlmcHJpbnRmKG91dCwgImJhZCBkZXN0aW5hdGlvbiByZWcgb0MlZFxuIiwgZHN0X25yKTsKKwkJc3ByaW50Zihkc3RuYW1lLCAib0MlcyVzIiwgZHN0bWFzaywgc2F0KTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlpZiAoZHN0X25yID4gMCkKKwkJCWZwcmludGYob3V0LCAiYmFkIGRlc3RpbmF0aW9uIHJlZyBvRCVkXG4iLCBkc3RfbnIpOworCQlzcHJpbnRmKGRzdG5hbWUsICJvRCVzJXMiLCBkc3RtYXNrLCBzYXQpOworCQlicmVhazsKKwljYXNlIDY6CisJCWlmIChkc3RfbnIgPiAzKQorCQkJZnByaW50ZihvdXQsICJiYWQgZGVzdGluYXRpb24gcmVnIFUlZFxuIiwgZHN0X25yKTsKKwkJc3ByaW50Zihkc3RuYW1lLCAiVSVkJXMlcyIsIGRzdF9uciwgZHN0bWFzaywgc2F0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3ByaW50Zihkc3RuYW1lLCAiUkVTRVJWRUQiKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitpOTE1X2dldF9jaGFubmVsX3N3aXp6bGUodWludDMyX3Qgc2VsZWN0KQoreworCXN3aXRjaCAoc2VsZWN0ICYgMHg3KSB7CisJY2FzZSAwOgorCQlyZXR1cm4gKHNlbGVjdCAmIDgpID8gIi14IiA6ICJ4IjsKKwljYXNlIDE6CisJCXJldHVybiAoc2VsZWN0ICYgOCkgPyAiLXkiIDogInkiOworCWNhc2UgMjoKKwkJcmV0dXJuIChzZWxlY3QgJiA4KSA/ICIteiIgOiAieiI7CisJY2FzZSAzOgorCQlyZXR1cm4gKHNlbGVjdCAmIDgpID8gIi13IiA6ICJ3IjsKKwljYXNlIDQ6CisJCXJldHVybiAoc2VsZWN0ICYgOCkgPyAiLTAiIDogIjAiOworCWNhc2UgNToKKwkJcmV0dXJuIChzZWxlY3QgJiA4KSA/ICItMSIgOiAiMSI7CisJZGVmYXVsdDoKKwkJcmV0dXJuIChzZWxlY3QgJiA4KSA/ICItYmFkIiA6ICJiYWQiOworCX0KK30KKworc3RhdGljIHZvaWQKK2k5MTVfZ2V0X2luc3RydWN0aW9uX3NyY19uYW1lKHVpbnQzMl90IHNyY190eXBlLCB1aW50MzJfdCBzcmNfbnIsIGNoYXIgKm5hbWUpCit7CisJc3dpdGNoIChzcmNfdHlwZSkgeworCWNhc2UgMDoKKwkJc3ByaW50ZihuYW1lLCAiUiVkIiwgc3JjX25yKTsKKwkJaWYgKHNyY19uciA+IDE1KQorCQkJZnByaW50ZihvdXQsICJiYWQgc3JjIHJlZyAlc1xuIiwgbmFtZSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaWYgKHNyY19uciA8IDgpCisJCQlzcHJpbnRmKG5hbWUsICJUJWQiLCBzcmNfbnIpOworCQllbHNlIGlmIChzcmNfbnIgPT0gOCkKKwkJCXNwcmludGYobmFtZSwgIkRJRkZVU0UiKTsKKwkJZWxzZSBpZiAoc3JjX25yID09IDkpCisJCQlzcHJpbnRmKG5hbWUsICJTUEVDVUxBUiIpOworCQllbHNlIGlmIChzcmNfbnIgPT0gMTApCisJCQlzcHJpbnRmKG5hbWUsICJGT0ciKTsKKwkJZWxzZSB7CisJCQlmcHJpbnRmKG91dCwgImJhZCBzcmMgcmVnIFQlZFxuIiwgc3JjX25yKTsKKwkJCXNwcmludGYobmFtZSwgIlJFU0VSVkVEIik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzcHJpbnRmKG5hbWUsICJDJWQiLCBzcmNfbnIpOworCQlpZiAoc3JjX25yID4gMzEpCisJCQlmcHJpbnRmKG91dCwgImJhZCBzcmMgcmVnICVzXG4iLCBuYW1lKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlzcHJpbnRmKG5hbWUsICJvQyIpOworCQlpZiAoc3JjX25yID4gMCkKKwkJCWZwcmludGYob3V0LCAiYmFkIHNyYyByZWcgb0MlZFxuIiwgc3JjX25yKTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlzcHJpbnRmKG5hbWUsICJvRCIpOworCQlpZiAoc3JjX25yID4gMCkKKwkJCWZwcmludGYob3V0LCAiYmFkIHNyYyByZWcgb0QlZFxuIiwgc3JjX25yKTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlzcHJpbnRmKG5hbWUsICJVJWQiLCBzcmNfbnIpOworCQlpZiAoc3JjX25yID4gMykKKwkJCWZwcmludGYob3V0LCAiYmFkIHNyYyByZWcgJXNcbiIsIG5hbWUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKG91dCwgImJhZCBzcmMgcmVnIHR5cGUgJWRcbiIsIHNyY190eXBlKTsKKwkJc3ByaW50ZihuYW1lLCAiUkVTRVJWRUQiKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBpOTE1X2dldF9pbnN0cnVjdGlvbl9zcmMwKHVpbnQzMl90ICpkYXRhLCBpbnQgaSwgY2hhciAqc3JjbmFtZSkKK3sKKwl1aW50MzJfdCBhMCA9IGRhdGFbaV07CisJdWludDMyX3QgYTEgPSBkYXRhW2kgKyAxXTsKKwlpbnQgc3JjX25yID0gKGEwID4+IDIpICYgMHgxZjsKKwljb25zdCBjaGFyICpzd2l6emxlX3ggPSBpOTE1X2dldF9jaGFubmVsX3N3aXp6bGUoKGExID4+IDI4KSAmIDB4Zik7CisJY29uc3QgY2hhciAqc3dpenpsZV95ID0gaTkxNV9nZXRfY2hhbm5lbF9zd2l6emxlKChhMSA+PiAyNCkgJiAweGYpOworCWNvbnN0IGNoYXIgKnN3aXp6bGVfeiA9IGk5MTVfZ2V0X2NoYW5uZWxfc3dpenpsZSgoYTEgPj4gMjApICYgMHhmKTsKKwljb25zdCBjaGFyICpzd2l6emxlX3cgPSBpOTE1X2dldF9jaGFubmVsX3N3aXp6bGUoKGExID4+IDE2KSAmIDB4Zik7CisJY2hhciBzd2l6emxlWzEwMF07CisKKwlpOTE1X2dldF9pbnN0cnVjdGlvbl9zcmNfbmFtZSgoYTAgPj4gNykgJiAweDcsIHNyY19uciwgc3JjbmFtZSk7CisJc3ByaW50Zihzd2l6emxlLCAiLiVzJXMlcyVzIiwgc3dpenpsZV94LCBzd2l6emxlX3ksIHN3aXp6bGVfeiwKKwkJc3dpenpsZV93KTsKKwlpZiAoc3RyY21wKHN3aXp6bGUsICIueHl6dyIpICE9IDApCisJCXN0cmNhdChzcmNuYW1lLCBzd2l6emxlKTsKK30KKworc3RhdGljIHZvaWQgaTkxNV9nZXRfaW5zdHJ1Y3Rpb25fc3JjMSh1aW50MzJfdCAqZGF0YSwgaW50IGksIGNoYXIgKnNyY25hbWUpCit7CisJdWludDMyX3QgYTEgPSBkYXRhW2kgKyAxXTsKKwl1aW50MzJfdCBhMiA9IGRhdGFbaSArIDJdOworCWludCBzcmNfbnIgPSAoYTEgPj4gOCkgJiAweDFmOworCWNvbnN0IGNoYXIgKnN3aXp6bGVfeCA9IGk5MTVfZ2V0X2NoYW5uZWxfc3dpenpsZSgoYTEgPj4gNCkgJiAweGYpOworCWNvbnN0IGNoYXIgKnN3aXp6bGVfeSA9IGk5MTVfZ2V0X2NoYW5uZWxfc3dpenpsZSgoYTEgPj4gMCkgJiAweGYpOworCWNvbnN0IGNoYXIgKnN3aXp6bGVfeiA9IGk5MTVfZ2V0X2NoYW5uZWxfc3dpenpsZSgoYTIgPj4gMjgpICYgMHhmKTsKKwljb25zdCBjaGFyICpzd2l6emxlX3cgPSBpOTE1X2dldF9jaGFubmVsX3N3aXp6bGUoKGEyID4+IDI0KSAmIDB4Zik7CisJY2hhciBzd2l6emxlWzEwMF07CisKKwlpOTE1X2dldF9pbnN0cnVjdGlvbl9zcmNfbmFtZSgoYTEgPj4gMTMpICYgMHg3LCBzcmNfbnIsIHNyY25hbWUpOworCXNwcmludGYoc3dpenpsZSwgIi4lcyVzJXMlcyIsIHN3aXp6bGVfeCwgc3dpenpsZV95LCBzd2l6emxlX3osCisJCXN3aXp6bGVfdyk7CisJaWYgKHN0cmNtcChzd2l6emxlLCAiLnh5enciKSAhPSAwKQorCQlzdHJjYXQoc3JjbmFtZSwgc3dpenpsZSk7Cit9CisKK3N0YXRpYyB2b2lkIGk5MTVfZ2V0X2luc3RydWN0aW9uX3NyYzIodWludDMyX3QgKmRhdGEsIGludCBpLCBjaGFyICpzcmNuYW1lKQoreworCXVpbnQzMl90IGEyID0gZGF0YVtpICsgMl07CisJaW50IHNyY19uciA9IChhMiA+PiAxNikgJiAweDFmOworCWNvbnN0IGNoYXIgKnN3aXp6bGVfeCA9IGk5MTVfZ2V0X2NoYW5uZWxfc3dpenpsZSgoYTIgPj4gMTIpICYgMHhmKTsKKwljb25zdCBjaGFyICpzd2l6emxlX3kgPSBpOTE1X2dldF9jaGFubmVsX3N3aXp6bGUoKGEyID4+IDgpICYgMHhmKTsKKwljb25zdCBjaGFyICpzd2l6emxlX3ogPSBpOTE1X2dldF9jaGFubmVsX3N3aXp6bGUoKGEyID4+IDQpICYgMHhmKTsKKwljb25zdCBjaGFyICpzd2l6emxlX3cgPSBpOTE1X2dldF9jaGFubmVsX3N3aXp6bGUoKGEyID4+IDApICYgMHhmKTsKKwljaGFyIHN3aXp6bGVbMTAwXTsKKworCWk5MTVfZ2V0X2luc3RydWN0aW9uX3NyY19uYW1lKChhMiA+PiAyMSkgJiAweDcsIHNyY19uciwgc3JjbmFtZSk7CisJc3ByaW50Zihzd2l6emxlLCAiLiVzJXMlcyVzIiwgc3dpenpsZV94LCBzd2l6emxlX3ksIHN3aXp6bGVfeiwKKwkJc3dpenpsZV93KTsKKwlpZiAoc3RyY21wKHN3aXp6bGUsICIueHl6dyIpICE9IDApCisJCXN0cmNhdChzcmNuYW1lLCBzd2l6emxlKTsKK30KKworc3RhdGljIHZvaWQKK2k5MTVfZ2V0X2luc3RydWN0aW9uX2FkZHIodWludDMyX3Qgc3JjX3R5cGUsIHVpbnQzMl90IHNyY19uciwgY2hhciAqbmFtZSkKK3sKKwlzd2l0Y2ggKHNyY190eXBlKSB7CisJY2FzZSAwOgorCQlzcHJpbnRmKG5hbWUsICJSJWQiLCBzcmNfbnIpOworCQlpZiAoc3JjX25yID4gMTUpCisJCQlmcHJpbnRmKG91dCwgImJhZCBzcmMgcmVnICVzXG4iLCBuYW1lKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpZiAoc3JjX25yIDwgOCkKKwkJCXNwcmludGYobmFtZSwgIlQlZCIsIHNyY19ucik7CisJCWVsc2UgaWYgKHNyY19uciA9PSA4KQorCQkJc3ByaW50ZihuYW1lLCAiRElGRlVTRSIpOworCQllbHNlIGlmIChzcmNfbnIgPT0gOSkKKwkJCXNwcmludGYobmFtZSwgIlNQRUNVTEFSIik7CisJCWVsc2UgaWYgKHNyY19uciA9PSAxMCkKKwkJCXNwcmludGYobmFtZSwgIkZPRyIpOworCQllbHNlIHsKKwkJCWZwcmludGYob3V0LCAiYmFkIHNyYyByZWcgVCVkXG4iLCBzcmNfbnIpOworCQkJc3ByaW50ZihuYW1lLCAiUkVTRVJWRUQiKTsKKwkJfQorCQlicmVhazsKKwljYXNlIDQ6CisJCXNwcmludGYobmFtZSwgIm9DIik7CisJCWlmIChzcmNfbnIgPiAwKQorCQkJZnByaW50ZihvdXQsICJiYWQgc3JjIHJlZyBvQyVkXG4iLCBzcmNfbnIpOworCQlicmVhazsKKwljYXNlIDU6CisJCXNwcmludGYobmFtZSwgIm9EIik7CisJCWlmIChzcmNfbnIgPiAwKQorCQkJZnByaW50ZihvdXQsICJiYWQgc3JjIHJlZyBvRCVkXG4iLCBzcmNfbnIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKG91dCwgImJhZCBzcmMgcmVnIHR5cGUgJWRcbiIsIHNyY190eXBlKTsKKwkJc3ByaW50ZihuYW1lLCAiUkVTRVJWRUQiKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAoraTkxNV9kZWNvZGVfYWx1MShzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4LAorCQkgaW50IGksIGNoYXIgKmluc3RyX3ByZWZpeCwgY29uc3QgY2hhciAqb3BfbmFtZSkKK3sKKwljaGFyIGRzdFsxMDBdLCBzcmMwWzEwMF07CisKKwlpOTE1X2dldF9pbnN0cnVjdGlvbl9kc3QoY3R4LT5kYXRhLCBpLCBkc3QsIDEpOworCWk5MTVfZ2V0X2luc3RydWN0aW9uX3NyYzAoY3R4LT5kYXRhLCBpLCBzcmMwKTsKKworCWluc3RyX291dChjdHgsIGkrKywgIiVzOiAlcyAlcywgJXNcbiIsIGluc3RyX3ByZWZpeCwKKwkJICBvcF9uYW1lLCBkc3QsIHNyYzApOworCWluc3RyX291dChjdHgsIGkrKywgIiVzXG4iLCBpbnN0cl9wcmVmaXgpOworCWluc3RyX291dChjdHgsIGkrKywgIiVzXG4iLCBpbnN0cl9wcmVmaXgpOworfQorCitzdGF0aWMgdm9pZAoraTkxNV9kZWNvZGVfYWx1MihzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4LAorCQkgaW50IGksIGNoYXIgKmluc3RyX3ByZWZpeCwgY29uc3QgY2hhciAqb3BfbmFtZSkKK3sKKwljaGFyIGRzdFsxMDBdLCBzcmMwWzEwMF0sIHNyYzFbMTAwXTsKKworCWk5MTVfZ2V0X2luc3RydWN0aW9uX2RzdChjdHgtPmRhdGEsIGksIGRzdCwgMSk7CisJaTkxNV9nZXRfaW5zdHJ1Y3Rpb25fc3JjMChjdHgtPmRhdGEsIGksIHNyYzApOworCWk5MTVfZ2V0X2luc3RydWN0aW9uX3NyYzEoY3R4LT5kYXRhLCBpLCBzcmMxKTsKKworCWluc3RyX291dChjdHgsIGkrKywgIiVzOiAlcyAlcywgJXMsICVzXG4iLCBpbnN0cl9wcmVmaXgsCisJCSAgb3BfbmFtZSwgZHN0LCBzcmMwLCBzcmMxKTsKKwlpbnN0cl9vdXQoY3R4LCBpKyssICIlc1xuIiwgaW5zdHJfcHJlZml4KTsKKwlpbnN0cl9vdXQoY3R4LCBpKyssICIlc1xuIiwgaW5zdHJfcHJlZml4KTsKK30KKworc3RhdGljIHZvaWQKK2k5MTVfZGVjb2RlX2FsdTMoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCwKKwkJIGludCBpLCBjaGFyICppbnN0cl9wcmVmaXgsIGNvbnN0IGNoYXIgKm9wX25hbWUpCit7CisJY2hhciBkc3RbMTAwXSwgc3JjMFsxMDBdLCBzcmMxWzEwMF0sIHNyYzJbMTAwXTsKKworCWk5MTVfZ2V0X2luc3RydWN0aW9uX2RzdChjdHgtPmRhdGEsIGksIGRzdCwgMSk7CisJaTkxNV9nZXRfaW5zdHJ1Y3Rpb25fc3JjMChjdHgtPmRhdGEsIGksIHNyYzApOworCWk5MTVfZ2V0X2luc3RydWN0aW9uX3NyYzEoY3R4LT5kYXRhLCBpLCBzcmMxKTsKKwlpOTE1X2dldF9pbnN0cnVjdGlvbl9zcmMyKGN0eC0+ZGF0YSwgaSwgc3JjMik7CisKKwlpbnN0cl9vdXQoY3R4LCBpKyssICIlczogJXMgJXMsICVzLCAlcywgJXNcbiIsIGluc3RyX3ByZWZpeCwKKwkJICBvcF9uYW1lLCBkc3QsIHNyYzAsIHNyYzEsIHNyYzIpOworCWluc3RyX291dChjdHgsIGkrKywgIiVzXG4iLCBpbnN0cl9wcmVmaXgpOworCWluc3RyX291dChjdHgsIGkrKywgIiVzXG4iLCBpbnN0cl9wcmVmaXgpOworfQorCitzdGF0aWMgdm9pZAoraTkxNV9kZWNvZGVfdGV4KHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgsIGludCBpLAorCQljb25zdCBjaGFyICppbnN0cl9wcmVmaXgsIGNvbnN0IGNoYXIgKnRleF9uYW1lKQoreworCXVpbnQzMl90IHQwID0gY3R4LT5kYXRhW2ldOworCXVpbnQzMl90IHQxID0gY3R4LT5kYXRhW2kgKyAxXTsKKwljaGFyIGRzdF9uYW1lWzEwMF07CisJY2hhciBhZGRyX25hbWVbMTAwXTsKKwlpbnQgc2FtcGxlcl9ucjsKKworCWk5MTVfZ2V0X2luc3RydWN0aW9uX2RzdChjdHgtPmRhdGEsIGksIGRzdF9uYW1lLCAwKTsKKwlpOTE1X2dldF9pbnN0cnVjdGlvbl9hZGRyKCh0MSA+PiAyNCkgJiAweDcsCisJCQkJICAodDEgPj4gMTcpICYgMHhmLCBhZGRyX25hbWUpOworCXNhbXBsZXJfbnIgPSB0MCAmIDB4ZjsKKworCWluc3RyX291dChjdHgsIGkrKywgIiVzOiAlcyAlcywgUyVkLCAlc1xuIiwgaW5zdHJfcHJlZml4LAorCQkgIHRleF9uYW1lLCBkc3RfbmFtZSwgc2FtcGxlcl9uciwgYWRkcl9uYW1lKTsKKwlpbnN0cl9vdXQoY3R4LCBpKyssICIlc1xuIiwgaW5zdHJfcHJlZml4KTsKKwlpbnN0cl9vdXQoY3R4LCBpKyssICIlc1xuIiwgaW5zdHJfcHJlZml4KTsKK30KKworc3RhdGljIHZvaWQKK2k5MTVfZGVjb2RlX2RjbChzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4LCBpbnQgaSwgY2hhciAqaW5zdHJfcHJlZml4KQoreworCXVpbnQzMl90IGQwID0gY3R4LT5kYXRhW2ldOworCWNvbnN0IGNoYXIgKnNhbXBsZXR5cGU7CisJaW50IGRjbF9uciA9IChkMCA+PiAxNCkgJiAweGY7CisJY29uc3QgY2hhciAqZGNsX3ggPSBkMCAmICgxIDw8IDEwKSA/ICJ4IiA6ICIiOworCWNvbnN0IGNoYXIgKmRjbF95ID0gZDAgJiAoMSA8PCAxMSkgPyAieSIgOiAiIjsKKwljb25zdCBjaGFyICpkY2xfeiA9IGQwICYgKDEgPDwgMTIpID8gInoiIDogIiI7CisJY29uc3QgY2hhciAqZGNsX3cgPSBkMCAmICgxIDw8IDEzKSA/ICJ3IiA6ICIiOworCWNoYXIgZGNsX21hc2tbMTBdOworCisJc3dpdGNoICgoZDAgPj4gMTkpICYgMHgzKSB7CisJY2FzZSAxOgorCQlzcHJpbnRmKGRjbF9tYXNrLCAiLiVzJXMlcyVzIiwgZGNsX3gsIGRjbF95LCBkY2xfeiwgZGNsX3cpOworCQlpZiAoc3RyY21wKGRjbF9tYXNrLCAiLiIpID09IDApCisJCQlmcHJpbnRmKG91dCwgImJhZCAoZW1wdHkpIGRjbCBtYXNrXG4iKTsKKworCQlpZiAoZGNsX25yID4gMTApCisJCQlmcHJpbnRmKG91dCwgImJhZCBUJWQgZGNsIHJlZ2lzdGVyIG51bWJlclxuIiwgZGNsX25yKTsKKwkJaWYgKGRjbF9uciA8IDgpIHsKKwkJCWlmIChzdHJjbXAoZGNsX21hc2ssICIueCIpICE9IDAgJiYKKwkJCSAgICBzdHJjbXAoZGNsX21hc2ssICIueHkiKSAhPSAwICYmCisJCQkgICAgc3RyY21wKGRjbF9tYXNrLCAiLnh6IikgIT0gMCAmJgorCQkJICAgIHN0cmNtcChkY2xfbWFzaywgIi53IikgIT0gMCAmJgorCQkJICAgIHN0cmNtcChkY2xfbWFzaywgIi54eXp3IikgIT0gMCkgeworCQkJCWZwcmludGYob3V0LCAiYmFkIFQlZC4lcyBkY2wgbWFza1xuIiwgZGNsX25yLAorCQkJCQlkY2xfbWFzayk7CisJCQl9CisJCQlpbnN0cl9vdXQoY3R4LCBpKyssICIlczogRENMIFQlZCVzXG4iLAorCQkJCSAgaW5zdHJfcHJlZml4LCBkY2xfbnIsIGRjbF9tYXNrKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzdHJjbXAoZGNsX21hc2ssICIueHoiKSA9PSAwKQorCQkJCWZwcmludGYob3V0LCAiZXJyYXRhZWQgYmFkIGRjbCBtYXNrICVzXG4iLAorCQkJCQlkY2xfbWFzayk7CisJCQllbHNlIGlmIChzdHJjbXAoZGNsX21hc2ssICIueHciKSA9PSAwKQorCQkJCWZwcmludGYob3V0LCAiZXJyYXRhZWQgYmFkIGRjbCBtYXNrICVzXG4iLAorCQkJCQlkY2xfbWFzayk7CisJCQllbHNlIGlmIChzdHJjbXAoZGNsX21hc2ssICIueHp3IikgPT0gMCkKKwkJCQlmcHJpbnRmKG91dCwgImVycmF0YWVkIGJhZCBkY2wgbWFzayAlc1xuIiwKKwkJCQkJZGNsX21hc2spOworCisJCQlpZiAoZGNsX25yID09IDgpIHsKKwkJCQlpbnN0cl9vdXQoY3R4LCBpKyssCisJCQkJCSAgIiVzOiBEQ0wgRElGRlVTRSVzXG4iLCBpbnN0cl9wcmVmaXgsCisJCQkJCSAgZGNsX21hc2spOworCQkJfSBlbHNlIGlmIChkY2xfbnIgPT0gOSkgeworCQkJCWluc3RyX291dChjdHgsIGkrKywKKwkJCQkJICAiJXM6IERDTCBTUEVDVUxBUiVzXG4iLCBpbnN0cl9wcmVmaXgsCisJCQkJCSAgZGNsX21hc2spOworCQkJfSBlbHNlIGlmIChkY2xfbnIgPT0gMTApIHsKKwkJCQlpbnN0cl9vdXQoY3R4LCBpKyssCisJCQkJCSAgIiVzOiBEQ0wgRk9HJXNcbiIsIGluc3RyX3ByZWZpeCwKKwkJCQkJICBkY2xfbWFzayk7CisJCQl9CisJCX0KKwkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiJXNcbiIsIGluc3RyX3ByZWZpeCk7CisJCWluc3RyX291dChjdHgsIGkrKywgIiVzXG4iLCBpbnN0cl9wcmVmaXgpOworCQlicmVhazsKKwljYXNlIDM6CisJCXN3aXRjaCAoKGQwID4+IDIyKSAmIDB4MykgeworCQljYXNlIDA6CisJCQlzYW1wbGV0eXBlID0gIjJEIjsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzYW1wbGV0eXBlID0gIkNVQkUiOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXNhbXBsZXR5cGUgPSAiM0QiOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzYW1wbGV0eXBlID0gIlJFU0VSVkVEIjsKKwkJCWJyZWFrOworCQl9CisJCWlmIChkY2xfbnIgPiAxNSkKKwkJCWZwcmludGYob3V0LCAiYmFkIFMlZCBkY2wgcmVnaXN0ZXIgbnVtYmVyXG4iLCBkY2xfbnIpOworCQlpbnN0cl9vdXQoY3R4LCBpKyssICIlczogRENMIFMlZCAlc1xuIiwKKwkJCSAgaW5zdHJfcHJlZml4LCBkY2xfbnIsIHNhbXBsZXR5cGUpOworCQlpbnN0cl9vdXQoY3R4LCBpKyssICIlc1xuIiwgaW5zdHJfcHJlZml4KTsKKwkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiJXNcbiIsIGluc3RyX3ByZWZpeCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWluc3RyX291dChjdHgsIGkrKywgIiVzOiBEQ0wgUkVTRVJWRUQlZFxuIiwKKwkJCSAgaW5zdHJfcHJlZml4LCBkY2xfbnIpOworCQlpbnN0cl9vdXQoY3R4LCBpKyssICIlc1xuIiwgaW5zdHJfcHJlZml4KTsKKwkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiJXNcbiIsIGluc3RyX3ByZWZpeCk7CisJfQorfQorCitzdGF0aWMgdm9pZAoraTkxNV9kZWNvZGVfaW5zdHJ1Y3Rpb24oc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCwKKwkJCWludCBpLCBjaGFyICppbnN0cl9wcmVmaXgpCit7CisJc3dpdGNoICgoY3R4LT5kYXRhW2ldID4+IDI0KSAmIDB4MWYpIHsKKwljYXNlIDB4MDoKKwkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiJXM6IE5PUFxuIiwgaW5zdHJfcHJlZml4KTsKKwkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiJXNcbiIsIGluc3RyX3ByZWZpeCk7CisJCWluc3RyX291dChjdHgsIGkrKywgIiVzXG4iLCBpbnN0cl9wcmVmaXgpOworCQlicmVhazsKKwljYXNlIDB4MDE6CisJCWk5MTVfZGVjb2RlX2FsdTIoY3R4LCBpLCBpbnN0cl9wcmVmaXgsICJBREQiKTsKKwkJYnJlYWs7CisJY2FzZSAweDAyOgorCQlpOTE1X2RlY29kZV9hbHUxKGN0eCwgaSwgaW5zdHJfcHJlZml4LCAiTU9WIik7CisJCWJyZWFrOworCWNhc2UgMHgwMzoKKwkJaTkxNV9kZWNvZGVfYWx1MihjdHgsIGksIGluc3RyX3ByZWZpeCwgIk1VTCIpOworCQlicmVhazsKKwljYXNlIDB4MDQ6CisJCWk5MTVfZGVjb2RlX2FsdTMoY3R4LCBpLCBpbnN0cl9wcmVmaXgsICJNQUQiKTsKKwkJYnJlYWs7CisJY2FzZSAweDA1OgorCQlpOTE1X2RlY29kZV9hbHUzKGN0eCwgaSwgaW5zdHJfcHJlZml4LCAiRFAyQUREIik7CisJCWJyZWFrOworCWNhc2UgMHgwNjoKKwkJaTkxNV9kZWNvZGVfYWx1MihjdHgsIGksIGluc3RyX3ByZWZpeCwgIkRQMyIpOworCQlicmVhazsKKwljYXNlIDB4MDc6CisJCWk5MTVfZGVjb2RlX2FsdTIoY3R4LCBpLCBpbnN0cl9wcmVmaXgsICJEUDQiKTsKKwkJYnJlYWs7CisJY2FzZSAweDA4OgorCQlpOTE1X2RlY29kZV9hbHUxKGN0eCwgaSwgaW5zdHJfcHJlZml4LCAiRlJDIik7CisJCWJyZWFrOworCWNhc2UgMHgwOToKKwkJaTkxNV9kZWNvZGVfYWx1MShjdHgsIGksIGluc3RyX3ByZWZpeCwgIlJDUCIpOworCQlicmVhazsKKwljYXNlIDB4MGE6CisJCWk5MTVfZGVjb2RlX2FsdTEoY3R4LCBpLCBpbnN0cl9wcmVmaXgsICJSU1EiKTsKKwkJYnJlYWs7CisJY2FzZSAweDBiOgorCQlpOTE1X2RlY29kZV9hbHUxKGN0eCwgaSwgaW5zdHJfcHJlZml4LCAiRVhQIik7CisJCWJyZWFrOworCWNhc2UgMHgwYzoKKwkJaTkxNV9kZWNvZGVfYWx1MShjdHgsIGksIGluc3RyX3ByZWZpeCwgIkxPRyIpOworCQlicmVhazsKKwljYXNlIDB4MGQ6CisJCWk5MTVfZGVjb2RlX2FsdTIoY3R4LCBpLCBpbnN0cl9wcmVmaXgsICJDTVAiKTsKKwkJYnJlYWs7CisJY2FzZSAweDBlOgorCQlpOTE1X2RlY29kZV9hbHUyKGN0eCwgaSwgaW5zdHJfcHJlZml4LCAiTUlOIik7CisJCWJyZWFrOworCWNhc2UgMHgwZjoKKwkJaTkxNV9kZWNvZGVfYWx1MihjdHgsIGksIGluc3RyX3ByZWZpeCwgIk1BWCIpOworCQlicmVhazsKKwljYXNlIDB4MTA6CisJCWk5MTVfZGVjb2RlX2FsdTEoY3R4LCBpLCBpbnN0cl9wcmVmaXgsICJGTFIiKTsKKwkJYnJlYWs7CisJY2FzZSAweDExOgorCQlpOTE1X2RlY29kZV9hbHUxKGN0eCwgaSwgaW5zdHJfcHJlZml4LCAiTU9EIik7CisJCWJyZWFrOworCWNhc2UgMHgxMjoKKwkJaTkxNV9kZWNvZGVfYWx1MShjdHgsIGksIGluc3RyX3ByZWZpeCwgIlRSQyIpOworCQlicmVhazsKKwljYXNlIDB4MTM6CisJCWk5MTVfZGVjb2RlX2FsdTIoY3R4LCBpLCBpbnN0cl9wcmVmaXgsICJTR0UiKTsKKwkJYnJlYWs7CisJY2FzZSAweDE0OgorCQlpOTE1X2RlY29kZV9hbHUyKGN0eCwgaSwgaW5zdHJfcHJlZml4LCAiU0xUIik7CisJCWJyZWFrOworCWNhc2UgMHgxNToKKwkJaTkxNV9kZWNvZGVfdGV4KGN0eCwgaSwgaW5zdHJfcHJlZml4LCAiVEVYTEQiKTsKKwkJYnJlYWs7CisJY2FzZSAweDE2OgorCQlpOTE1X2RlY29kZV90ZXgoY3R4LCBpLCBpbnN0cl9wcmVmaXgsICJURVhMRFAiKTsKKwkJYnJlYWs7CisJY2FzZSAweDE3OgorCQlpOTE1X2RlY29kZV90ZXgoY3R4LCBpLCBpbnN0cl9wcmVmaXgsICJURVhMREIiKTsKKwkJYnJlYWs7CisJY2FzZSAweDE5OgorCQlpOTE1X2RlY29kZV9kY2woY3R4LCBpLCBpbnN0cl9wcmVmaXgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpbnN0cl9vdXQoY3R4LCBpKyssICIlczogdW5rbm93blxuIiwgaW5zdHJfcHJlZml4KTsKKwkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiJXNcbiIsIGluc3RyX3ByZWZpeCk7CisJCWluc3RyX291dChjdHgsIGkrKywgIiVzXG4iLCBpbnN0cl9wcmVmaXgpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2RlY29kZV9jb21wYXJlX2Z1bmModWludDMyX3Qgb3ApCit7CisJc3dpdGNoIChvcCAmIDB4NykgeworCWNhc2UgMDoKKwkJcmV0dXJuICJhbHdheXMiOworCWNhc2UgMToKKwkJcmV0dXJuICJuZXZlciI7CisJY2FzZSAyOgorCQlyZXR1cm4gImxlc3MiOworCWNhc2UgMzoKKwkJcmV0dXJuICJlcXVhbCI7CisJY2FzZSA0OgorCQlyZXR1cm4gImxlcXVhbCI7CisJY2FzZSA1OgorCQlyZXR1cm4gImdyZWF0ZXIiOworCWNhc2UgNjoKKwkJcmV0dXJuICJub3RlcXVhbCI7CisJY2FzZSA3OgorCQlyZXR1cm4gImdlcXVhbCI7CisJfQorCXJldHVybiAiIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorZGVjb2RlX3N0ZW5jaWxfb3AodWludDMyX3Qgb3ApCit7CisJc3dpdGNoIChvcCAmIDB4NykgeworCWNhc2UgMDoKKwkJcmV0dXJuICJrZWVwIjsKKwljYXNlIDE6CisJCXJldHVybiAiemVybyI7CisJY2FzZSAyOgorCQlyZXR1cm4gInJlcGxhY2UiOworCWNhc2UgMzoKKwkJcmV0dXJuICJpbmNyX3NhdCI7CisJY2FzZSA0OgorCQlyZXR1cm4gImRlY3Jfc2F0IjsKKwljYXNlIDU6CisJCXJldHVybiAiZ3JlYXRlciI7CisJY2FzZSA2OgorCQlyZXR1cm4gImluY3IiOworCWNhc2UgNzoKKwkJcmV0dXJuICJkZWNyIjsKKwl9CisJcmV0dXJuICIiOworfQorCisjaWYgMAorc3RhdGljIGNvbnN0IGNoYXIgKgorZGVjb2RlX2xvZ2ljX29wKHVpbnQzMl90IG9wKQoreworCXN3aXRjaCAob3AgJiAweGYpIHsKKwljYXNlIDA6CisJCXJldHVybiAiY2xlYXIiOworCWNhc2UgMToKKwkJcmV0dXJuICJub3IiOworCWNhc2UgMjoKKwkJcmV0dXJuICJhbmRfaW52IjsKKwljYXNlIDM6CisJCXJldHVybiAiY29weV9pbnYiOworCWNhc2UgNDoKKwkJcmV0dXJuICJhbmRfcnZyc2UiOworCWNhc2UgNToKKwkJcmV0dXJuICJpbnYiOworCWNhc2UgNjoKKwkJcmV0dXJuICJ4b3IiOworCWNhc2UgNzoKKwkJcmV0dXJuICJuYW5kIjsKKwljYXNlIDg6CisJCXJldHVybiAiYW5kIjsKKwljYXNlIDk6CisJCXJldHVybiAiZXF1aXYiOworCWNhc2UgMTA6CisJCXJldHVybiAibm9vcCI7CisJY2FzZSAxMToKKwkJcmV0dXJuICJvcl9pbnYiOworCWNhc2UgMTI6CisJCXJldHVybiAiY29weSI7CisJY2FzZSAxMzoKKwkJcmV0dXJuICJvcl9ydnJzZSI7CisJY2FzZSAxNDoKKwkJcmV0dXJuICJvciI7CisJY2FzZSAxNToKKwkJcmV0dXJuICJzZXQiOworCX0KKwlyZXR1cm4gIiI7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgKgorZGVjb2RlX2JsZW5kX2ZhY3QodWludDMyX3Qgb3ApCit7CisJc3dpdGNoIChvcCAmIDB4ZikgeworCWNhc2UgMToKKwkJcmV0dXJuICJ6ZXJvIjsKKwljYXNlIDI6CisJCXJldHVybiAib25lIjsKKwljYXNlIDM6CisJCXJldHVybiAic3JjX2NvbHIiOworCWNhc2UgNDoKKwkJcmV0dXJuICJpbnZfc3JjX2NvbHIiOworCWNhc2UgNToKKwkJcmV0dXJuICJzcmNfYWxwaGEiOworCWNhc2UgNjoKKwkJcmV0dXJuICJpbnZfc3JjX2FscGhhIjsKKwljYXNlIDc6CisJCXJldHVybiAiZHN0X2FscGhhIjsKKwljYXNlIDg6CisJCXJldHVybiAiaW52X2RzdF9hbHBoYSI7CisJY2FzZSA5OgorCQlyZXR1cm4gImRzdF9jb2xyIjsKKwljYXNlIDEwOgorCQlyZXR1cm4gImludl9kc3RfY29sciI7CisJY2FzZSAxMToKKwkJcmV0dXJuICJzcmNfYWxwaGFfc2F0IjsKKwljYXNlIDEyOgorCQlyZXR1cm4gImNuc3RfY29sciI7CisJY2FzZSAxMzoKKwkJcmV0dXJuICJpbnZfY25zdF9jb2xyIjsKKwljYXNlIDE0OgorCQlyZXR1cm4gImNuc3RfYWxwaGEiOworCWNhc2UgMTU6CisJCXJldHVybiAiaW52X2NvbnN0X2FscGhhIjsKKwl9CisJcmV0dXJuICIiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitkZWNvZGVfdGV4X2Nvb3JkX21vZGUodWludDMyX3QgbW9kZSkKK3sKKwlzd2l0Y2ggKG1vZGUgJiAweDcpIHsKKwljYXNlIDA6CisJCXJldHVybiAid3JhcCI7CisJY2FzZSAxOgorCQlyZXR1cm4gIm1pcnJvciI7CisJY2FzZSAyOgorCQlyZXR1cm4gImNsYW1wX2VkZ2UiOworCWNhc2UgMzoKKwkJcmV0dXJuICJjdWJlIjsKKwljYXNlIDQ6CisJCXJldHVybiAiY2xhbXBfYm9yZGVyIjsKKwljYXNlIDU6CisJCXJldHVybiAibWlycm9yX29uY2UiOworCX0KKwlyZXR1cm4gIiI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2RlY29kZV9zYW1wbGVfZmlsdGVyKHVpbnQzMl90IG1vZGUpCit7CisJc3dpdGNoIChtb2RlICYgMHg3KSB7CisJY2FzZSAwOgorCQlyZXR1cm4gIm5lYXJlc3QiOworCWNhc2UgMToKKwkJcmV0dXJuICJsaW5lYXIiOworCWNhc2UgMjoKKwkJcmV0dXJuICJhbmlzb3Ryb3BpYyI7CisJY2FzZSAzOgorCQlyZXR1cm4gIjR4NF8xIjsKKwljYXNlIDQ6CisJCXJldHVybiAiNHg0XzIiOworCWNhc2UgNToKKwkJcmV0dXJuICI0eDRfZmxhdCI7CisJY2FzZSA2OgorCQlyZXR1cm4gIjZ4NV9tb25vIjsKKwl9CisJcmV0dXJuICIiOworfQorCitzdGF0aWMgaW50CitkZWNvZGVfM2RfMWQoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCkKK3sKKwl1bnNpZ25lZCBpbnQgbGVuLCBpLCBjLCBpZHgsIHdvcmQsIG1hcCwgc2FtcGxlciwgaW5zdHI7CisJY29uc3QgY2hhciAqZm9ybWF0LCAqemZvcm1hdCwgKnR5cGU7CisJdWludDMyX3Qgb3Bjb2RlOworCXVpbnQzMl90ICpkYXRhID0gY3R4LT5kYXRhOworCXVpbnQzMl90IGRldmlkID0gY3R4LT5kZXZpZDsKKworCXN0cnVjdCB7CisJCXVpbnQzMl90IG9wY29kZTsKKwkJaW50IGk4MzBfb25seTsKKwkJdW5zaWduZWQgaW50IG1pbl9sZW47CisJCXVuc2lnbmVkIGludCBtYXhfbGVuOworCQljb25zdCBjaGFyICpuYW1lOworCX0gb3Bjb2Rlc18zZF8xZFtdID0geworCQl7IDB4ODYsIDAsIDQsIDQsICIzRFNUQVRFX0NIUk9NQV9LRVkiIH0sCisJCXsgMHg4OCwgMCwgMiwgMiwgIjNEU1RBVEVfQ09OU1RBTlRfQkxFTkRfQ09MT1IiIH0sCisJCXsgMHg5OSwgMCwgMiwgMiwgIjNEU1RBVEVfREVGQVVMVF9ESUZGVVNFIiB9LAorCQl7IDB4OWEsIDAsIDIsIDIsICIzRFNUQVRFX0RFRkFVTFRfU1BFQ1VMQVIiIH0sCisJCXsgMHg5OCwgMCwgMiwgMiwgIjNEU1RBVEVfREVGQVVMVF9aIiB9LAorCQl7IDB4OTcsIDAsIDIsIDIsICIzRFNUQVRFX0RFUFRIX09GRlNFVF9TQ0FMRSIgfSwKKwkJeyAweDlkLCAwLCA2NSwgNjUsICIzRFNUQVRFX0ZJTFRFUl9DT0VGRklDSUVOVFNfNFg0IiB9LAorCQl7IDB4OWUsIDAsIDQsIDQsICIzRFNUQVRFX01PTk9fRklMVEVSIiB9LAorCQl7IDB4ODksIDAsIDQsIDQsICIzRFNUQVRFX0ZPR19NT0RFIiB9LAorCQl7IDB4OGYsIDAsIDIsIDE2LCAiM0RTVEFURV9NQVBfUEFMTEVURV9MT0FEXzMyIiB9LAorCQl7IDB4ODMsIDAsIDIsIDIsICIzRFNUQVRFX1NQQU5fU1RJUFBMRSIgfSwKKwkJeyAweDhjLCAxLCAyLCAyLCAiM0RTVEFURV9NQVBfQ09PUkRfVFJBTlNGT1JNX0k4MzAiIH0sCisJCXsgMHg4YiwgMSwgMiwgMiwgIjNEU1RBVEVfTUFQX1ZFUlRFWF9UUkFOU0ZPUk1fSTgzMCIgfSwKKwkJeyAweDhkLCAxLCAzLCAzLCAiM0RTVEFURV9XX1NUQVRFX0k4MzAiIH0sCisJCXsgMHgwMSwgMSwgMiwgMiwgIjNEU1RBVEVfQ09MT1JfRkFDVE9SX0k4MzAiIH0sCisJCXsgMHgwMiwgMSwgMiwgMiwgIjNEU1RBVEVfTUFQX0NPT1JEX1NFVEJJTkRfSTgzMCJ9LAorCX0sICpvcGNvZGVfM2RfMWQ7CisKKwlvcGNvZGUgPSAoZGF0YVswXSAmIDB4MDBmZjAwMDApID4+IDE2OworCisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIDB4MDc6CisJCS8qIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgdW51c3VhbC4gIEEgMCBsZW5ndGggbWVhbnMganVzdAorCQkgKiAxIERXT1JEIGluc3RlYWQgb2YgMi4gIFRoZSAwIGxlbmd0aCBpcyBzcGVjaWZpZWQgaW4KKwkJICogb25lIHBsYWNlIHRvIGJlIHVuc3VwcG9ydGVkLCBidXQgc3RhdGVkIHRvIGJlCisJCSAqIHJlcXVpcmVkIGluIGFub3RoZXIsIGFuZCAwIGxlbmd0aCBMT0FEX0lORElSRUNUcworCQkgKiBhcHBlYXIgdG8gY2F1c2Ugbm8gaGFybSBhdCBsZWFzdC4KKwkJICovCisJCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX0xPQURfSU5ESVJFQ1RcbiIpOworCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwZmYpICsgMTsKKwkJaSA9IDE7CisJCWlmIChkYXRhWzBdICYgKDB4MDEgPDwgOCkpIHsKKwkJCWluc3RyX291dChjdHgsIGkrKywgIlNJUy4wXG4iKTsKKwkJCWluc3RyX291dChjdHgsIGkrKywgIlNJUy4xXG4iKTsKKwkJfQorCQlpZiAoZGF0YVswXSAmICgweDAyIDw8IDgpKSB7CisJCQlpbnN0cl9vdXQoY3R4LCBpKyssICJESVMuMFxuIik7CisJCX0KKwkJaWYgKGRhdGFbMF0gJiAoMHgwNCA8PCA4KSkgeworCQkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiU1NCLjBcbiIpOworCQkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiU1NCLjFcbiIpOworCQl9CisJCWlmIChkYXRhWzBdICYgKDB4MDggPDwgOCkpIHsKKwkJCWluc3RyX291dChjdHgsIGkrKywgIk1TQi4wXG4iKTsKKwkJCWluc3RyX291dChjdHgsIGkrKywgIk1TQi4xXG4iKTsKKwkJfQorCQlpZiAoZGF0YVswXSAmICgweDEwIDw8IDgpKSB7CisJCQlpbnN0cl9vdXQoY3R4LCBpKyssICJQU1AuMFxuIik7CisJCQlpbnN0cl9vdXQoY3R4LCBpKyssICJQU1AuMVxuIik7CisJCX0KKwkJaWYgKGRhdGFbMF0gJiAoMHgyMCA8PCA4KSkgeworCQkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiUFNDLjBcbiIpOworCQkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiUFNDLjFcbiIpOworCQl9CisJCWlmIChsZW4gIT0gaSkgeworCQkJZnByaW50ZihvdXQsICJCYWQgY291bnQgaW4gM0RTVEFURV9MT0FEX0lORElSRUNUXG4iKTsKKwkJCXJldHVybiBsZW47CisJCX0KKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4MDQ6CisJCWluc3RyX291dChjdHgsIDAsCisJCQkgICIzRFNUQVRFX0xPQURfU1RBVEVfSU1NRURJQVRFXzFcbiIpOworCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwMGYpICsgMjsKKwkJaSA9IDE7CisJCWZvciAod29yZCA9IDA7IHdvcmQgPD0gODsgd29yZCsrKSB7CisJCQlpZiAoZGF0YVswXSAmICgxIDw8ICg0ICsgd29yZCkpKSB7CisJCQkJLyogc2F2ZSB2ZXJ0ZXggc3RhdGUgZm9yIGRlY29kZSAqLworCQkJCWlmICghSVNfR0VOMihkZXZpZCkpIHsKKwkJCQkJaW50IHRleF9udW07CisKKwkJCQkJaWYgKHdvcmQgPT0gMikgeworCQkJCQkJc2F2ZWRfczJfc2V0ID0gMTsKKwkJCQkJCXNhdmVkX3MyID0gZGF0YVtpXTsKKwkJCQkJfQorCQkJCQlpZiAod29yZCA9PSA0KSB7CisJCQkJCQlzYXZlZF9zNF9zZXQgPSAxOworCQkJCQkJc2F2ZWRfczQgPSBkYXRhW2ldOworCQkJCQl9CisKKwkJCQkJc3dpdGNoICh3b3JkKSB7CisJCQkJCWNhc2UgMDoKKwkJCQkJCWluc3RyX291dChjdHgsIGksCisJCQkJCQkJICAiUzA6IHZibyBvZmZzZXQ6IDB4JTA4eCVzXG4iLAorCQkJCQkJCSAgZGF0YVtpXSAmICh+MSksCisJCQkJCQkJICBkYXRhW2ldICYgMSA/CisJCQkJCQkJICAiLCBhdXRvIGNhY2hlIGludmFsaWRhdGUgZGlzYWJsZWQiCisJCQkJCQkJICA6ICIiKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDE6CisJCQkJCQlpbnN0cl9vdXQoY3R4LCBpLAorCQkJCQkJCSAgIlMxOiB2ZXJ0ZXggd2lkdGg6ICVpLCB2ZXJ0ZXggcGl0Y2g6ICVpXG4iLAorCQkJCQkJCSAgKGRhdGFbaV0gPj4gMjQpICYKKwkJCQkJCQkgIDB4M2YsCisJCQkJCQkJICAoZGF0YVtpXSA+PiAxNikgJgorCQkJCQkJCSAgMHgzZik7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJaW5zdHJfb3V0KGN0eCwgaSwKKwkJCQkJCQkgICJTMjogdGV4Y29vcmQgZm9ybWF0czogIik7CisJCQkJCQlmb3IgKHRleF9udW0gPSAwOworCQkJCQkJICAgICB0ZXhfbnVtIDwgODsgdGV4X251bSsrKSB7CisJCQkJCQkJc3dpdGNoICgoZGF0YVtpXSA+PgorCQkJCQkJCQkgdGV4X251bSAqCisJCQkJCQkJCSA0KSAmIDB4ZikgeworCQkJCQkJCWNhc2UgMDoKKwkJCQkJCQkJZnByaW50ZihvdXQsCisJCQkJCQkJCQkiJWk9MkQgIiwKKwkJCQkJCQkJCXRleF9udW0pOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDE6CisJCQkJCQkJCWZwcmludGYob3V0LAorCQkJCQkJCQkJIiVpPTNEICIsCisJCQkJCQkJCQl0ZXhfbnVtKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOgorCQkJCQkJCQlmcHJpbnRmKG91dCwKKwkJCQkJCQkJCSIlaT00RCAiLAorCQkJCQkJCQkJdGV4X251bSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMzoKKwkJCQkJCQkJZnByaW50ZihvdXQsCisJCQkJCQkJCQkiJWk9MUQgIiwKKwkJCQkJCQkJCXRleF9udW0pOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDQ6CisJCQkJCQkJCWZwcmludGYob3V0LAorCQkJCQkJCQkJIiVpPTJEXzE2ICIsCisJCQkJCQkJCQl0ZXhfbnVtKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA1OgorCQkJCQkJCQlmcHJpbnRmKG91dCwKKwkJCQkJCQkJCSIlaT00RF8xNiAiLAorCQkJCQkJCQkJdGV4X251bSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMHhmOgorCQkJCQkJCQlmcHJpbnRmKG91dCwKKwkJCQkJCQkJCSIlaT1OUCAiLAorCQkJCQkJCQkJdGV4X251bSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWZwcmludGYob3V0LCAiXG4iKTsKKworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMzoKKwkJCQkJCWluc3RyX291dChjdHgsIGksCisJCQkJCQkJICAiUzM6IG5vdCBkb2N1bWVudGVkXG4iKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDQ6CisJCQkJCQl7CisJCQkJCQkJY29uc3QgY2hhciAqY3VsbG1vZGUgPSAiIjsKKwkJCQkJCQljb25zdCBjaGFyICp2Zm10X3h5encgPSAiIjsKKwkJCQkJCQlzd2l0Y2ggKChkYXRhW2ldID4+IDEzKQorCQkJCQkJCQkmIDB4MykgeworCQkJCQkJCWNhc2UgMDoKKwkJCQkJCQkJY3VsbG1vZGUgPQorCQkJCQkJCQkgICAgImJvdGgiOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDE6CisJCQkJCQkJCWN1bGxtb2RlID0KKwkJCQkJCQkJICAgICJub25lIjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOgorCQkJCQkJCQljdWxsbW9kZSA9ICJjdyI7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMzoKKwkJCQkJCQkJY3VsbG1vZGUgPQorCQkJCQkJCQkgICAgImNjdyI7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQlzd2l0Y2ggKGRhdGFbaV0gJgorCQkJCQkJCQkoNyA8PCA2IHwgMSA8PAorCQkJCQkJCQkgMikpIHsKKwkJCQkJCQljYXNlIDEgPDwgNjoKKwkJCQkJCQkJdmZtdF94eXp3ID0KKwkJCQkJCQkJICAgICJYWVosIjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyIDw8IDY6CisJCQkJCQkJCXZmbXRfeHl6dyA9CisJCQkJCQkJCSAgICAiWFlaVywiOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDMgPDwgNjoKKwkJCQkJCQkJdmZtdF94eXp3ID0KKwkJCQkJCQkJICAgICJYWSwiOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDQgPDwgNjoKKwkJCQkJCQkJdmZtdF94eXp3ID0KKwkJCQkJCQkJICAgICJYWVcsIjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxIDw8IDYgfCAxIDw8IDI6CisJCQkJCQkJCXZmbXRfeHl6dyA9CisJCQkJCQkJCSAgICAiWFlaRiwiOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDIgPDwgNiB8IDEgPDwgMjoKKwkJCQkJCQkJdmZtdF94eXp3ID0KKwkJCQkJCQkJICAgICJYWVpXRiwiOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDMgPDwgNiB8IDEgPDwgMjoKKwkJCQkJCQkJdmZtdF94eXp3ID0KKwkJCQkJCQkJICAgICJYWUYsIjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA0IDw8IDYgfCAxIDw8IDI6CisJCQkJCQkJCXZmbXRfeHl6dyA9CisJCQkJCQkJCSAgICAiWFlXRiwiOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJaW5zdHJfb3V0KGN0eCwgaSwKKwkJCQkJCQkJICAiUzQ6IHBvaW50X3dpZHRoPSVpLCBsaW5lX3dpZHRoPSUuMWYsIgorCQkJCQkJCQkgICIlcyVzJXMlcyVzIGN1bGxtb2RlPSVzLCB2Zm10PSVzJXMlcyVzJXMlcyAiCisJCQkJCQkJCSAgIiVzJXMlcyVzJXNcbiIsCisJCQkJCQkJCSAgKGRhdGFbaV0gPj4KKwkJCQkJCQkJICAgMjMpICYgMHgxZmYsCisJCQkJCQkJCSAgKChkYXRhW2ldID4+CisJCQkJCQkJCSAgICAxOSkgJiAweGYpIC8KKwkJCQkJCQkJICAyLjAsCisJCQkJCQkJCSAgZGF0YVtpXSAmICgweGYKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgMTUpCisJCQkJCQkJCSAgPworCQkJCQkJCQkgICIgZmxhdHNoYWRlPSIKKwkJCQkJCQkJICA6ICIiLAorCQkJCQkJCQkgIGRhdGFbaV0gJiAoMQorCQkJCQkJCQkJICAgICA8PAorCQkJCQkJCQkJICAgICAxOCkKKwkJCQkJCQkJICA/ICJBbHBoYSwiIDoKKwkJCQkJCQkJICAiIiwKKwkJCQkJCQkJICBkYXRhW2ldICYgKDEKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgMTcpCisJCQkJCQkJCSAgPyAiRm9nLCIgOiAiIiwKKwkJCQkJCQkJICBkYXRhW2ldICYgKDEKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgMTYpCisJCQkJCQkJCSAgPyAiU3BlY3VsYXIsIgorCQkJCQkJCQkgIDogIiIsCisJCQkJCQkJCSAgZGF0YVtpXSAmICgxCisJCQkJCQkJCQkgICAgIDw8CisJCQkJCQkJCQkgICAgIDE1KQorCQkJCQkJCQkgID8gIkNvbG9yLCIgOgorCQkJCQkJCQkgICIiLCBjdWxsbW9kZSwKKwkJCQkJCQkJICBkYXRhW2ldICYgKDEKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgMTIpCisJCQkJCQkJCSAgPworCQkJCQkJCQkgICJQb2ludFdpZHRoLCIKKwkJCQkJCQkJICA6ICIiLAorCQkJCQkJCQkgIGRhdGFbaV0gJiAoMQorCQkJCQkJCQkJICAgICA8PAorCQkJCQkJCQkJICAgICAxMSkKKwkJCQkJCQkJICA/ICJTcGVjRm9nLCIgOgorCQkJCQkJCQkgICIiLAorCQkJCQkJCQkgIGRhdGFbaV0gJiAoMQorCQkJCQkJCQkJICAgICA8PAorCQkJCQkJCQkJICAgICAxMCkKKwkJCQkJCQkJICA/ICJDb2xvciwiIDoKKwkJCQkJCQkJICAiIiwKKwkJCQkJCQkJICBkYXRhW2ldICYgKDEKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgOSkKKwkJCQkJCQkJICA/ICJEZXB0aE9mcywiCisJCQkJCQkJCSAgOiAiIiwKKwkJCQkJCQkJICB2Zm10X3h5encsCisJCQkJCQkJCSAgZGF0YVtpXSAmICgxCisJCQkJCQkJCQkgICAgIDw8CisJCQkJCQkJCQkgICAgIDkpCisJCQkJCQkJCSAgPyAiRm9nUGFyYW0sIgorCQkJCQkJCQkgIDogIiIsCisJCQkJCQkJCSAgZGF0YVtpXSAmICgxCisJCQkJCQkJCQkgICAgIDw8CisJCQkJCQkJCQkgICAgIDUpCisJCQkJCQkJCSAgPworCQkJCQkJCQkgICJmb3JjZSBkZWZhdWx0IGRpZmZ1c2UsICIKKwkJCQkJCQkJICA6ICIiLAorCQkJCQkJCQkgIGRhdGFbaV0gJiAoMQorCQkJCQkJCQkJICAgICA8PAorCQkJCQkJCQkJICAgICA0KQorCQkJCQkJCQkgID8KKwkJCQkJCQkJICAiZm9yY2UgZGVmYXVsdCBzcGVjdWxhciwgIgorCQkJCQkJCQkgIDogIiIsCisJCQkJCQkJCSAgZGF0YVtpXSAmICgxCisJCQkJCQkJCQkgICAgIDw8CisJCQkJCQkJCQkgICAgIDMpCisJCQkJCQkJCSAgPworCQkJCQkJCQkgICJsb2NhbCBkZXB0aCBvZnMgZW5hYmxlLCAiCisJCQkJCQkJCSAgOiAiIiwKKwkJCQkJCQkJICBkYXRhW2ldICYgKDEKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgMSkKKwkJCQkJCQkJICA/CisJCQkJCQkJCSAgInBvaW50IHNwcml0ZSBlbmFibGUsICIKKwkJCQkJCQkJICA6ICIiLAorCQkJCQkJCQkgIGRhdGFbaV0gJiAoMQorCQkJCQkJCQkJICAgICA8PAorCQkJCQkJCQkJICAgICAwKQorCQkJCQkJCQkgID8KKwkJCQkJCQkJICAibGluZSBBQSBlbmFibGUsICIKKwkJCQkJCQkJICA6ICIiKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJY2FzZSA1OgorCQkJCQkJeworCQkJCQkJCWluc3RyX291dChjdHgsIGksCisJCQkJCQkJCSAgIlM1OiVzJXMlcyVzJXMiCisJCQkJCQkJCSAgIiVzJXMlcyVzIHN0ZW5jaWxfcmVmPTB4JXgsIHN0ZW5jaWxfdGVzdD0lcywgIgorCQkJCQkJCQkgICJzdGVuY2lsX2ZhaWw9JXMsIHN0ZW5jaWxfcGFzc196X2ZhaWw9JXMsICIKKwkJCQkJCQkJICAic3RlbmNpbF9wYXNzX3pfcGFzcz0lcywgJXMlcyVzJXNcbiIsCisJCQkJCQkJCSAgZGF0YVtpXSAmICgweGYKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgMjgpCisJCQkJCQkJCSAgPworCQkJCQkJCQkgICIgd3JpdGVfZGlzYWJsZT0iCisJCQkJCQkJCSAgOiAiIiwKKwkJCQkJCQkJICBkYXRhW2ldICYgKDEKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgMzEpCisJCQkJCQkJCSAgPyAiQWxwaGEsIiA6CisJCQkJCQkJCSAgIiIsCisJCQkJCQkJCSAgZGF0YVtpXSAmICgxCisJCQkJCQkJCQkgICAgIDw8CisJCQkJCQkJCQkgICAgIDMwKQorCQkJCQkJCQkgID8gIlJlZCwiIDogIiIsCisJCQkJCQkJCSAgZGF0YVtpXSAmICgxCisJCQkJCQkJCQkgICAgIDw8CisJCQkJCQkJCQkgICAgIDI5KQorCQkJCQkJCQkgID8gIkdyZWVuLCIgOgorCQkJCQkJCQkgICIiLAorCQkJCQkJCQkgIGRhdGFbaV0gJiAoMQorCQkJCQkJCQkJICAgICA8PAorCQkJCQkJCQkJICAgICAyOCkKKwkJCQkJCQkJICA/ICJCbHVlLCIgOgorCQkJCQkJCQkgICIiLAorCQkJCQkJCQkgIGRhdGFbaV0gJiAoMQorCQkJCQkJCQkJICAgICA8PAorCQkJCQkJCQkJICAgICAyNykKKwkJCQkJCQkJICA/CisJCQkJCQkJCSAgIiBmb3JjZSBkZWZhdWx0IHBvaW50IHNpemUsIgorCQkJCQkJCQkgIDogIiIsCisJCQkJCQkJCSAgZGF0YVtpXSAmICgxCisJCQkJCQkJCQkgICAgIDw8CisJCQkJCQkJCQkgICAgIDI2KQorCQkJCQkJCQkgID8KKwkJCQkJCQkJICAiIGxhc3QgcGl4ZWwgZW5hYmxlLCIKKwkJCQkJCQkJICA6ICIiLAorCQkJCQkJCQkgIGRhdGFbaV0gJiAoMQorCQkJCQkJCQkJICAgICA8PAorCQkJCQkJCQkJICAgICAyNSkKKwkJCQkJCQkJICA/CisJCQkJCQkJCSAgIiBnbG9iYWwgZGVwdGggb2ZzIGVuYWJsZSwiCisJCQkJCQkJCSAgOiAiIiwKKwkJCQkJCQkJICBkYXRhW2ldICYgKDEKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgMjQpCisJCQkJCQkJCSAgPworCQkJCQkJCQkgICIgZm9nIGVuYWJsZSwiCisJCQkJCQkJCSAgOiAiIiwKKwkJCQkJCQkJICAoZGF0YVtpXSA+PgorCQkJCQkJCQkgICAxNikgJiAweGZmLAorCQkJCQkJCQkgIGRlY29kZV9jb21wYXJlX2Z1bmMKKwkJCQkJCQkJICAoZGF0YVtpXSA+PgorCQkJCQkJCQkgICAxMyksCisJCQkJCQkJCSAgZGVjb2RlX3N0ZW5jaWxfb3AKKwkJCQkJCQkJICAoZGF0YVtpXSA+PgorCQkJCQkJCQkgICAxMCksCisJCQkJCQkJCSAgZGVjb2RlX3N0ZW5jaWxfb3AKKwkJCQkJCQkJICAoZGF0YVtpXSA+PgorCQkJCQkJCQkgICA3KSwKKwkJCQkJCQkJICBkZWNvZGVfc3RlbmNpbF9vcAorCQkJCQkJCQkgIChkYXRhW2ldID4+CisJCQkJCQkJCSAgIDQpLAorCQkJCQkJCQkgIGRhdGFbaV0gJiAoMQorCQkJCQkJCQkJICAgICA8PAorCQkJCQkJCQkJICAgICAzKQorCQkJCQkJCQkgID8KKwkJCQkJCQkJICAic3RlbmNpbCB3cml0ZSBlbmFibGUsICIKKwkJCQkJCQkJICA6ICIiLAorCQkJCQkJCQkgIGRhdGFbaV0gJiAoMQorCQkJCQkJCQkJICAgICA8PAorCQkJCQkJCQkJICAgICAyKQorCQkJCQkJCQkgID8KKwkJCQkJCQkJICAic3RlbmNpbCB0ZXN0IGVuYWJsZSwgIgorCQkJCQkJCQkgIDogIiIsCisJCQkJCQkJCSAgZGF0YVtpXSAmICgxCisJCQkJCQkJCQkgICAgIDw8CisJCQkJCQkJCQkgICAgIDEpCisJCQkJCQkJCSAgPworCQkJCQkJCQkgICJjb2xvciBkaXRoZXIgZW5hYmxlLCAiCisJCQkJCQkJCSAgOiAiIiwKKwkJCQkJCQkJICBkYXRhW2ldICYgKDEKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgMCkKKwkJCQkJCQkJICA/CisJCQkJCQkJCSAgImxvZ2ljb3AgZW5hYmxlLCAiCisJCQkJCQkJCSAgOiAiIik7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA2OgorCQkJCQkJaW5zdHJfb3V0KGN0eCwgaSwKKwkJCQkJCQkgICJTNjogJXNhbHBoYV90ZXN0PSVzLCBhbHBoYV9yZWY9MHgleCwgIgorCQkJCQkJCSAgImRlcHRoX3Rlc3Q9JXMsICVzc3JjX2JsbmRfZmN0PSVzLCBkc3RfYmxuZF9mY3Q9JXMsICIKKwkJCQkJCQkgICIlcyVzdHJpc3RyaXBfcHJvdm9raW5nX3ZlcnRleD0laVxuIiwKKwkJCQkJCQkgIGRhdGFbaV0gJiAoMSA8PCAzMSkgPworCQkJCQkJCSAgImFscGhhIHRlc3QgZW5hYmxlLCAiCisJCQkJCQkJICA6ICIiLAorCQkJCQkJCSAgZGVjb2RlX2NvbXBhcmVfZnVuYworCQkJCQkJCSAgKGRhdGFbaV0gPj4gMjgpLAorCQkJCQkJCSAgZGF0YVtpXSAmICgweGZmIDw8CisJCQkJCQkJCSAgICAgMjApLAorCQkJCQkJCSAgZGVjb2RlX2NvbXBhcmVfZnVuYworCQkJCQkJCSAgKGRhdGFbaV0gPj4gMTYpLAorCQkJCQkJCSAgZGF0YVtpXSAmICgxIDw8IDE1KSA/CisJCQkJCQkJICAiY2J1ZiBibGVuZCBlbmFibGUsICIKKwkJCQkJCQkgIDogIiIsCisJCQkJCQkJICBkZWNvZGVfYmxlbmRfZmFjdChkYXRhCisJCQkJCQkJCQkgICAgW2ldCisJCQkJCQkJCQkgICAgPj4KKwkJCQkJCQkJCSAgICA4KSwKKwkJCQkJCQkgIGRlY29kZV9ibGVuZF9mYWN0KGRhdGEKKwkJCQkJCQkJCSAgICBbaV0KKwkJCQkJCQkJCSAgICA+PgorCQkJCQkJCQkJICAgIDQpLAorCQkJCQkJCSAgZGF0YVtpXSAmICgxIDw8IDMpID8KKwkJCQkJCQkgICJkZXB0aCB3cml0ZSBlbmFibGUsICIKKwkJCQkJCQkgIDogIiIsCisJCQkJCQkJICBkYXRhW2ldICYgKDEgPDwgMikgPworCQkJCQkJCSAgImNidWYgd3JpdGUgZW5hYmxlLCAiCisJCQkJCQkJICA6ICIiLAorCQkJCQkJCSAgZGF0YVtpXSAmICgweDMpKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDc6CisJCQkJCQlpbnN0cl9vdXQoY3R4LCBpLAorCQkJCQkJCSAgIlM3OiBkZXB0aCBvZmZzZXQgY29uc3RhbnQ6IDB4JTA4eFxuIiwKKwkJCQkJCQkgIGRhdGFbaV0pOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpbnN0cl9vdXQoY3R4LCBpLAorCQkJCQkJICAiUyVkOiAweCUwOHhcbiIsIHdvcmQsIGRhdGFbaV0pOworCQkJCX0KKwkJCQlpKys7CisJCQl9CisJCX0KKwkJaWYgKGxlbiAhPSBpKSB7CisJCQlmcHJpbnRmKG91dCwKKwkJCQkiQmFkIGNvdW50IGluIDNEU1RBVEVfTE9BRF9TVEFURV9JTU1FRElBVEVfMVxuIik7CisJCX0KKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4MDM6CisJCWluc3RyX291dChjdHgsIDAsCisJCQkgICIzRFNUQVRFX0xPQURfU1RBVEVfSU1NRURJQVRFXzJcbiIpOworCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwMGYpICsgMjsKKwkJaSA9IDE7CisJCWZvciAod29yZCA9IDY7IHdvcmQgPD0gMTQ7IHdvcmQrKykgeworCQkJaWYgKGRhdGFbMF0gJiAoMSA8PCB3b3JkKSkgeworCQkJCWlmICh3b3JkID09IDYpCisJCQkJCWluc3RyX291dChjdHgsIGkrKywKKwkJCQkJCSAgIlRCQ0ZcbiIpOworCQkJCWVsc2UgaWYgKHdvcmQgPj0gNyAmJiB3b3JkIDw9IDEwKSB7CisJCQkJCWluc3RyX291dChjdHgsIGkrKywKKwkJCQkJCSAgIlRCJWRDXG4iLCB3b3JkIC0gNyk7CisJCQkJCWluc3RyX291dChjdHgsIGkrKywKKwkJCQkJCSAgIlRCJWRBXG4iLCB3b3JkIC0gNyk7CisJCQkJfSBlbHNlIGlmICh3b3JkID49IDExICYmIHdvcmQgPD0gMTQpIHsKKwkJCQkJaW5zdHJfb3V0KGN0eCwgaSwKKwkJCQkJCSAgIlRNJWRTMDogb2Zmc2V0PTB4JTA4eCwgJXNcbiIsCisJCQkJCQkgIHdvcmQgLSAxMSwKKwkJCQkJCSAgZGF0YVtpXSAmIDB4ZmZmZmZmZmUsCisJCQkJCQkgIGRhdGFbaV0gJiAxID8gInVzZSBmZW5jZSIgOgorCQkJCQkJICAiIik7CisJCQkJCWkrKzsKKwkJCQkJaW5zdHJfb3V0KGN0eCwgaSwKKwkJCQkJCSAgIlRNJWRTMTogaGVpZ2h0PSVpLCB3aWR0aD0laSwgJXNcbiIsCisJCQkJCQkgIHdvcmQgLSAxMSwgZGF0YVtpXSA+PiAyMSwKKwkJCQkJCSAgKGRhdGFbaV0gPj4gMTApICYgMHgzZmYsCisJCQkJCQkgIGRhdGFbaV0gJiAyID8gKGRhdGFbaV0gJiAxID8KKwkJCQkJCQkJICJ5LXRpbGVkIiA6CisJCQkJCQkJCSAieC10aWxlZCIpIDoKKwkJCQkJCSAgIiIpOworCQkJCQlpKys7CisJCQkJCWluc3RyX291dChjdHgsIGksCisJCQkJCQkgICJUTSVkUzI6IHBpdGNoPSVpLCBcbiIsCisJCQkJCQkgIHdvcmQgLSAxMSwKKwkJCQkJCSAgKChkYXRhW2ldID4+IDIxKSArIDEpICogNCk7CisJCQkJCWkrKzsKKwkJCQkJaW5zdHJfb3V0KGN0eCwgaSsrLAorCQkJCQkJICAiVE0lZFMzXG4iLCB3b3JkIC0gMTEpOworCQkJCQlpbnN0cl9vdXQoY3R4LCBpKyssCisJCQkJCQkgICJUTSVkUzQ6IGRmbHQgY29sb3JcbiIsCisJCQkJCQkgIHdvcmQgLSAxMSk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChsZW4gIT0gaSkgeworCQkJZnByaW50ZihvdXQsCisJCQkJIkJhZCBjb3VudCBpbiAzRFNUQVRFX0xPQURfU1RBVEVfSU1NRURJQVRFXzJcbiIpOworCQl9CisJCXJldHVybiBsZW47CisJY2FzZSAweDAwOgorCQlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9NQVBfU1RBVEVcbiIpOworCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwM2YpICsgMjsKKwkJaW5zdHJfb3V0KGN0eCwgMSwgIm1hc2tcbiIpOworCisJCWkgPSAyOworCQlmb3IgKG1hcCA9IDA7IG1hcCA8PSAxNTsgbWFwKyspIHsKKwkJCWlmIChkYXRhWzFdICYgKDEgPDwgbWFwKSkgeworCQkJCWludCB3aWR0aCwgaGVpZ2h0LCBwaXRjaCwgZHdvcmQ7CisJCQkJY29uc3QgY2hhciAqdGlsaW5nOworCisJCQkJZHdvcmQgPSBkYXRhW2ldOworCQkJCWluc3RyX291dChjdHgsIGkrKywKKwkJCQkJICAibWFwICVkIE1TMiAlcyVzJXNcbiIsIG1hcCwKKwkJCQkJICBkd29yZCAmICgxIDw8IDMxKSA/CisJCQkJCSAgInVudHJ1c3RlZCBzdXJmYWNlLCAiIDogIiIsCisJCQkJCSAgZHdvcmQgJiAoMSA8PCAxKSA/CisJCQkJCSAgInZlcnRpY2FsIGxpbmUgc3RyaWRlIGVuYWJsZSwgIiA6ICIiLAorCQkJCQkgIGR3b3JkICYgKDEgPDwgMCkgPworCQkJCQkgICJ2ZXJ0aWNhbCBvZnMgZW5hYmxlLCAiIDogIiIpOworCisJCQkJZHdvcmQgPSBkYXRhW2ldOworCQkJCXdpZHRoID0gKChkd29yZCA+PiAxMCkgJiAoKDEgPDwgMTEpIC0gMSkpICsgMTsKKwkJCQloZWlnaHQgPSAoKGR3b3JkID4+IDIxKSAmICgoMSA8PCAxMSkgLSAxKSkgKyAxOworCisJCQkJdGlsaW5nID0gIm5vbmUiOworCQkJCWlmIChkd29yZCAmICgxIDw8IDIpKQorCQkJCQl0aWxpbmcgPSAiZmVuY2VkIjsKKwkJCQllbHNlIGlmIChkd29yZCAmICgxIDw8IDEpKQorCQkJCQl0aWxpbmcgPSBkd29yZCAmICgxIDw8IDApID8gIlkiIDogIlgiOworCQkJCXR5cGUgPSAiIEJBRCI7CisJCQkJZm9ybWF0ID0gIkJBRCI7CisJCQkJc3dpdGNoICgoZHdvcmQgPj4gNykgJiAweDcpIHsKKwkJCQljYXNlIDE6CisJCQkJCXR5cGUgPSAiOGIiOworCQkJCQlzd2l0Y2ggKChkd29yZCA+PiAzKSAmIDB4ZikgeworCQkJCQljYXNlIDA6CisJCQkJCQlmb3JtYXQgPSAiSSI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxOgorCQkJCQkJZm9ybWF0ID0gIkwiOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNDoKKwkJCQkJCWZvcm1hdCA9ICJBIjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDU6CisJCQkJCQlmb3JtYXQgPSAiIG1vbm8iOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyOgorCQkJCQl0eXBlID0gIjE2YiI7CisJCQkJCXN3aXRjaCAoKGR3b3JkID4+IDMpICYgMHhmKSB7CisJCQkJCWNhc2UgMDoKKwkJCQkJCWZvcm1hdCA9ICIgcmdiNTY1IjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDE6CisJCQkJCQlmb3JtYXQgPSAiIGFyZ2IxNTU1IjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDI6CisJCQkJCQlmb3JtYXQgPSAiIGFyZ2I0NDQ0IjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDU6CisJCQkJCQlmb3JtYXQgPSAiIGF5ODgiOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNjoKKwkJCQkJCWZvcm1hdCA9ICIgYnVtcDY1NSI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA3OgorCQkJCQkJZm9ybWF0ID0gIkkiOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgODoKKwkJCQkJCWZvcm1hdCA9ICJMIjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDk6CisJCQkJCQlmb3JtYXQgPSAiQSI7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIDM6CisJCQkJCXR5cGUgPSAiMzJiIjsKKwkJCQkJc3dpdGNoICgoZHdvcmQgPj4gMykgJiAweGYpIHsKKwkJCQkJY2FzZSAwOgorCQkJCQkJZm9ybWF0ID0gIiBhcmdiODg4OCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxOgorCQkJCQkJZm9ybWF0ID0gIiBhYmdyODg4OCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJZm9ybWF0ID0gIiB4cmdiODg4OCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAzOgorCQkJCQkJZm9ybWF0ID0gIiB4YmdyODg4OCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA0OgorCQkJCQkJZm9ybWF0ID0gIiBxd3Z1ODg4OCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA1OgorCQkJCQkJZm9ybWF0ID0gIiBheHZ1ODg4OCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA2OgorCQkJCQkJZm9ybWF0ID0gIiBseHZ1ODg4OCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA3OgorCQkJCQkJZm9ybWF0ID0gIiB4bHZ1ODg4OCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA4OgorCQkJCQkJZm9ybWF0ID0gIiBhcmdiMjEwMTAxMCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA5OgorCQkJCQkJZm9ybWF0ID0gIiBhYmdyMjEwMTAxMCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxMDoKKwkJCQkJCWZvcm1hdCA9ICIgYXd2dTIxMDEwMTAiOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMTE6CisJCQkJCQlmb3JtYXQgPSAiIGdyMTYxNiI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxMjoKKwkJCQkJCWZvcm1hdCA9ICIgdnUxNjE2IjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDEzOgorCQkJCQkJZm9ybWF0ID0gIiB4STgyNCI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxNDoKKwkJCQkJCWZvcm1hdCA9ICIgeEE4MjQiOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMTU6CisJCQkJCQlmb3JtYXQgPSAiIHhMODI0IjsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNToKKwkJCQkJdHlwZSA9ICI0MjIiOworCQkJCQlzd2l0Y2ggKChkd29yZCA+PiAzKSAmIDB4ZikgeworCQkJCQljYXNlIDA6CisJCQkJCQlmb3JtYXQgPSAiIHl1dl9zd2FweSI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxOgorCQkJCQkJZm9ybWF0ID0gIiB5dXYiOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoKKwkJCQkJCWZvcm1hdCA9ICIgeXV2X3N3YXB1diI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAzOgorCQkJCQkJZm9ybWF0ID0gIiB5dXZfc3dhcHV2eSI7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIDY6CisJCQkJCXR5cGUgPSAiY29tcHJlc3NlZCI7CisJCQkJCXN3aXRjaCAoKGR3b3JkID4+IDMpICYgMHg3KSB7CisJCQkJCWNhc2UgMDoKKwkJCQkJCWZvcm1hdCA9ICIgZHh0MSI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxOgorCQkJCQkJZm9ybWF0ID0gIiBkeHQyXzMiOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoKKwkJCQkJCWZvcm1hdCA9ICIgZHh0NF81IjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDM6CisJCQkJCQlmb3JtYXQgPSAiIGZ4dDEiOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNDoKKwkJCQkJCWZvcm1hdCA9ICIgZHh0MV9yYiI7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIDc6CisJCQkJCXR5cGUgPSAiNGIgaW5kZXhlZCI7CisJCQkJCXN3aXRjaCAoKGR3b3JkID4+IDMpICYgMHhmKSB7CisJCQkJCWNhc2UgNzoKKwkJCQkJCWZvcm1hdCA9ICIgYXJnYjg4ODgiOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWR3b3JkID0gZGF0YVtpXTsKKwkJCQlpbnN0cl9vdXQoY3R4LCBpKyssCisJCQkJCSAgIm1hcCAlZCBNUzMgW3dpZHRoPSVkLCBoZWlnaHQ9JWQsIGZvcm1hdD0lcyVzLCB0aWxpbmc9JXMlc11cbiIsCisJCQkJCSAgbWFwLCB3aWR0aCwgaGVpZ2h0LCB0eXBlLCBmb3JtYXQsCisJCQkJCSAgdGlsaW5nLAorCQkJCQkgIGR3b3JkICYgKDEgPDwgOSkgPyAiIHBhbGV0dGUgc2VsZWN0IiA6CisJCQkJCSAgIiIpOworCisJCQkJZHdvcmQgPSBkYXRhW2ldOworCQkJCXBpdGNoID0KKwkJCQkgICAgNCAqICgoKGR3b3JkID4+IDIxKSAmICgoMSA8PCAxMSkgLSAxKSkgKyAxKTsKKwkJCQlpbnN0cl9vdXQoY3R4LCBpKyssCisJCQkJCSAgIm1hcCAlZCBNUzQgW3BpdGNoPSVkLCBtYXhfbG9kPSVpLCB2b2xfZGVwdGg9JWksIGN1YmVfZmFjZV9lbmE9JXgsICVzXVxuIiwKKwkJCQkJICBtYXAsIHBpdGNoLCAoZHdvcmQgPj4gOSkgJiAweDNmLAorCQkJCQkgIGR3b3JkICYgMHhmZiwgKGR3b3JkID4+IDE1KSAmIDB4M2YsCisJCQkJCSAgZHdvcmQgJiAoMSA8PCA4KSA/ICJtaXBsYXlvdXQgbGVnYWN5IgorCQkJCQkgIDogIm1pcGxheW91dCByaWdodCIpOworCQkJfQorCQl9CisJCWlmIChsZW4gIT0gaSkgeworCQkJZnByaW50ZihvdXQsICJCYWQgY291bnQgaW4gM0RTVEFURV9NQVBfU1RBVEVcbiIpOworCQkJcmV0dXJuIGxlbjsKKwkJfQorCQlyZXR1cm4gbGVuOworCWNhc2UgMHgwNjoKKwkJaW5zdHJfb3V0KGN0eCwgMCwKKwkJCSAgIjNEU1RBVEVfUElYRUxfU0hBREVSX0NPTlNUQU5UU1xuIik7CisJCWxlbiA9IChkYXRhWzBdICYgMHgwMDAwMDBmZikgKyAyOworCisJCWkgPSAyOworCQlmb3IgKGMgPSAwOyBjIDw9IDMxOyBjKyspIHsKKwkJCWlmIChkYXRhWzFdICYgKDEgPDwgYykpIHsKKwkJCQlpbnN0cl9vdXQoY3R4LCBpLCAiQyVkLlggPSAlZlxuIiwgYywKKwkJCQkJICBpbnRfYXNfZmxvYXQoZGF0YVtpXSkpOworCQkJCWkrKzsKKwkJCQlpbnN0cl9vdXQoY3R4LCBpLCAiQyVkLlkgPSAlZlxuIiwKKwkJCQkJICBjLCBpbnRfYXNfZmxvYXQoZGF0YVtpXSkpOworCQkJCWkrKzsKKwkJCQlpbnN0cl9vdXQoY3R4LCBpLCAiQyVkLlogPSAlZlxuIiwKKwkJCQkJICBjLCBpbnRfYXNfZmxvYXQoZGF0YVtpXSkpOworCQkJCWkrKzsKKwkJCQlpbnN0cl9vdXQoY3R4LCBpLCAiQyVkLlcgPSAlZlxuIiwKKwkJCQkJICBjLCBpbnRfYXNfZmxvYXQoZGF0YVtpXSkpOworCQkJCWkrKzsKKwkJCX0KKwkJfQorCQlpZiAobGVuICE9IGkpIHsKKwkJCWZwcmludGYob3V0LAorCQkJCSJCYWQgY291bnQgaW4gM0RTVEFURV9QSVhFTF9TSEFERVJfQ09OU1RBTlRTXG4iKTsKKwkJfQorCQlyZXR1cm4gbGVuOworCWNhc2UgMHgwNToKKwkJaW5zdHJfb3V0KGN0eCwgMCwgIjNEU1RBVEVfUElYRUxfU0hBREVSX1BST0dSQU1cbiIpOworCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwZmYpICsgMjsKKwkJaWYgKChsZW4gLSAxKSAlIDMgIT0gMCB8fCBsZW4gPiAzNzApIHsKKwkJCWZwcmludGYob3V0LAorCQkJCSJCYWQgY291bnQgaW4gM0RTVEFURV9QSVhFTF9TSEFERVJfUFJPR1JBTVxuIik7CisJCX0KKwkJaSA9IDE7CisJCWZvciAoaW5zdHIgPSAwOyBpbnN0ciA8IChsZW4gLSAxKSAvIDM7IGluc3RyKyspIHsKKwkJCWNoYXIgaW5zdHJfcHJlZml4WzEwXTsKKworCQkJc3ByaW50ZihpbnN0cl9wcmVmaXgsICJQUyUwM2QiLCBpbnN0cik7CisJCQlpOTE1X2RlY29kZV9pbnN0cnVjdGlvbihjdHgsIGksCisJCQkJCQlpbnN0cl9wcmVmaXgpOworCQkJaSArPSAzOworCQl9CisJCXJldHVybiBsZW47CisJY2FzZSAweDAxOgorCQlpZiAoSVNfR0VOMihkZXZpZCkpCisJCQlicmVhazsKKwkJaW5zdHJfb3V0KGN0eCwgMCwgIjNEU1RBVEVfU0FNUExFUl9TVEFURVxuIik7CisJCWluc3RyX291dChjdHgsIDEsICJtYXNrXG4iKTsKKwkJbGVuID0gKGRhdGFbMF0gJiAweDAwMDAwMDNmKSArIDI7CisJCWkgPSAyOworCQlmb3IgKHNhbXBsZXIgPSAwOyBzYW1wbGVyIDw9IDE1OyBzYW1wbGVyKyspIHsKKwkJCWlmIChkYXRhWzFdICYgKDEgPDwgc2FtcGxlcikpIHsKKwkJCQl1aW50MzJfdCBkd29yZDsKKwkJCQljb25zdCBjaGFyICptaXBfZmlsdGVyID0gIiI7CisKKwkJCQlkd29yZCA9IGRhdGFbaV07CisJCQkJc3dpdGNoICgoZHdvcmQgPj4gMjApICYgMHgzKSB7CisJCQkJY2FzZSAwOgorCQkJCQltaXBfZmlsdGVyID0gIm5vbmUiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE6CisJCQkJCW1pcF9maWx0ZXIgPSAibmVhcmVzdCI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMzoKKwkJCQkJbWlwX2ZpbHRlciA9ICJsaW5lYXIiOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaW5zdHJfb3V0KGN0eCwgaSsrLAorCQkJCQkgICJzYW1wbGVyICVkIFNTMjolcyVzJXMgIgorCQkJCQkgICJiYXNlX21pcF9sZXZlbD0laSwgbWlwX2ZpbHRlcj0lcywgbWFnX2ZpbHRlcj0lcywgbWluX2ZpbHRlcj0lcyAiCisJCQkJCSAgImxvZF9iaWFzPSUuMmYsJXMgbWF4X2FuaXNvPSVpLCBzaGFkb3dfZnVuYz0lc1xuIiwKKwkJCQkJICBzYW1wbGVyLAorCQkJCQkgIGR3b3JkICYgKDEgPDwgMzEpID8gIiByZXZlcnNlIGdhbW1hLCIKKwkJCQkJICA6ICIiLAorCQkJCQkgIGR3b3JkICYgKDEgPDwgMzApID8gIiBwYWNrZWQycGxhbmFyLCIKKwkJCQkJICA6ICIiLAorCQkJCQkgIGR3b3JkICYgKDEgPDwgMjkpID8KKwkJCQkJICAiIGNvbG9yc3BhY2UgY29udmVyc2lvbiwiIDogIiIsCisJCQkJCSAgKGR3b3JkID4+IDIyKSAmIDB4MWYsIG1pcF9maWx0ZXIsCisJCQkJCSAgZGVjb2RlX3NhbXBsZV9maWx0ZXIoZHdvcmQgPj4gMTcpLAorCQkJCQkgIGRlY29kZV9zYW1wbGVfZmlsdGVyKGR3b3JkID4+IDE0KSwKKwkJCQkJICAoKGR3b3JkID4+IDUpICYgMHgxZmYpIC8gKDB4MTAgKiAxLjApLAorCQkJCQkgIGR3b3JkICYgKDEgPDwgNCkgPyAiIHNoYWRvdywiIDogIiIsCisJCQkJCSAgZHdvcmQgJiAoMSA8PCAzKSA/IDQgOiAyLAorCQkJCQkgIGRlY29kZV9jb21wYXJlX2Z1bmMoZHdvcmQpKTsKKwkJCQlkd29yZCA9IGRhdGFbaV07CisJCQkJaW5zdHJfb3V0KGN0eCwgaSsrLAorCQkJCQkgICJzYW1wbGVyICVkIFNTMzogbWluX2xvZD0lLjJmLCVzICIKKwkJCQkJICAidGNtb2RlX3g9JXMsIHRjbW9kZV95PSVzLCB0Y21vZGVfej0lcywlcyB0ZXhtYXBfaWR4PSVpLCVzXG4iLAorCQkJCQkgIHNhbXBsZXIsCisJCQkJCSAgKChkd29yZCA+PiAyNCkgJiAweGZmKSAvICgweDEwICogMS4wKSwKKwkJCQkJICBkd29yZCAmICgxIDw8IDE3KSA/CisJCQkJCSAgIiBraWxsIHBpeGVsIGVuYWJsZSwiIDogIiIsCisJCQkJCSAgZGVjb2RlX3RleF9jb29yZF9tb2RlKGR3b3JkID4+IDEyKSwKKwkJCQkJICBkZWNvZGVfdGV4X2Nvb3JkX21vZGUoZHdvcmQgPj4gOSksCisJCQkJCSAgZGVjb2RlX3RleF9jb29yZF9tb2RlKGR3b3JkID4+IDYpLAorCQkJCQkgIGR3b3JkICYgKDEgPDwgNSkgPworCQkJCQkgICIgbm9ybWFsaXplZCBjb29yZHMsIiA6ICIiLAorCQkJCQkgIChkd29yZCA+PiAxKSAmIDB4ZiwKKwkJCQkJICBkd29yZCAmICgxIDw8IDApID8gIiBkZWludGVybGFjZXIsIiA6CisJCQkJCSAgIiIpOworCQkJCWR3b3JkID0gZGF0YVtpXTsKKwkJCQlpbnN0cl9vdXQoY3R4LCBpKyssCisJCQkJCSAgInNhbXBsZXIgJWQgU1M0OiBib3JkZXIgY29sb3JcbiIsCisJCQkJCSAgc2FtcGxlcik7CisJCQl9CisJCX0KKwkJaWYgKGxlbiAhPSBpKSB7CisJCQlmcHJpbnRmKG91dCwgIkJhZCBjb3VudCBpbiAzRFNUQVRFX1NBTVBMRVJfU1RBVEVcbiIpOworCQl9CisJCXJldHVybiBsZW47CisJY2FzZSAweDg1OgorCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwMGYpICsgMjsKKworCQlpZiAobGVuICE9IDIpCisJCQlmcHJpbnRmKG91dCwKKwkJCQkiQmFkIGNvdW50IGluIDNEU1RBVEVfREVTVF9CVUZGRVJfVkFSSUFCTEVTXG4iKTsKKworCQlpbnN0cl9vdXQoY3R4LCAwLAorCQkJICAiM0RTVEFURV9ERVNUX0JVRkZFUl9WQVJJQUJMRVNcbiIpOworCisJCXN3aXRjaCAoKGRhdGFbMV0gPj4gOCkgJiAweGYpIHsKKwkJY2FzZSAweDA6CisJCQlmb3JtYXQgPSAiZzgiOworCQkJYnJlYWs7CisJCWNhc2UgMHgxOgorCQkJZm9ybWF0ID0gIngxcjVnNWI1IjsKKwkJCWJyZWFrOworCQljYXNlIDB4MjoKKwkJCWZvcm1hdCA9ICJyNWc2YjUiOworCQkJYnJlYWs7CisJCWNhc2UgMHgzOgorCQkJZm9ybWF0ID0gImE4cjhnOGI4IjsKKwkJCWJyZWFrOworCQljYXNlIDB4NDoKKwkJCWZvcm1hdCA9ICJ5Y3JjYl9zd2FweSI7CisJCQlicmVhazsKKwkJY2FzZSAweDU6CisJCQlmb3JtYXQgPSAieWNyY2Jfbm9ybWFsIjsKKwkJCWJyZWFrOworCQljYXNlIDB4NjoKKwkJCWZvcm1hdCA9ICJ5Y3JjYl9zd2FwdXYiOworCQkJYnJlYWs7CisJCWNhc2UgMHg3OgorCQkJZm9ybWF0ID0gInljcmNiX3N3YXB1dnkiOworCQkJYnJlYWs7CisJCWNhc2UgMHg4OgorCQkJZm9ybWF0ID0gImE0cjRnNGI0IjsKKwkJCWJyZWFrOworCQljYXNlIDB4OToKKwkJCWZvcm1hdCA9ICJhMXI1ZzViNSI7CisJCQlicmVhazsKKwkJY2FzZSAweGE6CisJCQlmb3JtYXQgPSAiYTJyMTBnMTBiMTAiOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmb3JtYXQgPSAiQkFEIjsKKwkJCWJyZWFrOworCQl9CisJCXN3aXRjaCAoKGRhdGFbMV0gPj4gMikgJiAweDMpIHsKKwkJY2FzZSAweDA6CisJCQl6Zm9ybWF0ID0gInUxNiI7CisJCQlicmVhazsKKwkJY2FzZSAweDE6CisJCQl6Zm9ybWF0ID0gImYxNiI7CisJCQlicmVhazsKKwkJY2FzZSAweDI6CisJCQl6Zm9ybWF0ID0gInUyNHg4IjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJemZvcm1hdCA9ICJCQUQiOworCQkJYnJlYWs7CisJCX0KKwkJaW5zdHJfb3V0KGN0eCwgMSwKKwkJCSAgIiVzIGZvcm1hdCwgJXMgZGVwdGggZm9ybWF0LCBlYXJseSBaICVzYWJsZWRcbiIsCisJCQkgIGZvcm1hdCwgemZvcm1hdCwKKwkJCSAgKGRhdGFbMV0gJiAoMSA8PCAzMSkpID8gImVuIiA6ICJkaXMiKTsKKwkJcmV0dXJuIGxlbjsKKworCWNhc2UgMHg4ZToKKwkJeworCQkJY29uc3QgY2hhciAqbmFtZSwgKnRpbGluZzsKKworCQkJbGVuID0gKGRhdGFbMF0gJiAweDAwMDAwMDBmKSArIDI7CisJCQlpZiAobGVuICE9IDMpCisJCQkJZnByaW50ZihvdXQsCisJCQkJCSJCYWQgY291bnQgaW4gM0RTVEFURV9CVUZGRVJfSU5GT1xuIik7CisKKwkJCXN3aXRjaCAoKGRhdGFbMV0gPj4gMjQpICYgMHg3KSB7CisJCQljYXNlIDB4MzoKKwkJCQluYW1lID0gImNvbG9yIjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHg3OgorCQkJCW5hbWUgPSAiZGVwdGgiOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQluYW1lID0gInVua25vd24iOworCQkJCWJyZWFrOworCQkJfQorCisJCQl0aWxpbmcgPSAibm9uZSI7CisJCQlpZiAoZGF0YVsxXSAmICgxIDw8IDIzKSkKKwkJCQl0aWxpbmcgPSAiZmVuY2VkIjsKKwkJCWVsc2UgaWYgKGRhdGFbMV0gJiAoMSA8PCAyMikpCisJCQkJdGlsaW5nID0gZGF0YVsxXSAmICgxIDw8IDIxKSA/ICJZIiA6ICJYIjsKKworCQkJaW5zdHJfb3V0KGN0eCwgMCwgIjNEU1RBVEVfQlVGRkVSX0lORk9cbiIpOworCQkJaW5zdHJfb3V0KGN0eCwgMSwKKwkJCQkgICIlcywgdGlsaW5nID0gJXMsIHBpdGNoPSVkXG4iLCBuYW1lLCB0aWxpbmcsCisJCQkJICBkYXRhWzFdICYgMHhmZmZmKTsKKworCQkJaW5zdHJfb3V0KGN0eCwgMiwgImFkZHJlc3NcbiIpOworCQkJcmV0dXJuIGxlbjsKKwkJfQorCWNhc2UgMHg4MToKKwkJbGVuID0gKGRhdGFbMF0gJiAweDAwMDAwMDBmKSArIDI7CisKKwkJaWYgKGxlbiAhPSAzKQorCQkJZnByaW50ZihvdXQsCisJCQkJIkJhZCBjb3VudCBpbiAzRFNUQVRFX1NDSVNTT1JfUkVDVEFOR0xFXG4iKTsKKworCQlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9TQ0lTU09SX1JFQ1RBTkdMRVxuIik7CisJCWluc3RyX291dChjdHgsIDEsICIoJWQsJWQpXG4iLAorCQkJICBkYXRhWzFdICYgMHhmZmZmLCBkYXRhWzFdID4+IDE2KTsKKwkJaW5zdHJfb3V0KGN0eCwgMiwgIiglZCwlZClcbiIsCisJCQkgIGRhdGFbMl0gJiAweGZmZmYsIGRhdGFbMl0gPj4gMTYpOworCisJCXJldHVybiBsZW47CisJY2FzZSAweDgwOgorCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwMGYpICsgMjsKKworCQlpZiAobGVuICE9IDUpCisJCQlmcHJpbnRmKG91dCwKKwkJCQkiQmFkIGNvdW50IGluIDNEU1RBVEVfRFJBV0lOR19SRUNUQU5HTEVcbiIpOworCisJCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX0RSQVdJTkdfUkVDVEFOR0xFXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMSwgIiVzXG4iLAorCQkJICBkYXRhWzFdICYgKDEgPDwgMzApID8gImRlcHRoIG9mcyBkaXNhYmxlZCAiIDogIiIpOworCQlpbnN0cl9vdXQoY3R4LCAyLCAiKCVkLCVkKVxuIiwKKwkJCSAgZGF0YVsyXSAmIDB4ZmZmZiwgZGF0YVsyXSA+PiAxNik7CisJCWluc3RyX291dChjdHgsIDMsICIoJWQsJWQpXG4iLAorCQkJICBkYXRhWzNdICYgMHhmZmZmLCBkYXRhWzNdID4+IDE2KTsKKwkJaW5zdHJfb3V0KGN0eCwgNCwgIiglZCwlZClcbiIsCisJCQkgIGRhdGFbNF0gJiAweGZmZmYsIGRhdGFbNF0gPj4gMTYpOworCisJCXJldHVybiBsZW47CisJY2FzZSAweDljOgorCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwMDAwMGYpICsgMjsKKworCQlpZiAobGVuICE9IDcpCisJCQlmcHJpbnRmKG91dCwgIkJhZCBjb3VudCBpbiAzRFNUQVRFX0NMRUFSX1BBUkFNRVRFUlNcbiIpOworCisJCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX0NMRUFSX1BBUkFNRVRFUlNcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAxLCAicHJpbV90eXBlPSVzLCBjbGVhcj0lcyVzJXNcbiIsCisJCQkgIGRhdGFbMV0gJiAoMSA8PCAxNikgPyAiQ0xFQVJfUkVDVCIgOiAiWk9ORV9JTklUIiwKKwkJCSAgZGF0YVsxXSAmICgxIDw8IDIpID8gImNvbG9yLCIgOiAiIiwKKwkJCSAgZGF0YVsxXSAmICgxIDw8IDEpID8gImRlcHRoLCIgOiAiIiwKKwkJCSAgZGF0YVsxXSAmICgxIDw8IDApID8gInN0ZW5jaWwsIiA6ICIiKTsKKwkJaW5zdHJfb3V0KGN0eCwgMiwgImNsZWFyIGNvbG9yXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMywgImNsZWFyIGRlcHRoL3N0ZW5jaWxcbiIpOworCQlpbnN0cl9vdXQoY3R4LCA0LCAiY29sb3IgdmFsdWUgKHJnYmE4ODg4KVxuIik7CisJCWluc3RyX291dChjdHgsIDUsICJkZXB0aCB2YWx1ZSAlZlxuIiwKKwkJCSAgaW50X2FzX2Zsb2F0KGRhdGFbNV0pKTsKKwkJaW5zdHJfb3V0KGN0eCwgNiwgImNsZWFyIHN0ZW5jaWxcbiIpOworCQlyZXR1cm4gbGVuOworCX0KKworCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShvcGNvZGVzXzNkXzFkKTsgaWR4KyspIHsKKwkJb3Bjb2RlXzNkXzFkID0gJm9wY29kZXNfM2RfMWRbaWR4XTsKKwkJaWYgKG9wY29kZV8zZF8xZC0+aTgzMF9vbmx5ICYmICFJU19HRU4yKGRldmlkKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgoKGRhdGFbMF0gJiAweDAwZmYwMDAwKSA+PiAxNikgPT0gb3Bjb2RlXzNkXzFkLT5vcGNvZGUpIHsKKwkJCWxlbiA9IDE7CisKKwkJCWluc3RyX291dChjdHgsIDAsICIlc1xuIiwKKwkJCQkgIG9wY29kZV8zZF8xZC0+bmFtZSk7CisJCQlpZiAob3Bjb2RlXzNkXzFkLT5tYXhfbGVuID4gMSkgeworCQkJCWxlbiA9IChkYXRhWzBdICYgMHgwMDAwZmZmZikgKyAyOworCQkJCWlmIChsZW4gPCBvcGNvZGVfM2RfMWQtPm1pbl9sZW4gfHwKKwkJCQkgICAgbGVuID4gb3Bjb2RlXzNkXzFkLT5tYXhfbGVuKSB7CisJCQkJCWZwcmludGYob3V0LCAiQmFkIGNvdW50IGluICVzXG4iLAorCQkJCQkJb3Bjb2RlXzNkXzFkLT5uYW1lKTsKKwkJCQl9CisJCQl9CisKKwkJCWZvciAoaSA9IDE7IGkgPCBsZW47IGkrKykgeworCQkJCWluc3RyX291dChjdHgsIGksICJkd29yZCAlZFxuIiwgaSk7CisJCQl9CisKKwkJCXJldHVybiBsZW47CisJCX0KKwl9CisKKwlpbnN0cl9vdXQoY3R4LCAwLCAiM0QgVU5LTk9XTjogM2RfMWQgb3Bjb2RlID0gMHgleFxuIiwKKwkJICBvcGNvZGUpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitkZWNvZGVfM2RfcHJpbWl0aXZlKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJdWludDMyX3QgKmRhdGEgPSBjdHgtPmRhdGE7CisJdWludDMyX3QgY291bnQgPSBjdHgtPmNvdW50OworCWNoYXIgaW1tZWRpYXRlID0gKGRhdGFbMF0gJiAoMSA8PCAyMykpID09IDA7CisJdW5zaWduZWQgaW50IGxlbiwgaSwgaiwgcmV0OworCWNvbnN0IGNoYXIgKnByaW10eXBlOworCWludCBvcmlnaW5hbF9zMiA9IHNhdmVkX3MyOworCWludCBvcmlnaW5hbF9zNCA9IHNhdmVkX3M0OworCisJc3dpdGNoICgoZGF0YVswXSA+PiAxOCkgJiAweGYpIHsKKwljYXNlIDB4MDoKKwkJcHJpbXR5cGUgPSAiVFJJTElTVCI7CisJCWJyZWFrOworCWNhc2UgMHgxOgorCQlwcmltdHlwZSA9ICJUUklTVFJJUCI7CisJCWJyZWFrOworCWNhc2UgMHgyOgorCQlwcmltdHlwZSA9ICJUUklTVFJJUF9SRVZFUlNFIjsKKwkJYnJlYWs7CisJY2FzZSAweDM6CisJCXByaW10eXBlID0gIlRSSUZBTiI7CisJCWJyZWFrOworCWNhc2UgMHg0OgorCQlwcmltdHlwZSA9ICJQT0xZR09OIjsKKwkJYnJlYWs7CisJY2FzZSAweDU6CisJCXByaW10eXBlID0gIkxJTkVMSVNUIjsKKwkJYnJlYWs7CisJY2FzZSAweDY6CisJCXByaW10eXBlID0gIkxJTkVTVFJJUCI7CisJCWJyZWFrOworCWNhc2UgMHg3OgorCQlwcmltdHlwZSA9ICJSRUNUTElTVCI7CisJCWJyZWFrOworCWNhc2UgMHg4OgorCQlwcmltdHlwZSA9ICJQT0lOVExJU1QiOworCQlicmVhazsKKwljYXNlIDB4OToKKwkJcHJpbXR5cGUgPSAiRElCIjsKKwkJYnJlYWs7CisJY2FzZSAweGE6CisJCXByaW10eXBlID0gIkNMRUFSX1JFQ1QiOworCQlzYXZlZF9zNCA9IDMgPDwgNjsKKwkJc2F2ZWRfczIgPSB+MDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbXR5cGUgPSAidW5rbm93biI7CisJCWJyZWFrOworCX0KKworCS8qIFhYWDogM0RQUklNX0RJQiBub3Qgc3VwcG9ydGVkICovCisJaWYgKGltbWVkaWF0ZSkgeworCQlsZW4gPSAoZGF0YVswXSAmIDB4MDAwM2ZmZmYpICsgMjsKKwkJaW5zdHJfb3V0KGN0eCwgMCwgIjNEUFJJTUlUSVZFIGlubGluZSAlc1xuIiwKKwkJCSAgcHJpbXR5cGUpOworCQlpZiAoY291bnQgPCBsZW4pCisJCQlCVUZGRVJfRkFJTChjb3VudCwgbGVuLCAiM0RQUklNSVRJVkUgaW5saW5lIik7CisJCWlmICghc2F2ZWRfczJfc2V0IHx8ICFzYXZlZF9zNF9zZXQpIHsKKwkJCWZwcmludGYob3V0LCAidW5rbm93biB2ZXJ0ZXggZm9ybWF0XG4iKTsKKwkJCWZvciAoaSA9IDE7IGkgPCBsZW47IGkrKykgeworCQkJCWluc3RyX291dChjdHgsIGksCisJCQkJCSAgIiAgICAgICAgICAgdmVydGV4IGRhdGEgKCVmIGZsb2F0KVxuIiwKKwkJCQkJICBpbnRfYXNfZmxvYXQoZGF0YVtpXSkpOworCQkJfQorCQl9IGVsc2UgeworCQkJdW5zaWduZWQgaW50IHZlcnRleCA9IDA7CisJCQlmb3IgKGkgPSAxOyBpIDwgbGVuOykgeworCQkJCXVuc2lnbmVkIGludCB0YzsKKworI2RlZmluZSBWRVJURVhfT1VUKGZtdCwgLi4uKSBkbyB7CQkJCQlcCisgICAgaWYgKGkgPCBsZW4pCQkJCQkJCVwKKwlpbnN0cl9vdXQoY3R4LCBpLCAiIFYlZC4iZm10IlxuIiwgdmVydGV4LCBfX1ZBX0FSR1NfXyk7IFwKKyAgICBlbHNlCQkJCQkJCQlcCisJZnByaW50ZihvdXQsICIgbWlzc2luZyBkYXRhIGluIFYlZFxuIiwgdmVydGV4KTsJCQlcCisgICAgaSsrOwkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworCQkJCVZFUlRFWF9PVVQoIlggPSAlZiIsIGludF9hc19mbG9hdChkYXRhW2ldKSk7CisJCQkJVkVSVEVYX09VVCgiWSA9ICVmIiwgaW50X2FzX2Zsb2F0KGRhdGFbaV0pKTsKKwkJCQlzd2l0Y2ggKHNhdmVkX3M0ID4+IDYgJiAweDcpIHsKKwkJCQljYXNlIDB4MToKKwkJCQkJVkVSVEVYX09VVCgiWiA9ICVmIiwKKwkJCQkJCSAgIGludF9hc19mbG9hdChkYXRhW2ldKSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMHgyOgorCQkJCQlWRVJURVhfT1VUKCJaID0gJWYiLAorCQkJCQkJICAgaW50X2FzX2Zsb2F0KGRhdGFbaV0pKTsKKwkJCQkJVkVSVEVYX09VVCgiVyA9ICVmIiwKKwkJCQkJCSAgIGludF9hc19mbG9hdChkYXRhW2ldKSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMHgzOgorCQkJCQlicmVhazsKKwkJCQljYXNlIDB4NDoKKwkJCQkJVkVSVEVYX09VVCgiVyA9ICVmIiwKKwkJCQkJCSAgIGludF9hc19mbG9hdChkYXRhW2ldKSk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWZwcmludGYob3V0LCAiYmFkIFM0IHBvc2l0aW9uIG1hc2tcbiIpOworCQkJCX0KKworCQkJCWlmIChzYXZlZF9zNCAmICgxIDw8IDEwKSkgeworCQkJCQlWRVJURVhfT1VUCisJCQkJCSAgICAoImNvbG9yID0gKEE9MHglMDJ4LCBSPTB4JTAyeCwgRz0weCUwMngsICIKKwkJCQkJICAgICAiQj0weCUwMngpIiwgZGF0YVtpXSA+PiAyNCwKKwkJCQkJICAgICAoZGF0YVtpXSA+PiAxNikgJiAweGZmLAorCQkJCQkgICAgIChkYXRhW2ldID4+IDgpICYgMHhmZiwKKwkJCQkJICAgICBkYXRhW2ldICYgMHhmZik7CisJCQkJfQorCQkJCWlmIChzYXZlZF9zNCAmICgxIDw8IDExKSkgeworCQkJCQlWRVJURVhfT1VUCisJCQkJCSAgICAoInNwZWMgPSAoQT0weCUwMngsIFI9MHglMDJ4LCBHPTB4JTAyeCwgIgorCQkJCQkgICAgICJCPTB4JTAyeCkiLCBkYXRhW2ldID4+IDI0LAorCQkJCQkgICAgIChkYXRhW2ldID4+IDE2KSAmIDB4ZmYsCisJCQkJCSAgICAgKGRhdGFbaV0gPj4gOCkgJiAweGZmLAorCQkJCQkgICAgIGRhdGFbaV0gJiAweGZmKTsKKwkJCQl9CisJCQkJaWYgKHNhdmVkX3M0ICYgKDEgPDwgMTIpKQorCQkJCQlWRVJURVhfT1VUKCJ3aWR0aCA9IDB4JTA4eCkiLCBkYXRhW2ldKTsKKworCQkJCWZvciAodGMgPSAwOyB0YyA8PSA3OyB0YysrKSB7CisJCQkJCXN3aXRjaCAoKHNhdmVkX3MyID4+ICh0YyAqIDQpKSAmIDB4ZikgeworCQkJCQljYXNlIDB4MDoKKwkJCQkJCVZFUlRFWF9PVVQoIlQlZC5YID0gJWYiLCB0YywKKwkJCQkJCQkgICBpbnRfYXNfZmxvYXQoZGF0YQorCQkJCQkJCQkJW2ldKSk7CisJCQkJCQlWRVJURVhfT1VUKCJUJWQuWSA9ICVmIiwgdGMsCisJCQkJCQkJICAgaW50X2FzX2Zsb2F0KGRhdGEKKwkJCQkJCQkJCVtpXSkpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMHgxOgorCQkJCQkJVkVSVEVYX09VVCgiVCVkLlggPSAlZiIsIHRjLAorCQkJCQkJCSAgIGludF9hc19mbG9hdChkYXRhCisJCQkJCQkJCQlbaV0pKTsKKwkJCQkJCVZFUlRFWF9PVVQoIlQlZC5ZID0gJWYiLCB0YywKKwkJCQkJCQkgICBpbnRfYXNfZmxvYXQoZGF0YQorCQkJCQkJCQkJW2ldKSk7CisJCQkJCQlWRVJURVhfT1VUKCJUJWQuWiA9ICVmIiwgdGMsCisJCQkJCQkJICAgaW50X2FzX2Zsb2F0KGRhdGEKKwkJCQkJCQkJCVtpXSkpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMHgyOgorCQkJCQkJVkVSVEVYX09VVCgiVCVkLlggPSAlZiIsIHRjLAorCQkJCQkJCSAgIGludF9hc19mbG9hdChkYXRhCisJCQkJCQkJCQlbaV0pKTsKKwkJCQkJCVZFUlRFWF9PVVQoIlQlZC5ZID0gJWYiLCB0YywKKwkJCQkJCQkgICBpbnRfYXNfZmxvYXQoZGF0YQorCQkJCQkJCQkJW2ldKSk7CisJCQkJCQlWRVJURVhfT1VUKCJUJWQuWiA9ICVmIiwgdGMsCisJCQkJCQkJICAgaW50X2FzX2Zsb2F0KGRhdGEKKwkJCQkJCQkJCVtpXSkpOworCQkJCQkJVkVSVEVYX09VVCgiVCVkLlcgPSAlZiIsIHRjLAorCQkJCQkJCSAgIGludF9hc19mbG9hdChkYXRhCisJCQkJCQkJCQlbaV0pKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDB4MzoKKwkJCQkJCVZFUlRFWF9PVVQoIlQlZC5YID0gJWYiLCB0YywKKwkJCQkJCQkgICBpbnRfYXNfZmxvYXQoZGF0YQorCQkJCQkJCQkJW2ldKSk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAweDQ6CisJCQkJCQlWRVJURVhfT1VUCisJCQkJCQkgICAgKCJUJWQuWFkgPSAweCUwOHggaGFsZi1mbG9hdCIsCisJCQkJCQkgICAgIHRjLCBkYXRhW2ldKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDB4NToKKwkJCQkJCVZFUlRFWF9PVVQKKwkJCQkJCSAgICAoIlQlZC5YWSA9IDB4JTA4eCBoYWxmLWZsb2F0IiwKKwkJCQkJCSAgICAgdGMsIGRhdGFbaV0pOworCQkJCQkJVkVSVEVYX09VVAorCQkJCQkJICAgICgiVCVkLlpXID0gMHglMDh4IGhhbGYtZmxvYXQiLAorCQkJCQkJICAgICB0YywgZGF0YVtpXSk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAweGY6CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWZwcmludGYob3V0LAorCQkJCQkJCSJiYWQgUzIuVCVkIGZvcm1hdFxuIiwKKwkJCQkJCQl0Yyk7CisJCQkJCX0KKwkJCQl9CisJCQkJdmVydGV4Kys7CisJCQl9CisJCX0KKworCQlyZXQgPSBsZW47CisJfSBlbHNlIHsKKwkJLyogaW5kaXJlY3QgdmVydGljZXMgKi8KKwkJbGVuID0gZGF0YVswXSAmIDB4MDAwMGZmZmY7CS8qIGluZGV4IGNvdW50ICovCisJCWlmIChkYXRhWzBdICYgKDEgPDwgMTcpKSB7CisJCQkvKiByYW5kb20gdmVydGV4IGFjY2VzcyAqLworCQkJaWYgKGNvdW50IDwgKGxlbiArIDEpIC8gMiArIDEpIHsKKwkJCQlCVUZGRVJfRkFJTChjb3VudCwgKGxlbiArIDEpIC8gMiArIDEsCisJCQkJCSAgICAiM0RQUklNSVRJVkUgcmFuZG9tIGluZGlyZWN0Iik7CisJCQl9CisJCQlpbnN0cl9vdXQoY3R4LCAwLAorCQkJCSAgIjNEUFJJTUlUSVZFIHJhbmRvbSBpbmRpcmVjdCAlcyAoJWQpXG4iLAorCQkJCSAgcHJpbXR5cGUsIGxlbik7CisJCQlpZiAobGVuID09IDApIHsKKwkJCQkvKiB2ZXJ0ZXggaW5kaWNlcyBjb250aW51ZSB1bnRpbCAweGZmZmYgaXMKKwkJCQkgKiBmb3VuZAorCQkJCSAqLworCQkJCWZvciAoaSA9IDE7IGkgPCBjb3VudDsgaSsrKSB7CisJCQkJCWlmICgoZGF0YVtpXSAmIDB4ZmZmZikgPT0gMHhmZmZmKSB7CisJCQkJCQlpbnN0cl9vdXQoY3R4LCBpLAorCQkJCQkJCSAgIiAgICBpbmRpY2VzOiAodGVybWluYXRvcilcbiIpOworCQkJCQkJcmV0ID0gaTsKKwkJCQkJCWdvdG8gb3V0OworCQkJCQl9IGVsc2UgaWYgKChkYXRhW2ldID4+IDE2KSA9PSAweGZmZmYpIHsKKwkJCQkJCWluc3RyX291dChjdHgsIGksCisJCQkJCQkJICAiICAgIGluZGljZXM6IDB4JTA0eCwgKHRlcm1pbmF0b3IpXG4iLAorCQkJCQkJCSAgZGF0YVtpXSAmIDB4ZmZmZik7CisJCQkJCQlyZXQgPSBpOworCQkJCQkJZ290byBvdXQ7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpbnN0cl9vdXQoY3R4LCBpLAorCQkJCQkJCSAgIiAgICBpbmRpY2VzOiAweCUwNHgsIDB4JTA0eFxuIiwKKwkJCQkJCQkgIGRhdGFbaV0gJiAweGZmZmYsCisJCQkJCQkJICBkYXRhW2ldID4+IDE2KTsKKwkJCQkJfQorCQkJCX0KKwkJCQlmcHJpbnRmKG91dCwKKwkJCQkJIjNEUFJJTUlUSVZFOiBubyB0ZXJtaW5hdG9yIGZvdW5kIGluIGluZGV4IGJ1ZmZlclxuIik7CisJCQkJcmV0ID0gY291bnQ7CisJCQkJZ290byBvdXQ7CisJCQl9IGVsc2UgeworCQkJCS8qIGZpeGVkIHNpemUgdmVydGV4IGluZGV4IGJ1ZmZlciAqLworCQkJCWZvciAoaiA9IDEsIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIsIGorKykgeworCQkJCQlpZiAoaSAqIDIgPT0gbGVuIC0gMSkgeworCQkJCQkJaW5zdHJfb3V0KGN0eCwgaiwKKwkJCQkJCQkgICIgICAgaW5kaWNlczogMHglMDR4XG4iLAorCQkJCQkJCSAgZGF0YVtqXSAmIDB4ZmZmZik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpbnN0cl9vdXQoY3R4LCBqLAorCQkJCQkJCSAgIiAgICBpbmRpY2VzOiAweCUwNHgsIDB4JTA0eFxuIiwKKwkJCQkJCQkgIGRhdGFbal0gJiAweGZmZmYsCisJCQkJCQkJICBkYXRhW2pdID4+IDE2KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldCA9IChsZW4gKyAxKSAvIDIgKyAxOworCQkJZ290byBvdXQ7CisJCX0gZWxzZSB7CisJCQkvKiBzZXF1ZW50aWFsIHZlcnRleCBhY2Nlc3MgKi8KKwkJCWluc3RyX291dChjdHgsIDAsCisJCQkJICAiM0RQUklNSVRJVkUgc2VxdWVudGlhbCBpbmRpcmVjdCAlcywgJWQgc3RhcnRpbmcgZnJvbSAiCisJCQkJICAiJWRcbiIsIHByaW10eXBlLCBsZW4sIGRhdGFbMV0gJiAweGZmZmYpOworCQkJaW5zdHJfb3V0KGN0eCwgMSwgIiAgICAgICAgICAgc3RhcnRcbiIpOworCQkJcmV0ID0gMjsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCitvdXQ6CisJc2F2ZWRfczIgPSBvcmlnaW5hbF9zMjsKKwlzYXZlZF9zNCA9IG9yaWdpbmFsX3M0OworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2RlY29kZV8zZChzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCXVpbnQzMl90IG9wY29kZTsKKwl1bnNpZ25lZCBpbnQgaWR4OworCXVpbnQzMl90ICpkYXRhID0gY3R4LT5kYXRhOworCisJc3RydWN0IHsKKwkJdWludDMyX3Qgb3Bjb2RlOworCQl1bnNpZ25lZCBpbnQgbWluX2xlbjsKKwkJdW5zaWduZWQgaW50IG1heF9sZW47CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJfSBvcGNvZGVzXzNkW10gPSB7CisJCXsgMHgwNiwgMSwgMSwgIjNEU1RBVEVfQU5USV9BTElBU0lORyIgfSwKKwkJeyAweDA4LCAxLCAxLCAiM0RTVEFURV9CQUNLRkFDRV9TVEVOQ0lMX09QUyIgfSwKKwkJeyAweDA5LCAxLCAxLCAiM0RTVEFURV9CQUNLRkFDRV9TVEVOQ0lMX01BU0tTIiB9LAorCQl7IDB4MTYsIDEsIDEsICIzRFNUQVRFX0NPT1JEX1NFVF9CSU5ESU5HUyIgfSwKKwkJeyAweDE1LCAxLCAxLCAiM0RTVEFURV9GT0dfQ09MT1IiIH0sCisJCXsgMHgwYiwgMSwgMSwgIjNEU1RBVEVfSU5ERVBFTkRFTlRfQUxQSEFfQkxFTkQiIH0sCisJCXsgMHgwZCwgMSwgMSwgIjNEU1RBVEVfTU9ERVNfNCIgfSwKKwkJeyAweDBjLCAxLCAxLCAiM0RTVEFURV9NT0RFU181IiB9LAorCQl7IDB4MDcsIDEsIDEsICIzRFNUQVRFX1JBU1RFUklaQVRJT05fUlVMRVMifSwKKwl9LCAqb3Bjb2RlXzNkOworCisJb3Bjb2RlID0gKGRhdGFbMF0gJiAweDFmMDAwMDAwKSA+PiAyNDsKKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSAweDFmOgorCQlyZXR1cm4gZGVjb2RlXzNkX3ByaW1pdGl2ZShjdHgpOworCWNhc2UgMHgxZDoKKwkJcmV0dXJuIGRlY29kZV8zZF8xZChjdHgpOworCWNhc2UgMHgxYzoKKwkJcmV0dXJuIGRlY29kZV8zZF8xYyhjdHgpOworCX0KKworCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShvcGNvZGVzXzNkKTsgaWR4KyspIHsKKwkJb3Bjb2RlXzNkID0gJm9wY29kZXNfM2RbaWR4XTsKKwkJaWYgKG9wY29kZSA9PSBvcGNvZGVfM2QtPm9wY29kZSkgeworCQkJdW5zaWduZWQgaW50IGxlbiA9IDEsIGk7CisKKwkJCWluc3RyX291dChjdHgsIDAsICIlc1xuIiwgb3Bjb2RlXzNkLT5uYW1lKTsKKwkJCWlmIChvcGNvZGVfM2QtPm1heF9sZW4gPiAxKSB7CisJCQkJbGVuID0gKGRhdGFbMF0gJiAweGZmKSArIDI7CisJCQkJaWYgKGxlbiA8IG9wY29kZV8zZC0+bWluX2xlbiB8fAorCQkJCSAgICBsZW4gPiBvcGNvZGVfM2QtPm1heF9sZW4pIHsKKwkJCQkJZnByaW50ZihvdXQsICJCYWQgY291bnQgaW4gJXNcbiIsCisJCQkJCQlvcGNvZGVfM2QtPm5hbWUpOworCQkJCX0KKwkJCX0KKworCQkJZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKSB7CisJCQkJaW5zdHJfb3V0KGN0eCwgaSwgImR3b3JkICVkXG4iLCBpKTsKKwkJCX0KKwkJCXJldHVybiBsZW47CisJCX0KKwl9CisKKwlpbnN0cl9vdXQoY3R4LCAwLCAiM0QgVU5LTk9XTjogM2Qgb3Bjb2RlID0gMHgleFxuIiwgb3Bjb2RlKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmdldF85NjVfc3VyZmFjZXR5cGUodW5zaWduZWQgaW50IHN1cmZhY2V0eXBlKQoreworCXN3aXRjaCAoc3VyZmFjZXR5cGUpIHsKKwljYXNlIDA6CisJCXJldHVybiAiMUQiOworCWNhc2UgMToKKwkJcmV0dXJuICIyRCI7CisJY2FzZSAyOgorCQlyZXR1cm4gIjNEIjsKKwljYXNlIDM6CisJCXJldHVybiAiQ1VCRSI7CisJY2FzZSA0OgorCQlyZXR1cm4gIkJVRkZFUiI7CisJY2FzZSA3OgorCQlyZXR1cm4gIk5VTEwiOworCWRlZmF1bHQ6CisJCXJldHVybiAidW5rbm93biI7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0Xzk2NV9kZXB0aGZvcm1hdCh1bnNpZ25lZCBpbnQgZGVwdGhmb3JtYXQpCit7CisJc3dpdGNoIChkZXB0aGZvcm1hdCkgeworCWNhc2UgMDoKKwkJcmV0dXJuICJzOF96MjRmbG9hdCI7CisJY2FzZSAxOgorCQlyZXR1cm4gInozMmZsb2F0IjsKKwljYXNlIDI6CisJCXJldHVybiAiejI0czgiOworCWNhc2UgNToKKwkJcmV0dXJuICJ6MTYiOworCWRlZmF1bHQ6CisJCXJldHVybiAidW5rbm93biI7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0Xzk2NV9lbGVtZW50X2NvbXBvbmVudCh1aW50MzJfdCBkYXRhLCBpbnQgY29tcG9uZW50KQoreworCXVpbnQzMl90IGNvbXBvbmVudF9jb250cm9sID0gKGRhdGEgPj4gKDE2ICsgKDMgLSBjb21wb25lbnQpICogNCkpICYgMHg3OworCisJc3dpdGNoIChjb21wb25lbnRfY29udHJvbCkgeworCWNhc2UgMDoKKwkJcmV0dXJuICJub3N0b3JlIjsKKwljYXNlIDE6CisJCXN3aXRjaCAoY29tcG9uZW50KSB7CisJCWNhc2UgMDoKKwkJCXJldHVybiAiWCI7CisJCWNhc2UgMToKKwkJCXJldHVybiAiWSI7CisJCWNhc2UgMjoKKwkJCXJldHVybiAiWiI7CisJCWNhc2UgMzoKKwkJCXJldHVybiAiVyI7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gImZhaWwiOworCQl9CisJY2FzZSAyOgorCQlyZXR1cm4gIjAuMCI7CisJY2FzZSAzOgorCQlyZXR1cm4gIjEuMCI7CisJY2FzZSA0OgorCQlyZXR1cm4gIjB4MSI7CisJY2FzZSA1OgorCQlyZXR1cm4gIlZJRCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJmYWlsIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfOTY1X3ByaW1fdHlwZSh1aW50MzJfdCBwcmltdHlwZSkKK3sKKwlzd2l0Y2ggKHByaW10eXBlKSB7CisJY2FzZSAweDAxOgorCQlyZXR1cm4gInBvaW50IGxpc3QiOworCWNhc2UgMHgwMjoKKwkJcmV0dXJuICJsaW5lIGxpc3QiOworCWNhc2UgMHgwMzoKKwkJcmV0dXJuICJsaW5lIHN0cmlwIjsKKwljYXNlIDB4MDQ6CisJCXJldHVybiAidHJpIGxpc3QiOworCWNhc2UgMHgwNToKKwkJcmV0dXJuICJ0cmkgc3RyaXAiOworCWNhc2UgMHgwNjoKKwkJcmV0dXJuICJ0cmkgZmFuIjsKKwljYXNlIDB4MDc6CisJCXJldHVybiAicXVhZCBsaXN0IjsKKwljYXNlIDB4MDg6CisJCXJldHVybiAicXVhZCBzdHJpcCI7CisJY2FzZSAweDA5OgorCQlyZXR1cm4gImxpbmUgbGlzdCBhZGoiOworCWNhc2UgMHgwYToKKwkJcmV0dXJuICJsaW5lIHN0cmlwIGFkaiI7CisJY2FzZSAweDBiOgorCQlyZXR1cm4gInRyaSBsaXN0IGFkaiI7CisJY2FzZSAweDBjOgorCQlyZXR1cm4gInRyaSBzdHJpcCBhZGoiOworCWNhc2UgMHgwZDoKKwkJcmV0dXJuICJ0cmkgc3RyaXAgcmV2ZXJzZSI7CisJY2FzZSAweDBlOgorCQlyZXR1cm4gInBvbHlnb24iOworCWNhc2UgMHgwZjoKKwkJcmV0dXJuICJyZWN0IGxpc3QiOworCWNhc2UgMHgxMDoKKwkJcmV0dXJuICJsaW5lIGxvb3AiOworCWNhc2UgMHgxMToKKwkJcmV0dXJuICJwb2ludCBsaXN0IGJmIjsKKwljYXNlIDB4MTI6CisJCXJldHVybiAibGluZSBzdHJpcCBjb250IjsKKwljYXNlIDB4MTM6CisJCXJldHVybiAibGluZSBzdHJpcCBiZiI7CisJY2FzZSAweDE0OgorCQlyZXR1cm4gImxpbmUgc3RyaXAgY29udCBiZiI7CisJY2FzZSAweDE1OgorCQlyZXR1cm4gInRyaSBmYW4gbm8gc3RpcHBsZSI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJmYWlsIjsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2k5NjVfZGVjb2RlX3VyYl9mZW5jZShzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4LCBpbnQgbGVuKQoreworCXVpbnQzMl90IHZzX2ZlbmNlLCBjbGlwX2ZlbmNlLCBnc19mZW5jZSwgc2ZfZmVuY2UsIHZmZV9mZW5jZSwgY3NfZmVuY2U7CisJdWludDMyX3QgKmRhdGEgPSBjdHgtPmRhdGE7CisKKwlpZiAobGVuICE9IDMpCisJCWZwcmludGYob3V0LCAiQmFkIGNvdW50IGluIFVSQl9GRU5DRVxuIik7CisKKwl2c19mZW5jZSA9IGRhdGFbMV0gJiAweDNmZjsKKwlnc19mZW5jZSA9IChkYXRhWzFdID4+IDEwKSAmIDB4M2ZmOworCWNsaXBfZmVuY2UgPSAoZGF0YVsxXSA+PiAyMCkgJiAweDNmZjsKKwlzZl9mZW5jZSA9IGRhdGFbMl0gJiAweDNmZjsKKwl2ZmVfZmVuY2UgPSAoZGF0YVsyXSA+PiAxMCkgJiAweDNmZjsKKwljc19mZW5jZSA9IChkYXRhWzJdID4+IDIwKSAmIDB4N2ZmOworCisJaW5zdHJfb3V0KGN0eCwgMCwgIlVSQl9GRU5DRTogJXMlcyVzJXMlcyVzXG4iLAorCQkgIChkYXRhWzBdID4+IDEzKSAmIDEgPyAiY3MgIiA6ICIiLAorCQkgIChkYXRhWzBdID4+IDEyKSAmIDEgPyAidmZlICIgOiAiIiwKKwkJICAoZGF0YVswXSA+PiAxMSkgJiAxID8gInNmICIgOiAiIiwKKwkJICAoZGF0YVswXSA+PiAxMCkgJiAxID8gImNsaXAgIiA6ICIiLAorCQkgIChkYXRhWzBdID4+IDkpICYgMSA/ICJncyAiIDogIiIsCisJCSAgKGRhdGFbMF0gPj4gOCkgJiAxID8gInZzICIgOiAiIik7CisJaW5zdHJfb3V0KGN0eCwgMSwKKwkJICAidnMgZmVuY2U6ICVkLCBjbGlwX2ZlbmNlOiAlZCwgZ3NfZmVuY2U6ICVkXG4iLAorCQkgIHZzX2ZlbmNlLCBjbGlwX2ZlbmNlLCBnc19mZW5jZSk7CisJaW5zdHJfb3V0KGN0eCwgMiwKKwkJICAic2YgZmVuY2U6ICVkLCB2ZmVfZmVuY2U6ICVkLCBjc19mZW5jZTogJWRcbiIsCisJCSAgc2ZfZmVuY2UsIHZmZV9mZW5jZSwgY3NfZmVuY2UpOworCWlmIChnc19mZW5jZSA8IHZzX2ZlbmNlKQorCQlmcHJpbnRmKG91dCwgImdzIGZlbmNlIDwgdnMgZmVuY2UhXG4iKTsKKwlpZiAoY2xpcF9mZW5jZSA8IGdzX2ZlbmNlKQorCQlmcHJpbnRmKG91dCwgImNsaXAgZmVuY2UgPCBncyBmZW5jZSFcbiIpOworCWlmIChzZl9mZW5jZSA8IGNsaXBfZmVuY2UpCisJCWZwcmludGYob3V0LCAic2YgZmVuY2UgPCBjbGlwIGZlbmNlIVxuIik7CisJaWYgKGNzX2ZlbmNlIDwgc2ZfZmVuY2UpCisJCWZwcmludGYob3V0LCAiY3MgZmVuY2UgPCBzZiBmZW5jZSFcbiIpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHZvaWQKK3N0YXRlX2Jhc2Vfb3V0KHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgsIHVuc2lnbmVkIGludCBpbmRleCwKKwkgICAgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoY3R4LT5kYXRhW2luZGV4XSAmIDEpIHsKKwkJaW5zdHJfb3V0KGN0eCwgaW5kZXgsCisJCQkgICIlcyBzdGF0ZSBiYXNlIGFkZHJlc3MgMHglMDh4XG4iLCBuYW1lLAorCQkJICBjdHgtPmRhdGFbaW5kZXhdICYgfjEpOworCX0gZWxzZSB7CisJCWluc3RyX291dChjdHgsIGluZGV4LCAiJXMgc3RhdGUgYmFzZSBub3QgdXBkYXRlZFxuIiwKKwkJCSAgbmFtZSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorc3RhdGVfbWF4X291dChzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4LCB1bnNpZ25lZCBpbnQgaW5kZXgsCisJICAgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoY3R4LT5kYXRhW2luZGV4XSAmIDEpIHsKKwkJaWYgKGN0eC0+ZGF0YVtpbmRleF0gPT0gMSkgeworCQkJaW5zdHJfb3V0KGN0eCwgaW5kZXgsCisJCQkJICAiJXMgc3RhdGUgdXBwZXIgYm91bmQgZGlzYWJsZWRcbiIsIG5hbWUpOworCQl9IGVsc2UgeworCQkJaW5zdHJfb3V0KGN0eCwgaW5kZXgsCisJCQkJICAiJXMgc3RhdGUgdXBwZXIgYm91bmQgMHglMDh4XG4iLCBuYW1lLAorCQkJCSAgY3R4LT5kYXRhW2luZGV4XSAmIH4xKTsKKwkJfQorCX0gZWxzZSB7CisJCWluc3RyX291dChjdHgsIGluZGV4LAorCQkJICAiJXMgc3RhdGUgdXBwZXIgYm91bmQgbm90IHVwZGF0ZWRcbiIsIG5hbWUpOworCX0KK30KKworc3RhdGljIGludAorZ2VuN18zRFNUQVRFX1ZJRVdQT1JUX1NUQVRFX1BPSU5URVJTX0NDKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJaW5zdHJfb3V0KGN0eCwgMCwgIjNEU1RBVEVfVklFV1BPUlRfU1RBVEVfUE9JTlRFUlNfQ0NcbiIpOworCWluc3RyX291dChjdHgsIDEsICJwb2ludGVyIHRvIENDIHZpZXdwb3J0XG4iKTsKKworCXJldHVybiAyOworfQorCitzdGF0aWMgaW50CitnZW43XzNEU1RBVEVfVklFV1BPUlRfU1RBVEVfUE9JTlRFUlNfU0ZfQ0xJUChzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX1ZJRVdQT1JUX1NUQVRFX1BPSU5URVJTX1NGX0NMSVBcbiIpOworCWluc3RyX291dChjdHgsIDEsICJwb2ludGVyIHRvIFNGX0NMSVAgdmlld3BvcnRcbiIpOworCisJcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbnQKK2dlbjdfM0RTVEFURV9CTEVORF9TVEFURV9QT0lOVEVSUyhzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX0JMRU5EX1NUQVRFX1BPSU5URVJTXG4iKTsKKwlpbnN0cl9vdXQoY3R4LCAxLCAicG9pbnRlciB0byBCTEVORF9TVEFURSBhdCAweCUwOHggKCVzKVxuIiwKKwkJICBjdHgtPmRhdGFbMV0gJiB+MSwKKwkJICAoY3R4LT5kYXRhWzFdICYgMSkgPyAiY2hhbmdlZCIgOiAidW5jaGFuZ2VkIik7CisKKwlyZXR1cm4gMjsKK30KKworc3RhdGljIGludAorZ2VuN18zRFNUQVRFX0RFUFRIX1NURU5DSUxfU1RBVEVfUE9JTlRFUlMoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCkKK3sKKwlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9ERVBUSF9TVEVOQ0lMX1NUQVRFX1BPSU5URVJTXG4iKTsKKwlpbnN0cl9vdXQoY3R4LCAxLAorCQkgICJwb2ludGVyIHRvIERFUFRIX1NURU5DSUxfU1RBVEUgYXQgMHglMDh4ICglcylcbiIsCisJCSAgY3R4LT5kYXRhWzFdICYgfjEsCisJCSAgKGN0eC0+ZGF0YVsxXSAmIDEpID8gImNoYW5nZWQiIDogInVuY2hhbmdlZCIpOworCisJcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbnQKK2dlbjdfM0RTVEFURV9ISUVSX0RFUFRIX0JVRkZFUihzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX0hJRVJfREVQVEhfQlVGRkVSXG4iKTsKKwlpbnN0cl9vdXQoY3R4LCAxLCAicGl0Y2ggJWRiXG4iLAorCQkgIChjdHgtPmRhdGFbMV0gJiAweDFmZmZmKSArIDEpOworCWluc3RyX291dChjdHgsIDIsICJwb2ludGVyIHRvIEhpWiBidWZmZXJcbiIpOworCisJcmV0dXJuIDM7Cit9CisKK3N0YXRpYyBpbnQKK2dlbjZfM0RTVEFURV9DQ19TVEFURV9QT0lOVEVSUyhzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX0NDX1NUQVRFX1BPSU5URVJTXG4iKTsKKwlpbnN0cl9vdXQoY3R4LCAxLCAiYmxlbmQgY2hhbmdlICVkXG4iLCBjdHgtPmRhdGFbMV0gJiAxKTsKKwlpbnN0cl9vdXQoY3R4LCAyLCAiZGVwdGggc3RlbmNpbCBjaGFuZ2UgJWRcbiIsCisJCSAgY3R4LT5kYXRhWzJdICYgMSk7CisJaW5zdHJfb3V0KGN0eCwgMywgImNjIGNoYW5nZSAlZFxuIiwgY3R4LT5kYXRhWzNdICYgMSk7CisKKwlyZXR1cm4gNDsKK30KKworc3RhdGljIGludAorZ2VuN18zRFNUQVRFX0NDX1NUQVRFX1BPSU5URVJTKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJaW5zdHJfb3V0KGN0eCwgMCwgIjNEU1RBVEVfQ0NfU1RBVEVfUE9JTlRFUlNcbiIpOworCWluc3RyX291dChjdHgsIDEsICJwb2ludGVyIHRvIENPTE9SX0NBTENfU1RBVEUgYXQgMHglMDh4ICIKKwkJICAiKCVzKVxuIiwKKwkJICBjdHgtPmRhdGFbMV0gJiB+MSwKKwkJICAoY3R4LT5kYXRhWzFdICYgMSkgPyAiY2hhbmdlZCIgOiAidW5jaGFuZ2VkIik7CisKKwlyZXR1cm4gMjsKK30KKworc3RhdGljIGludAorZ2VuN18zRFNUQVRFX1VSQl91bml0KHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgsIGNvbnN0IGNoYXIgKnVuaXQpCit7CisgICAgaW50IHN0YXJ0X2tiID0gKChjdHgtPmRhdGFbMV0gPj4gMjUpICYgMHgzZikgKiA4OworICAgIC8qIHRoZSBmaWVsZCBpcyAjIG9mIDUxMi1iaXQgcm93cyAtIDEsIHdlIHByaW50IGJ5dGVzICovCisgICAgaW50IGVudHJ5X3NpemUgPSAoKChjdHgtPmRhdGFbMV0gPj4gMTYpICYgMHgxZmYpICsgMSk7CisgICAgaW50IG5yX2VudHJpZXMgPSBjdHgtPmRhdGFbMV0gJiAweGZmZmY7CisKKyAgICBpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9VUkJfJXNcbiIsIHVuaXQpOworICAgIGluc3RyX291dChjdHgsIDEsCisJICAgICAgIiVkS0Igc3RhcnQsIHNpemU9JWQgNjRCIHJvd3MsIG5yX2VudHJpZXM9JWQsIHRvdGFsIHNpemUgJWRCXG4iLAorCSAgICAgIHN0YXJ0X2tiLCBlbnRyeV9zaXplLCBucl9lbnRyaWVzLCBucl9lbnRyaWVzICogNjQgKiBlbnRyeV9zaXplKTsKKworICAgIHJldHVybiAyOworfQorCitzdGF0aWMgaW50CitnZW43XzNEU1RBVEVfVVJCX1ZTKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJcmV0dXJuIGdlbjdfM0RTVEFURV9VUkJfdW5pdChjdHgsICJWUyIpOworfQorCitzdGF0aWMgaW50CitnZW43XzNEU1RBVEVfVVJCX0hTKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJcmV0dXJuIGdlbjdfM0RTVEFURV9VUkJfdW5pdChjdHgsICJIUyIpOworfQorCitzdGF0aWMgaW50CitnZW43XzNEU1RBVEVfVVJCX0RTKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJcmV0dXJuIGdlbjdfM0RTVEFURV9VUkJfdW5pdChjdHgsICJEUyIpOworfQorCitzdGF0aWMgaW50CitnZW43XzNEU1RBVEVfVVJCX0dTKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJcmV0dXJuIGdlbjdfM0RTVEFURV9VUkJfdW5pdChjdHgsICJHUyIpOworfQorCitzdGF0aWMgaW50CitnZW43XzNEU1RBVEVfQ09OU1RBTlQoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCwgY29uc3QgY2hhciAqdW5pdCkKK3sKKwlpbnQgcmxlbls0XTsKKworCXJsZW5bMF0gPSAoY3R4LT5kYXRhWzFdID4+IDApICYgMHhmZmZmOworCXJsZW5bMV0gPSAoY3R4LT5kYXRhWzFdID4+IDE2KSAmIDB4ZmZmZjsKKwlybGVuWzJdID0gKGN0eC0+ZGF0YVsyXSA+PiAwKSAmIDB4ZmZmZjsKKwlybGVuWzNdID0gKGN0eC0+ZGF0YVsyXSA+PiAxNikgJiAweGZmZmY7CisKKwlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9DT05TVEFOVF8lc1xuIiwgdW5pdCk7CisJaW5zdHJfb3V0KGN0eCwgMSwgImxlbiAwID0gJWQsIGxlbiAxID0gJWRcbiIsIHJsZW5bMF0sIHJsZW5bMV0pOworCWluc3RyX291dChjdHgsIDIsICJsZW4gMiA9ICVkLCBsZW4gMyA9ICVkXG4iLCBybGVuWzJdLCBybGVuWzNdKTsKKwlpbnN0cl9vdXQoY3R4LCAzLCAicG9pbnRlciB0byBjb25zdGJ1ZiAwXG4iKTsKKwlpbnN0cl9vdXQoY3R4LCA0LCAicG9pbnRlciB0byBjb25zdGJ1ZiAxXG4iKTsKKwlpbnN0cl9vdXQoY3R4LCA1LCAicG9pbnRlciB0byBjb25zdGJ1ZiAyXG4iKTsKKwlpbnN0cl9vdXQoY3R4LCA2LCAicG9pbnRlciB0byBjb25zdGJ1ZiAzXG4iKTsKKworCXJldHVybiA3OworfQorCitzdGF0aWMgaW50CitnZW43XzNEU1RBVEVfQ09OU1RBTlRfVlMoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCkKK3sKKwlyZXR1cm4gZ2VuN18zRFNUQVRFX0NPTlNUQU5UKGN0eCwgIlZTIik7Cit9CisKK3N0YXRpYyBpbnQKK2dlbjdfM0RTVEFURV9DT05TVEFOVF9HUyhzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCXJldHVybiBnZW43XzNEU1RBVEVfQ09OU1RBTlQoY3R4LCAiR1MiKTsKK30KKworc3RhdGljIGludAorZ2VuN18zRFNUQVRFX0NPTlNUQU5UX1BTKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJcmV0dXJuIGdlbjdfM0RTVEFURV9DT05TVEFOVChjdHgsICJQUyIpOworfQorCitzdGF0aWMgaW50CitnZW43XzNEU1RBVEVfQ09OU1RBTlRfRFMoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCkKK3sKKwlyZXR1cm4gZ2VuN18zRFNUQVRFX0NPTlNUQU5UKGN0eCwgIkRTIik7Cit9CisKK3N0YXRpYyBpbnQKK2dlbjdfM0RTVEFURV9DT05TVEFOVF9IUyhzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCXJldHVybiBnZW43XzNEU1RBVEVfQ09OU1RBTlQoY3R4LCAiSFMiKTsKK30KKworCitzdGF0aWMgaW50CitnZW42XzNEU1RBVEVfV00oc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCkKK3sKKwlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9XTVxuIik7CisJaW5zdHJfb3V0KGN0eCwgMSwgImtlcm5lbCBzdGFydCBwb2ludGVyIDBcbiIpOworCWluc3RyX291dChjdHgsIDIsCisJCSAgIlNQRj0lZCwgVk1FPSVkLCBTYW1wbGVyIENvdW50ICVkLCAiCisJCSAgIkJpbmRpbmcgdGFibGUgY291bnQgJWRcbiIsCisJCSAgKGN0eC0+ZGF0YVsyXSA+PiAzMSkgJiAxLAorCQkgIChjdHgtPmRhdGFbMl0gPj4gMzApICYgMSwKKwkJICAoY3R4LT5kYXRhWzJdID4+IDI3KSAmIDcsCisJCSAgKGN0eC0+ZGF0YVsyXSA+PiAxOCkgJiAweGZmKTsKKwlpbnN0cl9vdXQoY3R4LCAzLCAic2NyYXRjaCBvZmZzZXRcbiIpOworCWluc3RyX291dChjdHgsIDQsCisJCSAgIkRlcHRoIENsZWFyICVkLCBEZXB0aCBSZXNvbHZlICVkLCBIaVogUmVzb2x2ZSAlZCwgIgorCQkgICJEaXNwYXRjaCBHUkYgc3RhcnRbMF0gJWQsIHN0YXJ0WzFdICVkLCBzdGFydFsyXSAlZFxuIiwKKwkJICAoY3R4LT5kYXRhWzRdICYgKDEgPDwgMzApKSAhPSAwLAorCQkgIChjdHgtPmRhdGFbNF0gJiAoMSA8PCAyOCkpICE9IDAsCisJCSAgKGN0eC0+ZGF0YVs0XSAmICgxIDw8IDI3KSkgIT0gMCwKKwkJICAoY3R4LT5kYXRhWzRdID4+IDE2KSAmIDB4N2YsCisJCSAgKGN0eC0+ZGF0YVs0XSA+PiA4KSAmIDB4N2YsCisJCSAgKGN0eC0+ZGF0YVs0XSAmIDB4N2YpKTsKKwlpbnN0cl9vdXQoY3R4LCA1LAorCQkgICJNYXhUaHJlYWRzICVkLCBQUyBLaWxsUGl4ZWwgJWQsIFBTIGNvbXB1dGVkIFogJWQsICIKKwkJICAiUFMgdXNlIHNvdXJjZVogJWQsIFRocmVhZCBEaXNwYXRjaCAlZCwgUFMgdXNlIHNvdXJjZVcgJWQsICIKKwkJICAiRGlzcGF0Y2gzMiAlZCwgRGlzcGF0Y2gxNiAlZCwgRGlzcGF0Y2g4ICVkXG4iLAorCQkgICgoY3R4LT5kYXRhWzVdID4+IDI1KSAmIDB4N2YpICsgMSwKKwkJICAoY3R4LT5kYXRhWzVdICYgKDEgPDwgMjIpKSAhPSAwLAorCQkgIChjdHgtPmRhdGFbNV0gJiAoMSA8PCAyMSkpICE9IDAsCisJCSAgKGN0eC0+ZGF0YVs1XSAmICgxIDw8IDIwKSkgIT0gMCwKKwkJICAoY3R4LT5kYXRhWzVdICYgKDEgPDwgMTkpKSAhPSAwLAorCQkgIChjdHgtPmRhdGFbNV0gJiAoMSA8PCA4KSkgIT0gMCwKKwkJICAoY3R4LT5kYXRhWzVdICYgKDEgPDwgMikpICE9IDAsCisJCSAgKGN0eC0+ZGF0YVs1XSAmICgxIDw8IDEpKSAhPSAwLAorCQkgIChjdHgtPmRhdGFbNV0gJiAoMSA8PCAwKSkgIT0gMCk7CisJaW5zdHJfb3V0KGN0eCwgNiwKKwkJICAiTnVtIFNGIG91dHB1dCAlZCwgUG9zIFhZIG9mZnNldCAlZCwgWlcgaW50ZXJwIG1vZGUgJWQgLCAiCisJCSAgIkJhcnljZW50cmljIGludGVycCBtb2RlIDB4JXgsIFBvaW50IHJhc3RlciBydWxlICVkLCAiCisJCSAgIk11bHRpc2FtcGxlIG1vZGUgJWQsICIKKwkJICAiTXVsdGlzYW1wbGUgRGlzcGF0Y2ggbW9kZSAlZFxuIiwKKwkJICAoY3R4LT5kYXRhWzZdID4+IDIwKSAmIDB4M2YsCisJCSAgKGN0eC0+ZGF0YVs2XSA+PiAxOCkgJiAzLAorCQkgIChjdHgtPmRhdGFbNl0gPj4gMTYpICYgMywKKwkJICAoY3R4LT5kYXRhWzZdID4+IDEwKSAmIDB4M2YsCisJCSAgKGN0eC0+ZGF0YVs2XSAmICgxIDw8IDkpKSAhPSAwLAorCQkgIChjdHgtPmRhdGFbNl0gPj4gMSkgJiAzLAorCQkgIChjdHgtPmRhdGFbNl0gJiAxKSk7CisJaW5zdHJfb3V0KGN0eCwgNywgImtlcm5lbCBzdGFydCBwb2ludGVyIDFcbiIpOworCWluc3RyX291dChjdHgsIDgsICJrZXJuZWwgc3RhcnQgcG9pbnRlciAyXG4iKTsKKworCXJldHVybiA5OworfQorCitzdGF0aWMgaW50CitnZW43XzNEU1RBVEVfV00oc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCkKK3sKKwljb25zdCBjaGFyICpjb21wdXRlZF9kZXB0aCA9ICIiOworCWNvbnN0IGNoYXIgKmVhcmx5X2RlcHRoID0gIiI7CisJY29uc3QgY2hhciAqendfaW50ZXJwID0gIiI7CisKKwlzd2l0Y2ggKChjdHgtPmRhdGFbMV0gPj4gMjMpICYgMHgzKSB7CisJY2FzZSAwOgorCQljb21wdXRlZF9kZXB0aCA9ICIiOworCQlicmVhazsKKwljYXNlIDE6CisJCWNvbXB1dGVkX2RlcHRoID0gImNvbXB1dGVkIGRlcHRoIjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQljb21wdXRlZF9kZXB0aCA9ICJjb21wdXRlZCBkZXB0aCA+PSI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJY29tcHV0ZWRfZGVwdGggPSAiY29tcHV0ZWQgZGVwdGggPD0iOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKChjdHgtPmRhdGFbMV0gPj4gMjEpICYgMHgzKSB7CisJY2FzZSAwOgorCQllYXJseV9kZXB0aCA9ICIiOworCQlicmVhazsKKwljYXNlIDE6CisJCWVhcmx5X2RlcHRoID0gIiwgRURTQ19QU0VYRUMiOworCQlicmVhazsKKwljYXNlIDI6CisJCWVhcmx5X2RlcHRoID0gIiwgRURTQ19QUkVQUyI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJZWFybHlfZGVwdGggPSAiLCBCQUQgRURTQyI7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoKGN0eC0+ZGF0YVsxXSA+PiAxNykgJiAweDMpIHsKKwljYXNlIDA6CisJCWVhcmx5X2RlcHRoID0gIiI7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZWFybHlfZGVwdGggPSAiLCBCQUQgWlcgaW50ZXJwIjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQllYXJseV9kZXB0aCA9ICIsIFpXIGNlbnRyb2lkIjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQllYXJseV9kZXB0aCA9ICIsIFpXIHNhbXBsZSI7CisJCWJyZWFrOworCX0KKworCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX1dNXG4iKTsKKwlpbnN0cl9vdXQoY3R4LCAxLCAiKCVzJXMlcyVzJXMlcyklcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzXG4iLAorCQkgIChjdHgtPmRhdGFbMV0gJiAoMSA8PCAxMSkpID8gIlBQICIgOiAiIiwKKwkJICAoY3R4LT5kYXRhWzFdICYgKDEgPDwgMTIpKSA/ICJQQyAiIDogIiIsCisJCSAgKGN0eC0+ZGF0YVsxXSAmICgxIDw8IDEzKSkgPyAiUFMgIiA6ICIiLAorCQkgIChjdHgtPmRhdGFbMV0gJiAoMSA8PCAxNCkpID8gIk5QUCAiIDogIiIsCisJCSAgKGN0eC0+ZGF0YVsxXSAmICgxIDw8IDE1KSkgPyAiTlBDICIgOiAiIiwKKwkJICAoY3R4LT5kYXRhWzFdICYgKDEgPDwgMTYpKSA/ICJOUFMgIiA6ICIiLAorCQkgIChjdHgtPmRhdGFbMV0gJiAoMSA8PCAzMCkpID8gIiwgZGVwdGggY2xlYXIiIDogIiIsCisJCSAgKGN0eC0+ZGF0YVsxXSAmICgxIDw8IDI5KSkgPyAiIiA6ICIsIGRpc2FibGVkIiwKKwkJICAoY3R4LT5kYXRhWzFdICYgKDEgPDwgMjgpKSA/ICIsIGRlcHRoIHJlc29sdmUiIDogIiIsCisJCSAgKGN0eC0+ZGF0YVsxXSAmICgxIDw8IDI3KSkgPyAiLCBoaXogcmVzb2x2ZSIgOiAiIiwKKwkJICAoY3R4LT5kYXRhWzFdICYgKDEgPDwgMjUpKSA/ICIsIGtpbGwiIDogIiIsCisJCSAgY29tcHV0ZWRfZGVwdGgsCisJCSAgZWFybHlfZGVwdGgsCisJCSAgendfaW50ZXJwLAorCQkgIChjdHgtPmRhdGFbMV0gJiAoMSA8PCAyMCkpID8gIiwgc291cmNlIGRlcHRoIiA6ICIiLAorCQkgIChjdHgtPmRhdGFbMV0gJiAoMSA8PCAxOSkpID8gIiwgc291cmNlIFciIDogIiIsCisJCSAgKGN0eC0+ZGF0YVsxXSAmICgxIDw8IDEwKSkgPyAiLCBjb3ZlcmFnZSIgOiAiIiwKKwkJICAoY3R4LT5kYXRhWzFdICYgKDEgPDwgNCkpID8gIiwgcG9seSBzdGlwcGxlIiA6ICIiLAorCQkgIChjdHgtPmRhdGFbMV0gJiAoMSA8PCAzKSkgPyAiLCBsaW5lIHN0aXBwbGUiIDogIiIsCisJCSAgKGN0eC0+ZGF0YVsxXSAmICgxIDw8IDIpKSA/ICIsIHBvaW50IFVMIiA6ICIsIHBvaW50IFVSIgorCQkgICk7CisJaW5zdHJfb3V0KGN0eCwgMiwgIk1TXG4iKTsKKworCXJldHVybiAzOworfQorCitzdGF0aWMgaW50CitnZW40XzNEUFJJTUlUSVZFKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJaW5zdHJfb3V0KGN0eCwgMCwKKwkJICAiM0RQUklNSVRJVkU6ICVzICVzXG4iLAorCQkgIGdldF85NjVfcHJpbV90eXBlKChjdHgtPmRhdGFbMF0gPj4gMTApICYgMHgxZiksCisJCSAgKGN0eC0+ZGF0YVswXSAmICgxIDw8IDE1KSkgPyAicmFuZG9tIiA6ICJzZXF1ZW50aWFsIik7CisJaW5zdHJfb3V0KGN0eCwgMSwgInZlcnRleCBjb3VudFxuIik7CisJaW5zdHJfb3V0KGN0eCwgMiwgInN0YXJ0IHZlcnRleFxuIik7CisJaW5zdHJfb3V0KGN0eCwgMywgImluc3RhbmNlIGNvdW50XG4iKTsKKwlpbnN0cl9vdXQoY3R4LCA0LCAic3RhcnQgaW5zdGFuY2VcbiIpOworCWluc3RyX291dChjdHgsIDUsICJpbmRleCBiaWFzXG4iKTsKKworCXJldHVybiA2OworfQorCitzdGF0aWMgaW50CitnZW43XzNEUFJJTUlUSVZFKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJYm9vbCBpbmRpcmVjdCA9ICEhKGN0eC0+ZGF0YVswXSAmICgxIDw8IDEwKSk7CisKKwlpbnN0cl9vdXQoY3R4LCAwLAorCQkgICIzRFBSSU1JVElWRTogJXMlc1xuIiwKKwkJICBpbmRpcmVjdCA/ICIgaW5kaXJlY3QiIDogIiIsCisJCSAgKGN0eC0+ZGF0YVswXSAmICgxIDw8IDgpKSA/ICIgcHJlZGljYXRlZCIgOiAiIik7CisJaW5zdHJfb3V0KGN0eCwgMSwgIiVzICVzXG4iLAorCQkgIGdldF85NjVfcHJpbV90eXBlKGN0eC0+ZGF0YVsxXSAmIDB4M2YpLAorCQkgIChjdHgtPmRhdGFbMV0gJiAoMSA8PCA4KSkgPyAicmFuZG9tIiA6ICJzZXF1ZW50aWFsIik7CisJaW5zdHJfb3V0KGN0eCwgMiwgaW5kaXJlY3QgPyAiaWdub3JlZCIgOiAidmVydGV4IGNvdW50XG4iKTsKKwlpbnN0cl9vdXQoY3R4LCAzLCBpbmRpcmVjdCA/ICJpZ25vcmVkIiA6ICJzdGFydCB2ZXJ0ZXhcbiIpOworCWluc3RyX291dChjdHgsIDQsIGluZGlyZWN0ID8gImlnbm9yZWQiIDogImluc3RhbmNlIGNvdW50XG4iKTsKKwlpbnN0cl9vdXQoY3R4LCA1LCBpbmRpcmVjdCA/ICJpZ25vcmVkIiA6ICJzdGFydCBpbnN0YW5jZVxuIik7CisJaW5zdHJfb3V0KGN0eCwgNiwgaW5kaXJlY3QgPyAiaWdub3JlZCIgOiAiaW5kZXggYmlhc1xuIik7CisKKwlyZXR1cm4gNzsKK30KKworc3RhdGljIGludAorZGVjb2RlXzNkXzk2NShzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4KQoreworCXVpbnQzMl90IG9wY29kZTsKKwl1bnNpZ25lZCBpbnQgbGVuOworCXVuc2lnbmVkIGludCBpLCBqLCBzYmFfbGVuOworCWNvbnN0IGNoYXIgKmRlc2MxID0gTlVMTDsKKwl1aW50MzJfdCAqZGF0YSA9IGN0eC0+ZGF0YTsKKwl1aW50MzJfdCBkZXZpZCA9IGN0eC0+ZGV2aWQ7CisKKwlzdHJ1Y3QgeworCQl1aW50MzJfdCBvcGNvZGU7CisJCXVpbnQzMl90IGxlbl9tYXNrOworCQlpbnQgdW5zaWduZWQgbWluX2xlbjsKKwkJaW50IHVuc2lnbmVkIG1heF9sZW47CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCWludCBnZW47CisJCWludCAoKmZ1bmMpKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpOworCX0gb3Bjb2Rlc18zZFtdID0geworCQl7IDB4NjAwMCwgMHgwMGZmLCAzLCAzLCAiVVJCX0ZFTkNFIiB9LAorCQl7IDB4NjAwMSwgMHhmZmZmLCAyLCAyLCAiQ1NfVVJCX1NUQVRFIiB9LAorCQl7IDB4NjAwMiwgMHgwMGZmLCAyLCAyLCAiQ09OU1RBTlRfQlVGRkVSIiB9LAorCQl7IDB4NjEwMSwgMHhmZmZmLCA2LCAxMCwgIlNUQVRFX0JBU0VfQUREUkVTUyIgfSwKKwkJeyAweDYxMDIsIDB4ZmZmZiwgMiwgMiwgIlNUQVRFX1NJUCIgfSwKKwkJeyAweDYxMDQsIDB4ZmZmZiwgMSwgMSwgIjNEU1RBVEVfUElQRUxJTkVfU0VMRUNUIiB9LAorCQl7IDB4NjgwYiwgMHhmZmZmLCAxLCAxLCAiM0RTVEFURV9WRl9TVEFUSVNUSUNTIiB9LAorCQl7IDB4NjkwNCwgMHhmZmZmLCAxLCAxLCAiM0RTVEFURV9QSVBFTElORV9TRUxFQ1QiIH0sCisJCXsgMHg3ODAwLCAweGZmZmYsIDcsIDcsICIzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUyIgfSwKKwkJeyAweDc4MDEsIDB4MDBmZiwgNCwgNiwgIjNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSUyIgfSwKKwkJeyAweDc4MDIsIDB4MDBmZiwgNCwgNCwgIjNEU1RBVEVfU0FNUExFUl9TVEFURV9QT0lOVEVSUyIgfSwKKwkJeyAweDc4MDUsIDB4MDBmZiwgNywgNywgIjNEU1RBVEVfREVQVEhfQlVGRkVSIiwgNyB9LAorCQl7IDB4NzgwNSwgMHgwMGZmLCAzLCAzLCAiM0RTVEFURV9VUkIiIH0sCisJCXsgMHg3ODA0LCAweDAwZmYsIDMsIDMsICIzRFNUQVRFX0NMRUFSX1BBUkFNUyIgfSwKKwkJeyAweDc4MDYsIDB4MDBmZiwgMywgMywgIjNEU1RBVEVfU1RFTkNJTF9CVUZGRVIiIH0sCisJCXsgMHg3OTBmLCAweDAwZmYsIDMsIDMsICIzRFNUQVRFX0hJRVJfREVQVEhfQlVGRkVSIiwgNiB9LAorCQl7IDB4NzgwNywgMHgwMGZmLCAzLCAzLCAiM0RTVEFURV9ISUVSX0RFUFRIX0JVRkZFUiIsIDcsIGdlbjdfM0RTVEFURV9ISUVSX0RFUFRIX0JVRkZFUiB9LAorCQl7IDB4NzgwOCwgMHgwMGZmLCA1LCAyNTcsICIzRFNUQVRFX1ZFUlRFWF9CVUZGRVJTIiB9LAorCQl7IDB4NzgwOSwgMHgwMGZmLCAzLCAyNTYsICIzRFNUQVRFX1ZFUlRFWF9FTEVNRU5UUyIgfSwKKwkJeyAweDc4MGEsIDB4MDBmZiwgMywgMywgIjNEU1RBVEVfSU5ERVhfQlVGRkVSIiB9LAorCQl7IDB4NzgwYiwgMHhmZmZmLCAxLCAxLCAiM0RTVEFURV9WRl9TVEFUSVNUSUNTIiB9LAorCQl7IDB4NzgwZCwgMHgwMGZmLCA0LCA0LCAiM0RTVEFURV9WSUVXUE9SVF9TVEFURV9QT0lOVEVSUyIgfSwKKwkJeyAweDc4MGUsIDB4ZmZmZiwgNCwgNCwgTlVMTCwgNiwgZ2VuNl8zRFNUQVRFX0NDX1NUQVRFX1BPSU5URVJTIH0sCisJCXsgMHg3ODBlLCAweDAwZmYsIDIsIDIsIE5VTEwsIDcsIGdlbjdfM0RTVEFURV9DQ19TVEFURV9QT0lOVEVSUyB9LAorCQl7IDB4NzgwZiwgMHgwMGZmLCAyLCAyLCAiM0RTVEFURV9TQ0lTU09SX1BPSU5URVJTIiB9LAorCQl7IDB4NzgxMCwgMHgwMGZmLCA2LCA2LCAiM0RTVEFURV9WUyIgfSwKKwkJeyAweDc4MTEsIDB4MDBmZiwgNywgNywgIjNEU1RBVEVfR1MiIH0sCisJCXsgMHg3ODEyLCAweDAwZmYsIDQsIDQsICIzRFNUQVRFX0NMSVAiIH0sCisJCXsgMHg3ODEzLCAweDAwZmYsIDIwLCAyMCwgIjNEU1RBVEVfU0YiLCA2IH0sCisJCXsgMHg3ODEzLCAweDAwZmYsIDcsIDcsICIzRFNUQVRFX1NGIiwgNyB9LAorCQl7IDB4NzgxNCwgMHgwMGZmLCAzLCAzLCAiM0RTVEFURV9XTSIsIDcsIGdlbjdfM0RTVEFURV9XTSB9LAorCQl7IDB4NzgxNCwgMHgwMGZmLCA5LCA5LCAiM0RTVEFURV9XTSIsIDYsIGdlbjZfM0RTVEFURV9XTSB9LAorCQl7IDB4NzgxNSwgMHgwMGZmLCA1LCA1LCAiM0RTVEFURV9DT05TVEFOVF9WU19TVEFURSIsIDYgfSwKKwkJeyAweDc4MTUsIDB4MDBmZiwgNywgNywgIjNEU1RBVEVfQ09OU1RBTlRfVlMiLCA3LCBnZW43XzNEU1RBVEVfQ09OU1RBTlRfVlMgfSwKKwkJeyAweDc4MTYsIDB4MDBmZiwgNSwgNSwgIjNEU1RBVEVfQ09OU1RBTlRfR1NfU1RBVEUiLCA2IH0sCisJCXsgMHg3ODE2LCAweDAwZmYsIDcsIDcsICIzRFNUQVRFX0NPTlNUQU5UX0dTIiwgNywgZ2VuN18zRFNUQVRFX0NPTlNUQU5UX0dTIH0sCisJCXsgMHg3ODE3LCAweDAwZmYsIDUsIDUsICIzRFNUQVRFX0NPTlNUQU5UX1BTX1NUQVRFIiwgNiB9LAorCQl7IDB4NzgxNywgMHgwMGZmLCA3LCA3LCAiM0RTVEFURV9DT05TVEFOVF9QUyIsIDcsIGdlbjdfM0RTVEFURV9DT05TVEFOVF9QUyB9LAorCQl7IDB4NzgxOCwgMHhmZmZmLCAyLCAyLCAiM0RTVEFURV9TQU1QTEVfTUFTSyIgfSwKKwkJeyAweDc4MTksIDB4MDBmZiwgNywgNywgIjNEU1RBVEVfQ09OU1RBTlRfSFMiLCA3LCBnZW43XzNEU1RBVEVfQ09OU1RBTlRfSFMgfSwKKwkJeyAweDc4MWEsIDB4MDBmZiwgNywgNywgIjNEU1RBVEVfQ09OU1RBTlRfRFMiLCA3LCBnZW43XzNEU1RBVEVfQ09OU1RBTlRfRFMgfSwKKwkJeyAweDc4MWIsIDB4MDBmZiwgNywgNywgIjNEU1RBVEVfSFMiIH0sCisJCXsgMHg3ODFjLCAweDAwZmYsIDQsIDQsICIzRFNUQVRFX1RFIiB9LAorCQl7IDB4NzgxZCwgMHgwMGZmLCA2LCA2LCAiM0RTVEFURV9EUyIgfSwKKwkJeyAweDc4MWUsIDB4MDBmZiwgMywgMywgIjNEU1RBVEVfU1RSRUFNT1VUIiB9LAorCQl7IDB4NzgxZiwgMHgwMGZmLCAxNCwgMTQsICIzRFNUQVRFX1NCRSIgfSwKKwkJeyAweDc4MjAsIDB4MDBmZiwgOCwgOCwgIjNEU1RBVEVfUFMiIH0sCisJCXsgMHg3ODIxLCAweDAwZmYsIDIsIDIsIE5VTEwsIDcsIGdlbjdfM0RTVEFURV9WSUVXUE9SVF9TVEFURV9QT0lOVEVSU19TRl9DTElQIH0sCisJCXsgMHg3ODIzLCAweDAwZmYsIDIsIDIsIE5VTEwsIDcsIGdlbjdfM0RTVEFURV9WSUVXUE9SVF9TVEFURV9QT0lOVEVSU19DQyB9LAorCQl7IDB4NzgyNCwgMHgwMGZmLCAyLCAyLCBOVUxMLCA3LCBnZW43XzNEU1RBVEVfQkxFTkRfU1RBVEVfUE9JTlRFUlMgfSwKKwkJeyAweDc4MjUsIDB4MDBmZiwgMiwgMiwgTlVMTCwgNywgZ2VuN18zRFNUQVRFX0RFUFRIX1NURU5DSUxfU1RBVEVfUE9JTlRFUlMgfSwKKwkJeyAweDc4MjYsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSU19WUyIgfSwKKwkJeyAweDc4MjcsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSU19IUyIgfSwKKwkJeyAweDc4MjgsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSU19EUyIgfSwKKwkJeyAweDc4MjksIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSU19HUyIgfSwKKwkJeyAweDc4MmEsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSU19QUyIgfSwKKwkJeyAweDc4MmIsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfU0FNUExFUl9TVEFURV9QT0lOVEVSU19WUyIgfSwKKwkJeyAweDc4MmMsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfU0FNUExFUl9TVEFURV9QT0lOVEVSU19IUyIgfSwKKwkJeyAweDc4MmQsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfU0FNUExFUl9TVEFURV9QT0lOVEVSU19EUyIgfSwKKwkJeyAweDc4MmUsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfU0FNUExFUl9TVEFURV9QT0lOVEVSU19HUyIgfSwKKwkJeyAweDc4MmYsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfU0FNUExFUl9TVEFURV9QT0lOVEVSU19QUyIgfSwKKwkJeyAweDc4MzAsIDB4MDBmZiwgMiwgMiwgTlVMTCwgNywgZ2VuN18zRFNUQVRFX1VSQl9WUyB9LAorCQl7IDB4NzgzMSwgMHgwMGZmLCAyLCAyLCBOVUxMLCA3LCBnZW43XzNEU1RBVEVfVVJCX0hTIH0sCisJCXsgMHg3ODMyLCAweDAwZmYsIDIsIDIsIE5VTEwsIDcsIGdlbjdfM0RTVEFURV9VUkJfRFMgfSwKKwkJeyAweDc4MzMsIDB4MDBmZiwgMiwgMiwgTlVMTCwgNywgZ2VuN18zRFNUQVRFX1VSQl9HUyB9LAorCQl7IDB4NzkwMCwgMHhmZmZmLCA0LCA0LCAiM0RTVEFURV9EUkFXSU5HX1JFQ1RBTkdMRSIgfSwKKwkJeyAweDc5MDEsIDB4ZmZmZiwgNSwgNSwgIjNEU1RBVEVfQ09OU1RBTlRfQ09MT1IiIH0sCisJCXsgMHg3OTA1LCAweGZmZmYsIDUsIDcsICIzRFNUQVRFX0RFUFRIX0JVRkZFUiIgfSwKKwkJeyAweDc5MDYsIDB4ZmZmZiwgMiwgMiwgIjNEU1RBVEVfUE9MWV9TVElQUExFX09GRlNFVCIgfSwKKwkJeyAweDc5MDcsIDB4ZmZmZiwgMzMsIDMzLCAiM0RTVEFURV9QT0xZX1NUSVBQTEVfUEFUVEVSTiIgfSwKKwkJeyAweDc5MDgsIDB4ZmZmZiwgMywgMywgIjNEU1RBVEVfTElORV9TVElQUExFIiB9LAorCQl7IDB4NzkwOSwgMHhmZmZmLCAyLCAyLCAiM0RTVEFURV9HTE9CQUxfREVQVEhfT0ZGU0VUX0NMQU1QIiB9LAorCQl7IDB4NzkwOSwgMHhmZmZmLCAyLCAyLCAiM0RTVEFURV9DTEVBUl9QQVJBTVMiIH0sCisJCXsgMHg3OTBhLCAweGZmZmYsIDMsIDMsICIzRFNUQVRFX0FBX0xJTkVfUEFSQU1FVEVSUyIgfSwKKwkJeyAweDc5MGIsIDB4ZmZmZiwgNCwgNCwgIjNEU1RBVEVfR1NfU1ZCX0lOREVYIiB9LAorCQl7IDB4NzkwZCwgMHhmZmZmLCAzLCAzLCAiM0RTVEFURV9NVUxUSVNBTVBMRSIsIDYgfSwKKwkJeyAweDc5MGQsIDB4ZmZmZiwgNCwgNCwgIjNEU1RBVEVfTVVMVElTQU1QTEUiLCA3IH0sCisJCXsgMHg3OTEwLCAweDAwZmYsIDIsIDIsICIzRFNUQVRFX0NMRUFSX1BBUkFNUyIgfSwKKwkJeyAweDc5MTIsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfUFVTSF9DT05TVEFOVF9BTExPQ19WUyIgfSwKKwkJeyAweDc5MTMsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfUFVTSF9DT05TVEFOVF9BTExPQ19IUyIgfSwKKwkJeyAweDc5MTQsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfUFVTSF9DT05TVEFOVF9BTExPQ19EUyIgfSwKKwkJeyAweDc5MTUsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfUFVTSF9DT05TVEFOVF9BTExPQ19HUyIgfSwKKwkJeyAweDc5MTYsIDB4MDBmZiwgMiwgMiwgIjNEU1RBVEVfUFVTSF9DT05TVEFOVF9BTExPQ19QUyIgfSwKKwkJeyAweDc5MTcsIDB4MDBmZiwgMiwgMisxMjgqMiwgIjNEU1RBVEVfU09fREVDTF9MSVNUIiB9LAorCQl7IDB4NzkxOCwgMHgwMGZmLCA0LCA0LCAiM0RTVEFURV9TT19CVUZGRVIiIH0sCisJCXsgMHg3YTAwLCAweDAwZmYsIDQsIDYsICJQSVBFX0NPTlRST0wiIH0sCisJCXsgMHg3YjAwLCAweDAwZmYsIDcsIDcsIE5VTEwsIDcsIGdlbjdfM0RQUklNSVRJVkUgfSwKKwkJeyAweDdiMDAsIDB4MDBmZiwgNiwgNiwgTlVMTCwgMCwgZ2VuNF8zRFBSSU1JVElWRSB9LAorCX0sICpvcGNvZGVfM2QgPSBOVUxMOworCisJb3Bjb2RlID0gKGRhdGFbMF0gJiAweGZmZmYwMDAwKSA+PiAxNjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9wY29kZXNfM2QpOyBpKyspIHsKKwkJaWYgKG9wY29kZSAhPSBvcGNvZGVzXzNkW2ldLm9wY29kZSkKKwkJCWNvbnRpbnVlOworCisJCS8qIElmIGl0J3MgbWFya2VkIGFzIG5vdCBvdXIgZ2VuLCBza2lwLiAqLworCQlpZiAob3Bjb2Rlc18zZFtpXS5nZW4gJiYgb3Bjb2Rlc18zZFtpXS5nZW4gIT0gY3R4LT5nZW4pCisJCQljb250aW51ZTsKKworCQlvcGNvZGVfM2QgPSAmb3Bjb2Rlc18zZFtpXTsKKwkJYnJlYWs7CisJfQorCisJaWYgKG9wY29kZV8zZCkgeworCQlpZiAob3Bjb2RlXzNkLT5tYXhfbGVuID09IDEpCisJCQlsZW4gPSAxOworCQllbHNlCisJCQlsZW4gPSAoZGF0YVswXSAmIG9wY29kZV8zZC0+bGVuX21hc2spICsgMjsKKworCQlpZiAobGVuIDwgb3Bjb2RlXzNkLT5taW5fbGVuIHx8CisJCSAgICBsZW4gPiBvcGNvZGVfM2QtPm1heF9sZW4pIHsKKwkJCWZwcmludGYob3V0LCAiQmFkIGxlbmd0aCAlZCBpbiAlcywgZXhwZWN0ZWQgJWQtJWRcbiIsCisJCQkJbGVuLCBvcGNvZGVfM2QtPm5hbWUsCisJCQkJb3Bjb2RlXzNkLT5taW5fbGVuLCBvcGNvZGVfM2QtPm1heF9sZW4pOworCQl9CisJfSBlbHNlIHsKKwkJbGVuID0gKGRhdGFbMF0gJiAweDAwMDBmZmZmKSArIDI7CisJfQorCisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIDB4NjAwMDoKKwkJcmV0dXJuIGk5NjVfZGVjb2RlX3VyYl9mZW5jZShjdHgsIGxlbik7CisJY2FzZSAweDYwMDE6CisJCWluc3RyX291dChjdHgsIDAsICJDU19VUkJfU1RBVEVcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAxLAorCQkJICAiZW50cnlfc2l6ZTogJWQgWyVkIGJ5dGVzXSwgbl9lbnRyaWVzOiAlZFxuIiwKKwkJCSAgKGRhdGFbMV0gPj4gNCkgJiAweDFmLAorCQkJICAoKChkYXRhWzFdID4+IDQpICYgMHgxZikgKyAxKSAqIDY0LCBkYXRhWzFdICYgMHg3KTsKKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4NjAwMjoKKwkJaW5zdHJfb3V0KGN0eCwgMCwgIkNPTlNUQU5UX0JVRkZFUjogJXNcbiIsCisJCQkgIChkYXRhWzBdID4+IDgpICYgMSA/ICJ2YWxpZCIgOiAiaW52YWxpZCIpOworCQlpbnN0cl9vdXQoY3R4LCAxLAorCQkJICAib2Zmc2V0OiAweCUwOHgsIGxlbmd0aDogJWQgYnl0ZXNcbiIsIGRhdGFbMV0gJiB+MHgzZiwKKwkJCSAgKChkYXRhWzFdICYgMHgzZikgKyAxKSAqIDY0KTsKKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4NjEwMToKKwkJaSA9IDA7CisJCWluc3RyX291dChjdHgsIDAsICJTVEFURV9CQVNFX0FERFJFU1NcbiIpOworCQlpKys7CisKKwkJaWYgKElTX0dFTjYoZGV2aWQpIHx8IElTX0dFTjcoZGV2aWQpKQorCQkJc2JhX2xlbiA9IDEwOworCQllbHNlIGlmIChJU19HRU41KGRldmlkKSkKKwkJCXNiYV9sZW4gPSA4OworCQllbHNlCisJCQlzYmFfbGVuID0gNjsKKwkJaWYgKGxlbiAhPSBzYmFfbGVuKQorCQkJZnByaW50ZihvdXQsICJCYWQgY291bnQgaW4gU1RBVEVfQkFTRV9BRERSRVNTXG4iKTsKKworCQlzdGF0ZV9iYXNlX291dChjdHgsIGkrKywgImdlbmVyYWwiKTsKKwkJc3RhdGVfYmFzZV9vdXQoY3R4LCBpKyssICJzdXJmYWNlIik7CisJCWlmIChJU19HRU42KGRldmlkKSB8fCBJU19HRU43KGRldmlkKSkKKwkJCXN0YXRlX2Jhc2Vfb3V0KGN0eCwgaSsrLCAiZHluYW1pYyIpOworCQlzdGF0ZV9iYXNlX291dChjdHgsIGkrKywgImluZGlyZWN0Iik7CisJCWlmIChJU19HRU41KGRldmlkKSB8fCBJU19HRU42KGRldmlkKSB8fCBJU19HRU43KGRldmlkKSkKKwkJCXN0YXRlX2Jhc2Vfb3V0KGN0eCwgaSsrLCAiaW5zdHJ1Y3Rpb24iKTsKKworCQlzdGF0ZV9tYXhfb3V0KGN0eCwgaSsrLCAiZ2VuZXJhbCIpOworCQlpZiAoSVNfR0VONihkZXZpZCkgfHwgSVNfR0VONyhkZXZpZCkpCisJCQlzdGF0ZV9tYXhfb3V0KGN0eCwgaSsrLCAiZHluYW1pYyIpOworCQlzdGF0ZV9tYXhfb3V0KGN0eCwgaSsrLCAiaW5kaXJlY3QiKTsKKwkJaWYgKElTX0dFTjUoZGV2aWQpIHx8IElTX0dFTjYoZGV2aWQpIHx8IElTX0dFTjcoZGV2aWQpKQorCQkJc3RhdGVfbWF4X291dChjdHgsIGkrKywgImluc3RydWN0aW9uIik7CisKKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4NzgwMDoKKwkJaW5zdHJfb3V0KGN0eCwgMCwgIjNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMSwgIlZTIHN0YXRlXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMiwgIkdTIHN0YXRlXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMywgIkNsaXAgc3RhdGVcbiIpOworCQlpbnN0cl9vdXQoY3R4LCA0LCAiU0Ygc3RhdGVcbiIpOworCQlpbnN0cl9vdXQoY3R4LCA1LCAiV00gc3RhdGVcbiIpOworCQlpbnN0cl9vdXQoY3R4LCA2LCAiQ0Mgc3RhdGVcbiIpOworCQlyZXR1cm4gbGVuOworCWNhc2UgMHg3ODAxOgorCQlpZiAobGVuICE9IDYgJiYgbGVuICE9IDQpCisJCQlmcHJpbnRmKG91dCwKKwkJCQkiQmFkIGNvdW50IGluIDNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSU1xuIik7CisJCWlmIChsZW4gPT0gNikgeworCQkJaW5zdHJfb3V0KGN0eCwgMCwKKwkJCQkgICIzRFNUQVRFX0JJTkRJTkdfVEFCTEVfUE9JTlRFUlNcbiIpOworCQkJaW5zdHJfb3V0KGN0eCwgMSwgIlZTIGJpbmRpbmcgdGFibGVcbiIpOworCQkJaW5zdHJfb3V0KGN0eCwgMiwgIkdTIGJpbmRpbmcgdGFibGVcbiIpOworCQkJaW5zdHJfb3V0KGN0eCwgMywgIkNsaXAgYmluZGluZyB0YWJsZVxuIik7CisJCQlpbnN0cl9vdXQoY3R4LCA0LCAiU0YgYmluZGluZyB0YWJsZVxuIik7CisJCQlpbnN0cl9vdXQoY3R4LCA1LCAiV00gYmluZGluZyB0YWJsZVxuIik7CisJCX0gZWxzZSB7CisJCQlpbnN0cl9vdXQoY3R4LCAwLAorCQkJCSAgIjNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSUzogVlMgbW9kICVkLCAiCisJCQkJICAiR1MgbW9kICVkLCBQUyBtb2QgJWRcbiIsCisJCQkJICAoZGF0YVswXSAmICgxIDw8IDgpKSAhPSAwLAorCQkJCSAgKGRhdGFbMF0gJiAoMSA8PCA5KSkgIT0gMCwKKwkJCQkgIChkYXRhWzBdICYgKDEgPDwgMTIpKSAhPSAwKTsKKwkJCWluc3RyX291dChjdHgsIDEsICJWUyBiaW5kaW5nIHRhYmxlXG4iKTsKKwkJCWluc3RyX291dChjdHgsIDIsICJHUyBiaW5kaW5nIHRhYmxlXG4iKTsKKwkJCWluc3RyX291dChjdHgsIDMsICJXTSBiaW5kaW5nIHRhYmxlXG4iKTsKKwkJfQorCisJCXJldHVybiBsZW47CisJY2FzZSAweDc4MDI6CisJCWluc3RyX291dChjdHgsIDAsCisJCQkgICIzRFNUQVRFX1NBTVBMRVJfU1RBVEVfUE9JTlRFUlM6IFZTIG1vZCAlZCwgIgorCQkJICAiR1MgbW9kICVkLCBQUyBtb2QgJWRcbiIsIChkYXRhWzBdICYgKDEgPDwgOCkpICE9IDAsCisJCQkgIChkYXRhWzBdICYgKDEgPDwgOSkpICE9IDAsCisJCQkgIChkYXRhWzBdICYgKDEgPDwgMTIpKSAhPSAwKTsKKwkJaW5zdHJfb3V0KGN0eCwgMSwgIlZTIHNhbXBsZXIgc3RhdGVcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAyLCAiR1Mgc2FtcGxlciBzdGF0ZVxuIik7CisJCWluc3RyX291dChjdHgsIDMsICJXTSBzYW1wbGVyIHN0YXRlXG4iKTsKKwkJcmV0dXJuIGxlbjsKKwljYXNlIDB4NzgwNToKKwkJLyogQWN0dWFsbHkgM0RTVEFURV9ERVBUSF9CVUZGRVIgb24gZ2VuNy4gKi8KKwkJaWYgKGN0eC0+Z2VuID09IDcpCisJCQlicmVhazsKKworCQlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9VUkJcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAxLAorCQkJICAiVlMgZW50cmllcyAlZCwgYWxsb2Mgc2l6ZSAlZCAoMTAyNGJpdCByb3cpXG4iLAorCQkJICBkYXRhWzFdICYgMHhmZmZmLCAoKGRhdGFbMV0gPj4gMTYpICYgMHgwN2YpICsgMSk7CisJCWluc3RyX291dChjdHgsIDIsCisJCQkgICJHUyBlbnRyaWVzICVkLCBhbGxvYyBzaXplICVkICgxMDI0Yml0IHJvdylcbiIsCisJCQkgIChkYXRhWzJdID4+IDgpICYgMHgzZmYsIChkYXRhWzJdICYgNykgKyAxKTsKKwkJcmV0dXJuIGxlbjsKKworCWNhc2UgMHg3ODA4OgorCQlpZiAoKGxlbiAtIDEpICUgNCAhPSAwKQorCQkJZnByaW50ZihvdXQsICJCYWQgY291bnQgaW4gM0RTVEFURV9WRVJURVhfQlVGRkVSU1xuIik7CisJCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX1ZFUlRFWF9CVUZGRVJTXG4iKTsKKworCQlmb3IgKGkgPSAxOyBpIDwgbGVuOykgeworCQkJaW50IGlkeCwgYWNjZXNzOworCQkJaWYgKElTX0dFTjYoZGV2aWQpKSB7CisJCQkJaWR4ID0gMjY7CisJCQkJYWNjZXNzID0gMjA7CisJCQl9IGVsc2UgeworCQkJCWlkeCA9IDI3OworCQkJCWFjY2VzcyA9IDI2OworCQkJfQorCQkJaW5zdHJfb3V0KGN0eCwgaSwKKwkJCQkgICJidWZmZXIgJWQ6ICVzLCBwaXRjaCAlZGJcbiIsIGRhdGFbaV0gPj4gaWR4LAorCQkJCSAgZGF0YVtpXSAmICgxIDw8IGFjY2VzcykgPyAicmFuZG9tIiA6CisJCQkJICAic2VxdWVudGlhbCIsIGRhdGFbaV0gJiAweDA3ZmYpOworCQkJaSsrOworCQkJaW5zdHJfb3V0KGN0eCwgaSsrLCAiYnVmZmVyIGFkZHJlc3NcbiIpOworCQkJaW5zdHJfb3V0KGN0eCwgaSsrLCAibWF4IGluZGV4XG4iKTsKKwkJCWluc3RyX291dChjdHgsIGkrKywgIm1ielxuIik7CisJCX0KKwkJcmV0dXJuIGxlbjsKKworCWNhc2UgMHg3ODA5OgorCQlpZiAoKGxlbiArIDEpICUgMiAhPSAwKQorCQkJZnByaW50ZihvdXQsICJCYWQgY291bnQgaW4gM0RTVEFURV9WRVJURVhfRUxFTUVOVFNcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9WRVJURVhfRUxFTUVOVFNcbiIpOworCisJCWZvciAoaSA9IDE7IGkgPCBsZW47KSB7CisJCQlpbnN0cl9vdXQoY3R4LCBpLAorCQkJCSAgImJ1ZmZlciAlZDogJXN2YWxpZCwgdHlwZSAweCUwNHgsICIKKwkJCQkgICJzcmMgb2Zmc2V0IDB4JTA0eCBieXRlc1xuIiwKKwkJCQkgIGRhdGFbaV0gPj4gKChJU19HRU42KGRldmlkKSB8fCBJU19HRU43KGRldmlkKSkgPyAyNiA6IDI3KSwKKwkJCQkgIGRhdGFbaV0gJiAoMSA8PCAoKElTX0dFTjYoZGV2aWQpIHx8IElTX0dFTjcoZGV2aWQpKSA/IDI1IDogMjYpKSA/CisJCQkJICAiIiA6ICJpbiIsIChkYXRhW2ldID4+IDE2KSAmIDB4MWZmLAorCQkJCSAgZGF0YVtpXSAmIDB4MDdmZik7CisJCQlpKys7CisJCQlpbnN0cl9vdXQoY3R4LCBpLCAiKCVzLCAlcywgJXMsICVzKSwgIgorCQkJCSAgImRzdCBvZmZzZXQgMHglMDJ4IGJ5dGVzXG4iLAorCQkJCSAgZ2V0Xzk2NV9lbGVtZW50X2NvbXBvbmVudChkYXRhW2ldLCAwKSwKKwkJCQkgIGdldF85NjVfZWxlbWVudF9jb21wb25lbnQoZGF0YVtpXSwgMSksCisJCQkJICBnZXRfOTY1X2VsZW1lbnRfY29tcG9uZW50KGRhdGFbaV0sIDIpLAorCQkJCSAgZ2V0Xzk2NV9lbGVtZW50X2NvbXBvbmVudChkYXRhW2ldLCAzKSwKKwkJCQkgIChkYXRhW2ldICYgMHhmZikgKiA0KTsKKwkJCWkrKzsKKwkJfQorCQlyZXR1cm4gbGVuOworCisJY2FzZSAweDc4MGQ6CisJCWluc3RyX291dChjdHgsIDAsCisJCQkgICIzRFNUQVRFX1ZJRVdQT1JUX1NUQVRFX1BPSU5URVJTXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMSwgImNsaXBcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAyLCAic2ZcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAzLCAiY2NcbiIpOworCQlyZXR1cm4gbGVuOworCisJY2FzZSAweDc4MGE6CisJCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX0lOREVYX0JVRkZFUlxuIik7CisJCWluc3RyX291dChjdHgsIDEsICJiZWdpbm5pbmcgYnVmZmVyIGFkZHJlc3NcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAyLCAiZW5kaW5nIGJ1ZmZlciBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIGxlbjsKKworCWNhc2UgMHg3ODBmOgorCQlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9TQ0lTU09SX1BPSU5URVJTXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMSwgInNjaXNzb3IgcmVjdCBvZmZzZXRcbiIpOworCQlyZXR1cm4gbGVuOworCisJY2FzZSAweDc4MTA6CisJCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX1ZTXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMSwgImtlcm5lbCBwb2ludGVyXG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgMiwKKwkJCSAgIlNQRj0lZCwgVk1FPSVkLCBTYW1wbGVyIENvdW50ICVkLCAiCisJCQkgICJCaW5kaW5nIHRhYmxlIGNvdW50ICVkXG4iLCAoZGF0YVsyXSA+PiAzMSkgJiAxLAorCQkJICAoZGF0YVsyXSA+PiAzMCkgJiAxLCAoZGF0YVsyXSA+PiAyNykgJiA3LAorCQkJICAoZGF0YVsyXSA+PiAxOCkgJiAweGZmKTsKKwkJaW5zdHJfb3V0KGN0eCwgMywgInNjcmF0Y2ggb2Zmc2V0XG4iKTsKKwkJaW5zdHJfb3V0KGN0eCwgNCwKKwkJCSAgIkRpc3BhdGNoIEdSRiBzdGFydCAlZCwgVlVFIHJlYWQgbGVuZ3RoICVkLCAiCisJCQkgICJWVUUgcmVhZCBvZmZzZXQgJWRcbiIsIChkYXRhWzRdID4+IDIwKSAmIDB4MWYsCisJCQkgIChkYXRhWzRdID4+IDExKSAmIDB4M2YsIChkYXRhWzRdID4+IDQpICYgMHgzZik7CisJCWluc3RyX291dChjdHgsIDUsCisJCQkgICJNYXggVGhyZWFkcyAlZCwgVmVydGV4IENhY2hlICVzYWJsZSwgIgorCQkJICAiVlMgZnVuYyAlc2FibGVcbiIsICgoZGF0YVs1XSA+PiAyNSkgJiAweDdmKSArIDEsCisJCQkgIChkYXRhWzVdICYgKDEgPDwgMSkpICE9IDAgPyAiZGlzIiA6ICJlbiIsCisJCQkgIChkYXRhWzVdICYgMSkgIT0gMCA/ICJlbiIgOiAiZGlzIik7CisJCXJldHVybiBsZW47CisKKwljYXNlIDB4NzgxMToKKwkJaW5zdHJfb3V0KGN0eCwgMCwgIjNEU1RBVEVfR1NcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAxLCAia2VybmVsIHBvaW50ZXJcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAyLAorCQkJICAiU1BGPSVkLCBWTUU9JWQsIFNhbXBsZXIgQ291bnQgJWQsICIKKwkJCSAgIkJpbmRpbmcgdGFibGUgY291bnQgJWRcbiIsIChkYXRhWzJdID4+IDMxKSAmIDEsCisJCQkgIChkYXRhWzJdID4+IDMwKSAmIDEsIChkYXRhWzJdID4+IDI3KSAmIDcsCisJCQkgIChkYXRhWzJdID4+IDE4KSAmIDB4ZmYpOworCQlpbnN0cl9vdXQoY3R4LCAzLCAic2NyYXRjaCBvZmZzZXRcbiIpOworCQlpbnN0cl9vdXQoY3R4LCA0LAorCQkJICAiRGlzcGF0Y2ggR1JGIHN0YXJ0ICVkLCBWVUUgcmVhZCBsZW5ndGggJWQsICIKKwkJCSAgIlZVRSByZWFkIG9mZnNldCAlZFxuIiwgKGRhdGFbNF0gJiAweGYpLAorCQkJICAoZGF0YVs0XSA+PiAxMSkgJiAweDNmLCAoZGF0YVs0XSA+PiA0KSAmIDB4M2YpOworCQlpbnN0cl9vdXQoY3R4LCA1LAorCQkJICAiTWF4IFRocmVhZHMgJWQsIFJlbmRlcmluZyAlc2FibGVcbiIsCisJCQkgICgoZGF0YVs1XSA+PiAyNSkgJiAweDdmKSArIDEsCisJCQkgIChkYXRhWzVdICYgKDEgPDwgOCkpICE9IDAgPyAiZW4iIDogImRpcyIpOworCQlpbnN0cl9vdXQoY3R4LCA2LAorCQkJICAiUmVvcmRlciAlc2FibGUsIERpc2NhcmQgQWRqYWNlbnkgJXNhYmxlLCAiCisJCQkgICJHUyAlc2FibGVcbiIsCisJCQkgIChkYXRhWzZdICYgKDEgPDwgMzApKSAhPSAwID8gImVuIiA6ICJkaXMiLAorCQkJICAoZGF0YVs2XSAmICgxIDw8IDI5KSkgIT0gMCA/ICJlbiIgOiAiZGlzIiwKKwkJCSAgKGRhdGFbNl0gJiAoMSA8PCAxNSkpICE9IDAgPyAiZW4iIDogImRpcyIpOworCQlyZXR1cm4gbGVuOworCisJY2FzZSAweDc4MTI6CisJCWluc3RyX291dChjdHgsIDAsICIzRFNUQVRFX0NMSVBcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAxLAorCQkJICAiVXNlckNsaXAgZGlzdGFuY2UgY3VsbCB0ZXN0IG1hc2sgMHgleFxuIiwKKwkJCSAgZGF0YVsxXSAmIDB4ZmYpOworCQlpbnN0cl9vdXQoY3R4LCAyLAorCQkJICAiQ2xpcCAlc2FibGUsIEFQSSBtb2RlICVzLCBWaWV3cG9ydCBYWSB0ZXN0ICVzYWJsZSwgIgorCQkJICAiVmlld3BvcnQgWiB0ZXN0ICVzYWJsZSwgR3VhcmRiYW5kIHRlc3QgJXNhYmxlLCBDbGlwIG1vZGUgJWQsICIKKwkJCSAgIlBlcnNwZWN0aXZlIERpdmlkZSAlc2FibGUsIE5vbi1QZXJzcGVjdGl2ZSBCYXJ5Y2VudHJpYyAlc2FibGUsICIKKwkJCSAgIlRyaSBQcm92b2tpbmcgJWQsIExpbmUgUHJvdm9raW5nICVkLCBUcmlmYW4gUHJvdm9raW5nICVkXG4iLAorCQkJICAoZGF0YVsyXSAmICgxIDw8IDMxKSkgIT0gMCA/ICJlbiIgOiAiZGlzIiwKKwkJCSAgKGRhdGFbMl0gJiAoMSA8PCAzMCkpICE9IDAgPyAiRDNEIiA6ICJPR0wiLAorCQkJICAoZGF0YVsyXSAmICgxIDw8IDI4KSkgIT0gMCA/ICJlbiIgOiAiZGlzIiwKKwkJCSAgKGRhdGFbMl0gJiAoMSA8PCAyNykpICE9IDAgPyAiZW4iIDogImRpcyIsCisJCQkgIChkYXRhWzJdICYgKDEgPDwgMjYpKSAhPSAwID8gImVuIiA6ICJkaXMiLAorCQkJICAoZGF0YVsyXSA+PiAxMykgJiA3LAorCQkJICAoZGF0YVsyXSAmICgxIDw8IDkpKSAhPSAwID8gImRpcyIgOiAiZW4iLAorCQkJICAoZGF0YVsyXSAmICgxIDw8IDgpKSAhPSAwID8gImVuIiA6ICJkaXMiLAorCQkJICAoZGF0YVsyXSA+PiA0KSAmIDMsIChkYXRhWzJdID4+IDIpICYgMywKKwkJCSAgKGRhdGFbMl0gJiAzKSk7CisJCWluc3RyX291dChjdHgsIDMsCisJCQkgICJNaW4gUG9pbnRXaWR0aCAlZCwgTWF4IFBvaW50V2lkdGggJWQsICIKKwkJCSAgIkZvcmNlIFplcm8gUlRBSW5kZXggJXNhYmxlLCBNYXggVlBJbmRleCAlZFxuIiwKKwkJCSAgKGRhdGFbM10gPj4gMTcpICYgMHg3ZmYsIChkYXRhWzNdID4+IDYpICYgMHg3ZmYsCisJCQkgIChkYXRhWzNdICYgKDEgPDwgNSkpICE9IDAgPyAiZW4iIDogImRpcyIsCisJCQkgIChkYXRhWzNdICYgMHhmKSk7CisJCXJldHVybiBsZW47CisKKwljYXNlIDB4NzgxMzoKKwkJaWYgKGN0eC0+Z2VuID09IDcpCisJCQlicmVhazsKKworCQlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9TRlxuIik7CisJCWluc3RyX291dChjdHgsIDEsCisJCQkgICJBdHRyaWIgT3V0ICVkLCBBdHRyaWIgU3dpenpsZSAlc2FibGUsIFZVRSByZWFkIGxlbmd0aCAlZCwgIgorCQkJICAiVlVFIHJlYWQgb2Zmc2V0ICVkXG4iLCAoZGF0YVsxXSA+PiAyMikgJiAweDNmLAorCQkJICAoZGF0YVsxXSAmICgxIDw8IDIxKSkgIT0gMCA/ICJlbiIgOiAiZGlzIiwKKwkJCSAgKGRhdGFbMV0gPj4gMTEpICYgMHgxZiwgKGRhdGFbMV0gPj4gNCkgJiAweDNmKTsKKwkJaW5zdHJfb3V0KGN0eCwgMiwKKwkJCSAgIkxlZ2FjeSBHbG9iYWwgRGVwdGhCaWFzICVzYWJsZSwgRnJvbnRGYWNlIGZpbGwgJWQsIEJGIGZpbGwgJWQsICIKKwkJCSAgIlZQIHRyYW5zZm9ybSAlc2FibGUsIEZyb250V2luZGluZ18lc1xuIiwKKwkJCSAgKGRhdGFbMl0gJiAoMSA8PCAxMSkpICE9IDAgPyAiZW4iIDogImRpcyIsCisJCQkgIChkYXRhWzJdID4+IDUpICYgMywgKGRhdGFbMl0gPj4gMykgJiAzLAorCQkJICAoZGF0YVsyXSAmICgxIDw8IDEpKSAhPSAwID8gImVuIiA6ICJkaXMiLAorCQkJICAoZGF0YVsyXSAmIDEpICE9IDAgPyAiQ0NXIiA6ICJDVyIpOworCQlpbnN0cl9vdXQoY3R4LCAzLAorCQkJICAiQUEgJXNhYmxlLCBDdWxsTW9kZSAlZCwgU2Npc3NvciAlc2FibGUsIE11bHRpc2FtcGxlIG0gb2RlICVkXG4iLAorCQkJICAoZGF0YVszXSAmICgxIDw8IDMxKSkgIT0gMCA/ICJlbiIgOiAiZGlzIiwKKwkJCSAgKGRhdGFbM10gPj4gMjkpICYgMywKKwkJCSAgKGRhdGFbM10gJiAoMSA8PCAxMSkpICE9IDAgPyAiZW4iIDogImRpcyIsCisJCQkgIChkYXRhWzNdID4+IDgpICYgMyk7CisJCWluc3RyX291dChjdHgsIDQsCisJCQkgICJMYXN0IFBpeGVsICVzYWJsZSwgU3ViUGl4ZWwgUHJlY2lzaW9uICVkLCBVc2UgUGl4ZWxXaWR0aCAlZFxuIiwKKwkJCSAgKGRhdGFbNF0gJiAoMSA8PCAzMSkpICE9IDAgPyAiZW4iIDogImRpcyIsCisJCQkgIChkYXRhWzRdICYgKDEgPDwgMTIpKSAhPSAwID8gNCA6IDgsCisJCQkgIChkYXRhWzRdICYgKDEgPDwgMTEpKSAhPSAwKTsKKwkJaW5zdHJfb3V0KGN0eCwgNSwKKwkJCSAgIkdsb2JhbCBEZXB0aCBPZmZzZXQgQ29uc3RhbnQgJWZcbiIsCisJCQkgICooZmxvYXQgKikoJmRhdGFbNV0pKTsKKwkJaW5zdHJfb3V0KGN0eCwgNiwgIkdsb2JhbCBEZXB0aCBPZmZzZXQgU2NhbGUgJWZcbiIsCisJCQkgICooZmxvYXQgKikoJmRhdGFbNl0pKTsKKwkJaW5zdHJfb3V0KGN0eCwgNywgIkdsb2JhbCBEZXB0aCBPZmZzZXQgQ2xhbXAgJWZcbiIsCisJCQkgICooZmxvYXQgKikoJmRhdGFbN10pKTsKKworCQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDg7IGkrKywgaiArPSAyKQorCQkJaW5zdHJfb3V0KGN0eCwgaSArIDgsCisJCQkJICAiQXR0cmliICVkIChPdmVycmlkZSAlcyVzJXMlcywgQ29uc3QgU291cmNlICVkLCBTd2l6emxlIFNlbGVjdCAlZCwgIgorCQkJCSAgIlNvdXJjZSAlZCk7IEF0dHJpYiAlZCAoT3ZlcnJpZGUgJXMlcyVzJXMsIENvbnN0IFNvdXJjZSAlZCwgU3dpenpsZSBTZWxlY3QgJWQsIFNvdXJjZSAlZClcbiIsCisJCQkJICBqICsgMSwKKwkJCQkgIChkYXRhWzggKyBpXSAmICgxIDw8IDMxKSkgIT0gMCA/ICJXIiA6ICIiLAorCQkJCSAgKGRhdGFbOCArIGldICYgKDEgPDwgMzApKSAhPSAwID8gIloiIDogIiIsCisJCQkJICAoZGF0YVs4ICsgaV0gJiAoMSA8PCAyOSkpICE9IDAgPyAiWSIgOiAiIiwKKwkJCQkgIChkYXRhWzggKyBpXSAmICgxIDw8IDI4KSkgIT0gMCA/ICJYIiA6ICIiLAorCQkJCSAgKGRhdGFbOCArIGldID4+IDI1KSAmIDMsCisJCQkJICAoZGF0YVs4ICsgaV0gPj4gMjIpICYgMywKKwkJCQkgIChkYXRhWzggKyBpXSA+PiAxNikgJiAweDFmLCBqLAorCQkJCSAgKGRhdGFbOCArIGldICYgKDEgPDwgMTUpKSAhPSAwID8gIlciIDogIiIsCisJCQkJICAoZGF0YVs4ICsgaV0gJiAoMSA8PCAxNCkpICE9IDAgPyAiWiIgOiAiIiwKKwkJCQkgIChkYXRhWzggKyBpXSAmICgxIDw8IDEzKSkgIT0gMCA/ICJZIiA6ICIiLAorCQkJCSAgKGRhdGFbOCArIGldICYgKDEgPDwgMTIpKSAhPSAwID8gIlgiIDogIiIsCisJCQkJICAoZGF0YVs4ICsgaV0gPj4gOSkgJiAzLAorCQkJCSAgKGRhdGFbOCArIGldID4+IDYpICYgMywgKGRhdGFbOCArIGldICYgMHgxZikpOworCQlpbnN0cl9vdXQoY3R4LCAxNiwKKwkJCSAgIlBvaW50IFNwcml0ZSBUZXhDb29yZCBFbmFibGVcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAxNywgIkNvbnN0IEludGVycCBFbmFibGVcbiIpOworCQlpbnN0cl9vdXQoY3R4LCAxOCwKKwkJCSAgIkF0dHJpYiA3LTAgV3JhcFNob3J0ZXN0IEVuYWJsZVxuIik7CisJCWluc3RyX291dChjdHgsIDE5LAorCQkJICAiQXR0cmliIDE1LTggV3JhcFNob3J0ZXN0IEVuYWJsZVxuIik7CisKKwkJcmV0dXJuIGxlbjsKKworCWNhc2UgMHg3OTAwOgorCQlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9EUkFXSU5HX1JFQ1RBTkdMRVxuIik7CisJCWluc3RyX291dChjdHgsIDEsICJ0b3AgbGVmdDogJWQsJWRcbiIsCisJCQkgIGRhdGFbMV0gJiAweGZmZmYsIChkYXRhWzFdID4+IDE2KSAmIDB4ZmZmZik7CisJCWluc3RyX291dChjdHgsIDIsICJib3R0b20gcmlnaHQ6ICVkLCVkXG4iLAorCQkJICBkYXRhWzJdICYgMHhmZmZmLCAoZGF0YVsyXSA+PiAxNikgJiAweGZmZmYpOworCQlpbnN0cl9vdXQoY3R4LCAzLCAib3JpZ2luOiAlZCwlZFxuIiwKKwkJCSAgKGludClkYXRhWzNdICYgMHhmZmZmLCAoKGludClkYXRhWzNdID4+IDE2KSAmIDB4ZmZmZik7CisKKwkJcmV0dXJuIGxlbjsKKworCWNhc2UgMHg3OTA1OgorCQlpbnN0cl9vdXQoY3R4LCAwLCAiM0RTVEFURV9ERVBUSF9CVUZGRVJcbiIpOworCQlpZiAoSVNfR0VONShkZXZpZCkgfHwgSVNfR0VONihkZXZpZCkpCisJCQlpbnN0cl9vdXQoY3R4LCAxLAorCQkJCSAgIiVzLCAlcywgcGl0Y2ggPSAlZCBieXRlcywgJXN0aWxlZCwgSGlaICVkLCBTZXBhcmF0ZSBTdGVuY2lsICVkXG4iLAorCQkJCSAgZ2V0Xzk2NV9zdXJmYWNldHlwZShkYXRhWzFdID4+IDI5KSwKKwkJCQkgIGdldF85NjVfZGVwdGhmb3JtYXQoKGRhdGFbMV0gPj4gMTgpICYgMHg3KSwKKwkJCQkgIChkYXRhWzFdICYgMHgwMDAxZmZmZikgKyAxLAorCQkJCSAgZGF0YVsxXSAmICgxIDw8IDI3KSA/ICIiIDogIm5vdCAiLAorCQkJCSAgKGRhdGFbMV0gJiAoMSA8PCAyMikpICE9IDAsCisJCQkJICAoZGF0YVsxXSAmICgxIDw8IDIxKSkgIT0gMCk7CisJCWVsc2UKKwkJCWluc3RyX291dChjdHgsIDEsCisJCQkJICAiJXMsICVzLCBwaXRjaCA9ICVkIGJ5dGVzLCAlc3RpbGVkXG4iLAorCQkJCSAgZ2V0Xzk2NV9zdXJmYWNldHlwZShkYXRhWzFdID4+IDI5KSwKKwkJCQkgIGdldF85NjVfZGVwdGhmb3JtYXQoKGRhdGFbMV0gPj4gMTgpICYgMHg3KSwKKwkJCQkgIChkYXRhWzFdICYgMHgwMDAxZmZmZikgKyAxLAorCQkJCSAgZGF0YVsxXSAmICgxIDw8IDI3KSA/ICIiIDogIm5vdCAiKTsKKwkJaW5zdHJfb3V0KGN0eCwgMiwgImRlcHRoIG9mZnNldFxuIik7CisJCWluc3RyX291dChjdHgsIDMsICIlZHglZFxuIiwKKwkJCSAgKChkYXRhWzNdICYgMHgwMDA3ZmZjMCkgPj4gNikgKyAxLAorCQkJICAoKGRhdGFbM10gJiAweGZmZjgwMDAwKSA+PiAxOSkgKyAxKTsKKwkJaW5zdHJfb3V0KGN0eCwgNCwgInZvbHVtZSBkZXB0aFxuIik7CisJCWlmIChsZW4gPj0gNikKKwkJCWluc3RyX291dChjdHgsIDUsICJcbiIpOworCQlpZiAobGVuID49IDcpIHsKKwkJCWlmIChJU19HRU42KGRldmlkKSkKKwkJCQlpbnN0cl9vdXQoY3R4LCA2LCAiXG4iKTsKKwkJCWVsc2UKKwkJCQlpbnN0cl9vdXQoY3R4LCA2LAorCQkJCQkgICJyZW5kZXIgdGFyZ2V0IHZpZXcgZXh0ZW50XG4iKTsKKwkJfQorCisJCXJldHVybiBsZW47CisKKwljYXNlIDB4N2EwMDoKKwkJaWYgKElTX0dFTjYoZGV2aWQpIHx8IElTX0dFTjcoZGV2aWQpKSB7CisJCQlpZiAobGVuICE9IDQgJiYgbGVuICE9IDUpCisJCQkJZnByaW50ZihvdXQsICJCYWQgY291bnQgaW4gUElQRV9DT05UUk9MXG4iKTsKKworCQkJc3dpdGNoICgoZGF0YVsxXSA+PiAxNCkgJiAweDMpIHsKKwkJCWNhc2UgMDoKKwkJCQlkZXNjMSA9ICJubyB3cml0ZSI7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJZGVzYzEgPSAicXdvcmQgd3JpdGUiOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWRlc2MxID0gIlBTX0RFUFRIX0NPVU5UIHdyaXRlIjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlkZXNjMSA9ICJUSU1FU1RBTVAgd3JpdGUiOworCQkJCWJyZWFrOworCQkJfQorCQkJaW5zdHJfb3V0KGN0eCwgMCwgIlBJUEVfQ09OVFJPTFxuIik7CisJCQlpbnN0cl9vdXQoY3R4LCAxLAorCQkJCSAgIiVzLCAlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlc1xuIiwKKwkJCQkgIGRlc2MxLAorCQkJCSAgZGF0YVsxXSAmICgxIDw8IDIwKSA/ICJjcyBzdGFsbCwgIiA6ICIiLAorCQkJCSAgZGF0YVsxXSAmICgxIDw8IDE5KSA/CisJCQkJICAiZ2xvYmFsIHNuYXBzaG90IGNvdW50IHJlc2V0LCAiIDogIiIsCisJCQkJICBkYXRhWzFdICYgKDEgPDwgMTgpID8gInRsYiBpbnZhbGlkYXRlLCAiIDogIiIsCisJCQkJICBkYXRhWzFdICYgKDEgPDwgMTcpID8gImdmZHQgZmx1c2gsICIgOiAiIiwKKwkJCQkgIGRhdGFbMV0gJiAoMSA8PCAxNykgPyAibWVkaWEgc3RhdGUgY2xlYXIsICIgOgorCQkJCSAgIiIsCisJCQkJICBkYXRhWzFdICYgKDEgPDwgMTMpID8gImRlcHRoIHN0YWxsLCAiIDogIiIsCisJCQkJICBkYXRhWzFdICYgKDEgPDwgMTIpID8KKwkJCQkgICJyZW5kZXIgdGFyZ2V0IGNhY2hlIGZsdXNoLCAiIDogIiIsCisJCQkJICBkYXRhWzFdICYgKDEgPDwgMTEpID8KKwkJCQkgICJpbnN0cnVjdGlvbiBjYWNoZSBpbnZhbGlkYXRlLCAiIDogIiIsCisJCQkJICBkYXRhWzFdICYgKDEgPDwgMTApID8KKwkJCQkgICJ0ZXh0dXJlIGNhY2hlIGludmFsaWRhdGUsICIgOiAiIiwKKwkJCQkgIGRhdGFbMV0gJiAoMSA8PCA5KSA/CisJCQkJICAiaW5kaXJlY3Qgc3RhdGUgaW52YWxpZGF0ZSwgIiA6ICIiLAorCQkJCSAgZGF0YVsxXSAmICgxIDw8IDgpID8gIm5vdGlmeSBpcnEsICIgOiAiIiwKKwkJCQkgIGRhdGFbMV0gJiAoMSA8PCA3KSA/ICJQSVBFX0NPTlRST0wgZmx1c2gsICIgOgorCQkJCSAgIiIsCisJCQkJICBkYXRhWzFdICYgKDEgPDwgNikgPyAicHJvdGVjdCBtZW0gYXBwX2lkLCAiIDoKKwkJCQkgICIiLCBkYXRhWzFdICYgKDEgPDwgNSkgPyAiREMgZmx1c2gsICIgOiAiIiwKKwkJCQkgIGRhdGFbMV0gJiAoMSA8PCA0KSA/ICJ2ZiBmZXRjaCBpbnZhbGlkYXRlLCAiIDoKKwkJCQkgICIiLAorCQkJCSAgZGF0YVsxXSAmICgxIDw8IDMpID8KKwkJCQkgICJjb25zdGFudCBjYWNoZSBpbnZhbGlkYXRlLCAiIDogIiIsCisJCQkJICBkYXRhWzFdICYgKDEgPDwgMikgPworCQkJCSAgInN0YXRlIGNhY2hlIGludmFsaWRhdGUsICIgOiAiIiwKKwkJCQkgIGRhdGFbMV0gJiAoMSA8PCAxKSA/ICJzdGFsbCBhdCBzY29yZWJvYXJkLCAiIDoKKwkJCQkgICIiLAorCQkJCSAgZGF0YVsxXSAmICgxIDw8IDApID8gImRlcHRoIGNhY2hlIGZsdXNoLCAiIDoKKwkJCQkgICIiKTsKKwkJCWlmIChsZW4gPT0gNSkgeworCQkJCWluc3RyX291dChjdHgsIDIsCisJCQkJCSAgImRlc3RpbmF0aW9uIGFkZHJlc3NcbiIpOworCQkJCWluc3RyX291dChjdHgsIDMsCisJCQkJCSAgImltbWVkaWF0ZSBkd29yZCBsb3dcbiIpOworCQkJCWluc3RyX291dChjdHgsIDQsCisJCQkJCSAgImltbWVkaWF0ZSBkd29yZCBoaWdoXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJZm9yIChpID0gMjsgaSA8IGxlbjsgaSsrKSB7CisJCQkJCWluc3RyX291dChjdHgsIGksICJcbiIpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBsZW47CisJCX0gZWxzZSB7CisJCQlpZiAobGVuICE9IDQpCisJCQkJZnByaW50ZihvdXQsICJCYWQgY291bnQgaW4gUElQRV9DT05UUk9MXG4iKTsKKworCQkJc3dpdGNoICgoZGF0YVswXSA+PiAxNCkgJiAweDMpIHsKKwkJCWNhc2UgMDoKKwkJCQlkZXNjMSA9ICJubyB3cml0ZSI7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJZGVzYzEgPSAicXdvcmQgd3JpdGUiOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWRlc2MxID0gIlBTX0RFUFRIX0NPVU5UIHdyaXRlIjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlkZXNjMSA9ICJUSU1FU1RBTVAgd3JpdGUiOworCQkJCWJyZWFrOworCQkJfQorCQkJaW5zdHJfb3V0KGN0eCwgMCwKKwkJCQkgICJQSVBFX0NPTlRST0w6ICVzLCAlc2RlcHRoIHN0YWxsLCAlc1JDIHdyaXRlIGZsdXNoLCAiCisJCQkJICAiJXNpbnN0IGZsdXNoXG4iLAorCQkJCSAgZGVzYzEsCisJCQkJICBkYXRhWzBdICYgKDEgPDwgMTMpID8gIiIgOiAibm8gIiwKKwkJCQkgIGRhdGFbMF0gJiAoMSA8PCAxMikgPyAiIiA6ICJubyAiLAorCQkJCSAgZGF0YVswXSAmICgxIDw8IDExKSA/ICIiIDogIm5vICIpOworCQkJaW5zdHJfb3V0KGN0eCwgMSwgImRlc3RpbmF0aW9uIGFkZHJlc3NcbiIpOworCQkJaW5zdHJfb3V0KGN0eCwgMiwgImltbWVkaWF0ZSBkd29yZCBsb3dcbiIpOworCQkJaW5zdHJfb3V0KGN0eCwgMywgImltbWVkaWF0ZSBkd29yZCBoaWdoXG4iKTsKKwkJCXJldHVybiBsZW47CisJCX0KKwl9CisKKwlpZiAob3Bjb2RlXzNkKSB7CisJCWlmIChvcGNvZGVfM2QtPmZ1bmMpIHsKKwkJCXJldHVybiBvcGNvZGVfM2QtPmZ1bmMoY3R4KTsKKwkJfSBlbHNlIHsKKwkJCWluc3RyX291dChjdHgsIDAsICIlc1xuIiwgb3Bjb2RlXzNkLT5uYW1lKTsKKworCQkJZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKSB7CisJCQkJaW5zdHJfb3V0KGN0eCwgaSwgImR3b3JkICVkXG4iLCBpKTsKKwkJCX0KKwkJCXJldHVybiBsZW47CisJCX0KKwl9CisKKwlpbnN0cl9vdXQoY3R4LCAwLCAiM0QgVU5LTk9XTjogM2RfOTY1IG9wY29kZSA9IDB4JXhcbiIsCisJCSAgb3Bjb2RlKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorZGVjb2RlXzNkX2k4MzAoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eCkKK3sKKwl1bnNpZ25lZCBpbnQgaWR4OworCXVpbnQzMl90IG9wY29kZTsKKwl1aW50MzJfdCAqZGF0YSA9IGN0eC0+ZGF0YTsKKworCXN0cnVjdCB7CisJCXVpbnQzMl90IG9wY29kZTsKKwkJdW5zaWduZWQgaW50IG1pbl9sZW47CisJCXVuc2lnbmVkIGludCBtYXhfbGVuOworCQljb25zdCBjaGFyICpuYW1lOworCX0gb3Bjb2Rlc18zZFtdID0geworCQl7IDB4MDIsIDEsIDEsICIzRFNUQVRFX01PREVTXzMiIH0sCisJCXsgMHgwMywgMSwgMSwgIjNEU1RBVEVfRU5BQkxFU18xIiB9LAorCQl7IDB4MDQsIDEsIDEsICIzRFNUQVRFX0VOQUJMRVNfMiIgfSwKKwkJeyAweDA1LCAxLCAxLCAiM0RTVEFURV9WRlQwIiB9LAorCQl7IDB4MDYsIDEsIDEsICIzRFNUQVRFX0FBIiB9LAorCQl7IDB4MDcsIDEsIDEsICIzRFNUQVRFX1JBU1RFUklaQVRJT05fUlVMRVMiIH0sCisJCXsgMHgwOCwgMSwgMSwgIjNEU1RBVEVfTU9ERVNfMSIgfSwKKwkJeyAweDA5LCAxLCAxLCAiM0RTVEFURV9TVEVOQ0lMX1RFU1QiIH0sCisJCXsgMHgwYSwgMSwgMSwgIjNEU1RBVEVfVkZUMSIgfSwKKwkJeyAweDBiLCAxLCAxLCAiM0RTVEFURV9JTkRQVF9BTFBIQV9CTEVORCIgfSwKKwkJeyAweDBjLCAxLCAxLCAiM0RTVEFURV9NT0RFU181IiB9LAorCQl7IDB4MGQsIDEsIDEsICIzRFNUQVRFX01BUF9CTEVORF9PUCIgfSwKKwkJeyAweDBlLCAxLCAxLCAiM0RTVEFURV9NQVBfQkxFTkRfQVJHIiB9LAorCQl7IDB4MGYsIDEsIDEsICIzRFNUQVRFX01PREVTXzIiIH0sCisJCXsgMHgxNSwgMSwgMSwgIjNEU1RBVEVfRk9HX0NPTE9SIiB9LAorCQl7IDB4MTYsIDEsIDEsICIzRFNUQVRFX01PREVTXzQifSwKKwl9LCAqb3Bjb2RlXzNkOworCisJb3Bjb2RlID0gKGRhdGFbMF0gJiAweDFmMDAwMDAwKSA+PiAyNDsKKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSAweDFmOgorCQlyZXR1cm4gZGVjb2RlXzNkX3ByaW1pdGl2ZShjdHgpOworCWNhc2UgMHgxZDoKKwkJcmV0dXJuIGRlY29kZV8zZF8xZChjdHgpOworCWNhc2UgMHgxYzoKKwkJcmV0dXJuIGRlY29kZV8zZF8xYyhjdHgpOworCX0KKworCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShvcGNvZGVzXzNkKTsgaWR4KyspIHsKKwkJb3Bjb2RlXzNkID0gJm9wY29kZXNfM2RbaWR4XTsKKwkJaWYgKChkYXRhWzBdICYgMHgxZjAwMDAwMCkgPj4gMjQgPT0gb3Bjb2RlXzNkLT5vcGNvZGUpIHsKKwkJCXVuc2lnbmVkIGludCBsZW4gPSAxLCBpOworCisJCQlpbnN0cl9vdXQoY3R4LCAwLCAiJXNcbiIsIG9wY29kZV8zZC0+bmFtZSk7CisJCQlpZiAob3Bjb2RlXzNkLT5tYXhfbGVuID4gMSkgeworCQkJCWxlbiA9IChkYXRhWzBdICYgMHhmZikgKyAyOworCQkJCWlmIChsZW4gPCBvcGNvZGVfM2QtPm1pbl9sZW4gfHwKKwkJCQkgICAgbGVuID4gb3Bjb2RlXzNkLT5tYXhfbGVuKSB7CisJCQkJCWZwcmludGYob3V0LCAiQmFkIGNvdW50IGluICVzXG4iLAorCQkJCQkJb3Bjb2RlXzNkLT5uYW1lKTsKKwkJCQl9CisJCQl9CisKKwkJCWZvciAoaSA9IDE7IGkgPCBsZW47IGkrKykgeworCQkJCWluc3RyX291dChjdHgsIGksICJkd29yZCAlZFxuIiwgaSk7CisJCQl9CisJCQlyZXR1cm4gbGVuOworCQl9CisJfQorCisJaW5zdHJfb3V0KGN0eCwgMCwgIjNEIFVOS05PV046IDNkX2k4MzAgb3Bjb2RlID0gMHgleFxuIiwKKwkJICBvcGNvZGUpOworCXJldHVybiAxOworfQorCitzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqCitkcm1faW50ZWxfZGVjb2RlX2NvbnRleHRfYWxsb2ModWludDMyX3QgZGV2aWQpCit7CisJc3RydWN0IGRybV9pbnRlbF9kZWNvZGUgKmN0eDsKKworCWN0eCA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGRybV9pbnRlbF9kZWNvZGUpKTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIE5VTEw7CisKKwljdHgtPmRldmlkID0gZGV2aWQ7CisJY3R4LT5vdXQgPSBzdGRvdXQ7CisKKwlpZiAoSVNfR0VOMTAoZGV2aWQpKQorCQljdHgtPmdlbiA9IDEwOworCWVsc2UgaWYgKElTX0dFTjkoZGV2aWQpKQorCQljdHgtPmdlbiA9IDk7CisJZWxzZSBpZiAoSVNfR0VOOChkZXZpZCkpCisJCWN0eC0+Z2VuID0gODsKKwllbHNlIGlmIChJU19HRU43KGRldmlkKSkKKwkJY3R4LT5nZW4gPSA3OworCWVsc2UgaWYgKElTX0dFTjYoZGV2aWQpKQorCQljdHgtPmdlbiA9IDY7CisJZWxzZSBpZiAoSVNfR0VONShkZXZpZCkpCisJCWN0eC0+Z2VuID0gNTsKKwllbHNlIGlmIChJU19HRU40KGRldmlkKSkKKwkJY3R4LT5nZW4gPSA0OworCWVsc2UgaWYgKElTXzlYWChkZXZpZCkpCisJCWN0eC0+Z2VuID0gMzsKKwllbHNlIHsKKwkJYXNzZXJ0KElTX0dFTjIoZGV2aWQpKTsKKwkJY3R4LT5nZW4gPSAyOworCX0KKworCXJldHVybiBjdHg7Cit9CisKK3ZvaWQKK2RybV9pbnRlbF9kZWNvZGVfY29udGV4dF9mcmVlKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJZnJlZShjdHgpOworfQorCit2b2lkCitkcm1faW50ZWxfZGVjb2RlX3NldF9kdW1wX3Bhc3RfZW5kKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgsCisJCQkJICAgaW50IGR1bXBfcGFzdF9lbmQpCit7CisJY3R4LT5kdW1wX3Bhc3RfZW5kID0gISFkdW1wX3Bhc3RfZW5kOworfQorCit2b2lkCitkcm1faW50ZWxfZGVjb2RlX3NldF9iYXRjaF9wb2ludGVyKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgsCisJCQkJICAgdm9pZCAqZGF0YSwgdWludDMyX3QgaHdfb2Zmc2V0LCBpbnQgY291bnQpCit7CisJY3R4LT5iYXNlX2RhdGEgPSBkYXRhOworCWN0eC0+YmFzZV9od19vZmZzZXQgPSBod19vZmZzZXQ7CisJY3R4LT5iYXNlX2NvdW50ID0gY291bnQ7Cit9CisKK3ZvaWQKK2RybV9pbnRlbF9kZWNvZGVfc2V0X2hlYWRfdGFpbChzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4LAorCQkJICAgICAgIHVpbnQzMl90IGhlYWQsIHVpbnQzMl90IHRhaWwpCit7CisJY3R4LT5oZWFkID0gaGVhZDsKKwljdHgtPnRhaWwgPSB0YWlsOworfQorCit2b2lkCitkcm1faW50ZWxfZGVjb2RlX3NldF9vdXRwdXRfZmlsZShzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4LAorCQkJCSBGSUxFICpvdXRwdXQpCit7CisJY3R4LT5vdXQgPSBvdXRwdXQ7Cit9CisKKy8qKgorICogRGVjb2RlcyBhbiBpODMwLWk5MTUgYmF0Y2ggYnVmZmVyLCB3cml0aW5nIHRoZSBvdXRwdXQgdG8gc3Rkb3V0LgorICoKKyAqIFxwYXJhbSBkYXRhIGJhdGNoIGJ1ZmZlciBjb250ZW50cworICogXHBhcmFtIGNvdW50IG51bWJlciBvZiBEV09SRHMgdG8gZGVjb2RlIGluIHRoZSBiYXRjaCBidWZmZXIKKyAqIFxwYXJhbSBod19vZmZzZXQgaGFyZHdhcmUgYWRkcmVzcyBmb3IgdGhlIGJ1ZmZlcgorICovCit2b2lkCitkcm1faW50ZWxfZGVjb2RlKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgaW5kZXggPSAwOworCXVpbnQzMl90IGRldmlkOworCWludCBzaXplOworCXZvaWQgKnRlbXA7CisKKwlpZiAoIWN0eCkKKwkJcmV0dXJuOworCisJLyogUHV0IGEgc2NyYXRjaCBwYWdlIGZ1bGwgb2Ygb2J2aW91c2x5IHVuZGVmaW5lZCBkYXRhIGFmdGVyCisJICogdGhlIGJhdGNoYnVmZmVyLiAgVGhpcyBsZXRzIHVzIGF2b2lkIGEgYnVuY2ggb2YgbGVuZ3RoCisJICogY2hlY2tpbmcgaW4gc3RhdGljYWxseSBzaXplZCBwYWNrZXRzLgorCSAqLworCXNpemUgPSBjdHgtPmJhc2VfY291bnQgKiA0OworCXRlbXAgPSBtYWxsb2Moc2l6ZSArIDQwOTYpOworCW1lbWNweSh0ZW1wLCBjdHgtPmJhc2VfZGF0YSwgc2l6ZSk7CisJbWVtc2V0KChjaGFyICopdGVtcCArIHNpemUsIDB4ZDAsIDQwOTYpOworCWN0eC0+ZGF0YSA9IHRlbXA7CisKKwljdHgtPmh3X29mZnNldCA9IGN0eC0+YmFzZV9od19vZmZzZXQ7CisJY3R4LT5jb3VudCA9IGN0eC0+YmFzZV9jb3VudDsKKworCWRldmlkID0gY3R4LT5kZXZpZDsKKwloZWFkX29mZnNldCA9IGN0eC0+aGVhZDsKKwl0YWlsX29mZnNldCA9IGN0eC0+dGFpbDsKKwlvdXQgPSBjdHgtPm91dDsKKworCXNhdmVkX3MyX3NldCA9IDA7CisJc2F2ZWRfczRfc2V0ID0gMTsKKworCXdoaWxlIChjdHgtPmNvdW50ID4gMCkgeworCQlpbmRleCA9IDA7CisKKwkJc3dpdGNoICgoY3R4LT5kYXRhW2luZGV4XSAmIDB4ZTAwMDAwMDApID4+IDI5KSB7CisJCWNhc2UgMHgwOgorCQkJcmV0ID0gZGVjb2RlX21pKGN0eCk7CisKKwkJCS8qIElmIE1JX0JBVENIQlVGRkVSX0VORCBoYXBwZW5lZCwgdGhlbiBkdW1wCisJCQkgKiB0aGUgcmVzdCBvZiB0aGUgb3V0cHV0IGluIGNhc2Ugd2Ugc29tZSBkYXkKKwkJCSAqIHdhbnQgaXQgaW4gZGVidWdnaW5nLCBidXQgZG9uJ3QgZGVjb2RlIGl0CisJCQkgKiBzaW5jZSBpdCdsbCBqdXN0IGNvbmZ1c2UgaW4gdGhlIGNvbW1vbgorCQkJICogY2FzZS4KKwkJCSAqLworCQkJaWYgKHJldCA9PSAtMSkgeworCQkJCWlmIChjdHgtPmR1bXBfcGFzdF9lbmQpIHsKKwkJCQkJaW5kZXgrKzsKKwkJCQl9IGVsc2UgeworCQkJCQlmb3IgKGluZGV4ID0gaW5kZXggKyAxOyBpbmRleCA8IGN0eC0+Y291bnQ7CisJCQkJCSAgICAgaW5kZXgrKykgeworCQkJCQkJaW5zdHJfb3V0KGN0eCwgaW5kZXgsICJcbiIpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlCisJCQkJaW5kZXggKz0gcmV0OworCQkJYnJlYWs7CisJCWNhc2UgMHgyOgorCQkJaW5kZXggKz0gZGVjb2RlXzJkKGN0eCk7CisJCQlicmVhazsKKwkJY2FzZSAweDM6CisJCQlpZiAoSVNfOVhYKGRldmlkKSAmJiAhSVNfR0VOMyhkZXZpZCkpIHsKKwkJCQlpbmRleCArPQorCQkJCSAgICBkZWNvZGVfM2RfOTY1KGN0eCk7CisJCQl9IGVsc2UgaWYgKElTX0dFTjMoZGV2aWQpKSB7CisJCQkJaW5kZXggKz0gZGVjb2RlXzNkKGN0eCk7CisJCQl9IGVsc2UgeworCQkJCWluZGV4ICs9CisJCQkJICAgIGRlY29kZV8zZF9pODMwKGN0eCk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWluc3RyX291dChjdHgsIGluZGV4LCAiVU5LTk9XTlxuIik7CisJCQlpbmRleCsrOworCQkJYnJlYWs7CisJCX0KKwkJZmZsdXNoKG91dCk7CisKKwkJaWYgKGN0eC0+Y291bnQgPCBpbmRleCkKKwkJCWJyZWFrOworCisJCWN0eC0+Y291bnQgLT0gaW5kZXg7CisJCWN0eC0+ZGF0YSArPSBpbmRleDsKKwkJY3R4LT5od19vZmZzZXQgKz0gNCAqIGluZGV4OworCX0KKworCWZyZWUodGVtcCk7Cit9CmRpZmYgLS1naXQgYS9pbnRlbC9saWJkcm1faW50ZWwucGMuaW4gYi9pbnRlbC9saWJkcm1faW50ZWwucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcwZTRmZQotLS0gL2Rldi9udWxsCisrKyBiL2ludGVsL2xpYmRybV9pbnRlbC5wYy5pbgpAQCAtMCwwICsxLDExIEBACitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKKworTmFtZTogbGliZHJtX2ludGVsCitEZXNjcmlwdGlvbjogVXNlcnNwYWNlIGludGVyZmFjZSB0byBpbnRlbCBrZXJuZWwgRFJNIHNlcnZpY2VzCitWZXJzaW9uOiBAUEFDS0FHRV9WRVJTSU9OQAorUmVxdWlyZXM6IGxpYmRybQorTGliczogLUwke2xpYmRpcn0gLWxkcm1faW50ZWwKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9IC1JJHtpbmNsdWRlZGlyfS9saWJkcm0KZGlmZiAtLWdpdCBhL2ludGVsL21tLmMgYi9pbnRlbC9tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NGU5ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlbC9tbS5jCkBAIC0wLDAgKzEsMjY0IEBACisvKgorICogR0xYIEhhcmR3YXJlIERldmljZSBEcml2ZXIgY29tbW9uIGNvZGUKKyAqIENvcHlyaWdodCAoQykgMTk5OSBXaXR0YXdhdCBZYW13b25nCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBXSVRUQVdBVCBZQU1XT05HLCBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSAKKyAqIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgInhmODZkcm0uaCIKKyNpbmNsdWRlICJsaWJkcm1fbWFjcm9zLmgiCisjaW5jbHVkZSAibW0uaCIKKworZHJtX3ByaXZhdGUgdm9pZCBtbUR1bXBNZW1JbmZvKGNvbnN0IHN0cnVjdCBtZW1fYmxvY2sgKmhlYXApCit7CisJZHJtTXNnKCJNZW1vcnkgaGVhcCAlcDpcbiIsICh2b2lkICopaGVhcCk7CisJaWYgKGhlYXAgPT0gMCkgeworCQlkcm1Nc2coIiAgaGVhcCA9PSAwXG4iKTsKKwl9IGVsc2UgeworCQljb25zdCBzdHJ1Y3QgbWVtX2Jsb2NrICpwOworCisJCWZvciAocCA9IGhlYXAtPm5leHQ7IHAgIT0gaGVhcDsgcCA9IHAtPm5leHQpIHsKKwkJCWRybU1zZygiICBPZmZzZXQ6JTA4eCwgU2l6ZTolMDh4LCAlYyVjXG4iLCBwLT5vZnMsCisJCQkgICAgICAgcC0+c2l6ZSwgcC0+ZnJlZSA/ICdGJyA6ICcuJywKKwkJCSAgICAgICBwLT5yZXNlcnZlZCA/ICdSJyA6ICcuJyk7CisJCX0KKworCQlkcm1Nc2coIlxuRnJlZSBsaXN0OlxuIik7CisKKwkJZm9yIChwID0gaGVhcC0+bmV4dF9mcmVlOyBwICE9IGhlYXA7IHAgPSBwLT5uZXh0X2ZyZWUpIHsKKwkJCWRybU1zZygiIEZSRUUgT2Zmc2V0OiUwOHgsIFNpemU6JTA4eCwgJWMlY1xuIiwgcC0+b2ZzLAorCQkJICAgICAgIHAtPnNpemUsIHAtPmZyZWUgPyAnRicgOiAnLicsCisJCQkgICAgICAgcC0+cmVzZXJ2ZWQgPyAnUicgOiAnLicpOworCQl9CisKKwl9CisJZHJtTXNnKCJFbmQgb2YgbWVtb3J5IGJsb2Nrc1xuIik7Cit9CisKK2RybV9wcml2YXRlIHN0cnVjdCBtZW1fYmxvY2sgKm1tSW5pdChpbnQgb2ZzLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwLCAqYmxvY2s7CisKKwlpZiAoc2l6ZSA8PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWhlYXAgPSAoc3RydWN0IG1lbV9ibG9jayAqKWNhbGxvYygxLCBzaXplb2Yoc3RydWN0IG1lbV9ibG9jaykpOworCWlmICghaGVhcCkKKwkJcmV0dXJuIE5VTEw7CisKKwlibG9jayA9IChzdHJ1Y3QgbWVtX2Jsb2NrICopY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgbWVtX2Jsb2NrKSk7CisJaWYgKCFibG9jaykgeworCQlmcmVlKGhlYXApOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwloZWFwLT5uZXh0ID0gYmxvY2s7CisJaGVhcC0+cHJldiA9IGJsb2NrOworCWhlYXAtPm5leHRfZnJlZSA9IGJsb2NrOworCWhlYXAtPnByZXZfZnJlZSA9IGJsb2NrOworCisJYmxvY2stPmhlYXAgPSBoZWFwOworCWJsb2NrLT5uZXh0ID0gaGVhcDsKKwlibG9jay0+cHJldiA9IGhlYXA7CisJYmxvY2stPm5leHRfZnJlZSA9IGhlYXA7CisJYmxvY2stPnByZXZfZnJlZSA9IGhlYXA7CisKKwlibG9jay0+b2ZzID0gb2ZzOworCWJsb2NrLT5zaXplID0gc2l6ZTsKKwlibG9jay0+ZnJlZSA9IDE7CisKKwlyZXR1cm4gaGVhcDsKK30KKworc3RhdGljIHN0cnVjdCBtZW1fYmxvY2sgKlNsaWNlQmxvY2soc3RydWN0IG1lbV9ibG9jayAqcCwKKwkJCQkgICAgaW50IHN0YXJ0b2ZzLCBpbnQgc2l6ZSwKKwkJCQkgICAgaW50IHJlc2VydmVkLCBpbnQgYWxpZ25tZW50KQoreworCXN0cnVjdCBtZW1fYmxvY2sgKm5ld2Jsb2NrOworCisJLyogYnJlYWsgbGVmdCAgW3AsIG5ld2Jsb2NrLCBwLT5uZXh0XSwgdGhlbiBwID0gbmV3YmxvY2sgKi8KKwlpZiAoc3RhcnRvZnMgPiBwLT5vZnMpIHsKKwkJbmV3YmxvY2sgPQorCQkgICAgKHN0cnVjdCBtZW1fYmxvY2sgKiljYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBtZW1fYmxvY2spKTsKKwkJaWYgKCFuZXdibG9jaykKKwkJCXJldHVybiBOVUxMOworCQluZXdibG9jay0+b2ZzID0gc3RhcnRvZnM7CisJCW5ld2Jsb2NrLT5zaXplID0gcC0+c2l6ZSAtIChzdGFydG9mcyAtIHAtPm9mcyk7CisJCW5ld2Jsb2NrLT5mcmVlID0gMTsKKwkJbmV3YmxvY2stPmhlYXAgPSBwLT5oZWFwOworCisJCW5ld2Jsb2NrLT5uZXh0ID0gcC0+bmV4dDsKKwkJbmV3YmxvY2stPnByZXYgPSBwOworCQlwLT5uZXh0LT5wcmV2ID0gbmV3YmxvY2s7CisJCXAtPm5leHQgPSBuZXdibG9jazsKKworCQluZXdibG9jay0+bmV4dF9mcmVlID0gcC0+bmV4dF9mcmVlOworCQluZXdibG9jay0+cHJldl9mcmVlID0gcDsKKwkJcC0+bmV4dF9mcmVlLT5wcmV2X2ZyZWUgPSBuZXdibG9jazsKKwkJcC0+bmV4dF9mcmVlID0gbmV3YmxvY2s7CisKKwkJcC0+c2l6ZSAtPSBuZXdibG9jay0+c2l6ZTsKKwkJcCA9IG5ld2Jsb2NrOworCX0KKworCS8qIGJyZWFrIHJpZ2h0LCBhbHNvIFtwLCBuZXdibG9jaywgcC0+bmV4dF0gKi8KKwlpZiAoc2l6ZSA8IHAtPnNpemUpIHsKKwkJbmV3YmxvY2sgPQorCQkgICAgKHN0cnVjdCBtZW1fYmxvY2sgKiljYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBtZW1fYmxvY2spKTsKKwkJaWYgKCFuZXdibG9jaykKKwkJCXJldHVybiBOVUxMOworCQluZXdibG9jay0+b2ZzID0gc3RhcnRvZnMgKyBzaXplOworCQluZXdibG9jay0+c2l6ZSA9IHAtPnNpemUgLSBzaXplOworCQluZXdibG9jay0+ZnJlZSA9IDE7CisJCW5ld2Jsb2NrLT5oZWFwID0gcC0+aGVhcDsKKworCQluZXdibG9jay0+bmV4dCA9IHAtPm5leHQ7CisJCW5ld2Jsb2NrLT5wcmV2ID0gcDsKKwkJcC0+bmV4dC0+cHJldiA9IG5ld2Jsb2NrOworCQlwLT5uZXh0ID0gbmV3YmxvY2s7CisKKwkJbmV3YmxvY2stPm5leHRfZnJlZSA9IHAtPm5leHRfZnJlZTsKKwkJbmV3YmxvY2stPnByZXZfZnJlZSA9IHA7CisJCXAtPm5leHRfZnJlZS0+cHJldl9mcmVlID0gbmV3YmxvY2s7CisJCXAtPm5leHRfZnJlZSA9IG5ld2Jsb2NrOworCisJCXAtPnNpemUgPSBzaXplOworCX0KKworCS8qIHAgPSBtaWRkbGUgYmxvY2sgKi8KKwlwLT5mcmVlID0gMDsKKworCS8qIFJlbW92ZSBwIGZyb20gdGhlIGZyZWUgbGlzdDogCisJICovCisJcC0+bmV4dF9mcmVlLT5wcmV2X2ZyZWUgPSBwLT5wcmV2X2ZyZWU7CisJcC0+cHJldl9mcmVlLT5uZXh0X2ZyZWUgPSBwLT5uZXh0X2ZyZWU7CisKKwlwLT5uZXh0X2ZyZWUgPSAwOworCXAtPnByZXZfZnJlZSA9IDA7CisKKwlwLT5yZXNlcnZlZCA9IHJlc2VydmVkOworCXJldHVybiBwOworfQorCitkcm1fcHJpdmF0ZSBzdHJ1Y3QgbWVtX2Jsb2NrICptbUFsbG9jTWVtKHN0cnVjdCBtZW1fYmxvY2sgKmhlYXAsIGludCBzaXplLAorCQkJCQkgaW50IGFsaWduMiwgaW50IHN0YXJ0U2VhcmNoKQoreworCXN0cnVjdCBtZW1fYmxvY2sgKnA7CisJY29uc3QgaW50IG1hc2sgPSAoMSA8PCBhbGlnbjIpIC0gMTsKKwlpbnQgc3RhcnRvZnMgPSAwOworCWludCBlbmRvZnM7CisKKwlpZiAoIWhlYXAgfHwgYWxpZ24yIDwgMCB8fCBzaXplIDw9IDApCisJCXJldHVybiBOVUxMOworCisJZm9yIChwID0gaGVhcC0+bmV4dF9mcmVlOyBwICE9IGhlYXA7IHAgPSBwLT5uZXh0X2ZyZWUpIHsKKwkJYXNzZXJ0KHAtPmZyZWUpOworCisJCXN0YXJ0b2ZzID0gKHAtPm9mcyArIG1hc2spICYgfm1hc2s7CisJCWlmIChzdGFydG9mcyA8IHN0YXJ0U2VhcmNoKSB7CisJCQlzdGFydG9mcyA9IHN0YXJ0U2VhcmNoOworCQl9CisJCWVuZG9mcyA9IHN0YXJ0b2ZzICsgc2l6ZTsKKwkJaWYgKGVuZG9mcyA8PSAocC0+b2ZzICsgcC0+c2l6ZSkpCisJCQlicmVhazsKKwl9CisKKwlpZiAocCA9PSBoZWFwKQorCQlyZXR1cm4gTlVMTDsKKworCWFzc2VydChwLT5mcmVlKTsKKwlwID0gU2xpY2VCbG9jayhwLCBzdGFydG9mcywgc2l6ZSwgMCwgbWFzayArIDEpOworCisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbnQgSm9pbjJCbG9ja3Moc3RydWN0IG1lbV9ibG9jayAqcCkKK3sKKwkvKiBYWFggdGhlcmUgc2hvdWxkIGJlIHNvbWUgYXNzZXJ0aW9ucyBoZXJlICovCisKKwkvKiBOT1RFOiBoZWFwLT5mcmVlID09IDAgKi8KKworCWlmIChwLT5mcmVlICYmIHAtPm5leHQtPmZyZWUpIHsKKwkJc3RydWN0IG1lbV9ibG9jayAqcSA9IHAtPm5leHQ7CisKKwkJYXNzZXJ0KHAtPm9mcyArIHAtPnNpemUgPT0gcS0+b2ZzKTsKKwkJcC0+c2l6ZSArPSBxLT5zaXplOworCisJCXAtPm5leHQgPSBxLT5uZXh0OworCQlxLT5uZXh0LT5wcmV2ID0gcDsKKworCQlxLT5uZXh0X2ZyZWUtPnByZXZfZnJlZSA9IHEtPnByZXZfZnJlZTsKKwkJcS0+cHJldl9mcmVlLT5uZXh0X2ZyZWUgPSBxLT5uZXh0X2ZyZWU7CisKKwkJZnJlZShxKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitkcm1fcHJpdmF0ZSBpbnQgbW1GcmVlTWVtKHN0cnVjdCBtZW1fYmxvY2sgKmIpCit7CisJaWYgKCFiKQorCQlyZXR1cm4gMDsKKworCWlmIChiLT5mcmVlKSB7CisJCWRybU1zZygiYmxvY2sgYWxyZWFkeSBmcmVlXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoYi0+cmVzZXJ2ZWQpIHsKKwkJZHJtTXNnKCJibG9jayBpcyByZXNlcnZlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwliLT5mcmVlID0gMTsKKwliLT5uZXh0X2ZyZWUgPSBiLT5oZWFwLT5uZXh0X2ZyZWU7CisJYi0+cHJldl9mcmVlID0gYi0+aGVhcDsKKwliLT5uZXh0X2ZyZWUtPnByZXZfZnJlZSA9IGI7CisJYi0+cHJldl9mcmVlLT5uZXh0X2ZyZWUgPSBiOworCisJSm9pbjJCbG9ja3MoYik7CisJaWYgKGItPnByZXYgIT0gYi0+aGVhcCkKKwkJSm9pbjJCbG9ja3MoYi0+cHJldik7CisKKwlyZXR1cm4gMDsKK30KKworZHJtX3ByaXZhdGUgdm9pZCBtbURlc3Ryb3koc3RydWN0IG1lbV9ibG9jayAqaGVhcCkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwOworCisJaWYgKCFoZWFwKQorCQlyZXR1cm47CisKKwlmb3IgKHAgPSBoZWFwLT5uZXh0OyBwICE9IGhlYXA7KSB7CisJCXN0cnVjdCBtZW1fYmxvY2sgKm5leHQgPSBwLT5uZXh0OworCQlmcmVlKHApOworCQlwID0gbmV4dDsKKwl9CisKKwlmcmVlKGhlYXApOworfQpkaWZmIC0tZ2l0IGEvaW50ZWwvbW0uaCBiL2ludGVsL21tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ4Mzc0MwotLS0gL2Rldi9udWxsCisrKyBiL2ludGVsL21tLmgKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIEdMWCBIYXJkd2FyZSBEZXZpY2UgRHJpdmVyIGNvbW1vbiBjb2RlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgV2l0dGF3YXQgWWFtd29uZworICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogS0VJVEggV0hJVFdFTEwsIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIAorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIAorICogT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBNZW1vcnkgbWFuYWdlciBjb2RlLiAgUHJpbWFyaWx5IHVzZWQgYnkgZGV2aWNlIGRyaXZlcnMgdG8gbWFuYWdlIHRleHR1cmUKKyAqIGhlYXBzLCBldGMuCisgKi8KKworI2lmbmRlZiBNTV9ICisjZGVmaW5lIE1NX0gKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAibGliZHJtX21hY3Jvcy5oIgorCitzdHJ1Y3QgbWVtX2Jsb2NrIHsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpuZXh0LCAqcHJldjsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpuZXh0X2ZyZWUsICpwcmV2X2ZyZWU7CisJc3RydWN0IG1lbV9ibG9jayAqaGVhcDsKKwlpbnQgb2ZzLCBzaXplOworCXVuc2lnbmVkIGludCBmcmVlOjE7CisJdW5zaWduZWQgaW50IHJlc2VydmVkOjE7Cit9OworCisvKiogCisgKiBpbnB1dDogdG90YWwgc2l6ZSBpbiBieXRlcworICogcmV0dXJuOiBhIGhlYXAgcG9pbnRlciBpZiBPSywgTlVMTCBpZiBlcnJvcgorICovCitkcm1fcHJpdmF0ZSBleHRlcm4gc3RydWN0IG1lbV9ibG9jayAqbW1Jbml0KGludCBvZnMsIGludCBzaXplKTsKKworLyoqCisgKiBBbGxvY2F0ZSAnc2l6ZScgYnl0ZXMgd2l0aCAyXmFsaWduMiBieXRlcyBhbGlnbm1lbnQsCisgKiByZXN0cmljdCB0aGUgc2VhcmNoIHRvIGZyZWUgbWVtb3J5IGFmdGVyICdzdGFydFNlYXJjaCcKKyAqIGRlcHRoIGFuZCBiYWNrIGJ1ZmZlcnMgc2hvdWxkIGJlIGluIGRpZmZlcmVudCA0bWIgYmFua3MKKyAqIHRvIGdldCBiZXR0ZXIgcGFnZSBoaXRzIGlmIHBvc3NpYmxlCisgKiBpbnB1dDoJc2l6ZSA9IHNpemUgb2YgYmxvY2sKKyAqICAgICAgIAlhbGlnbjIgPSAyXmFsaWduMiBieXRlcyBhbGlnbm1lbnQKKyAqCQlzdGFydFNlYXJjaCA9IGxpbmVhciBvZmZzZXQgZnJvbSBzdGFydCBvZiBoZWFwIHRvIGJlZ2luIHNlYXJjaAorICogcmV0dXJuOiBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgYmxvY2ssIDAgaWYgZXJyb3IKKyAqLworZHJtX3ByaXZhdGUgZXh0ZXJuIHN0cnVjdCBtZW1fYmxvY2sgKm1tQWxsb2NNZW0oc3RydWN0IG1lbV9ibG9jayAqaGVhcCwKKwkJCQkJCWludCBzaXplLCBpbnQgYWxpZ24yLAorCQkJCQkJaW50IHN0YXJ0U2VhcmNoKTsKKworLyoqCisgKiBGcmVlIGJsb2NrIHN0YXJ0cyBhdCBvZmZzZXQKKyAqIGlucHV0OiBwb2ludGVyIHRvIGEgYmxvY2sKKyAqIHJldHVybjogMCBpZiBPSywgLTEgaWYgZXJyb3IKKyAqLworZHJtX3ByaXZhdGUgZXh0ZXJuIGludCBtbUZyZWVNZW0oc3RydWN0IG1lbV9ibG9jayAqYik7CisKKy8qKgorICogZGVzdHJveSBNTQorICovCitkcm1fcHJpdmF0ZSBleHRlcm4gdm9pZCBtbURlc3Ryb3koc3RydWN0IG1lbV9ibG9jayAqbW1Jbml0KTsKKworLyoqCisgKiBGb3IgZGVidWdpbmcgcHVycG9zZS4KKyAqLworZHJtX3ByaXZhdGUgZXh0ZXJuIHZvaWQgbW1EdW1wTWVtSW5mbyhjb25zdCBzdHJ1Y3QgbWVtX2Jsb2NrICptbUluaXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ludGVsL3Rlc3RfZGVjb2RlLmMgYi9pbnRlbC90ZXN0X2RlY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZWRkY2QKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlbC90ZXN0X2RlY29kZS5jCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZXJyLmg+CisKKyNpbmNsdWRlICJsaWJkcm1fbWFjcm9zLmgiCisjaW5jbHVkZSAiaW50ZWxfYnVmbWdyLmgiCisjaW5jbHVkZSAiaW50ZWxfY2hpcHNldC5oIgorCisjZGVmaW5lIEhXX09GRlNFVCAweDEyMzAwMDAwCisKK3N0YXRpYyB2b2lkCit1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAidXNhZ2U6XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgdGVzdF9kZWNvZGUgPGJhdGNoPlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIHRlc3RfZGVjb2RlIDxiYXRjaD4gLWR1bXBcbiIpOworCWV4aXQoMSk7Cit9CisKK3N0YXRpYyB2b2lkCityZWFkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKipwdHIsIHNpemVfdCAqc2l6ZSkKK3sKKwlpbnQgZmQsIHJldDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApCisJCWVycngoMSwgImNvdWxkbid0IG9wZW4gYCVzJyIsIGZpbGVuYW1lKTsKKworCXJldCA9IGZzdGF0KGZkLCAmc3QpOworCWlmIChyZXQpCisJCWVycngoMSwgImNvdWxkbid0IHN0YXQgYCVzJyIsIGZpbGVuYW1lKTsKKworCSpzaXplID0gc3Quc3Rfc2l6ZTsKKwkqcHRyID0gZHJtX21tYXAoTlVMTCwgc3Quc3Rfc2l6ZSwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBmZCwgMCk7CisJaWYgKCpwdHIgPT0gTUFQX0ZBSUxFRCkKKwkJZXJyeCgxLCAiY291bGRuJ3QgbWFwIGAlcyciLCBmaWxlbmFtZSk7CisKKwljbG9zZShmZCk7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX2JhdGNoKHN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHgsIGNvbnN0IGNoYXIgKmJhdGNoX2ZpbGVuYW1lKQoreworCXZvaWQgKmJhdGNoX3B0cjsKKwlzaXplX3QgYmF0Y2hfc2l6ZTsKKworCXJlYWRfZmlsZShiYXRjaF9maWxlbmFtZSwgJmJhdGNoX3B0ciwgJmJhdGNoX3NpemUpOworCisJZHJtX2ludGVsX2RlY29kZV9zZXRfYmF0Y2hfcG9pbnRlcihjdHgsIGJhdGNoX3B0ciwgSFdfT0ZGU0VULAorCQkJCQkgICBiYXRjaF9zaXplIC8gNCk7CisJZHJtX2ludGVsX2RlY29kZV9zZXRfb3V0cHV0X2ZpbGUoY3R4LCBzdGRvdXQpOworCisJZHJtX2ludGVsX2RlY29kZShjdHgpOworfQorCitzdGF0aWMgdm9pZAorY29tcGFyZV9iYXRjaChzdHJ1Y3QgZHJtX2ludGVsX2RlY29kZSAqY3R4LCBjb25zdCBjaGFyICpiYXRjaF9maWxlbmFtZSkKK3sKKwlGSUxFICpvdXQgPSBOVUxMOworCXZvaWQgKnB0ciwgKnJlZl9wdHIsICpiYXRjaF9wdHI7CisjaWZkZWYgSEFWRV9PUEVOX01FTVNUUkVBTQorCXNpemVfdCBzaXplOworI2VuZGlmCisJc2l6ZV90IHJlZl9zaXplLCBiYXRjaF9zaXplOworCWNvbnN0IGNoYXIgKnJlZl9zdWZmaXggPSAiLXJlZi50eHQiOworCWNoYXIgKnJlZl9maWxlbmFtZTsKKworCXJlZl9maWxlbmFtZSA9IG1hbGxvYyhzdHJsZW4oYmF0Y2hfZmlsZW5hbWUpICsgc3RybGVuKHJlZl9zdWZmaXgpICsgMSk7CisJc3ByaW50ZihyZWZfZmlsZW5hbWUsICIlcyVzIiwgYmF0Y2hfZmlsZW5hbWUsIHJlZl9zdWZmaXgpOworCisJLyogUmVhZCB0aGUgYmF0Y2ggYW5kIHJlZmVyZW5jZS4gKi8KKwlyZWFkX2ZpbGUoYmF0Y2hfZmlsZW5hbWUsICZiYXRjaF9wdHIsICZiYXRjaF9zaXplKTsKKwlyZWFkX2ZpbGUocmVmX2ZpbGVuYW1lLCAmcmVmX3B0ciwgJnJlZl9zaXplKTsKKworCS8qIFNldCB1cCBvdXIgZGVjb2RlIG91dHB1dCBpbiBtZW1vcnksIGJlY2F1c2UgSSBkb24ndCB3YW50IHRvCisJICogZmlndXJlIG91dCBob3cgdG8gb3V0cHV0IHRvIGEgZmlsZSBpbiBhIHNhZmUgYW5kIHNhbmUgd2F5CisJICogaW5zaWRlIG9mIGFuIGF1dG9tYWtlIHByb2plY3QncyB0ZXN0IGluZnJhc3RydWN0dXJlLgorCSAqLworI2lmZGVmIEhBVkVfT1BFTl9NRU1TVFJFQU0KKwlvdXQgPSBvcGVuX21lbXN0cmVhbSgoY2hhciAqKikmcHRyLCAmc2l6ZSk7CisjZWxzZQorCWZwcmludGYoc3RkZXJyLCAicGxhdGZvcm0gbGFja3Mgb3Blbl9tZW1zdHJlYW0sIHNraXBwaW5nLlxuIik7CisJZXhpdCg3Nyk7CisjZW5kaWYKKworCWRybV9pbnRlbF9kZWNvZGVfc2V0X2JhdGNoX3BvaW50ZXIoY3R4LCBiYXRjaF9wdHIsIEhXX09GRlNFVCwKKwkJCQkJICAgYmF0Y2hfc2l6ZSAvIDQpOworCWRybV9pbnRlbF9kZWNvZGVfc2V0X291dHB1dF9maWxlKGN0eCwgb3V0KTsKKworCWRybV9pbnRlbF9kZWNvZGUoY3R4KTsKKworCWlmIChzdHJjbXAocmVmX3B0ciwgcHRyKSAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRGVjb2RlIG1pc21hdGNoIHdpdGggcmVmZXJlbmNlIGAlcycuXG4iLAorCQkJcmVmX2ZpbGVuYW1lKTsKKwkJZnByaW50ZihzdGRlcnIsICJZb3UgY2FuIGR1bXAgdGhlIG5ldyBvdXRwdXQgdXNpbmc6XG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICIgIHRlc3RfZGVjb2RlIFwiJXNcIiAtZHVtcFxuIiwgYmF0Y2hfZmlsZW5hbWUpOworCQlleGl0KDEpOworCX0KKworCWZjbG9zZShvdXQpOworCWZyZWUocmVmX2ZpbGVuYW1lKTsKKwlmcmVlKHB0cik7Cit9CisKK3N0YXRpYyB1aW50MTZfdAoraW5mZXJfZGV2aWQoY29uc3QgY2hhciAqYmF0Y2hfZmlsZW5hbWUpCit7CisJc3RydWN0IHsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwkJdWludDE2X3QgZGV2aWQ7CisJfSBjaGlwc2V0c1tdID0geworCQl7ICI4MzAiLCAgMHgzNTc3fSwKKwkJeyAiODU1IiwgIDB4MzU4Mn0sCisJCXsgIjk0NSIsICAweDI3NzJ9LAorCQl7ICJnZW40IiwgMHgyYTAyIH0sCisJCXsgImdtNDUiLCAweDJhNDIgfSwKKwkJeyAiZ2VuNSIsIFBDSV9DSElQX0lMRF9HIH0sCisJCXsgImdlbjYiLCBQQ0lfQ0hJUF9TQU5EWUJSSURHRV9HVDIgfSwKKwkJeyAiZ2VuNyIsIFBDSV9DSElQX0lWWUJSSURHRV9HVDIgfSwKKwkJeyAiZ2VuOCIsIDB4MTYxNiB9LAorCQl7IE5VTEwsIDAgfSwKKwl9OworCWludCBpOworCisJZm9yIChpID0gMDsgY2hpcHNldHNbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKKwkJaWYgKHN0cnN0cihiYXRjaF9maWxlbmFtZSwgY2hpcHNldHNbaV0ubmFtZSkpCisJCQlyZXR1cm4gY2hpcHNldHNbaV0uZGV2aWQ7CisJfQorCisJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBndWVzcyBjaGlwc2V0IGlkIGZyb20gYmF0Y2ggZmlsZW5hbWUgYCVzJy5cbiIsCisJCWJhdGNoX2ZpbGVuYW1lKTsKKwlmcHJpbnRmKHN0ZGVyciwgIk11c3QgYmUgY29udGFpbiBvbmUgb2Y6XG4iKTsKKwlmb3IgKGkgPSAwOyBjaGlwc2V0c1tpXS5uYW1lICE9IE5VTEw7IGkrKykgeworCQlmcHJpbnRmKHN0ZGVyciwgIiAgJXNcbiIsIGNoaXBzZXRzW2ldLm5hbWUpOworCX0KKwlleGl0KDEpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXVpbnQxNl90IGRldmlkOworCXN0cnVjdCBkcm1faW50ZWxfZGVjb2RlICpjdHg7CisKKwlpZiAoYXJnYyA8IDIpCisJCXVzYWdlKCk7CisKKworCWRldmlkID0gaW5mZXJfZGV2aWQoYXJndlsxXSk7CisKKwljdHggPSBkcm1faW50ZWxfZGVjb2RlX2NvbnRleHRfYWxsb2MoZGV2aWQpOworCisJaWYgKGFyZ2MgPT0gMykgeworCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICItZHVtcCIpID09IDApCisJCQlkdW1wX2JhdGNoKGN0eCwgYXJndlsxXSk7CisJCWVsc2UKKwkJCXVzYWdlKCk7CisJfSBlbHNlIHsKKwkJY29tcGFyZV9iYXRjaChjdHgsIGFyZ3ZbMV0pOworCX0KKworCWRybV9pbnRlbF9kZWNvZGVfY29udGV4dF9mcmVlKGN0eCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ludGVsL3Rlc3RzLy5naXRpZ25vcmUgYi9pbnRlbC90ZXN0cy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZDAxZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlbC90ZXN0cy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKKyotbmV3LnR4dApkaWZmIC0tZ2l0IGEvaW50ZWwvdGVzdHMvZ2VuNC0zZC5iYXRjaCBiL2ludGVsL3Rlc3RzL2dlbjQtM2QuYmF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5MTFhNAotLS0gL2Rldi9udWxsCisrKyBiL2ludGVsL3Rlc3RzL2dlbjQtM2QuYmF0Y2gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaW50ZWwvdGVzdHMvZ2VuNC0zZC5iYXRjaC1yZWYudHh0IGIvaW50ZWwvdGVzdHMvZ2VuNC0zZC5iYXRjaC1yZWYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYWExZDQKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlbC90ZXN0cy9nZW40LTNkLmJhdGNoLXJlZi50eHQKQEAgLTAsMCArMSw0ODggQEAKKzB4MTIzMDAwMDA6ICAgICAgMHg2MTA0MDAwMDogM0RTVEFURV9QSVBFTElORV9TRUxFQ1QKKzB4MTIzMDAwMDQ6ICAgICAgMHg3OTA5MDAwMDogM0RTVEFURV9HTE9CQUxfREVQVEhfT0ZGU0VUX0NMQU1QCisweDEyMzAwMDA4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDEKKzB4MTIzMDAwMGM6ICAgICAgMHg2MTAyMDAwMDogU1RBVEVfU0lQCisweDEyMzAwMDEwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDEKKzB4MTIzMDAwMTQ6ICAgICAgMHg3ODBiMDAwMDogM0RTVEFURV9WRl9TVEFUSVNUSUNTCisweDEyMzAwMDE4OiAgICAgIDB4NjEwMTAwMDQ6IFNUQVRFX0JBU0VfQUREUkVTUworMHgxMjMwMDAxYzogICAgICAweDAwMDAwMDAxOiAgICBnZW5lcmFsIHN0YXRlIGJhc2UgYWRkcmVzcyAweDAwMDAwMDAwCisweDEyMzAwMDIwOiAgICAgIDB4MDAwMDAwMDE6ICAgIHN1cmZhY2Ugc3RhdGUgYmFzZSBhZGRyZXNzIDB4MDAwMDAwMDAKKzB4MTIzMDAwMjQ6ICAgICAgMHgwMDAwMDAwMTogICAgaW5kaXJlY3Qgc3RhdGUgYmFzZSBhZGRyZXNzIDB4MDAwMDAwMDAKKzB4MTIzMDAwMjg6ICAgICAgMHgwMDAwMDAwMTogICAgZ2VuZXJhbCBzdGF0ZSB1cHBlciBib3VuZCBkaXNhYmxlZAorMHgxMjMwMDAyYzogICAgICAweDAwMDAwMDAxOiAgICBpbmRpcmVjdCBzdGF0ZSB1cHBlciBib3VuZCBkaXNhYmxlZAorMHgxMjMwMDAzMDogICAgICAweDc4MDEwMDA0OiAzRFNUQVRFX0JJTkRJTkdfVEFCTEVfUE9JTlRFUlMKKzB4MTIzMDAwMzQ6ICAgICAgMHgwMDAwN2UyMDogICAgVlMgYmluZGluZyB0YWJsZQorMHgxMjMwMDAzODogICAgICAweDAwMDAwMDAwOiAgICBHUyBiaW5kaW5nIHRhYmxlCisweDEyMzAwMDNjOiAgICAgIDB4MDAwMDAwMDA6ICAgIENsaXAgYmluZGluZyB0YWJsZQorMHgxMjMwMDA0MDogICAgICAweDAwMDAwMDAwOiAgICBTRiBiaW5kaW5nIHRhYmxlCisweDEyMzAwMDQ0OiAgICAgIDB4MDAwMDdlMjA6ICAgIFdNIGJpbmRpbmcgdGFibGUKKzB4MTIzMDAwNDg6ICAgICAgMHg3OTAxMDAwMzogM0RTVEFURV9DT05TVEFOVF9DT0xPUgorMHgxMjMwMDA0YzogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAxCisweDEyMzAwMDUwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDIKKzB4MTIzMDAwNTQ6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMworMHgxMjMwMDA1ODogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCA0CisweDEyMzAwMDVjOiAgICAgIDB4NzkwNTAwMDM6IDNEU1RBVEVfREVQVEhfQlVGRkVSCisweDEyMzAwMDYwOiAgICAgIDB4MmMwODA1ZmY6ICAgIDJELCB6MjRzOCwgcGl0Y2ggPSAxNTM2IGJ5dGVzLCB0aWxlZAorMHgxMjMwMDA2NDogICAgICAweDAwMDAwMDAwOiAgICBkZXB0aCBvZmZzZXQKKzB4MTIzMDAwNjg6ICAgICAgMHgwOTU4NGFjMDogICAgMzAweDMwMAorMHgxMjMwMDA2YzogICAgICAweDAwMDAwMDAwOiAgICB2b2x1bWUgZGVwdGgKKzB4MTIzMDAwNzA6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDAwNzQ6ICAgICAgMHgwMDAwN2Q2MDogICAgVlMgc3RhdGUKKzB4MTIzMDAwNzg6ICAgICAgMHgwMDAwMDAwMDogICAgR1Mgc3RhdGUKKzB4MTIzMDAwN2M6ICAgICAgMHgwMDAwN2QyMTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDA4MDogICAgICAweDAwMDA3ZDgwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDA4NDogICAgICAweDAwMDA3ZGUwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDA4ODogICAgICAweDAwMDA3ZmMwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDA4YzogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDA5MDogICAgICAweDAzMjBhMDIwOiAgICB2cyBmZW5jZTogMzIsIGNsaXBfZmVuY2U6IDUwLCBnc19mZW5jZTogNDAKKzB4MTIzMDAwOTQ6ICAgICAgMHgxMDAwMDA0MjogICAgc2YgZmVuY2U6IDY2LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAyNTYKKzB4MTIzMDAwOTg6ICAgICAgMHg2MDAxMDAwMDogQ1NfVVJCX1NUQVRFCisweDEyMzAwMDljOiAgICAgIDB4MDAwMDAwMjQ6ICAgIGVudHJ5X3NpemU6IDIgWzE5MiBieXRlc10sIG5fZW50cmllczogNAorMHgxMjMwMDBhMDogICAgICAweDc5MDAwMDAyOiAzRFNUQVRFX0RSQVdJTkdfUkVDVEFOR0xFCisweDEyMzAwMGE0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHRvcCBsZWZ0OiAwLDAKKzB4MTIzMDAwYTg6ICAgICAgMHgwMTJiMDEyYjogICAgYm90dG9tIHJpZ2h0OiAyOTksMjk5CisweDEyMzAwMGFjOiAgICAgIDB4MDAwMDAwMDA6ICAgIG9yaWdpbjogMCwwCisweDEyMzAwMGIwOiAgICAgIDB4NzgwODAwMDM6IDNEU1RBVEVfVkVSVEVYX0JVRkZFUlMKKzB4MTIzMDAwYjQ6ICAgICAgMHgwMDAwMDAwYzogICAgYnVmZmVyIDA6IHNlcXVlbnRpYWwsIHBpdGNoIDEyYgorMHgxMjMwMDBiODogICAgICAweDAwMDAwMDAwOiAgICBidWZmZXIgYWRkcmVzcworMHgxMjMwMDBiYzogICAgICAweDAwMDAwMDAwOiAgICBtYXggaW5kZXgKKzB4MTIzMDAwYzA6ICAgICAgMHgwMDAwMDAwMDogICAgbWJ6CisweDEyMzAwMGM0OiAgICAgIDB4NzgwOTAwMDE6IDNEU1RBVEVfVkVSVEVYX0VMRU1FTlRTCisweDEyMzAwMGM4OiAgICAgIDB4MDQ0MDAwMDA6ICAgIGJ1ZmZlciAwOiB2YWxpZCwgdHlwZSAweDAwNDAsIHNyYyBvZmZzZXQgMHgwMDAwIGJ5dGVzCisweDEyMzAwMGNjOiAgICAgIDB4MTExMzAwMDA6ICAgIChYLCBZLCBaLCAxLjApLCBkc3Qgb2Zmc2V0IDB4MDAgYnl0ZXMKKzB4MTIzMDAwZDA6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDBkNDogICAgICAweDAwMDAwMDAxOiAgICBvZmZzZXQ6IDB4MDAwMDAwMDAsIGxlbmd0aDogMTI4IGJ5dGVzCisweDEyMzAwMGQ4OiAgICAgIDB4N2IwMDE4MDQ6IDNEUFJJTUlUSVZFOiB0cmkgZmFuIHNlcXVlbnRpYWwKKzB4MTIzMDAwZGM6ICAgICAgMHgwMDAwMDAwNDogICAgdmVydGV4IGNvdW50CisweDEyMzAwMGUwOiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDBlNDogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDBlODogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDBlYzogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwMGYwOiAgICAgIDB4NzgwMTAwMDQ6IDNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSUworMHgxMjMwMDBmNDogICAgICAweDAwMDA3YjQwOiAgICBWUyBiaW5kaW5nIHRhYmxlCisweDEyMzAwMGY4OiAgICAgIDB4MDAwMDAwMDA6ICAgIEdTIGJpbmRpbmcgdGFibGUKKzB4MTIzMDAwZmM6ICAgICAgMHgwMDAwMDAwMDogICAgQ2xpcCBiaW5kaW5nIHRhYmxlCisweDEyMzAwMTAwOiAgICAgIDB4MDAwMDAwMDA6ICAgIFNGIGJpbmRpbmcgdGFibGUKKzB4MTIzMDAxMDQ6ICAgICAgMHgwMDAwN2I0MDogICAgV00gYmluZGluZyB0YWJsZQorMHgxMjMwMDEwODogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDEwYzogICAgICAweDAwMDA3YWEwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDExMDogICAgICAweDAwMDA3YTQxOiAgICBHUyBzdGF0ZQorMHgxMjMwMDExNDogICAgICAweDAwMDA3YTYxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwMTE4OiAgICAgIDB4MDAwMDdhYzA6ICAgIFNGIHN0YXRlCisweDEyMzAwMTFjOiAgICAgIDB4MDAwMDdiMDA6ICAgIFdNIHN0YXRlCisweDEyMzAwMTIwOiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwMTI0OiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwMTI4OiAgICAgIDB4MDMyMGEwMjA6ICAgIHZzIGZlbmNlOiAzMiwgY2xpcF9mZW5jZTogNTAsIGdzX2ZlbmNlOiA0MAorMHgxMjMwMDEyYzogICAgICAweDEwMDAwMDQyOiAgICBzZiBmZW5jZTogNjYsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDI1NgorMHgxMjMwMDEzMDogICAgICAweDc4MDgwMDAzOiAzRFNUQVRFX1ZFUlRFWF9CVUZGRVJTCisweDEyMzAwMTM0OiAgICAgIDB4MDAwMDAwMGM6ICAgIGJ1ZmZlciAwOiBzZXF1ZW50aWFsLCBwaXRjaCAxMmIKKzB4MTIzMDAxMzg6ICAgICAgMHgwMDAwMDAwMDogICAgYnVmZmVyIGFkZHJlc3MKKzB4MTIzMDAxM2M6ICAgICAgMHgwMDAwMDAwMDogICAgbWF4IGluZGV4CisweDEyMzAwMTQwOiAgICAgIDB4MDAwMDAwMDA6ICAgIG1iegorMHgxMjMwMDE0NDogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwMTQ4OiAgICAgIDB4MDAwMDAwODI6ICAgIG9mZnNldDogMHgwMDAwMDA4MCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDAxNGM6ICAgICAgMHg3YjAwMjAwNDogM0RQUklNSVRJVkU6IHF1YWQgc3RyaXAgc2VxdWVudGlhbAorMHgxMjMwMDE1MDogICAgICAweDAwMDAwMDUyOiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDAxNTQ6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgdmVydGV4CisweDEyMzAwMTU4OiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwMTVjOiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwMTYwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDAxNjQ6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDAxNjg6ICAgICAgMHgwMDAwN2FhMDogICAgVlMgc3RhdGUKKzB4MTIzMDAxNmM6ICAgICAgMHgwMDAwN2EyMTogICAgR1Mgc3RhdGUKKzB4MTIzMDAxNzA6ICAgICAgMHgwMDAwN2E2MTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDE3NDogICAgICAweDAwMDA3YWMwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDE3ODogICAgICAweDAwMDA3YjAwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDE3YzogICAgICAweDAwMDA3Y2MwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDE4MDogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDE4NDogICAgICAweDAzMjBhMDIwOiAgICB2cyBmZW5jZTogMzIsIGNsaXBfZmVuY2U6IDUwLCBnc19mZW5jZTogNDAKKzB4MTIzMDAxODg6ICAgICAgMHgxMDAwMDA0MjogICAgc2YgZmVuY2U6IDY2LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAyNTYKKzB4MTIzMDAxOGM6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDE5MDogICAgICAweDAwMDAwMDgyOiAgICBvZmZzZXQ6IDB4MDAwMDAwODAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwMTk0OiAgICAgIDB4N2IwMDFjMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIGxpc3Qgc2VxdWVudGlhbAorMHgxMjMwMDE5ODogICAgICAweDAwMDAwMDUwOiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDAxOWM6ICAgICAgMHgwMDAwMDA1MjogICAgc3RhcnQgdmVydGV4CisweDEyMzAwMWEwOiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwMWE0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwMWE4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDAxYWM6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDAxYjA6ICAgICAgMHgwMDAwN2FhMDogICAgVlMgc3RhdGUKKzB4MTIzMDAxYjQ6ICAgICAgMHgwMDAwN2EwMTogICAgR1Mgc3RhdGUKKzB4MTIzMDAxYjg6ICAgICAgMHgwMDAwN2E2MTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDFiYzogICAgICAweDAwMDA3YWMwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDFjMDogICAgICAweDAwMDA3YjAwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDFjNDogICAgICAweDAwMDA3Y2MwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDFjODogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDFjYzogICAgICAweDAzMjBhMDIwOiAgICB2cyBmZW5jZTogMzIsIGNsaXBfZmVuY2U6IDUwLCBnc19mZW5jZTogNDAKKzB4MTIzMDAxZDA6ICAgICAgMHgxMDAwMDA0MjogICAgc2YgZmVuY2U6IDY2LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAyNTYKKzB4MTIzMDAxZDQ6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDFkODogICAgICAweDAwMDAwMTQyOiAgICBvZmZzZXQ6IDB4MDAwMDAxNDAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwMWRjOiAgICAgIDB4N2IwMDIwMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIHN0cmlwIHNlcXVlbnRpYWwKKzB4MTIzMDAxZTA6ICAgICAgMHgwMDAwMDA1MjogICAgdmVydGV4IGNvdW50CisweDEyMzAwMWU0OiAgICAgIDB4MDAwMDAwYTI6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDFlODogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDFlYzogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDFmMDogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwMWY0OiAgICAgIDB4NzgwMDAwMDU6IDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTCisweDEyMzAwMWY4OiAgICAgIDB4MDAwMDdhYTA6ICAgIFZTIHN0YXRlCisweDEyMzAwMWZjOiAgICAgIDB4MDAwMDc5ZTE6ICAgIEdTIHN0YXRlCisweDEyMzAwMjAwOiAgICAgIDB4MDAwMDdhNjE6ICAgIENsaXAgc3RhdGUKKzB4MTIzMDAyMDQ6ICAgICAgMHgwMDAwN2FjMDogICAgU0Ygc3RhdGUKKzB4MTIzMDAyMDg6ICAgICAgMHgwMDAwN2IwMDogICAgV00gc3RhdGUKKzB4MTIzMDAyMGM6ICAgICAgMHgwMDAwN2NjMDogICAgQ0Mgc3RhdGUKKzB4MTIzMDAyMTA6ICAgICAgMHg2MDAwM2YwMTogVVJCX0ZFTkNFOiBjcyB2ZmUgc2YgY2xpcCBncyB2cyAKKzB4MTIzMDAyMTQ6ICAgICAgMHgwMzIwYTAyMDogICAgdnMgZmVuY2U6IDMyLCBjbGlwX2ZlbmNlOiA1MCwgZ3NfZmVuY2U6IDQwCisweDEyMzAwMjE4OiAgICAgIDB4MTAwMDAwNDI6ICAgIHNmIGZlbmNlOiA2NiwgdmZlX2ZlbmNlOiAwLCBjc19mZW5jZTogMjU2CisweDEyMzAwMjFjOiAgICAgIDB4NjAwMjAxMDA6IENPTlNUQU5UX0JVRkZFUjogdmFsaWQKKzB4MTIzMDAyMjA6ICAgICAgMHgwMDAwMDE0MjogICAgb2Zmc2V0OiAweDAwMDAwMTQwLCBsZW5ndGg6IDE5MiBieXRlcworMHgxMjMwMDIyNDogICAgICAweDdiMDAxYzA0OiAzRFBSSU1JVElWRTogcXVhZCBsaXN0IHNlcXVlbnRpYWwKKzB4MTIzMDAyMjg6ICAgICAgMHgwMDAwMDA1MDogICAgdmVydGV4IGNvdW50CisweDEyMzAwMjJjOiAgICAgIDB4MDAwMDAwZjQ6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDIzMDogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDIzNDogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDIzODogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwMjNjOiAgICAgIDB4NzgwMDAwMDU6IDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTCisweDEyMzAwMjQwOiAgICAgIDB4MDAwMDdhYTA6ICAgIFZTIHN0YXRlCisweDEyMzAwMjQ0OiAgICAgIDB4MDAwMDc5YzE6ICAgIEdTIHN0YXRlCisweDEyMzAwMjQ4OiAgICAgIDB4MDAwMDdhNjE6ICAgIENsaXAgc3RhdGUKKzB4MTIzMDAyNGM6ICAgICAgMHgwMDAwN2FjMDogICAgU0Ygc3RhdGUKKzB4MTIzMDAyNTA6ICAgICAgMHgwMDAwN2IwMDogICAgV00gc3RhdGUKKzB4MTIzMDAyNTQ6ICAgICAgMHgwMDAwN2NjMDogICAgQ0Mgc3RhdGUKKzB4MTIzMDAyNTg6ICAgICAgMHg2MDAwM2YwMTogVVJCX0ZFTkNFOiBjcyB2ZmUgc2YgY2xpcCBncyB2cyAKKzB4MTIzMDAyNWM6ICAgICAgMHgwMzIwYTAyMDogICAgdnMgZmVuY2U6IDMyLCBjbGlwX2ZlbmNlOiA1MCwgZ3NfZmVuY2U6IDQwCisweDEyMzAwMjYwOiAgICAgIDB4MTAwMDAwNDI6ICAgIHNmIGZlbmNlOiA2NiwgdmZlX2ZlbmNlOiAwLCBjc19mZW5jZTogMjU2CisweDEyMzAwMjY0OiAgICAgIDB4NjAwMjAxMDA6IENPTlNUQU5UX0JVRkZFUjogdmFsaWQKKzB4MTIzMDAyNjg6ICAgICAgMHgwMDAwMDE0MjogICAgb2Zmc2V0OiAweDAwMDAwMTQwLCBsZW5ndGg6IDE5MiBieXRlcworMHgxMjMwMDI2YzogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDI3MDogICAgICAweDAwMDA3OWEwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDI3NDogICAgICAweDAwMDA3OWMxOiAgICBHUyBzdGF0ZQorMHgxMjMwMDI3ODogICAgICAweDAwMDA3YTYxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwMjdjOiAgICAgIDB4MDAwMDdhYzA6ICAgIFNGIHN0YXRlCisweDEyMzAwMjgwOiAgICAgIDB4MDAwMDdiMDA6ICAgIFdNIHN0YXRlCisweDEyMzAwMjg0OiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwMjg4OiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwMjhjOiAgICAgIDB4MDMyMGEwMjA6ICAgIHZzIGZlbmNlOiAzMiwgY2xpcF9mZW5jZTogNTAsIGdzX2ZlbmNlOiA0MAorMHgxMjMwMDI5MDogICAgICAweDEwMDAwMDQyOiAgICBzZiBmZW5jZTogNjYsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDI1NgorMHgxMjMwMDI5NDogICAgICAweDc4MDgwMDAzOiAzRFNUQVRFX1ZFUlRFWF9CVUZGRVJTCisweDEyMzAwMjk4OiAgICAgIDB4MDAwMDAwMTg6ICAgIGJ1ZmZlciAwOiBzZXF1ZW50aWFsLCBwaXRjaCAyNGIKKzB4MTIzMDAyOWM6ICAgICAgMHgwMDAwMGY0ODogICAgYnVmZmVyIGFkZHJlc3MKKzB4MTIzMDAyYTA6ICAgICAgMHgwMDAwMDAwMDogICAgbWF4IGluZGV4CisweDEyMzAwMmE0OiAgICAgIDB4MDAwMDAwMDA6ICAgIG1iegorMHgxMjMwMDJhODogICAgICAweDc4MDkwMDAzOiAzRFNUQVRFX1ZFUlRFWF9FTEVNRU5UUworMHgxMjMwMDJhYzogICAgICAweDA0NDAwMDAwOiAgICBidWZmZXIgMDogdmFsaWQsIHR5cGUgMHgwMDQwLCBzcmMgb2Zmc2V0IDB4MDAwMCBieXRlcworMHgxMjMwMDJiMDogICAgICAweDExMTMwMDAwOiAgICAoWCwgWSwgWiwgMS4wKSwgZHN0IG9mZnNldCAweDAwIGJ5dGVzCisweDEyMzAwMmI0OiAgICAgIDB4MDQ0MDAwMGM6ICAgIGJ1ZmZlciAwOiB2YWxpZCwgdHlwZSAweDAwNDAsIHNyYyBvZmZzZXQgMHgwMDBjIGJ5dGVzCisweDEyMzAwMmI4OiAgICAgIDB4MTExMzAwMDQ6ICAgIChYLCBZLCBaLCAxLjApLCBkc3Qgb2Zmc2V0IDB4MTAgYnl0ZXMKKzB4MTIzMDAyYmM6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDJjMDogICAgICAweDAwMDAwMjAyOiAgICBvZmZzZXQ6IDB4MDAwMDAyMDAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwMmM0OiAgICAgIDB4N2IwMDIwMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIHN0cmlwIHNlcXVlbnRpYWwKKzB4MTIzMDAyYzg6ICAgICAgMHgwMDAwMDBhMjogICAgdmVydGV4IGNvdW50CisweDEyMzAwMmNjOiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDJkMDogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDJkNDogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDJkODogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwMmRjOiAgICAgIDB4NzgwMDAwMDU6IDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTCisweDEyMzAwMmUwOiAgICAgIDB4MDAwMDc5YTA6ICAgIFZTIHN0YXRlCisweDEyMzAwMmU0OiAgICAgIDB4MDAwMDAwMDA6ICAgIEdTIHN0YXRlCisweDEyMzAwMmU4OiAgICAgIDB4MDAwMDc5MDE6ICAgIENsaXAgc3RhdGUKKzB4MTIzMDAyZWM6ICAgICAgMHgwMDAwNzk0MDogICAgU0Ygc3RhdGUKKzB4MTIzMDAyZjA6ICAgICAgMHgwMDAwNzk2MDogICAgV00gc3RhdGUKKzB4MTIzMDAyZjQ6ICAgICAgMHgwMDAwN2NjMDogICAgQ0Mgc3RhdGUKKzB4MTIzMDAyZjg6ICAgICAgMHgwMDAwMDAwMDogTUlfTk9PUAorMHgxMjMwMDJmYzogICAgICAweDAwMDAwMDAwOiBNSV9OT09QCisweDEyMzAwMzAwOiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwMzA0OiAgICAgIDB4MDMyMGEwMjA6ICAgIHZzIGZlbmNlOiAzMiwgY2xpcF9mZW5jZTogNTAsIGdzX2ZlbmNlOiA0MAorMHgxMjMwMDMwODogICAgICAweDEwMDAwMDQyOiAgICBzZiBmZW5jZTogNjYsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDI1NgorMHgxMjMwMDMwYzogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwMzEwOiAgICAgIDB4MDAwMDAyMDI6ICAgIG9mZnNldDogMHgwMDAwMDIwMCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDAzMTQ6ICAgICAgMHg3YjAwMTQwNDogM0RQUklNSVRJVkU6IHRyaSBzdHJpcCBzZXF1ZW50aWFsCisweDEyMzAwMzE4OiAgICAgIDB4MDAwMDAwMmE6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDMxYzogICAgICAweDAwMDAwMGEyOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDAzMjA6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDAzMjQ6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDAzMjg6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDMyYzogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDMzMDogICAgICAweDAwMDA3ODYwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDMzNDogICAgICAweDAwMDA3ODAxOiAgICBHUyBzdGF0ZQorMHgxMjMwMDMzODogICAgICAweDAwMDA3ODIxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwMzNjOiAgICAgIDB4MDAwMDc4ODA6ICAgIFNGIHN0YXRlCisweDEyMzAwMzQwOiAgICAgIDB4MDAwMDc4YTA6ICAgIFdNIHN0YXRlCisweDEyMzAwMzQ0OiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwMzQ4OiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwMzRjOiAgICAgIDB4MDMyMGEwMjA6ICAgIHZzIGZlbmNlOiAzMiwgY2xpcF9mZW5jZTogNTAsIGdzX2ZlbmNlOiA0MAorMHgxMjMwMDM1MDogICAgICAweDEwMDAwMDQyOiAgICBzZiBmZW5jZTogNjYsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDI1NgorMHgxMjMwMDM1NDogICAgICAweDc4MDgwMDAzOiAzRFNUQVRFX1ZFUlRFWF9CVUZGRVJTCisweDEyMzAwMzU4OiAgICAgIDB4MDAwMDAwMGM6ICAgIGJ1ZmZlciAwOiBzZXF1ZW50aWFsLCBwaXRjaCAxMmIKKzB4MTIzMDAzNWM6ICAgICAgMHgwMDAwMjI2ODogICAgYnVmZmVyIGFkZHJlc3MKKzB4MTIzMDAzNjA6ICAgICAgMHgwMDAwMDAwMDogICAgbWF4IGluZGV4CisweDEyMzAwMzY0OiAgICAgIDB4MDAwMDAwMDA6ICAgIG1iegorMHgxMjMwMDM2ODogICAgICAweDc4MDkwMDAxOiAzRFNUQVRFX1ZFUlRFWF9FTEVNRU5UUworMHgxMjMwMDM2YzogICAgICAweDA0NDAwMDAwOiAgICBidWZmZXIgMDogdmFsaWQsIHR5cGUgMHgwMDQwLCBzcmMgb2Zmc2V0IDB4MDAwMCBieXRlcworMHgxMjMwMDM3MDogICAgICAweDExMTMwMDAwOiAgICAoWCwgWSwgWiwgMS4wKSwgZHN0IG9mZnNldCAweDAwIGJ5dGVzCisweDEyMzAwMzc0OiAgICAgIDB4NjAwMjAxMDA6IENPTlNUQU5UX0JVRkZFUjogdmFsaWQKKzB4MTIzMDAzNzg6ICAgICAgMHgwMDAwMDJjMjogICAgb2Zmc2V0OiAweDAwMDAwMmMwLCBsZW5ndGg6IDE5MiBieXRlcworMHgxMjMwMDM3YzogICAgICAweDdiMDAyMDA0OiAzRFBSSU1JVElWRTogcXVhZCBzdHJpcCBzZXF1ZW50aWFsCisweDEyMzAwMzgwOiAgICAgIDB4MDAwMDAwMmE6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDM4NDogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDAzODg6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDAzOGM6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDAzOTA6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDM5NDogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDM5ODogICAgICAweDAwMDA3ODYwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDM5YzogICAgICAweDAwMDA3N2UxOiAgICBHUyBzdGF0ZQorMHgxMjMwMDNhMDogICAgICAweDAwMDA3ODIxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwM2E0OiAgICAgIDB4MDAwMDc4ODA6ICAgIFNGIHN0YXRlCisweDEyMzAwM2E4OiAgICAgIDB4MDAwMDc4YTA6ICAgIFdNIHN0YXRlCisweDEyMzAwM2FjOiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwM2IwOiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwM2I0OiAgICAgIDB4MDMyMGEwMjA6ICAgIHZzIGZlbmNlOiAzMiwgY2xpcF9mZW5jZTogNTAsIGdzX2ZlbmNlOiA0MAorMHgxMjMwMDNiODogICAgICAweDEwMDAwMDQyOiAgICBzZiBmZW5jZTogNjYsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDI1NgorMHgxMjMwMDNiYzogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwM2MwOiAgICAgIDB4MDAwMDAyYzI6ICAgIG9mZnNldDogMHgwMDAwMDJjMCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDAzYzQ6ICAgICAgMHg3YjAwMWMwNDogM0RQUklNSVRJVkU6IHF1YWQgbGlzdCBzZXF1ZW50aWFsCisweDEyMzAwM2M4OiAgICAgIDB4MDAwMDAwMjg6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDNjYzogICAgICAweDAwMDAwMDJhOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDAzZDA6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDAzZDQ6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDAzZDg6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDNkYzogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDNlMDogICAgICAweDAwMDA3ODYwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDNlNDogICAgICAweDAwMDA3N2MxOiAgICBHUyBzdGF0ZQorMHgxMjMwMDNlODogICAgICAweDAwMDA3ODIxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwM2VjOiAgICAgIDB4MDAwMDc4ODA6ICAgIFNGIHN0YXRlCisweDEyMzAwM2YwOiAgICAgIDB4MDAwMDc4YTA6ICAgIFdNIHN0YXRlCisweDEyMzAwM2Y0OiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwM2Y4OiAgICAgIDB4MDAwMDAwMDA6IE1JX05PT1AKKzB4MTIzMDAzZmM6ICAgICAgMHgwMDAwMDAwMDogTUlfTk9PUAorMHgxMjMwMDQwMDogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDQwNDogICAgICAweDAzMjBhMDIwOiAgICB2cyBmZW5jZTogMzIsIGNsaXBfZmVuY2U6IDUwLCBnc19mZW5jZTogNDAKKzB4MTIzMDA0MDg6ICAgICAgMHgxMDAwMDA0MjogICAgc2YgZmVuY2U6IDY2LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAyNTYKKzB4MTIzMDA0MGM6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDQxMDogICAgICAweDAwMDAwMzgyOiAgICBvZmZzZXQ6IDB4MDAwMDAzODAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwNDE0OiAgICAgIDB4N2IwMDIwMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIHN0cmlwIHNlcXVlbnRpYWwKKzB4MTIzMDA0MTg6ICAgICAgMHgwMDAwMDAyYTogICAgdmVydGV4IGNvdW50CisweDEyMzAwNDFjOiAgICAgIDB4MDAwMDAwNTI6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDQyMDogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDQyNDogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDQyODogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwNDJjOiAgICAgIDB4NzgwMDAwMDU6IDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTCisweDEyMzAwNDMwOiAgICAgIDB4MDAwMDc4NjA6ICAgIFZTIHN0YXRlCisweDEyMzAwNDM0OiAgICAgIDB4MDAwMDc3YTE6ICAgIEdTIHN0YXRlCisweDEyMzAwNDM4OiAgICAgIDB4MDAwMDc4MjE6ICAgIENsaXAgc3RhdGUKKzB4MTIzMDA0M2M6ICAgICAgMHgwMDAwNzg4MDogICAgU0Ygc3RhdGUKKzB4MTIzMDA0NDA6ICAgICAgMHgwMDAwNzhhMDogICAgV00gc3RhdGUKKzB4MTIzMDA0NDQ6ICAgICAgMHgwMDAwN2NjMDogICAgQ0Mgc3RhdGUKKzB4MTIzMDA0NDg6ICAgICAgMHg2MDAwM2YwMTogVVJCX0ZFTkNFOiBjcyB2ZmUgc2YgY2xpcCBncyB2cyAKKzB4MTIzMDA0NGM6ICAgICAgMHgwMzIwYTAyMDogICAgdnMgZmVuY2U6IDMyLCBjbGlwX2ZlbmNlOiA1MCwgZ3NfZmVuY2U6IDQwCisweDEyMzAwNDUwOiAgICAgIDB4MTAwMDAwNDI6ICAgIHNmIGZlbmNlOiA2NiwgdmZlX2ZlbmNlOiAwLCBjc19mZW5jZTogMjU2CisweDEyMzAwNDU0OiAgICAgIDB4NjAwMjAxMDA6IENPTlNUQU5UX0JVRkZFUjogdmFsaWQKKzB4MTIzMDA0NTg6ICAgICAgMHgwMDAwMDM4MjogICAgb2Zmc2V0OiAweDAwMDAwMzgwLCBsZW5ndGg6IDE5MiBieXRlcworMHgxMjMwMDQ1YzogICAgICAweDdiMDAxYzA0OiAzRFBSSU1JVElWRTogcXVhZCBsaXN0IHNlcXVlbnRpYWwKKzB4MTIzMDA0NjA6ICAgICAgMHgwMDAwMDAyODogICAgdmVydGV4IGNvdW50CisweDEyMzAwNDY0OiAgICAgIDB4MDAwMDAwN2M6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDQ2ODogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDQ2YzogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDQ3MDogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwNDc0OiAgICAgIDB4NzgwMDAwMDU6IDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTCisweDEyMzAwNDc4OiAgICAgIDB4MDAwMDc4NjA6ICAgIFZTIHN0YXRlCisweDEyMzAwNDdjOiAgICAgIDB4MDAwMDc3ODE6ICAgIEdTIHN0YXRlCisweDEyMzAwNDgwOiAgICAgIDB4MDAwMDc4MjE6ICAgIENsaXAgc3RhdGUKKzB4MTIzMDA0ODQ6ICAgICAgMHgwMDAwNzg4MDogICAgU0Ygc3RhdGUKKzB4MTIzMDA0ODg6ICAgICAgMHgwMDAwNzhhMDogICAgV00gc3RhdGUKKzB4MTIzMDA0OGM6ICAgICAgMHgwMDAwN2NjMDogICAgQ0Mgc3RhdGUKKzB4MTIzMDA0OTA6ICAgICAgMHg2MDAwM2YwMTogVVJCX0ZFTkNFOiBjcyB2ZmUgc2YgY2xpcCBncyB2cyAKKzB4MTIzMDA0OTQ6ICAgICAgMHgwMzIwYTAyMDogICAgdnMgZmVuY2U6IDMyLCBjbGlwX2ZlbmNlOiA1MCwgZ3NfZmVuY2U6IDQwCisweDEyMzAwNDk4OiAgICAgIDB4MTAwMDAwNDI6ICAgIHNmIGZlbmNlOiA2NiwgdmZlX2ZlbmNlOiAwLCBjc19mZW5jZTogMjU2CisweDEyMzAwNDljOiAgICAgIDB4NjAwMjAxMDA6IENPTlNUQU5UX0JVRkZFUjogdmFsaWQKKzB4MTIzMDA0YTA6ICAgICAgMHgwMDAwMDM4MjogICAgb2Zmc2V0OiAweDAwMDAwMzgwLCBsZW5ndGg6IDE5MiBieXRlcworMHgxMjMwMDRhNDogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDRhODogICAgICAweDAwMDA3NzYwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDRhYzogICAgICAweDAwMDA3NzgxOiAgICBHUyBzdGF0ZQorMHgxMjMwMDRiMDogICAgICAweDAwMDA3ODIxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwNGI0OiAgICAgIDB4MDAwMDc4ODA6ICAgIFNGIHN0YXRlCisweDEyMzAwNGI4OiAgICAgIDB4MDAwMDc4YTA6ICAgIFdNIHN0YXRlCisweDEyMzAwNGJjOiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwNGMwOiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwNGM0OiAgICAgIDB4MDMyMGEwMjA6ICAgIHZzIGZlbmNlOiAzMiwgY2xpcF9mZW5jZTogNTAsIGdzX2ZlbmNlOiA0MAorMHgxMjMwMDRjODogICAgICAweDEwMDAwMDQyOiAgICBzZiBmZW5jZTogNjYsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDI1NgorMHgxMjMwMDRjYzogICAgICAweDc4MDgwMDAzOiAzRFNUQVRFX1ZFUlRFWF9CVUZGRVJTCisweDEyMzAwNGQwOiAgICAgIDB4MDAwMDAwMTg6ICAgIGJ1ZmZlciAwOiBzZXF1ZW50aWFsLCBwaXRjaCAyNGIKKzB4MTIzMDA0ZDQ6ICAgICAgMHgwMDAwMmEzMDogICAgYnVmZmVyIGFkZHJlc3MKKzB4MTIzMDA0ZDg6ICAgICAgMHgwMDAwMDAwMDogICAgbWF4IGluZGV4CisweDEyMzAwNGRjOiAgICAgIDB4MDAwMDAwMDA6ICAgIG1iegorMHgxMjMwMDRlMDogICAgICAweDc4MDkwMDAzOiAzRFNUQVRFX1ZFUlRFWF9FTEVNRU5UUworMHgxMjMwMDRlNDogICAgICAweDA0NDAwMDAwOiAgICBidWZmZXIgMDogdmFsaWQsIHR5cGUgMHgwMDQwLCBzcmMgb2Zmc2V0IDB4MDAwMCBieXRlcworMHgxMjMwMDRlODogICAgICAweDExMTMwMDAwOiAgICAoWCwgWSwgWiwgMS4wKSwgZHN0IG9mZnNldCAweDAwIGJ5dGVzCisweDEyMzAwNGVjOiAgICAgIDB4MDQ0MDAwMGM6ICAgIGJ1ZmZlciAwOiB2YWxpZCwgdHlwZSAweDAwNDAsIHNyYyBvZmZzZXQgMHgwMDBjIGJ5dGVzCisweDEyMzAwNGYwOiAgICAgIDB4MTExMzAwMDQ6ICAgIChYLCBZLCBaLCAxLjApLCBkc3Qgb2Zmc2V0IDB4MTAgYnl0ZXMKKzB4MTIzMDA0ZjQ6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDRmODogICAgICAweDAwMDAwNDQyOiAgICBvZmZzZXQ6IDB4MDAwMDA0NDAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwNGZjOiAgICAgIDB4N2IwMDIwMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIHN0cmlwIHNlcXVlbnRpYWwKKzB4MTIzMDA1MDA6ICAgICAgMHgwMDAwMDA1MjogICAgdmVydGV4IGNvdW50CisweDEyMzAwNTA0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDUwODogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDUwYzogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDUxMDogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwNTE0OiAgICAgIDB4NzgwMDAwMDU6IDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTCisweDEyMzAwNTE4OiAgICAgIDB4MDAwMDc3NjA6ICAgIFZTIHN0YXRlCisweDEyMzAwNTFjOiAgICAgIDB4MDAwMDAwMDA6ICAgIEdTIHN0YXRlCisweDEyMzAwNTIwOiAgICAgIDB4MDAwMDc2YzE6ICAgIENsaXAgc3RhdGUKKzB4MTIzMDA1MjQ6ICAgICAgMHgwMDAwNzcwMDogICAgU0Ygc3RhdGUKKzB4MTIzMDA1Mjg6ICAgICAgMHgwMDAwNzcyMDogICAgV00gc3RhdGUKKzB4MTIzMDA1MmM6ICAgICAgMHgwMDAwN2NjMDogICAgQ0Mgc3RhdGUKKzB4MTIzMDA1MzA6ICAgICAgMHg2MDAwM2YwMTogVVJCX0ZFTkNFOiBjcyB2ZmUgc2YgY2xpcCBncyB2cyAKKzB4MTIzMDA1MzQ6ICAgICAgMHgwMzIwYTAyMDogICAgdnMgZmVuY2U6IDMyLCBjbGlwX2ZlbmNlOiA1MCwgZ3NfZmVuY2U6IDQwCisweDEyMzAwNTM4OiAgICAgIDB4MTAwMDAwNDI6ICAgIHNmIGZlbmNlOiA2NiwgdmZlX2ZlbmNlOiAwLCBjc19mZW5jZTogMjU2CisweDEyMzAwNTNjOiAgICAgIDB4NjAwMjAxMDA6IENPTlNUQU5UX0JVRkZFUjogdmFsaWQKKzB4MTIzMDA1NDA6ICAgICAgMHgwMDAwMDQ0MjogICAgb2Zmc2V0OiAweDAwMDAwNDQwLCBsZW5ndGg6IDE5MiBieXRlcworMHgxMjMwMDU0NDogICAgICAweDdiMDAxNDA0OiAzRFBSSU1JVElWRTogdHJpIHN0cmlwIHNlcXVlbnRpYWwKKzB4MTIzMDA1NDg6ICAgICAgMHgwMDAwMDAxNjogICAgdmVydGV4IGNvdW50CisweDEyMzAwNTRjOiAgICAgIDB4MDAwMDAwNTI6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDU1MDogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDU1NDogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDU1ODogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwNTVjOiAgICAgIDB4NzgwMDAwMDU6IDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTCisweDEyMzAwNTYwOiAgICAgIDB4MDAwMDc2MjA6ICAgIFZTIHN0YXRlCisweDEyMzAwNTY0OiAgICAgIDB4MDAwMDc1YzE6ICAgIEdTIHN0YXRlCisweDEyMzAwNTY4OiAgICAgIDB4MDAwMDc1ZTE6ICAgIENsaXAgc3RhdGUKKzB4MTIzMDA1NmM6ICAgICAgMHgwMDAwNzY0MDogICAgU0Ygc3RhdGUKKzB4MTIzMDA1NzA6ICAgICAgMHgwMDAwNzY2MDogICAgV00gc3RhdGUKKzB4MTIzMDA1NzQ6ICAgICAgMHgwMDAwN2NjMDogICAgQ0Mgc3RhdGUKKzB4MTIzMDA1Nzg6ICAgICAgMHgwMDAwMDAwMDogTUlfTk9PUAorMHgxMjMwMDU3YzogICAgICAweDAwMDAwMDAwOiBNSV9OT09QCisweDEyMzAwNTgwOiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwNTg0OiAgICAgIDB4MDMyMGEwMjA6ICAgIHZzIGZlbmNlOiAzMiwgY2xpcF9mZW5jZTogNTAsIGdzX2ZlbmNlOiA0MAorMHgxMjMwMDU4ODogICAgICAweDEwMDAwMDQyOiAgICBzZiBmZW5jZTogNjYsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDI1NgorMHgxMjMwMDU4YzogICAgICAweDc4MDgwMDAzOiAzRFNUQVRFX1ZFUlRFWF9CVUZGRVJTCisweDEyMzAwNTkwOiAgICAgIDB4MDAwMDAwMGM6ICAgIGJ1ZmZlciAwOiBzZXF1ZW50aWFsLCBwaXRjaCAxMmIKKzB4MTIzMDA1OTQ6ICAgICAgMHgwMDAwMzNmMDogICAgYnVmZmVyIGFkZHJlc3MKKzB4MTIzMDA1OTg6ICAgICAgMHgwMDAwMDAwMDogICAgbWF4IGluZGV4CisweDEyMzAwNTljOiAgICAgIDB4MDAwMDAwMDA6ICAgIG1iegorMHgxMjMwMDVhMDogICAgICAweDc4MDkwMDAxOiAzRFNUQVRFX1ZFUlRFWF9FTEVNRU5UUworMHgxMjMwMDVhNDogICAgICAweDA0NDAwMDAwOiAgICBidWZmZXIgMDogdmFsaWQsIHR5cGUgMHgwMDQwLCBzcmMgb2Zmc2V0IDB4MDAwMCBieXRlcworMHgxMjMwMDVhODogICAgICAweDExMTMwMDAwOiAgICAoWCwgWSwgWiwgMS4wKSwgZHN0IG9mZnNldCAweDAwIGJ5dGVzCisweDEyMzAwNWFjOiAgICAgIDB4NjAwMjAxMDA6IENPTlNUQU5UX0JVRkZFUjogdmFsaWQKKzB4MTIzMDA1YjA6ICAgICAgMHgwMDAwMDUwMjogICAgb2Zmc2V0OiAweDAwMDAwNTAwLCBsZW5ndGg6IDE5MiBieXRlcworMHgxMjMwMDViNDogICAgICAweDdiMDAyMDA0OiAzRFBSSU1JVElWRTogcXVhZCBzdHJpcCBzZXF1ZW50aWFsCisweDEyMzAwNWI4OiAgICAgIDB4MDAwMDAwMmE6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDViYzogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDA1YzA6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDA1YzQ6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDA1Yzg6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDVjYzogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDVkMDogICAgICAweDAwMDA3NjIwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDVkNDogICAgICAweDAwMDA3NWExOiAgICBHUyBzdGF0ZQorMHgxMjMwMDVkODogICAgICAweDAwMDA3NWUxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwNWRjOiAgICAgIDB4MDAwMDc2NDA6ICAgIFNGIHN0YXRlCisweDEyMzAwNWUwOiAgICAgIDB4MDAwMDc2NjA6ICAgIFdNIHN0YXRlCisweDEyMzAwNWU0OiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwNWU4OiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwNWVjOiAgICAgIDB4MDMyMGEwMjA6ICAgIHZzIGZlbmNlOiAzMiwgY2xpcF9mZW5jZTogNTAsIGdzX2ZlbmNlOiA0MAorMHgxMjMwMDVmMDogICAgICAweDEwMDAwMDQyOiAgICBzZiBmZW5jZTogNjYsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDI1NgorMHgxMjMwMDVmNDogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwNWY4OiAgICAgIDB4MDAwMDA1MDI6ICAgIG9mZnNldDogMHgwMDAwMDUwMCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDA1ZmM6ICAgICAgMHg3YjAwMWMwNDogM0RQUklNSVRJVkU6IHF1YWQgbGlzdCBzZXF1ZW50aWFsCisweDEyMzAwNjAwOiAgICAgIDB4MDAwMDAwMjg6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDYwNDogICAgICAweDAwMDAwMDJhOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDA2MDg6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDA2MGM6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDA2MTA6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDYxNDogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDYxODogICAgICAweDAwMDA3NjIwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDYxYzogICAgICAweDAwMDA3NTgxOiAgICBHUyBzdGF0ZQorMHgxMjMwMDYyMDogICAgICAweDAwMDA3NWUxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwNjI0OiAgICAgIDB4MDAwMDc2NDA6ICAgIFNGIHN0YXRlCisweDEyMzAwNjI4OiAgICAgIDB4MDAwMDc2NjA6ICAgIFdNIHN0YXRlCisweDEyMzAwNjJjOiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwNjMwOiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwNjM0OiAgICAgIDB4MDMyMGEwMjA6ICAgIHZzIGZlbmNlOiAzMiwgY2xpcF9mZW5jZTogNTAsIGdzX2ZlbmNlOiA0MAorMHgxMjMwMDYzODogICAgICAweDEwMDAwMDQyOiAgICBzZiBmZW5jZTogNjYsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDI1NgorMHgxMjMwMDYzYzogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwNjQwOiAgICAgIDB4MDAwMDA1YzI6ICAgIG9mZnNldDogMHgwMDAwMDVjMCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDA2NDQ6ICAgICAgMHg3YjAwMjAwNDogM0RQUklNSVRJVkU6IHF1YWQgc3RyaXAgc2VxdWVudGlhbAorMHgxMjMwMDY0ODogICAgICAweDAwMDAwMDJhOiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDA2NGM6ICAgICAgMHgwMDAwMDA1MjogICAgc3RhcnQgdmVydGV4CisweDEyMzAwNjUwOiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwNjU0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwNjU4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDA2NWM6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDA2NjA6ICAgICAgMHgwMDAwNzYyMDogICAgVlMgc3RhdGUKKzB4MTIzMDA2NjQ6ICAgICAgMHgwMDAwNzU2MTogICAgR1Mgc3RhdGUKKzB4MTIzMDA2Njg6ICAgICAgMHgwMDAwNzVlMTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDY2YzogICAgICAweDAwMDA3NjQwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDY3MDogICAgICAweDAwMDA3NjYwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDY3NDogICAgICAweDAwMDA3Y2MwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDY3ODogICAgICAweDAwMDAwMDAwOiBNSV9OT09QCisweDEyMzAwNjdjOiAgICAgIDB4MDAwMDAwMDA6IE1JX05PT1AKKzB4MTIzMDA2ODA6ICAgICAgMHg2MDAwM2YwMTogVVJCX0ZFTkNFOiBjcyB2ZmUgc2YgY2xpcCBncyB2cyAKKzB4MTIzMDA2ODQ6ICAgICAgMHgwMzIwYTAyMDogICAgdnMgZmVuY2U6IDMyLCBjbGlwX2ZlbmNlOiA1MCwgZ3NfZmVuY2U6IDQwCisweDEyMzAwNjg4OiAgICAgIDB4MTAwMDAwNDI6ICAgIHNmIGZlbmNlOiA2NiwgdmZlX2ZlbmNlOiAwLCBjc19mZW5jZTogMjU2CisweDEyMzAwNjhjOiAgICAgIDB4NjAwMjAxMDA6IENPTlNUQU5UX0JVRkZFUjogdmFsaWQKKzB4MTIzMDA2OTA6ICAgICAgMHgwMDAwMDVjMjogICAgb2Zmc2V0OiAweDAwMDAwNWMwLCBsZW5ndGg6IDE5MiBieXRlcworMHgxMjMwMDY5NDogICAgICAweDdiMDAxYzA0OiAzRFBSSU1JVElWRTogcXVhZCBsaXN0IHNlcXVlbnRpYWwKKzB4MTIzMDA2OTg6ICAgICAgMHgwMDAwMDAyODogICAgdmVydGV4IGNvdW50CisweDEyMzAwNjljOiAgICAgIDB4MDAwMDAwN2M6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDZhMDogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDZhNDogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDZhODogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwNmFjOiAgICAgIDB4NzgwMDAwMDU6IDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTCisweDEyMzAwNmIwOiAgICAgIDB4MDAwMDc2MjA6ICAgIFZTIHN0YXRlCisweDEyMzAwNmI0OiAgICAgIDB4MDAwMDc1NDE6ICAgIEdTIHN0YXRlCisweDEyMzAwNmI4OiAgICAgIDB4MDAwMDc1ZTE6ICAgIENsaXAgc3RhdGUKKzB4MTIzMDA2YmM6ICAgICAgMHgwMDAwNzY0MDogICAgU0Ygc3RhdGUKKzB4MTIzMDA2YzA6ICAgICAgMHgwMDAwNzY2MDogICAgV00gc3RhdGUKKzB4MTIzMDA2YzQ6ICAgICAgMHgwMDAwN2NjMDogICAgQ0Mgc3RhdGUKKzB4MTIzMDA2Yzg6ICAgICAgMHg2MDAwM2YwMTogVVJCX0ZFTkNFOiBjcyB2ZmUgc2YgY2xpcCBncyB2cyAKKzB4MTIzMDA2Y2M6ICAgICAgMHgwMzIwYTAyMDogICAgdnMgZmVuY2U6IDMyLCBjbGlwX2ZlbmNlOiA1MCwgZ3NfZmVuY2U6IDQwCisweDEyMzAwNmQwOiAgICAgIDB4MTAwMDAwNDI6ICAgIHNmIGZlbmNlOiA2NiwgdmZlX2ZlbmNlOiAwLCBjc19mZW5jZTogMjU2CisweDEyMzAwNmQ0OiAgICAgIDB4NjAwMjAxMDA6IENPTlNUQU5UX0JVRkZFUjogdmFsaWQKKzB4MTIzMDA2ZDg6ICAgICAgMHgwMDAwMDVjMjogICAgb2Zmc2V0OiAweDAwMDAwNWMwLCBsZW5ndGg6IDE5MiBieXRlcworMHgxMjMwMDZkYzogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDZlMDogICAgICAweDAwMDA3NTIwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDZlNDogICAgICAweDAwMDA3NTQxOiAgICBHUyBzdGF0ZQorMHgxMjMwMDZlODogICAgICAweDAwMDA3NWUxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwNmVjOiAgICAgIDB4MDAwMDc2NDA6ICAgIFNGIHN0YXRlCisweDEyMzAwNmYwOiAgICAgIDB4MDAwMDc2NjA6ICAgIFdNIHN0YXRlCisweDEyMzAwNmY0OiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwNmY4OiAgICAgIDB4MDAwMDAwMDA6IE1JX05PT1AKKzB4MTIzMDA2ZmM6ICAgICAgMHgwMDAwMDAwMDogTUlfTk9PUAorMHgxMjMwMDcwMDogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDcwNDogICAgICAweDAzMjBhMDIwOiAgICB2cyBmZW5jZTogMzIsIGNsaXBfZmVuY2U6IDUwLCBnc19mZW5jZTogNDAKKzB4MTIzMDA3MDg6ICAgICAgMHgxMDAwMDA0MjogICAgc2YgZmVuY2U6IDY2LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAyNTYKKzB4MTIzMDA3MGM6ICAgICAgMHg3ODA4MDAwMzogM0RTVEFURV9WRVJURVhfQlVGRkVSUworMHgxMjMwMDcxMDogICAgICAweDAwMDAwMDE4OiAgICBidWZmZXIgMDogc2VxdWVudGlhbCwgcGl0Y2ggMjRiCisweDEyMzAwNzE0OiAgICAgIDB4MDAwMDNiYjg6ICAgIGJ1ZmZlciBhZGRyZXNzCisweDEyMzAwNzE4OiAgICAgIDB4MDAwMDAwMDA6ICAgIG1heCBpbmRleAorMHgxMjMwMDcxYzogICAgICAweDAwMDAwMDAwOiAgICBtYnoKKzB4MTIzMDA3MjA6ICAgICAgMHg3ODA5MDAwMzogM0RTVEFURV9WRVJURVhfRUxFTUVOVFMKKzB4MTIzMDA3MjQ6ICAgICAgMHgwNDQwMDAwMDogICAgYnVmZmVyIDA6IHZhbGlkLCB0eXBlIDB4MDA0MCwgc3JjIG9mZnNldCAweDAwMDAgYnl0ZXMKKzB4MTIzMDA3Mjg6ICAgICAgMHgxMTEzMDAwMDogICAgKFgsIFksIFosIDEuMCksIGRzdCBvZmZzZXQgMHgwMCBieXRlcworMHgxMjMwMDcyYzogICAgICAweDA0NDAwMDBjOiAgICBidWZmZXIgMDogdmFsaWQsIHR5cGUgMHgwMDQwLCBzcmMgb2Zmc2V0IDB4MDAwYyBieXRlcworMHgxMjMwMDczMDogICAgICAweDExMTMwMDA0OiAgICAoWCwgWSwgWiwgMS4wKSwgZHN0IG9mZnNldCAweDEwIGJ5dGVzCisweDEyMzAwNzM0OiAgICAgIDB4NjAwMjAxMDA6IENPTlNUQU5UX0JVRkZFUjogdmFsaWQKKzB4MTIzMDA3Mzg6ICAgICAgMHgwMDAwMDY4MjogICAgb2Zmc2V0OiAweDAwMDAwNjgwLCBsZW5ndGg6IDE5MiBieXRlcworMHgxMjMwMDczYzogICAgICAweDdiMDAyMDA0OiAzRFBSSU1JVElWRTogcXVhZCBzdHJpcCBzZXF1ZW50aWFsCisweDEyMzAwNzQwOiAgICAgIDB4MDAwMDAwNTI6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDc0NDogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDA3NDg6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDA3NGM6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDA3NTA6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDc1NDogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDc1ODogICAgICAweDAwMDA3NTIwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDc1YzogICAgICAweDAwMDAwMDAwOiAgICBHUyBzdGF0ZQorMHgxMjMwMDc2MDogICAgICAweDAwMDA3NDgxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwNzY0OiAgICAgIDB4MDAwMDc0YzA6ICAgIFNGIHN0YXRlCisweDEyMzAwNzY4OiAgICAgIDB4MDAwMDc0ZTA6ICAgIFdNIHN0YXRlCisweDEyMzAwNzZjOiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwNzcwOiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwNzc0OiAgICAgIDB4MDMyMGEwMjA6ICAgIHZzIGZlbmNlOiAzMiwgY2xpcF9mZW5jZTogNTAsIGdzX2ZlbmNlOiA0MAorMHgxMjMwMDc3ODogICAgICAweDEwMDAwMDQyOiAgICBzZiBmZW5jZTogNjYsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDI1NgorMHgxMjMwMDc3YzogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwNzgwOiAgICAgIDB4MDAwMDA2ODI6ICAgIG9mZnNldDogMHgwMDAwMDY4MCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDA3ODQ6ICAgICAgMHg3YjAwMTQwNDogM0RQUklNSVRJVkU6IHRyaSBzdHJpcCBzZXF1ZW50aWFsCisweDEyMzAwNzg4OiAgICAgIDB4MDAwMDAwMTY6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDc4YzogICAgICAweDAwMDAwMDUyOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDA3OTA6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDA3OTQ6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDA3OTg6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDc5YzogICAgICAweDA1MDAwMDAwOiBNSV9CQVRDSF9CVUZGRVJfRU5ECmRpZmYgLS1naXQgYS9pbnRlbC90ZXN0cy9nZW40LTNkLmJhdGNoLnNoIGIvaW50ZWwvdGVzdHMvZ2VuNC0zZC5iYXRjaC5zaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi43OTZjYTVmCi0tLSAvZGV2L251bGwKKysrIGIvaW50ZWwvdGVzdHMvZ2VuNC0zZC5iYXRjaC5zaApAQCAtMCwwICsxIEBACit0ZXN0LWJhdGNoLnNoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW50ZWwvdGVzdHMvZ2VuNS0zZC5iYXRjaCBiL2ludGVsL3Rlc3RzL2dlbjUtM2QuYmF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y5ZDhkOAotLS0gL2Rldi9udWxsCisrKyBiL2ludGVsL3Rlc3RzL2dlbjUtM2QuYmF0Y2gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaW50ZWwvdGVzdHMvZ2VuNS0zZC5iYXRjaC1yZWYudHh0IGIvaW50ZWwvdGVzdHMvZ2VuNS0zZC5iYXRjaC1yZWYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZGQ4NWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlbC90ZXN0cy9nZW41LTNkLmJhdGNoLXJlZi50eHQKQEAgLTAsMCArMSw1MTIgQEAKKzB4MTIzMDAwMDA6ICAgICAgMHg2OTA0MDAwMDogM0RTVEFURV9QSVBFTElORV9TRUxFQ1QKKzB4MTIzMDAwMDQ6ICAgICAgMHg3OTA5MDAwMDogM0RTVEFURV9HTE9CQUxfREVQVEhfT0ZGU0VUX0NMQU1QCisweDEyMzAwMDA4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDEKKzB4MTIzMDAwMGM6ICAgICAgMHg2MTAyMDAwMDogU1RBVEVfU0lQCisweDEyMzAwMDEwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDEKKzB4MTIzMDAwMTQ6ICAgICAgMHg2ODBiMDAwMDogM0RTVEFURV9WRl9TVEFUSVNUSUNTCisweDEyMzAwMDE4OiAgICAgIDB4NjEwMTAwMDY6IFNUQVRFX0JBU0VfQUREUkVTUworMHgxMjMwMDAxYzogICAgICAweDAwMDAwMDAxOiAgICBnZW5lcmFsIHN0YXRlIGJhc2UgYWRkcmVzcyAweDAwMDAwMDAwCisweDEyMzAwMDIwOiAgICAgIDB4MDAwMDAwMDE6ICAgIHN1cmZhY2Ugc3RhdGUgYmFzZSBhZGRyZXNzIDB4MDAwMDAwMDAKKzB4MTIzMDAwMjQ6ICAgICAgMHgwMDAwMDAwMTogICAgaW5kaXJlY3Qgc3RhdGUgYmFzZSBhZGRyZXNzIDB4MDAwMDAwMDAKKzB4MTIzMDAwMjg6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdHJ1Y3Rpb24gc3RhdGUgYmFzZSBhZGRyZXNzIDB4MDAwMDAwMDAKKzB4MTIzMDAwMmM6ICAgICAgMHgwMDAwMDAwMTogICAgZ2VuZXJhbCBzdGF0ZSB1cHBlciBib3VuZCBkaXNhYmxlZAorMHgxMjMwMDAzMDogICAgICAweDAwMDAwMDAxOiAgICBpbmRpcmVjdCBzdGF0ZSB1cHBlciBib3VuZCBkaXNhYmxlZAorMHgxMjMwMDAzNDogICAgICAweDAwMDAwMDAxOiAgICBpbnN0cnVjdGlvbiBzdGF0ZSB1cHBlciBib3VuZCBkaXNhYmxlZAorMHgxMjMwMDAzODogICAgICAweDc4MDEwMDA0OiAzRFNUQVRFX0JJTkRJTkdfVEFCTEVfUE9JTlRFUlMKKzB4MTIzMDAwM2M6ICAgICAgMHgwMDAwN2UyMDogICAgVlMgYmluZGluZyB0YWJsZQorMHgxMjMwMDA0MDogICAgICAweDAwMDAwMDAwOiAgICBHUyBiaW5kaW5nIHRhYmxlCisweDEyMzAwMDQ0OiAgICAgIDB4MDAwMDAwMDA6ICAgIENsaXAgYmluZGluZyB0YWJsZQorMHgxMjMwMDA0ODogICAgICAweDAwMDAwMDAwOiAgICBTRiBiaW5kaW5nIHRhYmxlCisweDEyMzAwMDRjOiAgICAgIDB4MDAwMDdlMjA6ICAgIFdNIGJpbmRpbmcgdGFibGUKKzB4MTIzMDAwNTA6ICAgICAgMHg3OTAxMDAwMzogM0RTVEFURV9DT05TVEFOVF9DT0xPUgorMHgxMjMwMDA1NDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAxCisweDEyMzAwMDU4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDIKKzB4MTIzMDAwNWM6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMworMHgxMjMwMDA2MDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCA0CisweDEyMzAwMDY0OiAgICAgIDB4NzkwNTAwMDQ6IDNEU1RBVEVfREVQVEhfQlVGRkVSCisweDEyMzAwMDY4OiAgICAgIDB4MmMwODA1ZmY6ICAgIDJELCB6MjRzOCwgcGl0Y2ggPSAxNTM2IGJ5dGVzLCB0aWxlZCwgSGlaIDAsIFNlcGFyYXRlIFN0ZW5jaWwgMAorMHgxMjMwMDA2YzogICAgICAweDAwMDAwMDAwOiAgICBkZXB0aCBvZmZzZXQKKzB4MTIzMDAwNzA6ICAgICAgMHgwOTU4NGFjMDogICAgMzAweDMwMAorMHgxMjMwMDA3NDogICAgICAweDAwMDAwMDAwOiAgICB2b2x1bWUgZGVwdGgKKzB4MTIzMDAwNzg6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwMDdjOiAgICAgIDB4MDIwMDAwMDA6IE1JX0ZMVVNICisweDEyMzAwMDgwOiAgICAgIDB4NzgwMDAwMDU6IDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTCisweDEyMzAwMDg0OiAgICAgIDB4MDAwMDdkNjA6ICAgIFZTIHN0YXRlCisweDEyMzAwMDg4OiAgICAgIDB4MDAwMDAwMDA6ICAgIEdTIHN0YXRlCisweDEyMzAwMDhjOiAgICAgIDB4MDAwMDdkMjE6ICAgIENsaXAgc3RhdGUKKzB4MTIzMDAwOTA6ICAgICAgMHgwMDAwN2Q4MDogICAgU0Ygc3RhdGUKKzB4MTIzMDAwOTQ6ICAgICAgMHgwMDAwN2RlMDogICAgV00gc3RhdGUKKzB4MTIzMDAwOTg6ICAgICAgMHgwMDAwN2ZjMDogICAgQ0Mgc3RhdGUKKzB4MTIzMDAwOWM6ICAgICAgMHg2MDAwM2YwMTogVVJCX0ZFTkNFOiBjcyB2ZmUgc2YgY2xpcCBncyB2cyAKKzB4MTIzMDAwYTA6ICAgICAgMHgxMjQ0NDEwMDogICAgdnMgZmVuY2U6IDI1NiwgY2xpcF9mZW5jZTogMjkyLCBnc19mZW5jZTogMjcyCisweDEyMzAwMGE0OiAgICAgIDB4NDAwMDAxODQ6ICAgIHNmIGZlbmNlOiAzODgsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDEwMjQKKzB4MTIzMDAwYTg6ICAgICAgMHg2MDAxMDAwMDogQ1NfVVJCX1NUQVRFCisweDEyMzAwMGFjOiAgICAgIDB4MDAwMDAwMjQ6ICAgIGVudHJ5X3NpemU6IDIgWzE5MiBieXRlc10sIG5fZW50cmllczogNAorMHgxMjMwMDBiMDogICAgICAweDc5MDAwMDAyOiAzRFNUQVRFX0RSQVdJTkdfUkVDVEFOR0xFCisweDEyMzAwMGI0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHRvcCBsZWZ0OiAwLDAKKzB4MTIzMDAwYjg6ICAgICAgMHgwMTJiMDEyYjogICAgYm90dG9tIHJpZ2h0OiAyOTksMjk5CisweDEyMzAwMGJjOiAgICAgIDB4MDAwMDAwMDA6ICAgIG9yaWdpbjogMCwwCisweDEyMzAwMGMwOiAgICAgIDB4NzgwODAwMDM6IDNEU1RBVEVfVkVSVEVYX0JVRkZFUlMKKzB4MTIzMDAwYzQ6ICAgICAgMHgwMDAwMDAwYzogICAgYnVmZmVyIDA6IHNlcXVlbnRpYWwsIHBpdGNoIDEyYgorMHgxMjMwMDBjODogICAgICAweDAwMDAwMDAwOiAgICBidWZmZXIgYWRkcmVzcworMHgxMjMwMDBjYzogICAgICAweDAwMDBmZmZmOiAgICBtYXggaW5kZXgKKzB4MTIzMDAwZDA6ICAgICAgMHgwMDAwMDAwMDogICAgbWJ6CisweDEyMzAwMGQ0OiAgICAgIDB4NzgwOTAwMDE6IDNEU1RBVEVfVkVSVEVYX0VMRU1FTlRTCisweDEyMzAwMGQ4OiAgICAgIDB4MDQ0MDAwMDA6ICAgIGJ1ZmZlciAwOiB2YWxpZCwgdHlwZSAweDAwNDAsIHNyYyBvZmZzZXQgMHgwMDAwIGJ5dGVzCisweDEyMzAwMGRjOiAgICAgIDB4MTExMzAwMDA6ICAgIChYLCBZLCBaLCAxLjApLCBkc3Qgb2Zmc2V0IDB4MDAgYnl0ZXMKKzB4MTIzMDAwZTA6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDBlNDogICAgICAweDAwMDAwMDAxOiAgICBvZmZzZXQ6IDB4MDAwMDAwMDAsIGxlbmd0aDogMTI4IGJ5dGVzCisweDEyMzAwMGU4OiAgICAgIDB4N2IwMDE4MDQ6IDNEUFJJTUlUSVZFOiB0cmkgZmFuIHNlcXVlbnRpYWwKKzB4MTIzMDAwZWM6ICAgICAgMHgwMDAwMDAwNDogICAgdmVydGV4IGNvdW50CisweDEyMzAwMGYwOiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDBmNDogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDBmODogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDBmYzogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwMTAwOiAgICAgIDB4NzgwMTAwMDQ6IDNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSUworMHgxMjMwMDEwNDogICAgICAweDAwMDA3YjQwOiAgICBWUyBiaW5kaW5nIHRhYmxlCisweDEyMzAwMTA4OiAgICAgIDB4MDAwMDAwMDA6ICAgIEdTIGJpbmRpbmcgdGFibGUKKzB4MTIzMDAxMGM6ICAgICAgMHgwMDAwMDAwMDogICAgQ2xpcCBiaW5kaW5nIHRhYmxlCisweDEyMzAwMTEwOiAgICAgIDB4MDAwMDAwMDA6ICAgIFNGIGJpbmRpbmcgdGFibGUKKzB4MTIzMDAxMTQ6ICAgICAgMHgwMDAwN2I0MDogICAgV00gYmluZGluZyB0YWJsZQorMHgxMjMwMDExODogICAgICAweDAyMDAwMDAwOiBNSV9GTFVTSAorMHgxMjMwMDExYzogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDEyMDogICAgICAweDAwMDA3YWEwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDEyNDogICAgICAweDAwMDA3YTQxOiAgICBHUyBzdGF0ZQorMHgxMjMwMDEyODogICAgICAweDAwMDA3YTYxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwMTJjOiAgICAgIDB4MDAwMDdhYzA6ICAgIFNGIHN0YXRlCisweDEyMzAwMTMwOiAgICAgIDB4MDAwMDdiMDA6ICAgIFdNIHN0YXRlCisweDEyMzAwMTM0OiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwMTM4OiAgICAgIDB4MDAwMDAwMDA6IE1JX05PT1AKKzB4MTIzMDAxM2M6ICAgICAgMHgwMDAwMDAwMDogTUlfTk9PUAorMHgxMjMwMDE0MDogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDE0NDogICAgICAweDEyNDQ0MTAwOiAgICB2cyBmZW5jZTogMjU2LCBjbGlwX2ZlbmNlOiAyOTIsIGdzX2ZlbmNlOiAyNzIKKzB4MTIzMDAxNDg6ICAgICAgMHg0MDAwMDE4NDogICAgc2YgZmVuY2U6IDM4OCwgdmZlX2ZlbmNlOiAwLCBjc19mZW5jZTogMTAyNAorMHgxMjMwMDE0YzogICAgICAweDc4MDgwMDAzOiAzRFNUQVRFX1ZFUlRFWF9CVUZGRVJTCisweDEyMzAwMTUwOiAgICAgIDB4MDAwMDAwMGM6ICAgIGJ1ZmZlciAwOiBzZXF1ZW50aWFsLCBwaXRjaCAxMmIKKzB4MTIzMDAxNTQ6ICAgICAgMHgwMDAwMDAwMDogICAgYnVmZmVyIGFkZHJlc3MKKzB4MTIzMDAxNTg6ICAgICAgMHgwMDAwN2ZmZjogICAgbWF4IGluZGV4CisweDEyMzAwMTVjOiAgICAgIDB4MDAwMDAwMDA6ICAgIG1iegorMHgxMjMwMDE2MDogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwMTY0OiAgICAgIDB4MDAwMDAwODI6ICAgIG9mZnNldDogMHgwMDAwMDA4MCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDAxNjg6ICAgICAgMHg3YjAwMjAwNDogM0RQUklNSVRJVkU6IHF1YWQgc3RyaXAgc2VxdWVudGlhbAorMHgxMjMwMDE2YzogICAgICAweDAwMDAwMDUyOiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDAxNzA6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgdmVydGV4CisweDEyMzAwMTc0OiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwMTc4OiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwMTdjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDAxODA6ICAgICAgMHgwMjAwMDAwMDogTUlfRkxVU0gKKzB4MTIzMDAxODQ6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDAxODg6ICAgICAgMHgwMDAwN2FhMDogICAgVlMgc3RhdGUKKzB4MTIzMDAxOGM6ICAgICAgMHgwMDAwN2EyMTogICAgR1Mgc3RhdGUKKzB4MTIzMDAxOTA6ICAgICAgMHgwMDAwN2E2MTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDE5NDogICAgICAweDAwMDA3YWMwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDE5ODogICAgICAweDAwMDA3YjAwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDE5YzogICAgICAweDAwMDA3Y2MwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDFhMDogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDFhNDogICAgICAweDEyNDQ0MTAwOiAgICB2cyBmZW5jZTogMjU2LCBjbGlwX2ZlbmNlOiAyOTIsIGdzX2ZlbmNlOiAyNzIKKzB4MTIzMDAxYTg6ICAgICAgMHg0MDAwMDE4NDogICAgc2YgZmVuY2U6IDM4OCwgdmZlX2ZlbmNlOiAwLCBjc19mZW5jZTogMTAyNAorMHgxMjMwMDFhYzogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwMWIwOiAgICAgIDB4MDAwMDAwODI6ICAgIG9mZnNldDogMHgwMDAwMDA4MCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDAxYjQ6ICAgICAgMHg3YjAwMWMwNDogM0RQUklNSVRJVkU6IHF1YWQgbGlzdCBzZXF1ZW50aWFsCisweDEyMzAwMWI4OiAgICAgIDB4MDAwMDAwNTA6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDFiYzogICAgICAweDAwMDAwMDUyOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDAxYzA6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDAxYzQ6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDAxYzg6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDFjYzogICAgICAweDAyMDAwMDAwOiBNSV9GTFVTSAorMHgxMjMwMDFkMDogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDFkNDogICAgICAweDAwMDA3YWEwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDFkODogICAgICAweDAwMDA3YTAxOiAgICBHUyBzdGF0ZQorMHgxMjMwMDFkYzogICAgICAweDAwMDA3YTYxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwMWUwOiAgICAgIDB4MDAwMDdhYzA6ICAgIFNGIHN0YXRlCisweDEyMzAwMWU0OiAgICAgIDB4MDAwMDdiMDA6ICAgIFdNIHN0YXRlCisweDEyMzAwMWU4OiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwMWVjOiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwMWYwOiAgICAgIDB4MTI0NDQxMDA6ICAgIHZzIGZlbmNlOiAyNTYsIGNsaXBfZmVuY2U6IDI5MiwgZ3NfZmVuY2U6IDI3MgorMHgxMjMwMDFmNDogICAgICAweDQwMDAwMTg0OiAgICBzZiBmZW5jZTogMzg4LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAxMDI0CisweDEyMzAwMWY4OiAgICAgIDB4NjAwMjAxMDA6IENPTlNUQU5UX0JVRkZFUjogdmFsaWQKKzB4MTIzMDAxZmM6ICAgICAgMHgwMDAwMDE0MjogICAgb2Zmc2V0OiAweDAwMDAwMTQwLCBsZW5ndGg6IDE5MiBieXRlcworMHgxMjMwMDIwMDogICAgICAweDdiMDAyMDA0OiAzRFBSSU1JVElWRTogcXVhZCBzdHJpcCBzZXF1ZW50aWFsCisweDEyMzAwMjA0OiAgICAgIDB4MDAwMDAwNTI6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDIwODogICAgICAweDAwMDAwMGEyOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDAyMGM6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDAyMTA6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDAyMTQ6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDIxODogICAgICAweDAyMDAwMDAwOiBNSV9GTFVTSAorMHgxMjMwMDIxYzogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDIyMDogICAgICAweDAwMDA3YWEwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDIyNDogICAgICAweDAwMDA3OWUxOiAgICBHUyBzdGF0ZQorMHgxMjMwMDIyODogICAgICAweDAwMDA3YTYxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwMjJjOiAgICAgIDB4MDAwMDdhYzA6ICAgIFNGIHN0YXRlCisweDEyMzAwMjMwOiAgICAgIDB4MDAwMDdiMDA6ICAgIFdNIHN0YXRlCisweDEyMzAwMjM0OiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwMjM4OiAgICAgIDB4MDAwMDAwMDA6IE1JX05PT1AKKzB4MTIzMDAyM2M6ICAgICAgMHgwMDAwMDAwMDogTUlfTk9PUAorMHgxMjMwMDI0MDogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDI0NDogICAgICAweDEyNDQ0MTAwOiAgICB2cyBmZW5jZTogMjU2LCBjbGlwX2ZlbmNlOiAyOTIsIGdzX2ZlbmNlOiAyNzIKKzB4MTIzMDAyNDg6ICAgICAgMHg0MDAwMDE4NDogICAgc2YgZmVuY2U6IDM4OCwgdmZlX2ZlbmNlOiAwLCBjc19mZW5jZTogMTAyNAorMHgxMjMwMDI0YzogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwMjUwOiAgICAgIDB4MDAwMDAxNDI6ICAgIG9mZnNldDogMHgwMDAwMDE0MCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDAyNTQ6ICAgICAgMHg3YjAwMWMwNDogM0RQUklNSVRJVkU6IHF1YWQgbGlzdCBzZXF1ZW50aWFsCisweDEyMzAwMjU4OiAgICAgIDB4MDAwMDAwNTA6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDI1YzogICAgICAweDAwMDAwMGY0OiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDAyNjA6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDAyNjQ6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDAyNjg6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDI2YzogICAgICAweDAyMDAwMDAwOiBNSV9GTFVTSAorMHgxMjMwMDI3MDogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDI3NDogICAgICAweDAwMDA3YWEwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDI3ODogICAgICAweDAwMDA3OWMxOiAgICBHUyBzdGF0ZQorMHgxMjMwMDI3YzogICAgICAweDAwMDA3YTYxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwMjgwOiAgICAgIDB4MDAwMDdhYzA6ICAgIFNGIHN0YXRlCisweDEyMzAwMjg0OiAgICAgIDB4MDAwMDdiMDA6ICAgIFdNIHN0YXRlCisweDEyMzAwMjg4OiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwMjhjOiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwMjkwOiAgICAgIDB4MTI0NDQxMDA6ICAgIHZzIGZlbmNlOiAyNTYsIGNsaXBfZmVuY2U6IDI5MiwgZ3NfZmVuY2U6IDI3MgorMHgxMjMwMDI5NDogICAgICAweDQwMDAwMTg0OiAgICBzZiBmZW5jZTogMzg4LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAxMDI0CisweDEyMzAwMjk4OiAgICAgIDB4NjAwMjAxMDA6IENPTlNUQU5UX0JVRkZFUjogdmFsaWQKKzB4MTIzMDAyOWM6ICAgICAgMHgwMDAwMDE0MjogICAgb2Zmc2V0OiAweDAwMDAwMTQwLCBsZW5ndGg6IDE5MiBieXRlcworMHgxMjMwMDJhMDogICAgICAweDAyMDAwMDAwOiBNSV9GTFVTSAorMHgxMjMwMDJhNDogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDJhODogICAgICAweDAwMDA3OWEwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDJhYzogICAgICAweDAwMDA3OWMxOiAgICBHUyBzdGF0ZQorMHgxMjMwMDJiMDogICAgICAweDAwMDA3YTYxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwMmI0OiAgICAgIDB4MDAwMDdhYzA6ICAgIFNGIHN0YXRlCisweDEyMzAwMmI4OiAgICAgIDB4MDAwMDdiMDA6ICAgIFdNIHN0YXRlCisweDEyMzAwMmJjOiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwMmMwOiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwMmM0OiAgICAgIDB4MTI0NDQxMDA6ICAgIHZzIGZlbmNlOiAyNTYsIGNsaXBfZmVuY2U6IDI5MiwgZ3NfZmVuY2U6IDI3MgorMHgxMjMwMDJjODogICAgICAweDQwMDAwMTg0OiAgICBzZiBmZW5jZTogMzg4LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAxMDI0CisweDEyMzAwMmNjOiAgICAgIDB4NzgwODAwMDM6IDNEU1RBVEVfVkVSVEVYX0JVRkZFUlMKKzB4MTIzMDAyZDA6ICAgICAgMHgwMDAwMDAxODogICAgYnVmZmVyIDA6IHNlcXVlbnRpYWwsIHBpdGNoIDI0YgorMHgxMjMwMDJkNDogICAgICAweDAwMDAwZjQ4OiAgICBidWZmZXIgYWRkcmVzcworMHgxMjMwMDJkODogICAgICAweDAwMDA3ZmZmOiAgICBtYXggaW5kZXgKKzB4MTIzMDAyZGM6ICAgICAgMHgwMDAwMDAwMDogICAgbWJ6CisweDEyMzAwMmUwOiAgICAgIDB4NzgwOTAwMDM6IDNEU1RBVEVfVkVSVEVYX0VMRU1FTlRTCisweDEyMzAwMmU0OiAgICAgIDB4MDQ0MDAwMDA6ICAgIGJ1ZmZlciAwOiB2YWxpZCwgdHlwZSAweDAwNDAsIHNyYyBvZmZzZXQgMHgwMDAwIGJ5dGVzCisweDEyMzAwMmU4OiAgICAgIDB4MTExMzAwMDA6ICAgIChYLCBZLCBaLCAxLjApLCBkc3Qgb2Zmc2V0IDB4MDAgYnl0ZXMKKzB4MTIzMDAyZWM6ICAgICAgMHgwNDQwMDAwYzogICAgYnVmZmVyIDA6IHZhbGlkLCB0eXBlIDB4MDA0MCwgc3JjIG9mZnNldCAweDAwMGMgYnl0ZXMKKzB4MTIzMDAyZjA6ICAgICAgMHgxMTEzMDAwMDogICAgKFgsIFksIFosIDEuMCksIGRzdCBvZmZzZXQgMHgwMCBieXRlcworMHgxMjMwMDJmNDogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwMmY4OiAgICAgIDB4MDAwMDAyMDI6ICAgIG9mZnNldDogMHgwMDAwMDIwMCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDAyZmM6ICAgICAgMHg3YjAwMjAwNDogM0RQUklNSVRJVkU6IHF1YWQgc3RyaXAgc2VxdWVudGlhbAorMHgxMjMwMDMwMDogICAgICAweDAwMDAwMGEyOiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDAzMDQ6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgdmVydGV4CisweDEyMzAwMzA4OiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwMzBjOiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwMzEwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDAzMTQ6ICAgICAgMHgwMjAwMDAwMDogTUlfRkxVU0gKKzB4MTIzMDAzMTg6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDAzMWM6ICAgICAgMHgwMDAwNzlhMDogICAgVlMgc3RhdGUKKzB4MTIzMDAzMjA6ICAgICAgMHgwMDAwMDAwMDogICAgR1Mgc3RhdGUKKzB4MTIzMDAzMjQ6ICAgICAgMHgwMDAwNzkwMTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDMyODogICAgICAweDAwMDA3OTQwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDMyYzogICAgICAweDAwMDA3OTYwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDMzMDogICAgICAweDAwMDA3Y2MwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDMzNDogICAgICAweDAwMDAwMDAwOiBNSV9OT09QCisweDEyMzAwMzM4OiAgICAgIDB4MDAwMDAwMDA6IE1JX05PT1AKKzB4MTIzMDAzM2M6ICAgICAgMHgwMDAwMDAwMDogTUlfTk9PUAorMHgxMjMwMDM0MDogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDM0NDogICAgICAweDEyNDQ0MTAwOiAgICB2cyBmZW5jZTogMjU2LCBjbGlwX2ZlbmNlOiAyOTIsIGdzX2ZlbmNlOiAyNzIKKzB4MTIzMDAzNDg6ICAgICAgMHg0MDAwMDE4NDogICAgc2YgZmVuY2U6IDM4OCwgdmZlX2ZlbmNlOiAwLCBjc19mZW5jZTogMTAyNAorMHgxMjMwMDM0YzogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwMzUwOiAgICAgIDB4MDAwMDAyMDI6ICAgIG9mZnNldDogMHgwMDAwMDIwMCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDAzNTQ6ICAgICAgMHg3YjAwMTQwNDogM0RQUklNSVRJVkU6IHRyaSBzdHJpcCBzZXF1ZW50aWFsCisweDEyMzAwMzU4OiAgICAgIDB4MDAwMDAwMmE6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDM1YzogICAgICAweDAwMDAwMGEyOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDAzNjA6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDAzNjQ6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDAzNjg6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDM2YzogICAgICAweDAyMDAwMDAwOiBNSV9GTFVTSAorMHgxMjMwMDM3MDogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDM3NDogICAgICAweDAwMDA3ODYwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDM3ODogICAgICAweDAwMDA3ODAxOiAgICBHUyBzdGF0ZQorMHgxMjMwMDM3YzogICAgICAweDAwMDA3ODIxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwMzgwOiAgICAgIDB4MDAwMDc4ODA6ICAgIFNGIHN0YXRlCisweDEyMzAwMzg0OiAgICAgIDB4MDAwMDc4YTA6ICAgIFdNIHN0YXRlCisweDEyMzAwMzg4OiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwMzhjOiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwMzkwOiAgICAgIDB4MTI0NDQxMDA6ICAgIHZzIGZlbmNlOiAyNTYsIGNsaXBfZmVuY2U6IDI5MiwgZ3NfZmVuY2U6IDI3MgorMHgxMjMwMDM5NDogICAgICAweDQwMDAwMTg0OiAgICBzZiBmZW5jZTogMzg4LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAxMDI0CisweDEyMzAwMzk4OiAgICAgIDB4NzgwODAwMDM6IDNEU1RBVEVfVkVSVEVYX0JVRkZFUlMKKzB4MTIzMDAzOWM6ICAgICAgMHgwMDAwMDAwYzogICAgYnVmZmVyIDA6IHNlcXVlbnRpYWwsIHBpdGNoIDEyYgorMHgxMjMwMDNhMDogICAgICAweDAwMDAyMjY4OiAgICBidWZmZXIgYWRkcmVzcworMHgxMjMwMDNhNDogICAgICAweDAwMDA3ZmZmOiAgICBtYXggaW5kZXgKKzB4MTIzMDAzYTg6ICAgICAgMHgwMDAwMDAwMDogICAgbWJ6CisweDEyMzAwM2FjOiAgICAgIDB4NzgwOTAwMDE6IDNEU1RBVEVfVkVSVEVYX0VMRU1FTlRTCisweDEyMzAwM2IwOiAgICAgIDB4MDQ0MDAwMDA6ICAgIGJ1ZmZlciAwOiB2YWxpZCwgdHlwZSAweDAwNDAsIHNyYyBvZmZzZXQgMHgwMDAwIGJ5dGVzCisweDEyMzAwM2I0OiAgICAgIDB4MTExMzAwMDA6ICAgIChYLCBZLCBaLCAxLjApLCBkc3Qgb2Zmc2V0IDB4MDAgYnl0ZXMKKzB4MTIzMDAzYjg6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDNiYzogICAgICAweDAwMDAwMmMyOiAgICBvZmZzZXQ6IDB4MDAwMDAyYzAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwM2MwOiAgICAgIDB4N2IwMDIwMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIHN0cmlwIHNlcXVlbnRpYWwKKzB4MTIzMDAzYzQ6ICAgICAgMHgwMDAwMDAyYTogICAgdmVydGV4IGNvdW50CisweDEyMzAwM2M4OiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDNjYzogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDNkMDogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDNkNDogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwM2Q4OiAgICAgIDB4MDIwMDAwMDA6IE1JX0ZMVVNICisweDEyMzAwM2RjOiAgICAgIDB4NzgwMDAwMDU6IDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTCisweDEyMzAwM2UwOiAgICAgIDB4MDAwMDc4NjA6ICAgIFZTIHN0YXRlCisweDEyMzAwM2U0OiAgICAgIDB4MDAwMDc3ZTE6ICAgIEdTIHN0YXRlCisweDEyMzAwM2U4OiAgICAgIDB4MDAwMDc4MjE6ICAgIENsaXAgc3RhdGUKKzB4MTIzMDAzZWM6ICAgICAgMHgwMDAwNzg4MDogICAgU0Ygc3RhdGUKKzB4MTIzMDAzZjA6ICAgICAgMHgwMDAwNzhhMDogICAgV00gc3RhdGUKKzB4MTIzMDAzZjQ6ICAgICAgMHgwMDAwN2NjMDogICAgQ0Mgc3RhdGUKKzB4MTIzMDAzZjg6ICAgICAgMHgwMDAwMDAwMDogTUlfTk9PUAorMHgxMjMwMDNmYzogICAgICAweDAwMDAwMDAwOiBNSV9OT09QCisweDEyMzAwNDAwOiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwNDA0OiAgICAgIDB4MTI0NDQxMDA6ICAgIHZzIGZlbmNlOiAyNTYsIGNsaXBfZmVuY2U6IDI5MiwgZ3NfZmVuY2U6IDI3MgorMHgxMjMwMDQwODogICAgICAweDQwMDAwMTg0OiAgICBzZiBmZW5jZTogMzg4LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAxMDI0CisweDEyMzAwNDBjOiAgICAgIDB4NjAwMjAxMDA6IENPTlNUQU5UX0JVRkZFUjogdmFsaWQKKzB4MTIzMDA0MTA6ICAgICAgMHgwMDAwMDJjMjogICAgb2Zmc2V0OiAweDAwMDAwMmMwLCBsZW5ndGg6IDE5MiBieXRlcworMHgxMjMwMDQxNDogICAgICAweDdiMDAxYzA0OiAzRFBSSU1JVElWRTogcXVhZCBsaXN0IHNlcXVlbnRpYWwKKzB4MTIzMDA0MTg6ICAgICAgMHgwMDAwMDAyODogICAgdmVydGV4IGNvdW50CisweDEyMzAwNDFjOiAgICAgIDB4MDAwMDAwMmE6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDQyMDogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDQyNDogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDQyODogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwNDJjOiAgICAgIDB4MDIwMDAwMDA6IE1JX0ZMVVNICisweDEyMzAwNDMwOiAgICAgIDB4NzgwMDAwMDU6IDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTCisweDEyMzAwNDM0OiAgICAgIDB4MDAwMDc4NjA6ICAgIFZTIHN0YXRlCisweDEyMzAwNDM4OiAgICAgIDB4MDAwMDc3YzE6ICAgIEdTIHN0YXRlCisweDEyMzAwNDNjOiAgICAgIDB4MDAwMDc4MjE6ICAgIENsaXAgc3RhdGUKKzB4MTIzMDA0NDA6ICAgICAgMHgwMDAwNzg4MDogICAgU0Ygc3RhdGUKKzB4MTIzMDA0NDQ6ICAgICAgMHgwMDAwNzhhMDogICAgV00gc3RhdGUKKzB4MTIzMDA0NDg6ICAgICAgMHgwMDAwN2NjMDogICAgQ0Mgc3RhdGUKKzB4MTIzMDA0NGM6ICAgICAgMHg2MDAwM2YwMTogVVJCX0ZFTkNFOiBjcyB2ZmUgc2YgY2xpcCBncyB2cyAKKzB4MTIzMDA0NTA6ICAgICAgMHgxMjQ0NDEwMDogICAgdnMgZmVuY2U6IDI1NiwgY2xpcF9mZW5jZTogMjkyLCBnc19mZW5jZTogMjcyCisweDEyMzAwNDU0OiAgICAgIDB4NDAwMDAxODQ6ICAgIHNmIGZlbmNlOiAzODgsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDEwMjQKKzB4MTIzMDA0NTg6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDQ1YzogICAgICAweDAwMDAwMzgyOiAgICBvZmZzZXQ6IDB4MDAwMDAzODAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwNDYwOiAgICAgIDB4N2IwMDIwMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIHN0cmlwIHNlcXVlbnRpYWwKKzB4MTIzMDA0NjQ6ICAgICAgMHgwMDAwMDAyYTogICAgdmVydGV4IGNvdW50CisweDEyMzAwNDY4OiAgICAgIDB4MDAwMDAwNTI6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDQ2YzogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDQ3MDogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDQ3NDogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwNDc4OiAgICAgIDB4MDIwMDAwMDA6IE1JX0ZMVVNICisweDEyMzAwNDdjOiAgICAgIDB4NzgwMDAwMDU6IDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTCisweDEyMzAwNDgwOiAgICAgIDB4MDAwMDc4NjA6ICAgIFZTIHN0YXRlCisweDEyMzAwNDg0OiAgICAgIDB4MDAwMDc3YTE6ICAgIEdTIHN0YXRlCisweDEyMzAwNDg4OiAgICAgIDB4MDAwMDc4MjE6ICAgIENsaXAgc3RhdGUKKzB4MTIzMDA0OGM6ICAgICAgMHgwMDAwNzg4MDogICAgU0Ygc3RhdGUKKzB4MTIzMDA0OTA6ICAgICAgMHgwMDAwNzhhMDogICAgV00gc3RhdGUKKzB4MTIzMDA0OTQ6ICAgICAgMHgwMDAwN2NjMDogICAgQ0Mgc3RhdGUKKzB4MTIzMDA0OTg6ICAgICAgMHg2MDAwM2YwMTogVVJCX0ZFTkNFOiBjcyB2ZmUgc2YgY2xpcCBncyB2cyAKKzB4MTIzMDA0OWM6ICAgICAgMHgxMjQ0NDEwMDogICAgdnMgZmVuY2U6IDI1NiwgY2xpcF9mZW5jZTogMjkyLCBnc19mZW5jZTogMjcyCisweDEyMzAwNGEwOiAgICAgIDB4NDAwMDAxODQ6ICAgIHNmIGZlbmNlOiAzODgsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDEwMjQKKzB4MTIzMDA0YTQ6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDRhODogICAgICAweDAwMDAwMzgyOiAgICBvZmZzZXQ6IDB4MDAwMDAzODAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwNGFjOiAgICAgIDB4N2IwMDFjMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIGxpc3Qgc2VxdWVudGlhbAorMHgxMjMwMDRiMDogICAgICAweDAwMDAwMDI4OiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDA0YjQ6ICAgICAgMHgwMDAwMDA3YzogICAgc3RhcnQgdmVydGV4CisweDEyMzAwNGI4OiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwNGJjOiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwNGMwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDA0YzQ6ICAgICAgMHgwMjAwMDAwMDogTUlfRkxVU0gKKzB4MTIzMDA0Yzg6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDA0Y2M6ICAgICAgMHgwMDAwNzg2MDogICAgVlMgc3RhdGUKKzB4MTIzMDA0ZDA6ICAgICAgMHgwMDAwNzc4MTogICAgR1Mgc3RhdGUKKzB4MTIzMDA0ZDQ6ICAgICAgMHgwMDAwNzgyMTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDRkODogICAgICAweDAwMDA3ODgwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDRkYzogICAgICAweDAwMDA3OGEwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDRlMDogICAgICAweDAwMDA3Y2MwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDRlNDogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDRlODogICAgICAweDEyNDQ0MTAwOiAgICB2cyBmZW5jZTogMjU2LCBjbGlwX2ZlbmNlOiAyOTIsIGdzX2ZlbmNlOiAyNzIKKzB4MTIzMDA0ZWM6ICAgICAgMHg0MDAwMDE4NDogICAgc2YgZmVuY2U6IDM4OCwgdmZlX2ZlbmNlOiAwLCBjc19mZW5jZTogMTAyNAorMHgxMjMwMDRmMDogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwNGY0OiAgICAgIDB4MDAwMDAzODI6ICAgIG9mZnNldDogMHgwMDAwMDM4MCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDA0Zjg6ICAgICAgMHgwMjAwMDAwMDogTUlfRkxVU0gKKzB4MTIzMDA0ZmM6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDA1MDA6ICAgICAgMHgwMDAwNzc2MDogICAgVlMgc3RhdGUKKzB4MTIzMDA1MDQ6ICAgICAgMHgwMDAwNzc4MTogICAgR1Mgc3RhdGUKKzB4MTIzMDA1MDg6ICAgICAgMHgwMDAwNzgyMTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDUwYzogICAgICAweDAwMDA3ODgwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDUxMDogICAgICAweDAwMDA3OGEwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDUxNDogICAgICAweDAwMDA3Y2MwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDUxODogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDUxYzogICAgICAweDEyNDQ0MTAwOiAgICB2cyBmZW5jZTogMjU2LCBjbGlwX2ZlbmNlOiAyOTIsIGdzX2ZlbmNlOiAyNzIKKzB4MTIzMDA1MjA6ICAgICAgMHg0MDAwMDE4NDogICAgc2YgZmVuY2U6IDM4OCwgdmZlX2ZlbmNlOiAwLCBjc19mZW5jZTogMTAyNAorMHgxMjMwMDUyNDogICAgICAweDc4MDgwMDAzOiAzRFNUQVRFX1ZFUlRFWF9CVUZGRVJTCisweDEyMzAwNTI4OiAgICAgIDB4MDAwMDAwMTg6ICAgIGJ1ZmZlciAwOiBzZXF1ZW50aWFsLCBwaXRjaCAyNGIKKzB4MTIzMDA1MmM6ICAgICAgMHgwMDAwMmEzMDogICAgYnVmZmVyIGFkZHJlc3MKKzB4MTIzMDA1MzA6ICAgICAgMHgwMDAwN2ZmZjogICAgbWF4IGluZGV4CisweDEyMzAwNTM0OiAgICAgIDB4MDAwMDAwMDA6ICAgIG1iegorMHgxMjMwMDUzODogICAgICAweDc4MDkwMDAzOiAzRFNUQVRFX1ZFUlRFWF9FTEVNRU5UUworMHgxMjMwMDUzYzogICAgICAweDA0NDAwMDAwOiAgICBidWZmZXIgMDogdmFsaWQsIHR5cGUgMHgwMDQwLCBzcmMgb2Zmc2V0IDB4MDAwMCBieXRlcworMHgxMjMwMDU0MDogICAgICAweDExMTMwMDAwOiAgICAoWCwgWSwgWiwgMS4wKSwgZHN0IG9mZnNldCAweDAwIGJ5dGVzCisweDEyMzAwNTQ0OiAgICAgIDB4MDQ0MDAwMGM6ICAgIGJ1ZmZlciAwOiB2YWxpZCwgdHlwZSAweDAwNDAsIHNyYyBvZmZzZXQgMHgwMDBjIGJ5dGVzCisweDEyMzAwNTQ4OiAgICAgIDB4MTExMzAwMDA6ICAgIChYLCBZLCBaLCAxLjApLCBkc3Qgb2Zmc2V0IDB4MDAgYnl0ZXMKKzB4MTIzMDA1NGM6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDU1MDogICAgICAweDAwMDAwNDQyOiAgICBvZmZzZXQ6IDB4MDAwMDA0NDAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwNTU0OiAgICAgIDB4N2IwMDIwMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIHN0cmlwIHNlcXVlbnRpYWwKKzB4MTIzMDA1NTg6ICAgICAgMHgwMDAwMDA1MjogICAgdmVydGV4IGNvdW50CisweDEyMzAwNTVjOiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDU2MDogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDU2NDogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDU2ODogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwNTZjOiAgICAgIDB4MDIwMDAwMDA6IE1JX0ZMVVNICisweDEyMzAwNTcwOiAgICAgIDB4NzgwMDAwMDU6IDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTCisweDEyMzAwNTc0OiAgICAgIDB4MDAwMDc3NjA6ICAgIFZTIHN0YXRlCisweDEyMzAwNTc4OiAgICAgIDB4MDAwMDAwMDA6ICAgIEdTIHN0YXRlCisweDEyMzAwNTdjOiAgICAgIDB4MDAwMDc2YzE6ICAgIENsaXAgc3RhdGUKKzB4MTIzMDA1ODA6ICAgICAgMHgwMDAwNzcwMDogICAgU0Ygc3RhdGUKKzB4MTIzMDA1ODQ6ICAgICAgMHgwMDAwNzcyMDogICAgV00gc3RhdGUKKzB4MTIzMDA1ODg6ICAgICAgMHgwMDAwN2NjMDogICAgQ0Mgc3RhdGUKKzB4MTIzMDA1OGM6ICAgICAgMHg2MDAwM2YwMTogVVJCX0ZFTkNFOiBjcyB2ZmUgc2YgY2xpcCBncyB2cyAKKzB4MTIzMDA1OTA6ICAgICAgMHgxMjQ0NDEwMDogICAgdnMgZmVuY2U6IDI1NiwgY2xpcF9mZW5jZTogMjkyLCBnc19mZW5jZTogMjcyCisweDEyMzAwNTk0OiAgICAgIDB4NDAwMDAxODQ6ICAgIHNmIGZlbmNlOiAzODgsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDEwMjQKKzB4MTIzMDA1OTg6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDU5YzogICAgICAweDAwMDAwNDQyOiAgICBvZmZzZXQ6IDB4MDAwMDA0NDAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwNWEwOiAgICAgIDB4N2IwMDE0MDQ6IDNEUFJJTUlUSVZFOiB0cmkgc3RyaXAgc2VxdWVudGlhbAorMHgxMjMwMDVhNDogICAgICAweDAwMDAwMDE2OiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDA1YTg6ICAgICAgMHgwMDAwMDA1MjogICAgc3RhcnQgdmVydGV4CisweDEyMzAwNWFjOiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwNWIwOiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwNWI0OiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDA1Yjg6ICAgICAgMHgwMjAwMDAwMDogTUlfRkxVU0gKKzB4MTIzMDA1YmM6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDA1YzA6ICAgICAgMHgwMDAwNzYyMDogICAgVlMgc3RhdGUKKzB4MTIzMDA1YzQ6ICAgICAgMHgwMDAwNzVjMTogICAgR1Mgc3RhdGUKKzB4MTIzMDA1Yzg6ICAgICAgMHgwMDAwNzVlMTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDVjYzogICAgICAweDAwMDA3NjQwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDVkMDogICAgICAweDAwMDA3NjYwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDVkNDogICAgICAweDAwMDA3Y2MwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDVkODogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDVkYzogICAgICAweDEyNDQ0MTAwOiAgICB2cyBmZW5jZTogMjU2LCBjbGlwX2ZlbmNlOiAyOTIsIGdzX2ZlbmNlOiAyNzIKKzB4MTIzMDA1ZTA6ICAgICAgMHg0MDAwMDE4NDogICAgc2YgZmVuY2U6IDM4OCwgdmZlX2ZlbmNlOiAwLCBjc19mZW5jZTogMTAyNAorMHgxMjMwMDVlNDogICAgICAweDc4MDgwMDAzOiAzRFNUQVRFX1ZFUlRFWF9CVUZGRVJTCisweDEyMzAwNWU4OiAgICAgIDB4MDAwMDAwMGM6ICAgIGJ1ZmZlciAwOiBzZXF1ZW50aWFsLCBwaXRjaCAxMmIKKzB4MTIzMDA1ZWM6ICAgICAgMHgwMDAwMzNmMDogICAgYnVmZmVyIGFkZHJlc3MKKzB4MTIzMDA1ZjA6ICAgICAgMHgwMDAwN2ZmZjogICAgbWF4IGluZGV4CisweDEyMzAwNWY0OiAgICAgIDB4MDAwMDAwMDA6ICAgIG1iegorMHgxMjMwMDVmODogICAgICAweDc4MDkwMDAxOiAzRFNUQVRFX1ZFUlRFWF9FTEVNRU5UUworMHgxMjMwMDVmYzogICAgICAweDA0NDAwMDAwOiAgICBidWZmZXIgMDogdmFsaWQsIHR5cGUgMHgwMDQwLCBzcmMgb2Zmc2V0IDB4MDAwMCBieXRlcworMHgxMjMwMDYwMDogICAgICAweDExMTMwMDAwOiAgICAoWCwgWSwgWiwgMS4wKSwgZHN0IG9mZnNldCAweDAwIGJ5dGVzCisweDEyMzAwNjA0OiAgICAgIDB4NjAwMjAxMDA6IENPTlNUQU5UX0JVRkZFUjogdmFsaWQKKzB4MTIzMDA2MDg6ICAgICAgMHgwMDAwMDUwMjogICAgb2Zmc2V0OiAweDAwMDAwNTAwLCBsZW5ndGg6IDE5MiBieXRlcworMHgxMjMwMDYwYzogICAgICAweDdiMDAyMDA0OiAzRFBSSU1JVElWRTogcXVhZCBzdHJpcCBzZXF1ZW50aWFsCisweDEyMzAwNjEwOiAgICAgIDB4MDAwMDAwMmE6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDYxNDogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDA2MTg6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDA2MWM6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDA2MjA6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDYyNDogICAgICAweDAyMDAwMDAwOiBNSV9GTFVTSAorMHgxMjMwMDYyODogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDYyYzogICAgICAweDAwMDA3NjIwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDYzMDogICAgICAweDAwMDA3NWExOiAgICBHUyBzdGF0ZQorMHgxMjMwMDYzNDogICAgICAweDAwMDA3NWUxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwNjM4OiAgICAgIDB4MDAwMDc2NDA6ICAgIFNGIHN0YXRlCisweDEyMzAwNjNjOiAgICAgIDB4MDAwMDc2NjA6ICAgIFdNIHN0YXRlCisweDEyMzAwNjQwOiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwNjQ0OiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwNjQ4OiAgICAgIDB4MTI0NDQxMDA6ICAgIHZzIGZlbmNlOiAyNTYsIGNsaXBfZmVuY2U6IDI5MiwgZ3NfZmVuY2U6IDI3MgorMHgxMjMwMDY0YzogICAgICAweDQwMDAwMTg0OiAgICBzZiBmZW5jZTogMzg4LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAxMDI0CisweDEyMzAwNjUwOiAgICAgIDB4NjAwMjAxMDA6IENPTlNUQU5UX0JVRkZFUjogdmFsaWQKKzB4MTIzMDA2NTQ6ICAgICAgMHgwMDAwMDUwMjogICAgb2Zmc2V0OiAweDAwMDAwNTAwLCBsZW5ndGg6IDE5MiBieXRlcworMHgxMjMwMDY1ODogICAgICAweDdiMDAxYzA0OiAzRFBSSU1JVElWRTogcXVhZCBsaXN0IHNlcXVlbnRpYWwKKzB4MTIzMDA2NWM6ICAgICAgMHgwMDAwMDAyODogICAgdmVydGV4IGNvdW50CisweDEyMzAwNjYwOiAgICAgIDB4MDAwMDAwMmE6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDY2NDogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDY2ODogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDY2YzogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwNjcwOiAgICAgIDB4MDIwMDAwMDA6IE1JX0ZMVVNICisweDEyMzAwNjc0OiAgICAgIDB4NzgwMDAwMDU6IDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTCisweDEyMzAwNjc4OiAgICAgIDB4MDAwMDc2MjA6ICAgIFZTIHN0YXRlCisweDEyMzAwNjdjOiAgICAgIDB4MDAwMDc1ODE6ICAgIEdTIHN0YXRlCisweDEyMzAwNjgwOiAgICAgIDB4MDAwMDc1ZTE6ICAgIENsaXAgc3RhdGUKKzB4MTIzMDA2ODQ6ICAgICAgMHgwMDAwNzY0MDogICAgU0Ygc3RhdGUKKzB4MTIzMDA2ODg6ICAgICAgMHgwMDAwNzY2MDogICAgV00gc3RhdGUKKzB4MTIzMDA2OGM6ICAgICAgMHgwMDAwN2NjMDogICAgQ0Mgc3RhdGUKKzB4MTIzMDA2OTA6ICAgICAgMHg2MDAwM2YwMTogVVJCX0ZFTkNFOiBjcyB2ZmUgc2YgY2xpcCBncyB2cyAKKzB4MTIzMDA2OTQ6ICAgICAgMHgxMjQ0NDEwMDogICAgdnMgZmVuY2U6IDI1NiwgY2xpcF9mZW5jZTogMjkyLCBnc19mZW5jZTogMjcyCisweDEyMzAwNjk4OiAgICAgIDB4NDAwMDAxODQ6ICAgIHNmIGZlbmNlOiAzODgsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDEwMjQKKzB4MTIzMDA2OWM6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDZhMDogICAgICAweDAwMDAwNWMyOiAgICBvZmZzZXQ6IDB4MDAwMDA1YzAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwNmE0OiAgICAgIDB4N2IwMDIwMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIHN0cmlwIHNlcXVlbnRpYWwKKzB4MTIzMDA2YTg6ICAgICAgMHgwMDAwMDAyYTogICAgdmVydGV4IGNvdW50CisweDEyMzAwNmFjOiAgICAgIDB4MDAwMDAwNTI6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDZiMDogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDZiNDogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDZiODogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwNmJjOiAgICAgIDB4MDIwMDAwMDA6IE1JX0ZMVVNICisweDEyMzAwNmMwOiAgICAgIDB4NzgwMDAwMDU6IDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTCisweDEyMzAwNmM0OiAgICAgIDB4MDAwMDc2MjA6ICAgIFZTIHN0YXRlCisweDEyMzAwNmM4OiAgICAgIDB4MDAwMDc1NjE6ICAgIEdTIHN0YXRlCisweDEyMzAwNmNjOiAgICAgIDB4MDAwMDc1ZTE6ICAgIENsaXAgc3RhdGUKKzB4MTIzMDA2ZDA6ICAgICAgMHgwMDAwNzY0MDogICAgU0Ygc3RhdGUKKzB4MTIzMDA2ZDQ6ICAgICAgMHgwMDAwNzY2MDogICAgV00gc3RhdGUKKzB4MTIzMDA2ZDg6ICAgICAgMHgwMDAwN2NjMDogICAgQ0Mgc3RhdGUKKzB4MTIzMDA2ZGM6ICAgICAgMHg2MDAwM2YwMTogVVJCX0ZFTkNFOiBjcyB2ZmUgc2YgY2xpcCBncyB2cyAKKzB4MTIzMDA2ZTA6ICAgICAgMHgxMjQ0NDEwMDogICAgdnMgZmVuY2U6IDI1NiwgY2xpcF9mZW5jZTogMjkyLCBnc19mZW5jZTogMjcyCisweDEyMzAwNmU0OiAgICAgIDB4NDAwMDAxODQ6ICAgIHNmIGZlbmNlOiAzODgsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDEwMjQKKzB4MTIzMDA2ZTg6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDZlYzogICAgICAweDAwMDAwNWMyOiAgICBvZmZzZXQ6IDB4MDAwMDA1YzAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwNmYwOiAgICAgIDB4N2IwMDFjMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIGxpc3Qgc2VxdWVudGlhbAorMHgxMjMwMDZmNDogICAgICAweDAwMDAwMDI4OiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDA2Zjg6ICAgICAgMHgwMDAwMDA3YzogICAgc3RhcnQgdmVydGV4CisweDEyMzAwNmZjOiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwNzAwOiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwNzA0OiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDA3MDg6ICAgICAgMHgwMjAwMDAwMDogTUlfRkxVU0gKKzB4MTIzMDA3MGM6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDA3MTA6ICAgICAgMHgwMDAwNzYyMDogICAgVlMgc3RhdGUKKzB4MTIzMDA3MTQ6ICAgICAgMHgwMDAwNzU0MTogICAgR1Mgc3RhdGUKKzB4MTIzMDA3MTg6ICAgICAgMHgwMDAwNzVlMTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDcxYzogICAgICAweDAwMDA3NjQwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDcyMDogICAgICAweDAwMDA3NjYwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDcyNDogICAgICAweDAwMDA3Y2MwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDcyODogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDcyYzogICAgICAweDEyNDQ0MTAwOiAgICB2cyBmZW5jZTogMjU2LCBjbGlwX2ZlbmNlOiAyOTIsIGdzX2ZlbmNlOiAyNzIKKzB4MTIzMDA3MzA6ICAgICAgMHg0MDAwMDE4NDogICAgc2YgZmVuY2U6IDM4OCwgdmZlX2ZlbmNlOiAwLCBjc19mZW5jZTogMTAyNAorMHgxMjMwMDczNDogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwNzM4OiAgICAgIDB4MDAwMDA1YzI6ICAgIG9mZnNldDogMHgwMDAwMDVjMCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDA3M2M6ICAgICAgMHgwMjAwMDAwMDogTUlfRkxVU0gKKzB4MTIzMDA3NDA6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDA3NDQ6ICAgICAgMHgwMDAwNzUyMDogICAgVlMgc3RhdGUKKzB4MTIzMDA3NDg6ICAgICAgMHgwMDAwNzU0MTogICAgR1Mgc3RhdGUKKzB4MTIzMDA3NGM6ICAgICAgMHgwMDAwNzVlMTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDc1MDogICAgICAweDAwMDA3NjQwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDc1NDogICAgICAweDAwMDA3NjYwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDc1ODogICAgICAweDAwMDA3Y2MwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDc1YzogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDc2MDogICAgICAweDEyNDQ0MTAwOiAgICB2cyBmZW5jZTogMjU2LCBjbGlwX2ZlbmNlOiAyOTIsIGdzX2ZlbmNlOiAyNzIKKzB4MTIzMDA3NjQ6ICAgICAgMHg0MDAwMDE4NDogICAgc2YgZmVuY2U6IDM4OCwgdmZlX2ZlbmNlOiAwLCBjc19mZW5jZTogMTAyNAorMHgxMjMwMDc2ODogICAgICAweDc4MDgwMDAzOiAzRFNUQVRFX1ZFUlRFWF9CVUZGRVJTCisweDEyMzAwNzZjOiAgICAgIDB4MDAwMDAwMTg6ICAgIGJ1ZmZlciAwOiBzZXF1ZW50aWFsLCBwaXRjaCAyNGIKKzB4MTIzMDA3NzA6ICAgICAgMHgwMDAwM2JiODogICAgYnVmZmVyIGFkZHJlc3MKKzB4MTIzMDA3NzQ6ICAgICAgMHgwMDAwN2ZmZjogICAgbWF4IGluZGV4CisweDEyMzAwNzc4OiAgICAgIDB4MDAwMDAwMDA6ICAgIG1iegorMHgxMjMwMDc3YzogICAgICAweDc4MDkwMDAzOiAzRFNUQVRFX1ZFUlRFWF9FTEVNRU5UUworMHgxMjMwMDc4MDogICAgICAweDA0NDAwMDAwOiAgICBidWZmZXIgMDogdmFsaWQsIHR5cGUgMHgwMDQwLCBzcmMgb2Zmc2V0IDB4MDAwMCBieXRlcworMHgxMjMwMDc4NDogICAgICAweDExMTMwMDAwOiAgICAoWCwgWSwgWiwgMS4wKSwgZHN0IG9mZnNldCAweDAwIGJ5dGVzCisweDEyMzAwNzg4OiAgICAgIDB4MDQ0MDAwMGM6ICAgIGJ1ZmZlciAwOiB2YWxpZCwgdHlwZSAweDAwNDAsIHNyYyBvZmZzZXQgMHgwMDBjIGJ5dGVzCisweDEyMzAwNzhjOiAgICAgIDB4MTExMzAwMDA6ICAgIChYLCBZLCBaLCAxLjApLCBkc3Qgb2Zmc2V0IDB4MDAgYnl0ZXMKKzB4MTIzMDA3OTA6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDc5NDogICAgICAweDAwMDAwNjgyOiAgICBvZmZzZXQ6IDB4MDAwMDA2ODAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwNzk4OiAgICAgIDB4N2IwMDIwMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIHN0cmlwIHNlcXVlbnRpYWwKKzB4MTIzMDA3OWM6ICAgICAgMHgwMDAwMDA1MjogICAgdmVydGV4IGNvdW50CisweDEyMzAwN2EwOiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDdhNDogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDdhODogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDdhYzogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwN2IwOiAgICAgIDB4MDIwMDAwMDA6IE1JX0ZMVVNICisweDEyMzAwN2I0OiAgICAgIDB4NzgwMDAwMDU6IDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTCisweDEyMzAwN2I4OiAgICAgIDB4MDAwMDc1MjA6ICAgIFZTIHN0YXRlCisweDEyMzAwN2JjOiAgICAgIDB4MDAwMDAwMDA6ICAgIEdTIHN0YXRlCisweDEyMzAwN2MwOiAgICAgIDB4MDAwMDc0ODE6ICAgIENsaXAgc3RhdGUKKzB4MTIzMDA3YzQ6ICAgICAgMHgwMDAwNzRjMDogICAgU0Ygc3RhdGUKKzB4MTIzMDA3Yzg6ICAgICAgMHgwMDAwNzRlMDogICAgV00gc3RhdGUKKzB4MTIzMDA3Y2M6ICAgICAgMHgwMDAwN2NjMDogICAgQ0Mgc3RhdGUKKzB4MTIzMDA3ZDA6ICAgICAgMHg2MDAwM2YwMTogVVJCX0ZFTkNFOiBjcyB2ZmUgc2YgY2xpcCBncyB2cyAKKzB4MTIzMDA3ZDQ6ICAgICAgMHgxMjQ0NDEwMDogICAgdnMgZmVuY2U6IDI1NiwgY2xpcF9mZW5jZTogMjkyLCBnc19mZW5jZTogMjcyCisweDEyMzAwN2Q4OiAgICAgIDB4NDAwMDAxODQ6ICAgIHNmIGZlbmNlOiAzODgsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDEwMjQKKzB4MTIzMDA3ZGM6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDdlMDogICAgICAweDAwMDAwNjgyOiAgICBvZmZzZXQ6IDB4MDAwMDA2ODAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwN2U0OiAgICAgIDB4N2IwMDE0MDQ6IDNEUFJJTUlUSVZFOiB0cmkgc3RyaXAgc2VxdWVudGlhbAorMHgxMjMwMDdlODogICAgICAweDAwMDAwMDE2OiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDA3ZWM6ICAgICAgMHgwMDAwMDA1MjogICAgc3RhcnQgdmVydGV4CisweDEyMzAwN2YwOiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwN2Y0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwN2Y4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDA3ZmM6ICAgICAgMHgwNTAwMDAwMDogTUlfQkFUQ0hfQlVGRkVSX0VORApkaWZmIC0tZ2l0IGEvaW50ZWwvdGVzdHMvZ2VuNS0zZC5iYXRjaC5zaCBiL2ludGVsL3Rlc3RzL2dlbjUtM2QuYmF0Y2guc2gKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNzk2Y2E1ZgotLS0gL2Rldi9udWxsCisrKyBiL2ludGVsL3Rlc3RzL2dlbjUtM2QuYmF0Y2guc2gKQEAgLTAsMCArMSBAQAordGVzdC1iYXRjaC5zaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ludGVsL3Rlc3RzL2dlbjYtM2QuYmF0Y2ggYi9pbnRlbC90ZXN0cy9nZW42LTNkLmJhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NzE0N2UKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlbC90ZXN0cy9nZW42LTNkLmJhdGNoCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ludGVsL3Rlc3RzL2dlbjYtM2QuYmF0Y2gtcmVmLnR4dCBiL2ludGVsL3Rlc3RzL2dlbjYtM2QuYmF0Y2gtcmVmLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGNiZGRjCi0tLSAvZGV2L251bGwKKysrIGIvaW50ZWwvdGVzdHMvZ2VuNi0zZC5iYXRjaC1yZWYudHh0CkBAIC0wLDAgKzEsOTkwIEBACisweDEyMzAwMDAwOiAgICAgIDB4N2EwMDAwMDI6IFBJUEVfQ09OVFJPTAorMHgxMjMwMDAwNDogICAgICAweDAwMTAwMDAyOiAgICBubyB3cml0ZSwgY3Mgc3RhbGwsIHN0YWxsIGF0IHNjb3JlYm9hcmQsIAorMHgxMjMwMDAwODogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDAwMGM6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwMDEwOiAgICAgIDB4N2EwMDAwMDI6IFBJUEVfQ09OVFJPTAorMHgxMjMwMDAxNDogICAgICAweDAwMDA0MDAwOiAgICBxd29yZCB3cml0ZSwgCisweDEyMzAwMDE4OiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDAxYzogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDAwMjA6ICAgICAgMHg2OTA0MDAwMDogM0RTVEFURV9QSVBFTElORV9TRUxFQ1QKKzB4MTIzMDAwMjQ6ICAgICAgMHg3OTBkMDAwMTogM0RTVEFURV9NVUxUSVNBTVBMRQorMHgxMjMwMDAyODogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAxCisweDEyMzAwMDJjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDIKKzB4MTIzMDAwMzA6ICAgICAgMHg3ODE4MDAwMDogM0RTVEFURV9TQU1QTEVfTUFTSworMHgxMjMwMDAzNDogICAgICAweDAwMDAwMDAxOiAgICBkd29yZCAxCisweDEyMzAwMDM4OiAgICAgIDB4NzkwYjAwMDI6IDNEU1RBVEVfR1NfU1ZCX0lOREVYCisweDEyMzAwMDNjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDEKKzB4MTIzMDAwNDA6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMgorMHgxMjMwMDA0NDogICAgICAweGZmZmZmZmZmOiAgICBkd29yZCAzCisweDEyMzAwMDQ4OiAgICAgIDB4NzkwYjAwMDI6IDNEU1RBVEVfR1NfU1ZCX0lOREVYCisweDEyMzAwMDRjOiAgICAgIDB4MjAwMDAwMDA6ICAgIGR3b3JkIDEKKzB4MTIzMDAwNTA6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMgorMHgxMjMwMDA1NDogICAgICAweGZmZmZmZmZmOiAgICBkd29yZCAzCisweDEyMzAwMDU4OiAgICAgIDB4NzkwYjAwMDI6IDNEU1RBVEVfR1NfU1ZCX0lOREVYCisweDEyMzAwMDVjOiAgICAgIDB4NDAwMDAwMDA6ICAgIGR3b3JkIDEKKzB4MTIzMDAwNjA6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMgorMHgxMjMwMDA2NDogICAgICAweGZmZmZmZmZmOiAgICBkd29yZCAzCisweDEyMzAwMDY4OiAgICAgIDB4NzkwYjAwMDI6IDNEU1RBVEVfR1NfU1ZCX0lOREVYCisweDEyMzAwMDZjOiAgICAgIDB4NjAwMDAwMDA6ICAgIGR3b3JkIDEKKzB4MTIzMDAwNzA6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMgorMHgxMjMwMDA3NDogICAgICAweGZmZmZmZmZmOiAgICBkd29yZCAzCisweDEyMzAwMDc4OiAgICAgIDB4NjEwMjAwMDA6IFNUQVRFX1NJUAorMHgxMjMwMDA3YzogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAxCisweDEyMzAwMDgwOiAgICAgIDB4NjgwYjAwMDA6IDNEU1RBVEVfVkZfU1RBVElTVElDUworMHgxMjMwMDA4NDogICAgICAweDYxMDEwMDA4OiBTVEFURV9CQVNFX0FERFJFU1MKKzB4MTIzMDAwODg6ICAgICAgMHgwMDAwMDAwMTogICAgZ2VuZXJhbCBzdGF0ZSBiYXNlIGFkZHJlc3MgMHgwMDAwMDAwMAorMHgxMjMwMDA4YzogICAgICAweDAwMDAwMDAxOiAgICBzdXJmYWNlIHN0YXRlIGJhc2UgYWRkcmVzcyAweDAwMDAwMDAwCisweDEyMzAwMDkwOiAgICAgIDB4MDAwMDAwMDE6ICAgIGR5bmFtaWMgc3RhdGUgYmFzZSBhZGRyZXNzIDB4MDAwMDAwMDAKKzB4MTIzMDAwOTQ6ICAgICAgMHgwMDAwMDAwMTogICAgaW5kaXJlY3Qgc3RhdGUgYmFzZSBhZGRyZXNzIDB4MDAwMDAwMDAKKzB4MTIzMDAwOTg6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdHJ1Y3Rpb24gc3RhdGUgYmFzZSBhZGRyZXNzIDB4MDAwMDAwMDAKKzB4MTIzMDAwOWM6ICAgICAgMHgwMDAwMDAwMTogICAgZ2VuZXJhbCBzdGF0ZSB1cHBlciBib3VuZCBkaXNhYmxlZAorMHgxMjMwMDBhMDogICAgICAweDAwMDAwMDAxOiAgICBkeW5hbWljIHN0YXRlIHVwcGVyIGJvdW5kIGRpc2FibGVkCisweDEyMzAwMGE0OiAgICAgIDB4MDAwMDAwMDE6ICAgIGluZGlyZWN0IHN0YXRlIHVwcGVyIGJvdW5kIGRpc2FibGVkCisweDEyMzAwMGE4OiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RydWN0aW9uIHN0YXRlIHVwcGVyIGJvdW5kIGRpc2FibGVkCisweDEyMzAwMGFjOiAgICAgIDB4NzgwZDFjMDI6IDNEU1RBVEVfVklFV1BPUlRfU1RBVEVfUE9JTlRFUlMKKzB4MTIzMDAwYjA6ICAgICAgMHgwMDAwN2ZlMDogICAgY2xpcAorMHgxMjMwMDBiNDogICAgICAweDAwMDA3ZmMwOiAgICBzZgorMHgxMjMwMDBiODogICAgICAweDAwMDA3ZmEwOiAgICBjYworMHgxMjMwMDBiYzogICAgICAweDc4MDUwMDAxOiAzRFNUQVRFX1VSQgorMHgxMjMwMDBjMDogICAgICAweDAwMDAwMTAwOiAgICBWUyBlbnRyaWVzIDI1NiwgYWxsb2Mgc2l6ZSAxICgxMDI0Yml0IHJvdykKKzB4MTIzMDAwYzQ6ICAgICAgMHgwMDAwMDAwMDogICAgR1MgZW50cmllcyAwLCBhbGxvYyBzaXplIDEgKDEwMjRiaXQgcm93KQorMHgxMjMwMDBjODogICAgICAweDc4MGUwMDAyOiAzRFNUQVRFX0NDX1NUQVRFX1BPSU5URVJTCisweDEyMzAwMGNjOiAgICAgIDB4MDAwMDdmODE6ICAgIGJsZW5kIGNoYW5nZSAxCisweDEyMzAwMGQwOiAgICAgIDB4MDAwMDdmMDE6ICAgIGRlcHRoIHN0ZW5jaWwgY2hhbmdlIDEKKzB4MTIzMDAwZDQ6ICAgICAgMHgwMDAwN2Y0MTogICAgY2MgY2hhbmdlIDEKKzB4MTIzMDAwZDg6ICAgICAgMHg3ODAyMTMwMjogM0RTVEFURV9TQU1QTEVSX1NUQVRFX1BPSU5URVJTOiBWUyBtb2QgMSwgR1MgbW9kIDEsIFBTIG1vZCAxCisweDEyMzAwMGRjOiAgICAgIDB4MDAwMDAwMDA6ICAgIFZTIHNhbXBsZXIgc3RhdGUKKzB4MTIzMDAwZTA6ICAgICAgMHgwMDAwMDAwMDogICAgR1Mgc2FtcGxlciBzdGF0ZQorMHgxMjMwMDBlNDogICAgICAweDAwMDAwMDAwOiAgICBXTSBzYW1wbGVyIHN0YXRlCisweDEyMzAwMGU4OiAgICAgIDB4NzgxNTAwMDM6IDNEU1RBVEVfQ09OU1RBTlRfVlNfU1RBVEUKKzB4MTIzMDAwZWM6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMQorMHgxMjMwMDBmMDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAyCisweDEyMzAwMGY0OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDMKKzB4MTIzMDAwZjg6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgNAorMHgxMjMwMDBmYzogICAgICAweDc4MTAwMDA0OiAzRFNUQVRFX1ZTCisweDEyMzAwMTAwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGtlcm5lbCBwb2ludGVyCisweDEyMzAwMTA0OiAgICAgIDB4MDAwMDAwMDA6ICAgIFNQRj0wLCBWTUU9MCwgU2FtcGxlciBDb3VudCAwLCBCaW5kaW5nIHRhYmxlIGNvdW50IDAKKzB4MTIzMDAxMDg6ICAgICAgMHgwMDAwMDAwMDogICAgc2NyYXRjaCBvZmZzZXQKKzB4MTIzMDAxMGM6ICAgICAgMHgwMDEwMDgwMDogICAgRGlzcGF0Y2ggR1JGIHN0YXJ0IDEsIFZVRSByZWFkIGxlbmd0aCAxLCBWVUUgcmVhZCBvZmZzZXQgMAorMHgxMjMwMDExMDogICAgICAweDc2MDAwNDAxOiAgICBNYXggVGhyZWFkcyA2MCwgVmVydGV4IENhY2hlIGVuYWJsZSwgVlMgZnVuYyBlbmFibGUKKzB4MTIzMDAxMTQ6ICAgICAgMHg3YTAwMDAwMjogUElQRV9DT05UUk9MCisweDEyMzAwMTE4OiAgICAgIDB4MDAwMDI4MDQ6ICAgIG5vIHdyaXRlLCBkZXB0aCBzdGFsbCwgaW5zdHJ1Y3Rpb24gY2FjaGUgaW52YWxpZGF0ZSwgc3RhdGUgY2FjaGUgaW52YWxpZGF0ZSwgCisweDEyMzAwMTFjOiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDEyMDogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDAxMjQ6ICAgICAgMHg3ODE2MDAwMzogM0RTVEFURV9DT05TVEFOVF9HU19TVEFURQorMHgxMjMwMDEyODogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAxCisweDEyMzAwMTJjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDIKKzB4MTIzMDAxMzA6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMworMHgxMjMwMDEzNDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCA0CisweDEyMzAwMTM4OiAgICAgIDB4NzgxMTAwMDU6IDNEU1RBVEVfR1MKKzB4MTIzMDAxM2M6ICAgICAgMHgwMDAwMDAwMDogICAga2VybmVsIHBvaW50ZXIKKzB4MTIzMDAxNDA6ICAgICAgMHgwMDAwMDAwMDogICAgU1BGPTAsIFZNRT0wLCBTYW1wbGVyIENvdW50IDAsIEJpbmRpbmcgdGFibGUgY291bnQgMAorMHgxMjMwMDE0NDogICAgICAweDAwMDAwMDAwOiAgICBzY3JhdGNoIG9mZnNldAorMHgxMjMwMDE0ODogICAgICAweDAwMDAwMDAxOiAgICBEaXNwYXRjaCBHUkYgc3RhcnQgMSwgVlVFIHJlYWQgbGVuZ3RoIDAsIFZVRSByZWFkIG9mZnNldCAwCisweDEyMzAwMTRjOiAgICAgIDB4MDAwMDA1MDA6ICAgIE1heCBUaHJlYWRzIDEsIFJlbmRlcmluZyBlbmFibGUKKzB4MTIzMDAxNTA6ICAgICAgMHgwMDAwMDAwMDogICAgUmVvcmRlciBkaXNhYmxlLCBEaXNjYXJkIEFkamFjZW55IGRpc2FibGUsIEdTIGRpc2FibGUKKzB4MTIzMDAxNTQ6ICAgICAgMHg3ODEyMDAwMjogM0RTVEFURV9DTElQCisweDEyMzAwMTU4OiAgICAgIDB4MDAwMDA0MDA6ICAgIFVzZXJDbGlwIGRpc3RhbmNlIGN1bGwgdGVzdCBtYXNrIDB4MAorMHgxMjMwMDE1YzogICAgICAweDk4MDAwMDI2OiAgICBDbGlwIGVuYWJsZSwgQVBJIG1vZGUgT0dMLCBWaWV3cG9ydCBYWSB0ZXN0IGVuYWJsZSwgVmlld3BvcnQgWiB0ZXN0IGVuYWJsZSwgR3VhcmRiYW5kIHRlc3QgZGlzYWJsZSwgQ2xpcCBtb2RlIDAsIFBlcnNwZWN0aXZlIERpdmlkZSBlbmFibGUsIE5vbi1QZXJzcGVjdGl2ZSBCYXJ5Y2VudHJpYyBkaXNhYmxlLCBUcmkgUHJvdm9raW5nIDIsIExpbmUgUHJvdm9raW5nIDEsIFRyaWZhbiBQcm92b2tpbmcgMgorMHgxMjMwMDE2MDogICAgICAweDAwMDNmZmUwOiAgICBNaW4gUG9pbnRXaWR0aCAxLCBNYXggUG9pbnRXaWR0aCAyMDQ3LCBGb3JjZSBaZXJvIFJUQUluZGV4IGVuYWJsZSwgTWF4IFZQSW5kZXggMAorMHgxMjMwMDE2NDogICAgICAweDc4MTMwMDEyOiAzRFNUQVRFX1NGCisweDEyMzAwMTY4OiAgICAgIDB4MDAyMDA4MTA6ICAgIEF0dHJpYiBPdXQgMCwgQXR0cmliIFN3aXp6bGUgZW5hYmxlLCBWVUUgcmVhZCBsZW5ndGggMSwgVlVFIHJlYWQgb2Zmc2V0IDEKKzB4MTIzMDAxNmM6ICAgICAgMHgwMDAwMDQwMzogICAgTGVnYWN5IEdsb2JhbCBEZXB0aEJpYXMgZGlzYWJsZSwgRnJvbnRGYWNlIGZpbGwgMCwgQkYgZmlsbCAwLCBWUCB0cmFuc2Zvcm0gZW5hYmxlLCBGcm9udFdpbmRpbmdfQ0NXCisweDEyMzAwMTcwOiAgICAgIDB4MjIwMDAwMDA6ICAgIEFBIGRpc2FibGUsIEN1bGxNb2RlIDEsIFNjaXNzb3IgZGlzYWJsZSwgTXVsdGlzYW1wbGUgbSBvZGUgMAorMHgxMjMwMDE3NDogICAgICAweDRjMDAwODA4OiAgICBMYXN0IFBpeGVsIGRpc2FibGUsIFN1YlBpeGVsIFByZWNpc2lvbiA4LCBVc2UgUGl4ZWxXaWR0aCAxCisweDEyMzAwMTc4OiAgICAgIDB4MDAwMDAwMDA6ICAgIEdsb2JhbCBEZXB0aCBPZmZzZXQgQ29uc3RhbnQgMC4wMDAwMDAKKzB4MTIzMDAxN2M6ICAgICAgMHgwMDAwMDAwMDogICAgR2xvYmFsIERlcHRoIE9mZnNldCBTY2FsZSAwLjAwMDAwMAorMHgxMjMwMDE4MDogICAgICAweDAwMDAwMDAwOiAgICBHbG9iYWwgRGVwdGggT2Zmc2V0IENsYW1wIDAuMDAwMDAwCisweDEyMzAwMTg0OiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAxIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiAwIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDAxODg6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDMgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDIgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMDE4YzogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgNSAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgNCAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwMTkwOiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiA3IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiA2IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDAxOTQ6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDkgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDggKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMDE5ODogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgMTEgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDEwIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDAxOWM6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDEzIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiAxMiAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwMWEwOiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAxNSAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgMTQgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMDFhNDogICAgICAweDAwMDAwMDAwOiAgICBQb2ludCBTcHJpdGUgVGV4Q29vcmQgRW5hYmxlCisweDEyMzAwMWE4OiAgICAgIDB4MDAwMDAwMDA6ICAgIENvbnN0IEludGVycCBFbmFibGUKKzB4MTIzMDAxYWM6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDctMCBXcmFwU2hvcnRlc3QgRW5hYmxlCisweDEyMzAwMWIwOiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAxNS04IFdyYXBTaG9ydGVzdCBFbmFibGUKKzB4MTIzMDAxYjQ6ICAgICAgMHg3ODE3MTAwMzogM0RTVEFURV9DT05TVEFOVF9QU19TVEFURQorMHgxMjMwMDFiODogICAgICAweDAwMDA3ZWUwOiAgICBkd29yZCAxCisweDEyMzAwMWJjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDIKKzB4MTIzMDAxYzA6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMworMHgxMjMwMDFjNDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCA0CisweDEyMzAwMWM4OiAgICAgIDB4NzgxNDAwMDc6IDNEU1RBVEVfV00KKzB4MTIzMDAxY2M6ICAgICAgMHgwMDAwMDBjMDogICAga2VybmVsIHN0YXJ0IHBvaW50ZXIgMAorMHgxMjMwMDFkMDogICAgICAweDAwMDAwMDAwOiAgICBTUEY9MCwgVk1FPTAsIFNhbXBsZXIgQ291bnQgMCwgQmluZGluZyB0YWJsZSBjb3VudCAwCisweDEyMzAwMWQ0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHNjcmF0Y2ggb2Zmc2V0CisweDEyMzAwMWQ4OiAgICAgIDB4ODAwMjAwMDI6ICAgIERlcHRoIENsZWFyIDAsIERlcHRoIFJlc29sdmUgMCwgSGlaIFJlc29sdmUgMCwgRGlzcGF0Y2ggR1JGIHN0YXJ0WzBdIDIsIHN0YXJ0WzFdIDAsIHN0YXJ0WzJdIDIKKzB4MTIzMDAxZGM6ICAgICAgMHg0ZTA4NDAwMzogICAgTWF4VGhyZWFkcyA0MCwgUFMgS2lsbFBpeGVsIDAsIFBTIGNvbXB1dGVkIFogMCwgUFMgdXNlIHNvdXJjZVogMCwgVGhyZWFkIERpc3BhdGNoIDEsIFBTIHVzZSBzb3VyY2VXIDAsIERpc3BhdGNoMzIgMCwgRGlzcGF0Y2gxNiAxLCBEaXNwYXRjaDggMQorMHgxMjMwMDFlMDogICAgICAweDAwMDAwMDAwOiAgICBOdW0gU0Ygb3V0cHV0IDAsIFBvcyBYWSBvZmZzZXQgMCwgWlcgaW50ZXJwIG1vZGUgMCAsIEJhcnljZW50cmljIGludGVycCBtb2RlIDB4MCwgUG9pbnQgcmFzdGVyIHJ1bGUgMCwgTXVsdGlzYW1wbGUgbW9kZSAwLCBNdWx0aXNhbXBsZSBEaXNwYXRjaCBtb2RlIDAKKzB4MTIzMDAxZTQ6ICAgICAgMHgwMDAwMDAwMDogICAga2VybmVsIHN0YXJ0IHBvaW50ZXIgMQorMHgxMjMwMDFlODogICAgICAweDAwMDAwMTQwOiAgICBrZXJuZWwgc3RhcnQgcG9pbnRlciAyCisweDEyMzAwMWVjOiAgICAgIDB4NzgwZjAwMDA6IDNEU1RBVEVfU0NJU1NPUl9QT0lOVEVSUworMHgxMjMwMDFmMDogICAgICAweDAwMDA3ZDIwOiAgICBzY2lzc29yIHJlY3Qgb2Zmc2V0CisweDEyMzAwMWY0OiAgICAgIDB4NzgwMTEzMDI6IDNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSUzogVlMgbW9kIDEsIEdTIG1vZCAxLCBQUyBtb2QgMQorMHgxMjMwMDFmODogICAgICAweDAwMDA3ZDQwOiAgICBWUyBiaW5kaW5nIHRhYmxlCisweDEyMzAwMWZjOiAgICAgIDB4MDAwMDdkNDA6ICAgIEdTIGJpbmRpbmcgdGFibGUKKzB4MTIzMDAyMDA6ICAgICAgMHgwMDAwN2Q0MDogICAgV00gYmluZGluZyB0YWJsZQorMHgxMjMwMDIwNDogICAgICAweDdhMDAwMDAyOiBQSVBFX0NPTlRST0wKKzB4MTIzMDAyMDg6ICAgICAgMHgwMDAwMjAwMDogICAgbm8gd3JpdGUsIGRlcHRoIHN0YWxsLCAKKzB4MTIzMDAyMGM6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwMjEwOiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDIxNDogICAgICAweDdhMDAwMDAyOiBQSVBFX0NPTlRST0wKKzB4MTIzMDAyMTg6ICAgICAgMHgwMDAwMDAwMTogICAgbm8gd3JpdGUsIGRlcHRoIGNhY2hlIGZsdXNoLCAKKzB4MTIzMDAyMWM6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwMjIwOiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDIyNDogICAgICAweDdhMDAwMDAyOiBQSVBFX0NPTlRST0wKKzB4MTIzMDAyMjg6ICAgICAgMHgwMDAwMjAwMDogICAgbm8gd3JpdGUsIGRlcHRoIHN0YWxsLCAKKzB4MTIzMDAyMmM6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwMjMwOiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDIzNDogICAgICAweDc5MDUwMDA1OiAzRFNUQVRFX0RFUFRIX0JVRkZFUgorMHgxMjMwMDIzODogICAgICAweDJjNmMwNWZmOiAgICAyRCwgdW5rbm93biwgcGl0Y2ggPSAxNTM2IGJ5dGVzLCB0aWxlZCwgSGlaIDEsIFNlcGFyYXRlIFN0ZW5jaWwgMQorMHgxMjMwMDIzYzogICAgICAweDAwMDAwMDAwOiAgICBkZXB0aCBvZmZzZXQKKzB4MTIzMDAyNDA6ICAgICAgMHgwOTU4NGFjMDogICAgMzAweDMwMAorMHgxMjMwMDI0NDogICAgICAweDAwMDAwMDAwOiAgICB2b2x1bWUgZGVwdGgKKzB4MTIzMDAyNDg6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwMjRjOiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDI1MDogICAgICAweDc5MGYwMDAxOiAzRFNUQVRFX0hJRVJfREVQVEhfQlVGRkVSCisweDEyMzAwMjU0OiAgICAgIDB4MDAwMDA1ZmY6ICAgIGR3b3JkIDEKKzB4MTIzMDAyNTg6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMgorMHgxMjMwMDI1YzogICAgICAweDc5MGUwMDAxOiAzRCBVTktOT1dOOiAzZF85NjUgb3Bjb2RlID0gMHg3OTBlCisweDEyMzAwMjYwOiAgICAgIDB4MDAwMDAyN2Y6IE1JX05PT1AKKzB4MTIzMDAyNjQ6ICAgICAgMHgwMDAwMDAwMDogTUlfTk9PUAorMHgxMjMwMDI2ODogICAgICAweDc5MTAwMDAwOiAzRFNUQVRFX0NMRUFSX1BBUkFNUworMHgxMjMwMDI2YzogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAxCisweDEyMzAwMjcwOiAgICAgIDB4NzkwMDAwMDI6IDNEU1RBVEVfRFJBV0lOR19SRUNUQU5HTEUKKzB4MTIzMDAyNzQ6ICAgICAgMHgwMDAwMDAwMDogICAgdG9wIGxlZnQ6IDAsMAorMHgxMjMwMDI3ODogICAgICAweDAxMmIwMTJiOiAgICBib3R0b20gcmlnaHQ6IDI5OSwyOTkKKzB4MTIzMDAyN2M6ICAgICAgMHgwMDAwMDAwMDogICAgb3JpZ2luOiAwLDAKKzB4MTIzMDAyODA6ICAgICAgMHg3OTBiMDAwMjogM0RTVEFURV9HU19TVkJfSU5ERVgKKzB4MTIzMDAyODQ6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMQorMHgxMjMwMDI4ODogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAyCisweDEyMzAwMjhjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDMKKzB4MTIzMDAyOTA6ICAgICAgMHg3ODA4MDAwMzogM0RTVEFURV9WRVJURVhfQlVGRkVSUworMHgxMjMwMDI5NDogICAgICAweDAwMDAwMDBjOiAgICBidWZmZXIgMDogc2VxdWVudGlhbCwgcGl0Y2ggMTJiCisweDEyMzAwMjk4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGJ1ZmZlciBhZGRyZXNzCisweDEyMzAwMjljOiAgICAgIDB4MDAwMGZmZmY6ICAgIG1heCBpbmRleAorMHgxMjMwMDJhMDogICAgICAweDAwMDAwMDAwOiAgICBtYnoKKzB4MTIzMDAyYTQ6ICAgICAgMHg3ODA5MDAwMTogM0RTVEFURV9WRVJURVhfRUxFTUVOVFMKKzB4MTIzMDAyYTg6ICAgICAgMHgwMjQwMDAwMDogICAgYnVmZmVyIDA6IHZhbGlkLCB0eXBlIDB4MDA0MCwgc3JjIG9mZnNldCAweDAwMDAgYnl0ZXMKKzB4MTIzMDAyYWM6ICAgICAgMHgxMTEzMDAwMDogICAgKFgsIFksIFosIDEuMCksIGRzdCBvZmZzZXQgMHgwMCBieXRlcworMHgxMjMwMDJiMDogICAgICAweDdiMDAxODA0OiAzRFBSSU1JVElWRTogdHJpIGZhbiBzZXF1ZW50aWFsCisweDEyMzAwMmI0OiAgICAgIDB4MDAwMDAwMDQ6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDJiODogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDAyYmM6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDAyYzA6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDAyYzQ6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDJjODogICAgICAweDc4MDUwMDAxOiAzRFNUQVRFX1VSQgorMHgxMjMwMDJjYzogICAgICAweDAwMDAwMTAwOiAgICBWUyBlbnRyaWVzIDI1NiwgYWxsb2Mgc2l6ZSAxICgxMDI0Yml0IHJvdykKKzB4MTIzMDAyZDA6ICAgICAgMHgwMDAwMDAwMDogICAgR1MgZW50cmllcyAwLCBhbGxvYyBzaXplIDEgKDEwMjRiaXQgcm93KQorMHgxMjMwMDJkNDogICAgICAweDc4MGUwMDAyOiAzRFNUQVRFX0NDX1NUQVRFX1BPSU5URVJTCisweDEyMzAwMmQ4OiAgICAgIDB4MDAwMDdmODE6ICAgIGJsZW5kIGNoYW5nZSAxCisweDEyMzAwMmRjOiAgICAgIDB4MDAwMDdjYzE6ICAgIGRlcHRoIHN0ZW5jaWwgY2hhbmdlIDEKKzB4MTIzMDAyZTA6ICAgICAgMHgwMDAwN2QwMTogICAgY2MgY2hhbmdlIDEKKzB4MTIzMDAyZTQ6ICAgICAgMHg3ODE1MTAwMzogM0RTVEFURV9DT05TVEFOVF9WU19TVEFURQorMHgxMjMwMDJlODogICAgICAweDAwMDA3Yjg1OiAgICBkd29yZCAxCisweDEyMzAwMmVjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDIKKzB4MTIzMDAyZjA6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMworMHgxMjMwMDJmNDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCA0CisweDEyMzAwMmY4OiAgICAgIDB4NzgxMDAwMDQ6IDNEU1RBVEVfVlMKKzB4MTIzMDAyZmM6ICAgICAgMHgwMDAwMDI0MDogICAga2VybmVsIHBvaW50ZXIKKzB4MTIzMDAzMDA6ICAgICAgMHgwMDAxMDAwMDogICAgU1BGPTAsIFZNRT0wLCBTYW1wbGVyIENvdW50IDAsIEJpbmRpbmcgdGFibGUgY291bnQgMAorMHgxMjMwMDMwNDogICAgICAweDAwMDAwMDAwOiAgICBzY3JhdGNoIG9mZnNldAorMHgxMjMwMDMwODogICAgICAweDAwMTAwODAwOiAgICBEaXNwYXRjaCBHUkYgc3RhcnQgMSwgVlVFIHJlYWQgbGVuZ3RoIDEsIFZVRSByZWFkIG9mZnNldCAwCisweDEyMzAwMzBjOiAgICAgIDB4NzYwMDA0MDE6ICAgIE1heCBUaHJlYWRzIDYwLCBWZXJ0ZXggQ2FjaGUgZW5hYmxlLCBWUyBmdW5jIGVuYWJsZQorMHgxMjMwMDMxMDogICAgICAweDdhMDAwMDAyOiBQSVBFX0NPTlRST0wKKzB4MTIzMDAzMTQ6ICAgICAgMHgwMDEwMDAwMjogICAgbm8gd3JpdGUsIGNzIHN0YWxsLCBzdGFsbCBhdCBzY29yZWJvYXJkLCAKKzB4MTIzMDAzMTg6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwMzFjOiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDMyMDogICAgICAweDdhMDAwMDAyOiBQSVBFX0NPTlRST0wKKzB4MTIzMDAzMjQ6ICAgICAgMHgwMDAwNDAwMDogICAgcXdvcmQgd3JpdGUsIAorMHgxMjMwMDMyODogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDAzMmM6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwMzMwOiAgICAgIDB4N2EwMDAwMDI6IFBJUEVfQ09OVFJPTAorMHgxMjMwMDMzNDogICAgICAweDAwMDAyODA0OiAgICBubyB3cml0ZSwgZGVwdGggc3RhbGwsIGluc3RydWN0aW9uIGNhY2hlIGludmFsaWRhdGUsIHN0YXRlIGNhY2hlIGludmFsaWRhdGUsIAorMHgxMjMwMDMzODogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDAzM2M6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwMzQwOiAgICAgIDB4NzgxMjAwMDI6IDNEU1RBVEVfQ0xJUAorMHgxMjMwMDM0NDogICAgICAweDAwMDAwNDAwOiAgICBVc2VyQ2xpcCBkaXN0YW5jZSBjdWxsIHRlc3QgbWFzayAweDAKKzB4MTIzMDAzNDg6ICAgICAgMHg5ODAwMDAyNjogICAgQ2xpcCBlbmFibGUsIEFQSSBtb2RlIE9HTCwgVmlld3BvcnQgWFkgdGVzdCBlbmFibGUsIFZpZXdwb3J0IFogdGVzdCBlbmFibGUsIEd1YXJkYmFuZCB0ZXN0IGRpc2FibGUsIENsaXAgbW9kZSAwLCBQZXJzcGVjdGl2ZSBEaXZpZGUgZW5hYmxlLCBOb24tUGVyc3BlY3RpdmUgQmFyeWNlbnRyaWMgZGlzYWJsZSwgVHJpIFByb3Zva2luZyAyLCBMaW5lIFByb3Zva2luZyAxLCBUcmlmYW4gUHJvdm9raW5nIDIKKzB4MTIzMDAzNGM6ICAgICAgMHgwMDAzZmZlMDogICAgTWluIFBvaW50V2lkdGggMSwgTWF4IFBvaW50V2lkdGggMjA0NywgRm9yY2UgWmVybyBSVEFJbmRleCBlbmFibGUsIE1heCBWUEluZGV4IDAKKzB4MTIzMDAzNTA6ICAgICAgMHg3ODEzMDAxMjogM0RTVEFURV9TRgorMHgxMjMwMDM1NDogICAgICAweDAwNjAwODEwOiAgICBBdHRyaWIgT3V0IDEsIEF0dHJpYiBTd2l6emxlIGVuYWJsZSwgVlVFIHJlYWQgbGVuZ3RoIDEsIFZVRSByZWFkIG9mZnNldCAxCisweDEyMzAwMzU4OiAgICAgIDB4MDAwMDA0MDM6ICAgIExlZ2FjeSBHbG9iYWwgRGVwdGhCaWFzIGRpc2FibGUsIEZyb250RmFjZSBmaWxsIDAsIEJGIGZpbGwgMCwgVlAgdHJhbnNmb3JtIGVuYWJsZSwgRnJvbnRXaW5kaW5nX0NDVworMHgxMjMwMDM1YzogICAgICAweDYyMDAwMDAwOiAgICBBQSBkaXNhYmxlLCBDdWxsTW9kZSAzLCBTY2lzc29yIGRpc2FibGUsIE11bHRpc2FtcGxlIG0gb2RlIDAKKzB4MTIzMDAzNjA6ICAgICAgMHg0YzAwMDgwODogICAgTGFzdCBQaXhlbCBkaXNhYmxlLCBTdWJQaXhlbCBQcmVjaXNpb24gOCwgVXNlIFBpeGVsV2lkdGggMQorMHgxMjMwMDM2NDogICAgICAweDAwMDAwMDAwOiAgICBHbG9iYWwgRGVwdGggT2Zmc2V0IENvbnN0YW50IDAuMDAwMDAwCisweDEyMzAwMzY4OiAgICAgIDB4MDAwMDAwMDA6ICAgIEdsb2JhbCBEZXB0aCBPZmZzZXQgU2NhbGUgMC4wMDAwMDAKKzB4MTIzMDAzNmM6ICAgICAgMHgwMDAwMDAwMDogICAgR2xvYmFsIERlcHRoIE9mZnNldCBDbGFtcCAwLjAwMDAwMAorMHgxMjMwMDM3MDogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgMSAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgMCAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwMzc0OiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAzIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiAyIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDAzNzg6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDUgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDQgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMDM3YzogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgNyAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgNiAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwMzgwOiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiA5IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiA4IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDAzODQ6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDExIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiAxMCAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwMzg4OiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAxMyAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgMTIgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMDM4YzogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgMTUgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDE0IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDAzOTA6ICAgICAgMHgwMDAwMDAwMDogICAgUG9pbnQgU3ByaXRlIFRleENvb3JkIEVuYWJsZQorMHgxMjMwMDM5NDogICAgICAweDAwMDAwMDAxOiAgICBDb25zdCBJbnRlcnAgRW5hYmxlCisweDEyMzAwMzk4OiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiA3LTAgV3JhcFNob3J0ZXN0IEVuYWJsZQorMHgxMjMwMDM5YzogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgMTUtOCBXcmFwU2hvcnRlc3QgRW5hYmxlCisweDEyMzAwM2EwOiAgICAgIDB4NzgxNzAwMDM6IDNEU1RBVEVfQ09OU1RBTlRfUFNfU1RBVEUKKzB4MTIzMDAzYTQ6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMQorMHgxMjMwMDNhODogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAyCisweDEyMzAwM2FjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDMKKzB4MTIzMDAzYjA6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgNAorMHgxMjMwMDNiNDogICAgICAweDc4MTQwMDA3OiAzRFNUQVRFX1dNCisweDEyMzAwM2I4OiAgICAgIDB4MDAwMDA1MDA6ICAgIGtlcm5lbCBzdGFydCBwb2ludGVyIDAKKzB4MTIzMDAzYmM6ICAgICAgMHgwMDAxMDAwMDogICAgU1BGPTAsIFZNRT0wLCBTYW1wbGVyIENvdW50IDAsIEJpbmRpbmcgdGFibGUgY291bnQgMAorMHgxMjMwMDNjMDogICAgICAweDAwMDAwMDAwOiAgICBzY3JhdGNoIG9mZnNldAorMHgxMjMwMDNjNDogICAgICAweDgwMDIwMDAwOiAgICBEZXB0aCBDbGVhciAwLCBEZXB0aCBSZXNvbHZlIDAsIEhpWiBSZXNvbHZlIDAsIERpc3BhdGNoIEdSRiBzdGFydFswXSAyLCBzdGFydFsxXSAwLCBzdGFydFsyXSAwCisweDEyMzAwM2M4OiAgICAgIDB4NGUwODQwMDI6ICAgIE1heFRocmVhZHMgNDAsIFBTIEtpbGxQaXhlbCAwLCBQUyBjb21wdXRlZCBaIDAsIFBTIHVzZSBzb3VyY2VaIDAsIFRocmVhZCBEaXNwYXRjaCAxLCBQUyB1c2Ugc291cmNlVyAwLCBEaXNwYXRjaDMyIDAsIERpc3BhdGNoMTYgMSwgRGlzcGF0Y2g4IDAKKzB4MTIzMDAzY2M6ICAgICAgMHgwMDEwMDAwMDogICAgTnVtIFNGIG91dHB1dCAxLCBQb3MgWFkgb2Zmc2V0IDAsIFpXIGludGVycCBtb2RlIDAgLCBCYXJ5Y2VudHJpYyBpbnRlcnAgbW9kZSAweDAsIFBvaW50IHJhc3RlciBydWxlIDAsIE11bHRpc2FtcGxlIG1vZGUgMCwgTXVsdGlzYW1wbGUgRGlzcGF0Y2ggbW9kZSAwCisweDEyMzAwM2QwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGtlcm5lbCBzdGFydCBwb2ludGVyIDEKKzB4MTIzMDAzZDQ6ICAgICAgMHgwMDAwMDUwMDogICAga2VybmVsIHN0YXJ0IHBvaW50ZXIgMgorMHgxMjMwMDNkODogICAgICAweDc4MDExMzAyOiAzRFNUQVRFX0JJTkRJTkdfVEFCTEVfUE9JTlRFUlM6IFZTIG1vZCAxLCBHUyBtb2QgMSwgUFMgbW9kIDEKKzB4MTIzMDAzZGM6ICAgICAgMHgwMDAwN2EwMDogICAgVlMgYmluZGluZyB0YWJsZQorMHgxMjMwMDNlMDogICAgICAweDAwMDA3YTAwOiAgICBHUyBiaW5kaW5nIHRhYmxlCisweDEyMzAwM2U0OiAgICAgIDB4MDAwMDdhMDA6ICAgIFdNIGJpbmRpbmcgdGFibGUKKzB4MTIzMDAzZTg6ICAgICAgMHg3ODA4MDAwMzogM0RTVEFURV9WRVJURVhfQlVGRkVSUworMHgxMjMwMDNlYzogICAgICAweDAwMDAwMDBjOiAgICBidWZmZXIgMDogc2VxdWVudGlhbCwgcGl0Y2ggMTJiCisweDEyMzAwM2YwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGJ1ZmZlciBhZGRyZXNzCisweDEyMzAwM2Y0OiAgICAgIDB4MDAwMDdmZmY6ICAgIG1heCBpbmRleAorMHgxMjMwMDNmODogICAgICAweDAwMDAwMDAwOiAgICBtYnoKKzB4MTIzMDAzZmM6ICAgICAgMHg3YjAwMjAwNDogM0RQUklNSVRJVkU6IHF1YWQgc3RyaXAgc2VxdWVudGlhbAorMHgxMjMwMDQwMDogICAgICAweDAwMDAwMDUyOiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDA0MDQ6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgdmVydGV4CisweDEyMzAwNDA4OiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwNDBjOiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwNDEwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDA0MTQ6ICAgICAgMHg3YjAwMWMwNDogM0RQUklNSVRJVkU6IHF1YWQgbGlzdCBzZXF1ZW50aWFsCisweDEyMzAwNDE4OiAgICAgIDB4MDAwMDAwNTA6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDQxYzogICAgICAweDAwMDAwMDUyOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDA0MjA6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDA0MjQ6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDA0Mjg6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDQyYzogICAgICAweDc4MTUxMDAzOiAzRFNUQVRFX0NPTlNUQU5UX1ZTX1NUQVRFCisweDEyMzAwNDMwOiAgICAgIDB4MDAwMDc4YzU6ICAgIGR3b3JkIDEKKzB4MTIzMDA0MzQ6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMgorMHgxMjMwMDQzODogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAzCisweDEyMzAwNDNjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDQKKzB4MTIzMDA0NDA6ICAgICAgMHg3ODEwMDAwNDogM0RTVEFURV9WUworMHgxMjMwMDQ0NDogICAgICAweDAwMDAwMjQwOiAgICBrZXJuZWwgcG9pbnRlcgorMHgxMjMwMDQ0ODogICAgICAweDAwMDEwMDAwOiAgICBTUEY9MCwgVk1FPTAsIFNhbXBsZXIgQ291bnQgMCwgQmluZGluZyB0YWJsZSBjb3VudCAwCisweDEyMzAwNDRjOiAgICAgIDB4MDAwMDAwMDA6ICAgIHNjcmF0Y2ggb2Zmc2V0CisweDEyMzAwNDUwOiAgICAgIDB4MDAxMDA4MDA6ICAgIERpc3BhdGNoIEdSRiBzdGFydCAxLCBWVUUgcmVhZCBsZW5ndGggMSwgVlVFIHJlYWQgb2Zmc2V0IDAKKzB4MTIzMDA0NTQ6ICAgICAgMHg3NjAwMDQwMTogICAgTWF4IFRocmVhZHMgNjAsIFZlcnRleCBDYWNoZSBlbmFibGUsIFZTIGZ1bmMgZW5hYmxlCisweDEyMzAwNDU4OiAgICAgIDB4N2EwMDAwMDI6IFBJUEVfQ09OVFJPTAorMHgxMjMwMDQ1YzogICAgICAweDAwMTAwMDAyOiAgICBubyB3cml0ZSwgY3Mgc3RhbGwsIHN0YWxsIGF0IHNjb3JlYm9hcmQsIAorMHgxMjMwMDQ2MDogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDA0NjQ6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwNDY4OiAgICAgIDB4N2EwMDAwMDI6IFBJUEVfQ09OVFJPTAorMHgxMjMwMDQ2YzogICAgICAweDAwMDA0MDAwOiAgICBxd29yZCB3cml0ZSwgCisweDEyMzAwNDcwOiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDQ3NDogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDA0Nzg6ICAgICAgMHg3YTAwMDAwMjogUElQRV9DT05UUk9MCisweDEyMzAwNDdjOiAgICAgIDB4MDAwMDI4MDQ6ICAgIG5vIHdyaXRlLCBkZXB0aCBzdGFsbCwgaW5zdHJ1Y3Rpb24gY2FjaGUgaW52YWxpZGF0ZSwgc3RhdGUgY2FjaGUgaW52YWxpZGF0ZSwgCisweDEyMzAwNDgwOiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDQ4NDogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDA0ODg6ICAgICAgMHg3ODE3MDAwMzogM0RTVEFURV9DT05TVEFOVF9QU19TVEFURQorMHgxMjMwMDQ4YzogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAxCisweDEyMzAwNDkwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDIKKzB4MTIzMDA0OTQ6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMworMHgxMjMwMDQ5ODogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCA0CisweDEyMzAwNDljOiAgICAgIDB4NzgxNDAwMDc6IDNEU1RBVEVfV00KKzB4MTIzMDA0YTA6ICAgICAgMHgwMDAwMDUwMDogICAga2VybmVsIHN0YXJ0IHBvaW50ZXIgMAorMHgxMjMwMDRhNDogICAgICAweDAwMDEwMDAwOiAgICBTUEY9MCwgVk1FPTAsIFNhbXBsZXIgQ291bnQgMCwgQmluZGluZyB0YWJsZSBjb3VudCAwCisweDEyMzAwNGE4OiAgICAgIDB4MDAwMDAwMDA6ICAgIHNjcmF0Y2ggb2Zmc2V0CisweDEyMzAwNGFjOiAgICAgIDB4ODAwMjAwMDA6ICAgIERlcHRoIENsZWFyIDAsIERlcHRoIFJlc29sdmUgMCwgSGlaIFJlc29sdmUgMCwgRGlzcGF0Y2ggR1JGIHN0YXJ0WzBdIDIsIHN0YXJ0WzFdIDAsIHN0YXJ0WzJdIDAKKzB4MTIzMDA0YjA6ICAgICAgMHg0ZTA4NDAwMjogICAgTWF4VGhyZWFkcyA0MCwgUFMgS2lsbFBpeGVsIDAsIFBTIGNvbXB1dGVkIFogMCwgUFMgdXNlIHNvdXJjZVogMCwgVGhyZWFkIERpc3BhdGNoIDEsIFBTIHVzZSBzb3VyY2VXIDAsIERpc3BhdGNoMzIgMCwgRGlzcGF0Y2gxNiAxLCBEaXNwYXRjaDggMAorMHgxMjMwMDRiNDogICAgICAweDAwMTAwMDAwOiAgICBOdW0gU0Ygb3V0cHV0IDEsIFBvcyBYWSBvZmZzZXQgMCwgWlcgaW50ZXJwIG1vZGUgMCAsIEJhcnljZW50cmljIGludGVycCBtb2RlIDB4MCwgUG9pbnQgcmFzdGVyIHJ1bGUgMCwgTXVsdGlzYW1wbGUgbW9kZSAwLCBNdWx0aXNhbXBsZSBEaXNwYXRjaCBtb2RlIDAKKzB4MTIzMDA0Yjg6ICAgICAgMHgwMDAwMDAwMDogICAga2VybmVsIHN0YXJ0IHBvaW50ZXIgMQorMHgxMjMwMDRiYzogICAgICAweDAwMDAwNTAwOiAgICBrZXJuZWwgc3RhcnQgcG9pbnRlciAyCisweDEyMzAwNGMwOiAgICAgIDB4N2IwMDIwMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIHN0cmlwIHNlcXVlbnRpYWwKKzB4MTIzMDA0YzQ6ICAgICAgMHgwMDAwMDA1MjogICAgdmVydGV4IGNvdW50CisweDEyMzAwNGM4OiAgICAgIDB4MDAwMDAwYTI6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDRjYzogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDRkMDogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDRkNDogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwNGQ4OiAgICAgIDB4N2IwMDFjMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIGxpc3Qgc2VxdWVudGlhbAorMHgxMjMwMDRkYzogICAgICAweDAwMDAwMDUwOiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDA0ZTA6ICAgICAgMHgwMDAwMDBmNDogICAgc3RhcnQgdmVydGV4CisweDEyMzAwNGU0OiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwNGU4OiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwNGVjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDA0ZjA6ICAgICAgMHg3ODA1MDAwMTogM0RTVEFURV9VUkIKKzB4MTIzMDA0ZjQ6ICAgICAgMHgwMDAwMDEwMDogICAgVlMgZW50cmllcyAyNTYsIGFsbG9jIHNpemUgMSAoMTAyNGJpdCByb3cpCisweDEyMzAwNGY4OiAgICAgIDB4MDAwMDAwMDA6ICAgIEdTIGVudHJpZXMgMCwgYWxsb2Mgc2l6ZSAxICgxMDI0Yml0IHJvdykKKzB4MTIzMDA0ZmM6ICAgICAgMHg3ODE1MTAwMzogM0RTVEFURV9DT05TVEFOVF9WU19TVEFURQorMHgxMjMwMDUwMDogICAgICAweDAwMDA3Nzg1OiAgICBkd29yZCAxCisweDEyMzAwNTA0OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDIKKzB4MTIzMDA1MDg6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMworMHgxMjMwMDUwYzogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCA0CisweDEyMzAwNTEwOiAgICAgIDB4NzgxMDAwMDQ6IDNEU1RBVEVfVlMKKzB4MTIzMDA1MTQ6ICAgICAgMHgwMDAwMDY0MDogICAga2VybmVsIHBvaW50ZXIKKzB4MTIzMDA1MTg6ICAgICAgMHgwMDAxMDAwMDogICAgU1BGPTAsIFZNRT0wLCBTYW1wbGVyIENvdW50IDAsIEJpbmRpbmcgdGFibGUgY291bnQgMAorMHgxMjMwMDUxYzogICAgICAweDAwMDAwMDAwOiAgICBzY3JhdGNoIG9mZnNldAorMHgxMjMwMDUyMDogICAgICAweDAwMTAwODAwOiAgICBEaXNwYXRjaCBHUkYgc3RhcnQgMSwgVlVFIHJlYWQgbGVuZ3RoIDEsIFZVRSByZWFkIG9mZnNldCAwCisweDEyMzAwNTI0OiAgICAgIDB4NzYwMDA0MDE6ICAgIE1heCBUaHJlYWRzIDYwLCBWZXJ0ZXggQ2FjaGUgZW5hYmxlLCBWUyBmdW5jIGVuYWJsZQorMHgxMjMwMDUyODogICAgICAweDdhMDAwMDAyOiBQSVBFX0NPTlRST0wKKzB4MTIzMDA1MmM6ICAgICAgMHgwMDEwMDAwMjogICAgbm8gd3JpdGUsIGNzIHN0YWxsLCBzdGFsbCBhdCBzY29yZWJvYXJkLCAKKzB4MTIzMDA1MzA6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwNTM0OiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDUzODogICAgICAweDdhMDAwMDAyOiBQSVBFX0NPTlRST0wKKzB4MTIzMDA1M2M6ICAgICAgMHgwMDAwNDAwMDogICAgcXdvcmQgd3JpdGUsIAorMHgxMjMwMDU0MDogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDA1NDQ6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwNTQ4OiAgICAgIDB4N2EwMDAwMDI6IFBJUEVfQ09OVFJPTAorMHgxMjMwMDU0YzogICAgICAweDAwMDAyODA0OiAgICBubyB3cml0ZSwgZGVwdGggc3RhbGwsIGluc3RydWN0aW9uIGNhY2hlIGludmFsaWRhdGUsIHN0YXRlIGNhY2hlIGludmFsaWRhdGUsIAorMHgxMjMwMDU1MDogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDA1NTQ6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwNTU4OiAgICAgIDB4NzgxMzAwMTI6IDNEU1RBVEVfU0YKKzB4MTIzMDA1NWM6ICAgICAgMHgwMDYwMDgxMDogICAgQXR0cmliIE91dCAxLCBBdHRyaWIgU3dpenpsZSBlbmFibGUsIFZVRSByZWFkIGxlbmd0aCAxLCBWVUUgcmVhZCBvZmZzZXQgMQorMHgxMjMwMDU2MDogICAgICAweDAwMDAwNDAzOiAgICBMZWdhY3kgR2xvYmFsIERlcHRoQmlhcyBkaXNhYmxlLCBGcm9udEZhY2UgZmlsbCAwLCBCRiBmaWxsIDAsIFZQIHRyYW5zZm9ybSBlbmFibGUsIEZyb250V2luZGluZ19DQ1cKKzB4MTIzMDA1NjQ6ICAgICAgMHg2MjAwMDAwMDogICAgQUEgZGlzYWJsZSwgQ3VsbE1vZGUgMywgU2Npc3NvciBkaXNhYmxlLCBNdWx0aXNhbXBsZSBtIG9kZSAwCisweDEyMzAwNTY4OiAgICAgIDB4NGMwMDA4MDg6ICAgIExhc3QgUGl4ZWwgZGlzYWJsZSwgU3ViUGl4ZWwgUHJlY2lzaW9uIDgsIFVzZSBQaXhlbFdpZHRoIDEKKzB4MTIzMDA1NmM6ICAgICAgMHgwMDAwMDAwMDogICAgR2xvYmFsIERlcHRoIE9mZnNldCBDb25zdGFudCAwLjAwMDAwMAorMHgxMjMwMDU3MDogICAgICAweDAwMDAwMDAwOiAgICBHbG9iYWwgRGVwdGggT2Zmc2V0IFNjYWxlIDAuMDAwMDAwCisweDEyMzAwNTc0OiAgICAgIDB4MDAwMDAwMDA6ICAgIEdsb2JhbCBEZXB0aCBPZmZzZXQgQ2xhbXAgMC4wMDAwMDAKKzB4MTIzMDA1Nzg6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDEgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDAgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMDU3YzogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgMyAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgMiAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwNTgwOiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiA1IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiA0IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDA1ODQ6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDcgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDYgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMDU4ODogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgOSAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgOCAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwNThjOiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAxMSAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgMTAgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMDU5MDogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgMTMgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDEyIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDA1OTQ6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDE1IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiAxNCAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwNTk4OiAgICAgIDB4MDAwMDAwMDA6ICAgIFBvaW50IFNwcml0ZSBUZXhDb29yZCBFbmFibGUKKzB4MTIzMDA1OWM6ICAgICAgMHgwMDAwMDAwMTogICAgQ29uc3QgSW50ZXJwIEVuYWJsZQorMHgxMjMwMDVhMDogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgNy0wIFdyYXBTaG9ydGVzdCBFbmFibGUKKzB4MTIzMDA1YTQ6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDE1LTggV3JhcFNob3J0ZXN0IEVuYWJsZQorMHgxMjMwMDVhODogICAgICAweDc4MDExMzAyOiAzRFNUQVRFX0JJTkRJTkdfVEFCTEVfUE9JTlRFUlM6IFZTIG1vZCAxLCBHUyBtb2QgMSwgUFMgbW9kIDEKKzB4MTIzMDA1YWM6ICAgICAgMHgwMDAwNzYwMDogICAgVlMgYmluZGluZyB0YWJsZQorMHgxMjMwMDViMDogICAgICAweDAwMDA3NjAwOiAgICBHUyBiaW5kaW5nIHRhYmxlCisweDEyMzAwNWI0OiAgICAgIDB4MDAwMDc2MDA6ICAgIFdNIGJpbmRpbmcgdGFibGUKKzB4MTIzMDA1Yjg6ICAgICAgMHg3ODA4MDAwMzogM0RTVEFURV9WRVJURVhfQlVGRkVSUworMHgxMjMwMDViYzogICAgICAweDAwMDAwMDE4OiAgICBidWZmZXIgMDogc2VxdWVudGlhbCwgcGl0Y2ggMjRiCisweDEyMzAwNWMwOiAgICAgIDB4MDAwMDBmNDg6ICAgIGJ1ZmZlciBhZGRyZXNzCisweDEyMzAwNWM0OiAgICAgIDB4MDAwMDdmZmY6ICAgIG1heCBpbmRleAorMHgxMjMwMDVjODogICAgICAweDAwMDAwMDAwOiAgICBtYnoKKzB4MTIzMDA1Y2M6ICAgICAgMHg3ODA5MDAwMzogM0RTVEFURV9WRVJURVhfRUxFTUVOVFMKKzB4MTIzMDA1ZDA6ICAgICAgMHgwMjQwMDAwMDogICAgYnVmZmVyIDA6IHZhbGlkLCB0eXBlIDB4MDA0MCwgc3JjIG9mZnNldCAweDAwMDAgYnl0ZXMKKzB4MTIzMDA1ZDQ6ICAgICAgMHgxMTEzMDAwMDogICAgKFgsIFksIFosIDEuMCksIGRzdCBvZmZzZXQgMHgwMCBieXRlcworMHgxMjMwMDVkODogICAgICAweDAyNDAwMDBjOiAgICBidWZmZXIgMDogdmFsaWQsIHR5cGUgMHgwMDQwLCBzcmMgb2Zmc2V0IDB4MDAwYyBieXRlcworMHgxMjMwMDVkYzogICAgICAweDExMTMwMDAwOiAgICAoWCwgWSwgWiwgMS4wKSwgZHN0IG9mZnNldCAweDAwIGJ5dGVzCisweDEyMzAwNWUwOiAgICAgIDB4N2IwMDIwMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIHN0cmlwIHNlcXVlbnRpYWwKKzB4MTIzMDA1ZTQ6ICAgICAgMHgwMDAwMDBhMjogICAgdmVydGV4IGNvdW50CisweDEyMzAwNWU4OiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDVlYzogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDVmMDogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDVmNDogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwNWY4OiAgICAgIDB4NzgxNTEwMDM6IDNEU1RBVEVfQ09OU1RBTlRfVlNfU1RBVEUKKzB4MTIzMDA1ZmM6ICAgICAgMHgwMDAwNzRjNTogICAgZHdvcmQgMQorMHgxMjMwMDYwMDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAyCisweDEyMzAwNjA0OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDMKKzB4MTIzMDA2MDg6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgNAorMHgxMjMwMDYwYzogICAgICAweDc4MTAwMDA0OiAzRFNUQVRFX1ZTCisweDEyMzAwNjEwOiAgICAgIDB4MDAwMDA2NDA6ICAgIGtlcm5lbCBwb2ludGVyCisweDEyMzAwNjE0OiAgICAgIDB4MDAwMTAwMDA6ICAgIFNQRj0wLCBWTUU9MCwgU2FtcGxlciBDb3VudCAwLCBCaW5kaW5nIHRhYmxlIGNvdW50IDAKKzB4MTIzMDA2MTg6ICAgICAgMHgwMDAwMDAwMDogICAgc2NyYXRjaCBvZmZzZXQKKzB4MTIzMDA2MWM6ICAgICAgMHgwMDEwMDgwMDogICAgRGlzcGF0Y2ggR1JGIHN0YXJ0IDEsIFZVRSByZWFkIGxlbmd0aCAxLCBWVUUgcmVhZCBvZmZzZXQgMAorMHgxMjMwMDYyMDogICAgICAweDc2MDAwNDAxOiAgICBNYXggVGhyZWFkcyA2MCwgVmVydGV4IENhY2hlIGVuYWJsZSwgVlMgZnVuYyBlbmFibGUKKzB4MTIzMDA2MjQ6ICAgICAgMHg3YTAwMDAwMjogUElQRV9DT05UUk9MCisweDEyMzAwNjI4OiAgICAgIDB4MDAxMDAwMDI6ICAgIG5vIHdyaXRlLCBjcyBzdGFsbCwgc3RhbGwgYXQgc2NvcmVib2FyZCwgCisweDEyMzAwNjJjOiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDYzMDogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDA2MzQ6ICAgICAgMHg3YTAwMDAwMjogUElQRV9DT05UUk9MCisweDEyMzAwNjM4OiAgICAgIDB4MDAwMDQwMDA6ICAgIHF3b3JkIHdyaXRlLCAKKzB4MTIzMDA2M2M6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwNjQwOiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDY0NDogICAgICAweDdhMDAwMDAyOiBQSVBFX0NPTlRST0wKKzB4MTIzMDA2NDg6ICAgICAgMHgwMDAwMjgwNDogICAgbm8gd3JpdGUsIGRlcHRoIHN0YWxsLCBpbnN0cnVjdGlvbiBjYWNoZSBpbnZhbGlkYXRlLCBzdGF0ZSBjYWNoZSBpbnZhbGlkYXRlLCAKKzB4MTIzMDA2NGM6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwNjUwOiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDY1NDogICAgICAweDc4MTIwMDAyOiAzRFNUQVRFX0NMSVAKKzB4MTIzMDA2NTg6ICAgICAgMHgwMDAwMDQwMDogICAgVXNlckNsaXAgZGlzdGFuY2UgY3VsbCB0ZXN0IG1hc2sgMHgwCisweDEyMzAwNjVjOiAgICAgIDB4OTgwMDAwMjY6ICAgIENsaXAgZW5hYmxlLCBBUEkgbW9kZSBPR0wsIFZpZXdwb3J0IFhZIHRlc3QgZW5hYmxlLCBWaWV3cG9ydCBaIHRlc3QgZW5hYmxlLCBHdWFyZGJhbmQgdGVzdCBkaXNhYmxlLCBDbGlwIG1vZGUgMCwgUGVyc3BlY3RpdmUgRGl2aWRlIGVuYWJsZSwgTm9uLVBlcnNwZWN0aXZlIEJhcnljZW50cmljIGRpc2FibGUsIFRyaSBQcm92b2tpbmcgMiwgTGluZSBQcm92b2tpbmcgMSwgVHJpZmFuIFByb3Zva2luZyAyCisweDEyMzAwNjYwOiAgICAgIDB4MDAwM2ZmZTA6ICAgIE1pbiBQb2ludFdpZHRoIDEsIE1heCBQb2ludFdpZHRoIDIwNDcsIEZvcmNlIFplcm8gUlRBSW5kZXggZW5hYmxlLCBNYXggVlBJbmRleCAwCisweDEyMzAwNjY0OiAgICAgIDB4NzgxMzAwMTI6IDNEU1RBVEVfU0YKKzB4MTIzMDA2Njg6ICAgICAgMHgwMDYwMDgxMDogICAgQXR0cmliIE91dCAxLCBBdHRyaWIgU3dpenpsZSBlbmFibGUsIFZVRSByZWFkIGxlbmd0aCAxLCBWVUUgcmVhZCBvZmZzZXQgMQorMHgxMjMwMDY2YzogICAgICAweDAwMDAwNDAzOiAgICBMZWdhY3kgR2xvYmFsIERlcHRoQmlhcyBkaXNhYmxlLCBGcm9udEZhY2UgZmlsbCAwLCBCRiBmaWxsIDAsIFZQIHRyYW5zZm9ybSBlbmFibGUsIEZyb250V2luZGluZ19DQ1cKKzB4MTIzMDA2NzA6ICAgICAgMHg2MjAwMDAwMDogICAgQUEgZGlzYWJsZSwgQ3VsbE1vZGUgMywgU2Npc3NvciBkaXNhYmxlLCBNdWx0aXNhbXBsZSBtIG9kZSAwCisweDEyMzAwNjc0OiAgICAgIDB4NGMwMDA4MDg6ICAgIExhc3QgUGl4ZWwgZGlzYWJsZSwgU3ViUGl4ZWwgUHJlY2lzaW9uIDgsIFVzZSBQaXhlbFdpZHRoIDEKKzB4MTIzMDA2Nzg6ICAgICAgMHgwMDAwMDAwMDogICAgR2xvYmFsIERlcHRoIE9mZnNldCBDb25zdGFudCAwLjAwMDAwMAorMHgxMjMwMDY3YzogICAgICAweDAwMDAwMDAwOiAgICBHbG9iYWwgRGVwdGggT2Zmc2V0IFNjYWxlIDAuMDAwMDAwCisweDEyMzAwNjgwOiAgICAgIDB4MDAwMDAwMDA6ICAgIEdsb2JhbCBEZXB0aCBPZmZzZXQgQ2xhbXAgMC4wMDAwMDAKKzB4MTIzMDA2ODQ6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDEgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDAgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMDY4ODogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgMyAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgMiAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwNjhjOiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiA1IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiA0IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDA2OTA6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDcgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDYgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMDY5NDogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgOSAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgOCAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwNjk4OiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAxMSAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgMTAgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMDY5YzogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgMTMgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDEyIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDA2YTA6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDE1IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiAxNCAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwNmE0OiAgICAgIDB4MDAwMDAwMDA6ICAgIFBvaW50IFNwcml0ZSBUZXhDb29yZCBFbmFibGUKKzB4MTIzMDA2YTg6ICAgICAgMHgwMDAwMDAwMDogICAgQ29uc3QgSW50ZXJwIEVuYWJsZQorMHgxMjMwMDZhYzogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgNy0wIFdyYXBTaG9ydGVzdCBFbmFibGUKKzB4MTIzMDA2YjA6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDE1LTggV3JhcFNob3J0ZXN0IEVuYWJsZQorMHgxMjMwMDZiNDogICAgICAweDc4MTcwMDAzOiAzRFNUQVRFX0NPTlNUQU5UX1BTX1NUQVRFCisweDEyMzAwNmI4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDEKKzB4MTIzMDA2YmM6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMgorMHgxMjMwMDZjMDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAzCisweDEyMzAwNmM0OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDQKKzB4MTIzMDA2Yzg6ICAgICAgMHg3ODE0MDAwNzogM0RTVEFURV9XTQorMHgxMjMwMDZjYzogICAgICAweDAwMDAwOTAwOiAgICBrZXJuZWwgc3RhcnQgcG9pbnRlciAwCisweDEyMzAwNmQwOiAgICAgIDB4MDAwMTAwMDA6ICAgIFNQRj0wLCBWTUU9MCwgU2FtcGxlciBDb3VudCAwLCBCaW5kaW5nIHRhYmxlIGNvdW50IDAKKzB4MTIzMDA2ZDQ6ICAgICAgMHgwMDAwMDAwMDogICAgc2NyYXRjaCBvZmZzZXQKKzB4MTIzMDA2ZDg6ICAgICAgMHg4MDA2MDAwMDogICAgRGVwdGggQ2xlYXIgMCwgRGVwdGggUmVzb2x2ZSAwLCBIaVogUmVzb2x2ZSAwLCBEaXNwYXRjaCBHUkYgc3RhcnRbMF0gNiwgc3RhcnRbMV0gMCwgc3RhcnRbMl0gMAorMHgxMjMwMDZkYzogICAgICAweDRlMDg0MDAyOiAgICBNYXhUaHJlYWRzIDQwLCBQUyBLaWxsUGl4ZWwgMCwgUFMgY29tcHV0ZWQgWiAwLCBQUyB1c2Ugc291cmNlWiAwLCBUaHJlYWQgRGlzcGF0Y2ggMSwgUFMgdXNlIHNvdXJjZVcgMCwgRGlzcGF0Y2gzMiAwLCBEaXNwYXRjaDE2IDEsIERpc3BhdGNoOCAwCisweDEyMzAwNmUwOiAgICAgIDB4MDAxMDA0MDA6ICAgIE51bSBTRiBvdXRwdXQgMSwgUG9zIFhZIG9mZnNldCAwLCBaVyBpbnRlcnAgbW9kZSAwICwgQmFyeWNlbnRyaWMgaW50ZXJwIG1vZGUgMHgxLCBQb2ludCByYXN0ZXIgcnVsZSAwLCBNdWx0aXNhbXBsZSBtb2RlIDAsIE11bHRpc2FtcGxlIERpc3BhdGNoIG1vZGUgMAorMHgxMjMwMDZlNDogICAgICAweDAwMDAwMDAwOiAgICBrZXJuZWwgc3RhcnQgcG9pbnRlciAxCisweDEyMzAwNmU4OiAgICAgIDB4MDAwMDA5MDA6ICAgIGtlcm5lbCBzdGFydCBwb2ludGVyIDIKKzB4MTIzMDA2ZWM6ICAgICAgMHg3YjAwMjAwNDogM0RQUklNSVRJVkU6IHF1YWQgc3RyaXAgc2VxdWVudGlhbAorMHgxMjMwMDZmMDogICAgICAweDAwMDAwMDJhOiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDA2ZjQ6ICAgICAgMHgwMDAwMDBhMjogICAgc3RhcnQgdmVydGV4CisweDEyMzAwNmY4OiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwNmZjOiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwNzAwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDA3MDQ6ICAgICAgMHg3ODA1MDAwMTogM0RTVEFURV9VUkIKKzB4MTIzMDA3MDg6ICAgICAgMHgwMDAwMDEwMDogICAgVlMgZW50cmllcyAyNTYsIGFsbG9jIHNpemUgMSAoMTAyNGJpdCByb3cpCisweDEyMzAwNzBjOiAgICAgIDB4MDAwMDAwMDA6ICAgIEdTIGVudHJpZXMgMCwgYWxsb2Mgc2l6ZSAxICgxMDI0Yml0IHJvdykKKzB4MTIzMDA3MTA6ICAgICAgMHg3ODE1MTAwMzogM0RTVEFURV9DT05TVEFOVF9WU19TVEFURQorMHgxMjMwMDcxNDogICAgICAweDAwMDA3Mzg1OiAgICBkd29yZCAxCisweDEyMzAwNzE4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDIKKzB4MTIzMDA3MWM6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMworMHgxMjMwMDcyMDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCA0CisweDEyMzAwNzI0OiAgICAgIDB4NzgxMDAwMDQ6IDNEU1RBVEVfVlMKKzB4MTIzMDA3Mjg6ICAgICAgMHgwMDAwMDI0MDogICAga2VybmVsIHBvaW50ZXIKKzB4MTIzMDA3MmM6ICAgICAgMHgwMDAxMDAwMDogICAgU1BGPTAsIFZNRT0wLCBTYW1wbGVyIENvdW50IDAsIEJpbmRpbmcgdGFibGUgY291bnQgMAorMHgxMjMwMDczMDogICAgICAweDAwMDAwMDAwOiAgICBzY3JhdGNoIG9mZnNldAorMHgxMjMwMDczNDogICAgICAweDAwMTAwODAwOiAgICBEaXNwYXRjaCBHUkYgc3RhcnQgMSwgVlVFIHJlYWQgbGVuZ3RoIDEsIFZVRSByZWFkIG9mZnNldCAwCisweDEyMzAwNzM4OiAgICAgIDB4NzYwMDA0MDE6ICAgIE1heCBUaHJlYWRzIDYwLCBWZXJ0ZXggQ2FjaGUgZW5hYmxlLCBWUyBmdW5jIGVuYWJsZQorMHgxMjMwMDczYzogICAgICAweDdhMDAwMDAyOiBQSVBFX0NPTlRST0wKKzB4MTIzMDA3NDA6ICAgICAgMHgwMDEwMDAwMjogICAgbm8gd3JpdGUsIGNzIHN0YWxsLCBzdGFsbCBhdCBzY29yZWJvYXJkLCAKKzB4MTIzMDA3NDQ6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwNzQ4OiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDc0YzogICAgICAweDdhMDAwMDAyOiBQSVBFX0NPTlRST0wKKzB4MTIzMDA3NTA6ICAgICAgMHgwMDAwNDAwMDogICAgcXdvcmQgd3JpdGUsIAorMHgxMjMwMDc1NDogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDA3NTg6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwNzVjOiAgICAgIDB4N2EwMDAwMDI6IFBJUEVfQ09OVFJPTAorMHgxMjMwMDc2MDogICAgICAweDAwMDAyODA0OiAgICBubyB3cml0ZSwgZGVwdGggc3RhbGwsIGluc3RydWN0aW9uIGNhY2hlIGludmFsaWRhdGUsIHN0YXRlIGNhY2hlIGludmFsaWRhdGUsIAorMHgxMjMwMDc2NDogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDA3Njg6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwNzZjOiAgICAgIDB4NzgxMjAwMDI6IDNEU1RBVEVfQ0xJUAorMHgxMjMwMDc3MDogICAgICAweDAwMDAwNDAwOiAgICBVc2VyQ2xpcCBkaXN0YW5jZSBjdWxsIHRlc3QgbWFzayAweDAKKzB4MTIzMDA3NzQ6ICAgICAgMHg5ODAwMDAyNjogICAgQ2xpcCBlbmFibGUsIEFQSSBtb2RlIE9HTCwgVmlld3BvcnQgWFkgdGVzdCBlbmFibGUsIFZpZXdwb3J0IFogdGVzdCBlbmFibGUsIEd1YXJkYmFuZCB0ZXN0IGRpc2FibGUsIENsaXAgbW9kZSAwLCBQZXJzcGVjdGl2ZSBEaXZpZGUgZW5hYmxlLCBOb24tUGVyc3BlY3RpdmUgQmFyeWNlbnRyaWMgZGlzYWJsZSwgVHJpIFByb3Zva2luZyAyLCBMaW5lIFByb3Zva2luZyAxLCBUcmlmYW4gUHJvdm9raW5nIDIKKzB4MTIzMDA3Nzg6ICAgICAgMHgwMDAzZmZlMDogICAgTWluIFBvaW50V2lkdGggMSwgTWF4IFBvaW50V2lkdGggMjA0NywgRm9yY2UgWmVybyBSVEFJbmRleCBlbmFibGUsIE1heCBWUEluZGV4IDAKKzB4MTIzMDA3N2M6ICAgICAgMHg3ODEzMDAxMjogM0RTVEFURV9TRgorMHgxMjMwMDc4MDogICAgICAweDAwNjAwODEwOiAgICBBdHRyaWIgT3V0IDEsIEF0dHJpYiBTd2l6emxlIGVuYWJsZSwgVlVFIHJlYWQgbGVuZ3RoIDEsIFZVRSByZWFkIG9mZnNldCAxCisweDEyMzAwNzg0OiAgICAgIDB4MDAwMDA0MDM6ICAgIExlZ2FjeSBHbG9iYWwgRGVwdGhCaWFzIGRpc2FibGUsIEZyb250RmFjZSBmaWxsIDAsIEJGIGZpbGwgMCwgVlAgdHJhbnNmb3JtIGVuYWJsZSwgRnJvbnRXaW5kaW5nX0NDVworMHgxMjMwMDc4ODogICAgICAweDYyMDAwMDAwOiAgICBBQSBkaXNhYmxlLCBDdWxsTW9kZSAzLCBTY2lzc29yIGRpc2FibGUsIE11bHRpc2FtcGxlIG0gb2RlIDAKKzB4MTIzMDA3OGM6ICAgICAgMHg0YzAwMDgwODogICAgTGFzdCBQaXhlbCBkaXNhYmxlLCBTdWJQaXhlbCBQcmVjaXNpb24gOCwgVXNlIFBpeGVsV2lkdGggMQorMHgxMjMwMDc5MDogICAgICAweDAwMDAwMDAwOiAgICBHbG9iYWwgRGVwdGggT2Zmc2V0IENvbnN0YW50IDAuMDAwMDAwCisweDEyMzAwNzk0OiAgICAgIDB4MDAwMDAwMDA6ICAgIEdsb2JhbCBEZXB0aCBPZmZzZXQgU2NhbGUgMC4wMDAwMDAKKzB4MTIzMDA3OTg6ICAgICAgMHgwMDAwMDAwMDogICAgR2xvYmFsIERlcHRoIE9mZnNldCBDbGFtcCAwLjAwMDAwMAorMHgxMjMwMDc5YzogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgMSAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgMCAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwN2EwOiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAzIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiAyIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDA3YTQ6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDUgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDQgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMDdhODogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgNyAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgNiAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwN2FjOiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiA5IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiA4IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDA3YjA6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDExIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiAxMCAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwN2I0OiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAxMyAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgMTIgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMDdiODogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgMTUgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDE0IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDA3YmM6ICAgICAgMHgwMDAwMDAwMDogICAgUG9pbnQgU3ByaXRlIFRleENvb3JkIEVuYWJsZQorMHgxMjMwMDdjMDogICAgICAweDAwMDAwMDAxOiAgICBDb25zdCBJbnRlcnAgRW5hYmxlCisweDEyMzAwN2M0OiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiA3LTAgV3JhcFNob3J0ZXN0IEVuYWJsZQorMHgxMjMwMDdjODogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgMTUtOCBXcmFwU2hvcnRlc3QgRW5hYmxlCisweDEyMzAwN2NjOiAgICAgIDB4NzgxNzAwMDM6IDNEU1RBVEVfQ09OU1RBTlRfUFNfU1RBVEUKKzB4MTIzMDA3ZDA6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMQorMHgxMjMwMDdkNDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAyCisweDEyMzAwN2Q4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDMKKzB4MTIzMDA3ZGM6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgNAorMHgxMjMwMDdlMDogICAgICAweDc4MTQwMDA3OiAzRFNUQVRFX1dNCisweDEyMzAwN2U0OiAgICAgIDB4MDAwMDA1MDA6ICAgIGtlcm5lbCBzdGFydCBwb2ludGVyIDAKKzB4MTIzMDA3ZTg6ICAgICAgMHgwMDAxMDAwMDogICAgU1BGPTAsIFZNRT0wLCBTYW1wbGVyIENvdW50IDAsIEJpbmRpbmcgdGFibGUgY291bnQgMAorMHgxMjMwMDdlYzogICAgICAweDAwMDAwMDAwOiAgICBzY3JhdGNoIG9mZnNldAorMHgxMjMwMDdmMDogICAgICAweDgwMDIwMDAwOiAgICBEZXB0aCBDbGVhciAwLCBEZXB0aCBSZXNvbHZlIDAsIEhpWiBSZXNvbHZlIDAsIERpc3BhdGNoIEdSRiBzdGFydFswXSAyLCBzdGFydFsxXSAwLCBzdGFydFsyXSAwCisweDEyMzAwN2Y0OiAgICAgIDB4NGUwODQwMDI6ICAgIE1heFRocmVhZHMgNDAsIFBTIEtpbGxQaXhlbCAwLCBQUyBjb21wdXRlZCBaIDAsIFBTIHVzZSBzb3VyY2VaIDAsIFRocmVhZCBEaXNwYXRjaCAxLCBQUyB1c2Ugc291cmNlVyAwLCBEaXNwYXRjaDMyIDAsIERpc3BhdGNoMTYgMSwgRGlzcGF0Y2g4IDAKKzB4MTIzMDA3Zjg6ICAgICAgMHgwMDEwMDAwMDogICAgTnVtIFNGIG91dHB1dCAxLCBQb3MgWFkgb2Zmc2V0IDAsIFpXIGludGVycCBtb2RlIDAgLCBCYXJ5Y2VudHJpYyBpbnRlcnAgbW9kZSAweDAsIFBvaW50IHJhc3RlciBydWxlIDAsIE11bHRpc2FtcGxlIG1vZGUgMCwgTXVsdGlzYW1wbGUgRGlzcGF0Y2ggbW9kZSAwCisweDEyMzAwN2ZjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGtlcm5lbCBzdGFydCBwb2ludGVyIDEKKzB4MTIzMDA4MDA6ICAgICAgMHgwMDAwMDUwMDogICAga2VybmVsIHN0YXJ0IHBvaW50ZXIgMgorMHgxMjMwMDgwNDogICAgICAweDc4MDExMzAyOiAzRFNUQVRFX0JJTkRJTkdfVEFCTEVfUE9JTlRFUlM6IFZTIG1vZCAxLCBHUyBtb2QgMSwgUFMgbW9kIDEKKzB4MTIzMDA4MDg6ICAgICAgMHgwMDAwNzIwMDogICAgVlMgYmluZGluZyB0YWJsZQorMHgxMjMwMDgwYzogICAgICAweDAwMDA3MjAwOiAgICBHUyBiaW5kaW5nIHRhYmxlCisweDEyMzAwODEwOiAgICAgIDB4MDAwMDcyMDA6ICAgIFdNIGJpbmRpbmcgdGFibGUKKzB4MTIzMDA4MTQ6ICAgICAgMHg3ODA4MDAwMzogM0RTVEFURV9WRVJURVhfQlVGRkVSUworMHgxMjMwMDgxODogICAgICAweDAwMDAwMDBjOiAgICBidWZmZXIgMDogc2VxdWVudGlhbCwgcGl0Y2ggMTJiCisweDEyMzAwODFjOiAgICAgIDB4MDAwMDIyNjg6ICAgIGJ1ZmZlciBhZGRyZXNzCisweDEyMzAwODIwOiAgICAgIDB4MDAwMDdmZmY6ICAgIG1heCBpbmRleAorMHgxMjMwMDgyNDogICAgICAweDAwMDAwMDAwOiAgICBtYnoKKzB4MTIzMDA4Mjg6ICAgICAgMHg3ODA5MDAwMTogM0RTVEFURV9WRVJURVhfRUxFTUVOVFMKKzB4MTIzMDA4MmM6ICAgICAgMHgwMjQwMDAwMDogICAgYnVmZmVyIDA6IHZhbGlkLCB0eXBlIDB4MDA0MCwgc3JjIG9mZnNldCAweDAwMDAgYnl0ZXMKKzB4MTIzMDA4MzA6ICAgICAgMHgxMTEzMDAwMDogICAgKFgsIFksIFosIDEuMCksIGRzdCBvZmZzZXQgMHgwMCBieXRlcworMHgxMjMwMDgzNDogICAgICAweDdiMDAyMDA0OiAzRFBSSU1JVElWRTogcXVhZCBzdHJpcCBzZXF1ZW50aWFsCisweDEyMzAwODM4OiAgICAgIDB4MDAwMDAwMmE6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDgzYzogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDA4NDA6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDA4NDQ6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDA4NDg6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDg0YzogICAgICAweDdiMDAxYzA0OiAzRFBSSU1JVElWRTogcXVhZCBsaXN0IHNlcXVlbnRpYWwKKzB4MTIzMDA4NTA6ICAgICAgMHgwMDAwMDAyODogICAgdmVydGV4IGNvdW50CisweDEyMzAwODU0OiAgICAgIDB4MDAwMDAwMmE6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDg1ODogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDg1YzogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDg2MDogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwODY0OiAgICAgIDB4NzgxNTEwMDM6IDNEU1RBVEVfQ09OU1RBTlRfVlNfU1RBVEUKKzB4MTIzMDA4Njg6ICAgICAgMHgwMDAwNzBjNTogICAgZHdvcmQgMQorMHgxMjMwMDg2YzogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAyCisweDEyMzAwODcwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDMKKzB4MTIzMDA4NzQ6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgNAorMHgxMjMwMDg3ODogICAgICAweDc4MTAwMDA0OiAzRFNUQVRFX1ZTCisweDEyMzAwODdjOiAgICAgIDB4MDAwMDAyNDA6ICAgIGtlcm5lbCBwb2ludGVyCisweDEyMzAwODgwOiAgICAgIDB4MDAwMTAwMDA6ICAgIFNQRj0wLCBWTUU9MCwgU2FtcGxlciBDb3VudCAwLCBCaW5kaW5nIHRhYmxlIGNvdW50IDAKKzB4MTIzMDA4ODQ6ICAgICAgMHgwMDAwMDAwMDogICAgc2NyYXRjaCBvZmZzZXQKKzB4MTIzMDA4ODg6ICAgICAgMHgwMDEwMDgwMDogICAgRGlzcGF0Y2ggR1JGIHN0YXJ0IDEsIFZVRSByZWFkIGxlbmd0aCAxLCBWVUUgcmVhZCBvZmZzZXQgMAorMHgxMjMwMDg4YzogICAgICAweDc2MDAwNDAxOiAgICBNYXggVGhyZWFkcyA2MCwgVmVydGV4IENhY2hlIGVuYWJsZSwgVlMgZnVuYyBlbmFibGUKKzB4MTIzMDA4OTA6ICAgICAgMHg3YTAwMDAwMjogUElQRV9DT05UUk9MCisweDEyMzAwODk0OiAgICAgIDB4MDAxMDAwMDI6ICAgIG5vIHdyaXRlLCBjcyBzdGFsbCwgc3RhbGwgYXQgc2NvcmVib2FyZCwgCisweDEyMzAwODk4OiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDg5YzogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDA4YTA6ICAgICAgMHg3YTAwMDAwMjogUElQRV9DT05UUk9MCisweDEyMzAwOGE0OiAgICAgIDB4MDAwMDQwMDA6ICAgIHF3b3JkIHdyaXRlLCAKKzB4MTIzMDA4YTg6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwOGFjOiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDhiMDogICAgICAweDdhMDAwMDAyOiBQSVBFX0NPTlRST0wKKzB4MTIzMDA4YjQ6ICAgICAgMHgwMDAwMjgwNDogICAgbm8gd3JpdGUsIGRlcHRoIHN0YWxsLCBpbnN0cnVjdGlvbiBjYWNoZSBpbnZhbGlkYXRlLCBzdGF0ZSBjYWNoZSBpbnZhbGlkYXRlLCAKKzB4MTIzMDA4Yjg6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwOGJjOiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDhjMDogICAgICAweDc4MTcwMDAzOiAzRFNUQVRFX0NPTlNUQU5UX1BTX1NUQVRFCisweDEyMzAwOGM0OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDEKKzB4MTIzMDA4Yzg6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMgorMHgxMjMwMDhjYzogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAzCisweDEyMzAwOGQwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDQKKzB4MTIzMDA4ZDQ6ICAgICAgMHg3ODE0MDAwNzogM0RTVEFURV9XTQorMHgxMjMwMDhkODogICAgICAweDAwMDAwNTAwOiAgICBrZXJuZWwgc3RhcnQgcG9pbnRlciAwCisweDEyMzAwOGRjOiAgICAgIDB4MDAwMTAwMDA6ICAgIFNQRj0wLCBWTUU9MCwgU2FtcGxlciBDb3VudCAwLCBCaW5kaW5nIHRhYmxlIGNvdW50IDAKKzB4MTIzMDA4ZTA6ICAgICAgMHgwMDAwMDAwMDogICAgc2NyYXRjaCBvZmZzZXQKKzB4MTIzMDA4ZTQ6ICAgICAgMHg4MDAyMDAwMDogICAgRGVwdGggQ2xlYXIgMCwgRGVwdGggUmVzb2x2ZSAwLCBIaVogUmVzb2x2ZSAwLCBEaXNwYXRjaCBHUkYgc3RhcnRbMF0gMiwgc3RhcnRbMV0gMCwgc3RhcnRbMl0gMAorMHgxMjMwMDhlODogICAgICAweDRlMDg0MDAyOiAgICBNYXhUaHJlYWRzIDQwLCBQUyBLaWxsUGl4ZWwgMCwgUFMgY29tcHV0ZWQgWiAwLCBQUyB1c2Ugc291cmNlWiAwLCBUaHJlYWQgRGlzcGF0Y2ggMSwgUFMgdXNlIHNvdXJjZVcgMCwgRGlzcGF0Y2gzMiAwLCBEaXNwYXRjaDE2IDEsIERpc3BhdGNoOCAwCisweDEyMzAwOGVjOiAgICAgIDB4MDAxMDAwMDA6ICAgIE51bSBTRiBvdXRwdXQgMSwgUG9zIFhZIG9mZnNldCAwLCBaVyBpbnRlcnAgbW9kZSAwICwgQmFyeWNlbnRyaWMgaW50ZXJwIG1vZGUgMHgwLCBQb2ludCByYXN0ZXIgcnVsZSAwLCBNdWx0aXNhbXBsZSBtb2RlIDAsIE11bHRpc2FtcGxlIERpc3BhdGNoIG1vZGUgMAorMHgxMjMwMDhmMDogICAgICAweDAwMDAwMDAwOiAgICBrZXJuZWwgc3RhcnQgcG9pbnRlciAxCisweDEyMzAwOGY0OiAgICAgIDB4MDAwMDA1MDA6ICAgIGtlcm5lbCBzdGFydCBwb2ludGVyIDIKKzB4MTIzMDA4Zjg6ICAgICAgMHg3YjAwMjAwNDogM0RQUklNSVRJVkU6IHF1YWQgc3RyaXAgc2VxdWVudGlhbAorMHgxMjMwMDhmYzogICAgICAweDAwMDAwMDJhOiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDA5MDA6ICAgICAgMHgwMDAwMDA1MjogICAgc3RhcnQgdmVydGV4CisweDEyMzAwOTA0OiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwOTA4OiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwOTBjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDA5MTA6ICAgICAgMHg3YjAwMWMwNDogM0RQUklNSVRJVkU6IHF1YWQgbGlzdCBzZXF1ZW50aWFsCisweDEyMzAwOTE0OiAgICAgIDB4MDAwMDAwMjg6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDkxODogICAgICAweDAwMDAwMDdjOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDA5MWM6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDA5MjA6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDA5MjQ6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDkyODogICAgICAweDc4MDUwMDAxOiAzRFNUQVRFX1VSQgorMHgxMjMwMDkyYzogICAgICAweDAwMDAwMTAwOiAgICBWUyBlbnRyaWVzIDI1NiwgYWxsb2Mgc2l6ZSAxICgxMDI0Yml0IHJvdykKKzB4MTIzMDA5MzA6ICAgICAgMHgwMDAwMDAwMDogICAgR1MgZW50cmllcyAwLCBhbGxvYyBzaXplIDEgKDEwMjRiaXQgcm93KQorMHgxMjMwMDkzNDogICAgICAweDc4MTUxMDAzOiAzRFNUQVRFX0NPTlNUQU5UX1ZTX1NUQVRFCisweDEyMzAwOTM4OiAgICAgIDB4MDAwMDZmODU6ICAgIGR3b3JkIDEKKzB4MTIzMDA5M2M6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMgorMHgxMjMwMDk0MDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAzCisweDEyMzAwOTQ0OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDQKKzB4MTIzMDA5NDg6ICAgICAgMHg3ODEwMDAwNDogM0RTVEFURV9WUworMHgxMjMwMDk0YzogICAgICAweDAwMDAwNjQwOiAgICBrZXJuZWwgcG9pbnRlcgorMHgxMjMwMDk1MDogICAgICAweDAwMDEwMDAwOiAgICBTUEY9MCwgVk1FPTAsIFNhbXBsZXIgQ291bnQgMCwgQmluZGluZyB0YWJsZSBjb3VudCAwCisweDEyMzAwOTU0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHNjcmF0Y2ggb2Zmc2V0CisweDEyMzAwOTU4OiAgICAgIDB4MDAxMDA4MDA6ICAgIERpc3BhdGNoIEdSRiBzdGFydCAxLCBWVUUgcmVhZCBsZW5ndGggMSwgVlVFIHJlYWQgb2Zmc2V0IDAKKzB4MTIzMDA5NWM6ICAgICAgMHg3NjAwMDQwMTogICAgTWF4IFRocmVhZHMgNjAsIFZlcnRleCBDYWNoZSBlbmFibGUsIFZTIGZ1bmMgZW5hYmxlCisweDEyMzAwOTYwOiAgICAgIDB4N2EwMDAwMDI6IFBJUEVfQ09OVFJPTAorMHgxMjMwMDk2NDogICAgICAweDAwMTAwMDAyOiAgICBubyB3cml0ZSwgY3Mgc3RhbGwsIHN0YWxsIGF0IHNjb3JlYm9hcmQsIAorMHgxMjMwMDk2ODogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDA5NmM6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwOTcwOiAgICAgIDB4N2EwMDAwMDI6IFBJUEVfQ09OVFJPTAorMHgxMjMwMDk3NDogICAgICAweDAwMDA0MDAwOiAgICBxd29yZCB3cml0ZSwgCisweDEyMzAwOTc4OiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDk3YzogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDA5ODA6ICAgICAgMHg3YTAwMDAwMjogUElQRV9DT05UUk9MCisweDEyMzAwOTg0OiAgICAgIDB4MDAwMDI4MDQ6ICAgIG5vIHdyaXRlLCBkZXB0aCBzdGFsbCwgaW5zdHJ1Y3Rpb24gY2FjaGUgaW52YWxpZGF0ZSwgc3RhdGUgY2FjaGUgaW52YWxpZGF0ZSwgCisweDEyMzAwOTg4OiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDk4YzogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDA5OTA6ICAgICAgMHg3ODEzMDAxMjogM0RTVEFURV9TRgorMHgxMjMwMDk5NDogICAgICAweDAwNjAwODEwOiAgICBBdHRyaWIgT3V0IDEsIEF0dHJpYiBTd2l6emxlIGVuYWJsZSwgVlVFIHJlYWQgbGVuZ3RoIDEsIFZVRSByZWFkIG9mZnNldCAxCisweDEyMzAwOTk4OiAgICAgIDB4MDAwMDA0MDM6ICAgIExlZ2FjeSBHbG9iYWwgRGVwdGhCaWFzIGRpc2FibGUsIEZyb250RmFjZSBmaWxsIDAsIEJGIGZpbGwgMCwgVlAgdHJhbnNmb3JtIGVuYWJsZSwgRnJvbnRXaW5kaW5nX0NDVworMHgxMjMwMDk5YzogICAgICAweDYyMDAwMDAwOiAgICBBQSBkaXNhYmxlLCBDdWxsTW9kZSAzLCBTY2lzc29yIGRpc2FibGUsIE11bHRpc2FtcGxlIG0gb2RlIDAKKzB4MTIzMDA5YTA6ICAgICAgMHg0YzAwMDgwODogICAgTGFzdCBQaXhlbCBkaXNhYmxlLCBTdWJQaXhlbCBQcmVjaXNpb24gOCwgVXNlIFBpeGVsV2lkdGggMQorMHgxMjMwMDlhNDogICAgICAweDAwMDAwMDAwOiAgICBHbG9iYWwgRGVwdGggT2Zmc2V0IENvbnN0YW50IDAuMDAwMDAwCisweDEyMzAwOWE4OiAgICAgIDB4MDAwMDAwMDA6ICAgIEdsb2JhbCBEZXB0aCBPZmZzZXQgU2NhbGUgMC4wMDAwMDAKKzB4MTIzMDA5YWM6ICAgICAgMHgwMDAwMDAwMDogICAgR2xvYmFsIERlcHRoIE9mZnNldCBDbGFtcCAwLjAwMDAwMAorMHgxMjMwMDliMDogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgMSAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgMCAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwOWI0OiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAzIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiAyIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDA5Yjg6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDUgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDQgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMDliYzogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgNyAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgNiAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwOWMwOiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiA5IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiA4IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDA5YzQ6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDExIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiAxMCAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwOWM4OiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAxMyAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgMTIgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMDljYzogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgMTUgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDE0IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDA5ZDA6ICAgICAgMHgwMDAwMDAwMDogICAgUG9pbnQgU3ByaXRlIFRleENvb3JkIEVuYWJsZQorMHgxMjMwMDlkNDogICAgICAweDAwMDAwMDAxOiAgICBDb25zdCBJbnRlcnAgRW5hYmxlCisweDEyMzAwOWQ4OiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiA3LTAgV3JhcFNob3J0ZXN0IEVuYWJsZQorMHgxMjMwMDlkYzogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgMTUtOCBXcmFwU2hvcnRlc3QgRW5hYmxlCisweDEyMzAwOWUwOiAgICAgIDB4NzgwMTEzMDI6IDNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSUzogVlMgbW9kIDEsIEdTIG1vZCAxLCBQUyBtb2QgMQorMHgxMjMwMDllNDogICAgICAweDAwMDA2ZTAwOiAgICBWUyBiaW5kaW5nIHRhYmxlCisweDEyMzAwOWU4OiAgICAgIDB4MDAwMDZlMDA6ICAgIEdTIGJpbmRpbmcgdGFibGUKKzB4MTIzMDA5ZWM6ICAgICAgMHgwMDAwNmUwMDogICAgV00gYmluZGluZyB0YWJsZQorMHgxMjMwMDlmMDogICAgICAweDc4MDgwMDAzOiAzRFNUQVRFX1ZFUlRFWF9CVUZGRVJTCisweDEyMzAwOWY0OiAgICAgIDB4MDAwMDAwMTg6ICAgIGJ1ZmZlciAwOiBzZXF1ZW50aWFsLCBwaXRjaCAyNGIKKzB4MTIzMDA5Zjg6ICAgICAgMHgwMDAwMmEzMDogICAgYnVmZmVyIGFkZHJlc3MKKzB4MTIzMDA5ZmM6ICAgICAgMHgwMDAwN2ZmZjogICAgbWF4IGluZGV4CisweDEyMzAwYTAwOiAgICAgIDB4MDAwMDAwMDA6ICAgIG1iegorMHgxMjMwMGEwNDogICAgICAweDc4MDkwMDAzOiAzRFNUQVRFX1ZFUlRFWF9FTEVNRU5UUworMHgxMjMwMGEwODogICAgICAweDAyNDAwMDAwOiAgICBidWZmZXIgMDogdmFsaWQsIHR5cGUgMHgwMDQwLCBzcmMgb2Zmc2V0IDB4MDAwMCBieXRlcworMHgxMjMwMGEwYzogICAgICAweDExMTMwMDAwOiAgICAoWCwgWSwgWiwgMS4wKSwgZHN0IG9mZnNldCAweDAwIGJ5dGVzCisweDEyMzAwYTEwOiAgICAgIDB4MDI0MDAwMGM6ICAgIGJ1ZmZlciAwOiB2YWxpZCwgdHlwZSAweDAwNDAsIHNyYyBvZmZzZXQgMHgwMDBjIGJ5dGVzCisweDEyMzAwYTE0OiAgICAgIDB4MTExMzAwMDA6ICAgIChYLCBZLCBaLCAxLjApLCBkc3Qgb2Zmc2V0IDB4MDAgYnl0ZXMKKzB4MTIzMDBhMTg6ICAgICAgMHg3YjAwMjAwNDogM0RQUklNSVRJVkU6IHF1YWQgc3RyaXAgc2VxdWVudGlhbAorMHgxMjMwMGExYzogICAgICAweDAwMDAwMDUyOiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDBhMjA6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgdmVydGV4CisweDEyMzAwYTI0OiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwYTI4OiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwYTJjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDBhMzA6ICAgICAgMHg3ODE1MTAwMzogM0RTVEFURV9DT05TVEFOVF9WU19TVEFURQorMHgxMjMwMGEzNDogICAgICAweDAwMDA2Y2M1OiAgICBkd29yZCAxCisweDEyMzAwYTM4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDIKKzB4MTIzMDBhM2M6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMworMHgxMjMwMGE0MDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCA0CisweDEyMzAwYTQ0OiAgICAgIDB4NzgxMDAwMDQ6IDNEU1RBVEVfVlMKKzB4MTIzMDBhNDg6ICAgICAgMHgwMDAwMDY0MDogICAga2VybmVsIHBvaW50ZXIKKzB4MTIzMDBhNGM6ICAgICAgMHgwMDAxMDAwMDogICAgU1BGPTAsIFZNRT0wLCBTYW1wbGVyIENvdW50IDAsIEJpbmRpbmcgdGFibGUgY291bnQgMAorMHgxMjMwMGE1MDogICAgICAweDAwMDAwMDAwOiAgICBzY3JhdGNoIG9mZnNldAorMHgxMjMwMGE1NDogICAgICAweDAwMTAwODAwOiAgICBEaXNwYXRjaCBHUkYgc3RhcnQgMSwgVlVFIHJlYWQgbGVuZ3RoIDEsIFZVRSByZWFkIG9mZnNldCAwCisweDEyMzAwYTU4OiAgICAgIDB4NzYwMDA0MDE6ICAgIE1heCBUaHJlYWRzIDYwLCBWZXJ0ZXggQ2FjaGUgZW5hYmxlLCBWUyBmdW5jIGVuYWJsZQorMHgxMjMwMGE1YzogICAgICAweDdhMDAwMDAyOiBQSVBFX0NPTlRST0wKKzB4MTIzMDBhNjA6ICAgICAgMHgwMDEwMDAwMjogICAgbm8gd3JpdGUsIGNzIHN0YWxsLCBzdGFsbCBhdCBzY29yZWJvYXJkLCAKKzB4MTIzMDBhNjQ6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwYTY4OiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMGE2YzogICAgICAweDdhMDAwMDAyOiBQSVBFX0NPTlRST0wKKzB4MTIzMDBhNzA6ICAgICAgMHgwMDAwNDAwMDogICAgcXdvcmQgd3JpdGUsIAorMHgxMjMwMGE3NDogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDBhNzg6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwYTdjOiAgICAgIDB4N2EwMDAwMDI6IFBJUEVfQ09OVFJPTAorMHgxMjMwMGE4MDogICAgICAweDAwMDAyODA0OiAgICBubyB3cml0ZSwgZGVwdGggc3RhbGwsIGluc3RydWN0aW9uIGNhY2hlIGludmFsaWRhdGUsIHN0YXRlIGNhY2hlIGludmFsaWRhdGUsIAorMHgxMjMwMGE4NDogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDBhODg6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwYThjOiAgICAgIDB4NzgxMjAwMDI6IDNEU1RBVEVfQ0xJUAorMHgxMjMwMGE5MDogICAgICAweDAwMDAwNDAwOiAgICBVc2VyQ2xpcCBkaXN0YW5jZSBjdWxsIHRlc3QgbWFzayAweDAKKzB4MTIzMDBhOTQ6ICAgICAgMHg5ODAwMDAyNjogICAgQ2xpcCBlbmFibGUsIEFQSSBtb2RlIE9HTCwgVmlld3BvcnQgWFkgdGVzdCBlbmFibGUsIFZpZXdwb3J0IFogdGVzdCBlbmFibGUsIEd1YXJkYmFuZCB0ZXN0IGRpc2FibGUsIENsaXAgbW9kZSAwLCBQZXJzcGVjdGl2ZSBEaXZpZGUgZW5hYmxlLCBOb24tUGVyc3BlY3RpdmUgQmFyeWNlbnRyaWMgZGlzYWJsZSwgVHJpIFByb3Zva2luZyAyLCBMaW5lIFByb3Zva2luZyAxLCBUcmlmYW4gUHJvdm9raW5nIDIKKzB4MTIzMDBhOTg6ICAgICAgMHgwMDAzZmZlMDogICAgTWluIFBvaW50V2lkdGggMSwgTWF4IFBvaW50V2lkdGggMjA0NywgRm9yY2UgWmVybyBSVEFJbmRleCBlbmFibGUsIE1heCBWUEluZGV4IDAKKzB4MTIzMDBhOWM6ICAgICAgMHg3ODEzMDAxMjogM0RTVEFURV9TRgorMHgxMjMwMGFhMDogICAgICAweDAwNjAwODEwOiAgICBBdHRyaWIgT3V0IDEsIEF0dHJpYiBTd2l6emxlIGVuYWJsZSwgVlVFIHJlYWQgbGVuZ3RoIDEsIFZVRSByZWFkIG9mZnNldCAxCisweDEyMzAwYWE0OiAgICAgIDB4MDAwMDA0MDM6ICAgIExlZ2FjeSBHbG9iYWwgRGVwdGhCaWFzIGRpc2FibGUsIEZyb250RmFjZSBmaWxsIDAsIEJGIGZpbGwgMCwgVlAgdHJhbnNmb3JtIGVuYWJsZSwgRnJvbnRXaW5kaW5nX0NDVworMHgxMjMwMGFhODogICAgICAweDYyMDAwMDAwOiAgICBBQSBkaXNhYmxlLCBDdWxsTW9kZSAzLCBTY2lzc29yIGRpc2FibGUsIE11bHRpc2FtcGxlIG0gb2RlIDAKKzB4MTIzMDBhYWM6ICAgICAgMHg0YzAwMDgwODogICAgTGFzdCBQaXhlbCBkaXNhYmxlLCBTdWJQaXhlbCBQcmVjaXNpb24gOCwgVXNlIFBpeGVsV2lkdGggMQorMHgxMjMwMGFiMDogICAgICAweDAwMDAwMDAwOiAgICBHbG9iYWwgRGVwdGggT2Zmc2V0IENvbnN0YW50IDAuMDAwMDAwCisweDEyMzAwYWI0OiAgICAgIDB4MDAwMDAwMDA6ICAgIEdsb2JhbCBEZXB0aCBPZmZzZXQgU2NhbGUgMC4wMDAwMDAKKzB4MTIzMDBhYjg6ICAgICAgMHgwMDAwMDAwMDogICAgR2xvYmFsIERlcHRoIE9mZnNldCBDbGFtcCAwLjAwMDAwMAorMHgxMjMwMGFiYzogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgMSAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgMCAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwYWMwOiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAzIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiAyIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDBhYzQ6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDUgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDQgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMGFjODogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgNyAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgNiAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwYWNjOiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiA5IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiA4IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDBhZDA6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDExIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiAxMCAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwYWQ0OiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAxMyAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgMTIgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMGFkODogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgMTUgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDE0IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDBhZGM6ICAgICAgMHgwMDAwMDAwMDogICAgUG9pbnQgU3ByaXRlIFRleENvb3JkIEVuYWJsZQorMHgxMjMwMGFlMDogICAgICAweDAwMDAwMDAwOiAgICBDb25zdCBJbnRlcnAgRW5hYmxlCisweDEyMzAwYWU0OiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiA3LTAgV3JhcFNob3J0ZXN0IEVuYWJsZQorMHgxMjMwMGFlODogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgMTUtOCBXcmFwU2hvcnRlc3QgRW5hYmxlCisweDEyMzAwYWVjOiAgICAgIDB4NzgxNzAwMDM6IDNEU1RBVEVfQ09OU1RBTlRfUFNfU1RBVEUKKzB4MTIzMDBhZjA6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMQorMHgxMjMwMGFmNDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAyCisweDEyMzAwYWY4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDMKKzB4MTIzMDBhZmM6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgNAorMHgxMjMwMGIwMDogICAgICAweDc4MTQwMDA3OiAzRFNUQVRFX1dNCisweDEyMzAwYjA0OiAgICAgIDB4MDAwMDA5MDA6ICAgIGtlcm5lbCBzdGFydCBwb2ludGVyIDAKKzB4MTIzMDBiMDg6ICAgICAgMHgwMDAxMDAwMDogICAgU1BGPTAsIFZNRT0wLCBTYW1wbGVyIENvdW50IDAsIEJpbmRpbmcgdGFibGUgY291bnQgMAorMHgxMjMwMGIwYzogICAgICAweDAwMDAwMDAwOiAgICBzY3JhdGNoIG9mZnNldAorMHgxMjMwMGIxMDogICAgICAweDgwMDYwMDAwOiAgICBEZXB0aCBDbGVhciAwLCBEZXB0aCBSZXNvbHZlIDAsIEhpWiBSZXNvbHZlIDAsIERpc3BhdGNoIEdSRiBzdGFydFswXSA2LCBzdGFydFsxXSAwLCBzdGFydFsyXSAwCisweDEyMzAwYjE0OiAgICAgIDB4NGUwODQwMDI6ICAgIE1heFRocmVhZHMgNDAsIFBTIEtpbGxQaXhlbCAwLCBQUyBjb21wdXRlZCBaIDAsIFBTIHVzZSBzb3VyY2VaIDAsIFRocmVhZCBEaXNwYXRjaCAxLCBQUyB1c2Ugc291cmNlVyAwLCBEaXNwYXRjaDMyIDAsIERpc3BhdGNoMTYgMSwgRGlzcGF0Y2g4IDAKKzB4MTIzMDBiMTg6ICAgICAgMHgwMDEwMDQwMDogICAgTnVtIFNGIG91dHB1dCAxLCBQb3MgWFkgb2Zmc2V0IDAsIFpXIGludGVycCBtb2RlIDAgLCBCYXJ5Y2VudHJpYyBpbnRlcnAgbW9kZSAweDEsIFBvaW50IHJhc3RlciBydWxlIDAsIE11bHRpc2FtcGxlIG1vZGUgMCwgTXVsdGlzYW1wbGUgRGlzcGF0Y2ggbW9kZSAwCisweDEyMzAwYjFjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGtlcm5lbCBzdGFydCBwb2ludGVyIDEKKzB4MTIzMDBiMjA6ICAgICAgMHgwMDAwMDkwMDogICAga2VybmVsIHN0YXJ0IHBvaW50ZXIgMgorMHgxMjMwMGIyNDogICAgICAweDdiMDAyMDA0OiAzRFBSSU1JVElWRTogcXVhZCBzdHJpcCBzZXF1ZW50aWFsCisweDEyMzAwYjI4OiAgICAgIDB4MDAwMDAwMTY6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMGIyYzogICAgICAweDAwMDAwMDUyOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDBiMzA6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDBiMzQ6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDBiMzg6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMGIzYzogICAgICAweDc4MDUwMDAxOiAzRFNUQVRFX1VSQgorMHgxMjMwMGI0MDogICAgICAweDAwMDAwMTAwOiAgICBWUyBlbnRyaWVzIDI1NiwgYWxsb2Mgc2l6ZSAxICgxMDI0Yml0IHJvdykKKzB4MTIzMDBiNDQ6ICAgICAgMHgwMDAwMDAwMDogICAgR1MgZW50cmllcyAwLCBhbGxvYyBzaXplIDEgKDEwMjRiaXQgcm93KQorMHgxMjMwMGI0ODogICAgICAweDc4MTUxMDAzOiAzRFNUQVRFX0NPTlNUQU5UX1ZTX1NUQVRFCisweDEyMzAwYjRjOiAgICAgIDB4MDAwMDZiODU6ICAgIGR3b3JkIDEKKzB4MTIzMDBiNTA6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMgorMHgxMjMwMGI1NDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAzCisweDEyMzAwYjU4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDQKKzB4MTIzMDBiNWM6ICAgICAgMHg3ODEwMDAwNDogM0RTVEFURV9WUworMHgxMjMwMGI2MDogICAgICAweDAwMDAwMjQwOiAgICBrZXJuZWwgcG9pbnRlcgorMHgxMjMwMGI2NDogICAgICAweDAwMDEwMDAwOiAgICBTUEY9MCwgVk1FPTAsIFNhbXBsZXIgQ291bnQgMCwgQmluZGluZyB0YWJsZSBjb3VudCAwCisweDEyMzAwYjY4OiAgICAgIDB4MDAwMDAwMDA6ICAgIHNjcmF0Y2ggb2Zmc2V0CisweDEyMzAwYjZjOiAgICAgIDB4MDAxMDA4MDA6ICAgIERpc3BhdGNoIEdSRiBzdGFydCAxLCBWVUUgcmVhZCBsZW5ndGggMSwgVlVFIHJlYWQgb2Zmc2V0IDAKKzB4MTIzMDBiNzA6ICAgICAgMHg3NjAwMDQwMTogICAgTWF4IFRocmVhZHMgNjAsIFZlcnRleCBDYWNoZSBlbmFibGUsIFZTIGZ1bmMgZW5hYmxlCisweDEyMzAwYjc0OiAgICAgIDB4N2EwMDAwMDI6IFBJUEVfQ09OVFJPTAorMHgxMjMwMGI3ODogICAgICAweDAwMTAwMDAyOiAgICBubyB3cml0ZSwgY3Mgc3RhbGwsIHN0YWxsIGF0IHNjb3JlYm9hcmQsIAorMHgxMjMwMGI3YzogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDBiODA6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwYjg0OiAgICAgIDB4N2EwMDAwMDI6IFBJUEVfQ09OVFJPTAorMHgxMjMwMGI4ODogICAgICAweDAwMDA0MDAwOiAgICBxd29yZCB3cml0ZSwgCisweDEyMzAwYjhjOiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMGI5MDogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDBiOTQ6ICAgICAgMHg3YTAwMDAwMjogUElQRV9DT05UUk9MCisweDEyMzAwYjk4OiAgICAgIDB4MDAwMDI4MDQ6ICAgIG5vIHdyaXRlLCBkZXB0aCBzdGFsbCwgaW5zdHJ1Y3Rpb24gY2FjaGUgaW52YWxpZGF0ZSwgc3RhdGUgY2FjaGUgaW52YWxpZGF0ZSwgCisweDEyMzAwYjljOiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMGJhMDogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDBiYTQ6ICAgICAgMHg3ODEyMDAwMjogM0RTVEFURV9DTElQCisweDEyMzAwYmE4OiAgICAgIDB4MDAwMDA0MDA6ICAgIFVzZXJDbGlwIGRpc3RhbmNlIGN1bGwgdGVzdCBtYXNrIDB4MAorMHgxMjMwMGJhYzogICAgICAweDk4MDAwMDI2OiAgICBDbGlwIGVuYWJsZSwgQVBJIG1vZGUgT0dMLCBWaWV3cG9ydCBYWSB0ZXN0IGVuYWJsZSwgVmlld3BvcnQgWiB0ZXN0IGVuYWJsZSwgR3VhcmRiYW5kIHRlc3QgZGlzYWJsZSwgQ2xpcCBtb2RlIDAsIFBlcnNwZWN0aXZlIERpdmlkZSBlbmFibGUsIE5vbi1QZXJzcGVjdGl2ZSBCYXJ5Y2VudHJpYyBkaXNhYmxlLCBUcmkgUHJvdm9raW5nIDIsIExpbmUgUHJvdm9raW5nIDEsIFRyaWZhbiBQcm92b2tpbmcgMgorMHgxMjMwMGJiMDogICAgICAweDAwMDNmZmUwOiAgICBNaW4gUG9pbnRXaWR0aCAxLCBNYXggUG9pbnRXaWR0aCAyMDQ3LCBGb3JjZSBaZXJvIFJUQUluZGV4IGVuYWJsZSwgTWF4IFZQSW5kZXggMAorMHgxMjMwMGJiNDogICAgICAweDc4MTMwMDEyOiAzRFNUQVRFX1NGCisweDEyMzAwYmI4OiAgICAgIDB4MDA2MDA4MTA6ICAgIEF0dHJpYiBPdXQgMSwgQXR0cmliIFN3aXp6bGUgZW5hYmxlLCBWVUUgcmVhZCBsZW5ndGggMSwgVlVFIHJlYWQgb2Zmc2V0IDEKKzB4MTIzMDBiYmM6ICAgICAgMHgwMDAwMDQwMzogICAgTGVnYWN5IEdsb2JhbCBEZXB0aEJpYXMgZGlzYWJsZSwgRnJvbnRGYWNlIGZpbGwgMCwgQkYgZmlsbCAwLCBWUCB0cmFuc2Zvcm0gZW5hYmxlLCBGcm9udFdpbmRpbmdfQ0NXCisweDEyMzAwYmMwOiAgICAgIDB4NjIwMDAwMDA6ICAgIEFBIGRpc2FibGUsIEN1bGxNb2RlIDMsIFNjaXNzb3IgZGlzYWJsZSwgTXVsdGlzYW1wbGUgbSBvZGUgMAorMHgxMjMwMGJjNDogICAgICAweDRjMDAwODA4OiAgICBMYXN0IFBpeGVsIGRpc2FibGUsIFN1YlBpeGVsIFByZWNpc2lvbiA4LCBVc2UgUGl4ZWxXaWR0aCAxCisweDEyMzAwYmM4OiAgICAgIDB4MDAwMDAwMDA6ICAgIEdsb2JhbCBEZXB0aCBPZmZzZXQgQ29uc3RhbnQgMC4wMDAwMDAKKzB4MTIzMDBiY2M6ICAgICAgMHgwMDAwMDAwMDogICAgR2xvYmFsIERlcHRoIE9mZnNldCBTY2FsZSAwLjAwMDAwMAorMHgxMjMwMGJkMDogICAgICAweDAwMDAwMDAwOiAgICBHbG9iYWwgRGVwdGggT2Zmc2V0IENsYW1wIDAuMDAwMDAwCisweDEyMzAwYmQ0OiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAxIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiAwIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDBiZDg6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDMgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDIgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMGJkYzogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgNSAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgNCAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwYmUwOiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiA3IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiA2IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDBiZTQ6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDkgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDggKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMGJlODogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgMTEgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDEwIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDBiZWM6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDEzIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiAxMiAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwYmYwOiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAxNSAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgMTQgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMGJmNDogICAgICAweDAwMDAwMDAwOiAgICBQb2ludCBTcHJpdGUgVGV4Q29vcmQgRW5hYmxlCisweDEyMzAwYmY4OiAgICAgIDB4MDAwMDAwMDE6ICAgIENvbnN0IEludGVycCBFbmFibGUKKzB4MTIzMDBiZmM6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDctMCBXcmFwU2hvcnRlc3QgRW5hYmxlCisweDEyMzAwYzAwOiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAxNS04IFdyYXBTaG9ydGVzdCBFbmFibGUKKzB4MTIzMDBjMDQ6ICAgICAgMHg3ODE3MDAwMzogM0RTVEFURV9DT05TVEFOVF9QU19TVEFURQorMHgxMjMwMGMwODogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAxCisweDEyMzAwYzBjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDIKKzB4MTIzMDBjMTA6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMworMHgxMjMwMGMxNDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCA0CisweDEyMzAwYzE4OiAgICAgIDB4NzgxNDAwMDc6IDNEU1RBVEVfV00KKzB4MTIzMDBjMWM6ICAgICAgMHgwMDAwMDUwMDogICAga2VybmVsIHN0YXJ0IHBvaW50ZXIgMAorMHgxMjMwMGMyMDogICAgICAweDAwMDEwMDAwOiAgICBTUEY9MCwgVk1FPTAsIFNhbXBsZXIgQ291bnQgMCwgQmluZGluZyB0YWJsZSBjb3VudCAwCisweDEyMzAwYzI0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHNjcmF0Y2ggb2Zmc2V0CisweDEyMzAwYzI4OiAgICAgIDB4ODAwMjAwMDA6ICAgIERlcHRoIENsZWFyIDAsIERlcHRoIFJlc29sdmUgMCwgSGlaIFJlc29sdmUgMCwgRGlzcGF0Y2ggR1JGIHN0YXJ0WzBdIDIsIHN0YXJ0WzFdIDAsIHN0YXJ0WzJdIDAKKzB4MTIzMDBjMmM6ICAgICAgMHg0ZTA4NDAwMjogICAgTWF4VGhyZWFkcyA0MCwgUFMgS2lsbFBpeGVsIDAsIFBTIGNvbXB1dGVkIFogMCwgUFMgdXNlIHNvdXJjZVogMCwgVGhyZWFkIERpc3BhdGNoIDEsIFBTIHVzZSBzb3VyY2VXIDAsIERpc3BhdGNoMzIgMCwgRGlzcGF0Y2gxNiAxLCBEaXNwYXRjaDggMAorMHgxMjMwMGMzMDogICAgICAweDAwMTAwMDAwOiAgICBOdW0gU0Ygb3V0cHV0IDEsIFBvcyBYWSBvZmZzZXQgMCwgWlcgaW50ZXJwIG1vZGUgMCAsIEJhcnljZW50cmljIGludGVycCBtb2RlIDB4MCwgUG9pbnQgcmFzdGVyIHJ1bGUgMCwgTXVsdGlzYW1wbGUgbW9kZSAwLCBNdWx0aXNhbXBsZSBEaXNwYXRjaCBtb2RlIDAKKzB4MTIzMDBjMzQ6ICAgICAgMHgwMDAwMDAwMDogICAga2VybmVsIHN0YXJ0IHBvaW50ZXIgMQorMHgxMjMwMGMzODogICAgICAweDAwMDAwNTAwOiAgICBrZXJuZWwgc3RhcnQgcG9pbnRlciAyCisweDEyMzAwYzNjOiAgICAgIDB4NzgwMTEzMDI6IDNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSUzogVlMgbW9kIDEsIEdTIG1vZCAxLCBQUyBtb2QgMQorMHgxMjMwMGM0MDogICAgICAweDAwMDA2YTAwOiAgICBWUyBiaW5kaW5nIHRhYmxlCisweDEyMzAwYzQ0OiAgICAgIDB4MDAwMDZhMDA6ICAgIEdTIGJpbmRpbmcgdGFibGUKKzB4MTIzMDBjNDg6ICAgICAgMHgwMDAwNmEwMDogICAgV00gYmluZGluZyB0YWJsZQorMHgxMjMwMGM0YzogICAgICAweDc4MDgwMDAzOiAzRFNUQVRFX1ZFUlRFWF9CVUZGRVJTCisweDEyMzAwYzUwOiAgICAgIDB4MDAwMDAwMGM6ICAgIGJ1ZmZlciAwOiBzZXF1ZW50aWFsLCBwaXRjaCAxMmIKKzB4MTIzMDBjNTQ6ICAgICAgMHgwMDAwMzNmMDogICAgYnVmZmVyIGFkZHJlc3MKKzB4MTIzMDBjNTg6ICAgICAgMHgwMDAwN2ZmZjogICAgbWF4IGluZGV4CisweDEyMzAwYzVjOiAgICAgIDB4MDAwMDAwMDA6ICAgIG1iegorMHgxMjMwMGM2MDogICAgICAweDc4MDkwMDAxOiAzRFNUQVRFX1ZFUlRFWF9FTEVNRU5UUworMHgxMjMwMGM2NDogICAgICAweDAyNDAwMDAwOiAgICBidWZmZXIgMDogdmFsaWQsIHR5cGUgMHgwMDQwLCBzcmMgb2Zmc2V0IDB4MDAwMCBieXRlcworMHgxMjMwMGM2ODogICAgICAweDExMTMwMDAwOiAgICAoWCwgWSwgWiwgMS4wKSwgZHN0IG9mZnNldCAweDAwIGJ5dGVzCisweDEyMzAwYzZjOiAgICAgIDB4N2IwMDIwMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIHN0cmlwIHNlcXVlbnRpYWwKKzB4MTIzMDBjNzA6ICAgICAgMHgwMDAwMDAyYTogICAgdmVydGV4IGNvdW50CisweDEyMzAwYzc0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMGM3ODogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMGM3YzogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMGM4MDogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwYzg0OiAgICAgIDB4N2IwMDFjMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIGxpc3Qgc2VxdWVudGlhbAorMHgxMjMwMGM4ODogICAgICAweDAwMDAwMDI4OiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDBjOGM6ICAgICAgMHgwMDAwMDAyYTogICAgc3RhcnQgdmVydGV4CisweDEyMzAwYzkwOiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwYzk0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwYzk4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDBjOWM6ICAgICAgMHg3ODE1MTAwMzogM0RTVEFURV9DT05TVEFOVF9WU19TVEFURQorMHgxMjMwMGNhMDogICAgICAweDAwMDA2OGM1OiAgICBkd29yZCAxCisweDEyMzAwY2E0OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDIKKzB4MTIzMDBjYTg6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMworMHgxMjMwMGNhYzogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCA0CisweDEyMzAwY2IwOiAgICAgIDB4NzgxMDAwMDQ6IDNEU1RBVEVfVlMKKzB4MTIzMDBjYjQ6ICAgICAgMHgwMDAwMDI0MDogICAga2VybmVsIHBvaW50ZXIKKzB4MTIzMDBjYjg6ICAgICAgMHgwMDAxMDAwMDogICAgU1BGPTAsIFZNRT0wLCBTYW1wbGVyIENvdW50IDAsIEJpbmRpbmcgdGFibGUgY291bnQgMAorMHgxMjMwMGNiYzogICAgICAweDAwMDAwMDAwOiAgICBzY3JhdGNoIG9mZnNldAorMHgxMjMwMGNjMDogICAgICAweDAwMTAwODAwOiAgICBEaXNwYXRjaCBHUkYgc3RhcnQgMSwgVlVFIHJlYWQgbGVuZ3RoIDEsIFZVRSByZWFkIG9mZnNldCAwCisweDEyMzAwY2M0OiAgICAgIDB4NzYwMDA0MDE6ICAgIE1heCBUaHJlYWRzIDYwLCBWZXJ0ZXggQ2FjaGUgZW5hYmxlLCBWUyBmdW5jIGVuYWJsZQorMHgxMjMwMGNjODogICAgICAweDdhMDAwMDAyOiBQSVBFX0NPTlRST0wKKzB4MTIzMDBjY2M6ICAgICAgMHgwMDEwMDAwMjogICAgbm8gd3JpdGUsIGNzIHN0YWxsLCBzdGFsbCBhdCBzY29yZWJvYXJkLCAKKzB4MTIzMDBjZDA6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwY2Q0OiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMGNkODogICAgICAweDdhMDAwMDAyOiBQSVBFX0NPTlRST0wKKzB4MTIzMDBjZGM6ICAgICAgMHgwMDAwNDAwMDogICAgcXdvcmQgd3JpdGUsIAorMHgxMjMwMGNlMDogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDBjZTQ6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwY2U4OiAgICAgIDB4N2EwMDAwMDI6IFBJUEVfQ09OVFJPTAorMHgxMjMwMGNlYzogICAgICAweDAwMDAyODA0OiAgICBubyB3cml0ZSwgZGVwdGggc3RhbGwsIGluc3RydWN0aW9uIGNhY2hlIGludmFsaWRhdGUsIHN0YXRlIGNhY2hlIGludmFsaWRhdGUsIAorMHgxMjMwMGNmMDogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDBjZjQ6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwY2Y4OiAgICAgIDB4NzgxNzAwMDM6IDNEU1RBVEVfQ09OU1RBTlRfUFNfU1RBVEUKKzB4MTIzMDBjZmM6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMQorMHgxMjMwMGQwMDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAyCisweDEyMzAwZDA0OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDMKKzB4MTIzMDBkMDg6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgNAorMHgxMjMwMGQwYzogICAgICAweDc4MTQwMDA3OiAzRFNUQVRFX1dNCisweDEyMzAwZDEwOiAgICAgIDB4MDAwMDA1MDA6ICAgIGtlcm5lbCBzdGFydCBwb2ludGVyIDAKKzB4MTIzMDBkMTQ6ICAgICAgMHgwMDAxMDAwMDogICAgU1BGPTAsIFZNRT0wLCBTYW1wbGVyIENvdW50IDAsIEJpbmRpbmcgdGFibGUgY291bnQgMAorMHgxMjMwMGQxODogICAgICAweDAwMDAwMDAwOiAgICBzY3JhdGNoIG9mZnNldAorMHgxMjMwMGQxYzogICAgICAweDgwMDIwMDAwOiAgICBEZXB0aCBDbGVhciAwLCBEZXB0aCBSZXNvbHZlIDAsIEhpWiBSZXNvbHZlIDAsIERpc3BhdGNoIEdSRiBzdGFydFswXSAyLCBzdGFydFsxXSAwLCBzdGFydFsyXSAwCisweDEyMzAwZDIwOiAgICAgIDB4NGUwODQwMDI6ICAgIE1heFRocmVhZHMgNDAsIFBTIEtpbGxQaXhlbCAwLCBQUyBjb21wdXRlZCBaIDAsIFBTIHVzZSBzb3VyY2VaIDAsIFRocmVhZCBEaXNwYXRjaCAxLCBQUyB1c2Ugc291cmNlVyAwLCBEaXNwYXRjaDMyIDAsIERpc3BhdGNoMTYgMSwgRGlzcGF0Y2g4IDAKKzB4MTIzMDBkMjQ6ICAgICAgMHgwMDEwMDAwMDogICAgTnVtIFNGIG91dHB1dCAxLCBQb3MgWFkgb2Zmc2V0IDAsIFpXIGludGVycCBtb2RlIDAgLCBCYXJ5Y2VudHJpYyBpbnRlcnAgbW9kZSAweDAsIFBvaW50IHJhc3RlciBydWxlIDAsIE11bHRpc2FtcGxlIG1vZGUgMCwgTXVsdGlzYW1wbGUgRGlzcGF0Y2ggbW9kZSAwCisweDEyMzAwZDI4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGtlcm5lbCBzdGFydCBwb2ludGVyIDEKKzB4MTIzMDBkMmM6ICAgICAgMHgwMDAwMDUwMDogICAga2VybmVsIHN0YXJ0IHBvaW50ZXIgMgorMHgxMjMwMGQzMDogICAgICAweDdiMDAyMDA0OiAzRFBSSU1JVElWRTogcXVhZCBzdHJpcCBzZXF1ZW50aWFsCisweDEyMzAwZDM0OiAgICAgIDB4MDAwMDAwMmE6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMGQzODogICAgICAweDAwMDAwMDUyOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDBkM2M6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDBkNDA6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDBkNDQ6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMGQ0ODogICAgICAweDdiMDAxYzA0OiAzRFBSSU1JVElWRTogcXVhZCBsaXN0IHNlcXVlbnRpYWwKKzB4MTIzMDBkNGM6ICAgICAgMHgwMDAwMDAyODogICAgdmVydGV4IGNvdW50CisweDEyMzAwZDUwOiAgICAgIDB4MDAwMDAwN2M6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMGQ1NDogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMGQ1ODogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMGQ1YzogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwZDYwOiAgICAgIDB4NzgwNTAwMDE6IDNEU1RBVEVfVVJCCisweDEyMzAwZDY0OiAgICAgIDB4MDAwMDAxMDA6ICAgIFZTIGVudHJpZXMgMjU2LCBhbGxvYyBzaXplIDEgKDEwMjRiaXQgcm93KQorMHgxMjMwMGQ2ODogICAgICAweDAwMDAwMDAwOiAgICBHUyBlbnRyaWVzIDAsIGFsbG9jIHNpemUgMSAoMTAyNGJpdCByb3cpCisweDEyMzAwZDZjOiAgICAgIDB4NzgxNTEwMDM6IDNEU1RBVEVfQ09OU1RBTlRfVlNfU1RBVEUKKzB4MTIzMDBkNzA6ICAgICAgMHgwMDAwNjc4NTogICAgZHdvcmQgMQorMHgxMjMwMGQ3NDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAyCisweDEyMzAwZDc4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDMKKzB4MTIzMDBkN2M6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgNAorMHgxMjMwMGQ4MDogICAgICAweDc4MTAwMDA0OiAzRFNUQVRFX1ZTCisweDEyMzAwZDg0OiAgICAgIDB4MDAwMDA2NDA6ICAgIGtlcm5lbCBwb2ludGVyCisweDEyMzAwZDg4OiAgICAgIDB4MDAwMTAwMDA6ICAgIFNQRj0wLCBWTUU9MCwgU2FtcGxlciBDb3VudCAwLCBCaW5kaW5nIHRhYmxlIGNvdW50IDAKKzB4MTIzMDBkOGM6ICAgICAgMHgwMDAwMDAwMDogICAgc2NyYXRjaCBvZmZzZXQKKzB4MTIzMDBkOTA6ICAgICAgMHgwMDEwMDgwMDogICAgRGlzcGF0Y2ggR1JGIHN0YXJ0IDEsIFZVRSByZWFkIGxlbmd0aCAxLCBWVUUgcmVhZCBvZmZzZXQgMAorMHgxMjMwMGQ5NDogICAgICAweDc2MDAwNDAxOiAgICBNYXggVGhyZWFkcyA2MCwgVmVydGV4IENhY2hlIGVuYWJsZSwgVlMgZnVuYyBlbmFibGUKKzB4MTIzMDBkOTg6ICAgICAgMHg3YTAwMDAwMjogUElQRV9DT05UUk9MCisweDEyMzAwZDljOiAgICAgIDB4MDAxMDAwMDI6ICAgIG5vIHdyaXRlLCBjcyBzdGFsbCwgc3RhbGwgYXQgc2NvcmVib2FyZCwgCisweDEyMzAwZGEwOiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMGRhNDogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDBkYTg6ICAgICAgMHg3YTAwMDAwMjogUElQRV9DT05UUk9MCisweDEyMzAwZGFjOiAgICAgIDB4MDAwMDQwMDA6ICAgIHF3b3JkIHdyaXRlLCAKKzB4MTIzMDBkYjA6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwZGI0OiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMGRiODogICAgICAweDdhMDAwMDAyOiBQSVBFX0NPTlRST0wKKzB4MTIzMDBkYmM6ICAgICAgMHgwMDAwMjgwNDogICAgbm8gd3JpdGUsIGRlcHRoIHN0YWxsLCBpbnN0cnVjdGlvbiBjYWNoZSBpbnZhbGlkYXRlLCBzdGF0ZSBjYWNoZSBpbnZhbGlkYXRlLCAKKzB4MTIzMDBkYzA6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwZGM0OiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMGRjODogICAgICAweDc4MTMwMDEyOiAzRFNUQVRFX1NGCisweDEyMzAwZGNjOiAgICAgIDB4MDA2MDA4MTA6ICAgIEF0dHJpYiBPdXQgMSwgQXR0cmliIFN3aXp6bGUgZW5hYmxlLCBWVUUgcmVhZCBsZW5ndGggMSwgVlVFIHJlYWQgb2Zmc2V0IDEKKzB4MTIzMDBkZDA6ICAgICAgMHgwMDAwMDQwMzogICAgTGVnYWN5IEdsb2JhbCBEZXB0aEJpYXMgZGlzYWJsZSwgRnJvbnRGYWNlIGZpbGwgMCwgQkYgZmlsbCAwLCBWUCB0cmFuc2Zvcm0gZW5hYmxlLCBGcm9udFdpbmRpbmdfQ0NXCisweDEyMzAwZGQ0OiAgICAgIDB4NjIwMDAwMDA6ICAgIEFBIGRpc2FibGUsIEN1bGxNb2RlIDMsIFNjaXNzb3IgZGlzYWJsZSwgTXVsdGlzYW1wbGUgbSBvZGUgMAorMHgxMjMwMGRkODogICAgICAweDRjMDAwODA4OiAgICBMYXN0IFBpeGVsIGRpc2FibGUsIFN1YlBpeGVsIFByZWNpc2lvbiA4LCBVc2UgUGl4ZWxXaWR0aCAxCisweDEyMzAwZGRjOiAgICAgIDB4MDAwMDAwMDA6ICAgIEdsb2JhbCBEZXB0aCBPZmZzZXQgQ29uc3RhbnQgMC4wMDAwMDAKKzB4MTIzMDBkZTA6ICAgICAgMHgwMDAwMDAwMDogICAgR2xvYmFsIERlcHRoIE9mZnNldCBTY2FsZSAwLjAwMDAwMAorMHgxMjMwMGRlNDogICAgICAweDAwMDAwMDAwOiAgICBHbG9iYWwgRGVwdGggT2Zmc2V0IENsYW1wIDAuMDAwMDAwCisweDEyMzAwZGU4OiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAxIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiAwIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDBkZWM6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDMgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDIgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMGRmMDogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgNSAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgNCAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwZGY0OiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiA3IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiA2IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDBkZjg6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDkgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDggKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMGRmYzogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgMTEgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDEwIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDBlMDA6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDEzIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiAxMiAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwZTA0OiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAxNSAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgMTQgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMGUwODogICAgICAweDAwMDAwMDAwOiAgICBQb2ludCBTcHJpdGUgVGV4Q29vcmQgRW5hYmxlCisweDEyMzAwZTBjOiAgICAgIDB4MDAwMDAwMDE6ICAgIENvbnN0IEludGVycCBFbmFibGUKKzB4MTIzMDBlMTA6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDctMCBXcmFwU2hvcnRlc3QgRW5hYmxlCisweDEyMzAwZTE0OiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAxNS04IFdyYXBTaG9ydGVzdCBFbmFibGUKKzB4MTIzMDBlMTg6ICAgICAgMHg3ODAxMTMwMjogM0RTVEFURV9CSU5ESU5HX1RBQkxFX1BPSU5URVJTOiBWUyBtb2QgMSwgR1MgbW9kIDEsIFBTIG1vZCAxCisweDEyMzAwZTFjOiAgICAgIDB4MDAwMDY2MDA6ICAgIFZTIGJpbmRpbmcgdGFibGUKKzB4MTIzMDBlMjA6ICAgICAgMHgwMDAwNjYwMDogICAgR1MgYmluZGluZyB0YWJsZQorMHgxMjMwMGUyNDogICAgICAweDAwMDA2NjAwOiAgICBXTSBiaW5kaW5nIHRhYmxlCisweDEyMzAwZTI4OiAgICAgIDB4NzgwODAwMDM6IDNEU1RBVEVfVkVSVEVYX0JVRkZFUlMKKzB4MTIzMDBlMmM6ICAgICAgMHgwMDAwMDAxODogICAgYnVmZmVyIDA6IHNlcXVlbnRpYWwsIHBpdGNoIDI0YgorMHgxMjMwMGUzMDogICAgICAweDAwMDAzYmI4OiAgICBidWZmZXIgYWRkcmVzcworMHgxMjMwMGUzNDogICAgICAweDAwMDA3ZmZmOiAgICBtYXggaW5kZXgKKzB4MTIzMDBlMzg6ICAgICAgMHgwMDAwMDAwMDogICAgbWJ6CisweDEyMzAwZTNjOiAgICAgIDB4NzgwOTAwMDM6IDNEU1RBVEVfVkVSVEVYX0VMRU1FTlRTCisweDEyMzAwZTQwOiAgICAgIDB4MDI0MDAwMDA6ICAgIGJ1ZmZlciAwOiB2YWxpZCwgdHlwZSAweDAwNDAsIHNyYyBvZmZzZXQgMHgwMDAwIGJ5dGVzCisweDEyMzAwZTQ0OiAgICAgIDB4MTExMzAwMDA6ICAgIChYLCBZLCBaLCAxLjApLCBkc3Qgb2Zmc2V0IDB4MDAgYnl0ZXMKKzB4MTIzMDBlNDg6ICAgICAgMHgwMjQwMDAwYzogICAgYnVmZmVyIDA6IHZhbGlkLCB0eXBlIDB4MDA0MCwgc3JjIG9mZnNldCAweDAwMGMgYnl0ZXMKKzB4MTIzMDBlNGM6ICAgICAgMHgxMTEzMDAwMDogICAgKFgsIFksIFosIDEuMCksIGRzdCBvZmZzZXQgMHgwMCBieXRlcworMHgxMjMwMGU1MDogICAgICAweDdiMDAyMDA0OiAzRFBSSU1JVElWRTogcXVhZCBzdHJpcCBzZXF1ZW50aWFsCisweDEyMzAwZTU0OiAgICAgIDB4MDAwMDAwNTI6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMGU1ODogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDBlNWM6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDBlNjA6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDBlNjQ6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMGU2ODogICAgICAweDc4MTUxMDAzOiAzRFNUQVRFX0NPTlNUQU5UX1ZTX1NUQVRFCisweDEyMzAwZTZjOiAgICAgIDB4MDAwMDY0YzU6ICAgIGR3b3JkIDEKKzB4MTIzMDBlNzA6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMgorMHgxMjMwMGU3NDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAzCisweDEyMzAwZTc4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDQKKzB4MTIzMDBlN2M6ICAgICAgMHg3ODEwMDAwNDogM0RTVEFURV9WUworMHgxMjMwMGU4MDogICAgICAweDAwMDAwNjQwOiAgICBrZXJuZWwgcG9pbnRlcgorMHgxMjMwMGU4NDogICAgICAweDAwMDEwMDAwOiAgICBTUEY9MCwgVk1FPTAsIFNhbXBsZXIgQ291bnQgMCwgQmluZGluZyB0YWJsZSBjb3VudCAwCisweDEyMzAwZTg4OiAgICAgIDB4MDAwMDAwMDA6ICAgIHNjcmF0Y2ggb2Zmc2V0CisweDEyMzAwZThjOiAgICAgIDB4MDAxMDA4MDA6ICAgIERpc3BhdGNoIEdSRiBzdGFydCAxLCBWVUUgcmVhZCBsZW5ndGggMSwgVlVFIHJlYWQgb2Zmc2V0IDAKKzB4MTIzMDBlOTA6ICAgICAgMHg3NjAwMDQwMTogICAgTWF4IFRocmVhZHMgNjAsIFZlcnRleCBDYWNoZSBlbmFibGUsIFZTIGZ1bmMgZW5hYmxlCisweDEyMzAwZTk0OiAgICAgIDB4N2EwMDAwMDI6IFBJUEVfQ09OVFJPTAorMHgxMjMwMGU5ODogICAgICAweDAwMTAwMDAyOiAgICBubyB3cml0ZSwgY3Mgc3RhbGwsIHN0YWxsIGF0IHNjb3JlYm9hcmQsIAorMHgxMjMwMGU5YzogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDBlYTA6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwZWE0OiAgICAgIDB4N2EwMDAwMDI6IFBJUEVfQ09OVFJPTAorMHgxMjMwMGVhODogICAgICAweDAwMDA0MDAwOiAgICBxd29yZCB3cml0ZSwgCisweDEyMzAwZWFjOiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMGViMDogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDBlYjQ6ICAgICAgMHg3YTAwMDAwMjogUElQRV9DT05UUk9MCisweDEyMzAwZWI4OiAgICAgIDB4MDAwMDI4MDQ6ICAgIG5vIHdyaXRlLCBkZXB0aCBzdGFsbCwgaW5zdHJ1Y3Rpb24gY2FjaGUgaW52YWxpZGF0ZSwgc3RhdGUgY2FjaGUgaW52YWxpZGF0ZSwgCisweDEyMzAwZWJjOiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMGVjMDogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDBlYzQ6ICAgICAgMHg3ODEyMDAwMjogM0RTVEFURV9DTElQCisweDEyMzAwZWM4OiAgICAgIDB4MDAwMDA0MDA6ICAgIFVzZXJDbGlwIGRpc3RhbmNlIGN1bGwgdGVzdCBtYXNrIDB4MAorMHgxMjMwMGVjYzogICAgICAweDk4MDAwMDI2OiAgICBDbGlwIGVuYWJsZSwgQVBJIG1vZGUgT0dMLCBWaWV3cG9ydCBYWSB0ZXN0IGVuYWJsZSwgVmlld3BvcnQgWiB0ZXN0IGVuYWJsZSwgR3VhcmRiYW5kIHRlc3QgZGlzYWJsZSwgQ2xpcCBtb2RlIDAsIFBlcnNwZWN0aXZlIERpdmlkZSBlbmFibGUsIE5vbi1QZXJzcGVjdGl2ZSBCYXJ5Y2VudHJpYyBkaXNhYmxlLCBUcmkgUHJvdm9raW5nIDIsIExpbmUgUHJvdm9raW5nIDEsIFRyaWZhbiBQcm92b2tpbmcgMgorMHgxMjMwMGVkMDogICAgICAweDAwMDNmZmUwOiAgICBNaW4gUG9pbnRXaWR0aCAxLCBNYXggUG9pbnRXaWR0aCAyMDQ3LCBGb3JjZSBaZXJvIFJUQUluZGV4IGVuYWJsZSwgTWF4IFZQSW5kZXggMAorMHgxMjMwMGVkNDogICAgICAweDc4MTMwMDEyOiAzRFNUQVRFX1NGCisweDEyMzAwZWQ4OiAgICAgIDB4MDA2MDA4MTA6ICAgIEF0dHJpYiBPdXQgMSwgQXR0cmliIFN3aXp6bGUgZW5hYmxlLCBWVUUgcmVhZCBsZW5ndGggMSwgVlVFIHJlYWQgb2Zmc2V0IDEKKzB4MTIzMDBlZGM6ICAgICAgMHgwMDAwMDQwMzogICAgTGVnYWN5IEdsb2JhbCBEZXB0aEJpYXMgZGlzYWJsZSwgRnJvbnRGYWNlIGZpbGwgMCwgQkYgZmlsbCAwLCBWUCB0cmFuc2Zvcm0gZW5hYmxlLCBGcm9udFdpbmRpbmdfQ0NXCisweDEyMzAwZWUwOiAgICAgIDB4NjIwMDAwMDA6ICAgIEFBIGRpc2FibGUsIEN1bGxNb2RlIDMsIFNjaXNzb3IgZGlzYWJsZSwgTXVsdGlzYW1wbGUgbSBvZGUgMAorMHgxMjMwMGVlNDogICAgICAweDRjMDAwODA4OiAgICBMYXN0IFBpeGVsIGRpc2FibGUsIFN1YlBpeGVsIFByZWNpc2lvbiA4LCBVc2UgUGl4ZWxXaWR0aCAxCisweDEyMzAwZWU4OiAgICAgIDB4MDAwMDAwMDA6ICAgIEdsb2JhbCBEZXB0aCBPZmZzZXQgQ29uc3RhbnQgMC4wMDAwMDAKKzB4MTIzMDBlZWM6ICAgICAgMHgwMDAwMDAwMDogICAgR2xvYmFsIERlcHRoIE9mZnNldCBTY2FsZSAwLjAwMDAwMAorMHgxMjMwMGVmMDogICAgICAweDAwMDAwMDAwOiAgICBHbG9iYWwgRGVwdGggT2Zmc2V0IENsYW1wIDAuMDAwMDAwCisweDEyMzAwZWY0OiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAxIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiAwIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDBlZjg6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDMgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDIgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMGVmYzogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgNSAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgNCAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwZjAwOiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiA3IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiA2IChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDBmMDQ6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDkgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDggKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMGYwODogICAgICAweDAwMDAwMDAwOiAgICBBdHRyaWIgMTEgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKTsgQXR0cmliIDEwIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCkKKzB4MTIzMDBmMGM6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDEzIChPdmVycmlkZSAsIENvbnN0IFNvdXJjZSAwLCBTd2l6emxlIFNlbGVjdCAwLCBTb3VyY2UgMCk7IEF0dHJpYiAxMiAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApCisweDEyMzAwZjEwOiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAxNSAoT3ZlcnJpZGUgLCBDb25zdCBTb3VyY2UgMCwgU3dpenpsZSBTZWxlY3QgMCwgU291cmNlIDApOyBBdHRyaWIgMTQgKE92ZXJyaWRlICwgQ29uc3QgU291cmNlIDAsIFN3aXp6bGUgU2VsZWN0IDAsIFNvdXJjZSAwKQorMHgxMjMwMGYxNDogICAgICAweDAwMDAwMDAwOiAgICBQb2ludCBTcHJpdGUgVGV4Q29vcmQgRW5hYmxlCisweDEyMzAwZjE4OiAgICAgIDB4MDAwMDAwMDA6ICAgIENvbnN0IEludGVycCBFbmFibGUKKzB4MTIzMDBmMWM6ICAgICAgMHgwMDAwMDAwMDogICAgQXR0cmliIDctMCBXcmFwU2hvcnRlc3QgRW5hYmxlCisweDEyMzAwZjIwOiAgICAgIDB4MDAwMDAwMDA6ICAgIEF0dHJpYiAxNS04IFdyYXBTaG9ydGVzdCBFbmFibGUKKzB4MTIzMDBmMjQ6ICAgICAgMHg3ODE3MDAwMzogM0RTVEFURV9DT05TVEFOVF9QU19TVEFURQorMHgxMjMwMGYyODogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAxCisweDEyMzAwZjJjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDIKKzB4MTIzMDBmMzA6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMworMHgxMjMwMGYzNDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCA0CisweDEyMzAwZjM4OiAgICAgIDB4NzgxNDAwMDc6IDNEU1RBVEVfV00KKzB4MTIzMDBmM2M6ICAgICAgMHgwMDAwMDkwMDogICAga2VybmVsIHN0YXJ0IHBvaW50ZXIgMAorMHgxMjMwMGY0MDogICAgICAweDAwMDEwMDAwOiAgICBTUEY9MCwgVk1FPTAsIFNhbXBsZXIgQ291bnQgMCwgQmluZGluZyB0YWJsZSBjb3VudCAwCisweDEyMzAwZjQ0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHNjcmF0Y2ggb2Zmc2V0CisweDEyMzAwZjQ4OiAgICAgIDB4ODAwNjAwMDA6ICAgIERlcHRoIENsZWFyIDAsIERlcHRoIFJlc29sdmUgMCwgSGlaIFJlc29sdmUgMCwgRGlzcGF0Y2ggR1JGIHN0YXJ0WzBdIDYsIHN0YXJ0WzFdIDAsIHN0YXJ0WzJdIDAKKzB4MTIzMDBmNGM6ICAgICAgMHg0ZTA4NDAwMjogICAgTWF4VGhyZWFkcyA0MCwgUFMgS2lsbFBpeGVsIDAsIFBTIGNvbXB1dGVkIFogMCwgUFMgdXNlIHNvdXJjZVogMCwgVGhyZWFkIERpc3BhdGNoIDEsIFBTIHVzZSBzb3VyY2VXIDAsIERpc3BhdGNoMzIgMCwgRGlzcGF0Y2gxNiAxLCBEaXNwYXRjaDggMAorMHgxMjMwMGY1MDogICAgICAweDAwMTAwNDAwOiAgICBOdW0gU0Ygb3V0cHV0IDEsIFBvcyBYWSBvZmZzZXQgMCwgWlcgaW50ZXJwIG1vZGUgMCAsIEJhcnljZW50cmljIGludGVycCBtb2RlIDB4MSwgUG9pbnQgcmFzdGVyIHJ1bGUgMCwgTXVsdGlzYW1wbGUgbW9kZSAwLCBNdWx0aXNhbXBsZSBEaXNwYXRjaCBtb2RlIDAKKzB4MTIzMDBmNTQ6ICAgICAgMHgwMDAwMDAwMDogICAga2VybmVsIHN0YXJ0IHBvaW50ZXIgMQorMHgxMjMwMGY1ODogICAgICAweDAwMDAwOTAwOiAgICBrZXJuZWwgc3RhcnQgcG9pbnRlciAyCisweDEyMzAwZjVjOiAgICAgIDB4N2IwMDIwMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIHN0cmlwIHNlcXVlbnRpYWwKKzB4MTIzMDBmNjA6ICAgICAgMHgwMDAwMDAxNjogICAgdmVydGV4IGNvdW50CisweDEyMzAwZjY0OiAgICAgIDB4MDAwMDAwNTI6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMGY2ODogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMGY2YzogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMGY3MDogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwZjc0OiAgICAgIDB4MDUwMDAwMDA6IE1JX0JBVENIX0JVRkZFUl9FTkQKZGlmZiAtLWdpdCBhL2ludGVsL3Rlc3RzL2dlbjYtM2QuYmF0Y2guc2ggYi9pbnRlbC90ZXN0cy9nZW42LTNkLmJhdGNoLnNoCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjc5NmNhNWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlbC90ZXN0cy9nZW42LTNkLmJhdGNoLnNoCkBAIC0wLDAgKzEgQEAKK3Rlc3QtYmF0Y2guc2gKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbnRlbC90ZXN0cy9nZW43LTJkLWNvcHkuYmF0Y2ggYi9pbnRlbC90ZXN0cy9nZW43LTJkLWNvcHkuYmF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3ZmMyOQotLS0gL2Rldi9udWxsCisrKyBiL2ludGVsL3Rlc3RzL2dlbjctMmQtY29weS5iYXRjaApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9pbnRlbC90ZXN0cy9nZW43LTJkLWNvcHkuYmF0Y2gtcmVmLnR4dCBiL2ludGVsL3Rlc3RzL2dlbjctMmQtY29weS5iYXRjaC1yZWYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNjIxZDMKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlbC90ZXN0cy9nZW43LTJkLWNvcHkuYmF0Y2gtcmVmLnR4dApAQCAtMCwwICsxLDE0IEBACisweDEyMzAwMDAwOiAgICAgIDB4NTRmMDgwMDY6IFhZX1NSQ19DT1BZX0JMVCAocmdiIGVuYWJsZWQsIGFscGhhIGVuYWJsZWQsIHNyYyB0aWxlIDEsIGRzdCB0aWxlIDApCisweDEyMzAwMDA0OiAgICAgIDB4MDNjYzAxOTA6ICAgIGZvcm1hdCA4ODg4LCBwaXRjaCA0MDAsIHJvcCAweGNjLCBjbGlwcGluZyBkaXNhYmxlZCwgIAorMHgxMjMwMDAwODogICAgICAweDAwMDAwMDAwOiAgICBkc3QgKDAsMCkKKzB4MTIzMDAwMGM6ICAgICAgMHgwMDY0MDA2NDogICAgZHN0ICgxMDAsMTAwKQorMHgxMjMwMDAxMDogICAgICAweDEyMmU5MDAwOiAgICBkc3Qgb2Zmc2V0IDB4MTIyZTkwMDAKKzB4MTIzMDAwMTQ6ICAgICAgMHgwMDAwMDAwMDogICAgc3JjICgwLDApCisweDEyMzAwMDE4OiAgICAgIDB4MDAwMDAwODA6ICAgIHNyYyBwaXRjaCAxMjgKKzB4MTIzMDAwMWM6ICAgICAgMHgwMmZmMTAwMDogICAgc3JjIG9mZnNldCAweDAyZmYxMDAwCisweDEyMzAwMDIwOiAgICAgIDB4MTMwMDAwMDI6IE1JX0ZMVVNIX0RXIHBvc3Rfc3luY19vcD0nbm8gd3JpdGUnIAorMHgxMjMwMDAyNDogICAgICAweDAwMDAwMDAwOiAgICBhZGRyZXNzCisweDEyMzAwMDI4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkCisweDEyMzAwMDJjOiAgICAgIDB4MDAwMDAwMDA6ICAgIHVwcGVyIGR3b3JkCisweDEyMzAwMDMwOiAgICAgIDB4MDUwMDAwMDA6IE1JX0JBVENIX0JVRkZFUl9FTkQKKzB4MTIzMDAwMzQ6ICAgICAgMHgwMDAwMDAwMDogICAgCmRpZmYgLS1naXQgYS9pbnRlbC90ZXN0cy9nZW43LTJkLWNvcHkuYmF0Y2guc2ggYi9pbnRlbC90ZXN0cy9nZW43LTJkLWNvcHkuYmF0Y2guc2gKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNzk2Y2E1ZgotLS0gL2Rldi9udWxsCisrKyBiL2ludGVsL3Rlc3RzL2dlbjctMmQtY29weS5iYXRjaC5zaApAQCAtMCwwICsxIEBACit0ZXN0LWJhdGNoLnNoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW50ZWwvdGVzdHMvZ2VuNy0zZC5iYXRjaCBiL2ludGVsL3Rlc3RzL2dlbjctM2QuYmF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI4ZWM4OAotLS0gL2Rldi9udWxsCisrKyBiL2ludGVsL3Rlc3RzL2dlbjctM2QuYmF0Y2gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaW50ZWwvdGVzdHMvZ2VuNy0zZC5iYXRjaC1yZWYudHh0IGIvaW50ZWwvdGVzdHMvZ2VuNy0zZC5iYXRjaC1yZWYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMmRmYzQKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlbC90ZXN0cy9nZW43LTNkLmJhdGNoLXJlZi50eHQKQEAgLTAsMCArMSwyMTIgQEAKKzB4MTIzMDAwMDA6ICAgICAgMHg2OTA0MDAwMDogM0RTVEFURV9QSVBFTElORV9TRUxFQ1QKKzB4MTIzMDAwMDQ6ICAgICAgMHg3OTBkMDAwMjogM0RTVEFURV9NVUxUSVNBTVBMRQorMHgxMjMwMDAwODogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAxCisweDEyMzAwMDBjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDIKKzB4MTIzMDAwMTA6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMworMHgxMjMwMDAxNDogICAgICAweDc4MTgwMDAwOiAzRFNUQVRFX1NBTVBMRV9NQVNLCisweDEyMzAwMDE4OiAgICAgIDB4MDAwMDAwMDE6ICAgIGR3b3JkIDEKKzB4MTIzMDAwMWM6ICAgICAgMHg2MTAyMDAwMDogU1RBVEVfU0lQCisweDEyMzAwMDIwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDEKKzB4MTIzMDAwMjQ6ICAgICAgMHg2ODBiMDAwMDogM0RTVEFURV9WRl9TVEFUSVNUSUNTCisweDEyMzAwMDI4OiAgICAgIDB4NjEwMTAwMDg6IFNUQVRFX0JBU0VfQUREUkVTUworMHgxMjMwMDAyYzogICAgICAweDAwMDAwMDAxOiAgICBnZW5lcmFsIHN0YXRlIGJhc2UgYWRkcmVzcyAweDAwMDAwMDAwCisweDEyMzAwMDMwOiAgICAgIDB4MDkxYmEwMDE6ICAgIHN1cmZhY2Ugc3RhdGUgYmFzZSBhZGRyZXNzIDB4MDkxYmEwMDAKKzB4MTIzMDAwMzQ6ICAgICAgMHgwOTFiYTAwMTogICAgZHluYW1pYyBzdGF0ZSBiYXNlIGFkZHJlc3MgMHgwOTFiYTAwMAorMHgxMjMwMDAzODogICAgICAweDAwMDAwMDAxOiAgICBpbmRpcmVjdCBzdGF0ZSBiYXNlIGFkZHJlc3MgMHgwMDAwMDAwMAorMHgxMjMwMDAzYzogICAgICAweDA5MWMyMDAxOiAgICBpbnN0cnVjdGlvbiBzdGF0ZSBiYXNlIGFkZHJlc3MgMHgwOTFjMjAwMAorMHgxMjMwMDA0MDogICAgICAweDAwMDAwMDAxOiAgICBnZW5lcmFsIHN0YXRlIHVwcGVyIGJvdW5kIGRpc2FibGVkCisweDEyMzAwMDQ0OiAgICAgIDB4MDkxYzIwMDE6ICAgIGR5bmFtaWMgc3RhdGUgdXBwZXIgYm91bmQgMHgwOTFjMjAwMAorMHgxMjMwMDA0ODogICAgICAweDAwMDAwMDAxOiAgICBpbmRpcmVjdCBzdGF0ZSB1cHBlciBib3VuZCBkaXNhYmxlZAorMHgxMjMwMDA0YzogICAgICAweDAwMDAwMDAxOiAgICBpbnN0cnVjdGlvbiBzdGF0ZSB1cHBlciBib3VuZCBkaXNhYmxlZAorMHgxMjMwMDA1MDogICAgICAweDc4MjMwMDAwOiAzRFNUQVRFX1ZJRVdQT1JUX1NUQVRFX1BPSU5URVJTX0NDCisweDEyMzAwMDU0OiAgICAgIDB4MDAwMDdmZTA6ICAgIHBvaW50ZXIgdG8gQ0Mgdmlld3BvcnQKKzB4MTIzMDAwNTg6ICAgICAgMHg3ODIxMDAwMDogM0RTVEFURV9WSUVXUE9SVF9TVEFURV9QT0lOVEVSU19TRl9DTElQCisweDEyMzAwMDVjOiAgICAgIDB4MDAwMDdmODA6ICAgIHBvaW50ZXIgdG8gU0ZfQ0xJUCB2aWV3cG9ydAorMHgxMjMwMDA2MDogICAgICAweDc4MzAwMDAwOiAzRFNUQVRFX1VSQl9WUworMHgxMjMwMDA2NDogICAgICAweDA0MDAwMmMwOiAgICAxNktCIHN0YXJ0LCBzaXplPTEgNjRCIHJvd3MsIG5yX2VudHJpZXM9NzA0LCB0b3RhbCBzaXplIDQ1MDU2QgorMHgxMjMwMDA2ODogICAgICAweDc4MzMwMDAwOiAzRFNUQVRFX1VSQl9HUworMHgxMjMwMDA2YzogICAgICAweDA0MDAwMDAwOiAgICAxNktCIHN0YXJ0LCBzaXplPTEgNjRCIHJvd3MsIG5yX2VudHJpZXM9MCwgdG90YWwgc2l6ZSAwQgorMHgxMjMwMDA3MDogICAgICAweDc4MzEwMDAwOiAzRFNUQVRFX1VSQl9IUworMHgxMjMwMDA3NDogICAgICAweDA0MDAwMDAwOiAgICAxNktCIHN0YXJ0LCBzaXplPTEgNjRCIHJvd3MsIG5yX2VudHJpZXM9MCwgdG90YWwgc2l6ZSAwQgorMHgxMjMwMDA3ODogICAgICAweDc4MzIwMDAwOiAzRFNUQVRFX1VSQl9EUworMHgxMjMwMDA3YzogICAgICAweDA0MDAwMDAwOiAgICAxNktCIHN0YXJ0LCBzaXplPTEgNjRCIHJvd3MsIG5yX2VudHJpZXM9MCwgdG90YWwgc2l6ZSAwQgorMHgxMjMwMDA4MDogICAgICAweDc4MjQwMDAwOiAzRFNUQVRFX0JMRU5EX1NUQVRFX1BPSU5URVJTCisweDEyMzAwMDg0OiAgICAgIDB4MDAwMDdmNDE6ICAgIHBvaW50ZXIgdG8gQkxFTkRfU1RBVEUgYXQgMHgwMDAwN2Y0MCAoY2hhbmdlZCkKKzB4MTIzMDAwODg6ICAgICAgMHg3ODBlMDAwMDogM0RTVEFURV9DQ19TVEFURV9QT0lOVEVSUworMHgxMjMwMDA4YzogICAgICAweDAwMDA3ZjAxOiAgICBwb2ludGVyIHRvIENPTE9SX0NBTENfU1RBVEUgYXQgMHgwMDAwN2YwMCAoY2hhbmdlZCkKKzB4MTIzMDAwOTA6ICAgICAgMHg3ODI1MDAwMDogM0RTVEFURV9ERVBUSF9TVEVOQ0lMX1NUQVRFX1BPSU5URVJTCisweDEyMzAwMDk0OiAgICAgIDB4MDAwMDdlYzE6ICAgIHBvaW50ZXIgdG8gREVQVEhfU1RFTkNJTF9TVEFURSBhdCAweDAwMDA3ZWMwIChjaGFuZ2VkKQorMHgxMjMwMDA5ODogICAgICAweDc4MTYwMDA1OiAzRFNUQVRFX0NPTlNUQU5UX0dTCisweDEyMzAwMDljOiAgICAgIDB4MDAwMDAwMDA6ICAgIGxlbiAwID0gMCwgbGVuIDEgPSAwCisweDEyMzAwMGEwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGxlbiAyID0gMCwgbGVuIDMgPSAwCisweDEyMzAwMGE0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHBvaW50ZXIgdG8gY29uc3RidWYgMAorMHgxMjMwMDBhODogICAgICAweDAwMDAwMDAwOiAgICBwb2ludGVyIHRvIGNvbnN0YnVmIDEKKzB4MTIzMDAwYWM6ICAgICAgMHgwMDAwMDAwMDogICAgcG9pbnRlciB0byBjb25zdGJ1ZiAyCisweDEyMzAwMGIwOiAgICAgIDB4MDAwMDAwMDA6ICAgIHBvaW50ZXIgdG8gY29uc3RidWYgMworMHgxMjMwMDBiNDogICAgICAweDc4MTEwMDA1OiAzRFNUQVRFX0dTCisweDEyMzAwMGI4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGtlcm5lbCBwb2ludGVyCisweDEyMzAwMGJjOiAgICAgIDB4MDAwMDAwMDA6ICAgIFNQRj0wLCBWTUU9MCwgU2FtcGxlciBDb3VudCAwLCBCaW5kaW5nIHRhYmxlIGNvdW50IDAKKzB4MTIzMDAwYzA6ICAgICAgMHgwMDAwMDAwMDogICAgc2NyYXRjaCBvZmZzZXQKKzB4MTIzMDAwYzQ6ICAgICAgMHgwMDAwMDQwMTogICAgRGlzcGF0Y2ggR1JGIHN0YXJ0IDEsIFZVRSByZWFkIGxlbmd0aCAwLCBWVUUgcmVhZCBvZmZzZXQgMAorMHgxMjMwMDBjODogICAgICAweDAwMDAwNDAwOiAgICBNYXggVGhyZWFkcyAxLCBSZW5kZXJpbmcgZGlzYWJsZQorMHgxMjMwMDBjYzogICAgICAweDAwMDAwMDAwOiAgICBSZW9yZGVyIGRpc2FibGUsIERpc2NhcmQgQWRqYWNlbnkgZGlzYWJsZSwgR1MgZGlzYWJsZQorMHgxMjMwMDBkMDogICAgICAweDc4MjkwMDAwOiAzRFNUQVRFX0JJTkRJTkdfVEFCTEVfUE9JTlRFUlNfR1MKKzB4MTIzMDAwZDQ6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMQorMHgxMjMwMDBkODogICAgICAweDc4MTkwMDA1OiAzRFNUQVRFX0NPTlNUQU5UX0hTCisweDEyMzAwMGRjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGxlbiAwID0gMCwgbGVuIDEgPSAwCisweDEyMzAwMGUwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGxlbiAyID0gMCwgbGVuIDMgPSAwCisweDEyMzAwMGU0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHBvaW50ZXIgdG8gY29uc3RidWYgMAorMHgxMjMwMDBlODogICAgICAweDAwMDAwMDAwOiAgICBwb2ludGVyIHRvIGNvbnN0YnVmIDEKKzB4MTIzMDAwZWM6ICAgICAgMHgwMDAwMDAwMDogICAgcG9pbnRlciB0byBjb25zdGJ1ZiAyCisweDEyMzAwMGYwOiAgICAgIDB4MDAwMDAwMDA6ICAgIHBvaW50ZXIgdG8gY29uc3RidWYgMworMHgxMjMwMDBmNDogICAgICAweDc4MWIwMDA1OiAzRFNUQVRFX0hTCisweDEyMzAwMGY4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDEKKzB4MTIzMDAwZmM6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMgorMHgxMjMwMDEwMDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAzCisweDEyMzAwMTA0OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDQKKzB4MTIzMDAxMDg6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgNQorMHgxMjMwMDEwYzogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCA2CisweDEyMzAwMTEwOiAgICAgIDB4NzgyNzAwMDA6IDNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSU19IUworMHgxMjMwMDExNDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAxCisweDEyMzAwMTE4OiAgICAgIDB4NzgxYzAwMDI6IDNEU1RBVEVfVEUKKzB4MTIzMDAxMWM6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMQorMHgxMjMwMDEyMDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAyCisweDEyMzAwMTI0OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDMKKzB4MTIzMDAxMjg6ICAgICAgMHg3ODFhMDAwNTogM0RTVEFURV9DT05TVEFOVF9EUworMHgxMjMwMDEyYzogICAgICAweDAwMDAwMDAwOiAgICBsZW4gMCA9IDAsIGxlbiAxID0gMAorMHgxMjMwMDEzMDogICAgICAweDAwMDAwMDAwOiAgICBsZW4gMiA9IDAsIGxlbiAzID0gMAorMHgxMjMwMDEzNDogICAgICAweDAwMDAwMDAwOiAgICBwb2ludGVyIHRvIGNvbnN0YnVmIDAKKzB4MTIzMDAxMzg6ICAgICAgMHgwMDAwMDAwMDogICAgcG9pbnRlciB0byBjb25zdGJ1ZiAxCisweDEyMzAwMTNjOiAgICAgIDB4MDAwMDAwMDA6ICAgIHBvaW50ZXIgdG8gY29uc3RidWYgMgorMHgxMjMwMDE0MDogICAgICAweDAwMDAwMDAwOiAgICBwb2ludGVyIHRvIGNvbnN0YnVmIDMKKzB4MTIzMDAxNDQ6ICAgICAgMHg3ODFkMDAwNDogM0RTVEFURV9EUworMHgxMjMwMDE0ODogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAxCisweDEyMzAwMTRjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDIKKzB4MTIzMDAxNTA6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMworMHgxMjMwMDE1NDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCA0CisweDEyMzAwMTU4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDUKKzB4MTIzMDAxNWM6ICAgICAgMHg3ODI4MDAwMDogM0RTVEFURV9CSU5ESU5HX1RBQkxFX1BPSU5URVJTX0RTCisweDEyMzAwMTYwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDEKKzB4MTIzMDAxNjQ6ICAgICAgMHg3ODI2MDAwMDogM0RTVEFURV9CSU5ESU5HX1RBQkxFX1BPSU5URVJTX1ZTCisweDEyMzAwMTY4OiAgICAgIDB4MDAwMDdjNDA6ICAgIGR3b3JkIDEKKzB4MTIzMDAxNmM6ICAgICAgMHg3ODJiMDAwMDogM0RTVEFURV9TQU1QTEVSX1NUQVRFX1BPSU5URVJTX1ZTCisweDEyMzAwMTcwOiAgICAgIDB4MDAwMDdjMjA6ICAgIGR3b3JkIDEKKzB4MTIzMDAxNzQ6ICAgICAgMHg3OTEyMDAwMDogM0RTVEFURV9QVVNIX0NPTlNUQU5UX0FMTE9DX1ZTCisweDEyMzAwMTc4OiAgICAgIDB4MDAwMDAwMDg6ICAgIGR3b3JkIDEKKzB4MTIzMDAxN2M6ICAgICAgMHg3ODE1MDAwNTogM0RTVEFURV9DT05TVEFOVF9WUworMHgxMjMwMDE4MDogICAgICAweDAwMDAwMDAyOiAgICBsZW4gMCA9IDIsIGxlbiAxID0gMAorMHgxMjMwMDE4NDogICAgICAweDAwMDAwMDAwOiAgICBsZW4gMiA9IDAsIGxlbiAzID0gMAorMHgxMjMwMDE4ODogICAgICAweDAwMDA3ZTAwOiAgICBwb2ludGVyIHRvIGNvbnN0YnVmIDAKKzB4MTIzMDAxOGM6ICAgICAgMHgwMDAwMDAwMDogICAgcG9pbnRlciB0byBjb25zdGJ1ZiAxCisweDEyMzAwMTkwOiAgICAgIDB4MDAwMDAwMDA6ICAgIHBvaW50ZXIgdG8gY29uc3RidWYgMgorMHgxMjMwMDE5NDogICAgICAweDAwMDAwMDAwOiAgICBwb2ludGVyIHRvIGNvbnN0YnVmIDMKKzB4MTIzMDAxOTg6ICAgICAgMHg3ODEwMDAwNDogM0RTVEFURV9WUworMHgxMjMwMDE5YzogICAgICAweDAwMDAwMDAwOiAgICBrZXJuZWwgcG9pbnRlcgorMHgxMjMwMDFhMDogICAgICAweDA4MDAwMDAwOiAgICBTUEY9MCwgVk1FPTAsIFNhbXBsZXIgQ291bnQgMSwgQmluZGluZyB0YWJsZSBjb3VudCAwCisweDEyMzAwMWE0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHNjcmF0Y2ggb2Zmc2V0CisweDEyMzAwMWE4OiAgICAgIDB4MDAxMDA4MDA6ICAgIERpc3BhdGNoIEdSRiBzdGFydCAxLCBWVUUgcmVhZCBsZW5ndGggMSwgVlVFIHJlYWQgb2Zmc2V0IDAKKzB4MTIzMDAxYWM6ICAgICAgMHhmZTAwMDQwMTogICAgTWF4IFRocmVhZHMgMTI4LCBWZXJ0ZXggQ2FjaGUgZW5hYmxlLCBWUyBmdW5jIGVuYWJsZQorMHgxMjMwMDFiMDogICAgICAweDc4MWUwMDAxOiAzRFNUQVRFX1NUUkVBTU9VVAorMHgxMjMwMDFiNDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAxCisweDEyMzAwMWI4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDIKKzB4MTIzMDAxYmM6ICAgICAgMHg3ODEyMDAwMjogM0RTVEFURV9DTElQCisweDEyMzAwMWMwOiAgICAgIDB4MDAxNTA0MDA6ICAgIFVzZXJDbGlwIGRpc3RhbmNlIGN1bGwgdGVzdCBtYXNrIDB4MAorMHgxMjMwMDFjNDogICAgICAweDk4MDAwMDI2OiAgICBDbGlwIGVuYWJsZSwgQVBJIG1vZGUgT0dMLCBWaWV3cG9ydCBYWSB0ZXN0IGVuYWJsZSwgVmlld3BvcnQgWiB0ZXN0IGVuYWJsZSwgR3VhcmRiYW5kIHRlc3QgZGlzYWJsZSwgQ2xpcCBtb2RlIDAsIFBlcnNwZWN0aXZlIERpdmlkZSBlbmFibGUsIE5vbi1QZXJzcGVjdGl2ZSBCYXJ5Y2VudHJpYyBkaXNhYmxlLCBUcmkgUHJvdm9raW5nIDIsIExpbmUgUHJvdm9raW5nIDEsIFRyaWZhbiBQcm92b2tpbmcgMgorMHgxMjMwMDFjODogICAgICAweDAwMDNmZmUwOiAgICBNaW4gUG9pbnRXaWR0aCAxLCBNYXggUG9pbnRXaWR0aCAyMDQ3LCBGb3JjZSBaZXJvIFJUQUluZGV4IGVuYWJsZSwgTWF4IFZQSW5kZXggMAorMHgxMjMwMDFjYzogICAgICAweDc4MWYwMDBjOiAzRFNUQVRFX1NCRQorMHgxMjMwMDFkMDogICAgICAweDAwNjAwODEwOiAgICBkd29yZCAxCisweDEyMzAwMWQ0OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDIKKzB4MTIzMDAxZDg6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMworMHgxMjMwMDFkYzogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCA0CisweDEyMzAwMWUwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDUKKzB4MTIzMDAxZTQ6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgNgorMHgxMjMwMDFlODogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCA3CisweDEyMzAwMWVjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDgKKzB4MTIzMDAxZjA6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgOQorMHgxMjMwMDFmNDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAxMAorMHgxMjMwMDFmODogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAxMQorMHgxMjMwMDFmYzogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAxMgorMHgxMjMwMDIwMDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAxMworMHgxMjMwMDIwNDogICAgICAweDc4MTMwMDA1OiAzRFNUQVRFX1NGCisweDEyMzAwMjA4OiAgICAgIDB4MDAwMDE0MDM6ICAgIGR3b3JkIDEKKzB4MTIzMDAyMGM6ICAgICAgMHgyMjAwMDAwMDogICAgZHdvcmQgMgorMHgxMjMwMDIxMDogICAgICAweDRjMDAwODA4OiAgICBkd29yZCAzCisweDEyMzAwMjE0OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDQKKzB4MTIzMDAyMTg6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgNQorMHgxMjMwMDIxYzogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCA2CisweDEyMzAwMjIwOiAgICAgIDB4NzgxNDAwMDE6IDNEU1RBVEVfV00KKzB4MTIzMDAyMjQ6ICAgICAgMHhhMDAwMDg0MDogICAgKFBQICksIHBvaW50IFVSCisweDEyMzAwMjI4OiAgICAgIDB4MDAwMDAwMDA6ICAgIE1TCisweDEyMzAwMjJjOiAgICAgIDB4NzgyYTAwMDA6IDNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSU19QUworMHgxMjMwMDIzMDogICAgICAweDAwMDA3YzQwOiAgICBkd29yZCAxCisweDEyMzAwMjM0OiAgICAgIDB4NzgyZjAwMDA6IDNEU1RBVEVfU0FNUExFUl9TVEFURV9QT0lOVEVSU19QUworMHgxMjMwMDIzODogICAgICAweDAwMDA3YzIwOiAgICBkd29yZCAxCisweDEyMzAwMjNjOiAgICAgIDB4NzkxNjAwMDA6IDNEU1RBVEVfUFVTSF9DT05TVEFOVF9BTExPQ19QUworMHgxMjMwMDI0MDogICAgICAweDAwMDgwMDA4OiAgICBkd29yZCAxCisweDEyMzAwMjQ0OiAgICAgIDB4NzgxNzAwMDU6IDNEU1RBVEVfQ09OU1RBTlRfUFMKKzB4MTIzMDAyNDg6ICAgICAgMHgwMDAwMDAwMDogICAgbGVuIDAgPSAwLCBsZW4gMSA9IDAKKzB4MTIzMDAyNGM6ICAgICAgMHgwMDAwMDAwMDogICAgbGVuIDIgPSAwLCBsZW4gMyA9IDAKKzB4MTIzMDAyNTA6ICAgICAgMHgwMDAwMDAwMDogICAgcG9pbnRlciB0byBjb25zdGJ1ZiAwCisweDEyMzAwMjU0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHBvaW50ZXIgdG8gY29uc3RidWYgMQorMHgxMjMwMDI1ODogICAgICAweDAwMDAwMDAwOiAgICBwb2ludGVyIHRvIGNvbnN0YnVmIDIKKzB4MTIzMDAyNWM6ICAgICAgMHgwMDAwMDAwMDogICAgcG9pbnRlciB0byBjb25zdGJ1ZiAzCisweDEyMzAwMjYwOiAgICAgIDB4NzgyMDAwMDY6IDNEU1RBVEVfUFMKKzB4MTIzMDAyNjQ6ICAgICAgMHgwMDAwMDE0MDogICAgZHdvcmQgMQorMHgxMjMwMDI2ODogICAgICAweDA4MDAwMDAwOiAgICBkd29yZCAyCisweDEyMzAwMjZjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDMKKzB4MTIzMDAyNzA6ICAgICAgMHg1NTAwMDQwMzogICAgZHdvcmQgNAorMHgxMjMwMDI3NDogICAgICAweDAwMDQwMDA2OiAgICBkd29yZCA1CisweDEyMzAwMjc4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDYKKzB4MTIzMDAyN2M6ICAgICAgMHgwMDAwMDI0MDogICAgZHdvcmQgNworMHgxMjMwMDI4MDogICAgICAweDc4MGYwMDAwOiAzRFNUQVRFX1NDSVNTT1JfUE9JTlRFUlMKKzB4MTIzMDAyODQ6ICAgICAgMHgwMDAwN2JlMDogICAgc2Npc3NvciByZWN0IG9mZnNldAorMHgxMjMwMDI4ODogICAgICAweDdhMDAwMDAyOiBQSVBFX0NPTlRST0wKKzB4MTIzMDAyOGM6ICAgICAgMHgwMDAwMjAwMDogICAgbm8gd3JpdGUsIGRlcHRoIHN0YWxsLCAKKzB4MTIzMDAyOTA6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwMjk0OiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDI5ODogICAgICAweDdhMDAwMDAyOiBQSVBFX0NPTlRST0wKKzB4MTIzMDAyOWM6ICAgICAgMHgwMDAwMDAwMTogICAgbm8gd3JpdGUsIGRlcHRoIGNhY2hlIGZsdXNoLCAKKzB4MTIzMDAyYTA6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwMmE0OiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDJhODogICAgICAweDdhMDAwMDAyOiBQSVBFX0NPTlRST0wKKzB4MTIzMDAyYWM6ICAgICAgMHgwMDAwMjAwMDogICAgbm8gd3JpdGUsIGRlcHRoIHN0YWxsLCAKKzB4MTIzMDAyYjA6ICAgICAgMHgwMDAwMDAwMDogICAgCisweDEyMzAwMmI0OiAgICAgIDB4MDAwMDAwMDA6ICAgIAorMHgxMjMwMDJiODogICAgICAweDc4MDUwMDA1OiAzRFNUQVRFX0RFUFRIX0JVRkZFUgorMHgxMjMwMDJiYzogICAgICAweGUwMDQwMDAwOiAgICBkd29yZCAxCisweDEyMzAwMmMwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDIKKzB4MTIzMDAyYzQ6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMworMHgxMjMwMDJjODogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCA0CisweDEyMzAwMmNjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDUKKzB4MTIzMDAyZDA6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgNgorMHgxMjMwMDJkNDogICAgICAweDc4MDcwMDAxOiAzRFNUQVRFX0hJRVJfREVQVEhfQlVGRkVSCisweDEyMzAwMmQ4OiAgICAgIDB4MDAwMDAwMDA6ICAgIHBpdGNoIDFiCisweDEyMzAwMmRjOiAgICAgIDB4MDAwMDAwMDA6ICAgIHBvaW50ZXIgdG8gSGlaIGJ1ZmZlcgorMHgxMjMwMDJlMDogICAgICAweDc4MDYwMDAxOiAzRFNUQVRFX1NURU5DSUxfQlVGRkVSCisweDEyMzAwMmU0OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDEKKzB4MTIzMDAyZTg6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMgorMHgxMjMwMDJlYzogICAgICAweDc4MDQwMDAxOiAzRFNUQVRFX0NMRUFSX1BBUkFNUworMHgxMjMwMDJmMDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAxCisweDEyMzAwMmY0OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDIKKzB4MTIzMDAyZjg6ICAgICAgMHg3OTAwMDAwMjogM0RTVEFURV9EUkFXSU5HX1JFQ1RBTkdMRQorMHgxMjMwMDJmYzogICAgICAweDAwMDAwMDAwOiAgICB0b3AgbGVmdDogMCwwCisweDEyMzAwMzAwOiAgICAgIDB4MDAxMzAwNzc6ICAgIGJvdHRvbSByaWdodDogMTE5LDE5CisweDEyMzAwMzA0OiAgICAgIDB4MDAwMDAwMDA6ICAgIG9yaWdpbjogMCwwCisweDEyMzAwMzA4OiAgICAgIDB4NzgwODAwMDM6IDNEU1RBVEVfVkVSVEVYX0JVRkZFUlMKKzB4MTIzMDAzMGM6ICAgICAgMHgwMDAwNDAxNDogICAgYnVmZmVyIDA6IHNlcXVlbnRpYWwsIHBpdGNoIDIwYgorMHgxMjMwMDMxMDogICAgICAweDE1OGIzMDAwOiAgICBidWZmZXIgYWRkcmVzcworMHgxMjMwMDMxNDogICAgICAweDE1OGMyZmZmOiAgICBtYXggaW5kZXgKKzB4MTIzMDAzMTg6ICAgICAgMHgwMDAwMDAwMDogICAgbWJ6CisweDEyMzAwMzFjOiAgICAgIDB4NzgwOTAwMDM6IDNEU1RBVEVfVkVSVEVYX0VMRU1FTlRTCisweDEyMzAwMzIwOiAgICAgIDB4MDI4NTAwMDA6ICAgIGJ1ZmZlciAwOiB2YWxpZCwgdHlwZSAweDAwODUsIHNyYyBvZmZzZXQgMHgwMDAwIGJ5dGVzCisweDEyMzAwMzI0OiAgICAgIDB4MTEyMzAwMDA6ICAgIChYLCBZLCAwLjAsIDEuMCksIGRzdCBvZmZzZXQgMHgwMCBieXRlcworMHgxMjMwMDMyODogICAgICAweDAyNDAwMDA4OiAgICBidWZmZXIgMDogdmFsaWQsIHR5cGUgMHgwMDQwLCBzcmMgb2Zmc2V0IDB4MDAwOCBieXRlcworMHgxMjMwMDMyYzogICAgICAweDExMTMwMDAwOiAgICAoWCwgWSwgWiwgMS4wKSwgZHN0IG9mZnNldCAweDAwIGJ5dGVzCisweDEyMzAwMzMwOiAgICAgIDB4N2IwMDAwMDU6IDNEUFJJTUlUSVZFOiAKKzB4MTIzMDAzMzQ6ICAgICAgMHgwMDAwMDAwNzogICAgcXVhZCBsaXN0IHNlcXVlbnRpYWwKKzB4MTIzMDAzMzg6ICAgICAgMHgwMDAwMDAwNDogICAgdmVydGV4IGNvdW50CisweDEyMzAwMzNjOiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDM0MDogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDM0NDogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDM0ODogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwMzRjOiAgICAgIDB4MDUwMDAwMDA6IE1JX0JBVENIX0JVRkZFUl9FTkQKZGlmZiAtLWdpdCBhL2ludGVsL3Rlc3RzL2dlbjctM2QuYmF0Y2guc2ggYi9pbnRlbC90ZXN0cy9nZW43LTNkLmJhdGNoLnNoCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjc5NmNhNWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlbC90ZXN0cy9nZW43LTNkLmJhdGNoLnNoCkBAIC0wLDAgKzEgQEAKK3Rlc3QtYmF0Y2guc2gKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbnRlbC90ZXN0cy9nbTQ1LTNkLmJhdGNoIGIvaW50ZWwvdGVzdHMvZ200NS0zZC5iYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDk2MDhiCi0tLSAvZGV2L251bGwKKysrIGIvaW50ZWwvdGVzdHMvZ200NS0zZC5iYXRjaApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9pbnRlbC90ZXN0cy9nbTQ1LTNkLmJhdGNoLXJlZi50eHQgYi9pbnRlbC90ZXN0cy9nbTQ1LTNkLmJhdGNoLXJlZi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE0N2Q3NwotLS0gL2Rldi9udWxsCisrKyBiL2ludGVsL3Rlc3RzL2dtNDUtM2QuYmF0Y2gtcmVmLnR4dApAQCAtMCwwICsxLDQ4OCBAQAorMHgxMjMwMDAwMDogICAgICAweDY5MDQwMDAwOiAzRFNUQVRFX1BJUEVMSU5FX1NFTEVDVAorMHgxMjMwMDAwNDogICAgICAweDc5MDkwMDAwOiAzRFNUQVRFX0dMT0JBTF9ERVBUSF9PRkZTRVRfQ0xBTVAKKzB4MTIzMDAwMDg6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMQorMHgxMjMwMDAwYzogICAgICAweDYxMDIwMDAwOiBTVEFURV9TSVAKKzB4MTIzMDAwMTA6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMQorMHgxMjMwMDAxNDogICAgICAweDY4MGIwMDAwOiAzRFNUQVRFX1ZGX1NUQVRJU1RJQ1MKKzB4MTIzMDAwMTg6ICAgICAgMHg2MTAxMDAwNDogU1RBVEVfQkFTRV9BRERSRVNTCisweDEyMzAwMDFjOiAgICAgIDB4MDAwMDAwMDE6ICAgIGdlbmVyYWwgc3RhdGUgYmFzZSBhZGRyZXNzIDB4MDAwMDAwMDAKKzB4MTIzMDAwMjA6ICAgICAgMHgwMDAwMDAwMTogICAgc3VyZmFjZSBzdGF0ZSBiYXNlIGFkZHJlc3MgMHgwMDAwMDAwMAorMHgxMjMwMDAyNDogICAgICAweDAwMDAwMDAxOiAgICBpbmRpcmVjdCBzdGF0ZSBiYXNlIGFkZHJlc3MgMHgwMDAwMDAwMAorMHgxMjMwMDAyODogICAgICAweDAwMDAwMDAxOiAgICBnZW5lcmFsIHN0YXRlIHVwcGVyIGJvdW5kIGRpc2FibGVkCisweDEyMzAwMDJjOiAgICAgIDB4MDAwMDAwMDE6ICAgIGluZGlyZWN0IHN0YXRlIHVwcGVyIGJvdW5kIGRpc2FibGVkCisweDEyMzAwMDMwOiAgICAgIDB4NzgwMTAwMDQ6IDNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSUworMHgxMjMwMDAzNDogICAgICAweDAwMDA3ZTIwOiAgICBWUyBiaW5kaW5nIHRhYmxlCisweDEyMzAwMDM4OiAgICAgIDB4MDAwMDAwMDA6ICAgIEdTIGJpbmRpbmcgdGFibGUKKzB4MTIzMDAwM2M6ICAgICAgMHgwMDAwMDAwMDogICAgQ2xpcCBiaW5kaW5nIHRhYmxlCisweDEyMzAwMDQwOiAgICAgIDB4MDAwMDAwMDA6ICAgIFNGIGJpbmRpbmcgdGFibGUKKzB4MTIzMDAwNDQ6ICAgICAgMHgwMDAwN2UyMDogICAgV00gYmluZGluZyB0YWJsZQorMHgxMjMwMDA0ODogICAgICAweDc5MDEwMDAzOiAzRFNUQVRFX0NPTlNUQU5UX0NPTE9SCisweDEyMzAwMDRjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDEKKzB4MTIzMDAwNTA6ICAgICAgMHgwMDAwMDAwMDogICAgZHdvcmQgMgorMHgxMjMwMDA1NDogICAgICAweDAwMDAwMDAwOiAgICBkd29yZCAzCisweDEyMzAwMDU4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGR3b3JkIDQKKzB4MTIzMDAwNWM6ICAgICAgMHg3OTA1MDAwNDogM0RTVEFURV9ERVBUSF9CVUZGRVIKKzB4MTIzMDAwNjA6ICAgICAgMHgyYzA4MDVmZjogICAgMkQsIHoyNHM4LCBwaXRjaCA9IDE1MzYgYnl0ZXMsIHRpbGVkCisweDEyMzAwMDY0OiAgICAgIDB4MDAwMDAwMDA6ICAgIGRlcHRoIG9mZnNldAorMHgxMjMwMDA2ODogICAgICAweDA5NTg0YWMwOiAgICAzMDB4MzAwCisweDEyMzAwMDZjOiAgICAgIDB4MDAwMDAwMDA6ICAgIHZvbHVtZSBkZXB0aAorMHgxMjMwMDA3MDogICAgICAweDAwMDAwMDAwOiAgICAKKzB4MTIzMDAwNzQ6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDAwNzg6ICAgICAgMHgwMDAwN2Q2MDogICAgVlMgc3RhdGUKKzB4MTIzMDAwN2M6ICAgICAgMHgwMDAwMDAwMDogICAgR1Mgc3RhdGUKKzB4MTIzMDAwODA6ICAgICAgMHgwMDAwN2QyMTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDA4NDogICAgICAweDAwMDA3ZDgwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDA4ODogICAgICAweDAwMDA3ZGUwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDA4YzogICAgICAweDAwMDA3ZmMwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDA5MDogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDA5NDogICAgICAweDA1MjEyMDQwOiAgICB2cyBmZW5jZTogNjQsIGNsaXBfZmVuY2U6IDgyLCBnc19mZW5jZTogNzIKKzB4MTIzMDAwOTg6ICAgICAgMHgxODAwMDA2MjogICAgc2YgZmVuY2U6IDk4LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAzODQKKzB4MTIzMDAwOWM6ICAgICAgMHg2MDAxMDAwMDogQ1NfVVJCX1NUQVRFCisweDEyMzAwMGEwOiAgICAgIDB4MDAwMDAwMjQ6ICAgIGVudHJ5X3NpemU6IDIgWzE5MiBieXRlc10sIG5fZW50cmllczogNAorMHgxMjMwMDBhNDogICAgICAweDc5MDAwMDAyOiAzRFNUQVRFX0RSQVdJTkdfUkVDVEFOR0xFCisweDEyMzAwMGE4OiAgICAgIDB4MDAwMDAwMDA6ICAgIHRvcCBsZWZ0OiAwLDAKKzB4MTIzMDAwYWM6ICAgICAgMHgwMTJiMDEyYjogICAgYm90dG9tIHJpZ2h0OiAyOTksMjk5CisweDEyMzAwMGIwOiAgICAgIDB4MDAwMDAwMDA6ICAgIG9yaWdpbjogMCwwCisweDEyMzAwMGI0OiAgICAgIDB4NzgwODAwMDM6IDNEU1RBVEVfVkVSVEVYX0JVRkZFUlMKKzB4MTIzMDAwYjg6ICAgICAgMHgwMDAwMDAwYzogICAgYnVmZmVyIDA6IHNlcXVlbnRpYWwsIHBpdGNoIDEyYgorMHgxMjMwMDBiYzogICAgICAweDAwMDAwMDAwOiAgICBidWZmZXIgYWRkcmVzcworMHgxMjMwMDBjMDogICAgICAweDAwMDAwMDAwOiAgICBtYXggaW5kZXgKKzB4MTIzMDAwYzQ6ICAgICAgMHgwMDAwMDAwMDogICAgbWJ6CisweDEyMzAwMGM4OiAgICAgIDB4NzgwOTAwMDE6IDNEU1RBVEVfVkVSVEVYX0VMRU1FTlRTCisweDEyMzAwMGNjOiAgICAgIDB4MDQ0MDAwMDA6ICAgIGJ1ZmZlciAwOiB2YWxpZCwgdHlwZSAweDAwNDAsIHNyYyBvZmZzZXQgMHgwMDAwIGJ5dGVzCisweDEyMzAwMGQwOiAgICAgIDB4MTExMzAwMDA6ICAgIChYLCBZLCBaLCAxLjApLCBkc3Qgb2Zmc2V0IDB4MDAgYnl0ZXMKKzB4MTIzMDAwZDQ6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDBkODogICAgICAweDAwMDAwMDAxOiAgICBvZmZzZXQ6IDB4MDAwMDAwMDAsIGxlbmd0aDogMTI4IGJ5dGVzCisweDEyMzAwMGRjOiAgICAgIDB4N2IwMDE4MDQ6IDNEUFJJTUlUSVZFOiB0cmkgZmFuIHNlcXVlbnRpYWwKKzB4MTIzMDAwZTA6ICAgICAgMHgwMDAwMDAwNDogICAgdmVydGV4IGNvdW50CisweDEyMzAwMGU0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDBlODogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDBlYzogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDBmMDogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwMGY0OiAgICAgIDB4NzgwMTAwMDQ6IDNEU1RBVEVfQklORElOR19UQUJMRV9QT0lOVEVSUworMHgxMjMwMDBmODogICAgICAweDAwMDA3YjQwOiAgICBWUyBiaW5kaW5nIHRhYmxlCisweDEyMzAwMGZjOiAgICAgIDB4MDAwMDAwMDA6ICAgIEdTIGJpbmRpbmcgdGFibGUKKzB4MTIzMDAxMDA6ICAgICAgMHgwMDAwMDAwMDogICAgQ2xpcCBiaW5kaW5nIHRhYmxlCisweDEyMzAwMTA0OiAgICAgIDB4MDAwMDAwMDA6ICAgIFNGIGJpbmRpbmcgdGFibGUKKzB4MTIzMDAxMDg6ICAgICAgMHgwMDAwN2I0MDogICAgV00gYmluZGluZyB0YWJsZQorMHgxMjMwMDEwYzogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDExMDogICAgICAweDAwMDA3YWEwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDExNDogICAgICAweDAwMDA3YTQxOiAgICBHUyBzdGF0ZQorMHgxMjMwMDExODogICAgICAweDAwMDA3YTYxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwMTFjOiAgICAgIDB4MDAwMDdhYzA6ICAgIFNGIHN0YXRlCisweDEyMzAwMTIwOiAgICAgIDB4MDAwMDdiMDA6ICAgIFdNIHN0YXRlCisweDEyMzAwMTI0OiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwMTI4OiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwMTJjOiAgICAgIDB4MDUyMTIwNDA6ICAgIHZzIGZlbmNlOiA2NCwgY2xpcF9mZW5jZTogODIsIGdzX2ZlbmNlOiA3MgorMHgxMjMwMDEzMDogICAgICAweDE4MDAwMDYyOiAgICBzZiBmZW5jZTogOTgsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDM4NAorMHgxMjMwMDEzNDogICAgICAweDc4MDgwMDAzOiAzRFNUQVRFX1ZFUlRFWF9CVUZGRVJTCisweDEyMzAwMTM4OiAgICAgIDB4MDAwMDAwMGM6ICAgIGJ1ZmZlciAwOiBzZXF1ZW50aWFsLCBwaXRjaCAxMmIKKzB4MTIzMDAxM2M6ICAgICAgMHgwMDAwMDAwMDogICAgYnVmZmVyIGFkZHJlc3MKKzB4MTIzMDAxNDA6ICAgICAgMHgwMDAwMDAwMDogICAgbWF4IGluZGV4CisweDEyMzAwMTQ0OiAgICAgIDB4MDAwMDAwMDA6ICAgIG1iegorMHgxMjMwMDE0ODogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwMTRjOiAgICAgIDB4MDAwMDAwODI6ICAgIG9mZnNldDogMHgwMDAwMDA4MCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDAxNTA6ICAgICAgMHg3YjAwMjAwNDogM0RQUklNSVRJVkU6IHF1YWQgc3RyaXAgc2VxdWVudGlhbAorMHgxMjMwMDE1NDogICAgICAweDAwMDAwMDUyOiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDAxNTg6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgdmVydGV4CisweDEyMzAwMTVjOiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwMTYwOiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwMTY0OiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDAxNjg6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDAxNmM6ICAgICAgMHgwMDAwN2FhMDogICAgVlMgc3RhdGUKKzB4MTIzMDAxNzA6ICAgICAgMHgwMDAwN2EyMTogICAgR1Mgc3RhdGUKKzB4MTIzMDAxNzQ6ICAgICAgMHgwMDAwN2E2MTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDE3ODogICAgICAweDAwMDA3YWMwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDE3YzogICAgICAweDAwMDA3YjAwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDE4MDogICAgICAweDAwMDA3Y2MwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDE4NDogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDE4ODogICAgICAweDA1MjEyMDQwOiAgICB2cyBmZW5jZTogNjQsIGNsaXBfZmVuY2U6IDgyLCBnc19mZW5jZTogNzIKKzB4MTIzMDAxOGM6ICAgICAgMHgxODAwMDA2MjogICAgc2YgZmVuY2U6IDk4LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAzODQKKzB4MTIzMDAxOTA6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDE5NDogICAgICAweDAwMDAwMDgyOiAgICBvZmZzZXQ6IDB4MDAwMDAwODAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwMTk4OiAgICAgIDB4N2IwMDFjMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIGxpc3Qgc2VxdWVudGlhbAorMHgxMjMwMDE5YzogICAgICAweDAwMDAwMDUwOiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDAxYTA6ICAgICAgMHgwMDAwMDA1MjogICAgc3RhcnQgdmVydGV4CisweDEyMzAwMWE0OiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwMWE4OiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwMWFjOiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDAxYjA6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDAxYjQ6ICAgICAgMHgwMDAwN2FhMDogICAgVlMgc3RhdGUKKzB4MTIzMDAxYjg6ICAgICAgMHgwMDAwN2EwMTogICAgR1Mgc3RhdGUKKzB4MTIzMDAxYmM6ICAgICAgMHgwMDAwN2E2MTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDFjMDogICAgICAweDAwMDA3YWMwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDFjNDogICAgICAweDAwMDA3YjAwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDFjODogICAgICAweDAwMDA3Y2MwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDFjYzogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDFkMDogICAgICAweDA1MjEyMDQwOiAgICB2cyBmZW5jZTogNjQsIGNsaXBfZmVuY2U6IDgyLCBnc19mZW5jZTogNzIKKzB4MTIzMDAxZDQ6ICAgICAgMHgxODAwMDA2MjogICAgc2YgZmVuY2U6IDk4LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAzODQKKzB4MTIzMDAxZDg6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDFkYzogICAgICAweDAwMDAwMTQyOiAgICBvZmZzZXQ6IDB4MDAwMDAxNDAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwMWUwOiAgICAgIDB4N2IwMDIwMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIHN0cmlwIHNlcXVlbnRpYWwKKzB4MTIzMDAxZTQ6ICAgICAgMHgwMDAwMDA1MjogICAgdmVydGV4IGNvdW50CisweDEyMzAwMWU4OiAgICAgIDB4MDAwMDAwYTI6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDFlYzogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDFmMDogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDFmNDogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwMWY4OiAgICAgIDB4NzgwMDAwMDU6IDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTCisweDEyMzAwMWZjOiAgICAgIDB4MDAwMDdhYTA6ICAgIFZTIHN0YXRlCisweDEyMzAwMjAwOiAgICAgIDB4MDAwMDc5ZTE6ICAgIEdTIHN0YXRlCisweDEyMzAwMjA0OiAgICAgIDB4MDAwMDdhNjE6ICAgIENsaXAgc3RhdGUKKzB4MTIzMDAyMDg6ICAgICAgMHgwMDAwN2FjMDogICAgU0Ygc3RhdGUKKzB4MTIzMDAyMGM6ICAgICAgMHgwMDAwN2IwMDogICAgV00gc3RhdGUKKzB4MTIzMDAyMTA6ICAgICAgMHgwMDAwN2NjMDogICAgQ0Mgc3RhdGUKKzB4MTIzMDAyMTQ6ICAgICAgMHg2MDAwM2YwMTogVVJCX0ZFTkNFOiBjcyB2ZmUgc2YgY2xpcCBncyB2cyAKKzB4MTIzMDAyMTg6ICAgICAgMHgwNTIxMjA0MDogICAgdnMgZmVuY2U6IDY0LCBjbGlwX2ZlbmNlOiA4MiwgZ3NfZmVuY2U6IDcyCisweDEyMzAwMjFjOiAgICAgIDB4MTgwMDAwNjI6ICAgIHNmIGZlbmNlOiA5OCwgdmZlX2ZlbmNlOiAwLCBjc19mZW5jZTogMzg0CisweDEyMzAwMjIwOiAgICAgIDB4NjAwMjAxMDA6IENPTlNUQU5UX0JVRkZFUjogdmFsaWQKKzB4MTIzMDAyMjQ6ICAgICAgMHgwMDAwMDE0MjogICAgb2Zmc2V0OiAweDAwMDAwMTQwLCBsZW5ndGg6IDE5MiBieXRlcworMHgxMjMwMDIyODogICAgICAweDdiMDAxYzA0OiAzRFBSSU1JVElWRTogcXVhZCBsaXN0IHNlcXVlbnRpYWwKKzB4MTIzMDAyMmM6ICAgICAgMHgwMDAwMDA1MDogICAgdmVydGV4IGNvdW50CisweDEyMzAwMjMwOiAgICAgIDB4MDAwMDAwZjQ6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDIzNDogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDIzODogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDIzYzogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwMjQwOiAgICAgIDB4NzgwMDAwMDU6IDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTCisweDEyMzAwMjQ0OiAgICAgIDB4MDAwMDdhYTA6ICAgIFZTIHN0YXRlCisweDEyMzAwMjQ4OiAgICAgIDB4MDAwMDc5YzE6ICAgIEdTIHN0YXRlCisweDEyMzAwMjRjOiAgICAgIDB4MDAwMDdhNjE6ICAgIENsaXAgc3RhdGUKKzB4MTIzMDAyNTA6ICAgICAgMHgwMDAwN2FjMDogICAgU0Ygc3RhdGUKKzB4MTIzMDAyNTQ6ICAgICAgMHgwMDAwN2IwMDogICAgV00gc3RhdGUKKzB4MTIzMDAyNTg6ICAgICAgMHgwMDAwN2NjMDogICAgQ0Mgc3RhdGUKKzB4MTIzMDAyNWM6ICAgICAgMHg2MDAwM2YwMTogVVJCX0ZFTkNFOiBjcyB2ZmUgc2YgY2xpcCBncyB2cyAKKzB4MTIzMDAyNjA6ICAgICAgMHgwNTIxMjA0MDogICAgdnMgZmVuY2U6IDY0LCBjbGlwX2ZlbmNlOiA4MiwgZ3NfZmVuY2U6IDcyCisweDEyMzAwMjY0OiAgICAgIDB4MTgwMDAwNjI6ICAgIHNmIGZlbmNlOiA5OCwgdmZlX2ZlbmNlOiAwLCBjc19mZW5jZTogMzg0CisweDEyMzAwMjY4OiAgICAgIDB4NjAwMjAxMDA6IENPTlNUQU5UX0JVRkZFUjogdmFsaWQKKzB4MTIzMDAyNmM6ICAgICAgMHgwMDAwMDE0MjogICAgb2Zmc2V0OiAweDAwMDAwMTQwLCBsZW5ndGg6IDE5MiBieXRlcworMHgxMjMwMDI3MDogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDI3NDogICAgICAweDAwMDA3OWEwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDI3ODogICAgICAweDAwMDA3OWMxOiAgICBHUyBzdGF0ZQorMHgxMjMwMDI3YzogICAgICAweDAwMDA3YTYxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwMjgwOiAgICAgIDB4MDAwMDdhYzA6ICAgIFNGIHN0YXRlCisweDEyMzAwMjg0OiAgICAgIDB4MDAwMDdiMDA6ICAgIFdNIHN0YXRlCisweDEyMzAwMjg4OiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwMjhjOiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwMjkwOiAgICAgIDB4MDUyMTIwNDA6ICAgIHZzIGZlbmNlOiA2NCwgY2xpcF9mZW5jZTogODIsIGdzX2ZlbmNlOiA3MgorMHgxMjMwMDI5NDogICAgICAweDE4MDAwMDYyOiAgICBzZiBmZW5jZTogOTgsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDM4NAorMHgxMjMwMDI5ODogICAgICAweDc4MDgwMDAzOiAzRFNUQVRFX1ZFUlRFWF9CVUZGRVJTCisweDEyMzAwMjljOiAgICAgIDB4MDAwMDAwMTg6ICAgIGJ1ZmZlciAwOiBzZXF1ZW50aWFsLCBwaXRjaCAyNGIKKzB4MTIzMDAyYTA6ICAgICAgMHgwMDAwMGY0ODogICAgYnVmZmVyIGFkZHJlc3MKKzB4MTIzMDAyYTQ6ICAgICAgMHgwMDAwMDAwMDogICAgbWF4IGluZGV4CisweDEyMzAwMmE4OiAgICAgIDB4MDAwMDAwMDA6ICAgIG1iegorMHgxMjMwMDJhYzogICAgICAweDc4MDkwMDAzOiAzRFNUQVRFX1ZFUlRFWF9FTEVNRU5UUworMHgxMjMwMDJiMDogICAgICAweDA0NDAwMDAwOiAgICBidWZmZXIgMDogdmFsaWQsIHR5cGUgMHgwMDQwLCBzcmMgb2Zmc2V0IDB4MDAwMCBieXRlcworMHgxMjMwMDJiNDogICAgICAweDExMTMwMDAwOiAgICAoWCwgWSwgWiwgMS4wKSwgZHN0IG9mZnNldCAweDAwIGJ5dGVzCisweDEyMzAwMmI4OiAgICAgIDB4MDQ0MDAwMGM6ICAgIGJ1ZmZlciAwOiB2YWxpZCwgdHlwZSAweDAwNDAsIHNyYyBvZmZzZXQgMHgwMDBjIGJ5dGVzCisweDEyMzAwMmJjOiAgICAgIDB4MTExMzAwMDQ6ICAgIChYLCBZLCBaLCAxLjApLCBkc3Qgb2Zmc2V0IDB4MTAgYnl0ZXMKKzB4MTIzMDAyYzA6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDJjNDogICAgICAweDAwMDAwMjAyOiAgICBvZmZzZXQ6IDB4MDAwMDAyMDAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwMmM4OiAgICAgIDB4N2IwMDIwMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIHN0cmlwIHNlcXVlbnRpYWwKKzB4MTIzMDAyY2M6ICAgICAgMHgwMDAwMDBhMjogICAgdmVydGV4IGNvdW50CisweDEyMzAwMmQwOiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDJkNDogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDJkODogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDJkYzogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwMmUwOiAgICAgIDB4NzgwMDAwMDU6IDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTCisweDEyMzAwMmU0OiAgICAgIDB4MDAwMDc5YTA6ICAgIFZTIHN0YXRlCisweDEyMzAwMmU4OiAgICAgIDB4MDAwMDAwMDA6ICAgIEdTIHN0YXRlCisweDEyMzAwMmVjOiAgICAgIDB4MDAwMDc5MDE6ICAgIENsaXAgc3RhdGUKKzB4MTIzMDAyZjA6ICAgICAgMHgwMDAwNzk0MDogICAgU0Ygc3RhdGUKKzB4MTIzMDAyZjQ6ICAgICAgMHgwMDAwNzk2MDogICAgV00gc3RhdGUKKzB4MTIzMDAyZjg6ICAgICAgMHgwMDAwN2NjMDogICAgQ0Mgc3RhdGUKKzB4MTIzMDAyZmM6ICAgICAgMHgwMDAwMDAwMDogTUlfTk9PUAorMHgxMjMwMDMwMDogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDMwNDogICAgICAweDA1MjEyMDQwOiAgICB2cyBmZW5jZTogNjQsIGNsaXBfZmVuY2U6IDgyLCBnc19mZW5jZTogNzIKKzB4MTIzMDAzMDg6ICAgICAgMHgxODAwMDA2MjogICAgc2YgZmVuY2U6IDk4LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAzODQKKzB4MTIzMDAzMGM6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDMxMDogICAgICAweDAwMDAwMjAyOiAgICBvZmZzZXQ6IDB4MDAwMDAyMDAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwMzE0OiAgICAgIDB4N2IwMDE0MDQ6IDNEUFJJTUlUSVZFOiB0cmkgc3RyaXAgc2VxdWVudGlhbAorMHgxMjMwMDMxODogICAgICAweDAwMDAwMDJhOiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDAzMWM6ICAgICAgMHgwMDAwMDBhMjogICAgc3RhcnQgdmVydGV4CisweDEyMzAwMzIwOiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwMzI0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwMzI4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDAzMmM6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDAzMzA6ICAgICAgMHgwMDAwNzg2MDogICAgVlMgc3RhdGUKKzB4MTIzMDAzMzQ6ICAgICAgMHgwMDAwNzgwMTogICAgR1Mgc3RhdGUKKzB4MTIzMDAzMzg6ICAgICAgMHgwMDAwNzgyMTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDMzYzogICAgICAweDAwMDA3ODgwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDM0MDogICAgICAweDAwMDA3OGEwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDM0NDogICAgICAweDAwMDA3Y2MwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDM0ODogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDM0YzogICAgICAweDA1MjEyMDQwOiAgICB2cyBmZW5jZTogNjQsIGNsaXBfZmVuY2U6IDgyLCBnc19mZW5jZTogNzIKKzB4MTIzMDAzNTA6ICAgICAgMHgxODAwMDA2MjogICAgc2YgZmVuY2U6IDk4LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAzODQKKzB4MTIzMDAzNTQ6ICAgICAgMHg3ODA4MDAwMzogM0RTVEFURV9WRVJURVhfQlVGRkVSUworMHgxMjMwMDM1ODogICAgICAweDAwMDAwMDBjOiAgICBidWZmZXIgMDogc2VxdWVudGlhbCwgcGl0Y2ggMTJiCisweDEyMzAwMzVjOiAgICAgIDB4MDAwMDIyNjg6ICAgIGJ1ZmZlciBhZGRyZXNzCisweDEyMzAwMzYwOiAgICAgIDB4MDAwMDAwMDA6ICAgIG1heCBpbmRleAorMHgxMjMwMDM2NDogICAgICAweDAwMDAwMDAwOiAgICBtYnoKKzB4MTIzMDAzNjg6ICAgICAgMHg3ODA5MDAwMTogM0RTVEFURV9WRVJURVhfRUxFTUVOVFMKKzB4MTIzMDAzNmM6ICAgICAgMHgwNDQwMDAwMDogICAgYnVmZmVyIDA6IHZhbGlkLCB0eXBlIDB4MDA0MCwgc3JjIG9mZnNldCAweDAwMDAgYnl0ZXMKKzB4MTIzMDAzNzA6ICAgICAgMHgxMTEzMDAwMDogICAgKFgsIFksIFosIDEuMCksIGRzdCBvZmZzZXQgMHgwMCBieXRlcworMHgxMjMwMDM3NDogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwMzc4OiAgICAgIDB4MDAwMDAyYzI6ICAgIG9mZnNldDogMHgwMDAwMDJjMCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDAzN2M6ICAgICAgMHg3YjAwMjAwNDogM0RQUklNSVRJVkU6IHF1YWQgc3RyaXAgc2VxdWVudGlhbAorMHgxMjMwMDM4MDogICAgICAweDAwMDAwMDJhOiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDAzODQ6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgdmVydGV4CisweDEyMzAwMzg4OiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwMzhjOiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwMzkwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDAzOTQ6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDAzOTg6ICAgICAgMHgwMDAwNzg2MDogICAgVlMgc3RhdGUKKzB4MTIzMDAzOWM6ICAgICAgMHgwMDAwNzdlMTogICAgR1Mgc3RhdGUKKzB4MTIzMDAzYTA6ICAgICAgMHgwMDAwNzgyMTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDNhNDogICAgICAweDAwMDA3ODgwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDNhODogICAgICAweDAwMDA3OGEwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDNhYzogICAgICAweDAwMDA3Y2MwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDNiMDogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDNiNDogICAgICAweDA1MjEyMDQwOiAgICB2cyBmZW5jZTogNjQsIGNsaXBfZmVuY2U6IDgyLCBnc19mZW5jZTogNzIKKzB4MTIzMDAzYjg6ICAgICAgMHgxODAwMDA2MjogICAgc2YgZmVuY2U6IDk4LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAzODQKKzB4MTIzMDAzYmM6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDNjMDogICAgICAweDAwMDAwMmMyOiAgICBvZmZzZXQ6IDB4MDAwMDAyYzAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwM2M0OiAgICAgIDB4N2IwMDFjMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIGxpc3Qgc2VxdWVudGlhbAorMHgxMjMwMDNjODogICAgICAweDAwMDAwMDI4OiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDAzY2M6ICAgICAgMHgwMDAwMDAyYTogICAgc3RhcnQgdmVydGV4CisweDEyMzAwM2QwOiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwM2Q0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwM2Q4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDAzZGM6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDAzZTA6ICAgICAgMHgwMDAwNzg2MDogICAgVlMgc3RhdGUKKzB4MTIzMDAzZTQ6ICAgICAgMHgwMDAwNzdjMTogICAgR1Mgc3RhdGUKKzB4MTIzMDAzZTg6ICAgICAgMHgwMDAwNzgyMTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDNlYzogICAgICAweDAwMDA3ODgwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDNmMDogICAgICAweDAwMDA3OGEwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDNmNDogICAgICAweDAwMDA3Y2MwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDNmODogICAgICAweDAwMDAwMDAwOiBNSV9OT09QCisweDEyMzAwM2ZjOiAgICAgIDB4MDAwMDAwMDA6IE1JX05PT1AKKzB4MTIzMDA0MDA6ICAgICAgMHg2MDAwM2YwMTogVVJCX0ZFTkNFOiBjcyB2ZmUgc2YgY2xpcCBncyB2cyAKKzB4MTIzMDA0MDQ6ICAgICAgMHgwNTIxMjA0MDogICAgdnMgZmVuY2U6IDY0LCBjbGlwX2ZlbmNlOiA4MiwgZ3NfZmVuY2U6IDcyCisweDEyMzAwNDA4OiAgICAgIDB4MTgwMDAwNjI6ICAgIHNmIGZlbmNlOiA5OCwgdmZlX2ZlbmNlOiAwLCBjc19mZW5jZTogMzg0CisweDEyMzAwNDBjOiAgICAgIDB4NjAwMjAxMDA6IENPTlNUQU5UX0JVRkZFUjogdmFsaWQKKzB4MTIzMDA0MTA6ICAgICAgMHgwMDAwMDM4MjogICAgb2Zmc2V0OiAweDAwMDAwMzgwLCBsZW5ndGg6IDE5MiBieXRlcworMHgxMjMwMDQxNDogICAgICAweDdiMDAyMDA0OiAzRFBSSU1JVElWRTogcXVhZCBzdHJpcCBzZXF1ZW50aWFsCisweDEyMzAwNDE4OiAgICAgIDB4MDAwMDAwMmE6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDQxYzogICAgICAweDAwMDAwMDUyOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDA0MjA6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDA0MjQ6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDA0Mjg6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDQyYzogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDQzMDogICAgICAweDAwMDA3ODYwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDQzNDogICAgICAweDAwMDA3N2ExOiAgICBHUyBzdGF0ZQorMHgxMjMwMDQzODogICAgICAweDAwMDA3ODIxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwNDNjOiAgICAgIDB4MDAwMDc4ODA6ICAgIFNGIHN0YXRlCisweDEyMzAwNDQwOiAgICAgIDB4MDAwMDc4YTA6ICAgIFdNIHN0YXRlCisweDEyMzAwNDQ0OiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwNDQ4OiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwNDRjOiAgICAgIDB4MDUyMTIwNDA6ICAgIHZzIGZlbmNlOiA2NCwgY2xpcF9mZW5jZTogODIsIGdzX2ZlbmNlOiA3MgorMHgxMjMwMDQ1MDogICAgICAweDE4MDAwMDYyOiAgICBzZiBmZW5jZTogOTgsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDM4NAorMHgxMjMwMDQ1NDogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwNDU4OiAgICAgIDB4MDAwMDAzODI6ICAgIG9mZnNldDogMHgwMDAwMDM4MCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDA0NWM6ICAgICAgMHg3YjAwMWMwNDogM0RQUklNSVRJVkU6IHF1YWQgbGlzdCBzZXF1ZW50aWFsCisweDEyMzAwNDYwOiAgICAgIDB4MDAwMDAwMjg6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDQ2NDogICAgICAweDAwMDAwMDdjOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDA0Njg6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDA0NmM6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDA0NzA6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDQ3NDogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDQ3ODogICAgICAweDAwMDA3ODYwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDQ3YzogICAgICAweDAwMDA3NzgxOiAgICBHUyBzdGF0ZQorMHgxMjMwMDQ4MDogICAgICAweDAwMDA3ODIxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwNDg0OiAgICAgIDB4MDAwMDc4ODA6ICAgIFNGIHN0YXRlCisweDEyMzAwNDg4OiAgICAgIDB4MDAwMDc4YTA6ICAgIFdNIHN0YXRlCisweDEyMzAwNDhjOiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwNDkwOiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwNDk0OiAgICAgIDB4MDUyMTIwNDA6ICAgIHZzIGZlbmNlOiA2NCwgY2xpcF9mZW5jZTogODIsIGdzX2ZlbmNlOiA3MgorMHgxMjMwMDQ5ODogICAgICAweDE4MDAwMDYyOiAgICBzZiBmZW5jZTogOTgsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDM4NAorMHgxMjMwMDQ5YzogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwNGEwOiAgICAgIDB4MDAwMDAzODI6ICAgIG9mZnNldDogMHgwMDAwMDM4MCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDA0YTQ6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDA0YTg6ICAgICAgMHgwMDAwNzc2MDogICAgVlMgc3RhdGUKKzB4MTIzMDA0YWM6ICAgICAgMHgwMDAwNzc4MTogICAgR1Mgc3RhdGUKKzB4MTIzMDA0YjA6ICAgICAgMHgwMDAwNzgyMTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDRiNDogICAgICAweDAwMDA3ODgwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDRiODogICAgICAweDAwMDA3OGEwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDRiYzogICAgICAweDAwMDA3Y2MwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDRjMDogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDRjNDogICAgICAweDA1MjEyMDQwOiAgICB2cyBmZW5jZTogNjQsIGNsaXBfZmVuY2U6IDgyLCBnc19mZW5jZTogNzIKKzB4MTIzMDA0Yzg6ICAgICAgMHgxODAwMDA2MjogICAgc2YgZmVuY2U6IDk4LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAzODQKKzB4MTIzMDA0Y2M6ICAgICAgMHg3ODA4MDAwMzogM0RTVEFURV9WRVJURVhfQlVGRkVSUworMHgxMjMwMDRkMDogICAgICAweDAwMDAwMDE4OiAgICBidWZmZXIgMDogc2VxdWVudGlhbCwgcGl0Y2ggMjRiCisweDEyMzAwNGQ0OiAgICAgIDB4MDAwMDJhMzA6ICAgIGJ1ZmZlciBhZGRyZXNzCisweDEyMzAwNGQ4OiAgICAgIDB4MDAwMDAwMDA6ICAgIG1heCBpbmRleAorMHgxMjMwMDRkYzogICAgICAweDAwMDAwMDAwOiAgICBtYnoKKzB4MTIzMDA0ZTA6ICAgICAgMHg3ODA5MDAwMzogM0RTVEFURV9WRVJURVhfRUxFTUVOVFMKKzB4MTIzMDA0ZTQ6ICAgICAgMHgwNDQwMDAwMDogICAgYnVmZmVyIDA6IHZhbGlkLCB0eXBlIDB4MDA0MCwgc3JjIG9mZnNldCAweDAwMDAgYnl0ZXMKKzB4MTIzMDA0ZTg6ICAgICAgMHgxMTEzMDAwMDogICAgKFgsIFksIFosIDEuMCksIGRzdCBvZmZzZXQgMHgwMCBieXRlcworMHgxMjMwMDRlYzogICAgICAweDA0NDAwMDBjOiAgICBidWZmZXIgMDogdmFsaWQsIHR5cGUgMHgwMDQwLCBzcmMgb2Zmc2V0IDB4MDAwYyBieXRlcworMHgxMjMwMDRmMDogICAgICAweDExMTMwMDA0OiAgICAoWCwgWSwgWiwgMS4wKSwgZHN0IG9mZnNldCAweDEwIGJ5dGVzCisweDEyMzAwNGY0OiAgICAgIDB4NjAwMjAxMDA6IENPTlNUQU5UX0JVRkZFUjogdmFsaWQKKzB4MTIzMDA0Zjg6ICAgICAgMHgwMDAwMDQ0MjogICAgb2Zmc2V0OiAweDAwMDAwNDQwLCBsZW5ndGg6IDE5MiBieXRlcworMHgxMjMwMDRmYzogICAgICAweDdiMDAyMDA0OiAzRFBSSU1JVElWRTogcXVhZCBzdHJpcCBzZXF1ZW50aWFsCisweDEyMzAwNTAwOiAgICAgIDB4MDAwMDAwNTI6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDUwNDogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDA1MDg6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDA1MGM6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDA1MTA6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDUxNDogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDUxODogICAgICAweDAwMDA3NzYwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDUxYzogICAgICAweDAwMDAwMDAwOiAgICBHUyBzdGF0ZQorMHgxMjMwMDUyMDogICAgICAweDAwMDA3NmMxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwNTI0OiAgICAgIDB4MDAwMDc3MDA6ICAgIFNGIHN0YXRlCisweDEyMzAwNTI4OiAgICAgIDB4MDAwMDc3MjA6ICAgIFdNIHN0YXRlCisweDEyMzAwNTJjOiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwNTMwOiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwNTM0OiAgICAgIDB4MDUyMTIwNDA6ICAgIHZzIGZlbmNlOiA2NCwgY2xpcF9mZW5jZTogODIsIGdzX2ZlbmNlOiA3MgorMHgxMjMwMDUzODogICAgICAweDE4MDAwMDYyOiAgICBzZiBmZW5jZTogOTgsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDM4NAorMHgxMjMwMDUzYzogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwNTQwOiAgICAgIDB4MDAwMDA0NDI6ICAgIG9mZnNldDogMHgwMDAwMDQ0MCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDA1NDQ6ICAgICAgMHg3YjAwMTQwNDogM0RQUklNSVRJVkU6IHRyaSBzdHJpcCBzZXF1ZW50aWFsCisweDEyMzAwNTQ4OiAgICAgIDB4MDAwMDAwMTY6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDU0YzogICAgICAweDAwMDAwMDUyOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDA1NTA6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDA1NTQ6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDA1NTg6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDU1YzogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDU2MDogICAgICAweDAwMDA3NjIwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDU2NDogICAgICAweDAwMDA3NWMxOiAgICBHUyBzdGF0ZQorMHgxMjMwMDU2ODogICAgICAweDAwMDA3NWUxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwNTZjOiAgICAgIDB4MDAwMDc2NDA6ICAgIFNGIHN0YXRlCisweDEyMzAwNTcwOiAgICAgIDB4MDAwMDc2NjA6ICAgIFdNIHN0YXRlCisweDEyMzAwNTc0OiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwNTc4OiAgICAgIDB4MDAwMDAwMDA6IE1JX05PT1AKKzB4MTIzMDA1N2M6ICAgICAgMHgwMDAwMDAwMDogTUlfTk9PUAorMHgxMjMwMDU4MDogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDU4NDogICAgICAweDA1MjEyMDQwOiAgICB2cyBmZW5jZTogNjQsIGNsaXBfZmVuY2U6IDgyLCBnc19mZW5jZTogNzIKKzB4MTIzMDA1ODg6ICAgICAgMHgxODAwMDA2MjogICAgc2YgZmVuY2U6IDk4LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAzODQKKzB4MTIzMDA1OGM6ICAgICAgMHg3ODA4MDAwMzogM0RTVEFURV9WRVJURVhfQlVGRkVSUworMHgxMjMwMDU5MDogICAgICAweDAwMDAwMDBjOiAgICBidWZmZXIgMDogc2VxdWVudGlhbCwgcGl0Y2ggMTJiCisweDEyMzAwNTk0OiAgICAgIDB4MDAwMDMzZjA6ICAgIGJ1ZmZlciBhZGRyZXNzCisweDEyMzAwNTk4OiAgICAgIDB4MDAwMDAwMDA6ICAgIG1heCBpbmRleAorMHgxMjMwMDU5YzogICAgICAweDAwMDAwMDAwOiAgICBtYnoKKzB4MTIzMDA1YTA6ICAgICAgMHg3ODA5MDAwMTogM0RTVEFURV9WRVJURVhfRUxFTUVOVFMKKzB4MTIzMDA1YTQ6ICAgICAgMHgwNDQwMDAwMDogICAgYnVmZmVyIDA6IHZhbGlkLCB0eXBlIDB4MDA0MCwgc3JjIG9mZnNldCAweDAwMDAgYnl0ZXMKKzB4MTIzMDA1YTg6ICAgICAgMHgxMTEzMDAwMDogICAgKFgsIFksIFosIDEuMCksIGRzdCBvZmZzZXQgMHgwMCBieXRlcworMHgxMjMwMDVhYzogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwNWIwOiAgICAgIDB4MDAwMDA1MDI6ICAgIG9mZnNldDogMHgwMDAwMDUwMCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDA1YjQ6ICAgICAgMHg3YjAwMjAwNDogM0RQUklNSVRJVkU6IHF1YWQgc3RyaXAgc2VxdWVudGlhbAorMHgxMjMwMDViODogICAgICAweDAwMDAwMDJhOiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDA1YmM6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgdmVydGV4CisweDEyMzAwNWMwOiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwNWM0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwNWM4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDA1Y2M6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDA1ZDA6ICAgICAgMHgwMDAwNzYyMDogICAgVlMgc3RhdGUKKzB4MTIzMDA1ZDQ6ICAgICAgMHgwMDAwNzVhMTogICAgR1Mgc3RhdGUKKzB4MTIzMDA1ZDg6ICAgICAgMHgwMDAwNzVlMTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDVkYzogICAgICAweDAwMDA3NjQwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDVlMDogICAgICAweDAwMDA3NjYwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDVlNDogICAgICAweDAwMDA3Y2MwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDVlODogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDVlYzogICAgICAweDA1MjEyMDQwOiAgICB2cyBmZW5jZTogNjQsIGNsaXBfZmVuY2U6IDgyLCBnc19mZW5jZTogNzIKKzB4MTIzMDA1ZjA6ICAgICAgMHgxODAwMDA2MjogICAgc2YgZmVuY2U6IDk4LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAzODQKKzB4MTIzMDA1ZjQ6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDVmODogICAgICAweDAwMDAwNTAyOiAgICBvZmZzZXQ6IDB4MDAwMDA1MDAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwNWZjOiAgICAgIDB4N2IwMDFjMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIGxpc3Qgc2VxdWVudGlhbAorMHgxMjMwMDYwMDogICAgICAweDAwMDAwMDI4OiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDA2MDQ6ICAgICAgMHgwMDAwMDAyYTogICAgc3RhcnQgdmVydGV4CisweDEyMzAwNjA4OiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwNjBjOiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwNjEwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDA2MTQ6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDA2MTg6ICAgICAgMHgwMDAwNzYyMDogICAgVlMgc3RhdGUKKzB4MTIzMDA2MWM6ICAgICAgMHgwMDAwNzU4MTogICAgR1Mgc3RhdGUKKzB4MTIzMDA2MjA6ICAgICAgMHgwMDAwNzVlMTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDYyNDogICAgICAweDAwMDA3NjQwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDYyODogICAgICAweDAwMDA3NjYwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDYyYzogICAgICAweDAwMDA3Y2MwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDYzMDogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDYzNDogICAgICAweDA1MjEyMDQwOiAgICB2cyBmZW5jZTogNjQsIGNsaXBfZmVuY2U6IDgyLCBnc19mZW5jZTogNzIKKzB4MTIzMDA2Mzg6ICAgICAgMHgxODAwMDA2MjogICAgc2YgZmVuY2U6IDk4LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAzODQKKzB4MTIzMDA2M2M6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDY0MDogICAgICAweDAwMDAwNWMyOiAgICBvZmZzZXQ6IDB4MDAwMDA1YzAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwNjQ0OiAgICAgIDB4N2IwMDIwMDQ6IDNEUFJJTUlUSVZFOiBxdWFkIHN0cmlwIHNlcXVlbnRpYWwKKzB4MTIzMDA2NDg6ICAgICAgMHgwMDAwMDAyYTogICAgdmVydGV4IGNvdW50CisweDEyMzAwNjRjOiAgICAgIDB4MDAwMDAwNTI6ICAgIHN0YXJ0IHZlcnRleAorMHgxMjMwMDY1MDogICAgICAweDAwMDAwMDAxOiAgICBpbnN0YW5jZSBjb3VudAorMHgxMjMwMDY1NDogICAgICAweDAwMDAwMDAwOiAgICBzdGFydCBpbnN0YW5jZQorMHgxMjMwMDY1ODogICAgICAweDAwMDAwMDAwOiAgICBpbmRleCBiaWFzCisweDEyMzAwNjVjOiAgICAgIDB4NzgwMDAwMDU6IDNEU1RBVEVfUElQRUxJTkVEX1BPSU5URVJTCisweDEyMzAwNjYwOiAgICAgIDB4MDAwMDc2MjA6ICAgIFZTIHN0YXRlCisweDEyMzAwNjY0OiAgICAgIDB4MDAwMDc1NjE6ICAgIEdTIHN0YXRlCisweDEyMzAwNjY4OiAgICAgIDB4MDAwMDc1ZTE6ICAgIENsaXAgc3RhdGUKKzB4MTIzMDA2NmM6ICAgICAgMHgwMDAwNzY0MDogICAgU0Ygc3RhdGUKKzB4MTIzMDA2NzA6ICAgICAgMHgwMDAwNzY2MDogICAgV00gc3RhdGUKKzB4MTIzMDA2NzQ6ICAgICAgMHgwMDAwN2NjMDogICAgQ0Mgc3RhdGUKKzB4MTIzMDA2Nzg6ICAgICAgMHgwMDAwMDAwMDogTUlfTk9PUAorMHgxMjMwMDY3YzogICAgICAweDAwMDAwMDAwOiBNSV9OT09QCisweDEyMzAwNjgwOiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwNjg0OiAgICAgIDB4MDUyMTIwNDA6ICAgIHZzIGZlbmNlOiA2NCwgY2xpcF9mZW5jZTogODIsIGdzX2ZlbmNlOiA3MgorMHgxMjMwMDY4ODogICAgICAweDE4MDAwMDYyOiAgICBzZiBmZW5jZTogOTgsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDM4NAorMHgxMjMwMDY4YzogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwNjkwOiAgICAgIDB4MDAwMDA1YzI6ICAgIG9mZnNldDogMHgwMDAwMDVjMCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDA2OTQ6ICAgICAgMHg3YjAwMWMwNDogM0RQUklNSVRJVkU6IHF1YWQgbGlzdCBzZXF1ZW50aWFsCisweDEyMzAwNjk4OiAgICAgIDB4MDAwMDAwMjg6ICAgIHZlcnRleCBjb3VudAorMHgxMjMwMDY5YzogICAgICAweDAwMDAwMDdjOiAgICBzdGFydCB2ZXJ0ZXgKKzB4MTIzMDA2YTA6ICAgICAgMHgwMDAwMDAwMTogICAgaW5zdGFuY2UgY291bnQKKzB4MTIzMDA2YTQ6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgaW5zdGFuY2UKKzB4MTIzMDA2YTg6ICAgICAgMHgwMDAwMDAwMDogICAgaW5kZXggYmlhcworMHgxMjMwMDZhYzogICAgICAweDc4MDAwMDA1OiAzRFNUQVRFX1BJUEVMSU5FRF9QT0lOVEVSUworMHgxMjMwMDZiMDogICAgICAweDAwMDA3NjIwOiAgICBWUyBzdGF0ZQorMHgxMjMwMDZiNDogICAgICAweDAwMDA3NTQxOiAgICBHUyBzdGF0ZQorMHgxMjMwMDZiODogICAgICAweDAwMDA3NWUxOiAgICBDbGlwIHN0YXRlCisweDEyMzAwNmJjOiAgICAgIDB4MDAwMDc2NDA6ICAgIFNGIHN0YXRlCisweDEyMzAwNmMwOiAgICAgIDB4MDAwMDc2NjA6ICAgIFdNIHN0YXRlCisweDEyMzAwNmM0OiAgICAgIDB4MDAwMDdjYzA6ICAgIENDIHN0YXRlCisweDEyMzAwNmM4OiAgICAgIDB4NjAwMDNmMDE6IFVSQl9GRU5DRTogY3MgdmZlIHNmIGNsaXAgZ3MgdnMgCisweDEyMzAwNmNjOiAgICAgIDB4MDUyMTIwNDA6ICAgIHZzIGZlbmNlOiA2NCwgY2xpcF9mZW5jZTogODIsIGdzX2ZlbmNlOiA3MgorMHgxMjMwMDZkMDogICAgICAweDE4MDAwMDYyOiAgICBzZiBmZW5jZTogOTgsIHZmZV9mZW5jZTogMCwgY3NfZmVuY2U6IDM4NAorMHgxMjMwMDZkNDogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwNmQ4OiAgICAgIDB4MDAwMDA1YzI6ICAgIG9mZnNldDogMHgwMDAwMDVjMCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDA2ZGM6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDA2ZTA6ICAgICAgMHgwMDAwNzUyMDogICAgVlMgc3RhdGUKKzB4MTIzMDA2ZTQ6ICAgICAgMHgwMDAwNzU0MTogICAgR1Mgc3RhdGUKKzB4MTIzMDA2ZTg6ICAgICAgMHgwMDAwNzVlMTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDZlYzogICAgICAweDAwMDA3NjQwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDZmMDogICAgICAweDAwMDA3NjYwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDZmNDogICAgICAweDAwMDA3Y2MwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDZmODogICAgICAweDAwMDAwMDAwOiBNSV9OT09QCisweDEyMzAwNmZjOiAgICAgIDB4MDAwMDAwMDA6IE1JX05PT1AKKzB4MTIzMDA3MDA6ICAgICAgMHg2MDAwM2YwMTogVVJCX0ZFTkNFOiBjcyB2ZmUgc2YgY2xpcCBncyB2cyAKKzB4MTIzMDA3MDQ6ICAgICAgMHgwNTIxMjA0MDogICAgdnMgZmVuY2U6IDY0LCBjbGlwX2ZlbmNlOiA4MiwgZ3NfZmVuY2U6IDcyCisweDEyMzAwNzA4OiAgICAgIDB4MTgwMDAwNjI6ICAgIHNmIGZlbmNlOiA5OCwgdmZlX2ZlbmNlOiAwLCBjc19mZW5jZTogMzg0CisweDEyMzAwNzBjOiAgICAgIDB4NzgwODAwMDM6IDNEU1RBVEVfVkVSVEVYX0JVRkZFUlMKKzB4MTIzMDA3MTA6ICAgICAgMHgwMDAwMDAxODogICAgYnVmZmVyIDA6IHNlcXVlbnRpYWwsIHBpdGNoIDI0YgorMHgxMjMwMDcxNDogICAgICAweDAwMDAzYmI4OiAgICBidWZmZXIgYWRkcmVzcworMHgxMjMwMDcxODogICAgICAweDAwMDAwMDAwOiAgICBtYXggaW5kZXgKKzB4MTIzMDA3MWM6ICAgICAgMHgwMDAwMDAwMDogICAgbWJ6CisweDEyMzAwNzIwOiAgICAgIDB4NzgwOTAwMDM6IDNEU1RBVEVfVkVSVEVYX0VMRU1FTlRTCisweDEyMzAwNzI0OiAgICAgIDB4MDQ0MDAwMDA6ICAgIGJ1ZmZlciAwOiB2YWxpZCwgdHlwZSAweDAwNDAsIHNyYyBvZmZzZXQgMHgwMDAwIGJ5dGVzCisweDEyMzAwNzI4OiAgICAgIDB4MTExMzAwMDA6ICAgIChYLCBZLCBaLCAxLjApLCBkc3Qgb2Zmc2V0IDB4MDAgYnl0ZXMKKzB4MTIzMDA3MmM6ICAgICAgMHgwNDQwMDAwYzogICAgYnVmZmVyIDA6IHZhbGlkLCB0eXBlIDB4MDA0MCwgc3JjIG9mZnNldCAweDAwMGMgYnl0ZXMKKzB4MTIzMDA3MzA6ICAgICAgMHgxMTEzMDAwNDogICAgKFgsIFksIFosIDEuMCksIGRzdCBvZmZzZXQgMHgxMCBieXRlcworMHgxMjMwMDczNDogICAgICAweDYwMDIwMTAwOiBDT05TVEFOVF9CVUZGRVI6IHZhbGlkCisweDEyMzAwNzM4OiAgICAgIDB4MDAwMDA2ODI6ICAgIG9mZnNldDogMHgwMDAwMDY4MCwgbGVuZ3RoOiAxOTIgYnl0ZXMKKzB4MTIzMDA3M2M6ICAgICAgMHg3YjAwMjAwNDogM0RQUklNSVRJVkU6IHF1YWQgc3RyaXAgc2VxdWVudGlhbAorMHgxMjMwMDc0MDogICAgICAweDAwMDAwMDUyOiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDA3NDQ6ICAgICAgMHgwMDAwMDAwMDogICAgc3RhcnQgdmVydGV4CisweDEyMzAwNzQ4OiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwNzRjOiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwNzUwOiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDA3NTQ6ICAgICAgMHg3ODAwMDAwNTogM0RTVEFURV9QSVBFTElORURfUE9JTlRFUlMKKzB4MTIzMDA3NTg6ICAgICAgMHgwMDAwNzUyMDogICAgVlMgc3RhdGUKKzB4MTIzMDA3NWM6ICAgICAgMHgwMDAwMDAwMDogICAgR1Mgc3RhdGUKKzB4MTIzMDA3NjA6ICAgICAgMHgwMDAwNzQ4MTogICAgQ2xpcCBzdGF0ZQorMHgxMjMwMDc2NDogICAgICAweDAwMDA3NGMwOiAgICBTRiBzdGF0ZQorMHgxMjMwMDc2ODogICAgICAweDAwMDA3NGUwOiAgICBXTSBzdGF0ZQorMHgxMjMwMDc2YzogICAgICAweDAwMDA3Y2MwOiAgICBDQyBzdGF0ZQorMHgxMjMwMDc3MDogICAgICAweDYwMDAzZjAxOiBVUkJfRkVOQ0U6IGNzIHZmZSBzZiBjbGlwIGdzIHZzIAorMHgxMjMwMDc3NDogICAgICAweDA1MjEyMDQwOiAgICB2cyBmZW5jZTogNjQsIGNsaXBfZmVuY2U6IDgyLCBnc19mZW5jZTogNzIKKzB4MTIzMDA3Nzg6ICAgICAgMHgxODAwMDA2MjogICAgc2YgZmVuY2U6IDk4LCB2ZmVfZmVuY2U6IDAsIGNzX2ZlbmNlOiAzODQKKzB4MTIzMDA3N2M6ICAgICAgMHg2MDAyMDEwMDogQ09OU1RBTlRfQlVGRkVSOiB2YWxpZAorMHgxMjMwMDc4MDogICAgICAweDAwMDAwNjgyOiAgICBvZmZzZXQ6IDB4MDAwMDA2ODAsIGxlbmd0aDogMTkyIGJ5dGVzCisweDEyMzAwNzg0OiAgICAgIDB4N2IwMDE0MDQ6IDNEUFJJTUlUSVZFOiB0cmkgc3RyaXAgc2VxdWVudGlhbAorMHgxMjMwMDc4ODogICAgICAweDAwMDAwMDE2OiAgICB2ZXJ0ZXggY291bnQKKzB4MTIzMDA3OGM6ICAgICAgMHgwMDAwMDA1MjogICAgc3RhcnQgdmVydGV4CisweDEyMzAwNzkwOiAgICAgIDB4MDAwMDAwMDE6ICAgIGluc3RhbmNlIGNvdW50CisweDEyMzAwNzk0OiAgICAgIDB4MDAwMDAwMDA6ICAgIHN0YXJ0IGluc3RhbmNlCisweDEyMzAwNzk4OiAgICAgIDB4MDAwMDAwMDA6ICAgIGluZGV4IGJpYXMKKzB4MTIzMDA3OWM6ICAgICAgMHgwNTAwMDAwMDogTUlfQkFUQ0hfQlVGRkVSX0VORApkaWZmIC0tZ2l0IGEvaW50ZWwvdGVzdHMvZ200NS0zZC5iYXRjaC5zaCBiL2ludGVsL3Rlc3RzL2dtNDUtM2QuYmF0Y2guc2gKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNzk2Y2E1ZgotLS0gL2Rldi9udWxsCisrKyBiL2ludGVsL3Rlc3RzL2dtNDUtM2QuYmF0Y2guc2gKQEAgLTAsMCArMSBAQAordGVzdC1iYXRjaC5zaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ludGVsL3Rlc3RzL3Rlc3QtYmF0Y2guc2ggYi9pbnRlbC90ZXN0cy90ZXN0LWJhdGNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE5NDA1N2YKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlbC90ZXN0cy90ZXN0LWJhdGNoLnNoCkBAIC0wLDAgKzEsMjAgQEAKKyMhL2Jpbi9zaAorCitURVNUX0ZJTEVOQU1FPWBlY2hvICIkMCIgfCBzZWQgJ3N8LnNofHwnYAorLi90ZXN0X2RlY29kZSAkVEVTVF9GSUxFTkFNRQorCityZXQ9JD8KKworIyBwcmV0dHktcHJpbnQgYSBkaWZmIHNob3dpbmcgd2hhdCBoYXBwZW5lZCwgYW5kIGxlYXZlIHRoZSBkdW1wZWQKKyMgYXJvdW5kIGZvciBwb3NzaWJseSBtb3Zpbmcgb3ZlciB0aGUgcmVmLgoraWYgdGVzdCAkcmV0ID0gMTsgdGhlbgorICAgIFJFRl9GSUxFTkFNRT0iJFRFU1RfRklMRU5BTUUtcmVmLnR4dCIKKyAgICBORVdfRklMRU5BTUU9IiRURVNUX0ZJTEVOQU1FLW5ldy50eHQiCisgICAgLi90ZXN0X2RlY29kZSAkVEVTVF9GSUxFTkFNRSAtZHVtcCA+ICRORVdfRklMRU5BTUUKKyAgICBpZiB0ZXN0ICQ/ID0gMDsgdGhlbgorCWVjaG8gIkRpZmZlcmVuY2VzOiIKKwlkaWZmIC11ICRSRUZfRklMRU5BTUUgJE5FV19GSUxFTkFNRQorICAgIGZpCitmaQorCitleGl0ICRyZXQKZGlmZiAtLWdpdCBhL2ludGVsL3V0aGFzaC5oIGIvaW50ZWwvdXRoYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVkMWY5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ludGVsL3V0aGFzaC5oCkBAIC0wLDAgKzEsMTA3NCBAQAorLyoKK0NvcHlyaWdodCAoYykgMjAwMy0yMDE2LCBUcm95IEQuIEhhbnNvbiAgICAgaHR0cDovL3Ryb3lkaGFuc29uLmdpdGh1Yi5jb20vdXRoYXNoLworQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKK0lTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIKK09SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCitQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKyNpZm5kZWYgVVRIQVNIX0gKKyNkZWZpbmUgVVRIQVNIX0gKKworI2RlZmluZSBVVEhBU0hfVkVSU0lPTiAyLjAuMQorCisjaW5jbHVkZSA8c3RyaW5nLmg+ICAgLyogbWVtY21wLHN0cmxlbiAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPiAgIC8qIHB0cmRpZmZfdCAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPiAgIC8qIGV4aXQoKSAqLworCisvKiBUaGVzZSBtYWNyb3MgdXNlIGRlY2x0eXBlIG9yIHRoZSBlYXJsaWVyIF9fdHlwZW9mIEdOVSBleHRlbnNpb24uCisgICBBcyBkZWNsdHlwZSBpcyBvbmx5IGF2YWlsYWJsZSBpbiBuZXdlciBjb21waWxlcnMgKFZTMjAxMCBvciBnY2MgNC4zKworICAgd2hlbiBjb21waWxpbmcgYysrIHNvdXJjZSkgdGhpcyBjb2RlIHVzZXMgd2hhdGV2ZXIgbWV0aG9kIGlzIG5lZWRlZAorICAgb3IsIGZvciBWUzIwMDggd2hlcmUgbmVpdGhlciBpcyBhdmFpbGFibGUsIHVzZXMgY2FzdGluZyB3b3JrYXJvdW5kcy4gKi8KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAgIC8qIE1TIGNvbXBpbGVyICovCisjaWYgX01TQ19WRVIgPj0gMTYwMCAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAgLyogVlMyMDEwIG9yIG5ld2VyIGluIEMrKyBtb2RlICovCisjZGVmaW5lIERFQ0xUWVBFKHgpIChkZWNsdHlwZSh4KSkKKyNlbHNlICAgICAgICAgICAgICAgICAgIC8qIFZTMjAwOCBvciBvbGRlciAob3IgVlMyMDEwIGluIEMgbW9kZSkgKi8KKyNkZWZpbmUgTk9fREVDTFRZUEUKKyNkZWZpbmUgREVDTFRZUEUoeCkKKyNlbmRpZgorI2VsaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQoX19MQ0NfXykgfHwgZGVmaW5lZChfX1dBVENPTUNfXykKKyNkZWZpbmUgTk9fREVDTFRZUEUKKyNkZWZpbmUgREVDTFRZUEUoeCkKKyNlbHNlICAgICAgICAgICAgICAgICAgIC8qIEdOVSwgU3VuIGFuZCBvdGhlciBjb21waWxlcnMgKi8KKyNkZWZpbmUgREVDTFRZUEUoeCkgKF9fdHlwZW9mKHgpKQorI2VuZGlmCisKKyNpZmRlZiBOT19ERUNMVFlQRQorI2RlZmluZSBERUNMVFlQRV9BU1NJR04oZHN0LHNyYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjaGFyICoqX2RhX2RzdCA9IChjaGFyKiopKCYoZHN0KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAqX2RhX2RzdCA9IChjaGFyKikoc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIERFQ0xUWVBFX0FTU0lHTihkc3Qsc3JjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChkc3QpID0gREVDTFRZUEUoZHN0KShzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIGEgbnVtYmVyIG9mIHRoZSBoYXNoIGZ1bmN0aW9uIHVzZSB1aW50MzJfdCB3aGljaCBpc24ndCBkZWZpbmVkIG9uIFByZSBWUzIwMTAgKi8KKyNpZiBkZWZpbmVkKF9XSU4zMikKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA+PSAxNjAwCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZWxpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDhfdDsKKyNlbmRpZgorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19WWFdPUktTX18pCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDhfdDsKKyNlbmRpZgorCisjaWZuZGVmIHV0aGFzaF9mYXRhbAorI2RlZmluZSB1dGhhc2hfZmF0YWwobXNnKSBleGl0KC0xKSAgICAgICAgLyogZmF0YWwgZXJyb3IgKG91dCBvZiBtZW1vcnksZXRjKSAqLworI2VuZGlmCisjaWZuZGVmIHV0aGFzaF9tYWxsb2MKKyNkZWZpbmUgdXRoYXNoX21hbGxvYyhzeikgbWFsbG9jKHN6KSAgICAgIC8qIG1hbGxvYyBmY24gICAgICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZgorI2lmbmRlZiB1dGhhc2hfZnJlZQorI2RlZmluZSB1dGhhc2hfZnJlZShwdHIsc3opIGZyZWUocHRyKSAgICAgLyogZnJlZSBmY24gICAgICAgICAgICAgICAgICAgICAgICAqLworI2VuZGlmCisjaWZuZGVmIHV0aGFzaF9zdHJsZW4KKyNkZWZpbmUgdXRoYXNoX3N0cmxlbihzKSBzdHJsZW4ocykKKyNlbmRpZgorI2lmbmRlZiB1dGhhc2hfbWVtY21wCisjZGVmaW5lIHV0aGFzaF9tZW1jbXAoYSxiLG4pIG1lbWNtcChhLGIsbikKKyNlbmRpZgorCisjaWZuZGVmIHV0aGFzaF9ub2V4cGFuZF9meWkKKyNkZWZpbmUgdXRoYXNoX25vZXhwYW5kX2Z5aSh0YmwpICAgICAgICAgIC8qIGNhbiBiZSBkZWZpbmVkIHRvIGxvZyBub2V4cGFuZCAgKi8KKyNlbmRpZgorI2lmbmRlZiB1dGhhc2hfZXhwYW5kX2Z5aQorI2RlZmluZSB1dGhhc2hfZXhwYW5kX2Z5aSh0YmwpICAgICAgICAgICAgLyogY2FuIGJlIGRlZmluZWQgdG8gbG9nIGV4cGFuZHMgICAqLworI2VuZGlmCisKKy8qIGluaXRpYWwgbnVtYmVyIG9mIGJ1Y2tldHMgKi8KKyNkZWZpbmUgSEFTSF9JTklUSUFMX05VTV9CVUNLRVRTIDMyVSAgICAgLyogaW5pdGlhbCBudW1iZXIgb2YgYnVja2V0cyAgICAgICAgKi8KKyNkZWZpbmUgSEFTSF9JTklUSUFMX05VTV9CVUNLRVRTX0xPRzIgNVUgLyogbGcyIG9mIGluaXRpYWwgbnVtYmVyIG9mIGJ1Y2tldHMgKi8KKyNkZWZpbmUgSEFTSF9CS1RfQ0FQQUNJVFlfVEhSRVNIIDEwVSAgICAgLyogZXhwYW5kIHdoZW4gYnVja2V0IGNvdW50IHJlYWNoZXMgKi8KKworLyogY2FsY3VsYXRlIHRoZSBlbGVtZW50IHdob3NlIGhhc2ggaGFuZGxlIGFkZHJlc3MgaXMgaGhwICovCisjZGVmaW5lIEVMTVRfRlJPTV9ISCh0YmwsaGhwKSAoKHZvaWQqKSgoKGNoYXIqKShoaHApKSAtICgodGJsKS0+aGhvKSkpCisvKiBjYWxjdWxhdGUgdGhlIGhhc2ggaGFuZGxlIGZyb20gZWxlbWVudCBhZGRyZXNzIGVscCAqLworI2RlZmluZSBISF9GUk9NX0VMTVQodGJsLGVscCkgKChVVF9oYXNoX2hhbmRsZSAqKSgoKGNoYXIqKShlbHApKSArICgodGJsKS0+aGhvKSkpCisKKyNkZWZpbmUgSEFTSF9WQUxVRShrZXlwdHIsa2V5bGVuLGhhc2h2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9GQ04oa2V5cHRyLCBrZXlsZW4sIGhhc2h2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSEFTSF9GSU5EX0JZSEFTSFZBTFVFKGhoLGhlYWQsa2V5cHRyLGtleWxlbixoYXNodmFsLG91dCkgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKG91dCkgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGhlYWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1bnNpZ25lZCBfaGZfYmt0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBIQVNIX1RPX0JLVChoYXNodmFsLCAoaGVhZCktPmhoLnRibC0+bnVtX2J1Y2tldHMsIF9oZl9ia3QpOyAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoSEFTSF9CTE9PTV9URVNUKChoZWFkKS0+aGgudGJsLCBoYXNodmFsKSAhPSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEhBU0hfRklORF9JTl9CS1QoKGhlYWQpLT5oaC50YmwsIGhoLCAoaGVhZCktPmhoLnRibC0+YnVja2V0c1sgX2hmX2JrdCBdLCBrZXlwdHIsIGtleWxlbiwgaGFzaHZhbCwgb3V0KTsgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBIQVNIX0ZJTkQoaGgsaGVhZCxrZXlwdHIsa2V5bGVuLG91dCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bnNpZ25lZCBfaGZfaGFzaHY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBIQVNIX1ZBTFVFKGtleXB0ciwga2V5bGVuLCBfaGZfaGFzaHYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBIQVNIX0ZJTkRfQllIQVNIVkFMVUUoaGgsIGhlYWQsIGtleXB0ciwga2V5bGVuLCBfaGZfaGFzaHYsIG91dCk7ICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2lmZGVmIEhBU0hfQkxPT00KKyNkZWZpbmUgSEFTSF9CTE9PTV9CSVRMRU4gKDFVTCA8PCBIQVNIX0JMT09NKQorI2RlZmluZSBIQVNIX0JMT09NX0JZVEVMRU4gKEhBU0hfQkxPT01fQklUTEVOLzhVTCkgKyAoKChIQVNIX0JMT09NX0JJVExFTiU4VUwpIT0wVUwpID8gMVVMIDogMFVMKQorI2RlZmluZSBIQVNIX0JMT09NX01BS0UodGJsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAodGJsKS0+Ymxvb21fbmJpdHMgPSBIQVNIX0JMT09NOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAodGJsKS0+Ymxvb21fYnYgPSAodWludDhfdCopdXRoYXNoX21hbGxvYyhIQVNIX0JMT09NX0JZVEVMRU4pOyAgICAgICAgICAgICAgICAgXAorICBpZiAoISgodGJsKS0+Ymxvb21fYnYpKSAgeyB1dGhhc2hfZmF0YWwoICJvdXQgb2YgbWVtb3J5Iik7IH0gICAgICAgICAgICAgICAgICAgXAorICBtZW1zZXQoKHRibCktPmJsb29tX2J2LCAwLCBIQVNIX0JMT09NX0JZVEVMRU4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAodGJsKS0+Ymxvb21fc2lnID0gSEFTSF9CTE9PTV9TSUdOQVRVUkU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBIQVNIX0JMT09NX0ZSRUUodGJsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1dGhhc2hfZnJlZSgodGJsKS0+Ymxvb21fYnYsIEhBU0hfQkxPT01fQllURUxFTik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBIQVNIX0JMT09NX0JJVFNFVChidixpZHgpIChidlsoaWR4KS84VV0gfD0gKDFVIDw8ICgoaWR4KSU4VSkpKQorI2RlZmluZSBIQVNIX0JMT09NX0JJVFRFU1QoYnYsaWR4KSAoYnZbKGlkeCkvOFVdICYgKDFVIDw8ICgoaWR4KSU4VSkpKQorCisjZGVmaW5lIEhBU0hfQkxPT01fQUREKHRibCxoYXNodikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEhBU0hfQkxPT01fQklUU0VUKCh0YmwpLT5ibG9vbV9idiwgKGhhc2h2ICYgKHVpbnQzMl90KSgoMVVMTCA8PCAodGJsKS0+Ymxvb21fbmJpdHMpIC0gMVUpKSkKKworI2RlZmluZSBIQVNIX0JMT09NX1RFU1QodGJsLGhhc2h2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBIQVNIX0JMT09NX0JJVFRFU1QoKHRibCktPmJsb29tX2J2LCAoaGFzaHYgJiAodWludDMyX3QpKCgxVUxMIDw8ICh0YmwpLT5ibG9vbV9uYml0cykgLSAxVSkpKQorCisjZWxzZQorI2RlZmluZSBIQVNIX0JMT09NX01BS0UodGJsKQorI2RlZmluZSBIQVNIX0JMT09NX0ZSRUUodGJsKQorI2RlZmluZSBIQVNIX0JMT09NX0FERCh0YmwsaGFzaHYpCisjZGVmaW5lIEhBU0hfQkxPT01fVEVTVCh0YmwsaGFzaHYpICgxKQorI2RlZmluZSBIQVNIX0JMT09NX0JZVEVMRU4gMFUKKyNlbmRpZgorCisjZGVmaW5lIEhBU0hfTUFLRV9UQUJMRShoaCxoZWFkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChoZWFkKS0+aGgudGJsID0gKFVUX2hhc2hfdGFibGUqKXV0aGFzaF9tYWxsb2MoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBzaXplb2YoVVRfaGFzaF90YWJsZSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICghKChoZWFkKS0+aGgudGJsKSkgIHsgdXRoYXNoX2ZhdGFsKCAib3V0IG9mIG1lbW9yeSIpOyB9ICAgICAgICAgICAgICAgICAgICBcCisgIG1lbXNldCgoaGVhZCktPmhoLnRibCwgMCwgc2l6ZW9mKFVUX2hhc2hfdGFibGUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChoZWFkKS0+aGgudGJsLT50YWlsID0gJigoaGVhZCktPmhoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChoZWFkKS0+aGgudGJsLT5udW1fYnVja2V0cyA9IEhBU0hfSU5JVElBTF9OVU1fQlVDS0VUUzsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChoZWFkKS0+aGgudGJsLT5sb2cyX251bV9idWNrZXRzID0gSEFTSF9JTklUSUFMX05VTV9CVUNLRVRTX0xPRzI7ICAgICAgICAgICAgICBcCisgIChoZWFkKS0+aGgudGJsLT5oaG8gPSAoY2hhciopKCYoaGVhZCktPmhoKSAtIChjaGFyKikoaGVhZCk7ICAgICAgICAgICAgICAgICAgICBcCisgIChoZWFkKS0+aGgudGJsLT5idWNrZXRzID0gKFVUX2hhc2hfYnVja2V0Kil1dGhhc2hfbWFsbG9jKCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgSEFTSF9JTklUSUFMX05VTV9CVUNLRVRTKnNpemVvZihzdHJ1Y3QgVVRfaGFzaF9idWNrZXQpKTsgICAgICAgICAgICAgICBcCisgIGlmICghIChoZWFkKS0+aGgudGJsLT5idWNrZXRzKSB7IHV0aGFzaF9mYXRhbCggIm91dCBvZiBtZW1vcnkiKTsgfSAgICAgICAgICAgICBcCisgIG1lbXNldCgoaGVhZCktPmhoLnRibC0+YnVja2V0cywgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgSEFTSF9JTklUSUFMX05VTV9CVUNLRVRTKnNpemVvZihzdHJ1Y3QgVVRfaGFzaF9idWNrZXQpKTsgICAgICAgICAgICAgICBcCisgIEhBU0hfQkxPT01fTUFLRSgoaGVhZCktPmhoLnRibCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChoZWFkKS0+aGgudGJsLT5zaWduYXR1cmUgPSBIQVNIX1NJR05BVFVSRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEhBU0hfUkVQTEFDRV9CWUhBU0hWQUxVRV9JTk9SREVSKGhoLGhlYWQsZmllbGRuYW1lLGtleWxlbl9pbixoYXNodmFsLGFkZCxyZXBsYWNlZCxjbXBmY24pIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHJlcGxhY2VkKSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9GSU5EX0JZSEFTSFZBTFVFKGhoLCBoZWFkLCAmKChhZGQpLT5maWVsZG5hbWUpLCBrZXlsZW5faW4sIGhhc2h2YWwsIHJlcGxhY2VkKTsgXAorICBpZiAocmVwbGFjZWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBIQVNIX0RFTEVURShoaCwgaGVhZCwgcmVwbGFjZWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBIQVNIX0FERF9LRVlQVFJfQllIQVNIVkFMVUVfSU5PUkRFUihoaCwgaGVhZCwgJigoYWRkKS0+ZmllbGRuYW1lKSwga2V5bGVuX2luLCBoYXNodmFsLCBhZGQsIGNtcGZjbik7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSEFTSF9SRVBMQUNFX0JZSEFTSFZBTFVFKGhoLGhlYWQsZmllbGRuYW1lLGtleWxlbl9pbixoYXNodmFsLGFkZCxyZXBsYWNlZCkgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAocmVwbGFjZWQpID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBIQVNIX0ZJTkRfQllIQVNIVkFMVUUoaGgsIGhlYWQsICYoKGFkZCktPmZpZWxkbmFtZSksIGtleWxlbl9pbiwgaGFzaHZhbCwgcmVwbGFjZWQpOyBcCisgIGlmIChyZXBsYWNlZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIEhBU0hfREVMRVRFKGhoLCBoZWFkLCByZXBsYWNlZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEhBU0hfQUREX0tFWVBUUl9CWUhBU0hWQUxVRShoaCwgaGVhZCwgJigoYWRkKS0+ZmllbGRuYW1lKSwga2V5bGVuX2luLCBoYXNodmFsLCBhZGQpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEhBU0hfUkVQTEFDRShoaCxoZWFkLGZpZWxkbmFtZSxrZXlsZW5faW4sYWRkLHJlcGxhY2VkKSAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVuc2lnbmVkIF9ocl9oYXNodjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEhBU0hfVkFMVUUoJigoYWRkKS0+ZmllbGRuYW1lKSwga2V5bGVuX2luLCBfaHJfaGFzaHYpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEhBU0hfUkVQTEFDRV9CWUhBU0hWQUxVRShoaCwgaGVhZCwgZmllbGRuYW1lLCBrZXlsZW5faW4sIF9ocl9oYXNodiwgYWRkLCByZXBsYWNlZCk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSEFTSF9SRVBMQUNFX0lOT1JERVIoaGgsaGVhZCxmaWVsZG5hbWUsa2V5bGVuX2luLGFkZCxyZXBsYWNlZCxjbXBmY24pICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5zaWduZWQgX2hyX2hhc2h2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9WQUxVRSgmKChhZGQpLT5maWVsZG5hbWUpLCBrZXlsZW5faW4sIF9ocl9oYXNodik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9SRVBMQUNFX0JZSEFTSFZBTFVFX0lOT1JERVIoaGgsIGhlYWQsIGZpZWxkbmFtZSwga2V5bGVuX2luLCBfaHJfaGFzaHYsIGFkZCwgcmVwbGFjZWQsIGNtcGZjbik7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSEFTSF9BUFBFTkRfTElTVChoaCwgaGVhZCwgYWRkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGFkZCktPmhoLm5leHQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGFkZCktPmhoLnByZXYgPSBFTE1UX0ZST01fSEgoKGhlYWQpLT5oaC50YmwsIChoZWFkKS0+aGgudGJsLT50YWlsKTsgICAgICAgICAgIFwKKyAgKGhlYWQpLT5oaC50YmwtPnRhaWwtPm5leHQgPSAoYWRkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGhlYWQpLT5oaC50YmwtPnRhaWwgPSAmKChhZGQpLT5oaCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSEFTSF9BRERfS0VZUFRSX0JZSEFTSFZBTFVFX0lOT1JERVIoaGgsaGVhZCxrZXlwdHIsa2V5bGVuX2luLGhhc2h2YWwsYWRkLGNtcGZjbikgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bnNpZ25lZCBfaGFfYmt0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoYWRkKS0+aGguaGFzaHYgPSAoaGFzaHZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoYWRkKS0+aGgua2V5ID0gKGNoYXIqKSAoa2V5cHRyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoYWRkKS0+aGgua2V5bGVuID0gKHVuc2lnbmVkKSAoa2V5bGVuX2luKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoIShoZWFkKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChhZGQpLT5oaC5uZXh0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChhZGQpLT5oaC5wcmV2ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChoZWFkKSA9IChhZGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEhBU0hfTUFLRV9UQUJMRShoaCwgaGVhZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cnVjdCBVVF9oYXNoX2hhbmRsZSAqX2hzX2l0ZXIgPSAmKGhlYWQpLT5oaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChhZGQpLT5oaC50YmwgPSAoaGVhZCktPmhoLnRibDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKGNtcGZjbihERUNMVFlQRShoZWFkKSBFTE1UX0ZST01fSEgoKGhlYWQpLT5oaC50YmwsIF9oc19pdGVyKSwgYWRkKSA+IDApIFwKKyAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgoX2hzX2l0ZXIgPSBfaHNfaXRlci0+bmV4dCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoX2hzX2l0ZXIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChhZGQpLT5oaC5uZXh0ID0gX2hzX2l0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmICgoKGFkZCktPmhoLnByZXYgPSBfaHNfaXRlci0+cHJldikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgSEhfRlJPTV9FTE1UKChoZWFkKS0+aGgudGJsLCBfaHNfaXRlci0+cHJldiktPm5leHQgPSAoYWRkKTsgICAgICAgICAgICAgIFwKKyAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGhlYWQpID0gKGFkZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9oc19pdGVyLT5wcmV2ID0gKGFkZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEhBU0hfQVBQRU5EX0xJU1QoaGgsIGhlYWQsIGFkZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGhlYWQpLT5oaC50YmwtPm51bV9pdGVtcysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9UT19CS1QoaGFzaHZhbCwgKGhlYWQpLT5oaC50YmwtPm51bV9idWNrZXRzLCBfaGFfYmt0KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9BRERfVE9fQktUKChoZWFkKS0+aGgudGJsLT5idWNrZXRzW19oYV9ia3RdLCAmKGFkZCktPmhoKTsgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9CTE9PTV9BREQoKGhlYWQpLT5oaC50YmwsIGhhc2h2YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9FTUlUX0tFWShoaCwgaGVhZCwga2V5cHRyLCBrZXlsZW5faW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9GU0NLKGhoLCBoZWFkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSEFTSF9BRERfS0VZUFRSX0lOT1JERVIoaGgsaGVhZCxrZXlwdHIsa2V5bGVuX2luLGFkZCxjbXBmY24pICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5zaWduZWQgX2hzX2hhc2h2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9WQUxVRShrZXlwdHIsIGtleWxlbl9pbiwgX2hzX2hhc2h2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9BRERfS0VZUFRSX0JZSEFTSFZBTFVFX0lOT1JERVIoaGgsIGhlYWQsIGtleXB0ciwga2V5bGVuX2luLCBfaHNfaGFzaHYsIGFkZCwgY21wZmNuKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBIQVNIX0FERF9CWUhBU0hWQUxVRV9JTk9SREVSKGhoLGhlYWQsZmllbGRuYW1lLGtleWxlbl9pbixoYXNodmFsLGFkZCxjbXBmY24pIFwKKyAgSEFTSF9BRERfS0VZUFRSX0JZSEFTSFZBTFVFX0lOT1JERVIoaGgsIGhlYWQsICYoKGFkZCktPmZpZWxkbmFtZSksIGtleWxlbl9pbiwgaGFzaHZhbCwgYWRkLCBjbXBmY24pCisKKyNkZWZpbmUgSEFTSF9BRERfSU5PUkRFUihoaCxoZWFkLGZpZWxkbmFtZSxrZXlsZW5faW4sYWRkLGNtcGZjbikgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9BRERfS0VZUFRSX0lOT1JERVIoaGgsIGhlYWQsICYoKGFkZCktPmZpZWxkbmFtZSksIGtleWxlbl9pbiwgYWRkLCBjbXBmY24pCisKKyNkZWZpbmUgSEFTSF9BRERfS0VZUFRSX0JZSEFTSFZBTFVFKGhoLGhlYWQsa2V5cHRyLGtleWxlbl9pbixoYXNodmFsLGFkZCkgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5zaWduZWQgX2hhX2JrdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGFkZCktPmhoLmhhc2h2ID0gKGhhc2h2YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGFkZCktPmhoLmtleSA9IChjaGFyKikgKGtleXB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGFkZCktPmhoLmtleWxlbiA9ICh1bnNpZ25lZCkgKGtleWxlbl9pbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCEoaGVhZCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYWRkKS0+aGgubmV4dCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYWRkKS0+aGgucHJldiA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoaGVhZCkgPSAoYWRkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBIQVNIX01BS0VfVEFCTEUoaGgsIGhlYWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYWRkKS0+aGgudGJsID0gKGhlYWQpLT5oaC50Ymw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBIQVNIX0FQUEVORF9MSVNUKGhoLCBoZWFkLCBhZGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGhlYWQpLT5oaC50YmwtPm51bV9pdGVtcysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9UT19CS1QoaGFzaHZhbCwgKGhlYWQpLT5oaC50YmwtPm51bV9idWNrZXRzLCBfaGFfYmt0KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9BRERfVE9fQktUKChoZWFkKS0+aGgudGJsLT5idWNrZXRzW19oYV9ia3RdLCAmKGFkZCktPmhoKTsgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9CTE9PTV9BREQoKGhlYWQpLT5oaC50YmwsIGhhc2h2YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9FTUlUX0tFWShoaCwgaGVhZCwga2V5cHRyLCBrZXlsZW5faW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9GU0NLKGhoLCBoZWFkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSEFTSF9BRERfS0VZUFRSKGhoLGhlYWQsa2V5cHRyLGtleWxlbl9pbixhZGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5zaWduZWQgX2hhX2hhc2h2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9WQUxVRShrZXlwdHIsIGtleWxlbl9pbiwgX2hhX2hhc2h2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9BRERfS0VZUFRSX0JZSEFTSFZBTFVFKGhoLCBoZWFkLCBrZXlwdHIsIGtleWxlbl9pbiwgX2hhX2hhc2h2LCBhZGQpOyAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSEFTSF9BRERfQllIQVNIVkFMVUUoaGgsaGVhZCxmaWVsZG5hbWUsa2V5bGVuX2luLGhhc2h2YWwsYWRkKSAgICAgICAgICAgIFwKKyAgSEFTSF9BRERfS0VZUFRSX0JZSEFTSFZBTFVFKGhoLCBoZWFkLCAmKChhZGQpLT5maWVsZG5hbWUpLCBrZXlsZW5faW4sIGhhc2h2YWwsIGFkZCkKKworI2RlZmluZSBIQVNIX0FERChoaCxoZWFkLGZpZWxkbmFtZSxrZXlsZW5faW4sYWRkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBIQVNIX0FERF9LRVlQVFIoaGgsIGhlYWQsICYoKGFkZCktPmZpZWxkbmFtZSksIGtleWxlbl9pbiwgYWRkKQorCisjZGVmaW5lIEhBU0hfVE9fQktUKGhhc2h2LG51bV9ia3RzLGJrdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJrdCA9ICgoaGFzaHYpICYgKChudW1fYmt0cykgLSAxVSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBkZWxldGUgImRlbHB0ciIgZnJvbSB0aGUgaGFzaCB0YWJsZS4KKyAqICJ0aGUgdXN1YWwiIHBhdGNoLXVwIHByb2Nlc3MgZm9yIHRoZSBhcHAtb3JkZXIgZG91Ymx5LWxpbmtlZC1saXN0LgorICogVGhlIHVzZSBvZiBfaGRfaGhfZGVsIGJlbG93IGRlc2VydmVzIHNwZWNpYWwgZXhwbGFuYXRpb24uCisgKiBUaGVzZSB1c2VkIHRvIGJlIGV4cHJlc3NlZCB1c2luZyAoZGVscHRyKSBidXQgdGhhdCBsZWQgdG8gYSBidWcKKyAqIGlmIHNvbWVvbmUgdXNlZCB0aGUgc2FtZSBzeW1ib2wgZm9yIHRoZSBoZWFkIGFuZCBkZWxldGVlLCBsaWtlCisgKiAgSEFTSF9ERUxFVEUoaGgsdXNlcnMsdXNlcnMpOworICogV2Ugd2FudCB0aGF0IHRvIHdvcmssIGJ1dCBieSBjaGFuZ2luZyB0aGUgaGVhZCAodXNlcnMpIGJlbG93CisgKiB3ZSB3ZXJlIGZvcmZlaXRpbmcgb3VyIGFiaWxpdHkgdG8gZnVydGhlciByZWZlciB0byB0aGUgZGVsZXRlZSAodXNlcnMpCisgKiBpbiB0aGUgcGF0Y2gtdXAgcHJvY2Vzcy4gU29sdXRpb246IHVzZSBzY3JhdGNoIHNwYWNlIHRvCisgKiBjb3B5IHRoZSBkZWxldGVlIHBvaW50ZXIsIHRoZW4gdGhlIGxhdHRlciByZWZlcmVuY2VzIGFyZSB2aWEgdGhhdAorICogc2NyYXRjaCBwb2ludGVyIHJhdGhlciB0aGFuIHRocm91Z2ggdGhlIHJlcG9pbnRlZCAodXNlcnMpIHN5bWJvbC4KKyAqLworI2RlZmluZSBIQVNIX0RFTEVURShoaCxoZWFkLGRlbHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cnVjdCBVVF9oYXNoX2hhbmRsZSAqX2hkX2hoX2RlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKChkZWxwdHIpLT5oaC5wcmV2ID09IE5VTEwpICYmICgoZGVscHRyKS0+aGgubmV4dCA9PSBOVUxMKSApICB7ICAgICAgICAgXAorICAgICAgICB1dGhhc2hfZnJlZSgoaGVhZCktPmhoLnRibC0+YnVja2V0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAoaGVhZCktPmhoLnRibC0+bnVtX2J1Y2tldHMqc2l6ZW9mKHN0cnVjdCBVVF9oYXNoX2J1Y2tldCkgKTsgXAorICAgICAgICBIQVNIX0JMT09NX0ZSRUUoKGhlYWQpLT5oaC50YmwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1dGhhc2hfZnJlZSgoaGVhZCktPmhoLnRibCwgc2l6ZW9mKFVUX2hhc2hfdGFibGUpKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoZWFkID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1bnNpZ25lZCBfaGRfYmt0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfaGRfaGhfZGVsID0gJigoZGVscHRyKS0+aGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKGRlbHB0cikgPT0gRUxNVF9GUk9NX0hIKChoZWFkKS0+aGgudGJsLChoZWFkKS0+aGgudGJsLT50YWlsKSkgeyAgICAgXAorICAgICAgICAgICAgKGhlYWQpLT5oaC50YmwtPnRhaWwgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIChVVF9oYXNoX2hhbmRsZSopKChwdHJkaWZmX3QpKChkZWxwdHIpLT5oaC5wcmV2KSArICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIChoZWFkKS0+aGgudGJsLT5oaG8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKGRlbHB0ciktPmhoLnByZXYgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKChVVF9oYXNoX2hhbmRsZSopKChwdHJkaWZmX3QpKChkZWxwdHIpLT5oaC5wcmV2KSArICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAoaGVhZCktPmhoLnRibC0+aGhvKSktPm5leHQgPSAoZGVscHRyKS0+aGgubmV4dDsgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgREVDTFRZUEVfQVNTSUdOKGhlYWQsKGRlbHB0ciktPmhoLm5leHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoX2hkX2hoX2RlbC0+bmV4dCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKChVVF9oYXNoX2hhbmRsZSopKChwdHJkaWZmX3QpX2hkX2hoX2RlbC0+bmV4dCArICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAoaGVhZCktPmhoLnRibC0+aGhvKSktPnByZXYgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBfaGRfaGhfZGVsLT5wcmV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBIQVNIX1RPX0JLVCggX2hkX2hoX2RlbC0+aGFzaHYsIChoZWFkKS0+aGgudGJsLT5udW1fYnVja2V0cywgX2hkX2JrdCk7ICAgXAorICAgICAgICBIQVNIX0RFTF9JTl9CS1QoaGgsKGhlYWQpLT5oaC50YmwtPmJ1Y2tldHNbX2hkX2JrdF0sIF9oZF9oaF9kZWwpOyAgICAgICAgXAorICAgICAgICAoaGVhZCktPmhoLnRibC0+bnVtX2l0ZW1zLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEhBU0hfRlNDSyhoaCxoZWFkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworCisvKiBjb252ZW5pZW5jZSBmb3JtcyBvZiBIQVNIX0ZJTkQvSEFTSF9BREQvSEFTSF9ERUwgKi8KKyNkZWZpbmUgSEFTSF9GSU5EX1NUUihoZWFkLGZpbmRzdHIsb3V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBIQVNIX0ZJTkQoaGgsaGVhZCxmaW5kc3RyLCh1bnNpZ25lZCl1dGhhc2hfc3RybGVuKGZpbmRzdHIpLG91dCkKKyNkZWZpbmUgSEFTSF9BRERfU1RSKGhlYWQsc3RyZmllbGQsYWRkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBIQVNIX0FERChoaCxoZWFkLHN0cmZpZWxkWzBdLCh1bnNpZ25lZCl1dGhhc2hfc3RybGVuKGFkZC0+c3RyZmllbGQpLGFkZCkKKyNkZWZpbmUgSEFTSF9SRVBMQUNFX1NUUihoZWFkLHN0cmZpZWxkLGFkZCxyZXBsYWNlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBIQVNIX1JFUExBQ0UoaGgsaGVhZCxzdHJmaWVsZFswXSwodW5zaWduZWQpdXRoYXNoX3N0cmxlbihhZGQtPnN0cmZpZWxkKSxhZGQscmVwbGFjZWQpCisjZGVmaW5lIEhBU0hfRklORF9JTlQoaGVhZCxmaW5kaW50LG91dCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSEFTSF9GSU5EKGhoLGhlYWQsZmluZGludCxzaXplb2YoaW50KSxvdXQpCisjZGVmaW5lIEhBU0hfQUREX0lOVChoZWFkLGludGZpZWxkLGFkZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSEFTSF9BREQoaGgsaGVhZCxpbnRmaWVsZCxzaXplb2YoaW50KSxhZGQpCisjZGVmaW5lIEhBU0hfUkVQTEFDRV9JTlQoaGVhZCxpbnRmaWVsZCxhZGQscmVwbGFjZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSEFTSF9SRVBMQUNFKGhoLGhlYWQsaW50ZmllbGQsc2l6ZW9mKGludCksYWRkLHJlcGxhY2VkKQorI2RlZmluZSBIQVNIX0ZJTkRfUFRSKGhlYWQsZmluZHB0cixvdXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEhBU0hfRklORChoaCxoZWFkLGZpbmRwdHIsc2l6ZW9mKHZvaWQgKiksb3V0KQorI2RlZmluZSBIQVNIX0FERF9QVFIoaGVhZCxwdHJmaWVsZCxhZGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEhBU0hfQUREKGhoLGhlYWQscHRyZmllbGQsc2l6ZW9mKHZvaWQgKiksYWRkKQorI2RlZmluZSBIQVNIX1JFUExBQ0VfUFRSKGhlYWQscHRyZmllbGQsYWRkLHJlcGxhY2VkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEhBU0hfUkVQTEFDRShoaCxoZWFkLHB0cmZpZWxkLHNpemVvZih2b2lkICopLGFkZCxyZXBsYWNlZCkKKyNkZWZpbmUgSEFTSF9ERUwoaGVhZCxkZWxwdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBIQVNIX0RFTEVURShoaCxoZWFkLGRlbHB0cikKKworLyogSEFTSF9GU0NLIGNoZWNrcyBoYXNoIGludGVncml0eSBvbiBldmVyeSBhZGQvZGVsZXRlIHdoZW4gSEFTSF9ERUJVRyBpcyBkZWZpbmVkLgorICogVGhpcyBpcyBmb3IgdXRoYXNoIGRldmVsb3BlciBvbmx5OyBpdCBjb21waWxlcyBhd2F5IGlmIEhBU0hfREVCVUcgaXNuJ3QgZGVmaW5lZC4KKyAqLworI2lmZGVmIEhBU0hfREVCVUcKKyNkZWZpbmUgSEFTSF9PT1BTKC4uLikgZG8geyBmcHJpbnRmKHN0ZGVycixfX1ZBX0FSR1NfXyk7IGV4aXQoLTEpOyB9IHdoaWxlICgwKQorI2RlZmluZSBIQVNIX0ZTQ0soaGgsaGVhZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cnVjdCBVVF9oYXNoX2hhbmRsZSAqX3RoaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChoZWFkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1bnNpZ25lZCBfYmt0X2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1bnNpZ25lZCBfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjaGFyICpfcHJldjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfY291bnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIF9ia3RfaSA9IDA7IF9ia3RfaSA8IChoZWFkKS0+aGgudGJsLT5udW1fYnVja2V0czsgX2JrdF9pKyspIHsgICAgICAgXAorICAgICAgICAgICAgdW5zaWduZWQgX2JrdF9jb3VudCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX3RoaCA9IChoZWFkKS0+aGgudGJsLT5idWNrZXRzW19ia3RfaV0uaGhfaGVhZDsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX3ByZXYgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd2hpbGUgKF90aGgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgaWYgKF9wcmV2ICE9IChjaGFyKikoX3RoaC0+aGhfcHJldikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIEhBU0hfT09QUygiaW52YWxpZCBoaF9wcmV2ICVwLCBhY3R1YWwgJXBcbiIsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBfdGhoLT5oaF9wcmV2LCBfcHJldiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgX2JrdF9jb3VudCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgX3ByZXYgPSAoY2hhciopKF90aGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgX3RoaCA9IF90aGgtPmhoX25leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX2NvdW50ICs9IF9ia3RfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKChoZWFkKS0+aGgudGJsLT5idWNrZXRzW19ia3RfaV0uY291bnQgIT0gIF9ia3RfY291bnQpIHsgICAgICAgICAgXAorICAgICAgICAgICAgICAgSEFTSF9PT1BTKCJpbnZhbGlkIGJ1Y2tldCBjb3VudCAldSwgYWN0dWFsICV1XG4iLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIChoZWFkKS0+aGgudGJsLT5idWNrZXRzW19ia3RfaV0uY291bnQsIF9ia3RfY291bnQpOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoX2NvdW50ICE9IChoZWFkKS0+aGgudGJsLT5udW1faXRlbXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgSEFTSF9PT1BTKCJpbnZhbGlkIGhoIGl0ZW0gY291bnQgJXUsIGFjdHVhbCAldVxuIiwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIChoZWFkKS0+aGgudGJsLT5udW1faXRlbXMsIF9jb3VudCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiB0cmF2ZXJzZSBoaCBpbiBhcHAgb3JkZXI7IGNoZWNrIG5leHQvcHJldiBpbnRlZ3JpdHksIGNvdW50ICovICAgICAgICAgXAorICAgICAgICBfY291bnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfcHJldiA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfdGhoID0gICYoaGVhZCktPmhoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoX3RoaCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBfY291bnQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBpZiAoX3ByZXYgIT0oY2hhciopKF90aGgtPnByZXYpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBIQVNIX09PUFMoImludmFsaWQgcHJldiAlcCwgYWN0dWFsICVwXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBfdGhoLT5wcmV2LCBfcHJldiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBfcHJldiA9IChjaGFyKilFTE1UX0ZST01fSEgoKGhlYWQpLT5oaC50YmwsIF90aGgpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBfdGhoID0gKCBfdGhoLT5uZXh0ID8gIChVVF9oYXNoX2hhbmRsZSopKChjaGFyKikoX3RoaC0+bmV4dCkgKyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkKS0+aGgudGJsLT5oaG8pIDogTlVMTCApOyAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoX2NvdW50ICE9IChoZWFkKS0+aGgudGJsLT5udW1faXRlbXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgSEFTSF9PT1BTKCJpbnZhbGlkIGFwcCBpdGVtIGNvdW50ICV1LCBhY3R1YWwgJXVcbiIsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIChoZWFkKS0+aGgudGJsLT5udW1faXRlbXMsIF9jb3VudCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIEhBU0hfRlNDSyhoaCxoZWFkKQorI2VuZGlmCisKKy8qIFdoZW4gY29tcGlsZWQgd2l0aCAtREhBU0hfRU1JVF9LRVlTLCBsZW5ndGgtcHJlZml4ZWQga2V5cyBhcmUgZW1pdHRlZCB0bworICogdGhlIGRlc2NyaXB0b3IgdG8gd2hpY2ggdGhpcyBtYWNybyBpcyBkZWZpbmVkIGZvciB0dW5pbmcgdGhlIGhhc2ggZnVuY3Rpb24uCisgKiBUaGUgYXBwIGNhbiAjaW5jbHVkZSA8dW5pc3RkLmg+IHRvIGdldCB0aGUgcHJvdG90eXBlIGZvciB3cml0ZSgyKS4gKi8KKyNpZmRlZiBIQVNIX0VNSVRfS0VZUworI2RlZmluZSBIQVNIX0VNSVRfS0VZKGhoLGhlYWQsa2V5cHRyLGZpZWxkbGVuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIF9rbGVuID0gZmllbGRsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdyaXRlKEhBU0hfRU1JVF9LRVlTLCAmX2tsZW4sIHNpemVvZihfa2xlbikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdyaXRlKEhBU0hfRU1JVF9LRVlTLCBrZXlwdHIsICh1bnNpZ25lZCBsb25nKWZpZWxkbGVuKTsgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIEhBU0hfRU1JVF9LRVkoaGgsaGVhZCxrZXlwdHIsZmllbGRsZW4pCisjZW5kaWYKKworLyogZGVmYXVsdCB0byBKZW5raW4ncyBoYXNoIHVubGVzcyBvdmVycmlkZGVuIGUuZy4gREhBU0hfRlVOQ1RJT049SEFTSF9TQVggKi8KKyNpZmRlZiBIQVNIX0ZVTkNUSU9OCisjZGVmaW5lIEhBU0hfRkNOIEhBU0hfRlVOQ1RJT04KKyNlbHNlCisjZGVmaW5lIEhBU0hfRkNOIEhBU0hfSkVOCisjZW5kaWYKKworLyogVGhlIEJlcm5zdGVpbiBoYXNoIGZ1bmN0aW9uLCB1c2VkIGluIFBlcmwgcHJpb3IgdG8gdjUuNi4gTm90ZSAoeDw8NSt4KT14KjMzLiAqLworI2RlZmluZSBIQVNIX0JFUihrZXksa2V5bGVuLGhhc2h2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bnNpZ25lZCBfaGJfa2V5bGVuPSh1bnNpZ25lZClrZXlsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1bnNpZ25lZCBjaGFyICpfaGJfa2V5PShjb25zdCB1bnNpZ25lZCBjaGFyKikoa2V5KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAoaGFzaHYpID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB3aGlsZSAoX2hiX2tleWxlbi0tICE9IDBVKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKGhhc2h2KSA9ICgoKGhhc2h2KSA8PCA1KSArIChoYXNodikpICsgKl9oYl9rZXkrKzsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworCisvKiBTQVgvRk5WL09BVC9KRU4gaGFzaCBmdW5jdGlvbnMgYXJlIG1hY3JvIHZhcmlhbnRzIG9mIHRob3NlIGxpc3RlZCBhdAorICogaHR0cDovL2V0ZXJuYWxseWNvbmZ1enpsZWQuY29tL3R1dHMvYWxnb3JpdGhtcy9qc3dfdHV0X2hhc2hpbmcuYXNweCAqLworI2RlZmluZSBIQVNIX1NBWChrZXksa2V5bGVuLGhhc2h2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bnNpZ25lZCBfc3hfaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1bnNpZ25lZCBjaGFyICpfaHNfa2V5PShjb25zdCB1bnNpZ25lZCBjaGFyKikoa2V5KTsgICAgICAgICAgICAgICAgICAgICAgXAorICBoYXNodiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IoX3N4X2k9MDsgX3N4X2kgPCBrZXlsZW47IF9zeF9pKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaGFzaHYgXj0gKGhhc2h2IDw8IDUpICsgKGhhc2h2ID4+IDIpICsgX2hzX2tleVtfc3hfaV07ICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKy8qIEZOVi0xYSB2YXJpYXRpb24gKi8KKyNkZWZpbmUgSEFTSF9GTlYoa2V5LGtleWxlbixoYXNodikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5zaWduZWQgX2ZuX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqX2hmX2tleT0oY29uc3QgdW5zaWduZWQgY2hhciopKGtleSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaGFzaHYgPSAyMTY2MTM2MjYxVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yKF9mbl9pPTA7IF9mbl9pIDwga2V5bGVuOyBfZm5faSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGhhc2h2ID0gaGFzaHYgXiBfaGZfa2V5W19mbl9pXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGhhc2h2ID0gaGFzaHYgKiAxNjc3NzYxOVU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSEFTSF9PQVQoa2V5LGtleWxlbixoYXNodikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5zaWduZWQgX2hvX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqX2hvX2tleT0oY29uc3QgdW5zaWduZWQgY2hhciopKGtleSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaGFzaHYgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yKF9ob19pPTA7IF9ob19pIDwga2V5bGVuOyBfaG9faSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGhhc2h2ICs9IF9ob19rZXlbX2hvX2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGhhc2h2ICs9IChoYXNodiA8PCAxMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGhhc2h2IF49IChoYXNodiA+PiA2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaGFzaHYgKz0gKGhhc2h2IDw8IDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaGFzaHYgXj0gKGhhc2h2ID4+IDExKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaGFzaHYgKz0gKGhhc2h2IDw8IDE1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSEFTSF9KRU5fTUlYKGEsYixjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYSAtPSBiOyBhIC09IGM7IGEgXj0gKCBjID4+IDEzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYiAtPSBjOyBiIC09IGE7IGIgXj0gKCBhIDw8IDggKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYyAtPSBhOyBjIC09IGI7IGMgXj0gKCBiID4+IDEzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYSAtPSBiOyBhIC09IGM7IGEgXj0gKCBjID4+IDEyICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYiAtPSBjOyBiIC09IGE7IGIgXj0gKCBhIDw8IDE2ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYyAtPSBhOyBjIC09IGI7IGMgXj0gKCBiID4+IDUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYSAtPSBiOyBhIC09IGM7IGEgXj0gKCBjID4+IDMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYiAtPSBjOyBiIC09IGE7IGIgXj0gKCBhIDw8IDEwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYyAtPSBhOyBjIC09IGI7IGMgXj0gKCBiID4+IDE1ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSEFTSF9KRU4oa2V5LGtleWxlbixoYXNodikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5zaWduZWQgX2hqX2ksX2hqX2osX2hqX2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5zaWduZWQgY29uc3QgY2hhciAqX2hqX2tleT0odW5zaWduZWQgY29uc3QgY2hhciopKGtleSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaGFzaHYgPSAweGZlZWRiZWVmdTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2hqX2kgPSBfaGpfaiA9IDB4OWUzNzc5Yjl1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2hqX2sgPSAodW5zaWduZWQpKGtleWxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgd2hpbGUgKF9oal9rID49IDEyVSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfaGpfaSArPSAgICAoX2hqX2tleVswXSArICggKHVuc2lnbmVkKV9oal9rZXlbMV0gPDwgOCApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKyAoICh1bnNpZ25lZClfaGpfa2V5WzJdIDw8IDE2ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKyAoICh1bnNpZ25lZClfaGpfa2V5WzNdIDw8IDI0ICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfaGpfaiArPSAgICAoX2hqX2tleVs0XSArICggKHVuc2lnbmVkKV9oal9rZXlbNV0gPDwgOCApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKyAoICh1bnNpZ25lZClfaGpfa2V5WzZdIDw8IDE2ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKyAoICh1bnNpZ25lZClfaGpfa2V5WzddIDw8IDI0ICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBoYXNodiArPSAoX2hqX2tleVs4XSArICggKHVuc2lnbmVkKV9oal9rZXlbOV0gPDwgOCApICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKyAoICh1bnNpZ25lZClfaGpfa2V5WzEwXSA8PCAxNiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKyAoICh1bnNpZ25lZClfaGpfa2V5WzExXSA8PCAyNCApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgSEFTSF9KRU5fTUlYKF9oal9pLCBfaGpfaiwgaGFzaHYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgX2hqX2tleSArPSAxMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgX2hqX2sgLT0gMTJVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaGFzaHYgKz0gKHVuc2lnbmVkKShrZXlsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3dpdGNoICggX2hqX2sgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgY2FzZSAxMTogaGFzaHYgKz0gKCAodW5zaWduZWQpX2hqX2tleVsxMF0gPDwgMjQgKTsgLyogRkFMTFRIUk9VR0ggKi8gICAgICAgIFwKKyAgICAgY2FzZSAxMDogaGFzaHYgKz0gKCAodW5zaWduZWQpX2hqX2tleVs5XSA8PCAxNiApOyAgLyogRkFMTFRIUk9VR0ggKi8gICAgICAgIFwKKyAgICAgY2FzZSA5OiAgaGFzaHYgKz0gKCAodW5zaWduZWQpX2hqX2tleVs4XSA8PCA4ICk7ICAgLyogRkFMTFRIUk9VR0ggKi8gICAgICAgIFwKKyAgICAgY2FzZSA4OiAgX2hqX2ogKz0gKCAodW5zaWduZWQpX2hqX2tleVs3XSA8PCAyNCApOyAgLyogRkFMTFRIUk9VR0ggKi8gICAgICAgIFwKKyAgICAgY2FzZSA3OiAgX2hqX2ogKz0gKCAodW5zaWduZWQpX2hqX2tleVs2XSA8PCAxNiApOyAgLyogRkFMTFRIUk9VR0ggKi8gICAgICAgIFwKKyAgICAgY2FzZSA2OiAgX2hqX2ogKz0gKCAodW5zaWduZWQpX2hqX2tleVs1XSA8PCA4ICk7ICAgLyogRkFMTFRIUk9VR0ggKi8gICAgICAgIFwKKyAgICAgY2FzZSA1OiAgX2hqX2ogKz0gX2hqX2tleVs0XTsgICAgICAgICAgICAgICAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8gICAgICAgIFwKKyAgICAgY2FzZSA0OiAgX2hqX2kgKz0gKCAodW5zaWduZWQpX2hqX2tleVszXSA8PCAyNCApOyAgLyogRkFMTFRIUk9VR0ggKi8gICAgICAgIFwKKyAgICAgY2FzZSAzOiAgX2hqX2kgKz0gKCAodW5zaWduZWQpX2hqX2tleVsyXSA8PCAxNiApOyAgLyogRkFMTFRIUk9VR0ggKi8gICAgICAgIFwKKyAgICAgY2FzZSAyOiAgX2hqX2kgKz0gKCAodW5zaWduZWQpX2hqX2tleVsxXSA8PCA4ICk7ICAgLyogRkFMTFRIUk9VR0ggKi8gICAgICAgIFwKKyAgICAgY2FzZSAxOiAgX2hqX2kgKz0gX2hqX2tleVswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9KRU5fTUlYKF9oal9pLCBfaGpfaiwgaGFzaHYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIFRoZSBQYXVsIEhzaWVoIGhhc2ggZnVuY3Rpb24gKi8KKyN1bmRlZiBnZXQxNmJpdHMKKyNpZiAoZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2kzODZfXykpIHx8IGRlZmluZWQoX19XQVRDT01DX18pICAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkIChfX1RVUkJPQ19fKQorI2RlZmluZSBnZXQxNmJpdHMoZCkgKCooKGNvbnN0IHVpbnQxNl90ICopIChkKSkpCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChnZXQxNmJpdHMpCisjZGVmaW5lIGdldDE2Yml0cyhkKSAoKCgodWludDMyX3QpKCgoY29uc3QgdWludDhfdCAqKShkKSlbMV0pKSA8PCA4KSAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICsodWludDMyX3QpKCgoY29uc3QgdWludDhfdCAqKShkKSlbMF0pICkKKyNlbmRpZgorI2RlZmluZSBIQVNIX1NGSChrZXksa2V5bGVuLGhhc2h2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bnNpZ25lZCBjb25zdCBjaGFyICpfc2ZoX2tleT0odW5zaWduZWQgY29uc3QgY2hhciopKGtleSk7ICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50MzJfdCBfc2ZoX3RtcCwgX3NmaF9sZW4gPSAodWludDMyX3Qpa2V5bGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bnNpZ25lZCBfc2ZoX3JlbSA9IF9zZmhfbGVuICYgM1U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfc2ZoX2xlbiA+Pj0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoYXNodiA9IDB4Y2FmZWJhYmV1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBNYWluIGxvb3AgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKDtfc2ZoX2xlbiA+IDBVOyBfc2ZoX2xlbi0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGhhc2h2ICAgICs9IGdldDE2Yml0cyAoX3NmaF9rZXkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9zZmhfdG1wICA9ICgodWludDMyX3QpKGdldDE2Yml0cyAoX3NmaF9rZXkrMikpIDw8IDExKSBeIGhhc2h2OyAgICAgICAgICAgICAgXAorICAgIGhhc2h2ICAgICA9IChoYXNodiA8PCAxNikgXiBfc2ZoX3RtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9zZmhfa2V5ICs9IDJVKnNpemVvZiAodWludDE2X3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGhhc2h2ICAgICs9IGhhc2h2ID4+IDExOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBIYW5kbGUgZW5kIGNhc2VzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzd2l0Y2ggKF9zZmhfcmVtKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMzogaGFzaHYgKz0gZ2V0MTZiaXRzIChfc2ZoX2tleSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaGFzaHYgXj0gaGFzaHYgPDwgMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaGFzaHYgXj0gKHVpbnQzMl90KShfc2ZoX2tleVtzaXplb2YgKHVpbnQxNl90KV0pIDw8IDE4OyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaGFzaHYgKz0gaGFzaHYgPj4gMTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMjogaGFzaHYgKz0gZ2V0MTZiaXRzIChfc2ZoX2tleSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaGFzaHYgXj0gaGFzaHYgPDwgMTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaGFzaHYgKz0gaGFzaHYgPj4gMTc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMTogaGFzaHYgKz0gKl9zZmhfa2V5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaGFzaHYgXj0gaGFzaHYgPDwgMTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaGFzaHYgKz0gaGFzaHYgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEZvcmNlICJhdmFsYW5jaGluZyIgb2YgZmluYWwgMTI3IGJpdHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGhhc2h2IF49IGhhc2h2IDw8IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGhhc2h2ICs9IGhhc2h2ID4+IDU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGhhc2h2IF49IGhhc2h2IDw8IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGhhc2h2ICs9IGhhc2h2ID4+IDE3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGhhc2h2IF49IGhhc2h2IDw8IDI1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGhhc2h2ICs9IGhhc2h2ID4+IDY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2lmZGVmIEhBU0hfVVNJTkdfTk9fU1RSSUNUX0FMSUFTSU5HCisvKiBUaGUgTXVybXVySGFzaCBleHBsb2l0cyBzb21lIENQVSdzICh4ODYseDg2XzY0KSB0b2xlcmFuY2UgZm9yIHVuYWxpZ25lZCByZWFkcy4KKyAqIEZvciBvdGhlciB0eXBlcyBvZiBDUFUncyAoZS5nLiBTcGFyYykgYW4gdW5hbGlnbmVkIHJlYWQgY2F1c2VzIGEgYnVzIGVycm9yLgorICogTXVybXVySGFzaCB1c2VzIHRoZSBmYXN0ZXIgYXBwcm9hY2ggb25seSBvbiBDUFUncyB3aGVyZSB3ZSBrbm93IGl0J3Mgc2FmZS4KKyAqCisgKiBOb3RlIHRoZSBwcmVwcm9jZXNzb3IgYnVpbHQtaW4gZGVmaW5lcyBjYW4gYmUgZW1pdHRlZCB1c2luZzoKKyAqCisgKiAgIGdjYyAtbTY0IC1kTSAtRSAtIDwgL2Rldi9udWxsICAgICAgICAgICAgICAgICAgKG9uIGdjYykKKyAqICAgY2MgLSMjIGEuYyAod2hlcmUgYS5jIGlzIGEgc2ltcGxlIHRlc3QgZmlsZSkgICAoU3VuIFN0dWRpbykKKyAqLworI2lmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pICB8fCBkZWZpbmVkKF9NX0lYODYpKQorI2RlZmluZSBNVVJfR0VUQkxPQ0socCxpKSBwW2ldCisjZWxzZSAvKiBub24gaW50ZWwgKi8KKyNkZWZpbmUgTVVSX1BMVVMwX0FMSUdORUQocCkgKCgodW5zaWduZWQgbG9uZylwICYgM1VMKSA9PSAwVUwpCisjZGVmaW5lIE1VUl9QTFVTMV9BTElHTkVEKHApICgoKHVuc2lnbmVkIGxvbmcpcCAmIDNVTCkgPT0gMVVMKQorI2RlZmluZSBNVVJfUExVUzJfQUxJR05FRChwKSAoKCh1bnNpZ25lZCBsb25nKXAgJiAzVUwpID09IDJVTCkKKyNkZWZpbmUgTVVSX1BMVVMzX0FMSUdORUQocCkgKCgodW5zaWduZWQgbG9uZylwICYgM1VMKSA9PSAzVUwpCisjZGVmaW5lIFdQKHApICgodWludDMyX3QqKSgodW5zaWduZWQgbG9uZykocCkgJiB+M1VMKSkKKyNpZiAoZGVmaW5lZChfX0JJR19FTkRJQU5fXykgfHwgZGVmaW5lZChTUEFSQykgfHwgZGVmaW5lZChfX3BwY19fKSB8fCBkZWZpbmVkKF9fcHBjNjRfXykpCisjZGVmaW5lIE1VUl9USFJFRV9PTkUocCkgKCgoKCpXUChwKSkmMHgwMGZmZmZmZikgPDwgOCkgfCAoKCgqKFdQKHApKzEpKSYweGZmMDAwMDAwKSA+PiAyNCkpCisjZGVmaW5lIE1VUl9UV09fVFdPKHApICAgKCgoKCpXUChwKSkmMHgwMDAwZmZmZikgPDwxNikgfCAoKCgqKFdQKHApKzEpKSYweGZmZmYwMDAwKSA+PiAxNikpCisjZGVmaW5lIE1VUl9PTkVfVEhSRUUocCkgKCgoKCpXUChwKSkmMHgwMDAwMDBmZikgPDwyNCkgfCAoKCgqKFdQKHApKzEpKSYweGZmZmZmZjAwKSA+PiAgOCkpCisjZWxzZSAvKiBhc3N1bWUgbGl0dGxlIGVuZGlhbiBub24taW50ZWwgKi8KKyNkZWZpbmUgTVVSX1RIUkVFX09ORShwKSAoKCgoKldQKHApKSYweGZmZmZmZjAwKSA+PiA4KSB8ICgoKCooV1AocCkrMSkpJjB4MDAwMDAwZmYpIDw8IDI0KSkKKyNkZWZpbmUgTVVSX1RXT19UV08ocCkgICAoKCgoKldQKHApKSYweGZmZmYwMDAwKSA+PjE2KSB8ICgoKCooV1AocCkrMSkpJjB4MDAwMGZmZmYpIDw8IDE2KSkKKyNkZWZpbmUgTVVSX09ORV9USFJFRShwKSAoKCgoKldQKHApKSYweGZmMDAwMDAwKSA+PjI0KSB8ICgoKCooV1AocCkrMSkpJjB4MDBmZmZmZmYpIDw8ICA4KSkKKyNlbmRpZgorI2RlZmluZSBNVVJfR0VUQkxPQ0socCxpKSAoTVVSX1BMVVMwX0FMSUdORUQocCkgPyAoKHApW2ldKSA6ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1VUl9QTFVTMV9BTElHTkVEKHApID8gTVVSX1RIUkVFX09ORShwKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1VUl9QTFVTMl9BTElHTkVEKHApID8gTVVSX1RXT19UV08ocCkgOiAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVVSX09ORV9USFJFRShwKSkpKQorI2VuZGlmCisjZGVmaW5lIE1VUl9ST1RMMzIoeCxyKSAoKCh4KSA8PCAocikpIHwgKCh4KSA+PiAoMzIgLSAocikpKSkKKyNkZWZpbmUgTVVSX0ZNSVgoX2gpIFwKK2RvIHsgICAgICAgICAgICAgICAgIFwKKyAgX2ggXj0gX2ggPj4gMTY7ICAgIFwKKyAgX2ggKj0gMHg4NWViY2E2YnU7IFwKKyAgX2ggXj0gX2ggPj4gMTM7ICAgIFwKKyAgX2ggKj0gMHhjMmIyYWUzNXU7IFwKKyAgX2ggXj0gX2ggPj4gMTY7ICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSEFTSF9NVVIoa2V5LGtleWxlbixoYXNodikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4X3QgKl9tdXJfZGF0YSA9IChjb25zdCB1aW50OF90Kikoa2V5KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IF9tdXJfbmJsb2NrcyA9IChpbnQpKGtleWxlbikgLyA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50MzJfdCBfbXVyX2gxID0gMHhmODhENTM1M3U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQzMl90IF9tdXJfYzEgPSAweGNjOWUyZDUxdTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDMyX3QgX211cl9jMiA9IDB4MWI4NzM1OTN1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50MzJfdCBfbXVyX2sxID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4X3QgKl9tdXJfdGFpbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDMyX3QgKl9tdXJfYmxvY2tzID0gKGNvbnN0IHVpbnQzMl90KikoX211cl9kYXRhKyhfbXVyX25ibG9ja3MqNCkpOyBcCisgIGludCBfbXVyX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yKF9tdXJfaSA9IC1fbXVyX25ibG9ja3M7IF9tdXJfaSE9MDsgX211cl9pKyspIHsgICAgICAgICAgICAgICAgICAgXAorICAgIF9tdXJfazEgPSBNVVJfR0VUQkxPQ0soX211cl9ibG9ja3MsX211cl9pKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX211cl9rMSAqPSBfbXVyX2MxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfbXVyX2sxID0gTVVSX1JPVEwzMihfbXVyX2sxLDE1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9tdXJfazEgKj0gX211cl9jMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfbXVyX2gxIF49IF9tdXJfazE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9tdXJfaDEgPSBNVVJfUk9UTDMyKF9tdXJfaDEsMTMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX211cl9oMSA9IChfbXVyX2gxKjVVKSArIDB4ZTY1NDZiNjR1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfbXVyX3RhaWwgPSAoY29uc3QgdWludDhfdCopKF9tdXJfZGF0YSArIChfbXVyX25ibG9ja3MqNCkpOyAgICAgICAgICBcCisgIF9tdXJfazE9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3dpdGNoKChrZXlsZW4pICYgM1UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMzogX211cl9rMSBePSAodWludDMyX3QpX211cl90YWlsWzJdIDw8IDE2OyAvKiBGQUxMVEhST1VHSCAqLyBcCisgICAgY2FzZSAyOiBfbXVyX2sxIF49ICh1aW50MzJfdClfbXVyX3RhaWxbMV0gPDwgODsgIC8qIEZBTExUSFJPVUdIICovIFwKKyAgICBjYXNlIDE6IF9tdXJfazEgXj0gKHVpbnQzMl90KV9tdXJfdGFpbFswXTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9tdXJfazEgKj0gX211cl9jMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX211cl9rMSA9IE1VUl9ST1RMMzIoX211cl9rMSwxNSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfbXVyX2sxICo9IF9tdXJfYzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9tdXJfaDEgXj0gX211cl9rMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX211cl9oMSBePSAodWludDMyX3QpKGtleWxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBNVVJfRk1JWChfbXVyX2gxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGhhc2h2ID0gX211cl9oMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZW5kaWYgIC8qIEhBU0hfVVNJTkdfTk9fU1RSSUNUX0FMSUFTSU5HICovCisKKy8qIGl0ZXJhdGUgb3ZlciBpdGVtcyBpbiBhIGtub3duIGJ1Y2tldCB0byBmaW5kIGRlc2lyZWQgaXRlbSAqLworI2RlZmluZSBIQVNIX0ZJTkRfSU5fQktUKHRibCxoaCxoZWFkLGtleXB0cixrZXlsZW5faW4saGFzaHZhbCxvdXQpICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKGhlYWQpLmhoX2hlYWQgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERFQ0xUWVBFX0FTU0lHTihvdXQsIEVMTVRfRlJPTV9ISCh0YmwsIChoZWFkKS5oaF9oZWFkKSk7ICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChvdXQpID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB3aGlsZSAoKG91dCkgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgob3V0KS0+aGguaGFzaHYgPT0gKGhhc2h2YWwpICYmIChvdXQpLT5oaC5rZXlsZW4gPT0gKGtleWxlbl9pbikpIHsgICAgICAgXAorICAgICAgaWYgKHV0aGFzaF9tZW1jbXAoKG91dCktPmhoLmtleSwga2V5cHRyLCBrZXlsZW5faW4pID09IDApIHsgICAgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgob3V0KS0+aGguaGhfbmV4dCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgREVDTFRZUEVfQVNTSUdOKG91dCwgRUxNVF9GUk9NX0hIKHRibCwgKG91dCktPmhoLmhoX25leHQpKTsgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKG91dCkgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyogYWRkIGFuIGl0ZW0gdG8gYSBidWNrZXQgICovCisjZGVmaW5lIEhBU0hfQUREX1RPX0JLVChoZWFkLGFkZGhoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgaGVhZC5jb3VudCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgKGFkZGhoKS0+aGhfbmV4dCA9IGhlYWQuaGhfaGVhZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgKGFkZGhoKS0+aGhfcHJldiA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgaWYgKGhlYWQuaGhfaGVhZCAhPSBOVUxMKSB7IChoZWFkKS5oaF9oZWFkLT5oaF9wcmV2ID0gKGFkZGhoKTsgfSAgICAgICAgICAgICAgICBcCisgKGhlYWQpLmhoX2hlYWQ9YWRkaGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgaWYgKChoZWFkLmNvdW50ID49ICgoaGVhZC5leHBhbmRfbXVsdCsxVSkgKiBIQVNIX0JLVF9DQVBBQ0lUWV9USFJFU0gpKSAgICAgICAgICBcCisgICAgICYmICgoYWRkaGgpLT50YmwtPm5vZXhwYW5kICE9IDFVKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgSEFTSF9FWFBBTkRfQlVDS0VUUygoYWRkaGgpLT50YmwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiByZW1vdmUgYW4gaXRlbSBmcm9tIGEgZ2l2ZW4gYnVja2V0ICovCisjZGVmaW5lIEhBU0hfREVMX0lOX0JLVChoaCxoZWFkLGhoX2RlbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGhlYWQpLmNvdW50LS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChoZWFkKS5oaF9oZWFkID09IGhoX2RlbCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoaGVhZCkuaGhfaGVhZCA9IGhoX2RlbC0+aGhfbmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGhoX2RlbC0+aGhfcHJldikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhoX2RlbC0+aGhfcHJldi0+aGhfbmV4dCA9IGhoX2RlbC0+aGhfbmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGhoX2RlbC0+aGhfbmV4dCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhoX2RlbC0+aGhfbmV4dC0+aGhfcHJldiA9IGhoX2RlbC0+aGhfcHJldjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvKiBCdWNrZXQgZXhwYW5zaW9uIGhhcyB0aGUgZWZmZWN0IG9mIGRvdWJsaW5nIHRoZSBudW1iZXIgb2YgYnVja2V0cworICogYW5kIHJlZGlzdHJpYnV0aW5nIHRoZSBpdGVtcyBpbnRvIHRoZSBuZXcgYnVja2V0cy4gSWRlYWxseSB0aGUKKyAqIGl0ZW1zIHdpbGwgZGlzdHJpYnV0ZSBtb3JlIG9yIGxlc3MgZXZlbmx5IGludG8gdGhlIG5ldyBidWNrZXRzCisgKiAodGhlIGV4dGVudCB0byB3aGljaCB0aGlzIGlzIHRydWUgaXMgYSBtZWFzdXJlIG9mIHRoZSBxdWFsaXR5IG9mCisgKiB0aGUgaGFzaCBmdW5jdGlvbiBhcyBpdCBhcHBsaWVzIHRvIHRoZSBrZXkgZG9tYWluKS4KKyAqCisgKiBXaXRoIHRoZSBpdGVtcyBkaXN0cmlidXRlZCBpbnRvIG1vcmUgYnVja2V0cywgdGhlIGNoYWluIGxlbmd0aAorICogKGl0ZW0gY291bnQpIGluIGVhY2ggYnVja2V0IGlzIHJlZHVjZWQuIFRodXMgYnkgZXhwYW5kaW5nIGJ1Y2tldHMKKyAqIHRoZSBoYXNoIGtlZXBzIGEgYm91bmQgb24gdGhlIGNoYWluIGxlbmd0aC4gVGhpcyBib3VuZGVkIGNoYWluCisgKiBsZW5ndGggaXMgdGhlIGVzc2VuY2Ugb2YgaG93IGEgaGFzaCBwcm92aWRlcyBjb25zdGFudCB0aW1lIGxvb2t1cC4KKyAqCisgKiBUaGUgY2FsY3VsYXRpb24gb2YgdGJsLT5pZGVhbF9jaGFpbl9tYXhsZW4gYmVsb3cgZGVzZXJ2ZXMgc29tZQorICogZXhwbGFuYXRpb24uIEZpcnN0LCBrZWVwIGluIG1pbmQgdGhhdCB3ZSdyZSBjYWxjdWxhdGluZyB0aGUgaWRlYWwKKyAqIG1heGltdW0gY2hhaW4gbGVuZ3RoIGJhc2VkIG9uIHRoZSAqbmV3KiAoZG91YmxlZCkgYnVja2V0IGNvdW50LgorICogSW4gZnJhY3Rpb25zIHRoaXMgaXMganVzdCBuL2IgKG49bnVtYmVyIG9mIGl0ZW1zLGI9bmV3IG51bSBidWNrZXRzKS4KKyAqIFNpbmNlIHRoZSBpZGVhbCBjaGFpbiBsZW5ndGggaXMgYW4gaW50ZWdlciwgd2Ugd2FudCB0byBjYWxjdWxhdGUKKyAqIGNlaWwobi9iKS4gV2UgZG9uJ3QgZGVwZW5kIG9uIGZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMgaW4gdGhpcworICogaGFzaCwgc28gdG8gY2FsY3VsYXRlIGNlaWwobi9iKSB3aXRoIGludGVnZXJzIHdlIGNvdWxkIHdyaXRlCisgKgorICogICAgICBjZWlsKG4vYikgPSAobi9iKSArICgobiViKT8xOjApCisgKgorICogYW5kIGluIGZhY3QgYSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoaXMgaGFzaCBkaWQganVzdCB0aGF0LgorICogQnV0IG5vdyB3ZSBoYXZlIGltcHJvdmVkIHRoaW5ncyBhIGJpdCBieSByZWNvZ25pemluZyB0aGF0IGIgaXMKKyAqIGFsd2F5cyBhIHBvd2VyIG9mIHR3by4gV2Uga2VlcCBpdHMgYmFzZSAyIGxvZyBoYW5keSAoY2FsbCBpdCBsYiksCisgKiBzbyBub3cgd2UgY2FuIHdyaXRlIHRoaXMgd2l0aCBhIGJpdCBzaGlmdCBhbmQgbG9naWNhbCBBTkQ6CisgKgorICogICAgICBjZWlsKG4vYikgPSAobj4+bGIpICsgKCAobiAmIChiLTEpKSA/IDE6MCkKKyAqCisgKi8KKyNkZWZpbmUgSEFTSF9FWFBBTkRfQlVDS0VUUyh0YmwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1bnNpZ25lZCBfaGVfYmt0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1bnNpZ25lZCBfaGVfYmt0X2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHJ1Y3QgVVRfaGFzaF9oYW5kbGUgKl9oZV90aGgsICpfaGVfaGhfbnh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVVF9oYXNoX2J1Y2tldCAqX2hlX25ld19idWNrZXRzLCAqX2hlX25ld2JrdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfaGVfbmV3X2J1Y2tldHMgPSAoVVRfaGFzaF9idWNrZXQqKXV0aGFzaF9tYWxsb2MoICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAyVUwgKiB0YmwtPm51bV9idWNrZXRzICogc2l6ZW9mKHN0cnVjdCBVVF9oYXNoX2J1Y2tldCkpOyAgICAgICAgICAgIFwKKyAgICBpZiAoIV9oZV9uZXdfYnVja2V0cykgeyB1dGhhc2hfZmF0YWwoICJvdXQgb2YgbWVtb3J5Iik7IH0gICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZW1zZXQoX2hlX25ld19idWNrZXRzLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDJVTCAqIHRibC0+bnVtX2J1Y2tldHMgKiBzaXplb2Yoc3RydWN0IFVUX2hhc2hfYnVja2V0KSk7ICAgICAgICAgICAgIFwKKyAgICB0YmwtPmlkZWFsX2NoYWluX21heGxlbiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAodGJsLT5udW1faXRlbXMgPj4gKHRibC0+bG9nMl9udW1fYnVja2V0cysxVSkpICsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoKCh0YmwtPm51bV9pdGVtcyAmICgodGJsLT5udW1fYnVja2V0cyoyVSktMVUpKSAhPSAwVSkgPyAxVSA6IDBVKTsgICAgICAgIFwKKyAgICB0YmwtPm5vbmlkZWFsX2l0ZW1zID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoX2hlX2JrdF9pID0gMDsgX2hlX2JrdF9pIDwgdGJsLT5udW1fYnVja2V0czsgX2hlX2JrdF9pKyspICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX2hlX3RoaCA9IHRibC0+YnVja2V0c1sgX2hlX2JrdF9pIF0uaGhfaGVhZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKF9oZV90aGggIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgX2hlX2hoX254dCA9IF9oZV90aGgtPmhoX25leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgSEFTSF9UT19CS1QoIF9oZV90aGgtPmhhc2h2LCB0YmwtPm51bV9idWNrZXRzKjJVLCBfaGVfYmt0KTsgICAgICAgICAgIFwKKyAgICAgICAgICAgX2hlX25ld2JrdCA9ICYoX2hlX25ld19idWNrZXRzWyBfaGVfYmt0IF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgaWYgKCsrKF9oZV9uZXdia3QtPmNvdW50KSA+IHRibC0+aWRlYWxfY2hhaW5fbWF4bGVuKSB7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICB0YmwtPm5vbmlkZWFsX2l0ZW1zKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICBfaGVfbmV3Ymt0LT5leHBhbmRfbXVsdCA9IF9oZV9uZXdia3QtPmNvdW50IC8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YmwtPmlkZWFsX2NoYWluX21heGxlbjsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgX2hlX3RoaC0+aGhfcHJldiA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgX2hlX3RoaC0+aGhfbmV4dCA9IF9oZV9uZXdia3QtPmhoX2hlYWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgaWYgKF9oZV9uZXdia3QtPmhoX2hlYWQgIT0gTlVMTCkgeyBfaGVfbmV3Ymt0LT5oaF9oZWFkLT5oaF9wcmV2ID0gICAgIFwKKyAgICAgICAgICAgICAgICBfaGVfdGhoOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgX2hlX25ld2JrdC0+aGhfaGVhZCA9IF9oZV90aGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgX2hlX3RoaCA9IF9oZV9oaF9ueHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1dGhhc2hfZnJlZSggdGJsLT5idWNrZXRzLCB0YmwtPm51bV9idWNrZXRzKnNpemVvZihzdHJ1Y3QgVVRfaGFzaF9idWNrZXQpICk7IFwKKyAgICB0YmwtPm51bV9idWNrZXRzICo9IDJVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YmwtPmxvZzJfbnVtX2J1Y2tldHMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YmwtPmJ1Y2tldHMgPSBfaGVfbmV3X2J1Y2tldHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YmwtPmluZWZmX2V4cGFuZHMgPSAodGJsLT5ub25pZGVhbF9pdGVtcyA+ICh0YmwtPm51bV9pdGVtcyA+PiAxKSkgPyAgICAgICAgIFwKKyAgICAgICAgKHRibC0+aW5lZmZfZXhwYW5kcysxVSkgOiAwVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAodGJsLT5pbmVmZl9leHBhbmRzID4gMVUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGJsLT5ub2V4cGFuZD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdXRoYXNoX25vZXhwYW5kX2Z5aSh0YmwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1dGhhc2hfZXhwYW5kX2Z5aSh0YmwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKworLyogVGhpcyBpcyBhbiBhZGFwdGF0aW9uIG9mIFNpbW9uIFRhdGhhbSdzIE8obiBsb2cobikpIG1lcmdlc29ydCAqLworLyogTm90ZSB0aGF0IEhBU0hfU09SVCBhc3N1bWVzIHRoZSBoYXNoIGhhbmRsZSBuYW1lIHRvIGJlIGhoLgorICogSEFTSF9TUlQgd2FzIGFkZGVkIHRvIGFsbG93IHRoZSBoYXNoIGhhbmRsZSBuYW1lIHRvIGJlIHBhc3NlZCBpbi4gKi8KKyNkZWZpbmUgSEFTSF9TT1JUKGhlYWQsY21wZmNuKSBIQVNIX1NSVChoaCxoZWFkLGNtcGZjbikKKyNkZWZpbmUgSEFTSF9TUlQoaGgsaGVhZCxjbXBmY24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5zaWduZWQgX2hzX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5zaWduZWQgX2hzX2xvb3BpbmcsX2hzX25tZXJnZXMsX2hzX2luc2l6ZSxfaHNfcHNpemUsX2hzX3FzaXplOyAgICAgICAgICAgICAgIFwKKyAgc3RydWN0IFVUX2hhc2hfaGFuZGxlICpfaHNfcCwgKl9oc19xLCAqX2hzX2UsICpfaHNfbGlzdCwgKl9oc190YWlsOyAgICAgICAgICAgIFwKKyAgaWYgKGhlYWQgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9oc19pbnNpemUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9oc19sb29waW5nID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9oc19saXN0ID0gJigoaGVhZCktPmhoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHdoaWxlIChfaHNfbG9vcGluZyAhPSAwVSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBfaHNfcCA9IF9oc19saXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBfaHNfbGlzdCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBfaHNfdGFpbCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBfaHNfbm1lcmdlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB3aGlsZSAoX2hzX3AgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2hzX25tZXJnZXMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2hzX3EgPSBfaHNfcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2hzX3BzaXplID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgZm9yICggX2hzX2kgPSAwOyBfaHNfaSAgPCBfaHNfaW5zaXplOyBfaHNfaSsrICkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIF9oc19wc2l6ZSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIF9oc19xID0gKFVUX2hhc2hfaGFuZGxlKikoKF9oc19xLT5uZXh0ICE9IE5VTEwpID8gICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2b2lkKikoKGNoYXIqKShfaHNfcS0+bmV4dCkgKyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGhlYWQpLT5oaC50YmwtPmhobykpIDogTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGlmICghIChfaHNfcSkgKSB7IGJyZWFrOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2hzX3FzaXplID0gX2hzX2luc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgd2hpbGUgKChfaHNfcHNpemUgPiAwVSkgfHwgKChfaHNfcXNpemUgPiAwVSkgJiYgKF9oc19xICE9IE5VTEwpKSkge1wKKyAgICAgICAgICAgICAgICAgIGlmIChfaHNfcHNpemUgPT0gMFUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfZSA9IF9oc19xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfcSA9IChVVF9oYXNoX2hhbmRsZSopKChfaHNfcS0+bmV4dCAhPSBOVUxMKSA/ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodm9pZCopKChjaGFyKikoX2hzX3EtPm5leHQpICsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkKS0+aGgudGJsLT5oaG8pKSA6IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfcXNpemUtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIChfaHNfcXNpemUgPT0gMFUpIHx8IChfaHNfcSA9PSBOVUxMKSApIHsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfZSA9IF9oc19wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoX2hzX3AgIT0gTlVMTCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9oc19wID0gKFVUX2hhc2hfaGFuZGxlKikoKF9oc19wLT5uZXh0ICE9IE5VTEwpID8gICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2b2lkKikoKGNoYXIqKShfaHNfcC0+bmV4dCkgKyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhlYWQpLT5oaC50YmwtPmhobykpIDogTlVMTCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfcHNpemUtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjbXBmY24oREVDTFRZUEUoaGVhZCkoRUxNVF9GUk9NX0hIKChoZWFkKS0+aGgudGJsLF9oc19wKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDTFRZUEUoaGVhZCkoRUxNVF9GUk9NX0hIKChoZWFkKS0+aGgudGJsLF9oc19xKSkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA8PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfZSA9IF9oc19wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoX2hzX3AgIT0gTlVMTCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9oc19wID0gKFVUX2hhc2hfaGFuZGxlKikoKF9oc19wLT5uZXh0ICE9IE5VTEwpID8gICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHZvaWQqKSgoY2hhciopKF9oc19wLT5uZXh0KSArICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGVhZCktPmhoLnRibC0+aGhvKSkgOiBOVUxMKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfcHNpemUtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfZSA9IF9oc19xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfcSA9IChVVF9oYXNoX2hhbmRsZSopKChfaHNfcS0+bmV4dCAhPSBOVUxMKSA/ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodm9pZCopKChjaGFyKikoX2hzX3EtPm5leHQpICsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkKS0+aGgudGJsLT5oaG8pKSA6IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfcXNpemUtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGlmICggX2hzX3RhaWwgIT0gTlVMTCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfdGFpbC0+bmV4dCA9ICgoX2hzX2UgIT0gTlVMTCkgPyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTE1UX0ZST01fSEgoKGhlYWQpLT5oaC50YmwsX2hzX2UpIDogTlVMTCk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfbGlzdCA9IF9oc19lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGlmIChfaHNfZSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIF9oc19lLT5wcmV2ID0gKChfaHNfdGFpbCAhPSBOVUxMKSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIEVMTVRfRlJPTV9ISCgoaGVhZCktPmhoLnRibCxfaHNfdGFpbCkgOiBOVUxMKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIF9oc190YWlsID0gX2hzX2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2hzX3AgPSBfaHNfcTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBpZiAoX2hzX3RhaWwgIT0gTlVMTCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9oc190YWlsLT5uZXh0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBpZiAoIF9oc19ubWVyZ2VzIDw9IDFVICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2hzX2xvb3Bpbmc9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKGhlYWQpLT5oaC50YmwtPnRhaWwgPSBfaHNfdGFpbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgREVDTFRZUEVfQVNTSUdOKGhlYWQsRUxNVF9GUk9NX0hIKChoZWFkKS0+aGgudGJsLCBfaHNfbGlzdCkpOyAgICAgIFwKKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBfaHNfaW5zaXplICo9IDJVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEhBU0hfRlNDSyhoaCxoZWFkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIFRoaXMgZnVuY3Rpb24gc2VsZWN0cyBpdGVtcyBmcm9tIG9uZSBoYXNoIGludG8gYW5vdGhlciBoYXNoLgorICogVGhlIGVuZCByZXN1bHQgaXMgdGhhdCB0aGUgc2VsZWN0ZWQgaXRlbXMgaGF2ZSBkdWFsIHByZXNlbmNlCisgKiBpbiBib3RoIGhhc2hlcy4gVGhlcmUgaXMgbm8gY29weSBvZiB0aGUgaXRlbXMgbWFkZTsgcmF0aGVyCisgKiB0aGV5IGFyZSBhZGRlZCBpbnRvIHRoZSBuZXcgaGFzaCB0aHJvdWdoIGEgc2Vjb25kYXJ5IGhhc2gKKyAqIGhhc2ggaGFuZGxlIHRoYXQgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuICovCisjZGVmaW5lIEhBU0hfU0VMRUNUKGhoX2RzdCwgZHN0LCBoaF9zcmMsIHNyYywgY29uZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVuc2lnbmVkIF9zcmNfYmt0LCBfZHN0X2JrdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgKl9sYXN0X2VsdD1OVUxMLCAqX2VsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVUX2hhc2hfaGFuZGxlICpfc3JjX2hoLCAqX2RzdF9oaCwgKl9sYXN0X2VsdF9oaD1OVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB0cmRpZmZfdCBfZHN0X2hobyA9ICgoY2hhciopKCYoZHN0KS0+aGhfZHN0KSAtIChjaGFyKikoZHN0KSk7ICAgICAgICAgICAgICAgICBcCisgIGlmIChzcmMgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKF9zcmNfYmt0PTA7IF9zcmNfYmt0IDwgKHNyYyktPmhoX3NyYy50YmwtPm51bV9idWNrZXRzOyBfc3JjX2JrdCsrKSB7ICAgICBcCisgICAgICBmb3IoX3NyY19oaCA9IChzcmMpLT5oaF9zcmMudGJsLT5idWNrZXRzW19zcmNfYmt0XS5oaF9oZWFkOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgX3NyY19oaCAhPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgX3NyY19oaCA9IF9zcmNfaGgtPmhoX25leHQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgX2VsdCA9IEVMTVRfRlJPTV9ISCgoc3JjKS0+aGhfc3JjLnRibCwgX3NyY19oaCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaWYgKGNvbmQoX2VsdCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfZHN0X2hoID0gKFVUX2hhc2hfaGFuZGxlKikoKChjaGFyKilfZWx0KSArIF9kc3RfaGhvKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfZHN0X2hoLT5rZXkgPSBfc3JjX2hoLT5rZXk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfZHN0X2hoLT5rZXlsZW4gPSBfc3JjX2hoLT5rZXlsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfZHN0X2hoLT5oYXNodiA9IF9zcmNfaGgtPmhhc2h2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfZHN0X2hoLT5wcmV2ID0gX2xhc3RfZWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfZHN0X2hoLT5uZXh0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoX2xhc3RfZWx0X2hoICE9IE5VTEwpIHsgX2xhc3RfZWx0X2hoLT5uZXh0ID0gX2VsdDsgfSAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoZHN0ID09IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIERFQ0xUWVBFX0FTU0lHTihkc3QsX2VsdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIEhBU0hfTUFLRV9UQUJMRShoaF9kc3QsZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIF9kc3RfaGgtPnRibCA9IChkc3QpLT5oaF9kc3QudGJsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBIQVNIX1RPX0JLVChfZHN0X2hoLT5oYXNodiwgX2RzdF9oaC0+dGJsLT5udW1fYnVja2V0cywgX2RzdF9ia3QpOyAgICBcCisgICAgICAgICAgICBIQVNIX0FERF9UT19CS1QoX2RzdF9oaC0+dGJsLT5idWNrZXRzW19kc3RfYmt0XSxfZHN0X2hoKTsgICAgICAgICAgICBcCisgICAgICAgICAgICAoZHN0KS0+aGhfZHN0LnRibC0+bnVtX2l0ZW1zKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfbGFzdF9lbHQgPSBfZWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfbGFzdF9lbHRfaGggPSBfZHN0X2hoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEhBU0hfRlNDSyhoaF9kc3QsZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEhBU0hfQ0xFQVIoaGgsaGVhZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChoZWFkICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdXRoYXNoX2ZyZWUoKGhlYWQpLT5oaC50YmwtPmJ1Y2tldHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKGhlYWQpLT5oaC50YmwtPm51bV9idWNrZXRzKnNpemVvZihzdHJ1Y3QgVVRfaGFzaF9idWNrZXQpKTsgICAgICBcCisgICAgSEFTSF9CTE9PTV9GUkVFKChoZWFkKS0+aGgudGJsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdXRoYXNoX2ZyZWUoKGhlYWQpLT5oaC50YmwsIHNpemVvZihVVF9oYXNoX3RhYmxlKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGhlYWQpPU5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEhBU0hfT1ZFUkhFQUQoaGgsaGVhZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgKChoZWFkICE9IE5VTEwpID8gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgKHNpemVfdCkoKChoZWFkKS0+aGgudGJsLT5udW1faXRlbXMgICAqIHNpemVvZihVVF9oYXNoX2hhbmRsZSkpICAgKyAgICAgICAgICAgICBcCisgICAgICAgICAgKChoZWFkKS0+aGgudGJsLT5udW1fYnVja2V0cyAqIHNpemVvZihVVF9oYXNoX2J1Y2tldCkpICAgKyAgICAgICAgICAgICBcCisgICAgICAgICAgIHNpemVvZihVVF9oYXNoX3RhYmxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgICAgICAgICAgICBcCisgICAgICAgICAgIChIQVNIX0JMT09NX0JZVEVMRU4pKSkgOiAwVSkKKworI2lmZGVmIE5PX0RFQ0xUWVBFCisjZGVmaW5lIEhBU0hfSVRFUihoaCxoZWFkLGVsLHRtcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitmb3IoKChlbCk9KGhlYWQpKSwgKCgqKGNoYXIqKikoJih0bXApKSk9KGNoYXIqKSgoaGVhZCE9TlVMTCk/KGhlYWQpLT5oaC5uZXh0Ok5VTEwpKTsgXAorICAoZWwpICE9IE5VTEw7ICgoZWwpPSh0bXApKSwgKCgqKGNoYXIqKikoJih0bXApKSk9KGNoYXIqKSgodG1wIT1OVUxMKT8odG1wKS0+aGgubmV4dDpOVUxMKSkpCisjZWxzZQorI2RlZmluZSBIQVNIX0lURVIoaGgsaGVhZCxlbCx0bXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZm9yKCgoZWwpPShoZWFkKSksICgodG1wKT1ERUNMVFlQRShlbCkoKGhlYWQhPU5VTEwpPyhoZWFkKS0+aGgubmV4dDpOVUxMKSk7ICAgICAgXAorICAoZWwpICE9IE5VTEw7ICgoZWwpPSh0bXApKSwgKCh0bXApPURFQ0xUWVBFKGVsKSgodG1wIT1OVUxMKT8odG1wKS0+aGgubmV4dDpOVUxMKSkpCisjZW5kaWYKKworLyogb2J0YWluIGEgY291bnQgb2YgaXRlbXMgaW4gdGhlIGhhc2ggKi8KKyNkZWZpbmUgSEFTSF9DT1VOVChoZWFkKSBIQVNIX0NOVChoaCxoZWFkKQorI2RlZmluZSBIQVNIX0NOVChoaCxoZWFkKSAoKGhlYWQgIT0gTlVMTCk/KChoZWFkKS0+aGgudGJsLT5udW1faXRlbXMpOjBVKQorCit0eXBlZGVmIHN0cnVjdCBVVF9oYXNoX2J1Y2tldCB7CisgICBzdHJ1Y3QgVVRfaGFzaF9oYW5kbGUgKmhoX2hlYWQ7CisgICB1bnNpZ25lZCBjb3VudDsKKworICAgLyogZXhwYW5kX211bHQgaXMgbm9ybWFsbHkgc2V0IHRvIDAuIEluIHRoaXMgc2l0dWF0aW9uLCB0aGUgbWF4IGNoYWluIGxlbmd0aAorICAgICogdGhyZXNob2xkIGlzIGVuZm9yY2VkIGF0IGl0cyBkZWZhdWx0IHZhbHVlLCBIQVNIX0JLVF9DQVBBQ0lUWV9USFJFU0guIChJZgorICAgICogdGhlIGJ1Y2tldCdzIGNoYWluIGV4Y2VlZHMgdGhpcyBsZW5ndGgsIGJ1Y2tldCBleHBhbnNpb24gaXMgdHJpZ2dlcmVkKS4KKyAgICAqIEhvd2V2ZXIsIHNldHRpbmcgZXhwYW5kX211bHQgdG8gYSBub24temVybyB2YWx1ZSBkZWxheXMgYnVja2V0IGV4cGFuc2lvbgorICAgICogKHRoYXQgd291bGQgYmUgdHJpZ2dlcmVkIGJ5IGFkZGl0aW9ucyB0byB0aGlzIHBhcnRpY3VsYXIgYnVja2V0KQorICAgICogdW50aWwgaXRzIGNoYWluIGxlbmd0aCByZWFjaGVzIGEgKm11bHRpcGxlKiBvZiBIQVNIX0JLVF9DQVBBQ0lUWV9USFJFU0guCisgICAgKiAoVGhlIG11bHRpcGxpZXIgaXMgc2ltcGx5IGV4cGFuZF9tdWx0KzEpLiBUaGUgd2hvbGUgaWRlYSBvZiB0aGlzCisgICAgKiBtdWx0aXBsaWVyIGlzIHRvIHJlZHVjZSBidWNrZXQgZXhwYW5zaW9ucywgc2luY2UgdGhleSBhcmUgZXhwZW5zaXZlLCBpbgorICAgICogc2l0dWF0aW9ucyB3aGVyZSB3ZSBrbm93IHRoYXQgYSBwYXJ0aWN1bGFyIGJ1Y2tldCB0ZW5kcyB0byBiZSBvdmVydXNlZC4KKyAgICAqIEl0IGlzIGJldHRlciB0byBsZXQgaXRzIGNoYWluIGxlbmd0aCBncm93IHRvIGEgbG9uZ2VyIHlldC1zdGlsbC1ib3VuZGVkCisgICAgKiB2YWx1ZSwgdGhhbiB0byBkbyBhbiBPKG4pIGJ1Y2tldCBleHBhbnNpb24gdG9vIG9mdGVuLgorICAgICovCisgICB1bnNpZ25lZCBleHBhbmRfbXVsdDsKKworfSBVVF9oYXNoX2J1Y2tldDsKKworLyogcmFuZG9tIHNpZ25hdHVyZSB1c2VkIG9ubHkgdG8gZmluZCBoYXNoIHRhYmxlcyBpbiBleHRlcm5hbCBhbmFseXNpcyAqLworI2RlZmluZSBIQVNIX1NJR05BVFVSRSAweGEwMTExZmUxdQorI2RlZmluZSBIQVNIX0JMT09NX1NJR05BVFVSRSAweGIxMjIyMGYydQorCit0eXBlZGVmIHN0cnVjdCBVVF9oYXNoX3RhYmxlIHsKKyAgIFVUX2hhc2hfYnVja2V0ICpidWNrZXRzOworICAgdW5zaWduZWQgbnVtX2J1Y2tldHMsIGxvZzJfbnVtX2J1Y2tldHM7CisgICB1bnNpZ25lZCBudW1faXRlbXM7CisgICBzdHJ1Y3QgVVRfaGFzaF9oYW5kbGUgKnRhaWw7IC8qIHRhaWwgaGggaW4gYXBwIG9yZGVyLCBmb3IgZmFzdCBhcHBlbmQgICAgKi8KKyAgIHB0cmRpZmZfdCBoaG87IC8qIGhhc2ggaGFuZGxlIG9mZnNldCAoYnl0ZSBwb3Mgb2YgaGFzaCBoYW5kbGUgaW4gZWxlbWVudCAqLworCisgICAvKiBpbiBhbiBpZGVhbCBzaXR1YXRpb24gKGFsbCBidWNrZXRzIHVzZWQgZXF1YWxseSksIG5vIGJ1Y2tldCB3b3VsZCBoYXZlCisgICAgKiBtb3JlIHRoYW4gY2VpbCgjaXRlbXMvI2J1Y2tldHMpIGl0ZW1zLiB0aGF0J3MgdGhlIGlkZWFsIGNoYWluIGxlbmd0aC4gKi8KKyAgIHVuc2lnbmVkIGlkZWFsX2NoYWluX21heGxlbjsKKworICAgLyogbm9uaWRlYWxfaXRlbXMgaXMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgaGFzaCB3aG9zZSBjaGFpbiBwb3NpdGlvbgorICAgICogZXhjZWVkcyB0aGUgaWRlYWwgY2hhaW4gbWF4bGVuLiB0aGVzZSBpdGVtcyBwYXkgdGhlIHBlbmFsdHkgZm9yIGFuIHVuZXZlbgorICAgICogaGFzaCBkaXN0cmlidXRpb247IHJlYWNoaW5nIHRoZW0gaW4gYSBjaGFpbiB0cmF2ZXJzYWwgdGFrZXMgPmlkZWFsIHN0ZXBzICovCisgICB1bnNpZ25lZCBub25pZGVhbF9pdGVtczsKKworICAgLyogaW5lZmZlY3RpdmUgZXhwYW5kcyBvY2N1ciB3aGVuIGEgYnVja2V0IGRvdWJsaW5nIHdhcyBwZXJmb3JtZWQsIGJ1dAorICAgICogYWZ0ZXJ3YXJkLCBtb3JlIHRoYW4gaGFsZiB0aGUgaXRlbXMgaW4gdGhlIGhhc2ggaGFkIG5vbmlkZWFsIGNoYWluCisgICAgKiBwb3NpdGlvbnMuIElmIHRoaXMgaGFwcGVucyBvbiB0d28gY29uc2VjdXRpdmUgZXhwYW5zaW9ucyB3ZSBpbmhpYml0IGFueQorICAgICogZnVydGhlciBleHBhbnNpb24sIGFzIGl0J3Mgbm90IGhlbHBpbmc7IHRoaXMgaGFwcGVucyB3aGVuIHRoZSBoYXNoCisgICAgKiBmdW5jdGlvbiBpc24ndCBhIGdvb2QgZml0IGZvciB0aGUga2V5IGRvbWFpbi4gV2hlbiBleHBhbnNpb24gaXMgaW5oaWJpdGVkCisgICAgKiB0aGUgaGFzaCB3aWxsIHN0aWxsIHdvcmssIGFsYmVpdCBubyBsb25nZXIgaW4gY29uc3RhbnQgdGltZS4gKi8KKyAgIHVuc2lnbmVkIGluZWZmX2V4cGFuZHMsIG5vZXhwYW5kOworCisgICB1aW50MzJfdCBzaWduYXR1cmU7IC8qIHVzZWQgb25seSB0byBmaW5kIGhhc2ggdGFibGVzIGluIGV4dGVybmFsIGFuYWx5c2lzICovCisjaWZkZWYgSEFTSF9CTE9PTQorICAgdWludDMyX3QgYmxvb21fc2lnOyAvKiB1c2VkIG9ubHkgdG8gdGVzdCBibG9vbSBleGlzdHMgaW4gZXh0ZXJuYWwgYW5hbHlzaXMgKi8KKyAgIHVpbnQ4X3QgKmJsb29tX2J2OworICAgdWludDhfdCBibG9vbV9uYml0czsKKyNlbmRpZgorCit9IFVUX2hhc2hfdGFibGU7CisKK3R5cGVkZWYgc3RydWN0IFVUX2hhc2hfaGFuZGxlIHsKKyAgIHN0cnVjdCBVVF9oYXNoX3RhYmxlICp0Ymw7CisgICB2b2lkICpwcmV2OyAgICAgICAgICAgICAgICAgICAgICAgLyogcHJldiBlbGVtZW50IGluIGFwcCBvcmRlciAgICAgICovCisgICB2b2lkICpuZXh0OyAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBlbGVtZW50IGluIGFwcCBvcmRlciAgICAgICovCisgICBzdHJ1Y3QgVVRfaGFzaF9oYW5kbGUgKmhoX3ByZXY7ICAgLyogcHJldmlvdXMgaGggaW4gYnVja2V0IG9yZGVyICAgICovCisgICBzdHJ1Y3QgVVRfaGFzaF9oYW5kbGUgKmhoX25leHQ7ICAgLyogbmV4dCBoaCBpbiBidWNrZXQgb3JkZXIgICAgICAgICovCisgICB2b2lkICprZXk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogcHRyIHRvIGVuY2xvc2luZyBzdHJ1Y3QncyBrZXkgICovCisgICB1bnNpZ25lZCBrZXlsZW47ICAgICAgICAgICAgICAgICAgLyogZW5jbG9zaW5nIHN0cnVjdCdzIGtleSBsZW4gICAgICovCisgICB1bnNpZ25lZCBoYXNodjsgICAgICAgICAgICAgICAgICAgLyogcmVzdWx0IG9mIGhhc2gtZmNuKGtleSkgICAgICAgICovCit9IFVUX2hhc2hfaGFuZGxlOworCisjZW5kaWYgLyogVVRIQVNIX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmRybS5wYy5pbiBiL2xpYmRybS5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDZlMmE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHJtLnBjLmluCkBAIC0wLDAgKzEsMTAgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiBsaWJkcm0KK0Rlc2NyaXB0aW9uOiBVc2Vyc3BhY2UgaW50ZXJmYWNlIHRvIGtlcm5lbCBEUk0gc2VydmljZXMKK1ZlcnNpb246IEBQQUNLQUdFX1ZFUlNJT05ACitMaWJzOiAtTCR7bGliZGlyfSAtbGRybQorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0gLUkke2luY2x1ZGVkaXJ9L2xpYmRybQpkaWZmIC0tZ2l0IGEvbGliZHJtX2xpc3RzLmggYi9saWJkcm1fbGlzdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTI2ZDhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHJtX2xpc3RzLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAyMDA2IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBCaXNtYXJjaywgTkQuIFVTQS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICovCisKKy8qCisgKiBMaXN0IG1hY3JvcyBoZWF2aWx5IGluc3BpcmVkIGJ5IHRoZSBMaW51eCBrZXJuZWwKKyAqIGxpc3QgaGFuZGxpbmcuIE5vIGxpc3QgbG9vcGluZyB5ZXQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCit0eXBlZGVmIHN0cnVjdCBfZHJtTU1MaXN0SGVhZAoreworICAgIHN0cnVjdCBfZHJtTU1MaXN0SGVhZCAqcHJldjsKKyAgICBzdHJ1Y3QgX2RybU1NTGlzdEhlYWQgKm5leHQ7Cit9IGRybU1NTGlzdEhlYWQ7CisKKyNkZWZpbmUgRFJNSU5JVExJU1RIRUFEKF9faXRlbSkJCSAgICAgICBcCisgIGRvewkJCQkJICAgICAgIFwKKyAgICAoX19pdGVtKS0+cHJldiA9IChfX2l0ZW0pOwkJICAgICAgIFwKKyAgICAoX19pdGVtKS0+bmV4dCA9IChfX2l0ZW0pOwkJICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBEUk1MSVNUQUREKF9faXRlbSwgX19saXN0KQkJXAorICBkbyB7CQkJCQkJXAorICAgIChfX2l0ZW0pLT5wcmV2ID0gKF9fbGlzdCk7CQkJXAorICAgIChfX2l0ZW0pLT5uZXh0ID0gKF9fbGlzdCktPm5leHQ7CQlcCisgICAgKF9fbGlzdCktPm5leHQtPnByZXYgPSAoX19pdGVtKTsJCVwKKyAgICAoX19saXN0KS0+bmV4dCA9IChfX2l0ZW0pOwkJCVwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBEUk1MSVNUQUREVEFJTChfX2l0ZW0sIF9fbGlzdCkJCVwKKyAgZG8gewkJCQkJCVwKKyAgICAoX19pdGVtKS0+bmV4dCA9IChfX2xpc3QpOwkJCVwKKyAgICAoX19pdGVtKS0+cHJldiA9IChfX2xpc3QpLT5wcmV2OwkJXAorICAgIChfX2xpc3QpLT5wcmV2LT5uZXh0ID0gKF9faXRlbSk7CQlcCisgICAgKF9fbGlzdCktPnByZXYgPSAoX19pdGVtKTsJCQlcCisgIH0gd2hpbGUoMCkKKworI2RlZmluZSBEUk1MSVNUREVMKF9faXRlbSkJCQlcCisgIGRvIHsJCQkJCQlcCisgICAgKF9faXRlbSktPnByZXYtPm5leHQgPSAoX19pdGVtKS0+bmV4dDsJXAorICAgIChfX2l0ZW0pLT5uZXh0LT5wcmV2ID0gKF9faXRlbSktPnByZXY7CVwKKyAgfSB3aGlsZSgwKQorCisjZGVmaW5lIERSTUxJU1RERUxJTklUKF9faXRlbSkJCQlcCisgIGRvIHsJCQkJCQlcCisgICAgKF9faXRlbSktPnByZXYtPm5leHQgPSAoX19pdGVtKS0+bmV4dDsJXAorICAgIChfX2l0ZW0pLT5uZXh0LT5wcmV2ID0gKF9faXRlbSktPnByZXY7CVwKKyAgICAoX19pdGVtKS0+bmV4dCA9IChfX2l0ZW0pOwkJCVwKKyAgICAoX19pdGVtKS0+cHJldiA9IChfX2l0ZW0pOwkJCVwKKyAgfSB3aGlsZSgwKQorCisjZGVmaW5lIERSTUxJU1RFTlRSWShfX3R5cGUsIF9faXRlbSwgX19maWVsZCkgICBcCisgICAgKChfX3R5cGUgKikoKChjaGFyICopIChfX2l0ZW0pKSAtIG9mZnNldG9mKF9fdHlwZSwgX19maWVsZCkpKQorCisjZGVmaW5lIERSTUxJU1RFTVBUWShfX2l0ZW0pICgoX19pdGVtKS0+bmV4dCA9PSAoX19pdGVtKSkKKworI2RlZmluZSBEUk1MSVNUU0lOR0xFKF9fbGlzdCkgXAorCSghRFJNTElTVEVNUFRZKF9fbGlzdCkgJiYgKChfX2xpc3QpLT5uZXh0ID09IChfX2xpc3QpLT5wcmV2KSkKKworI2RlZmluZSBEUk1MSVNURk9SRUFDSChfX2l0ZW0sIF9fbGlzdCkJCQkJCVwKKwlmb3IgKChfX2l0ZW0pID0gKF9fbGlzdCktPm5leHQ7CQkJCQlcCisJICAgICAoX19pdGVtKSAhPSAoX19saXN0KTsgKF9faXRlbSkgPSAoX19pdGVtKS0+bmV4dCkKKworI2RlZmluZSBEUk1MSVNURk9SRUFDSFNBRkUoX19pdGVtLCBfX3RlbXAsIF9fbGlzdCkJCQlcCisJZm9yICgoX19pdGVtKSA9IChfX2xpc3QpLT5uZXh0LCAoX190ZW1wKSA9IChfX2l0ZW0pLT5uZXh0OwlcCisJICAgICAoX19pdGVtKSAhPSAoX19saXN0KTsJCQkJCVwKKwkgICAgIChfX2l0ZW0pID0gKF9fdGVtcCksIChfX3RlbXApID0gKF9faXRlbSktPm5leHQpCisKKyNkZWZpbmUgRFJNTElTVEZPUkVBQ0hTQUZFUkVWRVJTRShfX2l0ZW0sIF9fdGVtcCwgX19saXN0KQkJXAorCWZvciAoKF9faXRlbSkgPSAoX19saXN0KS0+cHJldiwgKF9fdGVtcCkgPSAoX19pdGVtKS0+cHJldjsJXAorCSAgICAgKF9faXRlbSkgIT0gKF9fbGlzdCk7CQkJCQlcCisJICAgICAoX19pdGVtKSA9IChfX3RlbXApLCAoX190ZW1wKSA9IChfX2l0ZW0pLT5wcmV2KQorCisjZGVmaW5lIERSTUxJU1RGT1JFQUNIRU5UUlkoX19pdGVtLCBfX2xpc3QsIF9faGVhZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWZvciAoKF9faXRlbSkgPSBEUk1MSVNURU5UUlkodHlwZW9mKCpfX2l0ZW0pLCAoX19saXN0KS0+bmV4dCwgX19oZWFkKTsgXAorCSAgICAgJihfX2l0ZW0pLT5fX2hlYWQgIT0gKF9fbGlzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgKF9faXRlbSkgPSBEUk1MSVNURU5UUlkodHlwZW9mKCpfX2l0ZW0pLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKF9faXRlbSktPl9faGVhZC5uZXh0LCBfX2hlYWQpKQorCisjZGVmaW5lIERSTUxJU1RGT1JFQUNIRU5UUllTQUZFKF9faXRlbSwgX190ZW1wLCBfX2xpc3QsIF9faGVhZCkgICAgICAgICAgICAgICAgXAorCWZvciAoKF9faXRlbSkgPSBEUk1MSVNURU5UUlkodHlwZW9mKCpfX2l0ZW0pLCAoX19saXN0KS0+bmV4dCwgX19oZWFkKSwgXAorCSAgICAgKF9fdGVtcCkgPSBEUk1MSVNURU5UUlkodHlwZW9mKCpfX2l0ZW0pLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKF9faXRlbSktPl9faGVhZC5uZXh0LCBfX2hlYWQpOyAgICAgICAgICAgXAorCSAgICAgJihfX2l0ZW0pLT5fX2hlYWQgIT0gKF9fbGlzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgKF9faXRlbSkgPSAoX190ZW1wKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgKF9fdGVtcCkgPSBEUk1MSVNURU5UUlkodHlwZW9mKCpfX2l0ZW0pLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKF9fdGVtcCktPl9faGVhZC5uZXh0LCBfX2hlYWQpKQorCisjZGVmaW5lIERSTUxJU1RKT0lOKF9fbGlzdCwgX19qb2luKSBpZiAoIURSTUxJU1RFTVBUWShfX2xpc3QpKSB7CVwKKwkoX19saXN0KS0+bmV4dC0+cHJldiA9IChfX2pvaW4pOwkJCQlcCisJKF9fbGlzdCktPnByZXYtPm5leHQgPSAoX19qb2luKS0+bmV4dDsJCQkJXAorCShfX2pvaW4pLT5uZXh0LT5wcmV2ID0gKF9fbGlzdCktPnByZXY7CQkJCVwKKwkoX19qb2luKS0+bmV4dCA9IChfX2xpc3QpLT5uZXh0OwkJCQlcCit9CmRpZmYgLS1naXQgYS9saWJkcm1fbWFjcm9zLmggYi9saWJkcm1fbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5ZDA5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRybV9tYWNyb3MuaApAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTQgTlZJRElBIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBMSUJEUk1fTElCRFJNX0gKKyNkZWZpbmUgTElCRFJNX0xJQkRSTV9ICisKKyNpZiBkZWZpbmVkKEhBVkVfVklTSUJJTElUWSkKKyMgIGRlZmluZSBkcm1fcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjZWxzZQorIyAgZGVmaW5lIGRybV9wcml2YXRlCisjZW5kaWYKKworCisvKioKKyAqIFN0YXRpYyAoY29tcGlsZS10aW1lKSBhc3NlcnRpb24uCisgKiBCYXNpY2FsbHksIHVzZSBDT05EIHRvIGRpbWVuc2lvbiBhbiBhcnJheS4gIElmIENPTkQgaXMgZmFsc2UvemVybyB0aGUKKyAqIGFycmF5IHNpemUgd2lsbCBiZSAtMSBhbmQgd2UnbGwgZ2V0IGEgY29tcGlsYXRpb24gZXJyb3IuCisgKi8KKyNkZWZpbmUgU1RBVElDX0FTU0VSVChDT05EKSBcCisgICBkbyB7IFwKKyAgICAgICh2b2lkKSBzaXplb2YoY2hhciBbMSAtIDIqIShDT05EKV0pOyBcCisgICB9IHdoaWxlICgwKQorCisKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisjaWYgZGVmaW5lZChBTkRST0lEKSAmJiAhZGVmaW5lZChfX0xQNjRfXykKKyNpbmNsdWRlIDxlcnJuby5oPiAvKiBmb3IgRUlOVkFMICovCisKK2V4dGVybiB2b2lkICpfX21tYXAyKHZvaWQgKiwgc2l6ZV90LCBpbnQsIGludCwgaW50LCBzaXplX3QpOworCitzdGF0aWMgaW5saW5lIHZvaWQgKmRybV9tbWFwKHZvaWQgKmFkZHIsIHNpemVfdCBsZW5ndGgsIGludCBwcm90LCBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwgbG9mZl90IG9mZnNldCkKK3sKKyAgIC8qIG9mZnNldCBtdXN0IGJlIGFsaWduZWQgdG8gNDA5NiAobm90IG5lY2Vzc2FyaWx5IHRoZSBwYWdlIHNpemUpICovCisgICBpZiAob2Zmc2V0ICYgNDA5NSkgeworICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICByZXR1cm4gTUFQX0ZBSUxFRDsKKyAgIH0KKworICAgcmV0dXJuIF9fbW1hcDIoYWRkciwgbGVuZ3RoLCBwcm90LCBmbGFncywgZmQsIChzaXplX3QpIChvZmZzZXQgPj4gMTIpKTsKK30KKworIyAgZGVmaW5lIGRybV9tdW5tYXAoYWRkciwgbGVuZ3RoKSBcCisgICAgICAgICAgICAgIG11bm1hcChhZGRyLCBsZW5ndGgpCisKKworI2Vsc2UKKworLyogYXNzdW1lIGxhcmdlIGZpbGUgc3VwcG9ydCBleGlzdHMgKi8KKyMgIGRlZmluZSBkcm1fbW1hcChhZGRyLCBsZW5ndGgsIHByb3QsIGZsYWdzLCBmZCwgb2Zmc2V0KSBcCisgICAgICAgICAgICAgIG1tYXAoYWRkciwgbGVuZ3RoLCBwcm90LCBmbGFncywgZmQsIG9mZnNldCkKKworCitzdGF0aWMgaW5saW5lIGludCBkcm1fbXVubWFwKHZvaWQgKmFkZHIsIHNpemVfdCBsZW5ndGgpCit7CisgICAvKiBDb3BpZWQgZnJvbSBjb25maWd1cmUgY29kZSBnZW5lcmF0ZWQgYnkgQUNfU1lTX0xBUkdFRklMRSAqLworI2RlZmluZSBMQVJHRV9PRkZfVCAoKCgob2ZmX3QpIDEgPDwgMzEpIDw8IDMxKSAtIDEgKyBcCisgICAgICAgICAgICAgICAgICAgICAoKChvZmZfdCkgMSA8PCAzMSkgPDwgMzEpKQorICAgU1RBVElDX0FTU0VSVChMQVJHRV9PRkZfVCAlIDIxNDc0ODM2MjkgPT0gNzIxICYmCisgICAgICAgICAgICAgICAgIExBUkdFX09GRl9UICUgMjE0NzQ4MzY0NyA9PSAxKTsKKyN1bmRlZiBMQVJHRV9PRkZfVAorCisgICByZXR1cm4gbXVubWFwKGFkZHIsIGxlbmd0aCk7Cit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJrbXMvQW5kcm9pZC5tayBiL2xpYmttcy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZTcyMDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJrbXMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDUxIEBACitEUk1fR1BVX0RSSVZFUlMgOj0gJChzdHJpcCAkKGZpbHRlci1vdXQgc3dyYXN0LCAkKEJPQVJEX0dQVV9EUklWRVJTKSkpCisKK2ludGVsX2RyaXZlcnMgOj0gaTkxNSBpOTY1IGk5MTVnIGlsbworcmFkZW9uX2RyaXZlcnMgOj0gcjMwMGcgcjYwMGcgcmFkZW9uc2kKK25vdXZlYXVfZHJpdmVycyA6PSBub3V2ZWF1Cit2aXJnbF9kcml2ZXJzIDo9IHZpcmdsCit2bXdnZnhfZHJpdmVycyA6PSB2bXdnZngKKwordmFsaWRfZHJpdmVycyA6PSBcCisJJChpbnRlbF9kcml2ZXJzKSBcCisJJChyYWRlb25fZHJpdmVycykgXAorCSQobm91dmVhdV9kcml2ZXJzKSBcCisJJCh2aXJnbF9kcml2ZXJzKSBcCisJJCh2bXdnZnhfZHJpdmVycykKKworIyB3YXJuIGFib3V0IGludmFsaWQgZHJpdmVycworaW52YWxpZF9kcml2ZXJzIDo9ICQoZmlsdGVyLW91dCAkKHZhbGlkX2RyaXZlcnMpLCAkKERSTV9HUFVfRFJJVkVSUykpCitpZm5lcSAoJChpbnZhbGlkX2RyaXZlcnMpLCkKKyQod2FybmluZyBpbnZhbGlkIEdQVSBkcml2ZXJzOiAkKGludmFsaWRfZHJpdmVycykpCisjIHRpZHkgdXAKK0RSTV9HUFVfRFJJVkVSUyA6PSAkKGZpbHRlci1vdXQgJChpbnZhbGlkX2RyaXZlcnMpLCAkKERSTV9HUFVfRFJJVkVSUykpCitlbmRpZgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpL01ha2VmaWxlLnNvdXJjZXMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoTElCS01TX0ZJTEVTKQorCitpZm5lcSAoJChmaWx0ZXIgJCh2bXdnZnhfZHJpdmVycyksICQoRFJNX0dQVV9EUklWRVJTKSksKQorTE9DQUxfU1JDX0ZJTEVTICs9ICQoTElCS01TX1ZNV0dGWF9GSUxFUykKK2VuZGlmCisKK2lmbmVxICgkKGZpbHRlciAkKGludGVsX2RyaXZlcnMpLCAkKERSTV9HUFVfRFJJVkVSUykpLCkKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKExJQktNU19JTlRFTF9GSUxFUykKK2VuZGlmCisKK2lmbmVxICgkKGZpbHRlciAkKG5vdXZlYXVfZHJpdmVycyksICQoRFJNX0dQVV9EUklWRVJTKSksKQorTE9DQUxfU1JDX0ZJTEVTICs9ICQoTElCS01TX05PVVZFQVVfRklMRVMpCitlbmRpZgorCitpZm5lcSAoJChmaWx0ZXIgJChyYWRlb25fZHJpdmVycyksICQoRFJNX0dQVV9EUklWRVJTKSksKQorTE9DQUxfU1JDX0ZJTEVTICs9ICQoTElCS01TX1JBREVPTl9GSUxFUykKK2VuZGlmCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJrbXMKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliZHJtCisKK2luY2x1ZGUgJChMSUJEUk1fQ09NTU9OX01LKQoraW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbGlia21zL01ha2VmaWxlLmFtIGIvbGlia21zL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MWZjMzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJrbXMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0MyBAQAoraW5jbHVkZSBNYWtlZmlsZS5zb3VyY2VzCisKK0FNX0NGTEFHUyA9IFwKKwkkKFdBUk5fQ0ZMQUdTKSBcCisJLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUvZHJtIFwKKwktSSQodG9wX3NyY2RpcikKKworbGlia21zX2xhX0xUTElCUkFSSUVTID0gbGlia21zLmxhCitsaWJrbXNfbGFkaXIgPSAkKGxpYmRpcikKK2xpYmttc19sYV9MREZMQUdTID0gLXZlcnNpb24tbnVtYmVyIDE6MDowIC1uby11bmRlZmluZWQKK2xpYmttc19sYV9MSUJBREQgPSAuLi9saWJkcm0ubGEKKworbGlia21zX2xhX1NPVVJDRVMgPSAkKExJQktNU19GSUxFUykKKworaWYgSEFWRV9WTVdHRlgKK2xpYmttc19sYV9TT1VSQ0VTICs9ICQoTElCS01TX1ZNV0dGWF9GSUxFUykKK2VuZGlmCisKK2lmIEhBVkVfSU5URUwKK2xpYmttc19sYV9TT1VSQ0VTICs9ICQoTElCS01TX0lOVEVMX0ZJTEVTKQorZW5kaWYKKworaWYgSEFWRV9OT1VWRUFVCitsaWJrbXNfbGFfU09VUkNFUyArPSAkKExJQktNU19OT1VWRUFVX0ZJTEVTKQorZW5kaWYKKworaWYgSEFWRV9SQURFT04KK2xpYmttc19sYV9TT1VSQ0VTICs9ICQoTElCS01TX1JBREVPTl9GSUxFUykKK2VuZGlmCisKK2lmIEhBVkVfRVhZTk9TCitsaWJrbXNfbGFfU09VUkNFUyArPSAkKExJQktNU19FWFlOT1NfRklMRVMpCitBTV9DRkxBR1MgKz0gLUkkKHRvcF9zcmNkaXIpL2V4eW5vcworZW5kaWYKKworbGlia21zaW5jbHVkZWRpciA9ICR7aW5jbHVkZWRpcn0vbGlia21zCitsaWJrbXNpbmNsdWRlX0hFQURFUlMgPSAkKExJQktNU19IX0ZJTEVTKQorCitwa2djb25maWdkaXIgPSBAcGtnY29uZmlnZGlyQAorcGtnY29uZmlnX0RBVEEgPSBsaWJrbXMucGMKKworVEVTVFMgPSBrbXMtc3ltYm9sLWNoZWNrCitFWFRSQV9ESVNUID0gJChURVNUUykKZGlmZiAtLWdpdCBhL2xpYmttcy9NYWtlZmlsZS5zb3VyY2VzIGIvbGlia21zL01ha2VmaWxlLnNvdXJjZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE5MWY1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmttcy9NYWtlZmlsZS5zb3VyY2VzCkBAIC0wLDAgKzEsMjMgQEAKK0xJQktNU19GSUxFUyA6PSBcCisJaW50ZXJuYWwuaCBcCisJbGludXguYyBcCisJZHVtYi5jIFwKKwlhcGkuYworCitMSUJLTVNfVk1XR0ZYX0ZJTEVTIDo9IFwKKwl2bXdnZnguYworCitMSUJLTVNfSU5URUxfRklMRVMgOj0gXAorCWludGVsLmMKKworTElCS01TX05PVVZFQVVfRklMRVMgOj0gXAorCW5vdXZlYXUuYworCitMSUJLTVNfUkFERU9OX0ZJTEVTIDo9IFwKKwlyYWRlb24uYworCitMSUJLTVNfRVhZTk9TX0ZJTEVTIDo9IFwKKwlleHlub3MuYworCitMSUJLTVNfSF9GSUxFUyA6PSBcCisJbGlia21zLmgKZGlmZiAtLWdpdCBhL2xpYmttcy9hcGkuYyBiL2xpYmttcy9hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTRkOGEyCi0tLSAvZGV2L251bGwKKysrIGIvbGlia21zL2FwaS5jCkBAIC0wLDAgKzEsMTQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwOSBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliZHJtX21hY3Jvcy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK2ludCBrbXNfY3JlYXRlKGludCBmZCwgc3RydWN0IGttc19kcml2ZXIgKipvdXQpCit7CisJcmV0dXJuIGxpbnV4X2NyZWF0ZShmZCwgb3V0KTsKK30KKworaW50IGttc19nZXRfcHJvcChzdHJ1Y3Qga21zX2RyaXZlciAqa21zLCB1bnNpZ25lZCBrZXksIHVuc2lnbmVkICpvdXQpCit7CisJc3dpdGNoIChrZXkpIHsKKwljYXNlIEtNU19CT19UWVBFOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIGttcy0+Z2V0X3Byb3Aoa21zLCBrZXksIG91dCk7Cit9CisKK2ludCBrbXNfZGVzdHJveShzdHJ1Y3Qga21zX2RyaXZlciAqKmttcykKK3sKKwlpZiAoISgqa21zKSkKKwkJcmV0dXJuIDA7CisKKwlmcmVlKCprbXMpOworCSprbXMgPSBOVUxMOworCXJldHVybiAwOworfQorCitpbnQga21zX2JvX2NyZWF0ZShzdHJ1Y3Qga21zX2RyaXZlciAqa21zLCBjb25zdCB1bnNpZ25lZCAqYXR0ciwgc3RydWN0IGttc19ibyAqKm91dCkKK3sKKwl1bnNpZ25lZCB3aWR0aCA9IDA7CisJdW5zaWduZWQgaGVpZ2h0ID0gMDsKKwllbnVtIGttc19ib190eXBlIHR5cGUgPSBLTVNfQk9fVFlQRV9TQ0FOT1VUX1g4UjhHOEI4OworCWludCBpOworCisJZm9yIChpID0gMDsgYXR0cltpXTspIHsKKwkJdW5zaWduZWQga2V5ID0gYXR0cltpKytdOworCQl1bnNpZ25lZCB2YWx1ZSA9IGF0dHJbaSsrXTsKKworCQlzd2l0Y2ggKGtleSkgeworCQljYXNlIEtNU19XSURUSDoKKwkJCXdpZHRoID0gdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBLTVNfSEVJR0hUOgorCQkJaGVpZ2h0ID0gdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBLTVNfQk9fVFlQRToKKwkJCXR5cGUgPSB2YWx1ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBYWFggc2FuaXR5IGNoZWNrIHR5cGUgKi8KKworCWlmICh0eXBlID09IEtNU19CT19UWVBFX0NVUlNPUl82NFg2NF9BOFI4RzhCOCAmJgorCSAgICAod2lkdGggIT0gNjQgfHwgaGVpZ2h0ICE9IDY0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4ga21zLT5ib19jcmVhdGUoa21zLCB3aWR0aCwgaGVpZ2h0LCB0eXBlLCBhdHRyLCBvdXQpOworfQorCitpbnQga21zX2JvX2dldF9wcm9wKHN0cnVjdCBrbXNfYm8gKmJvLCB1bnNpZ25lZCBrZXksIHVuc2lnbmVkICpvdXQpCit7CisJc3dpdGNoIChrZXkpIHsKKwljYXNlIEtNU19QSVRDSDoKKwkJKm91dCA9IGJvLT5waXRjaDsKKwkJYnJlYWs7CisJY2FzZSBLTVNfSEFORExFOgorCQkqb3V0ID0gYm8tPmhhbmRsZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBrbXNfYm9fbWFwKHN0cnVjdCBrbXNfYm8gKmJvLCB2b2lkICoqb3V0KQoreworCXJldHVybiBiby0+a21zLT5ib19tYXAoYm8sIG91dCk7Cit9CisKK2ludCBrbXNfYm9fdW5tYXAoc3RydWN0IGttc19ibyAqYm8pCit7CisJcmV0dXJuIGJvLT5rbXMtPmJvX3VubWFwKGJvKTsKK30KKworaW50IGttc19ib19kZXN0cm95KHN0cnVjdCBrbXNfYm8gKipibykKK3sKKwlpbnQgcmV0OworCisJaWYgKCEoKmJvKSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSAoKmJvKS0+a21zLT5ib19kZXN0cm95KCpibyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCSpibyA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJrbXMvZHVtYi5jIGIvbGlia21zL2R1bWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTVhMDcyCi0tLSAvZGV2L251bGwKKysrIGIvbGlia21zL2R1bWIuYwpAQCAtMCwwICsxLDIyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDkgVk13YXJlLCBJbmMuLCBQYWxvIEFsdG8sIENBLiwgVVNBCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlICJ4Zjg2ZHJtLmgiCisjaW5jbHVkZSAibGliZHJtX21hY3Jvcy5oIgorCitzdHJ1Y3QgZHVtYl9ibworeworCXN0cnVjdCBrbXNfYm8gYmFzZTsKKwl1bnNpZ25lZCBtYXBfY291bnQ7Cit9OworCitzdGF0aWMgaW50CitkdW1iX2dldF9wcm9wKHN0cnVjdCBrbXNfZHJpdmVyICprbXMsIHVuc2lnbmVkIGtleSwgdW5zaWduZWQgKm91dCkKK3sKKwlzd2l0Y2ggKGtleSkgeworCWNhc2UgS01TX0JPX1RZUEU6CisJCSpvdXQgPSBLTVNfQk9fVFlQRV9TQ0FOT1VUX1g4UjhHOEI4IHwgS01TX0JPX1RZUEVfQ1VSU09SXzY0WDY0X0E4UjhHOEI4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2R1bWJfZGVzdHJveShzdHJ1Y3Qga21zX2RyaXZlciAqa21zKQoreworCWZyZWUoa21zKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZHVtYl9ib19jcmVhdGUoc3RydWN0IGttc19kcml2ZXIgKmttcywKKwkJIGNvbnN0IHVuc2lnbmVkIHdpZHRoLCBjb25zdCB1bnNpZ25lZCBoZWlnaHQsCisJCSBjb25zdCBlbnVtIGttc19ib190eXBlIHR5cGUsIGNvbnN0IHVuc2lnbmVkICphdHRyLAorCQkgc3RydWN0IGttc19ibyAqKm91dCkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfY3JlYXRlX2R1bWIgYXJnOworCXN0cnVjdCBkdW1iX2JvICpibzsKKwlpbnQgaSwgcmV0OworCisJZm9yIChpID0gMDsgYXR0cltpXTsgaSArPSAyKSB7CisJCXN3aXRjaCAoYXR0cltpXSkgeworCQljYXNlIEtNU19XSURUSDoKKwkJY2FzZSBLTVNfSEVJR0hUOgorCQkJYnJlYWs7CisJCWNhc2UgS01TX0JPX1RZUEU6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJYm8gPSBjYWxsb2MoMSwgc2l6ZW9mKCpibykpOworCWlmICghYm8pCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KCZhcmcsIDAsIHNpemVvZihhcmcpKTsKKworCS8qIEFsbCBCT19UWVBFIGN1cnJlbnRseSBhcmUgMzJicHAgZm9ybWF0cyAqLworCWFyZy5icHAgPSAzMjsKKwlhcmcud2lkdGggPSB3aWR0aDsKKwlhcmcuaGVpZ2h0ID0gaGVpZ2h0OworCisJcmV0ID0gZHJtSW9jdGwoa21zLT5mZCwgRFJNX0lPQ1RMX01PREVfQ1JFQVRFX0RVTUIsICZhcmcpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2ZyZWU7CisKKwliby0+YmFzZS5rbXMgPSBrbXM7CisJYm8tPmJhc2UuaGFuZGxlID0gYXJnLmhhbmRsZTsKKwliby0+YmFzZS5zaXplID0gYXJnLnNpemU7CisJYm8tPmJhc2UucGl0Y2ggPSBhcmcucGl0Y2g7CisKKwkqb3V0ID0gJmJvLT5iYXNlOworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlOgorCWZyZWUoYm8pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2R1bWJfYm9fZ2V0X3Byb3Aoc3RydWN0IGttc19ibyAqYm8sIHVuc2lnbmVkIGtleSwgdW5zaWduZWQgKm91dCkKK3sKKwlzd2l0Y2ggKGtleSkgeworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludAorZHVtYl9ib19tYXAoc3RydWN0IGttc19ibyAqX2JvLCB2b2lkICoqb3V0KQoreworCXN0cnVjdCBkdW1iX2JvICpibyA9IChzdHJ1Y3QgZHVtYl9ibyAqKV9ibzsKKwlzdHJ1Y3QgZHJtX21vZGVfbWFwX2R1bWIgYXJnOworCXZvaWQgKm1hcCA9IE5VTEw7CisJaW50IHJldDsKKworCWlmIChiby0+YmFzZS5wdHIpIHsKKwkJYm8tPm1hcF9jb3VudCsrOworCQkqb3V0ID0gYm8tPmJhc2UucHRyOworCQlyZXR1cm4gMDsKKwl9CisKKwltZW1zZXQoJmFyZywgMCwgc2l6ZW9mKGFyZykpOworCWFyZy5oYW5kbGUgPSBiby0+YmFzZS5oYW5kbGU7CisKKwlyZXQgPSBkcm1Jb2N0bChiby0+YmFzZS5rbXMtPmZkLCBEUk1fSU9DVExfTU9ERV9NQVBfRFVNQiwgJmFyZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW1hcCA9IGRybV9tbWFwKDAsIGJvLT5iYXNlLnNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGJvLT5iYXNlLmttcy0+ZmQsIGFyZy5vZmZzZXQpOworCWlmIChtYXAgPT0gTUFQX0ZBSUxFRCkKKwkJcmV0dXJuIC1lcnJubzsKKworCWJvLT5iYXNlLnB0ciA9IG1hcDsKKwliby0+bWFwX2NvdW50Kys7CisJKm91dCA9IGJvLT5iYXNlLnB0cjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkdW1iX2JvX3VubWFwKHN0cnVjdCBrbXNfYm8gKl9ibykKK3sKKwlzdHJ1Y3QgZHVtYl9ibyAqYm8gPSAoc3RydWN0IGR1bWJfYm8gKilfYm87CisJYm8tPm1hcF9jb3VudC0tOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkdW1iX2JvX2Rlc3Ryb3koc3RydWN0IGttc19ibyAqX2JvKQoreworCXN0cnVjdCBkdW1iX2JvICpibyA9IChzdHJ1Y3QgZHVtYl9ibyAqKV9ibzsKKwlzdHJ1Y3QgZHJtX21vZGVfZGVzdHJveV9kdW1iIGFyZzsKKwlpbnQgcmV0OworCisJaWYgKGJvLT5iYXNlLnB0cikgeworCQkvKiBYWFggU2FuaXR5IGNoZWNrIG1hcF9jb3VudCAqLworCQlkcm1fbXVubWFwKGJvLT5iYXNlLnB0ciwgYm8tPmJhc2Uuc2l6ZSk7CisJCWJvLT5iYXNlLnB0ciA9IE5VTEw7CisJfQorCisJbWVtc2V0KCZhcmcsIDAsIHNpemVvZihhcmcpKTsKKwlhcmcuaGFuZGxlID0gYm8tPmJhc2UuaGFuZGxlOworCisJcmV0ID0gZHJtSW9jdGwoYm8tPmJhc2Uua21zLT5mZCwgRFJNX0lPQ1RMX01PREVfREVTVFJPWV9EVU1CLCAmYXJnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLWVycm5vOworCisJZnJlZShibyk7CisJcmV0dXJuIDA7Cit9CisKK2RybV9wcml2YXRlIGludAorZHVtYl9jcmVhdGUoaW50IGZkLCBzdHJ1Y3Qga21zX2RyaXZlciAqKm91dCkKK3sKKwlzdHJ1Y3Qga21zX2RyaXZlciAqa21zOworCWludCByZXQ7CisJdWludDY0X3QgY2FwID0gMDsKKworCXJldCA9IGRybUdldENhcChmZCwgRFJNX0NBUF9EVU1CX0JVRkZFUiwgJmNhcCk7CisJaWYgKHJldCB8fCBjYXAgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlrbXMgPSBjYWxsb2MoMSwgc2l6ZW9mKCprbXMpKTsKKwlpZiAoIWttcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlrbXMtPmZkID0gZmQ7CisKKwlrbXMtPmJvX2NyZWF0ZSA9IGR1bWJfYm9fY3JlYXRlOworCWttcy0+Ym9fbWFwID0gZHVtYl9ib19tYXA7CisJa21zLT5ib191bm1hcCA9IGR1bWJfYm9fdW5tYXA7CisJa21zLT5ib19nZXRfcHJvcCA9IGR1bWJfYm9fZ2V0X3Byb3A7CisJa21zLT5ib19kZXN0cm95ID0gZHVtYl9ib19kZXN0cm95OworCWttcy0+Z2V0X3Byb3AgPSBkdW1iX2dldF9wcm9wOworCWttcy0+ZGVzdHJveSA9IGR1bWJfZGVzdHJveTsKKwkqb3V0ID0ga21zOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJrbXMvZXh5bm9zLmMgYi9saWJrbXMvZXh5bm9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5N2ZiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmttcy9leHlub3MuYwpAQCAtMCwwICsxLDIxMCBAQAorLyogZXh5bm9zLmMKKyAqCisgKiBDb3B5cmlnaHQgMjAwOSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogQXV0aG9yczoKKyAqCVNvb0NoYW4gTGltIDxzYzEubGltQHNhbXN1bmcuY29tPgorICogICAgICBTYW5namluIExFRSA8bHNqMTE5QHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgInhmODZkcm0uaCIKKworI2luY2x1ZGUgImxpYmRybV9tYWNyb3MuaCIKKyNpbmNsdWRlICJleHlub3NfZHJtLmgiCisKK3N0cnVjdCBleHlub3NfYm8KK3sKKwlzdHJ1Y3Qga21zX2JvIGJhc2U7CisJdW5zaWduZWQgbWFwX2NvdW50OworfTsKKworc3RhdGljIGludAorZXh5bm9zX2dldF9wcm9wKHN0cnVjdCBrbXNfZHJpdmVyICprbXMsIHVuc2lnbmVkIGtleSwgdW5zaWduZWQgKm91dCkKK3sKKwlzd2l0Y2ggKGtleSkgeworCWNhc2UgS01TX0JPX1RZUEU6CisJCSpvdXQgPSBLTVNfQk9fVFlQRV9TQ0FOT1VUX1g4UjhHOEI4IHwgS01TX0JPX1RZUEVfQ1VSU09SXzY0WDY0X0E4UjhHOEI4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2V4eW5vc19kZXN0cm95KHN0cnVjdCBrbXNfZHJpdmVyICprbXMpCit7CisJZnJlZShrbXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitleHlub3NfYm9fY3JlYXRlKHN0cnVjdCBrbXNfZHJpdmVyICprbXMsCisJCSBjb25zdCB1bnNpZ25lZCB3aWR0aCwgY29uc3QgdW5zaWduZWQgaGVpZ2h0LAorCQkgY29uc3QgZW51bSBrbXNfYm9fdHlwZSB0eXBlLCBjb25zdCB1bnNpZ25lZCAqYXR0ciwKKwkJIHN0cnVjdCBrbXNfYm8gKipvdXQpCit7CisJc3RydWN0IGRybV9leHlub3NfZ2VtX2NyZWF0ZSBhcmc7CisJdW5zaWduZWQgc2l6ZSwgcGl0Y2g7CisJc3RydWN0IGV4eW5vc19ibyAqYm87CisJaW50IGksIHJldDsKKworCWZvciAoaSA9IDA7IGF0dHJbaV07IGkgKz0gMikgeworCQlzd2l0Y2ggKGF0dHJbaV0pIHsKKwkJY2FzZSBLTVNfV0lEVEg6CisJCWNhc2UgS01TX0hFSUdIVDoKKwkJY2FzZSBLTVNfQk9fVFlQRToKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlibyA9IGNhbGxvYygxLCBzaXplb2YoKmJvKSk7CisJaWYgKCFibykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAodHlwZSA9PSBLTVNfQk9fVFlQRV9DVVJTT1JfNjRYNjRfQThSOEc4QjgpIHsKKwkJcGl0Y2ggPSA2NCAqIDQ7CisJCXNpemUgPSA2NCAqIDY0ICogNDsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gS01TX0JPX1RZUEVfU0NBTk9VVF9YOFI4RzhCOCkgeworCQlwaXRjaCA9IHdpZHRoICogNDsKKwkJcGl0Y2ggPSAocGl0Y2ggKyA1MTIgLSAxKSAmIH4oNTEyIC0gMSk7CisJCXNpemUgPSBwaXRjaCAqICgoaGVpZ2h0ICsgNCAtIDEpICYgfig0IC0gMSkpOworCX0gZWxzZSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJbWVtc2V0KCZhcmcsIDAsIHNpemVvZihhcmcpKTsKKwlhcmcuc2l6ZSA9IHNpemU7CisKKwlyZXQgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGttcy0+ZmQsIERSTV9FWFlOT1NfR0VNX0NSRUFURSwgJmFyZywgc2l6ZW9mKGFyZykpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2ZyZWU7CisKKwliby0+YmFzZS5rbXMgPSBrbXM7CisJYm8tPmJhc2UuaGFuZGxlID0gYXJnLmhhbmRsZTsKKwliby0+YmFzZS5zaXplID0gc2l6ZTsKKwliby0+YmFzZS5waXRjaCA9IHBpdGNoOworCisJKm91dCA9ICZiby0+YmFzZTsKKworCXJldHVybiAwOworCitlcnJfZnJlZToKKwlmcmVlKGJvKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitleHlub3NfYm9fZ2V0X3Byb3Aoc3RydWN0IGttc19ibyAqYm8sIHVuc2lnbmVkIGtleSwgdW5zaWduZWQgKm91dCkKK3sKKwlzd2l0Y2ggKGtleSkgeworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludAorZXh5bm9zX2JvX21hcChzdHJ1Y3Qga21zX2JvICpfYm8sIHZvaWQgKipvdXQpCit7CisJc3RydWN0IGV4eW5vc19ibyAqYm8gPSAoc3RydWN0IGV4eW5vc19ibyAqKV9ibzsKKwlzdHJ1Y3QgZHJtX21vZGVfbWFwX2R1bWIgYXJnOworCXZvaWQgKm1hcCA9IE5VTEw7CisJaW50IHJldDsKKworCWlmIChiby0+YmFzZS5wdHIpIHsKKwkJYm8tPm1hcF9jb3VudCsrOworCQkqb3V0ID0gYm8tPmJhc2UucHRyOworCQlyZXR1cm4gMDsKKwl9CisKKwltZW1zZXQoJmFyZywgMCwgc2l6ZW9mKGFyZykpOworCWFyZy5oYW5kbGUgPSBiby0+YmFzZS5oYW5kbGU7CisKKwlyZXQgPSBkcm1Jb2N0bChiby0+YmFzZS5rbXMtPmZkLCBEUk1fSU9DVExfTU9ERV9NQVBfRFVNQiwgJmFyZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW1hcCA9IGRybV9tbWFwKDAsIGJvLT5iYXNlLnNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGJvLT5iYXNlLmttcy0+ZmQsIGFyZy5vZmZzZXQpOworCWlmIChtYXAgPT0gTUFQX0ZBSUxFRCkKKwkJcmV0dXJuIC1lcnJubzsKKworCWJvLT5iYXNlLnB0ciA9IG1hcDsKKwliby0+bWFwX2NvdW50Kys7CisJKm91dCA9IGJvLT5iYXNlLnB0cjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitleHlub3NfYm9fdW5tYXAoc3RydWN0IGttc19ibyAqX2JvKQoreworCXN0cnVjdCBleHlub3NfYm8gKmJvID0gKHN0cnVjdCBleHlub3NfYm8gKilfYm87CisJYm8tPm1hcF9jb3VudC0tOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitleHlub3NfYm9fZGVzdHJveShzdHJ1Y3Qga21zX2JvICpfYm8pCit7CisJc3RydWN0IGV4eW5vc19ibyAqYm8gPSAoc3RydWN0IGV4eW5vc19ibyAqKV9ibzsKKwlzdHJ1Y3QgZHJtX2dlbV9jbG9zZSBhcmc7CisJaW50IHJldDsKKworCWlmIChiby0+YmFzZS5wdHIpIHsKKwkJLyogWFhYIFNhbml0eSBjaGVjayBtYXBfY291bnQgKi8KKwkJbXVubWFwKGJvLT5iYXNlLnB0ciwgYm8tPmJhc2Uuc2l6ZSk7CisJCWJvLT5iYXNlLnB0ciA9IE5VTEw7CisJfQorCisJbWVtc2V0KCZhcmcsIDAsIHNpemVvZihhcmcpKTsKKwlhcmcuaGFuZGxlID0gYm8tPmJhc2UuaGFuZGxlOworCisJcmV0ID0gZHJtSW9jdGwoYm8tPmJhc2Uua21zLT5mZCwgRFJNX0lPQ1RMX0dFTV9DTE9TRSwgJmFyZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1lcnJubzsKKworCWZyZWUoYm8pOworCXJldHVybiAwOworfQorCitkcm1fcHJpdmF0ZSBpbnQKK2V4eW5vc19jcmVhdGUoaW50IGZkLCBzdHJ1Y3Qga21zX2RyaXZlciAqKm91dCkKK3sKKwlzdHJ1Y3Qga21zX2RyaXZlciAqa21zOworCisJa21zID0gY2FsbG9jKDEsIHNpemVvZigqa21zKSk7CisJaWYgKCFrbXMpCisJCXJldHVybiAtRU5PTUVNOworCisJa21zLT5mZCA9IGZkOworCisJa21zLT5ib19jcmVhdGUgPSBleHlub3NfYm9fY3JlYXRlOworCWttcy0+Ym9fbWFwID0gZXh5bm9zX2JvX21hcDsKKwlrbXMtPmJvX3VubWFwID0gZXh5bm9zX2JvX3VubWFwOworCWttcy0+Ym9fZ2V0X3Byb3AgPSBleHlub3NfYm9fZ2V0X3Byb3A7CisJa21zLT5ib19kZXN0cm95ID0gZXh5bm9zX2JvX2Rlc3Ryb3k7CisJa21zLT5nZXRfcHJvcCA9IGV4eW5vc19nZXRfcHJvcDsKKwlrbXMtPmRlc3Ryb3kgPSBleHlub3NfZGVzdHJveTsKKwkqb3V0ID0ga21zOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJrbXMvaW50ZWwuYyBiL2xpYmttcy9pbnRlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOGNhMDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJrbXMvaW50ZWwuYwpAQCAtMCwwICsxLDI0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDkgVk13YXJlLCBJbmMuLCBQYWxvIEFsdG8sIENBLiwgVVNBCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlICJ4Zjg2ZHJtLmgiCisjaW5jbHVkZSAibGliZHJtX21hY3Jvcy5oIgorCisjaW5jbHVkZSAiaTkxNV9kcm0uaCIKKworc3RydWN0IGludGVsX2JvCit7CisJc3RydWN0IGttc19ibyBiYXNlOworCXVuc2lnbmVkIG1hcF9jb3VudDsKK307CisKK3N0YXRpYyBpbnQKK2ludGVsX2dldF9wcm9wKHN0cnVjdCBrbXNfZHJpdmVyICprbXMsIHVuc2lnbmVkIGtleSwgdW5zaWduZWQgKm91dCkKK3sKKwlzd2l0Y2ggKGtleSkgeworCWNhc2UgS01TX0JPX1RZUEU6CisJCSpvdXQgPSBLTVNfQk9fVFlQRV9TQ0FOT1VUX1g4UjhHOEI4IHwgS01TX0JPX1RZUEVfQ1VSU09SXzY0WDY0X0E4UjhHOEI4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2ludGVsX2Rlc3Ryb3koc3RydWN0IGttc19kcml2ZXIgKmttcykKK3sKKwlmcmVlKGttcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2ludGVsX2JvX2NyZWF0ZShzdHJ1Y3Qga21zX2RyaXZlciAqa21zLAorCQkgY29uc3QgdW5zaWduZWQgd2lkdGgsIGNvbnN0IHVuc2lnbmVkIGhlaWdodCwKKwkJIGNvbnN0IGVudW0ga21zX2JvX3R5cGUgdHlwZSwgY29uc3QgdW5zaWduZWQgKmF0dHIsCisJCSBzdHJ1Y3Qga21zX2JvICoqb3V0KQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fY3JlYXRlIGFyZzsKKwl1bnNpZ25lZCBzaXplLCBwaXRjaDsKKwlzdHJ1Y3QgaW50ZWxfYm8gKmJvOworCWludCBpLCByZXQ7CisKKwlmb3IgKGkgPSAwOyBhdHRyW2ldOyBpICs9IDIpIHsKKwkJc3dpdGNoIChhdHRyW2ldKSB7CisJCWNhc2UgS01TX1dJRFRIOgorCQljYXNlIEtNU19IRUlHSFQ6CisJCWNhc2UgS01TX0JPX1RZUEU6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJYm8gPSBjYWxsb2MoMSwgc2l6ZW9mKCpibykpOworCWlmICghYm8pCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKHR5cGUgPT0gS01TX0JPX1RZUEVfQ1VSU09SXzY0WDY0X0E4UjhHOEI4KSB7CisJCXBpdGNoID0gNjQgKiA0OworCQlzaXplID0gNjQgKiA2NCAqIDQ7CisJfSBlbHNlIGlmICh0eXBlID09IEtNU19CT19UWVBFX1NDQU5PVVRfWDhSOEc4QjgpIHsKKwkJcGl0Y2ggPSB3aWR0aCAqIDQ7CisJCXBpdGNoID0gKHBpdGNoICsgNTEyIC0gMSkgJiB+KDUxMiAtIDEpOworCQlzaXplID0gcGl0Y2ggKiAoKGhlaWdodCArIDQgLSAxKSAmIH4oNCAtIDEpKTsKKwl9IGVsc2UgeworCQlmcmVlKGJvKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtc2V0KCZhcmcsIDAsIHNpemVvZihhcmcpKTsKKwlhcmcuc2l6ZSA9IHNpemU7CisKKwlyZXQgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGttcy0+ZmQsIERSTV9JOTE1X0dFTV9DUkVBVEUsICZhcmcsIHNpemVvZihhcmcpKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlOworCisJYm8tPmJhc2Uua21zID0ga21zOworCWJvLT5iYXNlLmhhbmRsZSA9IGFyZy5oYW5kbGU7CisJYm8tPmJhc2Uuc2l6ZSA9IHNpemU7CisJYm8tPmJhc2UucGl0Y2ggPSBwaXRjaDsKKworCSpvdXQgPSAmYm8tPmJhc2U7CisJaWYgKHR5cGUgPT0gS01TX0JPX1RZUEVfU0NBTk9VVF9YOFI4RzhCOCAmJiBwaXRjaCA+IDUxMikgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3NldF90aWxpbmcgdGlsZTsKKworCQltZW1zZXQoJnRpbGUsIDAsIHNpemVvZih0aWxlKSk7CisJCXRpbGUuaGFuZGxlID0gYm8tPmJhc2UuaGFuZGxlOworCQl0aWxlLnRpbGluZ19tb2RlID0gSTkxNV9USUxJTkdfWDsKKwkJdGlsZS5zdHJpZGUgPSBiby0+YmFzZS5waXRjaDsKKworCQlyZXQgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGttcy0+ZmQsIERSTV9JOTE1X0dFTV9TRVRfVElMSU5HLCAmdGlsZSwgc2l6ZW9mKHRpbGUpKTsKKyNpZiAwCisJCWlmIChyZXQpIHsKKwkJCWttc19ib19kZXN0cm95KG91dCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWU6CisJZnJlZShibyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAoraW50ZWxfYm9fZ2V0X3Byb3Aoc3RydWN0IGttc19ibyAqYm8sIHVuc2lnbmVkIGtleSwgdW5zaWduZWQgKm91dCkKK3sKKwlzd2l0Y2ggKGtleSkgeworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludAoraW50ZWxfYm9fbWFwKHN0cnVjdCBrbXNfYm8gKl9ibywgdm9pZCAqKm91dCkKK3sKKwlzdHJ1Y3QgaW50ZWxfYm8gKmJvID0gKHN0cnVjdCBpbnRlbF9ibyAqKV9ibzsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXBfZ3R0IGFyZzsKKwl2b2lkICptYXAgPSBOVUxMOworCWludCByZXQ7CisKKwlpZiAoYm8tPmJhc2UucHRyKSB7CisJCWJvLT5tYXBfY291bnQrKzsKKwkJKm91dCA9IGJvLT5iYXNlLnB0cjsKKwkJcmV0dXJuIDA7CisJfQorCisJbWVtc2V0KCZhcmcsIDAsIHNpemVvZihhcmcpKTsKKwlhcmcuaGFuZGxlID0gYm8tPmJhc2UuaGFuZGxlOworCisJcmV0ID0gZHJtQ29tbWFuZFdyaXRlUmVhZChiby0+YmFzZS5rbXMtPmZkLCBEUk1fSTkxNV9HRU1fTU1BUF9HVFQsICZhcmcsIHNpemVvZihhcmcpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbWFwID0gZHJtX21tYXAoMCwgYm8tPmJhc2Uuc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgYm8tPmJhc2Uua21zLT5mZCwgYXJnLm9mZnNldCk7CisJaWYgKG1hcCA9PSBNQVBfRkFJTEVEKQorCQlyZXR1cm4gLWVycm5vOworCisJYm8tPmJhc2UucHRyID0gbWFwOworCWJvLT5tYXBfY291bnQrKzsKKwkqb3V0ID0gYm8tPmJhc2UucHRyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2ludGVsX2JvX3VubWFwKHN0cnVjdCBrbXNfYm8gKl9ibykKK3sKKwlzdHJ1Y3QgaW50ZWxfYm8gKmJvID0gKHN0cnVjdCBpbnRlbF9ibyAqKV9ibzsKKwliby0+bWFwX2NvdW50LS07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2ludGVsX2JvX2Rlc3Ryb3koc3RydWN0IGttc19ibyAqX2JvKQoreworCXN0cnVjdCBpbnRlbF9ibyAqYm8gPSAoc3RydWN0IGludGVsX2JvICopX2JvOworCXN0cnVjdCBkcm1fZ2VtX2Nsb3NlIGFyZzsKKwlpbnQgcmV0OworCisJaWYgKGJvLT5iYXNlLnB0cikgeworCQkvKiBYWFggU2FuaXR5IGNoZWNrIG1hcF9jb3VudCAqLworCQlkcm1fbXVubWFwKGJvLT5iYXNlLnB0ciwgYm8tPmJhc2Uuc2l6ZSk7CisJCWJvLT5iYXNlLnB0ciA9IE5VTEw7CisJfQorCisJbWVtc2V0KCZhcmcsIDAsIHNpemVvZihhcmcpKTsKKwlhcmcuaGFuZGxlID0gYm8tPmJhc2UuaGFuZGxlOworCisJcmV0ID0gZHJtSW9jdGwoYm8tPmJhc2Uua21zLT5mZCwgRFJNX0lPQ1RMX0dFTV9DTE9TRSwgJmFyZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1lcnJubzsKKworCWZyZWUoYm8pOworCXJldHVybiAwOworfQorCitkcm1fcHJpdmF0ZSBpbnQKK2ludGVsX2NyZWF0ZShpbnQgZmQsIHN0cnVjdCBrbXNfZHJpdmVyICoqb3V0KQoreworCXN0cnVjdCBrbXNfZHJpdmVyICprbXM7CisKKwlrbXMgPSBjYWxsb2MoMSwgc2l6ZW9mKCprbXMpKTsKKwlpZiAoIWttcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlrbXMtPmZkID0gZmQ7CisKKwlrbXMtPmJvX2NyZWF0ZSA9IGludGVsX2JvX2NyZWF0ZTsKKwlrbXMtPmJvX21hcCA9IGludGVsX2JvX21hcDsKKwlrbXMtPmJvX3VubWFwID0gaW50ZWxfYm9fdW5tYXA7CisJa21zLT5ib19nZXRfcHJvcCA9IGludGVsX2JvX2dldF9wcm9wOworCWttcy0+Ym9fZGVzdHJveSA9IGludGVsX2JvX2Rlc3Ryb3k7CisJa21zLT5nZXRfcHJvcCA9IGludGVsX2dldF9wcm9wOworCWttcy0+ZGVzdHJveSA9IGludGVsX2Rlc3Ryb3k7CisJKm91dCA9IGttczsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlia21zL2ludGVybmFsLmggYi9saWJrbXMvaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDVmNWIxCi0tLSAvZGV2L251bGwKKysrIGIvbGlia21zL2ludGVybmFsLmgKQEAgLTAsMCArMSw4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDkgVk13YXJlLCBJbmMuLCBQYWxvIEFsdG8sIENBLiwgVVNBCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBJTlRFUk5BTF9IXworI2RlZmluZSBJTlRFUk5BTF9IXworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkcm1fbWFjcm9zLmgiCisjaW5jbHVkZSAibGlia21zLmgiCisKK3N0cnVjdCBrbXNfZHJpdmVyCit7CisJaW50ICgqZ2V0X3Byb3ApKHN0cnVjdCBrbXNfZHJpdmVyICprbXMsIGNvbnN0IHVuc2lnbmVkIGtleSwKKwkJCXVuc2lnbmVkICpvdXQpOworCWludCAoKmRlc3Ryb3kpKHN0cnVjdCBrbXNfZHJpdmVyICprbXMpOworCisJaW50ICgqYm9fY3JlYXRlKShzdHJ1Y3Qga21zX2RyaXZlciAqa21zLAorCQkJIHVuc2lnbmVkIHdpZHRoLAorCQkJIHVuc2lnbmVkIGhlaWdodCwKKwkJCSBlbnVtIGttc19ib190eXBlIHR5cGUsCisJCQkgY29uc3QgdW5zaWduZWQgKmF0dHIsCisJCQkgc3RydWN0IGttc19ibyAqKm91dCk7CisJaW50ICgqYm9fZ2V0X3Byb3ApKHN0cnVjdCBrbXNfYm8gKmJvLCBjb25zdCB1bnNpZ25lZCBrZXksCisJCQkgICB1bnNpZ25lZCAqb3V0KTsKKwlpbnQgKCpib19tYXApKHN0cnVjdCBrbXNfYm8gKmJvLCB2b2lkICoqb3V0KTsKKwlpbnQgKCpib191bm1hcCkoc3RydWN0IGttc19ibyAqYm8pOworCWludCAoKmJvX2Rlc3Ryb3kpKHN0cnVjdCBrbXNfYm8gKmJvKTsKKworCWludCBmZDsKK307CisKK3N0cnVjdCBrbXNfYm8KK3sKKwlzdHJ1Y3Qga21zX2RyaXZlciAqa21zOworCXZvaWQgKnB0cjsKKwlzaXplX3Qgc2l6ZTsKKwlzaXplX3Qgb2Zmc2V0OworCXNpemVfdCBwaXRjaDsKKwl1bnNpZ25lZCBoYW5kbGU7Cit9OworCitkcm1fcHJpdmF0ZSBpbnQgbGludXhfY3JlYXRlKGludCBmZCwgc3RydWN0IGttc19kcml2ZXIgKipvdXQpOworCitkcm1fcHJpdmF0ZSBpbnQgdm13Z2Z4X2NyZWF0ZShpbnQgZmQsIHN0cnVjdCBrbXNfZHJpdmVyICoqb3V0KTsKKworZHJtX3ByaXZhdGUgaW50IGludGVsX2NyZWF0ZShpbnQgZmQsIHN0cnVjdCBrbXNfZHJpdmVyICoqb3V0KTsKKworZHJtX3ByaXZhdGUgaW50IGR1bWJfY3JlYXRlKGludCBmZCwgc3RydWN0IGttc19kcml2ZXIgKipvdXQpOworCitkcm1fcHJpdmF0ZSBpbnQgbm91dmVhdV9jcmVhdGUoaW50IGZkLCBzdHJ1Y3Qga21zX2RyaXZlciAqKm91dCk7CisKK2RybV9wcml2YXRlIGludCByYWRlb25fY3JlYXRlKGludCBmZCwgc3RydWN0IGttc19kcml2ZXIgKipvdXQpOworCitkcm1fcHJpdmF0ZSBpbnQgZXh5bm9zX2NyZWF0ZShpbnQgZmQsIHN0cnVjdCBrbXNfZHJpdmVyICoqb3V0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJrbXMva21zLXN5bWJvbC1jaGVjayBiL2xpYmttcy9rbXMtc3ltYm9sLWNoZWNrCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY1OGIyNjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJrbXMva21zLXN5bWJvbC1jaGVjawpAQCAtMCwwICsxLDI1IEBACisjIS9iaW4vYmFzaAorCisjIFRoZSBmb2xsb3dpbmcgc3ltYm9scyAocGFzdCB0aGUgZmlyc3QgZml2ZSkgYXJlIHRha2VuIGZyb20gdGhlIHB1YmxpYyBoZWFkZXJzLgorIyBBIGxpc3Qgb2YgdGhlIGxhdHRlciBzaG91bGQgYmUgYXZhaWxhYmxlIE1ha2VmaWxlLnNvdXJjZXMvTElCS01TX0hfRklMRVMKKworRlVOQ1M9JChubSAtRCAtLWZvcm1hdD1ic2QgLS1kZWZpbmVkLW9ubHkgJHsxLS5saWJzL2xpYmttcy5zb30gfCBhd2sgJ3twcmludCAkM30nfCB3aGlsZSByZWFkIGZ1bmM7IGRvCisoIGdyZXAgLXEgIl4kZnVuYyQiIHx8IGVjaG8gJGZ1bmMgKSAgPDxFT0YKK19fYnNzX3N0YXJ0CitfZWRhdGEKK19lbmQKK19maW5pCitfaW5pdAora21zX2JvX2NyZWF0ZQora21zX2JvX2Rlc3Ryb3kKK2ttc19ib19nZXRfcHJvcAora21zX2JvX21hcAora21zX2JvX3VubWFwCitrbXNfY3JlYXRlCitrbXNfZGVzdHJveQora21zX2dldF9wcm9wCitFT0YKK2RvbmUpCisKK3Rlc3QgISAtbiAiJEZVTkNTIiB8fCBlY2hvICRGVU5DUwordGVzdCAhIC1uICIkRlVOQ1MiCmRpZmYgLS1naXQgYS9saWJrbXMvbGlia21zLmggYi9saWJrbXMvbGlia21zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMwYTJiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmttcy9saWJrbXMuaApAQCAtMCwwICsxLDgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwOSBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9MSUJLTVNfSF8KKyNkZWZpbmUgX0xJQktNU19IXworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogXGZpbGUKKyAqCisgKi8KKworc3RydWN0IGttc19kcml2ZXI7CitzdHJ1Y3Qga21zX2JvOworCitlbnVtIGttc19hdHRyaWIKK3sKKwlLTVNfVEVSTUlOQVRFX1BST1BfTElTVCwKKyNkZWZpbmUgS01TX1RFUk1JTkFURV9QUk9QX0xJU1QgS01TX1RFUk1JTkFURV9QUk9QX0xJU1QKKwlLTVNfQk9fVFlQRSwKKyNkZWZpbmUgS01TX0JPX1RZUEUgS01TX0JPX1RZUEUKKwlLTVNfV0lEVEgsCisjZGVmaW5lIEtNU19XSURUSCBLTVNfV0lEVEgKKwlLTVNfSEVJR0hULAorI2RlZmluZSBLTVNfSEVJR0hUIEtNU19IRUlHSFQKKwlLTVNfUElUQ0gsCisjZGVmaW5lIEtNU19QSVRDSCBLTVNfUElUQ0gKKwlLTVNfSEFORExFLAorI2RlZmluZSBLTVNfSEFORExFIEtNU19IQU5ETEUKK307CisKK2VudW0ga21zX2JvX3R5cGUKK3sKKwlLTVNfQk9fVFlQRV9TQ0FOT1VUX1g4UjhHOEI4ID0gKDEgPDwgMCksCisjZGVmaW5lIEtNU19CT19UWVBFX1NDQU5PVVRfWDhSOEc4QjggS01TX0JPX1RZUEVfU0NBTk9VVF9YOFI4RzhCOAorCUtNU19CT19UWVBFX0NVUlNPUl82NFg2NF9BOFI4RzhCOCA9ICAoMSA8PCAxKSwKKyNkZWZpbmUgS01TX0JPX1RZUEVfQ1VSU09SXzY0WDY0X0E4UjhHOEI4IEtNU19CT19UWVBFX0NVUlNPUl82NFg2NF9BOFI4RzhCOAorfTsKKworaW50IGttc19jcmVhdGUoaW50IGZkLCBzdHJ1Y3Qga21zX2RyaXZlciAqKm91dCk7CitpbnQga21zX2dldF9wcm9wKHN0cnVjdCBrbXNfZHJpdmVyICprbXMsIHVuc2lnbmVkIGtleSwgdW5zaWduZWQgKm91dCk7CitpbnQga21zX2Rlc3Ryb3koc3RydWN0IGttc19kcml2ZXIgKiprbXMpOworCitpbnQga21zX2JvX2NyZWF0ZShzdHJ1Y3Qga21zX2RyaXZlciAqa21zLCBjb25zdCB1bnNpZ25lZCAqYXR0ciwgc3RydWN0IGttc19ibyAqKm91dCk7CitpbnQga21zX2JvX2dldF9wcm9wKHN0cnVjdCBrbXNfYm8gKmJvLCB1bnNpZ25lZCBrZXksIHVuc2lnbmVkICpvdXQpOworaW50IGttc19ib19tYXAoc3RydWN0IGttc19ibyAqYm8sIHZvaWQgKipvdXQpOworaW50IGttc19ib191bm1hcChzdHJ1Y3Qga21zX2JvICpibyk7CitpbnQga21zX2JvX2Rlc3Ryb3koc3RydWN0IGttc19ibyAqKmJvKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9OworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlia21zL2xpYmttcy5wYy5pbiBiL2xpYmttcy9saWJrbXMucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQyMWIzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmttcy9saWJrbXMucGMuaW4KQEAgLTAsMCArMSwxMSBAQAorcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJACisKK05hbWU6IGxpYmttcworRGVzY3JpcHRpb246IExpYnJhcnkgdGhhdCBhYnN0cmFjdCBhd2F5cyB0aGUgZGlmZmVyZW50IG1tIGludGVyZmFjZSBmb3Iga2VybmVsIGRyaXZlcnMKK1ZlcnNpb246IDEuMC4wCitMaWJzOiAtTCR7bGliZGlyfSAtbGttcworQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0vbGlia21zCitSZXF1aXJlcy5wcml2YXRlOiBsaWJkcm0KZGlmZiAtLWdpdCBhL2xpYmttcy9saW51eC5jIGIvbGlia21zL2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1MDc3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmttcy9saW51eC5jCkBAIC0wLDAgKzEsMTUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwOSBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGFua3MgdG8ga3JoIGFuZCBqY3Jpc3RhdSBmb3IgdGhlIHRpcHMgb24KKyAqIGdvaW5nIGZyb20gZmQgdG8gcGNpIGlkIHZpYSBmc3RhdCBhbmQgdWRldi4KKyAqLworCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8eGY4NmRybS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgTUFKT1JfSU5fTUtERVYKKyNpbmNsdWRlIDxzeXMvbWtkZXYuaD4KKyNlbmRpZgorI2lmZGVmIE1BSk9SX0lOX1NZU01BQ1JPUworI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGliZHJtX21hY3Jvcy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgUEFUSF9TSVpFIDUxMgorCitzdGF0aWMgaW50CitsaW51eF9uYW1lX2Zyb21fc3lzZnMoaW50IGZkLCBjaGFyICoqb3V0KQoreworCWNoYXIgcGF0aFtQQVRIX1NJWkUrMV0gPSAiIjsgLyogaW5pdGlhbGl6ZSB0byBwbGVhc2UgdmFsZ3JpbmQgKi8KKwljaGFyIGxpbmtbUEFUSF9TSVpFKzFdID0gIiI7CisJc3RydWN0IHN0YXQgYnVmZmVyOworCXVuc2lnbmVkIG1haiwgbWluOworCWNoYXIqIHNsYXNoX25hbWU7CisJaW50IHJldDsKKworCS8qIAorCSAqIEluc2lkZSB0aGUgc3lzZnMgZGlyZWN0b3J5IGZvciB0aGUgZGV2aWNlIHRoZXJlIGlzIGEgc3ltbGluaworCSAqIHRvIHRoZSBkaXJlY3RvcnkgcmVwcmVzZW50aW5nIHRoZSBkcml2ZXIgbW9kdWxlLCB0aGF0IHBhdGgKKwkgKiBoYXBwZW5zIHRvIGhvbGQgdGhlIG5hbWUgb2YgdGhlIGRyaXZlci4KKwkgKgorCSAqIFNvIGxldHMgZ2V0IHRoZSBzeW1saW5rIGZvciB0aGUgZHJtIGRldmljZS4gVGhlbiByZWFkIHRoZSBsaW5rCisJICogYW5kIGZpbHRlciBvdXQgdGhlIGxhc3QgZGlyZWN0b3J5IHdoaWNoIGhhcHBlbnMgdG8gYmUgdGhlIG5hbWUKKwkgKiBvZiB0aGUgZHJpdmVyLCB3aGljaCB3ZSBjYW4gdXNlIHRvIGxvYWQgdGhlIGNvcnJlY3QgaW50ZXJmYWNlLgorCSAqCisJICogVGhhbmtzIHRvIFJheSBTdHJvZGUgb2YgUGx5bW91dGggZm9yIHRoZSBjb2RlLgorCSAqLworCisJcmV0ID0gZnN0YXQoZmQsICZidWZmZXIpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFTX0lTQ0hSKGJ1ZmZlci5zdF9tb2RlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltYWogPSBtYWpvcihidWZmZXIuc3RfcmRldik7CisJbWluID0gbWlub3IoYnVmZmVyLnN0X3JkZXYpOworCisJc25wcmludGYocGF0aCwgUEFUSF9TSVpFLCAiL3N5cy9kZXYvY2hhci8lZDolZC9kZXZpY2UvZHJpdmVyIiwgbWFqLCBtaW4pOworCisJaWYgKHJlYWRsaW5rKHBhdGgsIGxpbmssIFBBVEhfU0laRSkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGxpbmsgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpczogLi4vLi4vLi4vYnVzL3BjaS9kcml2ZXJzL2ludGVsICovCisJc2xhc2hfbmFtZSA9IHN0cnJjaHIobGluaywgJy8nKTsKKwlpZiAoIXNsYXNoX25hbWUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogY29weSBuYW1lIGFuZCBhdCB0aGUgc2FtZSB0aW1lIHJlbW92ZSB0aGUgc2xhc2ggKi8KKwkqb3V0ID0gc3RyZHVwKHNsYXNoX25hbWUgKyAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbGludXhfZnJvbV9zeXNmcyhpbnQgZmQsIHN0cnVjdCBrbXNfZHJpdmVyICoqb3V0KQoreworCWNoYXIgKm5hbWU7CisJaW50IHJldDsKKworCXJldCA9IGxpbnV4X25hbWVfZnJvbV9zeXNmcyhmZCwgJm5hbWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKyNpZmRlZiBIQVZFX0lOVEVMCisJaWYgKCFzdHJjbXAobmFtZSwgImludGVsIikpCisJCXJldCA9IGludGVsX2NyZWF0ZShmZCwgb3V0KTsKKwllbHNlCisjZW5kaWYKKyNpZmRlZiBIQVZFX1ZNV0dGWAorCWlmICghc3RyY21wKG5hbWUsICJ2bXdnZngiKSkKKwkJcmV0ID0gdm13Z2Z4X2NyZWF0ZShmZCwgb3V0KTsKKwllbHNlCisjZW5kaWYKKyNpZmRlZiBIQVZFX05PVVZFQVUKKwlpZiAoIXN0cmNtcChuYW1lLCAibm91dmVhdSIpKQorCQlyZXQgPSBub3V2ZWF1X2NyZWF0ZShmZCwgb3V0KTsKKwllbHNlCisjZW5kaWYKKyNpZmRlZiBIQVZFX1JBREVPTgorCWlmICghc3RyY21wKG5hbWUsICJyYWRlb24iKSkKKwkJcmV0ID0gcmFkZW9uX2NyZWF0ZShmZCwgb3V0KTsKKwllbHNlCisjZW5kaWYKKyNpZmRlZiBIQVZFX0VYWU5PUworCWlmICghc3RyY21wKG5hbWUsICJleHlub3MiKSkKKwkJcmV0ID0gZXh5bm9zX2NyZWF0ZShmZCwgb3V0KTsKKwllbHNlCisjZW5kaWYKKwkJcmV0ID0gLUVOT1NZUzsKKworCWZyZWUobmFtZSk7CisJcmV0dXJuIHJldDsKK30KKworZHJtX3ByaXZhdGUgaW50CitsaW51eF9jcmVhdGUoaW50IGZkLCBzdHJ1Y3Qga21zX2RyaXZlciAqKm91dCkKK3sKKwlpZiAoIWR1bWJfY3JlYXRlKGZkLCBvdXQpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBsaW51eF9mcm9tX3N5c2ZzKGZkLCBvdXQpOworfQpkaWZmIC0tZ2l0IGEvbGlia21zL25vdXZlYXUuYyBiL2xpYmttcy9ub3V2ZWF1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwZTBmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmttcy9ub3V2ZWF1LmMKQEAgLTAsMCArMSwyMjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCDCqSAyMDA5IFZNd2FyZSwgSW5jLiwgUGFsbyBBbHRvLCBDQS4sIFVTQQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSAieGY4NmRybS5oIgorI2luY2x1ZGUgImxpYmRybV9tYWNyb3MuaCIKKworI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCisKK3N0cnVjdCBub3V2ZWF1X2JvCit7CisJc3RydWN0IGttc19ibyBiYXNlOworCXVpbnQ2NF90IG1hcF9oYW5kbGU7CisJdW5zaWduZWQgbWFwX2NvdW50OworfTsKKworc3RhdGljIGludAorbm91dmVhdV9nZXRfcHJvcChzdHJ1Y3Qga21zX2RyaXZlciAqa21zLCB1bnNpZ25lZCBrZXksIHVuc2lnbmVkICpvdXQpCit7CisJc3dpdGNoIChrZXkpIHsKKwljYXNlIEtNU19CT19UWVBFOgorCQkqb3V0ID0gS01TX0JPX1RZUEVfU0NBTk9VVF9YOFI4RzhCOCB8IEtNU19CT19UWVBFX0NVUlNPUl82NFg2NF9BOFI4RzhCODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X2Rlc3Ryb3koc3RydWN0IGttc19kcml2ZXIgKmttcykKK3sKKwlmcmVlKGttcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfYm9fY3JlYXRlKHN0cnVjdCBrbXNfZHJpdmVyICprbXMsCisJCSBjb25zdCB1bnNpZ25lZCB3aWR0aCwgY29uc3QgdW5zaWduZWQgaGVpZ2h0LAorCQkgY29uc3QgZW51bSBrbXNfYm9fdHlwZSB0eXBlLCBjb25zdCB1bnNpZ25lZCAqYXR0ciwKKwkJIHN0cnVjdCBrbXNfYm8gKipvdXQpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9uZXcgYXJnOworCXVuc2lnbmVkIHNpemUsIHBpdGNoOworCXN0cnVjdCBub3V2ZWF1X2JvICpibzsKKwlpbnQgaSwgcmV0OworCisJZm9yIChpID0gMDsgYXR0cltpXTsgaSArPSAyKSB7CisJCXN3aXRjaCAoYXR0cltpXSkgeworCQljYXNlIEtNU19XSURUSDoKKwkJY2FzZSBLTVNfSEVJR0hUOgorCQljYXNlIEtNU19CT19UWVBFOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWJvID0gY2FsbG9jKDEsIHNpemVvZigqYm8pKTsKKwlpZiAoIWJvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICh0eXBlID09IEtNU19CT19UWVBFX0NVUlNPUl82NFg2NF9BOFI4RzhCOCkgeworCQlwaXRjaCA9IDY0ICogNDsKKwkJc2l6ZSA9IDY0ICogNjQgKiA0OworCX0gZWxzZSBpZiAodHlwZSA9PSBLTVNfQk9fVFlQRV9TQ0FOT1VUX1g4UjhHOEI4KSB7CisJCXBpdGNoID0gd2lkdGggKiA0OworCQlwaXRjaCA9IChwaXRjaCArIDUxMiAtIDEpICYgfig1MTIgLSAxKTsKKwkJc2l6ZSA9IHBpdGNoICogaGVpZ2h0OworCX0gZWxzZSB7CisJCWZyZWUoYm8pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltZW1zZXQoJmFyZywgMCwgc2l6ZW9mKGFyZykpOworCWFyZy5pbmZvLnNpemUgPSBzaXplOworCWFyZy5pbmZvLmRvbWFpbiA9IE5PVVZFQVVfR0VNX0RPTUFJTl9NQVBQQUJMRSB8IE5PVVZFQVVfR0VNX0RPTUFJTl9WUkFNOworCWFyZy5pbmZvLnRpbGVfbW9kZSA9IDA7CisJYXJnLmluZm8udGlsZV9mbGFncyA9IDA7CisJYXJnLmFsaWduID0gNTEyOworCWFyZy5jaGFubmVsX2hpbnQgPSAwOworCisJcmV0ID0gZHJtQ29tbWFuZFdyaXRlUmVhZChrbXMtPmZkLCBEUk1fTk9VVkVBVV9HRU1fTkVXLCAmYXJnLCBzaXplb2YoYXJnKSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZnJlZTsKKworCWJvLT5iYXNlLmttcyA9IGttczsKKwliby0+YmFzZS5oYW5kbGUgPSBhcmcuaW5mby5oYW5kbGU7CisJYm8tPmJhc2Uuc2l6ZSA9IHNpemU7CisJYm8tPmJhc2UucGl0Y2ggPSBwaXRjaDsKKwliby0+bWFwX2hhbmRsZSA9IGFyZy5pbmZvLm1hcF9oYW5kbGU7CisKKwkqb3V0ID0gJmJvLT5iYXNlOworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlOgorCWZyZWUoYm8pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfYm9fZ2V0X3Byb3Aoc3RydWN0IGttc19ibyAqYm8sIHVuc2lnbmVkIGtleSwgdW5zaWduZWQgKm91dCkKK3sKKwlzd2l0Y2ggKGtleSkgeworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludAorbm91dmVhdV9ib19tYXAoc3RydWN0IGttc19ibyAqX2JvLCB2b2lkICoqb3V0KQoreworCXN0cnVjdCBub3V2ZWF1X2JvICpibyA9IChzdHJ1Y3Qgbm91dmVhdV9ibyAqKV9ibzsKKwl2b2lkICptYXAgPSBOVUxMOworCisJaWYgKGJvLT5iYXNlLnB0cikgeworCQliby0+bWFwX2NvdW50Kys7CisJCSpvdXQgPSBiby0+YmFzZS5wdHI7CisJCXJldHVybiAwOworCX0KKworCW1hcCA9IGRybV9tbWFwKDAsIGJvLT5iYXNlLnNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGJvLT5iYXNlLmttcy0+ZmQsIGJvLT5tYXBfaGFuZGxlKTsKKwlpZiAobWFwID09IE1BUF9GQUlMRUQpCisJCXJldHVybiAtZXJybm87CisKKwliby0+YmFzZS5wdHIgPSBtYXA7CisJYm8tPm1hcF9jb3VudCsrOworCSpvdXQgPSBiby0+YmFzZS5wdHI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbm91dmVhdV9ib191bm1hcChzdHJ1Y3Qga21zX2JvICpfYm8pCit7CisJc3RydWN0IG5vdXZlYXVfYm8gKmJvID0gKHN0cnVjdCBub3V2ZWF1X2JvICopX2JvOworCWJvLT5tYXBfY291bnQtLTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbm91dmVhdV9ib19kZXN0cm95KHN0cnVjdCBrbXNfYm8gKl9ibykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqYm8gPSAoc3RydWN0IG5vdXZlYXVfYm8gKilfYm87CisJc3RydWN0IGRybV9nZW1fY2xvc2UgYXJnOworCWludCByZXQ7CisKKwlpZiAoYm8tPmJhc2UucHRyKSB7CisJCS8qIFhYWCBTYW5pdHkgY2hlY2sgbWFwX2NvdW50ICovCisJCWRybV9tdW5tYXAoYm8tPmJhc2UucHRyLCBiby0+YmFzZS5zaXplKTsKKwkJYm8tPmJhc2UucHRyID0gTlVMTDsKKwl9CisKKwltZW1zZXQoJmFyZywgMCwgc2l6ZW9mKGFyZykpOworCWFyZy5oYW5kbGUgPSBiby0+YmFzZS5oYW5kbGU7CisKKwlyZXQgPSBkcm1Jb2N0bChiby0+YmFzZS5rbXMtPmZkLCBEUk1fSU9DVExfR0VNX0NMT1NFLCAmYXJnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLWVycm5vOworCisJZnJlZShibyk7CisJcmV0dXJuIDA7Cit9CisKK2RybV9wcml2YXRlIGludAorbm91dmVhdV9jcmVhdGUoaW50IGZkLCBzdHJ1Y3Qga21zX2RyaXZlciAqKm91dCkKK3sKKwlzdHJ1Y3Qga21zX2RyaXZlciAqa21zOworCisJa21zID0gY2FsbG9jKDEsIHNpemVvZigqa21zKSk7CisJaWYgKCFrbXMpCisJCXJldHVybiAtRU5PTUVNOworCisJa21zLT5mZCA9IGZkOworCisJa21zLT5ib19jcmVhdGUgPSBub3V2ZWF1X2JvX2NyZWF0ZTsKKwlrbXMtPmJvX21hcCA9IG5vdXZlYXVfYm9fbWFwOworCWttcy0+Ym9fdW5tYXAgPSBub3V2ZWF1X2JvX3VubWFwOworCWttcy0+Ym9fZ2V0X3Byb3AgPSBub3V2ZWF1X2JvX2dldF9wcm9wOworCWttcy0+Ym9fZGVzdHJveSA9IG5vdXZlYXVfYm9fZGVzdHJveTsKKwlrbXMtPmdldF9wcm9wID0gbm91dmVhdV9nZXRfcHJvcDsKKwlrbXMtPmRlc3Ryb3kgPSBub3V2ZWF1X2Rlc3Ryb3k7CisJKm91dCA9IGttczsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlia21zL3JhZGVvbi5jIGIvbGlia21zL3JhZGVvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZWVhZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJrbXMvcmFkZW9uLmMKQEAgLTAsMCArMSwyNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCDCqSAyMDA5IFZNd2FyZSwgSW5jLiwgUGFsbyBBbHRvLCBDQS4sIFVTQQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSAieGY4NmRybS5oIgorI2luY2x1ZGUgImxpYmRybV9tYWNyb3MuaCIKKworI2luY2x1ZGUgInJhZGVvbl9kcm0uaCIKKworCisjZGVmaW5lIEFMSUdOTUVOVCA1MTIKKworc3RydWN0IHJhZGVvbl9ibworeworCXN0cnVjdCBrbXNfYm8gYmFzZTsKKwl1bnNpZ25lZCBtYXBfY291bnQ7Cit9OworCitzdGF0aWMgaW50CityYWRlb25fZ2V0X3Byb3Aoc3RydWN0IGttc19kcml2ZXIgKmttcywgdW5zaWduZWQga2V5LCB1bnNpZ25lZCAqb3V0KQoreworCXN3aXRjaCAoa2V5KSB7CisJY2FzZSBLTVNfQk9fVFlQRToKKwkJKm91dCA9IEtNU19CT19UWVBFX1NDQU5PVVRfWDhSOEc4QjggfCBLTVNfQk9fVFlQRV9DVVJTT1JfNjRYNjRfQThSOEc4Qjg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcmFkZW9uX2Rlc3Ryb3koc3RydWN0IGttc19kcml2ZXIgKmttcykKK3sKKwlmcmVlKGttcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3JhZGVvbl9ib19jcmVhdGUoc3RydWN0IGttc19kcml2ZXIgKmttcywKKwkJIGNvbnN0IHVuc2lnbmVkIHdpZHRoLCBjb25zdCB1bnNpZ25lZCBoZWlnaHQsCisJCSBjb25zdCBlbnVtIGttc19ib190eXBlIHR5cGUsIGNvbnN0IHVuc2lnbmVkICphdHRyLAorCQkgc3RydWN0IGttc19ibyAqKm91dCkKK3sKKwlzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fY3JlYXRlIGFyZzsKKwl1bnNpZ25lZCBzaXplLCBwaXRjaDsKKwlzdHJ1Y3QgcmFkZW9uX2JvICpibzsKKwlpbnQgaSwgcmV0OworCisJZm9yIChpID0gMDsgYXR0cltpXTsgaSArPSAyKSB7CisJCXN3aXRjaCAoYXR0cltpXSkgeworCQljYXNlIEtNU19XSURUSDoKKwkJY2FzZSBLTVNfSEVJR0hUOgorCQljYXNlIEtNU19CT19UWVBFOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgS01TX0JPX1RZUEVfQ1VSU09SXzY0WDY0X0E4UjhHOEI4OgorCQlwaXRjaCA9IDQgKiA2NDsKKwkJc2l6ZSAgPSA0ICogNjQgKiA2NDsKKwkJYnJlYWs7CisJY2FzZSBLTVNfQk9fVFlQRV9TQ0FOT1VUX1g4UjhHOEI4OgorCQlwaXRjaCA9IHdpZHRoICogNDsKKwkJcGl0Y2ggPSAocGl0Y2ggKyBBTElHTk1FTlQgLSAxKSAmIH4oQUxJR05NRU5UIC0gMSk7CisJCXNpemUgID0gcGl0Y2ggKiBoZWlnaHQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJvID0gY2FsbG9jKDEsIHNpemVvZigqYm8pKTsKKwlpZiAoIWJvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldCgmYXJnLCAwLCBzaXplb2YoYXJnKSk7CisJYXJnLnNpemUgPSBzaXplOworCWFyZy5hbGlnbm1lbnQgPSBBTElHTk1FTlQ7CisJYXJnLmluaXRpYWxfZG9tYWluID0gUkFERU9OX0dFTV9ET01BSU5fQ1BVOworCWFyZy5mbGFncyA9IDA7CisJYXJnLmhhbmRsZSA9IDA7CisKKwlyZXQgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGttcy0+ZmQsIERSTV9SQURFT05fR0VNX0NSRUFURSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmcsIHNpemVvZihhcmcpKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlOworCisJYm8tPmJhc2Uua21zID0ga21zOworCWJvLT5iYXNlLmhhbmRsZSA9IGFyZy5oYW5kbGU7CisJYm8tPmJhc2Uuc2l6ZSA9IHNpemU7CisJYm8tPmJhc2UucGl0Y2ggPSBwaXRjaDsKKwliby0+YmFzZS5vZmZzZXQgPSAwOworCWJvLT5tYXBfY291bnQgPSAwOworCisJKm91dCA9ICZiby0+YmFzZTsKKworCXJldHVybiAwOworCitlcnJfZnJlZToKKwlmcmVlKGJvKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CityYWRlb25fYm9fZ2V0X3Byb3Aoc3RydWN0IGttc19ibyAqYm8sIHVuc2lnbmVkIGtleSwgdW5zaWduZWQgKm91dCkKK3sKKwlzd2l0Y2ggKGtleSkgeworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludAorcmFkZW9uX2JvX21hcChzdHJ1Y3Qga21zX2JvICpfYm8sIHZvaWQgKipvdXQpCit7CisJc3RydWN0IHJhZGVvbl9ibyAqYm8gPSAoc3RydWN0IHJhZGVvbl9ibyAqKV9ibzsKKwlzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fbW1hcCBhcmc7CisJdm9pZCAqbWFwID0gTlVMTDsKKwlpbnQgcmV0OworCisJaWYgKGJvLT5iYXNlLnB0cikgeworCQliby0+bWFwX2NvdW50Kys7CisJCSpvdXQgPSBiby0+YmFzZS5wdHI7CisJCXJldHVybiAwOworCX0KKworCW1lbXNldCgmYXJnLCAwLCBzaXplb2YoYXJnKSk7CisJYXJnLmhhbmRsZSA9IGJvLT5iYXNlLmhhbmRsZTsKKwlhcmcub2Zmc2V0ID0gYm8tPmJhc2Uub2Zmc2V0OworCWFyZy5zaXplID0gKHVpbnQ2NF90KWJvLT5iYXNlLnNpemU7CisKKwlyZXQgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGJvLT5iYXNlLmttcy0+ZmQsIERSTV9SQURFT05fR0VNX01NQVAsCisJICAgICAgICAgICAgICAgICAgICAgICAgJmFyZywgc2l6ZW9mKGFyZykpOworCWlmIChyZXQpCisJCXJldHVybiAtZXJybm87CisKKwltYXAgPSBkcm1fbW1hcCgwLCBhcmcuc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwKKwkgICAgICAgICAgIGJvLT5iYXNlLmttcy0+ZmQsIGFyZy5hZGRyX3B0cik7CisJaWYgKG1hcCA9PSBNQVBfRkFJTEVEKQorCQlyZXR1cm4gLWVycm5vOworCisJYm8tPmJhc2UucHRyID0gbWFwOworCWJvLT5tYXBfY291bnQrKzsKKwkqb3V0ID0gYm8tPmJhc2UucHRyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3JhZGVvbl9ib191bm1hcChzdHJ1Y3Qga21zX2JvICpfYm8pCit7CisJc3RydWN0IHJhZGVvbl9ibyAqYm8gPSAoc3RydWN0IHJhZGVvbl9ibyAqKV9ibzsKKwlpZiAoLS1iby0+bWFwX2NvdW50ID09IDApIHsKKwkJZHJtX211bm1hcChiby0+YmFzZS5wdHIsIGJvLT5iYXNlLnNpemUpOworCQliby0+YmFzZS5wdHIgPSBOVUxMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcmFkZW9uX2JvX2Rlc3Ryb3koc3RydWN0IGttc19ibyAqX2JvKQoreworCXN0cnVjdCByYWRlb25fYm8gKmJvID0gKHN0cnVjdCByYWRlb25fYm8gKilfYm87CisJc3RydWN0IGRybV9nZW1fY2xvc2UgYXJnOworCWludCByZXQ7CisKKwlpZiAoYm8tPmJhc2UucHRyKSB7CisJCS8qIFhYWCBTYW5pdHkgY2hlY2sgbWFwX2NvdW50ICovCisJCWRybV9tdW5tYXAoYm8tPmJhc2UucHRyLCBiby0+YmFzZS5zaXplKTsKKwkJYm8tPmJhc2UucHRyID0gTlVMTDsKKwl9CisKKwltZW1zZXQoJmFyZywgMCwgc2l6ZW9mKGFyZykpOworCWFyZy5oYW5kbGUgPSBiby0+YmFzZS5oYW5kbGU7CisKKwlyZXQgPSBkcm1Jb2N0bChiby0+YmFzZS5rbXMtPmZkLCBEUk1fSU9DVExfR0VNX0NMT1NFLCAmYXJnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLWVycm5vOworCisJZnJlZShibyk7CisJcmV0dXJuIDA7Cit9CisKK2RybV9wcml2YXRlIGludAorcmFkZW9uX2NyZWF0ZShpbnQgZmQsIHN0cnVjdCBrbXNfZHJpdmVyICoqb3V0KQoreworCXN0cnVjdCBrbXNfZHJpdmVyICprbXM7CisKKwlrbXMgPSBjYWxsb2MoMSwgc2l6ZW9mKCprbXMpKTsKKwlpZiAoIWttcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlrbXMtPmZkID0gZmQ7CisKKwlrbXMtPmJvX2NyZWF0ZSA9IHJhZGVvbl9ib19jcmVhdGU7CisJa21zLT5ib19tYXAgPSByYWRlb25fYm9fbWFwOworCWttcy0+Ym9fdW5tYXAgPSByYWRlb25fYm9fdW5tYXA7CisJa21zLT5ib19nZXRfcHJvcCA9IHJhZGVvbl9ib19nZXRfcHJvcDsKKwlrbXMtPmJvX2Rlc3Ryb3kgPSByYWRlb25fYm9fZGVzdHJveTsKKwlrbXMtPmdldF9wcm9wID0gcmFkZW9uX2dldF9wcm9wOworCWttcy0+ZGVzdHJveSA9IHJhZGVvbl9kZXN0cm95OworCSpvdXQgPSBrbXM7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmttcy92bXdnZnguYyBiL2xpYmttcy92bXdnZnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTI0ZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlia21zL3Ztd2dmeC5jCkBAIC0wLDAgKzEsMjA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwOSBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNpbmNsdWRlICJ4Zjg2ZHJtLmgiCisjaW5jbHVkZSAibGliZHJtX21hY3Jvcy5oIgorI2luY2x1ZGUgInZtd2dmeF9kcm0uaCIKKworc3RydWN0IHZtd2dmeF9ibworeworCXN0cnVjdCBrbXNfYm8gYmFzZTsKKwl1aW50NjRfdCBtYXBfaGFuZGxlOworCXVuc2lnbmVkIG1hcF9jb3VudDsKK307CisKK3N0YXRpYyBpbnQKK3Ztd2dmeF9nZXRfcHJvcChzdHJ1Y3Qga21zX2RyaXZlciAqa21zLCB1bnNpZ25lZCBrZXksIHVuc2lnbmVkICpvdXQpCit7CisJc3dpdGNoIChrZXkpIHsKKwljYXNlIEtNU19CT19UWVBFOgorCQkqb3V0ID0gS01TX0JPX1RZUEVfU0NBTk9VVF9YOFI4RzhCOCB8IEtNU19CT19UWVBFX0NVUlNPUl82NFg2NF9BOFI4RzhCODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit2bXdnZnhfZGVzdHJveShzdHJ1Y3Qga21zX2RyaXZlciAqa21zKQoreworCWZyZWUoa21zKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordm13Z2Z4X2JvX2NyZWF0ZShzdHJ1Y3Qga21zX2RyaXZlciAqa21zLAorCQkgY29uc3QgdW5zaWduZWQgd2lkdGgsIGNvbnN0IHVuc2lnbmVkIGhlaWdodCwKKwkJIGNvbnN0IGVudW0ga21zX2JvX3R5cGUgdHlwZSwgY29uc3QgdW5zaWduZWQgKmF0dHIsCisJCSBzdHJ1Y3Qga21zX2JvICoqb3V0KQoreworCXN0cnVjdCB2bXdnZnhfYm8gKmJvOworCWludCBpLCByZXQ7CisKKwlmb3IgKGkgPSAwOyBhdHRyW2ldOyBpICs9IDIpIHsKKwkJc3dpdGNoIChhdHRyW2ldKSB7CisJCWNhc2UgS01TX1dJRFRIOgorCQljYXNlIEtNU19IRUlHSFQ6CisJCWNhc2UgS01TX0JPX1RZUEU6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJYm8gPSBjYWxsb2MoMSwgc2l6ZW9mKCpibykpOworCWlmICghYm8pCisJCXJldHVybiAtRUlOVkFMOworCisJeworCQl1bmlvbiBkcm1fdm13X2FsbG9jX2RtYWJ1Zl9hcmcgYXJnOworCQlzdHJ1Y3QgZHJtX3Ztd19hbGxvY19kbWFidWZfcmVxICpyZXEgPSAmYXJnLnJlcTsKKwkJc3RydWN0IGRybV92bXdfZG1hYnVmX3JlcCAqcmVwID0gJmFyZy5yZXA7CisKKwkJbWVtc2V0KCZhcmcsIDAsIHNpemVvZihhcmcpKTsKKwkJcmVxLT5zaXplID0gd2lkdGggKiBoZWlnaHQgKiA0OworCQliby0+YmFzZS5zaXplID0gcmVxLT5zaXplOworCQliby0+YmFzZS5waXRjaCA9IHdpZHRoICogNDsKKwkJYm8tPmJhc2Uua21zID0ga21zOworCisJCWRvIHsKKwkJCXJldCA9IGRybUNvbW1hbmRXcml0ZVJlYWQoYm8tPmJhc2Uua21zLT5mZCwKKwkJCQkJCSAgRFJNX1ZNV19BTExPQ19ETUFCVUYsCisJCQkJCQkgICZhcmcsIHNpemVvZihhcmcpKTsKKwkJfSB3aGlsZSAocmV0ID09IC1FUkVTVEFSVCk7CisKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2ZyZWU7CisKKwkJYm8tPmJhc2UuaGFuZGxlID0gcmVwLT5oYW5kbGU7CisJCWJvLT5tYXBfaGFuZGxlID0gcmVwLT5tYXBfaGFuZGxlOworCQliby0+YmFzZS5oYW5kbGUgPSByZXAtPmN1cl9nbXJfaWQ7CisJCWJvLT5iYXNlLm9mZnNldCA9IHJlcC0+Y3VyX2dtcl9vZmZzZXQ7CisJfQorCisJKm91dCA9ICZiby0+YmFzZTsKKworCXJldHVybiAwOworCitlcnJfZnJlZToKKwlmcmVlKGJvKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Cit2bXdnZnhfYm9fZ2V0X3Byb3Aoc3RydWN0IGttc19ibyAqYm8sIHVuc2lnbmVkIGtleSwgdW5zaWduZWQgKm91dCkKK3sKKwlzd2l0Y2ggKGtleSkgeworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludAordm13Z2Z4X2JvX21hcChzdHJ1Y3Qga21zX2JvICpfYm8sIHZvaWQgKipvdXQpCit7CisJc3RydWN0IHZtd2dmeF9ibyAqYm8gPSAoc3RydWN0IHZtd2dmeF9ibyAqKV9ibzsKKwl2b2lkICptYXA7CisKKwlpZiAoYm8tPmJhc2UucHRyKSB7CisJCWJvLT5tYXBfY291bnQrKzsKKwkJKm91dCA9IGJvLT5iYXNlLnB0cjsKKwkJcmV0dXJuIDA7CisJfQorCisJbWFwID0gZHJtX21tYXAoTlVMTCwgYm8tPmJhc2Uuc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgYm8tPmJhc2Uua21zLT5mZCwgYm8tPm1hcF9oYW5kbGUpOworCWlmIChtYXAgPT0gTUFQX0ZBSUxFRCkKKwkJcmV0dXJuIC1lcnJubzsKKworCWJvLT5iYXNlLnB0ciA9IG1hcDsKKwliby0+bWFwX2NvdW50Kys7CisJKm91dCA9IGJvLT5iYXNlLnB0cjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit2bXdnZnhfYm9fdW5tYXAoc3RydWN0IGttc19ibyAqX2JvKQoreworCXN0cnVjdCB2bXdnZnhfYm8gKmJvID0gKHN0cnVjdCB2bXdnZnhfYm8gKilfYm87CisJYm8tPm1hcF9jb3VudC0tOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit2bXdnZnhfYm9fZGVzdHJveShzdHJ1Y3Qga21zX2JvICpfYm8pCit7CisJc3RydWN0IHZtd2dmeF9ibyAqYm8gPSAoc3RydWN0IHZtd2dmeF9ibyAqKV9ibzsKKwlzdHJ1Y3QgZHJtX3Ztd191bnJlZl9kbWFidWZfYXJnIGFyZzsKKworCWlmIChiby0+YmFzZS5wdHIpIHsKKwkJLyogWFhYIFNhbml0eSBjaGVjayBtYXBfY291bnQgKi8KKwkJZHJtX211bm1hcChiby0+YmFzZS5wdHIsIGJvLT5iYXNlLnNpemUpOworCQliby0+YmFzZS5wdHIgPSBOVUxMOworCX0KKworCW1lbXNldCgmYXJnLCAwLCBzaXplb2YoYXJnKSk7CisJYXJnLmhhbmRsZSA9IGJvLT5iYXNlLmhhbmRsZTsKKwlkcm1Db21tYW5kV3JpdGUoYm8tPmJhc2Uua21zLT5mZCwgRFJNX1ZNV19VTlJFRl9ETUFCVUYsICZhcmcsIHNpemVvZihhcmcpKTsKKworCWZyZWUoYm8pOworCXJldHVybiAwOworfQorCitkcm1fcHJpdmF0ZSBpbnQKK3Ztd2dmeF9jcmVhdGUoaW50IGZkLCBzdHJ1Y3Qga21zX2RyaXZlciAqKm91dCkKK3sKKwlzdHJ1Y3Qga21zX2RyaXZlciAqa21zOworCisJa21zID0gY2FsbG9jKDEsIHNpemVvZigqa21zKSk7CisJaWYgKCFrbXMpCisJCXJldHVybiAtRU5PTUVNOworCisJa21zLT5mZCA9IGZkOworCisJa21zLT5ib19jcmVhdGUgPSB2bXdnZnhfYm9fY3JlYXRlOworCWttcy0+Ym9fbWFwID0gdm13Z2Z4X2JvX21hcDsKKwlrbXMtPmJvX3VubWFwID0gdm13Z2Z4X2JvX3VubWFwOworCWttcy0+Ym9fZ2V0X3Byb3AgPSB2bXdnZnhfYm9fZ2V0X3Byb3A7CisJa21zLT5ib19kZXN0cm95ID0gdm13Z2Z4X2JvX2Rlc3Ryb3k7CisJa21zLT5nZXRfcHJvcCA9IHZtd2dmeF9nZXRfcHJvcDsKKwlrbXMtPmRlc3Ryb3kgPSB2bXdnZnhfZGVzdHJveTsKKwkqb3V0ID0ga21zOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlic3luYy5oIGIvbGlic3luYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYTJmOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzeW5jLmgKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiAgc3luYyBhYnN0cmFjdGlvbgorICogIENvcHlyaWdodCAyMDE1LTIwMTYgQ29sbGFib3JhIEx0ZC4KKyAqCisgKiAgQmFzZWQgb24gdGhlIGltcGxlbWVudGF0aW9uIGZyb20gdGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCwKKyAqCisgKiAgQ29weXJpZ2h0IDIwMTIgR29vZ2xlLCBJbmMKKyAqCisgKiAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqICBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqICB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqICBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqICBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiAgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqICBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqICBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfTElCU1lOQ19ICisjZGVmaW5lIF9MSUJTWU5DX0gKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZuZGVmIFNZTkNfSU9DX01FUkdFCisvKiBkdXBsaWNhdGVkIGZyb20gbGludXgvc3luY19maWxlLmggdG8gYXZvaWQgYnVpbGQtdGltZSBkZXBlbmRlbmN5CisgKiBvbiBuZXcgKHY0LjcpIGtlcm5lbCBoZWFkZXJzLiAgT25jZSBkaXN0cm8ncyBhcmUgbW9zdGx5IHVzaW5nCisgKiBzb21ldGhpbmcgbmV3ZXIgdGhhbiB2NC43IGRyb3AgdGhpcyBhbmQgI2luY2x1ZGUgPGxpbnV4L3N5bmNfZmlsZS5oPgorICogaW5zdGVhZC4KKyAqLworc3RydWN0IHN5bmNfbWVyZ2VfZGF0YSB7CisJY2hhcgluYW1lWzMyXTsKKwlpbnQzMl90CWZkMjsKKwlpbnQzMl90CWZlbmNlOworCXVpbnQzMl90CWZsYWdzOworCXVpbnQzMl90CXBhZDsKK307CisjZGVmaW5lIFNZTkNfSU9DX01BR0lDCQknPicKKyNkZWZpbmUgU1lOQ19JT0NfTUVSR0UJCV9JT1dSKFNZTkNfSU9DX01BR0lDLCAzLCBzdHJ1Y3Qgc3luY19tZXJnZV9kYXRhKQorI2VuZGlmCisKKworc3RhdGljIGlubGluZSBpbnQgc3luY193YWl0KGludCBmZCwgaW50IHRpbWVvdXQpCit7CisJc3RydWN0IHBvbGxmZCBmZHMgPSB7MH07CisJaW50IHJldDsKKworCWZkcy5mZCA9IGZkOworCWZkcy5ldmVudHMgPSBQT0xMSU47CisKKwlkbyB7CisJCXJldCA9IHBvbGwoJmZkcywgMSwgdGltZW91dCk7CisJCWlmIChyZXQgPiAwKSB7CisJCQlpZiAoZmRzLnJldmVudHMgJiAoUE9MTEVSUiB8IFBPTExOVkFMKSkgeworCQkJCWVycm5vID0gRUlOVkFMOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisJCQllcnJubyA9IEVUSU1FOworCQkJcmV0dXJuIC0xOworCQl9CisJfSB3aGlsZSAocmV0ID09IC0xICYmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQUdBSU4pKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHN5bmNfbWVyZ2UoY29uc3QgY2hhciAqbmFtZSwgaW50IGZkMSwgaW50IGZkMikKK3sKKwlzdHJ1Y3Qgc3luY19tZXJnZV9kYXRhIGRhdGEgPSB7MH07CisJaW50IHJldDsKKworCWRhdGEuZmQyID0gZmQyOworCXN0cm5jcHkoZGF0YS5uYW1lLCBuYW1lLCBzaXplb2YoZGF0YS5uYW1lKSk7CisKKwlkbyB7CisJCXJldCA9IGlvY3RsKGZkMSwgU1lOQ19JT0NfTUVSR0UsICZkYXRhKTsKKwl9IHdoaWxlIChyZXQgPT0gLTEgJiYgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTikpOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gZGF0YS5mZW5jZTsKK30KKworLyogYWNjdW11bGF0ZSBmZDIgaW50byBmZDEuICBJZiAqZmQxIGlzIG5vdCBhIHZhbGlkIGZkIHRoZW4gZHVwIGZkMiwKKyAqIG90aGVyd2lzZSBzeW5jX21lcmdlKCkgYW5kIGNsb3NlIHRoZSBvbGQgKmZkMS4gIFRoaXMgY2FuIGJlIHVzZWQKKyAqIHRvIGltcGxlbWVudCB0aGUgcGF0dGVybjoKKyAqCisgKiAgICBpbml0KCkKKyAqICAgIHsKKyAqICAgICAgIGJhdGNoLmZlbmNlX2ZkID0gLTE7CisgKiAgICB9CisgKgorICogICAgLy8gZG9lcyAqTk9UKiB0YWtlIG93bmVyc2hpcCBvZiBmZAorICogICAgc2VydmVyX3N5bmMoaW50IGZkKQorICogICAgeworICogICAgICAgaWYgKHN5bmNfYWNjdW11bGF0ZSgiZm9vIiwgJmJhdGNoLmZlbmNlX2ZkLCBmZCkpIHsKKyAqICAgICAgICAgIC4uLiBlcnJvciAuLi4KKyAqICAgICAgIH0KKyAqICAgIH0KKyAqLworc3RhdGljIGlubGluZSBpbnQgc3luY19hY2N1bXVsYXRlKGNvbnN0IGNoYXIgKm5hbWUsIGludCAqZmQxLCBpbnQgZmQyKQoreworCWludCByZXQ7CisKKwlhc3NlcnQoZmQyID49IDApOworCisJaWYgKCpmZDEgPCAwKSB7CisJCSpmZDEgPSBkdXAoZmQyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gc3luY19tZXJnZShuYW1lLCAqZmQxLCBmZDIpOworCWlmIChyZXQgPCAwKSB7CisJCS8qIGxlYXZlICpmZDEgYXMgaXQgaXMgKi8KKwkJcmV0dXJuIHJldDsKKwl9CisKKwljbG9zZSgqZmQxKTsKKwkqZmQxID0gcmV0OworCisJcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbTQvLmdpdGlnbm9yZSBiL200Ly5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY0YmE1YwotLS0gL2Rldi9udWxsCisrKyBiL200Ly5naXRpZ25vcmUKQEAgLTAsMCArMSw1IEBACitsaWJ0b29sLm00CitsdH5vYnNvbGV0ZS5tNAorbHRvcHRpb25zLm00CitsdHN1Z2FyLm00CitsdHZlcnNpb24ubTQKZGlmZiAtLWdpdCBhL21hbi9NYWtlZmlsZS5hbSBiL21hbi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGViNDIzCi0tLSAvZGV2L251bGwKKysrIGIvbWFuL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNjIgQEAKKyMKKyMgVGhpcyBnZW5lcmF0ZXMgbWFuLXBhZ2VzIG91dCBvZiB0aGUgRG9jYm9vayBYTUwgZmlsZXMuIFNpbXBseSBhZGQgeW91ciBmaWxlcworIyB0byB0aGUgcmVsZXZhbnQgKm1hbl9QUkUgYXJyYXkuIElmIGFsaWFzZXMgYXJlIGNyZWF0ZWQsIHBsZWFzZSBhZGQgdGhlbSB0byB0aGUKKyMgKm1hbl9hbGlhc2VzX1BSRSBhcnJheSBzbyB0aGV5IGdldCBpbnN0YWxsZWQgY29ycmVjdGx5LgorIworCitsaWJtYW5fUFJFID0gXAorCWRybUF2YWlsYWJsZS54bWwgXAorCWRybUhhbmRsZUV2ZW50LnhtbCBcCisJZHJtTW9kZUdldFJlc291cmNlcy54bWwKKworbWlzY21hbl9QUkUgPSBcCisJZHJtLnhtbCBcCisJZHJtLWttcy54bWwgXAorCWRybS1tZW1vcnkueG1sCisKK21pc2NtYW5fYWxpYXNlc19QUkUgPSBcCisJZHJtLW1tLnhtbCBcCisJZHJtLWdlbS54bWwgXAorCWRybS10dG0ueG1sCisKK2xpYm1hbmRpciA9ICQoTElCX01BTl9ESVIpCittaXNjbWFuZGlyID0gJChNSVNDX01BTl9ESVIpCittaXNjbWFuX2FsaWFzZXNkaXIgPSAkKE1JU0NfTUFOX0RJUikKKworbGlibWFuX0RBVEEgPSAkKGxpYm1hbl9QUkU6LnhtbD0uJChMSUJfTUFOX1NVRkZJWCkpCittaXNjbWFuX0RBVEEgPSAkKG1pc2NtYW5fUFJFOi54bWw9LiQoTUlTQ19NQU5fU1VGRklYKSkKK21pc2NtYW5fYWxpYXNlc19EQVRBID0gJChtaXNjbWFuX2FsaWFzZXNfUFJFOi54bWw9LiQoTUlTQ19NQU5fU1VGRklYKSkKKworWE1MX0ZJTEVTID0gXAorCSQobGlibWFuX1BSRSkgXAorCSQobWlzY21hbl9QUkUpCisKK01BTl9GSUxFUyA9IFwKKwkkKGxpYm1hbl9EQVRBKSBcCisJJChtaXNjbWFuX0RBVEEpIFwKKwkkKG1pc2NtYW5fYWxpYXNlc19EQVRBKQorCitFWFRSQV9ESVNUID0gJChYTUxfRklMRVMpCitDTEVBTkZJTEVTID0gJChNQU5fRklMRVMpCisKK1hTTFRQUk9DX0ZMQUdTID0gXAorCS0tc3RyaW5ncGFyYW0gbWFuLmF1dGhvcnMuc2VjdGlvbi5lbmFibGVkIDAgXAorCS0tc3RyaW5ncGFyYW0gbWFuLmNvcHlyaWdodC5zZWN0aW9uLmVuYWJsZWQgMCBcCisJLS1zdHJpbmdwYXJhbSBmdW5jc3lub3BzaXMuc3R5bGUgYW5zaSBcCisJLS1zdHJpbmdwYXJhbSBtYW4ub3V0cHV0LnF1aWV0bHkgMSBcCisJLS1ub25ldCBcCisJJChNQU5QQUdFU19TVFlMRVNIRUVUKQorCitYU0xUUFJPQ19QUk9DRVNTX01BTiA9IFwKKwkkKEFNX1ZfR0VOKSQoWFNMVFBST0MpIC1vICIkQCIgJChYU0xUUFJPQ19GTEFHUykgIiQ8IgorCiskKG1pc2NtYW5fYWxpYXNlc19EQVRBKTogJChtaXNjbWFuX0RBVEEpCisJJChBTV9WX0dFTilpZiB0ZXN0IC1uICIkQCIgOyB0aGVuICQoU0VEKSAtaSAtZSAncy9eXC5zbyBcKFthLXpfXVwrXClcLlwoWzAtOV1cKSQkL1wuc28gbWFuXDJcL1wxXC5cMi8nICIkQCIgOyBmaQorCitTVUZGSVhFUyA9IC4kKExJQl9NQU5fU1VGRklYKSAuJChNSVNDX01BTl9TVUZGSVgpIC54bWwKKworLnhtbC4kKExJQl9NQU5fU1VGRklYKToKKwkkKFhTTFRQUk9DX1BST0NFU1NfTUFOKQorCisueG1sLiQoTUlTQ19NQU5fU1VGRklYKToKKwkkKFhTTFRQUk9DX1BST0NFU1NfTUFOKQpkaWZmIC0tZ2l0IGEvbWFuL2RybS1rbXMueG1sIGIvbWFuL2RybS1rbXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMDRjMjYKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vZHJtLWttcy54bWwKQEAgLTAsMCArMSwzNDIgQEAKKzw/eG1sIHZlcnNpb249JzEuMCc/PiA8IS0tKi1ueG1sLSotLT4KKzwhRE9DVFlQRSByZWZlbnRyeSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMi8vRU4iCisgICAgICAgICAgImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC4yL2RvY2Jvb2t4LmR0ZCI+CisKKzwhLS0KKyAgV3JpdHRlbiAyMDEyIGJ5IERhdmlkIEhlcnJtYW5uIDxkaC5oZXJybWFubkBnb29nbGVtYWlsLmNvbT4KKyAgRGVkaWNhdGVkIHRvIHRoZSBQdWJsaWMgRG9tYWluCistLT4KKworPHJlZmVudHJ5IGlkPSJkcm0ta21zIj4KKyAgPHJlZmVudHJ5aW5mbz4KKyAgICA8dGl0bGU+RGlyZWN0IFJlbmRlcmluZyBNYW5hZ2VyPC90aXRsZT4KKyAgICA8cHJvZHVjdG5hbWU+bGliZHJtPC9wcm9kdWN0bmFtZT4KKyAgICA8ZGF0ZT5TZXB0ZW1iZXIgMjAxMjwvZGF0ZT4KKyAgICA8YXV0aG9yZ3JvdXA+CisgICAgICA8YXV0aG9yPgorICAgICAgICA8Y29udHJpYj5EZXZlbG9wZXI8L2NvbnRyaWI+CisgICAgICAgIDxmaXJzdG5hbWU+RGF2aWQ8L2ZpcnN0bmFtZT4KKyAgICAgICAgPHN1cm5hbWU+SGVycm1hbm48L3N1cm5hbWU+CisgICAgICAgIDxlbWFpbD5kaC5oZXJybWFubkBnb29nbGVtYWlsLmNvbTwvZW1haWw+CisgICAgICA8L2F1dGhvcj4KKyAgICA8L2F1dGhvcmdyb3VwPgorICA8L3JlZmVudHJ5aW5mbz4KKworICA8cmVmbWV0YT4KKyAgICA8cmVmZW50cnl0aXRsZT5kcm0ta21zPC9yZWZlbnRyeXRpdGxlPgorICAgIDxtYW52b2xudW0+NzwvbWFudm9sbnVtPgorICA8L3JlZm1ldGE+CisKKyAgPHJlZm5hbWVkaXY+CisgICAgPHJlZm5hbWU+ZHJtLWttczwvcmVmbmFtZT4KKyAgICA8cmVmcHVycG9zZT5LZXJuZWwgTW9kZS1TZXR0aW5nPC9yZWZwdXJwb3NlPgorICA8L3JlZm5hbWVkaXY+CisKKyAgPHJlZnN5bm9wc2lzZGl2PgorICAgIDxmdW5jc3lub3BzaXM+CisgICAgICA8ZnVuY3N5bm9wc2lzaW5mbz4jaW5jbHVkZSAmbHQ7eGY4NmRybS5oJmd0OzwvZnVuY3N5bm9wc2lzaW5mbz4KKyAgICAgIDxmdW5jc3lub3BzaXNpbmZvPiNpbmNsdWRlICZsdDt4Zjg2ZHJtTW9kZS5oJmd0OzwvZnVuY3N5bm9wc2lzaW5mbz4KKyAgICA8L2Z1bmNzeW5vcHNpcz4KKyAgPC9yZWZzeW5vcHNpc2Rpdj4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkRlc2NyaXB0aW9uPC90aXRsZT4KKyAgICA8cGFyYT5FYWNoIERSTSBkZXZpY2UgcHJvdmlkZXMgYWNjZXNzIHRvIG1hbmFnZSB3aGljaCBtb25pdG9ycyBhbmQgZGlzcGxheXMKKyAgICAgICAgICBhcmUgY3VycmVudGx5IHVzZWQgYW5kIHdoYXQgZnJhbWVzIHRvIGJlIGRpc3BsYXllZC4gVGhpcyB0YXNrIGlzCisgICAgICAgICAgY2FsbGVkIDxlbXBoYXNpcz5LZXJuZWwgTW9kZS1TZXR0aW5nPC9lbXBoYXNpcz4gKEtNUykuIEhpc3RvcmljYWxseSwKKyAgICAgICAgICB0aGlzIHdhcyBkb25lIGluIHVzZXItc3BhY2UgYW5kIGNhbGxlZCAKKyAgICAgICAgICA8ZW1waGFzaXM+VXNlci1zcGFjZSBNb2RlLVNldHRpbmc8L2VtcGhhc2lzPiAoVU1TKS4gQWxtb3N0IGFsbAorICAgICAgICAgIG9wZW4tc291cmNlIGRyaXZlcnMgbm93IHByb3ZpZGUgdGhlIEtNUyBrZXJuZWwgQVBJIHRvIGRvIHRoaXMgaW4gdGhlCisgICAgICAgICAga2VybmVsLCBob3dldmVyLCBtYW55IG5vbi1vcGVuLXNvdXJjZSBiaW5hcnkgZHJpdmVycyBmcm9tIGRpZmZlcmVudAorICAgICAgICAgIHZlbmRvcnMgc3RpbGwgZG8gbm90IHN1cHBvcnQgdGhpcy4gWW91IGNhbiB1c2UKKyAgICAgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybU1vZGVTZXR0aW5nU3VwcG9ydGVkPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PgorICAgICAgICAgIHRvIGNoZWNrIHdoZXRoZXIgeW91ciBkcml2ZXIgc3VwcG9ydHMgdGhpcy4gVG8gdW5kZXJzdGFuZCBob3cgS01TCisgICAgICAgICAgd29ya3MsIHdlIG5lZWQgdG8gaW50cm9kdWNlIDUgb2JqZWN0czogPGVtcGhhc2lzPkNSVENzPC9lbXBoYXNpcz4sCisgICAgICAgICAgPGVtcGhhc2lzPlBsYW5lczwvZW1waGFzaXM+LCA8ZW1waGFzaXM+RW5jb2RlcnM8L2VtcGhhc2lzPiwKKyAgICAgICAgICA8ZW1waGFzaXM+Q29ubmVjdG9yczwvZW1waGFzaXM+IGFuZAorICAgICAgICAgIDxlbXBoYXNpcz5GcmFtZWJ1ZmZlcnM8L2VtcGhhc2lzPi4KKworICAgICAgPHZhcmlhYmxlbGlzdD4KKyAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICA8dGVybT5DUlRDczwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT5BIDxlbXBoYXNpcz5DUlRDPC9lbXBoYXNpcz4gc2hvcnQgZm9yCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+Q1JUIENvbnRyb2xsZXI8L2VtcGhhc2lzPiBpcyBhbiBhYnN0cmFjdGlvbgorICAgICAgICAgICAgICAgICAgcmVwcmVzZW50aW5nIGEgcGFydCBvZiB0aGUgY2hpcCB0aGF0IGNvbnRhaW5zIGEgcG9pbnRlciB0byBhCisgICAgICAgICAgICAgICAgICBzY2Fub3V0IGJ1ZmZlci4gVGhlcmVmb3JlLCB0aGUgbnVtYmVyIG9mIENSVENzIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5lcyBob3cgbWFueSBpbmRlcGVuZGVudCBzY2Fub3V0IGJ1ZmZlcnMgY2FuIGJlIGFjdGl2ZQorICAgICAgICAgICAgICAgICAgYXQgYW55IGdpdmVuIHRpbWUuIFRoZSBDUlRDIHN0cnVjdHVyZSBjb250YWlucyBzZXZlcmFsIGZpZWxkcworICAgICAgICAgICAgICAgICAgdG8gc3VwcG9ydCB0aGlzOiBhIHBvaW50ZXIgdG8gc29tZSB2aWRlbyBtZW1vcnkgKGFic3RyYWN0ZWQgYXMKKyAgICAgICAgICAgICAgICAgIGEgZnJhbWUtYnVmZmVyIG9iamVjdCksIGEgbGlzdCBvZiBkcml2ZW4gY29ubmVjdG9ycywgYSBkaXNwbGF5CisgICAgICAgICAgICAgICAgICBtb2RlIGFuZCBhbiAoeCwgeSkgb2Zmc2V0IGludG8gdGhlIHZpZGVvIG1lbW9yeSB0byBzdXBwb3J0CisgICAgICAgICAgICAgICAgICBwYW5uaW5nIG9yIGNvbmZpZ3VyYXRpb25zIHdoZXJlIG9uZSBwaWVjZSBvZiB2aWRlbyBtZW1vcnkKKyAgICAgICAgICAgICAgICAgIHNwYW5zIG11bHRpcGxlIENSVENzLiBBIENSVEMgaXMgdGhlIGNlbnRyYWwgcG9pbnQgd2hlcmUKKyAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gb2YgZGlzcGxheXMgaGFwcGVucy4gWW91IHNlbGVjdCB3aGljaCBvYmplY3RzIHRvCisgICAgICAgICAgICAgICAgICB1c2UsIHdoaWNoIG1vZGVzIGFuZCB3aGljaCBwYXJhbWV0ZXJzIGFuZCB0aGVuIGNvbmZpZ3VyZSBlYWNoCisgICAgICAgICAgICAgICAgICBDUlRDIHZpYQorICAgICAgICAgICAgICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1Nb2RlQ3J0Y1NldDwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjM8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4KKyAgICAgICAgICAgICAgICAgIHRvIGRyaXZlIHRoZSBkaXNwbGF5IGRldmljZXMuPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgIDx0ZXJtPlBsYW5lczwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT5BIDxlbXBoYXNpcz5wbGFuZTwvZW1waGFzaXM+IHJlc3ByZXNlbnRzIGFuIGltYWdlIHNvdXJjZSB0aGF0CisgICAgICAgICAgICAgICAgICBjYW4gYmUgYmxlbmRlZCB3aXRoIG9yIG92ZXJsYXllZCBvbiB0b3Agb2YgYSBDUlRDIGR1cmluZyB0aGUKKyAgICAgICAgICAgICAgICAgIHNjYW5vdXQgcHJvY2Vzcy4gUGxhbmVzIGFyZSBhc3NvY2lhdGVkIHdpdGggYSBmcmFtZS1idWZmZXIgdG8KKyAgICAgICAgICAgICAgICAgIGNyb3AgYSBwb3J0aW9uIG9mIHRoZSBpbWFnZSBtZW1vcnkgKHNvdXJjZSkgYW5kIG9wdGlvbmFsbHkKKyAgICAgICAgICAgICAgICAgIHNjYWxlIGl0IHRvIGEgZGVzdGluYXRpb24gc2l6ZS4gVGhlIHJlc3VsdCBpcyB0aGVuIGJsZW5kZWQKKyAgICAgICAgICAgICAgICAgIHdpdGggb3Igb3ZlcmxheWVkIG9uIHRvcCBvZiBhIENSVEMuIFBsYW5lcyBhcmUgbm90IHByb3ZpZGVkIGJ5CisgICAgICAgICAgICAgICAgICBhbGwgaGFyZHdhcmUgYW5kIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHBsYW5lcyBpcyBsaW1pdGVkLiBJZgorICAgICAgICAgICAgICAgICAgcGxhbmVzIGFyZSBub3QgYXZhaWxhYmxlIG9yIGlmIG5vdCBlbm91Z2ggcGxhbmVzIGFyZQorICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlLCB0aGUgdXNlciBzaG91bGQgZmFsbCBiYWNrIHRvIG5vcm1hbCBzb2Z0d2FyZQorICAgICAgICAgICAgICAgICAgYmxlbmRpbmcgKHZpYSBHUFUgb3IgQ1BVKS48L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+RW5jb2RlcnM8L3Rlcm0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+QW4gPGVtcGhhc2lzPmVuY29kZXI8L2VtcGhhc2lzPiB0YWtlcyBwaXhlbCBkYXRhIGZyb20gYSBDUlRDCisgICAgICAgICAgICAgICAgICBhbmQgY29udmVydHMgaXQgdG8gYSBmb3JtYXQgc3VpdGFibGUgZm9yIGFueSBhdHRhY2hlZAorICAgICAgICAgICAgICAgICAgY29ubmVjdG9ycy4gT24gc29tZSBkZXZpY2VzLCBpdCBtYXkgYmUgcG9zc2libGUgdG8gaGF2ZSBhIENSVEMKKyAgICAgICAgICAgICAgICAgIHNlbmQgZGF0YSB0byBtb3JlIHRoYW4gb25lIGVuY29kZXIuIEluIHRoYXQgY2FzZSwgYm90aAorICAgICAgICAgICAgICAgICAgZW5jb2RlcnMgd291bGQgcmVjZWl2ZSBkYXRhIGZyb20gdGhlIHNhbWUgc2Nhbm91dCBidWZmZXIsCisgICAgICAgICAgICAgICAgICByZXN1bHRpbmcgaW4gYSA8ZW1waGFzaXM+Y2xvbmVkPC9lbXBoYXNpcz4gZGlzcGxheQorICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBhY3Jvc3MgdGhlIGNvbm5lY3RvcnMgYXR0YWNoZWQgdG8gZWFjaAorICAgICAgICAgICAgICAgICAgZW5jb2Rlci48L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+Q29ubmVjdG9yczwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT5BIDxlbXBoYXNpcz5jb25uZWN0b3I8L2VtcGhhc2lzPiBpcyB0aGUgZmluYWwgZGVzdGluYXRpb24gb2YKKyAgICAgICAgICAgICAgICAgIHBpeGVsLWRhdGEgb24gYSBkZXZpY2UsIGFuZCB1c3VhbGx5IGNvbm5lY3RzIGRpcmVjdGx5IHRvIGFuCisgICAgICAgICAgICAgICAgICBleHRlcm5hbCBkaXNwbGF5IGRldmljZSBsaWtlIGEgbW9uaXRvciBvciBsYXB0b3AgcGFuZWwuIEEKKyAgICAgICAgICAgICAgICAgIGNvbm5lY3RvciBjYW4gb25seSBiZSBhdHRhY2hlZCB0byBvbmUgZW5jb2RlciBhdCBhIHRpbWUuIFRoZQorICAgICAgICAgICAgICAgICAgY29ubmVjdG9yIGlzIGFsc28gdGhlIHN0cnVjdHVyZSB3aGVyZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgICAgICAgICAgICAgICAgIGF0dGFjaGVkIGRpc3BsYXkgaXMga2VwdCwgc28gaXQgY29udGFpbnMgZmllbGRzIGZvciBkaXNwbGF5CisgICAgICAgICAgICAgICAgICBkYXRhLCA8ZW1waGFzaXM+RURJRDwvZW1waGFzaXM+IGRhdGEsCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+RFBNUzwvZW1waGFzaXM+IGFuZAorICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPmNvbm5lY3Rpb24gc3RhdHVzPC9lbXBoYXNpcz4sIGFuZCBpbmZvcm1hdGlvbiBhYm91dAorICAgICAgICAgICAgICAgICAgbW9kZXMgc3VwcG9ydGVkIG9uIHRoZSBhdHRhY2hlZCBkaXNwbGF5cy48L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+RnJhbWVidWZmZXJzPC90ZXJtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPjxlbXBoYXNpcz5GcmFtZWJ1ZmZlcnM8L2VtcGhhc2lzPiBhcmUgYWJzdHJhY3QgbWVtb3J5IG9iamVjdHMKKyAgICAgICAgICAgICAgICAgIHRoYXQgcHJvdmlkZSBhIHNvdXJjZSBvZiBwaXhlbCBkYXRhIHRvIHNjYW5vdXQgdG8gYSBDUlRDLgorICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb25zIGV4cGxpY2l0bHkgcmVxdWVzdCB0aGUgY3JlYXRpb24gb2YgZnJhbWVidWZmZXJzCisgICAgICAgICAgICAgICAgICBhbmQgY2FuIGNvbnRyb2wgdGhlaXIgYmVoYXZpb3IuIEZyYW1lYnVmZmVycyByZWx5IG9uIHRoZQorICAgICAgICAgICAgICAgICAgdW5kZXJuZWF0aCBtZW1vcnkgbWFuYWdlciBmb3IgbG93LWxldmVsIG1lbW9yeSBvcGVyYXRpb25zLgorICAgICAgICAgICAgICAgICAgV2hlbiBjcmVhdGluZyBhIGZyYW1lYnVmZmVyLCBhcHBsaWNhdGlvbnMgcGFzcyBhIG1lbW9yeSBoYW5kbGUKKyAgICAgICAgICAgICAgICAgIHRocm91Z2ggdGhlIEFQSSB3aGljaCBpcyB1c2VkIGFzIGJhY2tpbmcgc3RvcmFnZS4gVGhlCisgICAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlciBpdHNlbGYgaXMgb25seSBhbiBhYnN0cmFjdCBvYmplY3Qgd2l0aCBubyBkYXRhLiBJdAorICAgICAgICAgICAgICAgICAganVzdCByZWZlcnMgdG8gbWVtb3J5IGJ1ZmZlcnMgdGhhdCBtdXN0IGJlIGNyZWF0ZWQgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtLW1lbW9yeTwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjc8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4KKyAgICAgICAgICAgICAgICAgIEFQSS48L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICA8L3ZhcmlhYmxlbGlzdD4KKyAgICA8L3BhcmE+CisKKyAgICA8cmVmc2VjdDI+CisgICAgICA8dGl0bGU+TW9kZS1TZXR0aW5nPC90aXRsZT4KKyAgICAgIDxwYXJhPkJlZm9yZSBtb2RlLXNldHRpbmcgY2FuIGJlIHBlcmZvcm1lZCwgYW4gYXBwbGljYXRpb24gbmVlZHMgdG8gY2FsbAorICAgICAgICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1TZXRNYXN0ZXI8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+CisgICAgICAgICAgICB0byBiZWNvbWUgPGVtcGhhc2lzPkRSTS1NYXN0ZXI8L2VtcGhhc2lzPi4gSXQgdGhlbiBoYXMgZXhjbHVzaXZlCisgICAgICAgICAgICBhY2Nlc3MgdG8gdGhlIEtNUyBBUEkuIEEgY2FsbCB0bworICAgICAgICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1Nb2RlR2V0UmVzb3VyY2VzPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PgorICAgICAgICAgICAgcmV0dXJucyBhIGxpc3Qgb2YgPGVtcGhhc2lzPkNSVENzPC9lbXBoYXNpcz4sCisgICAgICAgICAgICA8ZW1waGFzaXM+Q29ubmVjdG9yczwvZW1waGFzaXM+LCA8ZW1waGFzaXM+RW5jb2RlcnM8L2VtcGhhc2lzPiBhbmQKKyAgICAgICAgICAgIDxlbXBoYXNpcz5QbGFuZXM8L2VtcGhhc2lzPi48L3BhcmE+CisKKyAgICAgIDxwYXJhPk5vcm1hbCBwcm9jZWR1cmUgbm93IGluY2x1ZGVzOiBGaXJzdCwgeW91IHNlbGVjdCB3aGljaCBjb25uZWN0b3JzCisgICAgICAgICAgICB5b3Ugd2FudCB0byB1c2UuIFVzZXJzIGFyZSBtb3N0bHkgaW50ZXJlc3RlZCBpbiB3aGljaCBtb25pdG9yIG9yCisgICAgICAgICAgICBkaXNwbGF5LXBhbmVsIGlzIGFjdGl2ZSBzbyB5b3UgbmVlZCB0byBtYWtlIHN1cmUgdG8gYXJyYW5nZSB0aGVtIGluCisgICAgICAgICAgICB0aGUgY29ycmVjdCBsb2dpY2FsIG9yZGVyIGFuZCBzZWxlY3QgdGhlIGNvcnJlY3Qgb25lcyB0byB1c2UuIEZvcgorICAgICAgICAgICAgZWFjaCBjb25uZWN0b3IsIHlvdSBuZWVkIHRvIGZpbmQgYSBDUlRDIHRvIGRyaXZlIHRoaXMgY29ubmVjdG9yLiBJZgorICAgICAgICAgICAgeW91IHdhbnQgdG8gY2xvbmUgb3V0cHV0IHRvIHR3byBvciBtb3JlIGNvbm5lY3RvcnMsIHlvdSBtYXkgdXNlIGEKKyAgICAgICAgICAgIHNpbmdsZSBDUlRDIGZvciBhbGwgY2xvbmVkIGNvbm5lY3RvcnMgKGlmIHRoZSBoYXJkd2FyZSBzdXBwb3J0cworICAgICAgICAgICAgdGhpcykuIFRvIGZpbmQgYSBzdWl0YWJsZSBDUlRDLCB5b3UgbmVlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGxpc3Qgb2YKKyAgICAgICAgICAgIGVuY29kZXJzIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgZWFjaCBjb25uZWN0b3IuIEVhY2ggZW5jb2RlcgorICAgICAgICAgICAgY29udGFpbnMgYSBsaXN0IG9mIENSVENzIHRoYXQgaXQgY2FuIHdvcmsgd2l0aCBhbmQgeW91IHNpbXBseSBzZWxlY3QKKyAgICAgICAgICAgIG9uZSBvZiB0aGVzZSBDUlRDcy4gSWYgeW91IGxhdGVyIHByb2dyYW0gdGhlIENSVEMgdG8gY29udHJvbCBhCisgICAgICAgICAgICBjb25uZWN0b3IsIGl0IGF1dG9tYXRpY2FsbHkgc2VsZWN0cyB0aGUgYmVzdCBlbmNvZGVyLiBIb3dldmVyLCB0aGlzCisgICAgICAgICAgICBwcm9jZWR1cmUgaXMgbmVlZGVkIHNvIHlvdXIgQ1JUQyBoYXMgYXQgbGVhc3Qgb25lIHdvcmtpbmcgZW5jb2RlcgorICAgICAgICAgICAgZm9yIHRoZSBzZWxlY3RlZCBjb25uZWN0b3IuIFNlZSB0aGUgPGVtcGhhc2lzPkV4YW1wbGVzPC9lbXBoYXNpcz4KKyAgICAgICAgICAgIHNlY3Rpb24gYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wYXJhPgorCisgICAgICA8cGFyYT5BbGwgdmFsaWQgbW9kZXMgZm9yIGEgY29ubmVjdG9yIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBhIGNhbGwgdG8KKyAgICAgICAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtTW9kZUdldENvbm5lY3RvcjwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjM8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4KKyAgICAgICAgICAgIFlvdSBuZWVkIHRvIHNlbGVjdCB0aGUgbW9kZSB5b3Ugd2FudCB0byB1c2UgYW5kIHNhdmUgaXQuIFRoZSBmaXJzdAorICAgICAgICAgICAgbW9kZSBpbiB0aGUgbGlzdCBpcyB0aGUgZGVmYXVsdCBtb2RlIHdpdGggdGhlIGhpZ2hlc3QgcmVzb2x1dGlvbgorICAgICAgICAgICAgcG9zc2libGUgYW5kIG9mdGVuIGEgc3VpdGFibGUgY2hvaWNlLjwvcGFyYT4KKworICAgICAgPHBhcmE+QWZ0ZXIgeW91IGhhdmUgYSB3b3JraW5nIGNvbm5lY3RvcitDUlRDK21vZGUgY29tYmluYXRpb24sIHlvdSBuZWVkCisgICAgICAgICAgICB0byBjcmVhdGUgYSBmcmFtZWJ1ZmZlciB0aGF0IGlzIHVzZWQgZm9yIHNjYW5vdXQuIE1lbW9yeSBidWZmZXIKKyAgICAgICAgICAgIGFsbG9jYXRpb24gaXMgZHJpdmVyLWRlcGVkZW50IGFuZCBkZXNjcmliZWQgaW4KKyAgICAgICAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtLW1lbW9yeTwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjc8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4uCisgICAgICAgICAgICBZb3UgbmVlZCB0byBjcmVhdGUgYSBidWZmZXIgYmlnIGVub3VnaCBmb3IgeW91ciBzZWxlY3RlZCBtb2RlLiBOb3cKKyAgICAgICAgICAgIHlvdSBjYW4gY3JlYXRlIGEgZnJhbWVidWZmZXIgb2JqZWN0IHRoYXQgdXNlcyB5b3VyIG1lbW9yeS1idWZmZXIgYXMKKyAgICAgICAgICAgIHNjYW5vdXQgYnVmZmVyLiBZb3UgY2FuIGRvIHRoaXMgd2l0aAorICAgICAgICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1Nb2RlQWRkRkI8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+CisgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtTW9kZUFkZEZCMjwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjM8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4uPC9wYXJhPgorCisgICAgICA8cGFyYT5BcyBhIGxhc3Qgc3RlcCwgeW91IHdhbnQgdG8gcHJvZ3JhbSB5b3VyIENSVEMgdG8gZHJpdmUgeW91ciBzZWxlY3RlZAorICAgICAgICAgICAgY29ubmVjdG9yLiBZb3UgY2FuIGRvIHRoaXMgd2l0aCBhIGNhbGwgdG8KKyAgICAgICAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtTW9kZVNldENydGM8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LjwvcGFyYT4KKyAgICA8L3JlZnNlY3QyPgorCisgICAgPHJlZnNlY3QyPgorICAgICAgPHRpdGxlPlBhZ2UtRmxpcHBpbmc8L3RpdGxlPgorICAgICAgPHBhcmE+QSBjYWxsIHRvCisgICAgICAgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybU1vZGVTZXRDcnRjPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PgorICAgICAgICAgICAgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgYW5kIGZvcmNlcyB0aGUgQ1JUQyB0byB1c2UgdGhlIG5ldyBzY2Fub3V0CisgICAgICAgICAgICBidWZmZXIuIElmIHlvdSB3YW50IHNtb290aC10cmFuc2l0aW9ucyB3aXRob3V0IHRlYXJpbmcsIHlvdSBwcm9iYWJseQorICAgICAgICAgICAgdXNlIGRvdWJsZS1idWZmZXJpbmcuIFlvdSBuZWVkIHRvIGNyZWF0ZSBvbmUgZnJhbWVidWZmZXIgb2JqZWN0IGZvcgorICAgICAgICAgICAgZWFjaCBidWZmZXIgeW91IHVzZS4gWW91IGNhbiB0aGVuIGNhbGwKKyAgICAgICAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtTW9kZVNldENydGM8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+CisgICAgICAgICAgICBvbiB0aGUgbmV4dCBidWZmZXIgdG8gZmxpcC4gSWYgeW91IHdhbnQgdG8gc3luY2hyb25pemUgeW91ciBmbGlwcworICAgICAgICAgICAgd2l0aCA8ZW1waGFzaXM+dmVydGljYWwtYmxhbmtzPC9lbXBoYXNpcz4sIHlvdSBjYW4gdXNlCisgICAgICAgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybU1vZGVQYWdlRmxpcDwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjM8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4KKyAgICAgICAgICAgIHdoaWNoIHNjaGVkdWxlcyB5b3VyIHBhZ2UtZmxpcCBmb3IgdGhlIG5leHQKKyAgICAgICAgICAgIDxlbXBoYXNpcz52Ymxhbms8L2VtcGhhc2lzPi48L3BhcmE+CisgICAgPC9yZWZzZWN0Mj4KKworICAgIDxyZWZzZWN0Mj4KKyAgICAgIDx0aXRsZT5QbGFuZXM8L3RpdGxlPgorICAgICAgPHBhcmE+UGxhbmVzIGFyZSBjb250cm9sbGVkIGluZGVwZW5kZW50bHkgZnJvbSBDUlRDcy4gVGhhdCBpcywgYSBjYWxsIHRvCisgICAgICAgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybU1vZGVTZXRDcnRjPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PgorICAgICAgICAgICAgZG9lcyBub3QgYWZmZWN0IHBsYW5lcy4gSW5zdGVhZCwgeW91IG5lZWQgdG8gY2FsbAorICAgICAgICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1Nb2RlU2V0UGxhbmU8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+CisgICAgICAgICAgICB0byBjb25maWd1cmUgYSBwbGFuZS4gVGhpcyByZXF1aXJlcyB0aGUgcGxhbmUgSUQsIGEgQ1JUQywgYQorICAgICAgICAgICAgZnJhbWVidWZmZXIgYW5kIG9mZnNldHMgaW50byB0aGUgcGxhbmUtZnJhbWVidWZmZXIgYW5kIHRoZQorICAgICAgICAgICAgQ1JUQy1mcmFtZWJ1ZmZlci4gVGhlIENSVEMgdGhlbiBibGVuZHMgdGhlIGNvbnRlbnQgZnJvbSB0aGUgcGxhbmUKKyAgICAgICAgICAgIG92ZXIgdGhlIENSVEMgZnJhbWVidWZmZXIgYnVmZmVyIGR1cmluZyBzY2Fub3V0LiBBcyB0aGlzIGRvZXMgbm90CisgICAgICAgICAgICBpbnZvbHZlIGFueSBzb2Z0d2FyZS1ibGVuZGluZywgaXQgaXMgd2F5IGZhc3RlciB0aGFuIHRyYWRpdGlvbmFsCisgICAgICAgICAgICBibGVuZGluZy4gSG93ZXZlciwgcGxhbmUgcmVzb3VyY2VzIGFyZSBsaW1pdGVkLiBTZWUKKyAgICAgICAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtTW9kZUdldFBsYW5lUmVzb3VyY2VzPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PgorICAgICAgICAgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wYXJhPgorICAgIDwvcmVmc2VjdDI+CisKKyAgICA8cmVmc2VjdDI+CisgICAgICA8dGl0bGU+Q3Vyc29yczwvdGl0bGU+CisgICAgICA8cGFyYT5TaW1pbGFyIHRvIHBsYW5lcywgbWFueSBoYXJkd2FyZSBhbHNvIHN1cHBvcnRzIGN1cnNvcnMuIEEgY3Vyc29yIGlzCisgICAgICAgICAgICBhIHZlcnkgc21hbGwgYnVmZmVyIHdpdGggYW4gaW1hZ2UgdGhhdCBpcyBibGVuZGVkIG92ZXIgdGhlIENSVEMKKyAgICAgICAgICAgIGZyYW1lYnVmZmVyLiBZb3UgY2FuIHNldCBhIGRpZmZlcmVudCBjdXJzb3IgZm9yIGVhY2ggQ1JUQyB3aXRoCisgICAgICAgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybU1vZGVTZXRDdXJzb3I8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+CisgICAgICAgICAgICBhbmQgbW92ZSBpdCBvbiB0aGUgc2NyZWVuIHdpdGgKKyAgICAgICAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtTW9kZU1vdmVDdXJzb3I8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LgorICAgICAgICAgICAgVGhpcyBhbGxvd3MgdG8gbW92ZSB0aGUgY3Vyc29yIG9uIHRoZSBzY3JlZW4gd2l0aG91dCByZXJlbmRlcmluZy4gSWYKKyAgICAgICAgICAgIG5vIGhhcmR3YXJlIGN1cnNvcnMgYXJlIHN1cHBvcnRlZCwgeW91IG5lZWQgdG8gcmVyZW5kZXIgZm9yIGVhY2gKKyAgICAgICAgICAgIGZyYW1lIHRoZSBjdXJzb3IgaXMgbW92ZWQuPC9wYXJhPgorICAgIDwvcmVmc2VjdDI+CisKKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkV4YW1wbGVzPC90aXRsZT4KKyAgICA8cGFyYT5Tb21lIGV4YW1wbGVzIG9mIGhvdyBiYXNpYyBtb2RlLXNldHRpbmcgY2FuIGJlIGRvbmUuIFNlZSB0aGUgbWFuLXBhZ2UKKyAgICAgICAgICBvZiBlYWNoIERSTSBmdW5jdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3BhcmE+CisKKyAgICA8cmVmc2VjdDI+CisgICAgICA8dGl0bGU+Q1JUQy9FbmNvZGVyIFNlbGVjdGlvbjwvdGl0bGU+CisgICAgICA8cGFyYT5JZiB5b3UgcmV0cmlldmVkIGFsbCBkaXNwbGF5IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gdmlhCisgICAgICAgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybU1vZGVHZXRSZXNvdXJjZXM8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+CisgICAgICAgICAgICBhcyA8c3RydWN0bmFtZT5kcm1Nb2RlUmVzPC9zdHJ1Y3RuYW1lPiAqPHZhcm5hbWU+cmVzPC92YXJuYW1lPiwKKyAgICAgICAgICAgIHNlbGVjdGVkIGEgY29ubmVjdG9yIGZyb20gdGhlIGxpc3QgaW4KKyAgICAgICAgICAgIDx2YXJuYW1lPnJlczwvdmFybmFtZT4tPjxzdHJ1Y3RmaWVsZD5jb25uZWN0b3JzPC9zdHJ1Y3RmaWVsZD4KKyAgICAgICAgICAgIGFuZCByZXRyaWV2ZWQgdGhlIGNvbm5lY3Rvci1pbmZvcm1hdGlvbiBhcworICAgICAgICAgICAgPHN0cnVjdG5hbWU+ZHJtTW9kZUNvbm5lY3Rvcjwvc3RydWN0bmFtZT4gKjx2YXJuYW1lPmNvbm48L3Zhcm5hbWU+CisgICAgICAgICAgICB2aWEKKyAgICAgICAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtTW9kZUdldENvbm5lY3RvcjwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjM8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4KKyAgICAgICAgICAgIHRoZW4gdGhpcyBleGFtcGxlIHNob3dzLCBob3cgeW91IGNhbiBmaW5kIGEgc3VpdGFibGUgQ1JUQyBpZCB0bworICAgICAgICAgICAgZHJpdmUgdGhpcyBjb25uZWN0b3IuIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBmaWxlLWRlc2NyaXB0b3IgdG8gdGhlCisgICAgICAgICAgICBEUk0gZGV2aWNlIChzZWUKKyAgICAgICAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtT3BlbjwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjM8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4pCisgICAgICAgICAgICBhcyA8dmFybmFtZT5mZDwvdmFybmFtZT4sIGEgcG9pbnRlciB0byB0aGUgcmV0cmlldmVkIHJlc291cmNlcyBhcworICAgICAgICAgICAgPHZhcm5hbWU+cmVzPC92YXJuYW1lPiBhbmQgYSBwb2ludGVyIHRvIHRoZSBzZWxlY3RlZCBjb25uZWN0b3IgYXMKKyAgICAgICAgICAgIDx2YXJuYW1lPmNvbm48L3Zhcm5hbWU+LiBJdCByZXR1cm5zIGFuIGludGVnZXIgc21hbGxlciB0aGFuIDAgb24KKyAgICAgICAgICAgIGZhaWx1cmUsIG90aGVyd2lzZSwgYSB2YWxpZCBDUlRDIGlkIGlzIHJldHVybmVkLjwvcGFyYT4KKworPHByb2dyYW1saXN0aW5nPgorc3RhdGljIGludCBtb2Rlc2V0X2ZpbmRfY3J0YyhpbnQgZmQsIGRybU1vZGVSZXMgKnJlcywgZHJtTW9kZUNvbm5lY3RvciAqY29ubikKK3sKKwlkcm1Nb2RlRW5jb2RlciAqZW5jOworCXVuc2lnbmVkIGludCBpLCBqOworCisJLyogaXRlcmF0ZSBhbGwgZW5jb2RlcnMgb2YgdGhpcyBjb25uZWN0b3IgKi8KKwlmb3IgKGkgPSAwOyBpICZsdDsgY29ubi0+Y291bnRfZW5jb2RlcnM7ICsraSkgeworCQllbmMgPSBkcm1Nb2RlR2V0RW5jb2RlcihmZCwgY29ubi0+ZW5jb2RlcnNbaV0pOworCQlpZiAoIWVuYykgeworCQkJLyogY2Fubm90IHJldHJpZXZlIGVuY29kZXIsIGlnbm9yaW5nLi4uICovCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIGl0ZXJhdGUgYWxsIGdsb2JhbCBDUlRDcyAqLworCQlmb3IgKGogPSAwOyBqICZsdDsgcmVzLT5jb3VudF9jcnRjczsgKytqKSB7CisJCQkvKiBjaGVjayB3aGV0aGVyIHRoaXMgQ1JUQyB3b3JrcyB3aXRoIHRoZSBlbmNvZGVyICovCisJCQlpZiAoIShlbmMtPnBvc3NpYmxlX2NydGNzICZhbXA7ICgxICZsdDsmbHQ7IGopKSkKKwkJCQljb250aW51ZTsKKworCisJCQkvKiBIZXJlIHlvdSBuZWVkIHRvIGNoZWNrIHRoYXQgbm8gb3RoZXIgY29ubmVjdG9yCisJCQkgKiBjdXJyZW50bHkgdXNlcyB0aGUgQ1JUQyB3aXRoIGlkICJjcnRjIi4gSWYgeW91IGludGVuZAorCQkJICogdG8gZHJpdmUgb25lIGNvbm5lY3RvciBvbmx5LCB0aGVuIHlvdSBjYW4gc2tpcCB0aGlzCisJCQkgKiBzdGVwLiBPdGhlcndpc2UsIHNpbXBseSBzY2FuIHlvdXIgbGlzdCBvZiBjb25maWd1cmVkCisJCQkgKiBjb25uZWN0b3JzIGFuZCBDUlRDcyB3aGV0aGVyIHRoaXMgQ1JUQyBpcyBhbHJlYWR5CisJCQkgKiB1c2VkLiBJZiBpdCBpcywgdGhlbiBzaW1wbHkgY29udGludWUgdGhlIHNlYXJjaCBoZXJlLiAqLworCQkJaWYgKHJlcy0+Y3J0Y3Nbal0gImlzIHVudXNlZCIpIHsKKwkJCQlkcm1Nb2RlRnJlZUVuY29kZXIoZW5jKTsKKwkJCQlyZXR1cm4gcmVzLT5jcnRjc1tqXTsKKwkJCX0KKwkJfQorCisJCWRybU1vZGVGcmVlRW5jb2RlcihlbmMpOworCX0KKworCS8qIGNhbm5vdCBmaW5kIGEgc3VpdGFibGUgQ1JUQyAqLworCXJldHVybiAtRU5PRU5UOworfQorPC9wcm9ncmFtbGlzdGluZz4KKworICAgIDwvcmVmc2VjdDI+CisKKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPlJlcG9ydGluZyBCdWdzPC90aXRsZT4KKyAgICA8cGFyYT5CdWdzIGluIHRoaXMgbWFudWFsIHNob3VsZCBiZSByZXBvcnRlZCB0bworICAgICAgaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9lbnRlcl9idWcuY2dpP3Byb2R1Y3Q9RFJJJmFtcDtjb21wb25lbnQ9bGliZHJtCisgICAgICB1bmRlciB0aGUgIkRSSSIgcHJvZHVjdCwgY29tcG9uZW50ICJsaWJkcm0iPC9wYXJhPgorICA8L3JlZnNlY3QxPgorCisgIDxyZWZzZWN0MT4KKyAgICA8dGl0bGU+U2VlIEFsc288L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm08L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT43PC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm0tbWVtb3J5PC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+NzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PiwKKyAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtTW9kZUdldFJlc291cmNlczwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjM8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4sCisgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybU1vZGVHZXRDb25uZWN0b3I8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1Nb2RlR2V0RW5jb2RlcjwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjM8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4sCisgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybU1vZGVHZXRDcnRjPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PiwKKyAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtTW9kZVNldENydGM8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1Nb2RlR2V0RkI8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1Nb2RlQWRkRkI8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1Nb2RlQWRkRkIyPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PiwKKyAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtTW9kZVJtRkI8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1Nb2RlUGFnZUZsaXA8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1Nb2RlR2V0UGxhbmVSZXNvdXJjZXM8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1Nb2RlR2V0UGxhbmU8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1Nb2RlU2V0UGxhbmU8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1Nb2RlU2V0Q3Vyc29yPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PiwKKyAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtTW9kZU1vdmVDdXJzb3I8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1TZXRNYXN0ZXI8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1BdmFpbGFibGU8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1DaGVja01vZGVzZXR0aW5nU3VwcG9ydGVkPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PiwKKyAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtT3BlbjwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjM8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4KKyAgICA8L3BhcmE+CisgIDwvcmVmc2VjdDE+Cis8L3JlZmVudHJ5PgpkaWZmIC0tZ2l0IGEvbWFuL2RybS1tZW1vcnkueG1sIGIvbWFuL2RybS1tZW1vcnkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYTdjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vZHJtLW1lbW9yeS54bWwKQEAgLTAsMCArMSw0MzAgQEAKKzw/eG1sIHZlcnNpb249JzEuMCc/PiA8IS0tKi1ueG1sLSotLT4KKzwhRE9DVFlQRSByZWZlbnRyeSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMi8vRU4iCisgICAgICAgICAgImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC4yL2RvY2Jvb2t4LmR0ZCI+CisKKzwhLS0KKyAgV3JpdHRlbiAyMDEyIGJ5IERhdmlkIEhlcnJtYW5uIDxkaC5oZXJybWFubkBnb29nbGVtYWlsLmNvbT4KKyAgRGVkaWNhdGVkIHRvIHRoZSBQdWJsaWMgRG9tYWluCistLT4KKworPHJlZmVudHJ5IGlkPSJkcm0tbWVtb3J5Ij4KKyAgPHJlZmVudHJ5aW5mbz4KKyAgICA8dGl0bGU+RGlyZWN0IFJlbmRlcmluZyBNYW5hZ2VyPC90aXRsZT4KKyAgICA8cHJvZHVjdG5hbWU+bGliZHJtPC9wcm9kdWN0bmFtZT4KKyAgICA8ZGF0ZT5TZXB0ZW1iZXIgMjAxMjwvZGF0ZT4KKyAgICA8YXV0aG9yZ3JvdXA+CisgICAgICA8YXV0aG9yPgorICAgICAgICA8Y29udHJpYj5EZXZlbG9wZXI8L2NvbnRyaWI+CisgICAgICAgIDxmaXJzdG5hbWU+RGF2aWQ8L2ZpcnN0bmFtZT4KKyAgICAgICAgPHN1cm5hbWU+SGVycm1hbm48L3N1cm5hbWU+CisgICAgICAgIDxlbWFpbD5kaC5oZXJybWFubkBnb29nbGVtYWlsLmNvbTwvZW1haWw+CisgICAgICA8L2F1dGhvcj4KKyAgICA8L2F1dGhvcmdyb3VwPgorICA8L3JlZmVudHJ5aW5mbz4KKworICA8cmVmbWV0YT4KKyAgICA8cmVmZW50cnl0aXRsZT5kcm0tbWVtb3J5PC9yZWZlbnRyeXRpdGxlPgorICAgIDxtYW52b2xudW0+NzwvbWFudm9sbnVtPgorICA8L3JlZm1ldGE+CisKKyAgPHJlZm5hbWVkaXY+CisgICAgPHJlZm5hbWU+ZHJtLW1lbW9yeTwvcmVmbmFtZT4KKyAgICA8cmVmbmFtZT5kcm0tbW08L3JlZm5hbWU+CisgICAgPHJlZm5hbWU+ZHJtLWdlbTwvcmVmbmFtZT4KKyAgICA8cmVmbmFtZT5kcm0tdHRtPC9yZWZuYW1lPgorICAgIDxyZWZwdXJwb3NlPkRSTSBNZW1vcnkgTWFuYWdlbWVudDwvcmVmcHVycG9zZT4KKyAgPC9yZWZuYW1lZGl2PgorCisgIDxyZWZzeW5vcHNpc2Rpdj4KKyAgICA8ZnVuY3N5bm9wc2lzPgorICAgICAgPGZ1bmNzeW5vcHNpc2luZm8+I2luY2x1ZGUgJmx0O3hmODZkcm0uaCZndDs8L2Z1bmNzeW5vcHNpc2luZm8+CisgICAgPC9mdW5jc3lub3BzaXM+CisgIDwvcmVmc3lub3BzaXNkaXY+CisKKyAgPHJlZnNlY3QxPgorICAgIDx0aXRsZT5EZXNjcmlwdGlvbjwvdGl0bGU+CisgICAgICA8cGFyYT5NYW55IG1vZGVybiBoaWdoLWVuZCBHUFVzIGNvbWUgd2l0aCB0aGVpciBvd24gbWVtb3J5IG1hbmFnZXJzLiBUaGV5CisgICAgICAgICAgICBldmVuIGluY2x1ZGUgc2V2ZXJhbCBkaWZmZXJlbnQgY2FjaGVzIHRoYXQgbmVlZCB0byBiZSBzeW5jaHJvbml6ZWQKKyAgICAgICAgICAgIGR1cmluZyBhY2Nlc3MuIFRleHR1cmVzLCBmcmFtZWJ1ZmZlcnMsIGNvbW1hbmQgYnVmZmVycyBhbmQgbW9yZSBuZWVkCisgICAgICAgICAgICB0byBiZSBzdG9yZWQgaW4gbWVtb3J5IHRoYXQgY2FuIGJlIGFjY2Vzc2VkIHF1aWNrbHkgYnkgdGhlIEdQVS4KKyAgICAgICAgICAgIFRoZXJlZm9yZSwgbWVtb3J5IG1hbmFnZW1lbnQgb24gR1BVcyBpcyBoaWdobHkgZHJpdmVyLSBhbmQKKyAgICAgICAgICAgIGhhcmR3YXJlLWRlcGVuZGVudC48L3BhcmE+CisKKyAgICAgIDxwYXJhPkhvd2V2ZXIsIHRoZXJlIGFyZSBzZXZlcmFsIGZyYW1ld29ya3MgaW4gdGhlIGtlcm5lbCB0aGF0IGFyZSB1c2VkIGJ5CisgICAgICAgICAgICBtb3JlIHRoYW4gb25lIGRyaXZlci4gVGhlc2UgY2FuIGJlIHVzZWQgZm9yIHRyaXZpYWwgbW9kZS1zZXR0aW5nCisgICAgICAgICAgICB3aXRob3V0IHJlcXVpcmluZyBkcml2ZXItZGVwZW5kZW50IGNvZGUuIEJ1dCBmb3IKKyAgICAgICAgICAgIGhhcmR3YXJlLWFjY2VsZXJhdGVkIHJlbmRlcmluZyB5b3UgbmVlZCB0byByZWFkIHRoZSBtYW51YWwgcGFnZXMgZm9yCisgICAgICAgICAgICB0aGUgZHJpdmVyIHlvdSB3YW50IHRvIHdvcmsgd2l0aC48L3BhcmE+CisKKyAgICA8cmVmc2VjdDI+CisgICAgICA8dGl0bGU+RHVtYi1CdWZmZXJzPC90aXRsZT4KKyAgICAgIDxwYXJhPkFsbW9zdCBhbGwgaW4ta2VybmVsIERSTSBoYXJkd2FyZSBkcml2ZXJzIHN1cHBvcnQgYW4gQVBJIGNhbGxlZAorICAgICAgICAgICAgPGVtcGhhc2lzPkR1bWItQnVmZmVyczwvZW1waGFzaXM+LiBUaGlzIEFQSSBhbGxvd3MgdG8gY3JlYXRlIGJ1ZmZlcnMKKyAgICAgICAgICAgIG9mIGFyYml0cmFyeSBzaXplIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHNjYW5vdXQuIFRoZXNlIGJ1ZmZlcnMgY2FuIGJlCisgICAgICAgICAgICBtZW1vcnkgbWFwcGVkIHZpYQorICAgICAgICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5tbWFwPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MjwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PgorICAgICAgICAgICAgc28geW91IGNhbiByZW5kZXIgaW50byB0aGVtIG9uIHRoZSBDUFUuIEhvd2V2ZXIsIEdQVSBhY2Nlc3MgdG8gdGhlc2UKKyAgICAgICAgICAgIGJ1ZmZlcnMgaXMgb2Z0ZW4gbm90IHBvc3NpYmxlLiBUaGVyZWZvcmUsIHRoZXkgYXJlIGZpbmUgZm9yIHNpbXBsZQorICAgICAgICAgICAgdGFza3MgYnV0IG5vdCBzdWl0YWJsZSBmb3IgY29tcGxleCBjb21wb3NpdGlvbnMgYW5kCisgICAgICAgICAgICByZW5kZXJpbmdzLjwvcGFyYT4KKworICAgICAgPHBhcmE+VGhlIDxjb25zdGFudD5EUk1fSU9DVExfTU9ERV9DUkVBVEVfRFVNQjwvY29uc3RhbnQ+IGlvY3RsIGNhbiBiZQorICAgICAgICAgICAgdXNlZCB0byBjcmVhdGUgYSBkdW1iIGJ1ZmZlci4gVGhlIGtlcm5lbCB3aWxsIHJldHVybiBhIDMyYml0IGhhbmRsZQorICAgICAgICAgICAgdGhhdCBjYW4gYmUgdXNlZCB0byBtYW5hZ2UgdGhlIGJ1ZmZlciB3aXRoIHRoZSBEUk0gQVBJLiBZb3UgY2FuCisgICAgICAgICAgICBjcmVhdGUgZnJhbWVidWZmZXJzIHdpdGgKKyAgICAgICAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtTW9kZUFkZEZCPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PgorICAgICAgICAgICAgYW5kIHVzZSBpdCBmb3IgbW9kZS1zZXR0aW5nIGFuZCBzY2Fub3V0LiBUbyBhY2Nlc3MgdGhlIGJ1ZmZlciwgeW91CisgICAgICAgICAgICBmaXJzdCBuZWVkIHRvIHJldHJpZXZlIHRoZSBvZmZzZXQgb2YgdGhlIGJ1ZmZlci4gVGhlCisgICAgICAgICAgICA8Y29uc3RhbnQ+RFJNX0lPQ1RMX01PREVfTUFQX0RVTUI8L2NvbnN0YW50PiBpb2N0bCByZXF1ZXN0cyB0aGUgRFJNCisgICAgICAgICAgICBzdWJzeXN0ZW0gdG8gcHJlcGFyZSB0aGUgYnVmZmVyIGZvciBtZW1vcnktbWFwcGluZyBhbmQgcmV0dXJucyBhCisgICAgICAgICAgICBmYWtlLW9mZnNldCB0aGF0IGNhbiBiZSB1c2VkIHdpdGgKKyAgICAgICAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+bW1hcDwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjI8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4uPC9wYXJhPgorCisgICAgICA8cGFyYT5UaGUgPGNvbnN0YW50PkRSTV9JT0NUTF9NT0RFX0NSRUFURV9EVU1CPC9jb25zdGFudD4gaW9jdGwgdGFrZXMgYXMKKyAgICAgICAgICAgIGFyZ3VtZW50IGEgc3RydWN0dXJlIG9mIHR5cGUKKyAgICAgICAgICAgIDxzdHJ1Y3RuYW1lPnN0cnVjdCBkcm1fbW9kZV9jcmVhdGVfZHVtYjwvc3RydWN0bmFtZT46CisKKzxwcm9ncmFtbGlzdGluZz4KK3N0cnVjdCBkcm1fbW9kZV9jcmVhdGVfZHVtYiB7CisJX191MzIgaGVpZ2h0OworCV9fdTMyIHdpZHRoOworCV9fdTMyIGJwcDsKKwlfX3UzMiBmbGFnczsKKworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBwaXRjaDsKKwlfX3U2NCBzaXplOworfTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgIFRoZSBmaWVsZHMgPHN0cnVjdGZpZWxkPmhlaWdodDwvc3RydWN0ZmllbGQ+LAorICAgICAgICAgICAgPHN0cnVjdGZpZWxkPndpZHRoPC9zdHJ1Y3RmaWVsZD4sIDxzdHJ1Y3RmaWVsZD5icHA8L3N0cnVjdGZpZWxkPiBhbmQKKyAgICAgICAgICAgIDxzdHJ1Y3RmaWVsZD5mbGFnczwvc3RydWN0ZmllbGQ+IGhhdmUgdG8gYmUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci4KKyAgICAgICAgICAgIFRoZSBvdGhlciBmaWVsZHMgYXJlIGZpbGxlZCBieSB0aGUga2VybmVsIHdpdGggdGhlIHJldHVybiB2YWx1ZXMuCisgICAgICAgICAgICA8c3RydWN0ZmllbGQ+aGVpZ2h0PC9zdHJ1Y3RmaWVsZD4gYW5kCisgICAgICAgICAgICA8c3RydWN0ZmllbGQ+d2lkdGg8L3N0cnVjdGZpZWxkPiBhcmUgdGhlIGRpbWVuc2lvbnMgb2YgdGhlCisgICAgICAgICAgICByZWN0YW5ndWxhciBidWZmZXIgdGhhdCBpcyBjcmVhdGVkLiA8c3RydWN0ZmllbGQ+YnBwPC9zdHJ1Y3RmaWVsZD4KKyAgICAgICAgICAgIGlzIHRoZSBudW1iZXIgb2YgYml0cy1wZXItcGl4ZWwgYW5kIG11c3QgYmUgYSBtdWx0aXBsZSBvZgorICAgICAgICAgICAgPGxpdGVyYWw+ODwvbGl0ZXJhbD4uIFlvdSBtb3N0IGNvbW1vbmx5IHdhbnQgdG8gcGFzcworICAgICAgICAgICAgPGxpdGVyYWw+MzI8L2xpdGVyYWw+IGhlcmUuIFRoZSA8c3RydWN0ZmllbGQ+ZmxhZ3M8L3N0cnVjdGZpZWxkPgorICAgICAgICAgICAgZmllbGQgaXMgY3VycmVudGx5IHVudXNlZCBhbmQgbXVzdCBiZSB6ZXJvZWQuIERpZmZlcmVudCBmbGFncyB0bworICAgICAgICAgICAgbW9kaWZ5IHRoZSBiZWhhdmlvciBtYXkgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS4gQWZ0ZXIgY2FsbGluZyB0aGUKKyAgICAgICAgICAgIGlvY3RsLCB0aGUgPHN0cnVjdGZpZWxkPmhhbmRsZTwvc3RydWN0ZmllbGQ+LAorICAgICAgICAgICAgPHN0cnVjdGZpZWxkPnBpdGNoPC9zdHJ1Y3RmaWVsZD4gYW5kIDxzdHJ1Y3RmaWVsZD5zaXplPC9zdHJ1Y3RmaWVsZD4KKyAgICAgICAgICAgIGZpZWxkcyBhcmUgZmlsbGVkIGJ5IHRoZSBrZXJuZWwuIDxzdHJ1Y3RmaWVsZD5oYW5kbGU8L3N0cnVjdGZpZWxkPgorICAgICAgICAgICAgaXMgYSAzMmJpdCBnZW0gaGFuZGxlIHRoYXQgaWRlbnRpZmllcyB0aGUgYnVmZmVyLiBUaGlzIGlzIHVzZWQgYnkKKyAgICAgICAgICAgIHNldmVyYWwgb3RoZXIgY2FsbHMgdGhhdCB0YWtlIGEgZ2VtLWhhbmRsZSBvciBtZW1vcnktYnVmZmVyIGFzCisgICAgICAgICAgICBhcmd1bWVudC4gVGhlIDxzdHJ1Y3RmaWVsZD5waXRjaDwvc3RydWN0ZmllbGQ+IGZpZWxkIGlzIHRoZQorICAgICAgICAgICAgcGl0Y2ggKG9yIHN0cmlkZSkgb2YgdGhlIG5ldyBidWZmZXIuIE1vc3QgZHJpdmVycyB1c2UgMzJiaXQgb3IgNjRiaXQKKyAgICAgICAgICAgIGFsaWduZWQgc3RyaWRlLXZhbHVlcy4gVGhlIDxzdHJ1Y3RmaWVsZD5zaXplPC9zdHJ1Y3RmaWVsZD4gZmllbGQKKyAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBhYnNvbHV0ZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBidWZmZXIuIFRoaXMgY2FuIG5vcm1hbGx5CisgICAgICAgICAgICBhbHNvIGJlIGNvbXB1dGVkIHdpdGgKKyAgICAgICAgICAgIDxlbXBoYXNpcz4oaGVpZ2h0ICogcGl0Y2ggKyB3aWR0aCkgKiBicHAgLyA0PC9lbXBoYXNpcz4uPC9wYXJhPgorCisgICAgICA8cGFyYT5UbyBwcmVwYXJlIHRoZSBidWZmZXIgZm9yCisgICAgICAgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPm1tYXA8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4yPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+CisgICAgICAgICAgICB5b3UgbmVlZCB0byB1c2UgdGhlIDxjb25zdGFudD5EUk1fSU9DVExfTU9ERV9NQVBfRFVNQjwvY29uc3RhbnQ+CisgICAgICAgICAgICBpb2N0bC4gSXQgdGFrZXMgYXMgYXJndW1lbnQgYSBzdHJ1Y3R1cmUgb2YgdHlwZQorICAgICAgICAgICAgPHN0cnVjdG5hbWU+c3RydWN0IGRybV9tb2RlX21hcF9kdW1iPC9zdHJ1Y3RuYW1lPjoKKworPHByb2dyYW1saXN0aW5nPgorc3RydWN0IGRybV9tb2RlX21hcF9kdW1iIHsKKwlfX3UzMiBoYW5kbGU7CisJX191MzIgcGFkOworCisJX191NjQgb2Zmc2V0OworfTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgIFlvdSBuZWVkIHRvIHB1dCB0aGUgZ2VtLWhhbmRsZSB0aGF0IHdhcyBwcmV2aW91c2x5IHJldHJpZXZlZCB2aWEKKyAgICAgICAgICAgIDxjb25zdGFudD5EUk1fSU9DVExfTU9ERV9DUkVBVEVfRFVNQjwvY29uc3RhbnQ+IGludG8gdGhlCisgICAgICAgICAgICA8c3RydWN0ZmllbGQ+aGFuZGxlPC9zdHJ1Y3RmaWVsZD4gZmllbGQuIFRoZQorICAgICAgICAgICAgPHN0cnVjdGZpZWxkPnBhZDwvc3RydWN0ZmllbGQ+IGZpZWxkIGlzIHVudXNlZCBwYWRkaW5nIGFuZCBtdXN0IGJlCisgICAgICAgICAgICB6ZXJvZWQuIEFmdGVyIGNvbXBsZXRpb24sIHRoZSA8c3RydWN0ZmllbGQ+b2Zmc2V0PC9zdHJ1Y3RmaWVsZD4KKyAgICAgICAgICAgIGZpZWxkIHdpbGwgY29udGFpbiBhbiBvZmZzZXQgdGhhdCBjYW4gYmUgdXNlZCB3aXRoCisgICAgICAgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPm1tYXA8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4yPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+CisgICAgICAgICAgICBvbiB0aGUgRFJNIGZpbGUtZGVzY3JpcHRvci48L3BhcmE+CisKKyAgICAgIDxwYXJhPklmIHlvdSBkb24ndCBuZWVkIHlvdXIgZHVtYi1idWZmZXIsIGFueW1vcmUsIHlvdSBoYXZlIHRvIGRlc3Ryb3kgaXQKKyAgICAgICAgICAgIHdpdGggPGNvbnN0YW50PkRSTV9JT0NUTF9NT0RFX0RFU1RST1lfRFVNQjwvY29uc3RhbnQ+LiBJZiB5b3UgY2xvc2UKKyAgICAgICAgICAgIHRoZSBEUk0gZmlsZS1kZXNjcmlwdG9yLCBhbGwgb3BlbiBkdW1iLWJ1ZmZlcnMgYXJlIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgICAgIGRlc3Ryb3llZC4gVGhpcyBpb2N0bCB0YWtlcyBhcyBhcmd1bWVudCBhIHN0cnVjdHVyZSBvZiB0eXBlCisgICAgICAgICAgICA8c3RydWN0bmFtZT5zdHJ1Y3QgZHJtX21vZGVfZGVzdHJveV9kdW1iPC9zdHJ1Y3RuYW1lPjoKKworPHByb2dyYW1saXN0aW5nPgorc3RydWN0IGRybV9tb2RlX2Rlc3Ryb3lfZHVtYiB7CisJX191MzIgaGFuZGxlOworfTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgIFlvdSBvbmx5IG5lZWQgdG8gcHV0IHlvdXIgaGFuZGxlIGludG8gdGhlCisgICAgICAgICAgICA8c3RydWN0ZmllbGQ+aGFuZGxlPC9zdHJ1Y3RmaWVsZD4gZmllbGQuIEFmdGVyIHRoaXMgY2FsbCwgdGhlIGhhbmRsZQorICAgICAgICAgICAgaXMgaW52YWxpZCBhbmQgbWF5IGJlIHJldXNlZCBmb3IgbmV3IGJ1ZmZlcnMgYnkgdGhlIGR1bWItQVBJLjwvcGFyYT4KKworICAgIDwvcmVmc2VjdDI+CisKKyAgICA8cmVmc2VjdDI+CisgICAgICA8dGl0bGU+VFRNPC90aXRsZT4KKyAgICAgIDxwYXJhPjxlbXBoYXNpcz5UVE08L2VtcGhhc2lzPiBzdGFuZHMgZm9yCisgICAgICAgICAgICA8ZW1waGFzaXM+VHJhbnNsYXRpb24gVGFibGUgTWFuYWdlcjwvZW1waGFzaXM+IGFuZCBpcyBhIGdlbmVyaWMKKyAgICAgICAgICAgIG1lbW9yeS1tYW5hZ2VyIHByb3ZpZGVkIGJ5IHRoZSBrZXJuZWwuIEl0IGRvZXMgbm90IHByb3ZpZGUgYSBjb21tb24KKyAgICAgICAgICAgIHVzZXItc3BhY2UgQVBJIHNvIHlvdSBuZWVkIHRvIGxvb2sgYXQgZWFjaCBkcml2ZXIgaW50ZXJmYWNlIGlmIHlvdQorICAgICAgICAgICAgd2FudCB0byB1c2UgaXQuIFNlZSBmb3IgaW5zdGFuY2UgdGhlIHJhZGVvbiBtYW5wYWdlcyBmb3IgbW9yZQorICAgICAgICAgICAgaW5mb3JtYXRpb24gb24gbWVtb3J5LW1hbmFnZW1lbnQgd2l0aCByYWRlb24gYW5kIFRUTS48L3BhcmE+CisgICAgPC9yZWZzZWN0Mj4KKworICAgIDxyZWZzZWN0Mj4KKyAgICAgIDx0aXRsZT5HRU08L3RpdGxlPgorICAgICAgPHBhcmE+PGVtcGhhc2lzPkdFTTwvZW1waGFzaXM+IHN0YW5kcyBmb3IKKyAgICAgICAgICAgIDxlbXBoYXNpcz5HcmFwaGljcyBFeGVjdXRpb24gTWFuYWdlcjwvZW1waGFzaXM+IGFuZCBpcyBhIGdlbmVyaWMgRFJNCisgICAgICAgICAgICBtZW1vcnktbWFuYWdlbWVudCBmcmFtZXdvcmsgaW4gdGhlIGtlcm5lbCwgdGhhdCBpcyB1c2VkIGJ5IG1hbnkKKyAgICAgICAgICAgIGRpZmZlcmVudCBkcml2ZXJzLiBHZW0gaXMgZGVzaWduZWQgdG8gbWFuYWdlIGdyYXBoaWNzIG1lbW9yeSwKKyAgICAgICAgICAgIGNvbnRyb2wgYWNjZXNzIHRvIHRoZSBncmFwaGljcyBkZXZpY2UgZXhlY3V0aW9uIGNvbnRleHQgYW5kIGhhbmRsZQorICAgICAgICAgICAgZXNzZW50aWFsbHkgTlVNQSBlbnZpcm9ubWVudCB1bmlxdWUgdG8gbW9kZXJuIGdyYXBoaWNzIGhhcmR3YXJlLiBHZW0KKyAgICAgICAgICAgIGFsbG93cyBtdWx0aXBsZSBhcHBsaWNhdGlvbnMgdG8gc2hhcmUgZ3JhcGhpY3MgZGV2aWNlIHJlc291cmNlcworICAgICAgICAgICAgd2l0aG91dCB0aGUgbmVlZCB0byBjb25zdGFudGx5IHJlbG9hZCB0aGUgZW50aXJlIGdyYXBoaWNzIGNhcmQuIERhdGEKKyAgICAgICAgICAgIG1heSBiZSBzaGFyZWQgYmV0d2VlbiBtdWx0aXBsZSBhcHBsaWNhdGlvbnMgd2l0aCBnZW0gZW5zdXJpbmcgdGhhdAorICAgICAgICAgICAgdGhlIGNvcnJlY3QgbWVtb3J5IHN5bmNocm9uaXphdGlvbiBvY2N1cnMuPC9wYXJhPgorCisgICAgICA8cGFyYT5HZW0gcHJvdmlkZXMgc2ltcGxlIG1lY2hhbmlzbXMgdG8gbWFuYWdlIGdyYXBoaWNzIGRhdGEgYW5kIGNvbnRyb2wKKyAgICAgICAgICAgIGV4ZWN1dGlvbiBmbG93IHdpdGhpbiB0aGUgbGludXggRFJNIHN1YnN5c3RlbS4gSG93ZXZlciwgZ2VtIGlzIG5vdCBhCisgICAgICAgICAgICBjb21wbGV0ZSBmcmFtZXdvcmsgdGhhdCBpcyBmdWxseSBkcml2ZXIgaW5kZXBlbmRlbnQuIEluc3RlYWQsIGlmCisgICAgICAgICAgICBwcm92aWRlcyBtYW55IGZ1bmN0aW9ucyB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiBtYW55IGRyaXZlcnMsIGJ1dAorICAgICAgICAgICAgZWFjaCBkcml2ZXIgaGFzIHRvIGltcGxlbWVudCBtb3N0IG9mIG1lbW9yeS1tYW5hZ2VtZW50IHdpdGgKKyAgICAgICAgICAgIGRyaXZlci1kZXBlbmRlbnQgaW9jdGxzLiBUaGlzIG1hbnBhZ2UgdHJpZXMgdG8gZGVzY3JpYmUgdGhlCisgICAgICAgICAgICBzZW1hbnRpY3MgKGFuZCBpZiBpdCBhcHBsaWVzLCB0aGUgc3ludGF4KSB0aGF0IGlzIHNoYXJlZCBiZXR3ZWVuIGFsbAorICAgICAgICAgICAgZHJpdmVycyB0aGF0IHVzZSBnZW0uPC9wYXJhPgorCisgICAgICA8cGFyYT5BbGwgR0VNIEFQSXMgYXJlIGRlZmluZWQgYXMKKyAgICAgICAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+aW9jdGw8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4yPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+CisgICAgICAgICAgICBvbiB0aGUgRFJNIGZpbGUgZGVzY3JpcHRvci4gQW4gYXBwbGljYXRpb24gbXVzdCBiZSBhdXRob3JpemVkIHZpYQorICAgICAgICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1BdXRoTWFnaWM8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+CisgICAgICAgICAgICB0byB0aGUgY3VycmVudCBEUk0tTWFzdGVyIHRvIGFjY2VzcyB0aGUgR0VNIHN1YnN5c3RlbS4gQSBkcml2ZXIgdGhhdAorICAgICAgICAgICAgZG9lcyBub3Qgc3VwcG9ydCBnZW0gd2lsbCByZXR1cm4gPGNvbnN0YW50PkVOT0RFVjwvY29uc3RhbnQ+IGZvciBhbGwKKyAgICAgICAgICAgIHRoZXNlIGlvY3Rscy4gSW52YWxpZCBvYmplY3QgaGFuZGxlcyByZXR1cm4KKyAgICAgICAgICAgIDxjb25zdGFudD5FSU5WQUw8L2NvbnN0YW50PiBhbmQgaW52YWxpZCBvYmplY3QgbmFtZXMgcmV0dXJuCisgICAgICAgICAgICA8Y29uc3RhbnQ+RU5PRU5UPC9jb25zdGFudD4uPC9wYXJhPgorCisgICAgICA8cGFyYT5HZW0gcHJvdmlkZXMgZXhwbGljaXQgbWVtb3J5IG1hbmFnZW1lbnQgcHJpbWl0aXZlcy4gU3lzdGVtIHBhZ2VzIGFyZQorICAgICAgICAgICAgYWxsb2NhdGVkIHdoZW4gdGhlIG9iamVjdCBpcyBjcmVhdGVkLCBlaXRoZXIgYXMgdGhlIGZ1bmRhbWVudGFsCisgICAgICAgICAgICBzdG9yYWdlIGZvciBoYXJkd2FyZSB3aGVyZSBzeXN0ZW0gbWVtb3J5IGlzIHVzZWQgYnkgdGhlIGdyYXBoaWNzCisgICAgICAgICAgICBwcm9jZXNzb3IgZGlyZWN0bHksIG9yIGFzIGJhY2tpbmcgc3RvcmUgZm9yIGdyYXBoaWNzLXByb2Nlc3NvcgorICAgICAgICAgICAgcmVzaWRlbnQgbWVtb3J5LjwvcGFyYT4KKworICAgICAgPHBhcmE+T2JqZWN0cyBhcmUgcmVmZXJlbmNlZCBmcm9tIHVzZXItc3BhY2UgdXNpbmcgaGFuZGxlcy4gVGhlc2UgYXJlLCBmb3IKKyAgICAgICAgICAgIGFsbCBpbnRlbnRzIGFuZCBwdXJwb3NlcywgZXF1aXZhbGVudCB0byBmaWxlIGRlc2NyaXB0b3JzIGJ1dCBhdm9pZAorICAgICAgICAgICAgdGhlIG92ZXJoZWFkLiBOZXdlciBrZXJuZWwgZHJpdmVycyBhbHNvIHN1cHBvcnQgdGhlCisgICAgICAgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybS1wcmltZTwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjc8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4KKyAgICAgICAgICAgIGluZnJhc3RydWN0dXJlIHdoaWNoIGNhbiByZXR1cm4gcmVhbCBmaWxlLWRlc2NyaXB0b3IgZm9yIGdlbS1oYW5kbGVzCisgICAgICAgICAgICB1c2luZyB0aGUgbGludXggZG1hLWJ1ZiBBUEkuIE9iamVjdHMgbWF5IGJlIHB1Ymxpc2hlZCB3aXRoIGEgbmFtZSBzbworICAgICAgICAgICAgdGhhdCBvdGhlciBhcHBsaWNhdGlvbnMgYW5kIHByb2Nlc3NlcyBjYW4gYWNjZXNzIHRoZW0uIFRoZSBuYW1lCisgICAgICAgICAgICByZW1haW5zIHZhbGlkIGFzIGxvbmcgYXMgdGhlIG9iamVjdCBleGlzdHMuIEdlbS1vYmplY3RzIGFyZQorICAgICAgICAgICAgcmVmZXJlbmNlIGNvdW50ZWQgaW4gdGhlIGtlcm5lbC4gVGhlIG9iamVjdCBpcyBvbmx5IGRlc3Ryb3llZCB3aGVuCisgICAgICAgICAgICBhbGwgaGFuZGxlcyBmcm9tIHVzZXItc3BhY2Ugd2VyZSBjbG9zZWQuPC9wYXJhPgorCisgICAgICA8cGFyYT5HZW0tYnVmZmVycyBjYW5ub3QgYmUgY3JlYXRlZCB3aXRoIGEgZ2VuZXJpYyBBUEkuIEVhY2ggZHJpdmVyCisgICAgICAgICAgICBwcm92aWRlcyBpdHMgb3duIEFQSSB0byBjcmVhdGUgZ2VtLWJ1ZmZlcnMuIFNlZSBmb3IgZXhhbXBsZQorICAgICAgICAgICAgPGNvbnN0YW50PkRSTV9JOTE1X0dFTV9DUkVBVEU8L2NvbnN0YW50PiwKKyAgICAgICAgICAgIDxjb25zdGFudD5EUk1fTk9VVkVBVV9HRU1fTkVXPC9jb25zdGFudD4gb3IKKyAgICAgICAgICAgIDxjb25zdGFudD5EUk1fUkFERU9OX0dFTV9DUkVBVEU8L2NvbnN0YW50Pi4gRWFjaCBvZiB0aGVzZSBpb2N0bHMKKyAgICAgICAgICAgIHJldHVybnMgYSBnZW0taGFuZGxlIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBkaWZmZXJlbnQgZ2VuZXJpYyBpb2N0bHMuCisgICAgICAgICAgICBUaGUgPGVtcGhhc2lzPmxpYmdibTwvZW1waGFzaXM+IGxpYnJhcnkgZnJvbSB0aGUKKyAgICAgICAgICAgIDxlbXBoYXNpcz5tZXNhM0Q8L2VtcGhhc2lzPiBkaXN0cmlidXRpb24gdHJpZXMgdG8gcHJvdmlkZSBhCisgICAgICAgICAgICBkcml2ZXItaW5kZXBlbmRlbnQgQVBJIHRvIGNyZWF0ZSBnYm0gYnVmZmVycyBhbmQgcmV0cmlldmUgYQorICAgICAgICAgICAgZ2JtLWhhbmRsZSB0byB0aGVtLiBJdCBhbGxvd3MgdG8gY3JlYXRlIGJ1ZmZlcnMgZm9yIGRpZmZlcmVudAorICAgICAgICAgICAgdXNlLWNhc2VzIGluY2x1ZGluZyBzY2Fub3V0LCByZW5kZXJpbmcsIGN1cnNvcnMgYW5kIENQVS1hY2Nlc3MuIFNlZQorICAgICAgICAgICAgdGhlIGxpYmdibSBsaWJyYXJ5IGZvciBtb3JlIGluZm9ybWF0aW9uIG9yIGxvb2sgYXQgdGhlCisgICAgICAgICAgICBkcml2ZXItZGVwZW5kZW50IG1hbi1wYWdlcyAoZm9yIGV4YW1wbGUKKyAgICAgICAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtLWludGVsPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+NzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PgorICAgICAgICAgICAgb3IKKyAgICAgICAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtLXJhZGVvbjwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjc8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4pLjwvcGFyYT4KKworICAgICAgPHBhcmE+R2VtLWJ1ZmZlcnMgY2FuIGJlIGNsb3NlZCB3aXRoIHRoZQorICAgICAgICAgICAgPGNvbnN0YW50PkRSTV9JT0NUTF9HRU1fQ0xPU0U8L2NvbnN0YW50PiBpb2N0bC4gSXQgdGFrZXMgYXMgYXJndW1lbnQKKyAgICAgICAgICAgIGEgc3RydWN0dXJlIG9mIHR5cGUgPHN0cnVjdG5hbWU+c3RydWN0IGRybV9nZW1fY2xvc2U8L3N0cnVjdG5hbWU+OgorCis8cHJvZ3JhbWxpc3Rpbmc+CitzdHJ1Y3QgZHJtX2dlbV9jbG9zZSB7CisJX191MzIgaGFuZGxlOworCV9fdTMyIHBhZDsKK307Cis8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICBUaGUgPHN0cnVjdGZpZWxkPmhhbmRsZTwvc3RydWN0ZmllbGQ+IGZpZWxkIGlzIHRoZSBnZW0taGFuZGxlIHRvIGJlCisgICAgICAgICAgICBjbG9zZWQuIFRoZSA8c3RydWN0ZmllbGQ+cGFkPC9zdHJ1Y3RmaWVsZD4gZmllbGQgaXMgdW51c2VkIHBhZGRpbmcuCisgICAgICAgICAgICBJdCBtdXN0IGJlIHplcm9lZC4gQWZ0ZXIgdGhpcyBjYWxsIHRoZSBnZW0gaGFuZGxlIGNhbm5vdCBiZSB1c2VkIGJ5CisgICAgICAgICAgICB0aGlzIHByb2Nlc3MgYW55bW9yZSBhbmQgbWF5IGJlIHJldXNlZCBmb3IgbmV3IGdlbSBvYmplY3RzIGJ5IHRoZQorICAgICAgICAgICAgZ2VtIEFQSS48L3BhcmE+CisKKyAgICAgIDxwYXJhPklmIHlvdSB3YW50IHRvIHNoYXJlIGdlbS1vYmplY3RzIGJldHdlZW4gZGlmZmVyZW50IHByb2Nlc3NlcywgeW91CisgICAgICAgICAgICBjYW4gY3JlYXRlIGEgbmFtZSBmb3IgdGhlbSBhbmQgcGFzcyB0aGlzIG5hbWUgdG8gb3RoZXIgcHJvY2Vzc2VzCisgICAgICAgICAgICB3aGljaCBjYW4gdGhlbiBvcGVuIHRoaXMgZ2VtLW9iamVjdC4gTmFtZXMgYXJlIGN1cnJlbnRseSAzMmJpdAorICAgICAgICAgICAgaW50ZWdlciBJRHMgYW5kIGhhdmUgbm8gc3BlY2lhbCBwcm90ZWN0aW9uLiBUaGF0IGlzLCBpZiB5b3UgcHV0IGEKKyAgICAgICAgICAgIG5hbWUgb24geW91ciBnZW0tb2JqZWN0LCBldmVyeSBvdGhlciBjbGllbnQgdGhhdCBoYXMgYWNjZXNzIHRvIHRoZQorICAgICAgICAgICAgRFJNIGRldmljZSBhbmQgaXMgYXV0aGVudGljYXRlZCB2aWEKKyAgICAgICAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtQXV0aE1hZ2ljPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PgorICAgICAgICAgICAgdG8gdGhlIGN1cnJlbnQgRFJNLU1hc3RlciwgY2FuIDxlbXBoYXNpcz5ndWVzczwvZW1waGFzaXM+IHRoZSBuYW1lCisgICAgICAgICAgICBhbmQgb3BlbiBvciBhY2Nlc3MgdGhlIGdlbS1vYmplY3QuIElmIHlvdSB3YW50IG1vcmUgZmluZS1ncmFpbmVkCisgICAgICAgICAgICBhY2Nlc3MgY29udHJvbCwgeW91IGNhbiB1c2UgdGhlIG5ldworICAgICAgICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm0tcHJpbWU8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT43PC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+CisgICAgICAgICAgICBBUEkgdG8gcmV0cmlldmUgZmlsZS1kZXNjcmlwdG9ycyBmb3IgZ2VtLWhhbmRsZXMuIFRvIGNyZWF0ZSBhIG5hbWUKKyAgICAgICAgICAgIGZvciBhIGdlbS1oYW5kbGUsIHlvdSB1c2UgdGhlCisgICAgICAgICAgICA8Y29uc3RhbnQ+RFJNX0lPQ1RMX0dFTV9GTElOSzwvY29uc3RhbnQ+IGlvY3RsLiBJdCB0YWtlcyBhcyBhcmd1bWVudAorICAgICAgICAgICAgYSBzdHJ1Y3R1cmUgb2YgdHlwZSA8c3RydWN0bmFtZT5zdHJ1Y3QgZHJtX2dlbV9mbGluazwvc3RydWN0bmFtZT46CisKKzxwcm9ncmFtbGlzdGluZz4KK3N0cnVjdCBkcm1fZ2VtX2ZsaW5rIHsKKwlfX3UzMiBoYW5kbGU7CisJX191MzIgbmFtZTsKK307Cis8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICBZb3UgaGF2ZSB0byBwdXQgeW91ciBoYW5kbGUgaW50byB0aGUKKyAgICAgICAgICAgIDxzdHJ1Y3RmaWVsZD5oYW5kbGU8L3N0cnVjdGZpZWxkPiBmaWVsZC4gQWZ0ZXIgY29tcGxldGlvbiwgdGhlCisgICAgICAgICAgICBrZXJuZWwgaGFzIHB1dCB0aGUgbmV3IHVuaXF1ZSBuYW1lIGludG8gdGhlCisgICAgICAgICAgICA8c3RydWN0ZmllbGQ+bmFtZTwvc3RydWN0ZmllbGQ+IGZpZWxkLiBZb3UgY2FuIG5vdyBwYXNzIHRoaXMgbmFtZSB0bworICAgICAgICAgICAgb3RoZXIgcHJvY2Vzc2VzIHdoaWNoIGNhbiB0aGVuIGltcG9ydCB0aGUgbmFtZSB3aXRoIHRoZQorICAgICAgICAgICAgPGNvbnN0YW50PkRSTV9JT0NUTF9HRU1fT1BFTjwvY29uc3RhbnQ+IGlvY3RsLiBJdCB0YWtlcyBhcyBhcmd1bWVudAorICAgICAgICAgICAgYSBzdHJ1Y3R1cmUgb2YgdHlwZSA8c3RydWN0bmFtZT5zdHJ1Y3QgZHJtX2dlbV9vcGVuPC9zdHJ1Y3RuYW1lPjoKKworPHByb2dyYW1saXN0aW5nPgorc3RydWN0IGRybV9nZW1fb3BlbiB7CisJX191MzIgbmFtZTsKKworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBzaXplOworfTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgIFlvdSBoYXZlIHRvIGZpbGwgaW4gdGhlIDxzdHJ1Y3RmaWVsZD5uYW1lPC9zdHJ1Y3RmaWVsZD4gZmllbGQgd2l0aAorICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGdlbS1vYmplY3QgdGhhdCB5b3Ugd2FudCB0byBvcGVuLiBUaGUga2VybmVsIHdpbGwKKyAgICAgICAgICAgIGZpbGwgaW4gdGhlIDxzdHJ1Y3RmaWVsZD5oYW5kbGU8L3N0cnVjdGZpZWxkPiBhbmQKKyAgICAgICAgICAgIDxzdHJ1Y3RmaWVsZD5zaXplPC9zdHJ1Y3RmaWVsZD4gZmllbGRzIHdpdGggdGhlIG5ldyBoYW5kbGUgYW5kIHNpemUKKyAgICAgICAgICAgIG9mIHRoZSBnZW0tb2JqZWN0LiBZb3UgY2FuIG5vdyBhY2Nlc3MgdGhlIGdlbS1vYmplY3QgdmlhIHRoZSBoYW5kbGUKKyAgICAgICAgICAgIGFzIGlmIHlvdSBjcmVhdGVkIGl0IHdpdGggdGhlIGdlbSBBUEkuPC9wYXJhPgorCisgICAgICA8cGFyYT5CZXNpZGVzIGdlbmVyaWMgYnVmZmVyIG1hbmFnZW1lbnQsIHRoZSBHRU0gQVBJIGRvZXMgbm90IHByb3ZpZGUgYW55CisgICAgICAgICAgICBnZW5lcmljIGFjY2Vzcy4gRWFjaCBkcml2ZXIgaW1wbGVtZW50cyBpdHMgb3duIGZ1bmN0aW9uYWxpdHkgb24gdG9wCisgICAgICAgICAgICBvZiB0aGlzIEFQSS4gVGhpcyBpbmNsdWRlcyBleGVjdXRpb24tYnVmZmVycywgR1RUIG1hbmFnZW1lbnQsCisgICAgICAgICAgICBjb250ZXh0IGNyZWF0aW9uLCBDUFUgYWNjZXNzLCBHUFUgSS9PIGFuZCBtb3JlLiBUaGUgbmV4dAorICAgICAgICAgICAgaGlnaGVyLWxldmVsIEFQSSBpcyA8ZW1waGFzaXM+T3BlbkdMPC9lbXBoYXNpcz4uIFNvIGlmIHlvdSB3YW50IHRvCisgICAgICAgICAgICB1c2UgbW9yZSBHUFUgZmVhdHVyZXMsIHlvdSBzaG91bGQgdXNlIHRoZQorICAgICAgICAgICAgPGVtcGhhc2lzPm1lc2EzRDwvZW1waGFzaXM+IGxpYnJhcnkgdG8gY3JlYXRlIE9wZW5HTCBjb250ZXh0cyBvbiBEUk0KKyAgICAgICAgICAgIGRldmljZXMuIFRoaXMgZG9lcyA8ZW1waGFzaXM+bm90PC9lbXBoYXNpcz4gcmVxdWlyZSBhbnkKKyAgICAgICAgICAgIHdpbmRvd2luZy1zeXN0ZW0gbGlrZSBYMTEsIGJ1dCBjYW4gYWxzbyBiZSBkb25lIG9uIHJhdyBEUk0gZGV2aWNlcy4KKyAgICAgICAgICAgIEhvd2V2ZXIsIHRoaXMgaXMgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIG1hbi1wYWdlLiBZb3UgbWF5IGhhdmUgYQorICAgICAgICAgICAgbG9vayBhdCBvdGhlciBtZXNhM0QgbWFucGFnZXMsIGluY2x1ZGluZyBsaWJnYm0gYW5kIGxpYkVHTC4gMkQKKyAgICAgICAgICAgIHNvZnR3YXJlLXJlbmRlcmluZyAocmVuZGVyaW5nIHdpdGggdGhlIENQVSkgY2FuIGJlIGFjaGlldmVkIHdpdGggdGhlCisgICAgICAgICAgICBkdW1iLWJ1ZmZlci1BUEkgaW4gYSBkcml2ZXItaW5kZXBlbmRlbnQgZmFzaGlvbiwgaG93ZXZlciwgZm9yCisgICAgICAgICAgICBoYXJkd2FyZS1hY2NlbGVyYXRlZCAyRCBvciAzRCByZW5kZXJpbmcgeW91IG11c3QgdXNlIE9wZW5HTC4gQW55CisgICAgICAgICAgICBvdGhlciBBUEkgdGhhdCB0cmllcyB0byBhYnN0cmFjdCB0aGUgZHJpdmVyLWludGVybmFscyB0byBhY2Nlc3MKKyAgICAgICAgICAgIEdFTS1leGVjdXRpb24tYnVmZmVycyBhbmQgb3RoZXIgR1BVIGludGVybmFscywgd291bGQgc2ltcGx5IHJlaW52ZW50CisgICAgICAgICAgICBPcGVuR0wgc28gaXQgaXMgbm90IHByb3ZpZGVkLiBCdXQgaWYgeW91IG5lZWQgbW9yZSBkZXRhaWxlZAorICAgICAgICAgICAgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgZHJpdmVyLCB5b3UgbWF5IGhhdmUgYSBsb29rIGludG8gdGhlCisgICAgICAgICAgICBkcml2ZXItbWFucGFnZXMsIGluY2x1ZGluZworICAgICAgICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm0taW50ZWw8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT43PC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm0tcmFkZW9uPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+NzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PgorICAgICAgICAgICAgYW5kCisgICAgICAgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybS1ub3V2ZWF1PC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+NzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5Pi4KKyAgICAgICAgICAgIEhvd2V2ZXIsIHRoZQorICAgICAgICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm0tcHJpbWU8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT43PC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+CisgICAgICAgICAgICBpbmZyYXN0cnVjdHVyZSBhbmQgdGhlIGdlbmVyaWMgZ2VtIEFQSSBhcyBkZXNjcmliZWQgaGVyZSBhbGxvdworICAgICAgICAgICAgZGlzcGxheS1tYW5hZ2VycyB0byBoYW5kbGUgZ3JhcGhpY3MtYnVmZmVycyBhbmQgcmVuZGVyLWNsaWVudHMKKyAgICAgICAgICAgIHdpdGhvdXQgYW55IGRlZXBlciBrbm93bGVkZ2Ugb2YgdGhlIEdQVSB0aGF0IGlzIHVzZWQuIE1vcmVvdmVyLCBpdAorICAgICAgICAgICAgYWxsb3dzIHRvIG1vdmUgb2JqZWN0cyBiZXR3ZWVuIEdQVXMgYW5kIGltcGxlbWVudCBjb21wbGV4CisgICAgICAgICAgICBkaXNwbGF5LXNlcnZlcnMgdGhhdCBkb24ndCBkbyBhbnkgcmVuZGVyaW5nIG9uIHRoZWlyIG93bi4gU2VlIGl0cworICAgICAgICAgICAgbWFuLXBhZ2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wYXJhPgorICAgIDwvcmVmc2VjdDI+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxPgorICAgIDx0aXRsZT5FeGFtcGxlczwvdGl0bGU+CisgICAgICA8cGFyYT5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgZXhhbXBsZXMgZm9yIGJhc2ljIG1lbW9yeS1tYW5hZ2VtZW50CisgICAgICAgICAgICB0YXNrcy48L3BhcmE+CisKKyAgICA8cmVmc2VjdDI+CisgICAgICA8dGl0bGU+RHVtYi1CdWZmZXJzPC90aXRsZT4KKyAgICAgICAgPHBhcmE+VGhpcyBleGFtcGxlcyBzaG93cyBob3cgdG8gY3JlYXRlIGEgZHVtYi1idWZmZXIgdmlhIHRoZSBnZW5lcmljCisgICAgICAgICAgICAgIERSTSBBUEkuIFRoaXMgaXMgZHJpdmVyLWluZGVwZW5kZW50IChhcyBsb25nIGFzIHRoZSBkcml2ZXIKKyAgICAgICAgICAgICAgc3VwcG9ydHMgZHVtYi1idWZmZXJzKSBhbmQgcHJvdmlkZXMgbWVtb3J5LW1hcHBlZCBidWZmZXJzIHRoYXQgY2FuCisgICAgICAgICAgICAgIGJlIHVzZWQgZm9yIHNjYW5vdXQuIFRoaXMgZXhhbXBsZSBjcmVhdGVzIGEgZnVsbC1IRCAxOTIweDEwODAKKyAgICAgICAgICAgICAgYnVmZmVyIHdpdGggMzIgYml0cy1wZXItcGl4ZWwgYW5kIGEgY29sb3ItZGVwdGggb2YgMjQgYml0cy4gVGhlCisgICAgICAgICAgICAgIGJ1ZmZlciBpcyB0aGVuIGJvdW5kIHRvIGEgZnJhbWVidWZmZXIgd2hpY2ggY2FuIGJlIHVzZWQgZm9yCisgICAgICAgICAgICAgIHNjYW5vdXQgd2l0aCB0aGUgS01TIEFQSSAoc2VlCisgICAgICAgICAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtLWttczwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjc8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4pLjwvcGFyYT4KKworPHByb2dyYW1saXN0aW5nPgorc3RydWN0IGRybV9tb2RlX2NyZWF0ZV9kdW1iIGNyZXE7CitzdHJ1Y3QgZHJtX21vZGVfZGVzdHJveV9kdW1iIGRyZXE7CitzdHJ1Y3QgZHJtX21vZGVfbWFwX2R1bWIgbXJlcTsKK3VpbnQzMl90IGZiOworaW50IHJldDsKK3ZvaWQgKm1hcDsKKworLyogY3JlYXRlIGR1bWIgYnVmZmVyICovCittZW1zZXQoJmFtcDtjcmVxLCAwLCBzaXplb2YoY3JlcSkpOworY3JlcS53aWR0aCA9IDE5MjA7CitjcmVxLmhlaWdodCA9IDEwODA7CitjcmVxLmJwcCA9IDMyOworcmV0ID0gZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9NT0RFX0NSRUFURV9EVU1CLCAmYW1wO2NyZXEpOworaWYgKHJldCAmbHQ7IDApIHsKKwkvKiBidWZmZXIgY3JlYXRpb24gZmFpbGVkOyBzZWUgImVycm5vIiBmb3IgbW9yZSBlcnJvciBjb2RlcyAqLworCS4uLgorfQorLyogY3JlcS5waXRjaCwgY3JlcS5oYW5kbGUgYW5kIGNyZXEuc2l6ZSBhcmUgZmlsbGVkIGJ5IHRoaXMgaW9jdGwgd2l0aAorICogdGhlIHJlcXVlc3RlZCB2YWx1ZXMgYW5kIGNhbiBiZSB1c2VkIG5vdy4gKi8KKworLyogY3JlYXRlIGZyYW1lYnVmZmVyIG9iamVjdCBmb3IgdGhlIGR1bWItYnVmZmVyICovCityZXQgPSBkcm1Nb2RlQWRkRkIoZmQsIDE5MjAsIDEwODAsIDI0LCAzMiwgY3JlcS5waXRjaCwgY3JlcS5oYW5kbGUsICZhbXA7ZmIpOworaWYgKHJldCkgeworCS8qIGZyYW1lIGJ1ZmZlciBjcmVhdGlvbiBmYWlsZWQ7IHNlZSAiZXJybm8iICovCisJLi4uCit9CisvKiB0aGUgZnJhbWVidWZmZXIgImZiIiBjYW4gbm93IHVzZWQgZm9yIHNjYW5vdXQgd2l0aCBLTVMgKi8KKworLyogcHJlcGFyZSBidWZmZXIgZm9yIG1lbW9yeSBtYXBwaW5nICovCittZW1zZXQoJmFtcDttcmVxLCAwLCBzaXplb2YobXJlcSkpOworbXJlcS5oYW5kbGUgPSBjcmVxLmhhbmRsZTsKK3JldCA9IGRybUlvY3RsKGZkLCBEUk1fSU9DVExfTU9ERV9NQVBfRFVNQiwgJmFtcDttcmVxKTsKK2lmIChyZXQpIHsKKwkvKiBEUk0gYnVmZmVyIHByZXBhcmF0aW9uIGZhaWxlZDsgc2VlICJlcnJubyIgKi8KKwkuLi4KK30KKy8qIG1yZXEub2Zmc2V0IG5vdyBjb250YWlucyB0aGUgbmV3IG9mZnNldCB0aGF0IGNhbiBiZSB1c2VkIHdpdGggbW1hcCgpICovCisKKy8qIHBlcmZvcm0gYWN0dWFsIG1lbW9yeSBtYXBwaW5nICovCittYXAgPSBtbWFwKDAsIGNyZXEuc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQsIG1yZXEub2Zmc2V0KTsKK2lmIChtYXAgPT0gTUFQX0ZBSUxFRCkgeworCS8qIG1lbW9yeS1tYXBwaW5nIGZhaWxlZDsgc2VlICJlcnJubyIgKi8KKwkuLi4KK30KKworLyogY2xlYXIgdGhlIGZyYW1lYnVmZmVyIHRvIDAgKi8KK21lbXNldChtYXAsIDAsIGNyZXEuc2l6ZSk7Cis8L3Byb2dyYW1saXN0aW5nPgorCisgICAgPC9yZWZzZWN0Mj4KKworICA8L3JlZnNlY3QxPgorCisgIDxyZWZzZWN0MT4KKyAgICA8dGl0bGU+UmVwb3J0aW5nIEJ1Z3M8L3RpdGxlPgorICAgIDxwYXJhPkJ1Z3MgaW4gdGhpcyBtYW51YWwgc2hvdWxkIGJlIHJlcG9ydGVkIHRvCisgICAgICBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1EUkkmYW1wO2NvbXBvbmVudD1saWJkcm0KKyAgICAgIHVuZGVyIHRoZSAiRFJJIiBwcm9kdWN0LCBjb21wb25lbnQgImxpYmRybSI8L3BhcmE+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxPgorICAgIDx0aXRsZT5TZWUgQWxzbzwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybTwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjc8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4sCisgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybS1rbXM8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT43PC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm0tcHJpbWU8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT43PC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1BdmFpbGFibGU8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1PcGVuPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PiwKKyAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtLWludGVsPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+NzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PiwKKyAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtLXJhZGVvbjwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjc8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4sCisgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybS1ub3V2ZWF1PC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+NzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PgorICAgIDwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKzwvcmVmZW50cnk+CmRpZmYgLS1naXQgYS9tYW4vZHJtLnhtbCBiL21hbi9kcm0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNTU5NjYKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vZHJtLnhtbApAQCAtMCwwICsxLDEzNyBAQAorPD94bWwgdmVyc2lvbj0nMS4wJz8+IDwhLS0qLW54bWwtKi0tPgorPCFET0NUWVBFIHJlZmVudHJ5IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC4yLy9FTiIKKyAgICAgICAgICAiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjIvZG9jYm9va3guZHRkIj4KKworPCEtLQorICBXcml0dGVuIDIwMTIgYnkgRGF2aWQgSGVycm1hbm4gPGRoLmhlcnJtYW5uQGdvb2dsZW1haWwuY29tPgorICBEZWRpY2F0ZWQgdG8gdGhlIFB1YmxpYyBEb21haW4KKy0tPgorCis8cmVmZW50cnkgaWQ9ImRybSI+CisgIDxyZWZlbnRyeWluZm8+CisgICAgPHRpdGxlPkRpcmVjdCBSZW5kZXJpbmcgTWFuYWdlcjwvdGl0bGU+CisgICAgPHByb2R1Y3RuYW1lPmxpYmRybTwvcHJvZHVjdG5hbWU+CisgICAgPGRhdGU+U2VwdGVtYmVyIDIwMTI8L2RhdGU+CisgICAgPGF1dGhvcmdyb3VwPgorICAgICAgPGF1dGhvcj4KKyAgICAgICAgPGNvbnRyaWI+RGV2ZWxvcGVyPC9jb250cmliPgorICAgICAgICA8Zmlyc3RuYW1lPkRhdmlkPC9maXJzdG5hbWU+CisgICAgICAgIDxzdXJuYW1lPkhlcnJtYW5uPC9zdXJuYW1lPgorICAgICAgICA8ZW1haWw+ZGguaGVycm1hbm5AZ29vZ2xlbWFpbC5jb208L2VtYWlsPgorICAgICAgPC9hdXRob3I+CisgICAgPC9hdXRob3Jncm91cD4KKyAgPC9yZWZlbnRyeWluZm8+CisKKyAgPHJlZm1ldGE+CisgICAgPHJlZmVudHJ5dGl0bGU+ZHJtPC9yZWZlbnRyeXRpdGxlPgorICAgIDxtYW52b2xudW0+NzwvbWFudm9sbnVtPgorICA8L3JlZm1ldGE+CisKKyAgPHJlZm5hbWVkaXY+CisgICAgPHJlZm5hbWU+ZHJtPC9yZWZuYW1lPgorICAgIDxyZWZwdXJwb3NlPkRpcmVjdCBSZW5kZXJpbmcgTWFuYWdlcjwvcmVmcHVycG9zZT4KKyAgPC9yZWZuYW1lZGl2PgorCisgIDxyZWZzeW5vcHNpc2Rpdj4KKyAgICA8ZnVuY3N5bm9wc2lzPgorICAgICAgPGZ1bmNzeW5vcHNpc2luZm8+I2luY2x1ZGUgJmx0O3hmODZkcm0uaCZndDs8L2Z1bmNzeW5vcHNpc2luZm8+CisgICAgPC9mdW5jc3lub3BzaXM+CisgIDwvcmVmc3lub3BzaXNkaXY+CisKKyAgPHJlZnNlY3QxPgorICAgIDx0aXRsZT5EZXNjcmlwdGlvbjwvdGl0bGU+CisgICAgPHBhcmE+VGhlIDxlbXBoYXNpcz5EaXJlY3QgUmVuZGVyaW5nIE1hbmFnZXI8L2VtcGhhc2lzPiAoRFJNKSBpcyBhIGZyYW1ld29yaworICAgICAgICAgIHRvIG1hbmFnZSA8ZW1waGFzaXM+R3JhcGhpY3MgUHJvY2Vzc2luZyBVbml0czwvZW1waGFzaXM+IChHUFVzKS4gSXQgaXMKKyAgICAgICAgICBkZXNpZ25lZCB0byBzdXBwb3J0IHRoZSBuZWVkcyBvZiBjb21wbGV4IGdyYXBoaWNzIGRldmljZXMsIHVzdWFsbHkKKyAgICAgICAgICBjb250YWluaW5nIHByb2dyYW1tYWJsZSBwaXBlbGluZXMgd2VsbCBzdWl0ZWQgdG8gM0QgZ3JhcGhpY3MKKyAgICAgICAgICBhY2NlbGVyYXRpb24uIEZ1cnRoZXJtb3JlLCBpdCBpcyByZXNwb25zaWJsZSBmb3IgbWVtb3J5IG1hbmFnZW1lbnQsCisgICAgICAgICAgaW50ZXJydXB0IGhhbmRsaW5nIGFuZCBETUEgdG8gcHJvdmlkZSBhIHVuaWZvcm0gaW50ZXJmYWNlIHRvCisgICAgICAgICAgYXBwbGljYXRpb25zLjwvcGFyYT4KKworICAgIDxwYXJhPkluIGVhcmxpZXIgZGF5cywgdGhlIGtlcm5lbCBmcmFtZXdvcmsgd2FzIHNvbGVseSB1c2VkIHRvIHByb3ZpZGUgcmF3CisgICAgICAgICAgaGFyZHdhcmUgYWNjZXNzIHRvIHByaXZpbGVkZ2VkIHVzZXItc3BhY2UgcHJvY2Vzc2VzIHdoaWNoIGltcGxlbWVudAorICAgICAgICAgIGFsbCB0aGUgaGFyZHdhcmUgYWJzdHJhY3Rpb24gbGF5ZXJzLiBCdXQgbW9yZSBhbmQgbW9yZSB0YXNrcyB3ZXJlCisgICAgICAgICAgbW92ZWQgaW50byB0aGUga2VybmVsLiBBbGwgdGhlc2UgaW50ZXJmYWNlcyBhcmUgYmFzZWQgb24KKyAgICAgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmlvY3RsPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MjwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PgorICAgICAgICAgIGNvbW1hbmRzIG9uIHRoZSBEUk0gY2hhcmFjdGVyIGRldmljZS4gVGhlIDxlbXBoYXNpcz5saWJkcm08L2VtcGhhc2lzPgorICAgICAgICAgIGxpYnJhcnkgcHJvdmlkZXMgd3JhcHBlcnMgZm9yIHRoZXNlIHN5c3RlbS1jYWxscyBhbmQgbWFueSBoZWxwZXJzIHRvCisgICAgICAgICAgc2ltcGxpZnkgdGhlIEFQSS48L3BhcmE+CisKKyAgICA8cGFyYT5XaGVuIGEgR1BVIGlzIGRldGVjdGVkLCB0aGUgRFJNIHN5c3RlbSBsb2FkcyBhIGRyaXZlciBmb3IgdGhlIGRldGVjdGVkCisgICAgICAgICAgaGFyZHdhcmUgdHlwZS4gRWFjaCBjb25uZWN0ZWQgR1BVIGlzIHRoZW4gcHJlc2VudGVkIHRvIHVzZXItc3BhY2UgdmlhCisgICAgICAgICAgYSBjaGFyYWN0ZXItZGV2aWNlIHRoYXQgaXMgdXN1YWxseSBhdmFpbGFibGUgYXMKKyAgICAgICAgICA8ZmlsZW5hbWU+L2Rldi9kcmkvY2FyZDA8L2ZpbGVuYW1lPiBhbmQgY2FuIGJlIGFjY2Vzc2VkIHdpdGgKKyAgICAgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPm9wZW48L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4yPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+CisgICAgICAgICAgYW5kCisgICAgICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5jbG9zZTwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjI8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4uCisgICAgICAgICAgSG93ZXZlciwgaXQgc3RpbGwgZGVwZW5kcyBvbiB0aGUgZ3JhcGljcyBkcml2ZXIgd2hpY2ggaW50ZXJmYWNlcyBhcmUKKyAgICAgICAgICBhdmFpbGFibGUgb24gdGhlc2UgZGV2aWNlcy4gSWYgYW4gaW50ZXJmYWNlIGlzIG5vdCBhdmFpbGFibGUsIHRoZQorICAgICAgICAgIHN5c2NhbGxzIHdpbGwgZmFpbCB3aXRoIDxsaXRlcmFsPkVJTlZBTDwvbGl0ZXJhbD4uPC9wYXJhPgorCisgICAgPHJlZnNlY3QyPgorICAgICAgPHRpdGxlPkF1dGhlbnRpY2F0aW9uPC90aXRsZT4KKyAgICAgIDxwYXJhPkFsbCBEUk0gZGV2aWNlcyBwcm92aWRlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMuIE9ubHkgYSBEUk0tTWFzdGVyCisgICAgICAgICAgICBpcyBhbGxvd2VkIHRvIHBlcmZvcm0gbW9kZS1zZXR0aW5nIG9yIG1vZGlmeSBjb3JlIHN0YXRlIGFuZCBvbmx5IG9uZQorICAgICAgICAgICAgdXNlciBjYW4gYmUgRFJNLU1hc3RlciBhdCBhIHRpbWUuIFNlZQorICAgICAgICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1TZXRNYXN0ZXI8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+CisgICAgICAgICAgICBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGJlY29tZSBEUk0tTWFzdGVyIGFuZCB3aGF0IHRoZSBsaW1pdGF0aW9ucworICAgICAgICAgICAgYXJlLiBPdGhlciBEUk0gdXNlcnMgY2FuIGJlIGF1dGhlbnRpY2F0ZWQgdG8gdGhlIERSTS1NYXN0ZXIgdmlhCisgICAgICAgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybUF1dGhNYWdpYzwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjM8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4KKyAgICAgICAgICAgIHNvIHRoZXkgY2FuIHBlcmZvcm0gYnVmZmVyIGFsbG9jYXRpb25zIGFuZCByZW5kZXJpbmcuPC9wYXJhPgorICAgIDwvcmVmc2VjdDI+CisKKyAgICA8cmVmc2VjdDI+CisgICAgICA8dGl0bGU+TW9kZS1TZXR0aW5nPC90aXRsZT4KKyAgICAgIDxwYXJhPk1hbmFnaW5nIGNvbm5lY3RlZCBtb25pdG9ycyBhbmQgZGlzcGxheXMgYW5kIGNoYW5naW5nIHRoZSBjdXJyZW50CisgICAgICAgICAgICBtb2RlcyBpcyBjYWxsZWQgPGVtcGhhc2lzPk1vZGUtU2V0dGluZzwvZW1waGFzaXM+LiBUaGlzIGlzCisgICAgICAgICAgICByZXN0cmljdGVkIHRvIHRoZSBjdXJyZW50IERSTS1NYXN0ZXIuIEhpc3RvcmljYWxseSwgdGhpcyB3YXMKKyAgICAgICAgICAgIGltcGxlbWVudGVkIGluIHVzZXItc3BhY2UsIGJ1dCBuZXcgRFJNIGRyaXZlcnMgaW1wbGVtZW50IGEga2VybmVsCisgICAgICAgICAgICBpbnRlcmZhY2UgdG8gcGVyZm9ybSBtb2RlLXNldHRpbmcgY2FsbGVkCisgICAgICAgICAgICA8ZW1waGFzaXM+S2VybmVsIE1vZGUgU2V0dGluZzwvZW1waGFzaXM+IChLTVMpLiBJZiB5b3VyCisgICAgICAgICAgICBoYXJkd2FyZS1kcml2ZXIgc3VwcG9ydHMgaXQsIHlvdSBjYW4gdXNlIHRoZSBLTVMgQVBJIHByb3ZpZGVkIGJ5CisgICAgICAgICAgICBEUk0uIFRoaXMgaW5jbHVkZXMgYWxsb2NhdGluZyBmcmFtZWJ1ZmZlcnMsIHNlbGVjdGluZyBtb2RlcyBhbmQKKyAgICAgICAgICAgIG1hbmFnaW5nIENSVENzIGFuZCBlbmNvZGVycy4gU2VlCisgICAgICAgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybS1rbXM8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT43PC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+CisgICAgICAgICAgICBmb3IgbW9yZS48L3BhcmE+CisgICAgPC9yZWZzZWN0Mj4KKworICAgIDxyZWZzZWN0Mj4KKyAgICAgIDx0aXRsZT5NZW1vcnkgTWFuYWdlbWVudDwvdGl0bGU+CisgICAgICA8cGFyYT5UaGUgbW9zdCBzb3BoaXN0aWNhdGVkIHRhc2tzIGZvciBHUFVzIHRvZGF5IGlzIG1hbmFnaW5nIG1lbW9yeQorICAgICAgICAgICAgb2JqZWN0cy4gVGV4dHVyZXMsIGZyYW1lYnVmZmVycywgY29tbWFuZC1idWZmZXJzIGFuZCBhbGwgb3RoZXIga2luZHMKKyAgICAgICAgICAgIG9mIGNvbW1hbmRzIGZvciB0aGUgR1BVIGhhdmUgdG8gYmUgc3RvcmVkIGluIG1lbW9yeS4gVGhlIERSTSBkcml2ZXIKKyAgICAgICAgICAgIHRha2VzIGNhcmUgb2YgbWFuYWdpbmcgYWxsIG1lbW9yeSBvYmplY3RzLCBmbHVzaGluZyBjYWNoZXMsCisgICAgICAgICAgICBzeW5jaHJvbml6aW5nIGFjY2VzcyBhbmQgcHJvdmlkaW5nIENQVSBhY2Nlc3MgdG8gR1BVIG1lbW9yeS4gQWxsCisgICAgICAgICAgICBtZW1vcnkgbWFuYWdlbWVudCBpcyBoYXJkd2FyZSBkcml2ZXIgZGVwZW5kZW50LiBIb3dldmVyLCB0d28gZ2VuZXJpYworICAgICAgICAgICAgZnJhbWV3b3JrcyBhcmUgYXZhaWxhYmxlIHRoYXQgYXJlIHVzZWQgYnkgbW9zdCBEUk0gZHJpdmVycy4gVGhlc2UKKyAgICAgICAgICAgIGFyZSB0aGUgPGVtcGhhc2lzPlRyYW5zbGF0aW9uIFRhYmxlIE1hbmFnZXI8L2VtcGhhc2lzPiAoVFRNKSBhbmQgdGhlCisgICAgICAgICAgICA8ZW1waGFzaXM+R3JhcGhpY3MgRXhlY3V0aW9uIE1hbmFnZXI8L2VtcGhhc2lzPiAoR0VNKS4gVGhleSBwcm92aWRlCisgICAgICAgICAgICBnZW5lcmljIEFQSXMgdG8gY3JlYXRlLCBkZXN0cm95IGFuZCBhY2Nlc3MgYnVmZmVycyBmcm9tIHVzZXItc3BhY2UuCisgICAgICAgICAgICBIb3dldmVyLCB0aGVyZSBhcmUgc3RpbGwgbWFueSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBkcml2ZXJzIHNvCisgICAgICAgICAgICBkcml2ZXItZGVwZWRlbnQgY29kZSBpcyBzdGlsbCBuZWVkZWQuIE1hbnkgaGVscGVycyBhcmUgcHJvdmlkZWQgaW4KKyAgICAgICAgICAgIDxlbXBoYXNpcz5saWJnYm08L2VtcGhhc2lzPiAoR3JhcGhpY3MgQnVmZmVyIE1hbmFnZXIpIGZyb20gdGhlCisgICAgICAgICAgICA8ZW1waGFzaXM+bWVzYS1wcm9qZWN0PC9lbXBoYXNpcz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERSTQorICAgICAgICAgICAgbWVtb3J5LW1hbmFnZW1lbnQsIHNlZQorICAgICAgICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm0tbWVtb3J5PC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+NzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5Pi48L3BhcmE+CisgICAgPC9yZWZzZWN0Mj4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPlJlcG9ydGluZyBCdWdzPC90aXRsZT4KKyAgICA8cGFyYT5CdWdzIGluIHRoaXMgbWFudWFsIHNob3VsZCBiZSByZXBvcnRlZCB0bworICAgICAgaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9lbnRlcl9idWcuY2dpP3Byb2R1Y3Q9RFJJJmFtcDtjb21wb25lbnQ9bGliZHJtCisgICAgICB1bmRlciB0aGUgIkRSSSIgcHJvZHVjdCwgY29tcG9uZW50ICJsaWJkcm0iPC9wYXJhPgorICA8L3JlZnNlY3QxPgorCisgIDxyZWZzZWN0MT4KKyAgICA8dGl0bGU+U2VlIEFsc288L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm0ta21zPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+NzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PiwKKyAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtLW1lbW9yeTwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjc8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4sCisgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybVNldE1hc3RlcjwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjM8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4sCisgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybUF1dGhNYWdpYzwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjM8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4sCisgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybUF2YWlsYWJsZTwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjM8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4sCisgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybU9wZW48L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+CisgICAgPC9wYXJhPgorICA8L3JlZnNlY3QxPgorPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL21hbi9kcm1BdmFpbGFibGUueG1sIGIvbWFuL2RybUF2YWlsYWJsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU1ZDc4NwotLS0gL2Rldi9udWxsCisrKyBiL21hbi9kcm1BdmFpbGFibGUueG1sCkBAIC0wLDAgKzEsNzUgQEAKKzw/eG1sIHZlcnNpb249JzEuMCc/PiA8IS0tKi1ueG1sLSotLT4KKzwhRE9DVFlQRSByZWZlbnRyeSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMi8vRU4iCisgICAgICAgICAgImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC4yL2RvY2Jvb2t4LmR0ZCI+CisKKzwhLS0KKyAgV3JpdHRlbiAyMDEyIGJ5IERhdmlkIEhlcnJtYW5uIDxkaC5oZXJybWFubkBnb29nbGVtYWlsLmNvbT4KKyAgRGVkaWNhdGVkIHRvIHRoZSBQdWJsaWMgRG9tYWluCistLT4KKworPHJlZmVudHJ5IGlkPSJkcm1BdmFpbGFibGUiPgorICA8cmVmZW50cnlpbmZvPgorICAgIDx0aXRsZT5EaXJlY3QgUmVuZGVyaW5nIE1hbmFnZXI8L3RpdGxlPgorICAgIDxwcm9kdWN0bmFtZT5saWJkcm08L3Byb2R1Y3RuYW1lPgorICAgIDxkYXRlPlNlcHRlbWJlciAyMDEyPC9kYXRlPgorICAgIDxhdXRob3Jncm91cD4KKyAgICAgIDxhdXRob3I+CisgICAgICAgIDxjb250cmliPkRldmVsb3BlcjwvY29udHJpYj4KKyAgICAgICAgPGZpcnN0bmFtZT5EYXZpZDwvZmlyc3RuYW1lPgorICAgICAgICA8c3VybmFtZT5IZXJybWFubjwvc3VybmFtZT4KKyAgICAgICAgPGVtYWlsPmRoLmhlcnJtYW5uQGdvb2dsZW1haWwuY29tPC9lbWFpbD4KKyAgICAgIDwvYXV0aG9yPgorICAgIDwvYXV0aG9yZ3JvdXA+CisgIDwvcmVmZW50cnlpbmZvPgorCisgIDxyZWZtZXRhPgorICAgIDxyZWZlbnRyeXRpdGxlPmRybUF2YWlsYWJsZTwvcmVmZW50cnl0aXRsZT4KKyAgICA8bWFudm9sbnVtPjM8L21hbnZvbG51bT4KKyAgPC9yZWZtZXRhPgorCisgIDxyZWZuYW1lZGl2PgorICAgIDxyZWZuYW1lPmRybUF2YWlsYWJsZTwvcmVmbmFtZT4KKyAgICA8cmVmcHVycG9zZT5kZXRlcm1pbmUgd2hldGhlciBhIERSTSBrZXJuZWwgZHJpdmVyIGhhcyBiZWVuCisgICAgICAgICAgICAgICAgbG9hZGVkPC9yZWZwdXJwb3NlPgorICA8L3JlZm5hbWVkaXY+CisKKyAgPHJlZnN5bm9wc2lzZGl2PgorICAgIDxmdW5jc3lub3BzaXM+CisKKyAgICAgIDxmdW5jc3lub3BzaXNpbmZvPiNpbmNsdWRlICZsdDt4Zjg2ZHJtLmgmZ3Q7PC9mdW5jc3lub3BzaXNpbmZvPgorCisgICAgICA8ZnVuY3Byb3RvdHlwZT4KKyAgICAgICAgPGZ1bmNkZWY+aW50IDxmdW5jdGlvbj5kcm1BdmFpbGFibGU8L2Z1bmN0aW9uPjwvZnVuY2RlZj4KKyAgICAgICAgPHBhcmFtZGVmPnZvaWQ8L3BhcmFtZGVmPgorICAgICAgPC9mdW5jcHJvdG90eXBlPgorCisgICAgPC9mdW5jc3lub3BzaXM+CisgIDwvcmVmc3lub3BzaXNkaXY+CisKKyAgPHJlZnNlY3QxPgorICAgIDx0aXRsZT5EZXNjcmlwdGlvbjwvdGl0bGU+CisgICAgPHBhcmE+PGZ1bmN0aW9uPmRybUF2YWlsYWJsZTwvZnVuY3Rpb24+IGFsbG93cyB0aGUgY2FsbGVyIHRvIGRldGVybWluZQorICAgICAgICAgIHdoZXRoZXIgYSBrZXJuZWwgRFJNIGRyaXZlciBpcyBsb2FkZWQuPC9wYXJhPgorICA8L3JlZnNlY3QxPgorCisgIDxyZWZzZWN0MT4KKyAgICA8dGl0bGU+UmV0dXJuIFZhbHVlPC90aXRsZT4KKyAgICA8cGFyYT48ZnVuY3Rpb24+ZHJtQXZhaWxhYmxlPC9mdW5jdGlvbj4gcmV0dXJucyAxIGlmIGEgRFJNIGRyaXZlciBpcworICAgICAgICAgIGN1cnJlbnRseSBsb2FkZWQuIE90aGVyd2lzZSAwIGlzIHJldHVybmVkLjwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPlJlcG9ydGluZyBCdWdzPC90aXRsZT4KKyAgICA8cGFyYT5CdWdzIGluIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHJlcG9ydGVkIHRvCisgICAgICBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1EUkkmYW1wO2NvbXBvbmVudD1saWJkcm0KKyAgICAgIHVuZGVyIHRoZSAiRFJJIiBwcm9kdWN0LCBjb21wb25lbnQgImxpYmRybSI8L3BhcmE+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxPgorICAgIDx0aXRsZT5TZWUgQWxzbzwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybTwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjc8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4sCisgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybU9wZW48L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+CisgICAgPC9wYXJhPgorICA8L3JlZnNlY3QxPgorPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL21hbi9kcm1IYW5kbGVFdmVudC54bWwgYi9tYW4vZHJtSGFuZGxlRXZlbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMzA0NDIKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vZHJtSGFuZGxlRXZlbnQueG1sCkBAIC0wLDAgKzEsMTAyIEBACis8P3htbCB2ZXJzaW9uPScxLjAnPz4gPCEtLSotbnhtbC0qLS0+Cis8IURPQ1RZUEUgcmVmZW50cnkgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjIvL0VOIgorICAgICAgICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMi9kb2Nib29reC5kdGQiPgorCis8IS0tCisgIFdyaXR0ZW4gMjAxMiBieSBEYXZpZCBIZXJybWFubiA8ZGguaGVycm1hbm5AZ29vZ2xlbWFpbC5jb20+CisgIERlZGljYXRlZCB0byB0aGUgUHVibGljIERvbWFpbgorLS0+CisKKzxyZWZlbnRyeSBpZD0iZHJtSGFuZGxlRXZlbnQiPgorICA8cmVmZW50cnlpbmZvPgorICAgIDx0aXRsZT5EaXJlY3QgUmVuZGVyaW5nIE1hbmFnZXI8L3RpdGxlPgorICAgIDxwcm9kdWN0bmFtZT5saWJkcm08L3Byb2R1Y3RuYW1lPgorICAgIDxkYXRlPlNlcHRlbWJlciAyMDEyPC9kYXRlPgorICAgIDxhdXRob3Jncm91cD4KKyAgICAgIDxhdXRob3I+CisgICAgICAgIDxjb250cmliPkRldmVsb3BlcjwvY29udHJpYj4KKyAgICAgICAgPGZpcnN0bmFtZT5EYXZpZDwvZmlyc3RuYW1lPgorICAgICAgICA8c3VybmFtZT5IZXJybWFubjwvc3VybmFtZT4KKyAgICAgICAgPGVtYWlsPmRoLmhlcnJtYW5uQGdvb2dsZW1haWwuY29tPC9lbWFpbD4KKyAgICAgIDwvYXV0aG9yPgorICAgIDwvYXV0aG9yZ3JvdXA+CisgIDwvcmVmZW50cnlpbmZvPgorCisgIDxyZWZtZXRhPgorICAgIDxyZWZlbnRyeXRpdGxlPmRybUhhbmRsZUV2ZW50PC9yZWZlbnRyeXRpdGxlPgorICAgIDxtYW52b2xudW0+MzwvbWFudm9sbnVtPgorICA8L3JlZm1ldGE+CisKKyAgPHJlZm5hbWVkaXY+CisgICAgPHJlZm5hbWU+ZHJtSGFuZGxlRXZlbnQ8L3JlZm5hbWU+CisgICAgPHJlZnB1cnBvc2U+cmVhZCBhbmQgcHJvY2VzcyBwZW5kaW5nIERSTSBldmVudHM8L3JlZnB1cnBvc2U+CisgIDwvcmVmbmFtZWRpdj4KKworICA8cmVmc3lub3BzaXNkaXY+CisKKyAgICA8ZnVuY3N5bm9wc2lzPgorICAgICAgPGZ1bmNzeW5vcHNpc2luZm8+I2luY2x1ZGUgJmx0O3hmODZkcm0uaCZndDs8L2Z1bmNzeW5vcHNpc2luZm8+CisKKyAgICAgIDxmdW5jcHJvdG90eXBlPgorICAgICAgICA8ZnVuY2RlZj5pbnQgPGZ1bmN0aW9uPmRybUhhbmRsZUV2ZW50PC9mdW5jdGlvbj48L2Z1bmNkZWY+CisgICAgICAgIDxwYXJhbWRlZj5pbnQgPHBhcmFtZXRlcj5mZDwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+CisgICAgICAgIDxwYXJhbWRlZj5kcm1FdmVudENvbnRleHRQdHIgPHBhcmFtZXRlcj5ldmN0eDwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+CisgICAgICA8L2Z1bmNwcm90b3R5cGU+CisgICAgPC9mdW5jc3lub3BzaXM+CisKKyAgPC9yZWZzeW5vcHNpc2Rpdj4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkRlc2NyaXB0aW9uPC90aXRsZT4KKyAgICA8cGFyYT48ZnVuY3Rpb24+ZHJtSGFuZGxlRXZlbnQ8L2Z1bmN0aW9uPiBwcm9jZXNzZXMgb3V0c3RhbmRpbmcgRFJNIGV2ZW50cworICAgICAgICAgIG9uIHRoZSBEUk0gZmlsZS1kZXNjcmlwdG9yIHBhc3NlZCBhcyA8cGFyYW1ldGVyPmZkPC9wYXJhbWV0ZXI+LiBUaGlzCisgICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB0aGUgRFJNIGZpbGUtZGVzY3JpcHRvciBoYXMgcG9sbGVkCisgICAgICAgICAgcmVhZGFibGU7IGl0IHdpbGwgcmVhZCB0aGUgZXZlbnRzIGFuZCB1c2UgdGhlIHBhc3NlZC1pbgorICAgICAgICAgIDxwYXJhbWV0ZXI+ZXZjdHg8L3BhcmFtZXRlcj4gc3RydWN0dXJlIHRvIGNhbGwgZnVuY3Rpb24gcG9pbnRlcnMKKyAgICAgICAgICB3aXRoIHRoZSBwYXJhbWV0ZXJzIG5vdGVkIGJlbG93OgorCis8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIHN0cnVjdCBfZHJtRXZlbnRDb250ZXh0IHsKKyAgICBpbnQgdmVyc2lvbjsKKyAgICB2b2lkICgqdmJsYW5rX2hhbmRsZXIpIChpbnQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0dl9zZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHR2X3VzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQorICAgIHZvaWQgKCpwYWdlX2ZsaXBfaGFuZGxlcikgKGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHR2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdHZfdXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCit9IGRybUV2ZW50Q29udGV4dCwgKmRybUV2ZW50Q29udGV4dFB0cjsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICA8L3BhcmE+CisKKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPlJldHVybiBWYWx1ZTwvdGl0bGU+CisgICAgPHBhcmE+PGZ1bmN0aW9uPmRybUhhbmRsZUV2ZW50PC9mdW5jdGlvbj4gcmV0dXJucyA8bGl0ZXJhbD4wPC9saXRlcmFsPiBvbgorICAgICAgICAgIHN1Y2Nlc3MsIG9yIGlmIHRoZXJlIGlzIG5vIGRhdGEgdG8gcmVhZCBmcm9tIHRoZSBmaWxlLWRlc2NyaXB0b3IuCisgICAgICAgICAgUmV0dXJucyA8bGl0ZXJhbD4tMTwvbGl0ZXJhbD4gaWYgdGhlIHJlYWQgb24gdGhlIGZpbGUtZGVzY3JpcHRvciBmYWlscworICAgICAgICAgIG9yIHJldHVybnMgbGVzcyB0aGFuIGEgZnVsbCBldmVudCByZWNvcmQuPC9wYXJhPgorICA8L3JlZnNlY3QxPgorCisgIDxyZWZzZWN0MT4KKyAgICA8dGl0bGU+UmVwb3J0aW5nIEJ1Z3M8L3RpdGxlPgorICAgIDxwYXJhPkJ1Z3MgaW4gdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgcmVwb3J0ZWQgdG8KKyAgICAgIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvZW50ZXJfYnVnLmNnaT9wcm9kdWN0PURSSSZhbXA7Y29tcG9uZW50PWxpYmRybQorICAgICAgdW5kZXIgdGhlICJEUkkiIHByb2R1Y3QsIGNvbXBvbmVudCAibGliZHJtIjwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPlNlZSBBbHNvPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+NzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PiwKKyAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtLWttczwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjc8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4sCisgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybU1vZGVQYWdlRmxpcDwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjM8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4sCisgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybVdhaXRWQmxhbms8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+CisgICAgPC9wYXJhPgorICA8L3JlZnNlY3QxPgorPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL21hbi9kcm1Nb2RlR2V0UmVzb3VyY2VzLnhtbCBiL21hbi9kcm1Nb2RlR2V0UmVzb3VyY2VzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWI2YTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWFuL2RybU1vZGVHZXRSZXNvdXJjZXMueG1sCkBAIC0wLDAgKzEsMTM5IEBACis8P3htbCB2ZXJzaW9uPScxLjAnPz4gPCEtLSotbnhtbC0qLS0+Cis8IURPQ1RZUEUgcmVmZW50cnkgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjIvL0VOIgorICAgICAgICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMi9kb2Nib29reC5kdGQiPgorCis8IS0tCisgIFdyaXR0ZW4gMjAxMiBieSBEYXZpZCBIZXJybWFubiA8ZGguaGVycm1hbm5AZ29vZ2xlbWFpbC5jb20+CisgIERlZGljYXRlZCB0byB0aGUgUHVibGljIERvbWFpbgorLS0+CisKKzxyZWZlbnRyeSBpZD0iZHJtTW9kZUdldFJlc291cmNlcyI+CisgIDxyZWZlbnRyeWluZm8+CisgICAgPHRpdGxlPkRpcmVjdCBSZW5kZXJpbmcgTWFuYWdlcjwvdGl0bGU+CisgICAgPHByb2R1Y3RuYW1lPmxpYmRybTwvcHJvZHVjdG5hbWU+CisgICAgPGRhdGU+U2VwdGVtYmVyIDIwMTI8L2RhdGU+CisgICAgPGF1dGhvcmdyb3VwPgorICAgICAgPGF1dGhvcj4KKyAgICAgICAgPGNvbnRyaWI+RGV2ZWxvcGVyPC9jb250cmliPgorICAgICAgICA8Zmlyc3RuYW1lPkRhdmlkPC9maXJzdG5hbWU+CisgICAgICAgIDxzdXJuYW1lPkhlcnJtYW5uPC9zdXJuYW1lPgorICAgICAgICA8ZW1haWw+ZGguaGVycm1hbm5AZ29vZ2xlbWFpbC5jb208L2VtYWlsPgorICAgICAgPC9hdXRob3I+CisgICAgPC9hdXRob3Jncm91cD4KKyAgPC9yZWZlbnRyeWluZm8+CisKKyAgPHJlZm1ldGE+CisgICAgPHJlZmVudHJ5dGl0bGU+ZHJtTW9kZUdldFJlc291cmNlczwvcmVmZW50cnl0aXRsZT4KKyAgICA8bWFudm9sbnVtPjM8L21hbnZvbG51bT4KKyAgPC9yZWZtZXRhPgorCisgIDxyZWZuYW1lZGl2PgorICAgIDxyZWZuYW1lPmRybU1vZGVHZXRSZXNvdXJjZXM8L3JlZm5hbWU+CisgICAgPHJlZnB1cnBvc2U+cmV0cmlldmUgY3VycmVudCBkaXNwbGF5IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb248L3JlZnB1cnBvc2U+CisgIDwvcmVmbmFtZWRpdj4KKworICA8cmVmc3lub3BzaXNkaXY+CisKKyAgICA8ZnVuY3N5bm9wc2lzPgorICAgICAgPGZ1bmNzeW5vcHNpc2luZm8+I2luY2x1ZGUgJmx0O3hmODZkcm0uaCZndDs8L2Z1bmNzeW5vcHNpc2luZm8+CisgICAgICA8ZnVuY3N5bm9wc2lzaW5mbz4jaW5jbHVkZSAmbHQ7eGY4NmRybU1vZGUuaCZndDs8L2Z1bmNzeW5vcHNpc2luZm8+CisKKyAgICAgIDxmdW5jcHJvdG90eXBlPgorICAgICAgICA8ZnVuY2RlZj5kcm1Nb2RlUmVzUHRyIDxmdW5jdGlvbj5kcm1Nb2RlR2V0UmVzb3VyY2VzPC9mdW5jdGlvbj48L2Z1bmNkZWY+CisgICAgICAgIDxwYXJhbWRlZj5pbnQgPHBhcmFtZXRlcj5mZDwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+CisgICAgICA8L2Z1bmNwcm90b3R5cGU+CisgICAgPC9mdW5jc3lub3BzaXM+CisKKyAgPC9yZWZzeW5vcHNpc2Rpdj4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkRlc2NyaXB0aW9uPC90aXRsZT4KKyAgICA8cGFyYT48ZnVuY3Rpb24+ZHJtTW9kZUdldFJlc291cmNlczwvZnVuY3Rpb24+IGFsbG9jYXRlcywgcG9wdWxhdGVzLCBhbmQKKyAgICAgICAgICByZXR1cm5zIGEgPHN0cnVjdG5hbWU+ZHJtTW9kZVJlczwvc3RydWN0bmFtZT4gc3RydWN0dXJlIGNvbnRhaW5pbmcKKyAgICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBkaXNwbGF5IGNvbmZpZ3VyYXRpb24uIFRoZSBzdHJ1Y3R1cmUKKyAgICAgICAgICBjb250YWlucyB0aGUgZm9sbG93aW5nIGZpZWxkczoKKworPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBzdHJ1Y3QgX2RybU1vZGVSZXMgeworICAgIGludCBjb3VudF9mYnM7CisgICAgdWludDMyX3QgKmZiczsKKworICAgIGludCBjb3VudF9jcnRjczsKKyAgICB1aW50MzJfdCAqY3J0Y3M7CisKKyAgICBpbnQgY291bnRfY29ubmVjdG9yczsKKyAgICB1aW50MzJfdCAqY29ubmVjdG9yczsKKworICAgIGludCBjb3VudF9lbmNvZGVyczsKKyAgICB1aW50MzJfdCAqZW5jb2RlcnM7CisKKyAgICB1aW50MzJfdCBtaW5fd2lkdGgsIG1heF93aWR0aDsKKyAgICB1aW50MzJfdCBtaW5faGVpZ2h0LCBtYXhfaGVpZ2h0OworfSBkcm1Nb2RlUmVzLCAqZHJtTW9kZVJlc1B0cjsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICA8L3BhcmE+CisKKyAgICA8cGFyYT5UaGUgPHN0cnVjdGZpZWxkPmNvdW50X2Ziczwvc3RydWN0ZmllbGQ+IGFuZAorICAgICAgICAgIDxzdHJ1Y3RmaWVsZD5mYnM8L3N0cnVjdGZpZWxkPiBmaWVsZHMgaW5kaWNhdGUgdGhlIG51bWJlciBvZiBjdXJyZW50bHkKKyAgICAgICAgICBhbGxvY2F0ZWQgZnJhbWVidWZmZXIgb2JqZWN0cyAoaS5lLiwgb2JqZWN0cyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0bworICAgICAgICAgIGEgZ2l2ZW4gQ1JUQyBvciBzcHJpdGUgZm9yIGRpc3BsYXkpLjwvcGFyYT4KKworICAgIDxwYXJhPlRoZSA8c3RydWN0ZmllbGQ+Y291bnRfY3J0Y3M8L3N0cnVjdGZpZWxkPiBhbmQKKyAgICAgICAgICA8c3RydWN0ZmllbGQ+Y3J0Y3M8L3N0cnVjdGZpZWxkPiBmaWVsZHMgbGlzdCB0aGUgYXZhaWxhYmxlIENSVENzIGluCisgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24uIEEgQ1JUQyBpcyBzaW1wbHkgYW4gb2JqZWN0IHRoYXQgY2FuIHNjYW4gb3V0IGEKKyAgICAgICAgICBmcmFtZWJ1ZmZlciB0byBhIGRpc3BsYXkgc2luaywgYW5kIGNvbnRhaW5zIG1vZGUgdGltaW5nIGFuZCByZWxhdGl2ZQorICAgICAgICAgIHBvc2l0aW9uIGluZm9ybWF0aW9uLiBDUlRDcyBkcml2ZSBlbmNvZGVycywgd2hpY2ggYXJlIHJlc3BvbnNpYmxlIGZvcgorICAgICAgICAgIGNvbnZlcnRpbmcgdGhlIHBpeGVsIHN0cmVhbSBpbnRvIGEgc3BlY2lmaWMgZGlzcGxheSBwcm90b2NvbCAoZS5nLiwKKyAgICAgICAgICBNSVBJIG9yIEhETUkpLjwvcGFyYT4KKworICAgIDxwYXJhPlRoZSA8c3RydWN0ZmllbGQ+Y291bnRfY29ubmVjdG9yczwvc3RydWN0ZmllbGQ+IGFuZAorICAgICAgICAgIDxzdHJ1Y3RmaWVsZD5jb25uZWN0b3JzPC9zdHJ1Y3RmaWVsZD4gZmllbGRzIGxpc3QgdGhlIGF2YWlsYWJsZQorICAgICAgICAgIHBoeXNpY2FsIGNvbm5lY3RvcnMgb24gdGhlIHN5c3RlbS4gTm90ZSB0aGF0IHNvbWUgb2YgdGhlc2UgbWF5IG5vdCBiZQorICAgICAgICAgIGV4cG9zZWQgZnJvbSB0aGUgY2hhc3NpcyAoZS5nLiwgTFZEUyBvciBlRFApLiBDb25uZWN0b3JzIGFyZSBhdHRhY2hlZAorICAgICAgICAgIHRvIGVuY29kZXJzIGFuZCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhdHRhY2hlZCBkaXNwbGF5IHNpbmsKKyAgICAgICAgICAoZS5nLiwgd2lkdGggYW5kIGhlaWdodCBpbiBtbSwgc3VicGl4ZWwgb3JkZXJpbmcsIGFuZCB2YXJpb3VzIG90aGVyCisgICAgICAgICAgcHJvcGVydGllcykuPC9wYXJhPgorCisgICAgPHBhcmE+VGhlIDxzdHJ1Y3RmaWVsZD5jb3VudF9lbmNvZGVyczwvc3RydWN0ZmllbGQ+IGFuZAorICAgICAgICAgIDxzdHJ1Y3RmaWVsZD5lbmNvZGVyczwvc3RydWN0ZmllbGQ+IGZpZWxkcyBsaXN0IHRoZSBhdmFpbGFibGUgZW5jb2RlcnMKKyAgICAgICAgICBvbiB0aGUgZGV2aWNlLiBFYWNoIGVuY29kZXIgbWF5IGJlIGFzc29jaWF0ZWQgd2l0aCBhIENSVEMsIGFuZCBtYXkgYmUKKyAgICAgICAgICB1c2VkIHRvIGRyaXZlIGEgcGFydGljdWxhciBlbmNvZGVyLjwvcGFyYT4KKworICAgIDxwYXJhPlRoZSA8c3RydWN0ZmllbGQ+bWluKjwvc3RydWN0ZmllbGQ+IGFuZAorICAgICAgICAgIDxzdHJ1Y3RmaWVsZD5tYXgqPC9zdHJ1Y3RmaWVsZD4gZmllbGRzIGluZGljYXRlIHRoZSBtYXhpbXVtIHNpemUgb2YgYQorICAgICAgICAgIGZyYW1lYnVmZmVyIGZvciB0aGlzIGRldmljZSAoaS5lLiwgdGhlIHNjYW5vdXQgc2l6ZSBsaW1pdCkuPC9wYXJhPgorICA8L3JlZnNlY3QxPgorCisgIDxyZWZzZWN0MT4KKyAgICA8dGl0bGU+UmV0dXJuIFZhbHVlPC90aXRsZT4KKyAgICA8cGFyYT48ZnVuY3Rpb24+ZHJtTW9kZUdldFJlc291cmNlczwvZnVuY3Rpb24+IHJldHVybnMgYSBkcm1Nb2RlUmVzCisgICAgICAgICAgc3RydWN0dXJlIHBvaW50ZXIgb24gc3VjY2VzcywgPGxpdGVyYWw+TlVMTDwvbGl0ZXJhbD4gb24gZmFpbHVyZS4gVGhlCisgICAgICAgICAgcmV0dXJuZWQgc3RydWN0dXJlIG11c3QgYmUgZnJlZWQgd2l0aAorICAgICAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtTW9kZUZyZWVSZXNvdXJjZXM8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LjwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPlJlcG9ydGluZyBCdWdzPC90aXRsZT4KKyAgICA8cGFyYT5CdWdzIGluIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHJlcG9ydGVkIHRvCisgICAgICBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1EUkkmYW1wO2NvbXBvbmVudD1saWJkcm0KKyAgICAgIHVuZGVyIHRoZSAiRFJJIiBwcm9kdWN0LCBjb21wb25lbnQgImxpYmRybSI8L3BhcmE+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxPgorICAgIDx0aXRsZT5TZWUgQWxzbzwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybTwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjc8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4sCisgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybS1rbXM8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT43PC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1Nb2RlR2V0RkI8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1Nb2RlQWRkRkI8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1Nb2RlQWRkRkIyPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PiwKKyAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtTW9kZVJtRkI8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1Nb2RlRGlydHlGQjwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjM8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4sCisgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybU1vZGVHZXRDcnRjPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MzwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PiwKKyAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZHJtTW9kZVNldENydGM8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kcm1Nb2RlR2V0RW5jb2RlcjwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjM8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4sCisgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRybU1vZGVHZXRDb25uZWN0b3I8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4zPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+CisgICAgPC9wYXJhPgorICA8L3JlZnNlY3QxPgorPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL25vdXZlYXUvQW5kcm9pZC5tayBiL25vdXZlYXUvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDMwYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvbm91dmVhdS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTQgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIEltcG9ydCB2YXJpYWJsZXMgTElCRFJNX05PVVZFQVVfRklMRVMsIExJQkRSTV9OT1VWRUFVX0hfRklMRVMKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9NYWtlZmlsZS5zb3VyY2VzCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJkcm1fbm91dmVhdQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmRybQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChMSUJEUk1fTk9VVkVBVV9GSUxFUykKKworaW5jbHVkZSAkKExJQkRSTV9DT01NT05fTUspCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9ub3V2ZWF1L01ha2VmaWxlLmFtIGIvbm91dmVhdS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDRhODQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbm91dmVhdS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMzIEBACitpbmNsdWRlIE1ha2VmaWxlLnNvdXJjZXMKKworQU1fQ0ZMQUdTID0gXAorCSQoV0FSTl9DRkxBR1MpIFwKKwktSSQodG9wX3NyY2RpcikgXAorCSQoUFRIUkVBRFNUVUJTX0NGTEFHUykgXAorCS1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlL2RybSBcCisJLURERUJVRworCitsaWJkcm1fbm91dmVhdV9sYV9MVExJQlJBUklFUyA9IGxpYmRybV9ub3V2ZWF1LmxhCitsaWJkcm1fbm91dmVhdV9sYWRpciA9ICQobGliZGlyKQorbGliZHJtX25vdXZlYXVfbGFfTERGTEFHUyA9IC12ZXJzaW9uLW51bWJlciAyOjA6MCAtbm8tdW5kZWZpbmVkCitsaWJkcm1fbm91dmVhdV9sYV9MSUJBREQgPSAuLi9saWJkcm0ubGEgQFBUSFJFQURTVFVCU19MSUJTQAorCitsaWJkcm1fbm91dmVhdV9sYV9TT1VSQ0VTID0gJChMSUJEUk1fTk9VVkVBVV9GSUxFUykKKworbGliZHJtX25vdXZlYXVpbmNsdWRlZGlyID0gJHtpbmNsdWRlZGlyfS9saWJkcm0vbm91dmVhdQorbGliZHJtX25vdXZlYXVpbmNsdWRlX0hFQURFUlMgPSAkKExJQkRSTV9OT1VWRUFVX0hfRklMRVMpCisKK2xpYmRybV9ub3V2ZWF1bnZpZmluY2x1ZGVkaXIgPSAke2luY2x1ZGVkaXJ9L2xpYmRybS9ub3V2ZWF1L252aWYKK2xpYmRybV9ub3V2ZWF1bnZpZmluY2x1ZGVfSEVBREVSUyA9IG52aWYvY2xhc3MuaCBcCisJCQkJICAgIG52aWYvY2wwMDgwLmggXAorCQkJCSAgICBudmlmL2NsOTA5Ny5oIFwKKwkJCQkgICAgbnZpZi9pZjAwMDIuaCBcCisJCQkJICAgIG52aWYvaWYwMDAzLmggXAorCQkJCSAgICBudmlmL2lvY3RsLmggXAorCQkJCSAgICBudmlmL3VucGFjay5oCisKK3BrZ2NvbmZpZ2RpciA9IEBwa2djb25maWdkaXJACitwa2djb25maWdfREFUQSA9IGxpYmRybV9ub3V2ZWF1LnBjCisKK1RFU1RTID0gbm91dmVhdS1zeW1ib2wtY2hlY2sKK0VYVFJBX0RJU1QgPSAkKFRFU1RTKQpkaWZmIC0tZ2l0IGEvbm91dmVhdS9NYWtlZmlsZS5zb3VyY2VzIGIvbm91dmVhdS9NYWtlZmlsZS5zb3VyY2VzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZjJhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9ub3V2ZWF1L01ha2VmaWxlLnNvdXJjZXMKQEAgLTAsMCArMSw5IEBACitMSUJEUk1fTk9VVkVBVV9GSUxFUyA6PSBcCisJbm91dmVhdS5jIFwKKwlwdXNoYnVmLmMgXAorCWJ1ZmN0eC5jIFwKKwlhYmkxNi5jIFwKKwlwcml2YXRlLmgKKworTElCRFJNX05PVVZFQVVfSF9GSUxFUyA6PSBcCisJbm91dmVhdS5oCmRpZmYgLS1naXQgYS9ub3V2ZWF1L2FiaTE2LmMgYi9ub3V2ZWF1L2FiaTE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUzOGMwYwotLS0gL2Rldi9udWxsCisrKyBiL25vdXZlYXUvYWJpMTYuYwpAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEyIFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgInByaXZhdGUuaCIKKworI2luY2x1ZGUgIm52aWYvY2xhc3MuaCIKKworc3RhdGljIGludAorYWJpMTZfY2hhbl9udjA0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqKQoreworCXN0cnVjdCBub3V2ZWF1X2RybSAqZHJtID0gbm91dmVhdV9kcm0ob2JqKTsKKwlzdHJ1Y3QgbnYwNF9maWZvICpudjA0ID0gb2JqLT5kYXRhOworCXN0cnVjdCBkcm1fbm91dmVhdV9jaGFubmVsX2FsbG9jIHJlcSA9IHsKKwkJLmZiX2N0eGRtYV9oYW5kbGUgPSBudjA0LT52cmFtLAorCQkudHRfY3R4ZG1hX2hhbmRsZSA9IG52MDQtPmdhcnQKKwl9OworCWludCByZXQ7CisKKwlyZXQgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGRybS0+ZmQsIERSTV9OT1VWRUFVX0NIQU5ORUxfQUxMT0MsCisJCQkJICAmcmVxLCBzaXplb2YocmVxKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW52MDQtPmJhc2UuY2hhbm5lbCA9IHJlcS5jaGFubmVsOworCW52MDQtPmJhc2UucHVzaGJ1ZiA9IHJlcS5wdXNoYnVmX2RvbWFpbnM7CisJbnYwNC0+bm90aWZ5ID0gcmVxLm5vdGlmaWVyX2hhbmRsZTsKKwludjA0LT5iYXNlLm9iamVjdC0+aGFuZGxlID0gcmVxLmNoYW5uZWw7CisJbnYwNC0+YmFzZS5vYmplY3QtPmxlbmd0aCA9IHNpemVvZigqbnYwNCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2FiaTE2X2NoYW5fbnZjMChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSA9IG5vdXZlYXVfZHJtKG9iaik7CisJc3RydWN0IGRybV9ub3V2ZWF1X2NoYW5uZWxfYWxsb2MgcmVxID0ge307CisJc3RydWN0IG52YzBfZmlmbyAqbnZjMCA9IG9iai0+ZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gZHJtQ29tbWFuZFdyaXRlUmVhZChkcm0tPmZkLCBEUk1fTk9VVkVBVV9DSEFOTkVMX0FMTE9DLAorCQkJCSAgJnJlcSwgc2l6ZW9mKHJlcSkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwludmMwLT5iYXNlLmNoYW5uZWwgPSByZXEuY2hhbm5lbDsKKwludmMwLT5iYXNlLnB1c2hidWYgPSByZXEucHVzaGJ1Zl9kb21haW5zOworCW52YzAtPm5vdGlmeSA9IHJlcS5ub3RpZmllcl9oYW5kbGU7CisJbnZjMC0+YmFzZS5vYmplY3QtPmhhbmRsZSA9IHJlcS5jaGFubmVsOworCW52YzAtPmJhc2Uub2JqZWN0LT5sZW5ndGggPSBzaXplb2YoKm52YzApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CithYmkxNl9jaGFuX252ZTAoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmopCit7CisJc3RydWN0IG5vdXZlYXVfZHJtICpkcm0gPSBub3V2ZWF1X2RybShvYmopOworCXN0cnVjdCBkcm1fbm91dmVhdV9jaGFubmVsX2FsbG9jIHJlcSA9IHt9OworCXN0cnVjdCBudmUwX2ZpZm8gKm52ZTAgPSBvYmotPmRhdGE7CisJaW50IHJldDsKKworCWlmIChvYmotPmxlbmd0aCA+IG9mZnNldG9mKHN0cnVjdCBudmUwX2ZpZm8sIGVuZ2luZSkpIHsKKwkJcmVxLmZiX2N0eGRtYV9oYW5kbGUgPSAweGZmZmZmZmZmOworCQlyZXEudHRfY3R4ZG1hX2hhbmRsZSA9IG52ZTAtPmVuZ2luZTsKKwl9CisKKwlyZXQgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGRybS0+ZmQsIERSTV9OT1VWRUFVX0NIQU5ORUxfQUxMT0MsCisJCQkJICAmcmVxLCBzaXplb2YocmVxKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW52ZTAtPmJhc2UuY2hhbm5lbCA9IHJlcS5jaGFubmVsOworCW52ZTAtPmJhc2UucHVzaGJ1ZiA9IHJlcS5wdXNoYnVmX2RvbWFpbnM7CisJbnZlMC0+bm90aWZ5ID0gcmVxLm5vdGlmaWVyX2hhbmRsZTsKKwludmUwLT5iYXNlLm9iamVjdC0+aGFuZGxlID0gcmVxLmNoYW5uZWw7CisJbnZlMC0+YmFzZS5vYmplY3QtPmxlbmd0aCA9IHNpemVvZigqbnZlMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2FiaTE2X2VuZ29iaihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSA9IG5vdXZlYXVfZHJtKG9iaik7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dyb2JqX2FsbG9jIHJlcSA9IHsKKwkJLmNoYW5uZWwgPSBvYmotPnBhcmVudC0+aGFuZGxlLAorCQkuaGFuZGxlID0gb2JqLT5oYW5kbGUsCisJCS5jbGFzcyA9IG9iai0+b2NsYXNzLAorCX07CisJaW50IHJldDsKKworCS8qIE9sZGVyIGtlcm5lbCB2ZXJzaW9ucyBkaWQgbm90IGhhdmUgdGhlIGNvbmNlcHQgb2Ygbm91dmVhdS0KKwkgKiBzcGVjaWZpYyBjbGFzc2VzIGFuZCBhYnVzZWQgc29tZSBOVklESUEtYXNzaWduZWQgb25lcyBmb3IKKwkgKiBhIFNXIGNsYXNzLiAgVGhlIEFCSTE2IGxheWVyIGhhcyBjb21wYXRpYmlsaXR5IGluIHBsYWNlIHRvCisJICogdHJhbnNsYXRlIHRoZXNlIG9sZGVyIGlkZW50aWZpZXJzIHRvIHRoZSBuZXdlciBvbmVzLgorCSAqCisJICogQ2xpZW50cyB0aGF0IGhhdmUgYmVlbiB1cGRhdGVkIHRvIHVzZSBOVklGIGFyZSByZXF1aXJlZCB0bworCSAqIHVzZSB0aGUgbmV3ZXIgY2xhc3MgaWRlbnRpZmllcnMsIHdoaWNoIG1lYW5zIHRoYXQgdGhleSdsbAorCSAqIGJyZWFrIGlmIHJ1bm5pbmcgb24gYW4gb2xkZXIga2VybmVsLgorCSAqCisJICogVG8gaGFuZGxlIHRoaXMgY2FzZSwgd2hlbiB1c2luZyBBQkkxNiwgd2UgdHJhbnNsYXRlIHRvIHRoZQorCSAqIG9sZGVyIHZhbHVlcyB3aGljaCB3b3JrIG9uIGFueSBrZXJuZWwuCisJICovCisJc3dpdGNoIChyZXEuY2xhc3MpIHsKKwljYXNlIE5WSUZfQ0xBU1NfU1dfTlYwNCA6IHJlcS5jbGFzcyA9IDB4MDA2ZTsgYnJlYWs7CisJY2FzZSBOVklGX0NMQVNTX1NXX05WMTAgOiByZXEuY2xhc3MgPSAweDAxNmU7IGJyZWFrOworCWNhc2UgTlZJRl9DTEFTU19TV19OVjUwIDogcmVxLmNsYXNzID0gMHg1MDZlOyBicmVhazsKKwljYXNlIE5WSUZfQ0xBU1NfU1dfR0YxMDA6IHJlcS5jbGFzcyA9IDB4OTA2ZTsgYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0ID0gZHJtQ29tbWFuZFdyaXRlKGRybS0+ZmQsIERSTV9OT1VWRUFVX0dST0JKX0FMTE9DLAorCQkJICAgICAgJnJlcSwgc2l6ZW9mKHJlcSkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlvYmotPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2FiaTE2X250Znkoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmopCit7CisJc3RydWN0IG5vdXZlYXVfZHJtICpkcm0gPSBub3V2ZWF1X2RybShvYmopOworCXN0cnVjdCBudjA0X25vdGlmeSAqbnRmeSA9IG9iai0+ZGF0YTsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfbm90aWZpZXJvYmpfYWxsb2MgcmVxID0geworCQkuY2hhbm5lbCA9IG9iai0+cGFyZW50LT5oYW5kbGUsCisJCS5oYW5kbGUgPSBudGZ5LT5vYmplY3QtPmhhbmRsZSwKKwkJLnNpemUgPSBudGZ5LT5sZW5ndGgsCisJfTsKKwlpbnQgcmV0OworCisJcmV0ID0gZHJtQ29tbWFuZFdyaXRlUmVhZChkcm0tPmZkLCBEUk1fTk9VVkVBVV9OT1RJRklFUk9CSl9BTExPQywKKwkJCQkgICZyZXEsIHNpemVvZihyZXEpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbnRmeS0+b2Zmc2V0ID0gcmVxLm9mZnNldDsKKwludGZ5LT5vYmplY3QtPmxlbmd0aCA9IHNpemVvZigqbnRmeSk7CisJcmV0dXJuIDA7Cit9CisKK2RybV9wcml2YXRlIGludAorYWJpMTZfc2NsYXNzKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqLCBzdHJ1Y3Qgbm91dmVhdV9zY2xhc3MgKipwc2NsYXNzKQoreworCXN0cnVjdCBub3V2ZWF1X3NjbGFzcyAqc2NsYXNzOworCXN0cnVjdCBub3V2ZWF1X2RldmljZSAqZGV2OworCisJaWYgKCEoc2NsYXNzID0gY2FsbG9jKDgsIHNpemVvZigqc2NsYXNzKSkpKQorCQlyZXR1cm4gLUVOT01FTTsKKwkqcHNjbGFzcyA9IHNjbGFzczsKKworCXN3aXRjaCAob2JqLT5vY2xhc3MpIHsKKwljYXNlIE5PVVZFQVVfRklGT19DSEFOTkVMX0NMQVNTOgorCQkvKiBPbGRlciBrZXJuZWwgdmVyc2lvbnMgd2VyZSBleHBvc2luZyB0aGUgd3JvbmcgdmlkZW8gZW5naW5lCisJCSAqIGNsYXNzZXMgb24gY2VydGFpbiBHOTg6R0YxMDAgYm9hcmRzLiAgVGhpcyBoYXMgc2luY2UgYmVlbgorCQkgKiBjb3JyZWN0ZWQsIGJ1dCBBQkkxNiBoYXMgY29tcGF0aWJpbGl0eSBpbiBwbGFjZSB0byBhdm9pZAorCQkgKiBicmVha2luZyBvbGRlciB1c2Vyc3BhY2UuCisJCSAqCisJCSAqIENsaWVudHMgdGhhdCBoYXZlIGJlZW4gdXBkYXRlZCB0byB1c2UgTlZJRiBhcmUgcmVxdWlyZWQgdG8KKwkJICogdXNlIHRoZSBjb3JyZWN0IGNsYXNzZXMsIHdoaWNoIG1lYW5zIHRoYXQgdGhleSdsbCBicmVhayBpZgorCQkgKiBydW5uaW5nIG9uIGFuIG9sZGVyIGtlcm5lbC4KKwkJICoKKwkJICogVG8gaGFuZGxlIHRoaXMgaXNzdWUsIGlmIHVzaW5nIHRoZSBvbGRlciBrZXJuZWwgaW50ZXJmYWNlcywKKwkJICogd2UnbGwgbWFnaWMgdXAgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIHZkZWMgY2xhc3NlcyB0aGF0IHRoZQorCQkgKiBrZXJuZWwgd2lsbCBhY2NlcHQgZm9yIHRoZXNlIGJvYXJkcy4gIENsaWVudHMgc2hvdWxkIG1ha2UKKwkJICogdXNlIG9mIHRoaXMgaW5mb3JtYXRpb24gaW5zdGVhZCBvZiBoYXJkY29kaW5nIGNsYXNzZXMgZm9yCisJCSAqIHNwZWNpZmljIGNoaXBzZXRzLgorCQkgKi8KKwkJZGV2ID0gKHN0cnVjdCBub3V2ZWF1X2RldmljZSAqKW9iai0+cGFyZW50OworCQlpZiAoZGV2LT5jaGlwc2V0ID49IDB4OTggJiYKKwkJICAgIGRldi0+Y2hpcHNldCAhPSAweGEwICYmCisJCSAgICBkZXYtPmNoaXBzZXQgPCAgMHhjMCkgeworCQkJKnNjbGFzcysrID0gKHN0cnVjdCBub3V2ZWF1X3NjbGFzcyl7CisJCQkJR1QyMTJfTVNWTEQsIC0xLCAtMQorCQkJfTsKKwkJCSpzY2xhc3MrKyA9IChzdHJ1Y3Qgbm91dmVhdV9zY2xhc3MpeworCQkJCUdUMjEyX01TUERFQywgLTEsIC0xCisJCQl9OworCQkJKnNjbGFzcysrID0gKHN0cnVjdCBub3V2ZWF1X3NjbGFzcyl7CisJCQkJR1QyMTJfTVNQUFAsIC0xLCAtMQorCQkJfTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc2NsYXNzIC0gKnBzY2xhc3M7Cit9CisKK2RybV9wcml2YXRlIHZvaWQKK2FiaTE2X2RlbGV0ZShzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSA9IG5vdXZlYXVfZHJtKG9iaik7CisJaWYgKG9iai0+b2NsYXNzID09IE5PVVZFQVVfRklGT19DSEFOTkVMX0NMQVNTKSB7CisJCXN0cnVjdCBkcm1fbm91dmVhdV9jaGFubmVsX2ZyZWUgcmVxOworCQlyZXEuY2hhbm5lbCA9IG9iai0+aGFuZGxlOworCQlkcm1Db21tYW5kV3JpdGUoZHJtLT5mZCwgRFJNX05PVVZFQVVfQ0hBTk5FTF9GUkVFLAorCQkJCSZyZXEsIHNpemVvZihyZXEpKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZHJtX25vdXZlYXVfZ3B1b2JqX2ZyZWUgcmVxOworCQlyZXEuY2hhbm5lbCA9IG9iai0+cGFyZW50LT5oYW5kbGU7CisJCXJlcS5oYW5kbGUgID0gb2JqLT5oYW5kbGU7CisJCWRybUNvbW1hbmRXcml0ZShkcm0tPmZkLCBEUk1fTk9VVkVBVV9HUFVPQkpfRlJFRSwKKwkJCQkmcmVxLCBzaXplb2YocmVxKSk7CisJfQorfQorCitkcm1fcHJpdmF0ZSBib29sCithYmkxNl9vYmplY3Qoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmosIGludCAoKipmdW5jKShzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKikpCit7CisJc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpwYXJlbnQgPSBvYmotPnBhcmVudDsKKworCS8qIG5vdXZlYXVfb2JqZWN0OjpsZW5ndGggaXMgKGFiKXVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlCisJICogb2JqZWN0IGlzIGEgbGVnYWN5IG9iamVjdCAoIT0wKSwgb3IgYSByZWFsIE5WSUYgb2JqZWN0LgorCSAqLworCWlmICgocGFyZW50LT5sZW5ndGggIT0gMCAmJiBwYXJlbnQtPm9jbGFzcyA9PSBOT1VWRUFVX0RFVklDRV9DTEFTUykgfHwKKwkgICAgKHBhcmVudC0+bGVuZ3RoID09IDAgJiYgcGFyZW50LT5vY2xhc3MgPT0gTlZfREVWSUNFKSkgeworCQlpZiAob2JqLT5vY2xhc3MgPT0gTk9VVkVBVV9GSUZPX0NIQU5ORUxfQ0xBU1MpIHsKKwkJCXN0cnVjdCBub3V2ZWF1X2RldmljZSAqZGV2ID0gKHZvaWQgKilwYXJlbnQ7CisJCQlpZiAoZGV2LT5jaGlwc2V0IDwgMHhjMCkKKwkJCQkqZnVuYyA9IGFiaTE2X2NoYW5fbnYwNDsKKwkJCWVsc2UKKwkJCWlmIChkZXYtPmNoaXBzZXQgPCAweGUwKQorCQkJCSpmdW5jID0gYWJpMTZfY2hhbl9udmMwOworCQkJZWxzZQorCQkJCSpmdW5jID0gYWJpMTZfY2hhbl9udmUwOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9IGVsc2UKKwlpZiAoKHBhcmVudC0+bGVuZ3RoICE9IDAgJiYKKwkgICAgIHBhcmVudC0+b2NsYXNzID09IE5PVVZFQVVfRklGT19DSEFOTkVMX0NMQVNTKSkgeworCQlpZiAob2JqLT5vY2xhc3MgPT0gTk9VVkVBVV9OT1RJRklFUl9DTEFTUykgeworCQkJKmZ1bmMgPSBhYmkxNl9udGZ5OworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQkqZnVuYyA9IGFiaTE2X2VuZ29iajsKKwkJcmV0dXJuIGZhbHNlOyAvKiB0cnkgTlZJRiwgaWYgc3VwcG9ydGVkLCBiZWZvcmUgY2FsbGluZyBmdW5jICovCisJfQorCisJKmZ1bmMgPSBOVUxMOworCXJldHVybiBmYWxzZTsKK30KKworZHJtX3ByaXZhdGUgdm9pZAorYWJpMTZfYm9faW5mbyhzdHJ1Y3Qgbm91dmVhdV9ibyAqYm8sIHN0cnVjdCBkcm1fbm91dmVhdV9nZW1faW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9ib19wcml2ICpudmJvID0gbm91dmVhdV9ibyhibyk7CisKKwludmJvLT5tYXBfaGFuZGxlID0gaW5mby0+bWFwX2hhbmRsZTsKKwliby0+aGFuZGxlID0gaW5mby0+aGFuZGxlOworCWJvLT5zaXplID0gaW5mby0+c2l6ZTsKKwliby0+b2Zmc2V0ID0gaW5mby0+b2Zmc2V0OworCisJYm8tPmZsYWdzID0gMDsKKwlpZiAoaW5mby0+ZG9tYWluICYgTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0pCisJCWJvLT5mbGFncyB8PSBOT1VWRUFVX0JPX1ZSQU07CisJaWYgKGluZm8tPmRvbWFpbiAmIE5PVVZFQVVfR0VNX0RPTUFJTl9HQVJUKQorCQliby0+ZmxhZ3MgfD0gTk9VVkVBVV9CT19HQVJUOworCWlmICghKGluZm8tPnRpbGVfZmxhZ3MgJiBOT1VWRUFVX0dFTV9USUxFX05PTkNPTlRJRykpCisJCWJvLT5mbGFncyB8PSBOT1VWRUFVX0JPX0NPTlRJRzsKKwlpZiAobnZiby0+bWFwX2hhbmRsZSkKKwkJYm8tPmZsYWdzIHw9IE5PVVZFQVVfQk9fTUFQOworCisJaWYgKGJvLT5kZXZpY2UtPmNoaXBzZXQgPj0gMHhjMCkgeworCQliby0+Y29uZmlnLm52YzAubWVtdHlwZSAgID0gKGluZm8tPnRpbGVfZmxhZ3MgJiAweGZmMDApID4+IDg7CisJCWJvLT5jb25maWcubnZjMC50aWxlX21vZGUgPSBpbmZvLT50aWxlX21vZGU7CisJfSBlbHNlCisJaWYgKGJvLT5kZXZpY2UtPmNoaXBzZXQgPj0gMHg4MCB8fCBiby0+ZGV2aWNlLT5jaGlwc2V0ID09IDB4NTApIHsKKwkJYm8tPmNvbmZpZy5udjUwLm1lbXR5cGUgICA9IChpbmZvLT50aWxlX2ZsYWdzICYgMHgwN2YwMCkgPj4gOCB8CisJCQkJCSAgICAoaW5mby0+dGlsZV9mbGFncyAmIDB4MzAwMDApID4+IDk7CisJCWJvLT5jb25maWcubnY1MC50aWxlX21vZGUgPSBpbmZvLT50aWxlX21vZGUgPDwgNDsKKwl9IGVsc2UgeworCQliby0+Y29uZmlnLm52MDQuc3VyZl9mbGFncyA9IGluZm8tPnRpbGVfZmxhZ3MgJiA3OworCQliby0+Y29uZmlnLm52MDQuc3VyZl9waXRjaCA9IGluZm8tPnRpbGVfbW9kZTsKKwl9Cit9CisKK2RybV9wcml2YXRlIGludAorYWJpMTZfYm9faW5pdChzdHJ1Y3Qgbm91dmVhdV9ibyAqYm8sIHVpbnQzMl90IGFsaWdubWVudCwKKwkgICAgICB1bmlvbiBub3V2ZWF1X2JvX2NvbmZpZyAqY29uZmlnKQoreworCXN0cnVjdCBub3V2ZWF1X2RldmljZSAqZGV2ID0gYm8tPmRldmljZTsKKwlzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSA9IG5vdXZlYXVfZHJtKCZkZXYtPm9iamVjdCk7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9uZXcgcmVxID0ge307CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9pbmZvICppbmZvID0gJnJlcS5pbmZvOworCWludCByZXQ7CisKKwlpZiAoYm8tPmZsYWdzICYgTk9VVkVBVV9CT19WUkFNKQorCQlpbmZvLT5kb21haW4gfD0gTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU07CisJaWYgKGJvLT5mbGFncyAmIE5PVVZFQVVfQk9fR0FSVCkKKwkJaW5mby0+ZG9tYWluIHw9IE5PVVZFQVVfR0VNX0RPTUFJTl9HQVJUOworCWlmICghaW5mby0+ZG9tYWluKQorCQlpbmZvLT5kb21haW4gfD0gTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0gfAorCQkJCU5PVVZFQVVfR0VNX0RPTUFJTl9HQVJUOworCisJaWYgKGJvLT5mbGFncyAmIE5PVVZFQVVfQk9fTUFQKQorCQlpbmZvLT5kb21haW4gfD0gTk9VVkVBVV9HRU1fRE9NQUlOX01BUFBBQkxFOworCisJaWYgKGJvLT5mbGFncyAmIE5PVVZFQVVfQk9fQ09IRVJFTlQpCisJCWluZm8tPmRvbWFpbiB8PSBOT1VWRUFVX0dFTV9ET01BSU5fQ09IRVJFTlQ7CisKKwlpZiAoIShiby0+ZmxhZ3MgJiBOT1VWRUFVX0JPX0NPTlRJRykpCisJCWluZm8tPnRpbGVfZmxhZ3MgPSBOT1VWRUFVX0dFTV9USUxFX05PTkNPTlRJRzsKKworCWluZm8tPnNpemUgPSBiby0+c2l6ZTsKKwlyZXEuYWxpZ24gPSBhbGlnbm1lbnQ7CisKKwlpZiAoY29uZmlnKSB7CisJCWlmIChkZXYtPmNoaXBzZXQgPj0gMHhjMCkgeworCQkJaW5mby0+dGlsZV9mbGFncyA9IChjb25maWctPm52YzAubWVtdHlwZSAmIDB4ZmYpIDw8IDg7CisJCQlpbmZvLT50aWxlX21vZGUgID0gY29uZmlnLT5udmMwLnRpbGVfbW9kZTsKKwkJfSBlbHNlCisJCWlmIChkZXYtPmNoaXBzZXQgPj0gMHg4MCB8fCBkZXYtPmNoaXBzZXQgPT0gMHg1MCkgeworCQkJaW5mby0+dGlsZV9mbGFncyA9IChjb25maWctPm52NTAubWVtdHlwZSAmIDB4MDdmKSA8PCA4IHwKKwkJCQkJICAgKGNvbmZpZy0+bnY1MC5tZW10eXBlICYgMHgxODApIDw8IDk7CisJCQlpbmZvLT50aWxlX21vZGUgID0gY29uZmlnLT5udjUwLnRpbGVfbW9kZSA+PiA0OworCQl9IGVsc2UgeworCQkJaW5mby0+dGlsZV9mbGFncyA9IGNvbmZpZy0+bnYwNC5zdXJmX2ZsYWdzICYgNzsKKwkJCWluZm8tPnRpbGVfbW9kZSAgPSBjb25maWctPm52MDQuc3VyZl9waXRjaDsKKwkJfQorCX0KKworCWlmICghbm91dmVhdV9kZXZpY2UoZGV2KS0+aGF2ZV9ib191c2FnZSkKKwkJaW5mby0+dGlsZV9mbGFncyAmPSAweDAwMDBmZjAwOworCisJcmV0ID0gZHJtQ29tbWFuZFdyaXRlUmVhZChkcm0tPmZkLCBEUk1fTk9VVkVBVV9HRU1fTkVXLAorCQkJCSAgJnJlcSwgc2l6ZW9mKHJlcSkpOworCWlmIChyZXQgPT0gMCkKKwkJYWJpMTZfYm9faW5mbyhibywgJnJlcS5pbmZvKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbm91dmVhdS9idWZjdHguYyBiL25vdXZlYXUvYnVmY3R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3NmU1ZAotLS0gL2Rldi9udWxsCisrKyBiL25vdXZlYXUvYnVmY3R4LmMKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMiBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgImxpYmRybV9saXN0cy5oIgorCisjaW5jbHVkZSAibm91dmVhdS5oIgorI2luY2x1ZGUgInByaXZhdGUuaCIKKworc3RydWN0IG5vdXZlYXVfYnVmcmVmX3ByaXYgeworCXN0cnVjdCBub3V2ZWF1X2J1ZnJlZiBiYXNlOworCXN0cnVjdCBub3V2ZWF1X2J1ZnJlZl9wcml2ICpuZXh0OworCXN0cnVjdCBub3V2ZWF1X2J1ZmN0eCAqYnVmY3R4OworfTsKKworc3RydWN0IG5vdXZlYXVfYnVmYmluX3ByaXYgeworCXN0cnVjdCBub3V2ZWF1X2J1ZnJlZl9wcml2ICpsaXN0OworCWludCByZWxvY3M7Cit9OworCitzdHJ1Y3Qgbm91dmVhdV9idWZjdHhfcHJpdiB7CisJc3RydWN0IG5vdXZlYXVfYnVmY3R4IGJhc2U7CisJc3RydWN0IG5vdXZlYXVfYnVmcmVmX3ByaXYgKmZyZWU7CisJaW50IG5yX2JpbnM7CisJc3RydWN0IG5vdXZlYXVfYnVmYmluX3ByaXYgYmluc1tdOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgbm91dmVhdV9idWZjdHhfcHJpdiAqCitub3V2ZWF1X2J1ZmN0eChzdHJ1Y3Qgbm91dmVhdV9idWZjdHggKmJjdHgpCit7CisJcmV0dXJuIChzdHJ1Y3Qgbm91dmVhdV9idWZjdHhfcHJpdiAqKWJjdHg7Cit9CisKK2ludAorbm91dmVhdV9idWZjdHhfbmV3KHN0cnVjdCBub3V2ZWF1X2NsaWVudCAqY2xpZW50LCBpbnQgYmlucywKKwkJICAgc3RydWN0IG5vdXZlYXVfYnVmY3R4ICoqcGJjdHgpCit7CisJc3RydWN0IG5vdXZlYXVfYnVmY3R4X3ByaXYgKnByaXY7CisKKwlwcml2ID0gY2FsbG9jKDEsIHNpemVvZigqcHJpdikgKyBzaXplb2YocHJpdi0+Ymluc1swXSkgKiBiaW5zKTsKKwlpZiAocHJpdikgeworCQlEUk1JTklUTElTVEhFQUQoJnByaXYtPmJhc2UuaGVhZCk7CisJCURSTUlOSVRMSVNUSEVBRCgmcHJpdi0+YmFzZS5wZW5kaW5nKTsKKwkJRFJNSU5JVExJU1RIRUFEKCZwcml2LT5iYXNlLmN1cnJlbnQpOworCQlwcml2LT5iYXNlLmNsaWVudCA9IGNsaWVudDsKKwkJcHJpdi0+bnJfYmlucyA9IGJpbnM7CisJCSpwYmN0eCA9ICZwcml2LT5iYXNlOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKwordm9pZAorbm91dmVhdV9idWZjdHhfZGVsKHN0cnVjdCBub3V2ZWF1X2J1ZmN0eCAqKnBiY3R4KQoreworCXN0cnVjdCBub3V2ZWF1X2J1ZmN0eF9wcml2ICpwY3R4ID0gbm91dmVhdV9idWZjdHgoKnBiY3R4KTsKKwlzdHJ1Y3Qgbm91dmVhdV9idWZyZWZfcHJpdiAqcHJlZjsKKwlpZiAocGN0eCkgeworCQl3aGlsZSAocGN0eC0+bnJfYmlucy0tKQorCQkJbm91dmVhdV9idWZjdHhfcmVzZXQoJnBjdHgtPmJhc2UsIHBjdHgtPm5yX2JpbnMpOworCQl3aGlsZSAoKHByZWYgPSBwY3R4LT5mcmVlKSkgeworCQkJcGN0eC0+ZnJlZSA9IHByZWYtPm5leHQ7CisJCQlmcmVlKHByZWYpOworCQl9CisJCWZyZWUocGN0eCk7CisJCSpwYmN0eCA9IE5VTEw7CisJfQorfQorCit2b2lkCitub3V2ZWF1X2J1ZmN0eF9yZXNldChzdHJ1Y3Qgbm91dmVhdV9idWZjdHggKmJjdHgsIGludCBiaW4pCit7CisJc3RydWN0IG5vdXZlYXVfYnVmY3R4X3ByaXYgKnBjdHggPSBub3V2ZWF1X2J1ZmN0eChiY3R4KTsKKwlzdHJ1Y3Qgbm91dmVhdV9idWZiaW5fcHJpdiAqcGJpbiA9ICZwY3R4LT5iaW5zW2Jpbl07CisJc3RydWN0IG5vdXZlYXVfYnVmcmVmX3ByaXYgKnByZWY7CisKKwl3aGlsZSAoKHByZWYgPSBwYmluLT5saXN0KSkgeworCQlEUk1MSVNUREVMSU5JVCgmcHJlZi0+YmFzZS50aGVhZCk7CisJCXBiaW4tPmxpc3QgPSBwcmVmLT5uZXh0OworCQlwcmVmLT5uZXh0ID0gcGN0eC0+ZnJlZTsKKwkJcGN0eC0+ZnJlZSA9IHByZWY7CisJfQorCisJYmN0eC0+cmVsb2NzIC09IHBiaW4tPnJlbG9jczsKKwlwYmluLT5yZWxvY3MgID0gMDsKK30KKworc3RydWN0IG5vdXZlYXVfYnVmcmVmICoKK25vdXZlYXVfYnVmY3R4X3JlZm4oc3RydWN0IG5vdXZlYXVfYnVmY3R4ICpiY3R4LCBpbnQgYmluLAorCQkgICAgc3RydWN0IG5vdXZlYXVfYm8gKmJvLCB1aW50MzJfdCBmbGFncykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9idWZjdHhfcHJpdiAqcGN0eCA9IG5vdXZlYXVfYnVmY3R4KGJjdHgpOworCXN0cnVjdCBub3V2ZWF1X2J1ZmJpbl9wcml2ICpwYmluID0gJnBjdHgtPmJpbnNbYmluXTsKKwlzdHJ1Y3Qgbm91dmVhdV9idWZyZWZfcHJpdiAqcHJlZiA9IHBjdHgtPmZyZWU7CisKKwlpZiAoIXByZWYpCisJCXByZWYgPSBtYWxsb2Moc2l6ZW9mKCpwcmVmKSk7CisJZWxzZQorCQlwY3R4LT5mcmVlID0gcHJlZi0+bmV4dDsKKworCWlmIChwcmVmKSB7CisJCXByZWYtPmJhc2UuYm8gPSBibzsKKwkJcHJlZi0+YmFzZS5mbGFncyA9IGZsYWdzOworCQlwcmVmLT5iYXNlLnBhY2tldCA9IDA7CisKKwkJRFJNTElTVEFERFRBSUwoJnByZWYtPmJhc2UudGhlYWQsICZiY3R4LT5wZW5kaW5nKTsKKwkJcHJlZi0+YnVmY3R4ID0gYmN0eDsKKwkJcHJlZi0+bmV4dCA9IHBiaW4tPmxpc3Q7CisJCXBiaW4tPmxpc3QgPSBwcmVmOworCX0KKworCXJldHVybiAmcHJlZi0+YmFzZTsKK30KKworc3RydWN0IG5vdXZlYXVfYnVmcmVmICoKK25vdXZlYXVfYnVmY3R4X210aGQoc3RydWN0IG5vdXZlYXVfYnVmY3R4ICpiY3R4LCBpbnQgYmluLCB1aW50MzJfdCBwYWNrZXQsCisJCSAgICBzdHJ1Y3Qgbm91dmVhdV9ibyAqYm8sIHVpbnQ2NF90IGRhdGEsIHVpbnQzMl90IGZsYWdzLAorCQkgICAgdWludDMyX3Qgdm9yLCB1aW50MzJfdCB0b3IpCit7CisJc3RydWN0IG5vdXZlYXVfYnVmY3R4X3ByaXYgKnBjdHggPSBub3V2ZWF1X2J1ZmN0eChiY3R4KTsKKwlzdHJ1Y3Qgbm91dmVhdV9idWZiaW5fcHJpdiAqcGJpbiA9ICZwY3R4LT5iaW5zW2Jpbl07CisJc3RydWN0IG5vdXZlYXVfYnVmcmVmICpicmVmID0gbm91dmVhdV9idWZjdHhfcmVmbihiY3R4LCBiaW4sIGJvLCBmbGFncyk7CisJaWYgKGJyZWYpIHsKKwkJYnJlZi0+cGFja2V0ID0gcGFja2V0OworCQlicmVmLT5kYXRhID0gZGF0YTsKKwkJYnJlZi0+dm9yID0gdm9yOworCQlicmVmLT50b3IgPSB0b3I7CisJCXBiaW4tPnJlbG9jcysrOworCQliY3R4LT5yZWxvY3MrKzsKKwl9CisJcmV0dXJuIGJyZWY7Cit9CmRpZmYgLS1naXQgYS9ub3V2ZWF1L2xpYmRybV9ub3V2ZWF1LnBjLmluIGIvbm91dmVhdS9saWJkcm1fbm91dmVhdS5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDA2MjJlCi0tLSAvZGV2L251bGwKKysrIGIvbm91dmVhdS9saWJkcm1fbm91dmVhdS5wYy5pbgpAQCAtMCwwICsxLDExIEBACitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKKworTmFtZTogbGliZHJtX25vdXZlYXUKK0Rlc2NyaXB0aW9uOiBVc2Vyc3BhY2UgaW50ZXJmYWNlIHRvIG5vdXZlYXUga2VybmVsIERSTSBzZXJ2aWNlcworVmVyc2lvbjogQFBBQ0tBR0VfVkVSU0lPTkAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sZHJtX25vdXZlYXUKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9IC1JJHtpbmNsdWRlZGlyfS9saWJkcm0gLUkke2luY2x1ZGVkaXJ9L2xpYmRybS9ub3V2ZWF1CitSZXF1aXJlcy5wcml2YXRlOiBsaWJkcm0KZGlmZiAtLWdpdCBhL25vdXZlYXUvbm91dmVhdS1zeW1ib2wtY2hlY2sgYi9ub3V2ZWF1L25vdXZlYXUtc3ltYm9sLWNoZWNrCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIyNjVjZWEKLS0tIC9kZXYvbnVsbAorKysgYi9ub3V2ZWF1L25vdXZlYXUtc3ltYm9sLWNoZWNrCkBAIC0wLDAgKzEsNTggQEAKKyMhL2Jpbi9iYXNoCisKKyMgVGhlIGZvbGxvd2luZyBzeW1ib2xzIChwYXN0IHRoZSBmaXJzdCBmaXZlKSBhcmUgdGFrZW4gZnJvbSB0aGUgcHVibGljIGhlYWRlcnMuCisjIEEgbGlzdCBvZiB0aGUgbGF0dGVyIHNob3VsZCBiZSBhdmFpbGFibGUgTWFrZWZpbGUuc291cmNlcy9MSUJEUk1fTk9VVkVBVV9IX0ZJTEVTCisKK0ZVTkNTPSQobm0gLUQgLS1mb3JtYXQ9YnNkIC0tZGVmaW5lZC1vbmx5ICR7MS0ubGlicy9saWJkcm1fbm91dmVhdS5zb30gfCBhd2sgJ3twcmludCAkM30nfCB3aGlsZSByZWFkIGZ1bmM7IGRvCisoIGdyZXAgLXEgIl4kZnVuYyQiIHx8IGVjaG8gJGZ1bmMgKSAgPDxFT0YKK19fYnNzX3N0YXJ0CitfZWRhdGEKK19lbmQKK19maW5pCitfaW5pdAorbm91dmVhdV9ib19tYXAKK25vdXZlYXVfYm9fbmFtZV9nZXQKK25vdXZlYXVfYm9fbmFtZV9yZWYKK25vdXZlYXVfYm9fbmV3Citub3V2ZWF1X2JvX3ByaW1lX2hhbmRsZV9yZWYKK25vdXZlYXVfYm9fcmVmCitub3V2ZWF1X2JvX3NldF9wcmltZQorbm91dmVhdV9ib193YWl0Citub3V2ZWF1X2JvX3dyYXAKK25vdXZlYXVfYnVmY3R4X2RlbAorbm91dmVhdV9idWZjdHhfbXRoZAorbm91dmVhdV9idWZjdHhfbmV3Citub3V2ZWF1X2J1ZmN0eF9yZWZuCitub3V2ZWF1X2J1ZmN0eF9yZXNldAorbm91dmVhdV9jbGllbnRfZGVsCitub3V2ZWF1X2NsaWVudF9uZXcKK25vdXZlYXVfZGV2aWNlX2RlbAorbm91dmVhdV9kZXZpY2VfbmV3Citub3V2ZWF1X2RldmljZV9vcGVuCitub3V2ZWF1X2RldmljZV9vcGVuX2V4aXN0aW5nCitub3V2ZWF1X2RldmljZV93cmFwCitub3V2ZWF1X2RybV9kZWwKK25vdXZlYXVfZHJtX25ldworbm91dmVhdV9nZXRwYXJhbQorbm91dmVhdV9vYmplY3RfZGVsCitub3V2ZWF1X29iamVjdF9tY2xhc3MKK25vdXZlYXVfb2JqZWN0X210aGQKK25vdXZlYXVfb2JqZWN0X25ldworbm91dmVhdV9vYmplY3Rfc2NsYXNzX2dldAorbm91dmVhdV9vYmplY3Rfc2NsYXNzX3B1dAorbm91dmVhdV9wdXNoYnVmX2J1ZmN0eAorbm91dmVhdV9wdXNoYnVmX2RhdGEKK25vdXZlYXVfcHVzaGJ1Zl9kZWwKK25vdXZlYXVfcHVzaGJ1Zl9raWNrCitub3V2ZWF1X3B1c2hidWZfbmV3Citub3V2ZWF1X3B1c2hidWZfcmVmZAorbm91dmVhdV9wdXNoYnVmX3JlZm4KK25vdXZlYXVfcHVzaGJ1Zl9yZWxvYworbm91dmVhdV9wdXNoYnVmX3NwYWNlCitub3V2ZWF1X3B1c2hidWZfdmFsaWRhdGUKK25vdXZlYXVfc2V0cGFyYW0KK0VPRgorZG9uZSkKKwordGVzdCAhIC1uICIkRlVOQ1MiIHx8IGVjaG8gJEZVTkNTCit0ZXN0ICEgLW4gIiRGVU5DUyIKZGlmZiAtLWdpdCBhL25vdXZlYXUvbm91dmVhdS5jIGIvbm91dmVhdS9ub3V2ZWF1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTExM2E4ZgotLS0gL2Rldi9udWxsCisrKyBiL25vdXZlYXUvbm91dmVhdS5jCkBAIC0wLDAgKzEsODc4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTIgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogQmVuIFNrZWdncworICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDx4Zjg2ZHJtLmg+CisjaW5jbHVkZSA8eGY4NmF0b21pYy5oPgorI2luY2x1ZGUgImxpYmRybV9tYWNyb3MuaCIKKyNpbmNsdWRlICJsaWJkcm1fbGlzdHMuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2RybS5oIgorCisjaW5jbHVkZSAibm91dmVhdS5oIgorI2luY2x1ZGUgInByaXZhdGUuaCIKKworI2luY2x1ZGUgIm52aWYvY2xhc3MuaCIKKyNpbmNsdWRlICJudmlmL2NsMDA4MC5oIgorI2luY2x1ZGUgIm52aWYvaW9jdGwuaCIKKyNpbmNsdWRlICJudmlmL3VucGFjay5oIgorCisjaWZkZWYgREVCVUcKK2RybV9wcml2YXRlIHVpbnQzMl90IG5vdXZlYXVfZGVidWcgPSAwOworCitzdGF0aWMgdm9pZAorZGVidWdfaW5pdChjaGFyICphcmdzKQoreworCWlmIChhcmdzKSB7CisJCWludCBuID0gc3RydG9sKGFyZ3MsIE5VTEwsIDApOworCQlpZiAobiA+PSAwKQorCQkJbm91dmVhdV9kZWJ1ZyA9IG47CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK25vdXZlYXVfb2JqZWN0X2lvY3RsKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqLCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplKQoreworCXN0cnVjdCBub3V2ZWF1X2RybSAqZHJtID0gbm91dmVhdV9kcm0ob2JqKTsKKwl1bmlvbiB7CisJCXN0cnVjdCBudmlmX2lvY3RsX3YwIHYwOworCX0gKmFyZ3MgPSBkYXRhOworCXVpbnQzMl90IGFyZ2MgPSBzaXplOworCWludCByZXQgPSAtRU5PU1lTOworCisJaWYgKCEocmV0ID0gbnZpZl91bnBhY2socmV0LCAmZGF0YSwgJnNpemUsIGFyZ3MtPnYwLCAwLCAwLCB0cnVlKSkpIHsKKwkJaWYgKCFvYmotPmxlbmd0aCkgeworCQkJaWYgKG9iaiAhPSAmZHJtLT5jbGllbnQpCisJCQkJYXJncy0+djAub2JqZWN0ID0gKHVuc2lnbmVkIGxvbmcpKHZvaWQgKilvYmo7CisJCQllbHNlCisJCQkJYXJncy0+djAub2JqZWN0ID0gMDsKKwkJCWFyZ3MtPnYwLm93bmVyID0gTlZJRl9JT0NUTF9WMF9PV05FUl9BTlk7CisJCQlhcmdzLT52MC5yb3V0ZSA9IDB4MDA7CisJCX0gZWxzZSB7CisJCQlhcmdzLT52MC5yb3V0ZSA9IDB4ZmY7CisJCQlhcmdzLT52MC50b2tlbiA9IG9iai0+aGFuZGxlOworCQl9CisJfSBlbHNlCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gZHJtQ29tbWFuZFdyaXRlUmVhZChkcm0tPmZkLCBEUk1fTk9VVkVBVV9OVklGLCBhcmdzLCBhcmdjKTsKK30KKworaW50Citub3V2ZWF1X29iamVjdF9tdGhkKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqLAorCQkgICAgdWludDMyX3QgbXRoZCwgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSA9IG5vdXZlYXVfZHJtKG9iaik7CisJc3RydWN0IHsKKwkJc3RydWN0IG52aWZfaW9jdGxfdjAgaW9jdGw7CisJCXN0cnVjdCBudmlmX2lvY3RsX210aGRfdjAgbXRoZDsKKwl9ICphcmdzOworCXVpbnQzMl90IGFyZ2MgPSBzaXplb2YoKmFyZ3MpICsgc2l6ZTsKKwl1aW50OF90IHN0YWNrWzEyOF07CisJaW50IHJldDsKKworCWlmICghZHJtLT5udmlmKQorCQlyZXR1cm4gLUVOT1NZUzsKKworCWlmIChhcmdjID4gc2l6ZW9mKHN0YWNrKSkgeworCQlpZiAoIShhcmdzID0gbWFsbG9jKGFyZ2MpKSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0gZWxzZSB7CisJCWFyZ3MgPSAodm9pZCAqKXN0YWNrOworCX0KKwlhcmdzLT5pb2N0bC52ZXJzaW9uID0gMDsKKwlhcmdzLT5pb2N0bC50eXBlID0gTlZJRl9JT0NUTF9WMF9NVEhEOworCWFyZ3MtPm10aGQudmVyc2lvbiA9IDA7CisJYXJncy0+bXRoZC5tZXRob2QgPSBtdGhkOworCisJbWVtY3B5KGFyZ3MtPm10aGQuZGF0YSwgZGF0YSwgc2l6ZSk7CisJcmV0ID0gbm91dmVhdV9vYmplY3RfaW9jdGwob2JqLCBhcmdzLCBhcmdjKTsKKwltZW1jcHkoZGF0YSwgYXJncy0+bXRoZC5kYXRhLCBzaXplKTsKKwlpZiAoYXJncyAhPSAodm9pZCAqKXN0YWNrKQorCQlmcmVlKGFyZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK25vdXZlYXVfb2JqZWN0X3NjbGFzc19wdXQoc3RydWN0IG5vdXZlYXVfc2NsYXNzICoqcHNjbGFzcykKK3sKKwlmcmVlKCpwc2NsYXNzKTsKKwkqcHNjbGFzcyA9IE5VTEw7Cit9CisKK2ludAorbm91dmVhdV9vYmplY3Rfc2NsYXNzX2dldChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iaiwKKwkJCSAgc3RydWN0IG5vdXZlYXVfc2NsYXNzICoqcHNjbGFzcykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSA9IG5vdXZlYXVfZHJtKG9iaik7CisJc3RydWN0IHsKKwkJc3RydWN0IG52aWZfaW9jdGxfdjAgaW9jdGw7CisJCXN0cnVjdCBudmlmX2lvY3RsX3NjbGFzc192MCBzY2xhc3M7CisJfSAqYXJncyA9IE5VTEw7CisJc3RydWN0IG5vdXZlYXVfc2NsYXNzICpzY2xhc3M7CisJaW50IHJldCwgY250ID0gMCwgaTsKKwl1aW50MzJfdCBzaXplOworCisJaWYgKCFkcm0tPm52aWYpCisJCXJldHVybiBhYmkxNl9zY2xhc3Mob2JqLCBwc2NsYXNzKTsKKworCXdoaWxlICgxKSB7CisJCXNpemUgPSBzaXplb2YoKmFyZ3MpICsgY250ICogc2l6ZW9mKGFyZ3MtPnNjbGFzcy5vY2xhc3NbMF0pOworCQlpZiAoIShhcmdzID0gbWFsbG9jKHNpemUpKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlhcmdzLT5pb2N0bC52ZXJzaW9uID0gMDsKKwkJYXJncy0+aW9jdGwudHlwZSA9IE5WSUZfSU9DVExfVjBfU0NMQVNTOworCQlhcmdzLT5zY2xhc3MudmVyc2lvbiA9IDA7CisJCWFyZ3MtPnNjbGFzcy5jb3VudCA9IGNudDsKKworCQlyZXQgPSBub3V2ZWF1X29iamVjdF9pb2N0bChvYmosIGFyZ3MsIHNpemUpOworCQlpZiAocmV0ID09IDAgJiYgYXJncy0+c2NsYXNzLmNvdW50IDw9IGNudCkKKwkJCWJyZWFrOworCQljbnQgPSBhcmdzLT5zY2xhc3MuY291bnQ7CisJCWZyZWUoYXJncyk7CisJCWlmIChyZXQgIT0gMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJaWYgKChzY2xhc3MgPSBjYWxsb2MoYXJncy0+c2NsYXNzLmNvdW50LCBzaXplb2YoKnNjbGFzcykpKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgYXJncy0+c2NsYXNzLmNvdW50OyBpKyspIHsKKwkJCXNjbGFzc1tpXS5vY2xhc3MgPSBhcmdzLT5zY2xhc3Mub2NsYXNzW2ldLm9jbGFzczsKKwkJCXNjbGFzc1tpXS5taW52ZXIgPSBhcmdzLT5zY2xhc3Mub2NsYXNzW2ldLm1pbnZlcjsKKwkJCXNjbGFzc1tpXS5tYXh2ZXIgPSBhcmdzLT5zY2xhc3Mub2NsYXNzW2ldLm1heHZlcjsKKwkJfQorCQkqcHNjbGFzcyA9IHNjbGFzczsKKwkJcmV0ID0gYXJncy0+c2NsYXNzLmNvdW50OworCX0gZWxzZSB7CisJCXJldCA9IC1FTk9NRU07CisJfQorCisJZnJlZShhcmdzKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK25vdXZlYXVfb2JqZWN0X21jbGFzcyhzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iaiwKKwkJICAgICAgY29uc3Qgc3RydWN0IG5vdXZlYXVfbWNsYXNzICptY2xhc3MpCit7CisJc3RydWN0IG5vdXZlYXVfc2NsYXNzICpzY2xhc3M7CisJaW50IHJldCA9IC1FTk9ERVY7CisJaW50IGNudCwgaSwgajsKKworCWNudCA9IG5vdXZlYXVfb2JqZWN0X3NjbGFzc19nZXQob2JqLCAmc2NsYXNzKTsKKwlpZiAoY250IDwgMCkKKwkJcmV0dXJuIGNudDsKKworCWZvciAoaSA9IDA7IHJldCA8IDAgJiYgbWNsYXNzW2ldLm9jbGFzczsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBjbnQ7IGorKykgeworCQkJaWYgKG1jbGFzc1tpXS5vY2xhc3MgID09IHNjbGFzc1tqXS5vY2xhc3MgJiYKKwkJCSAgICBtY2xhc3NbaV0udmVyc2lvbiA+PSBzY2xhc3Nbal0ubWludmVyICYmCisJCQkgICAgbWNsYXNzW2ldLnZlcnNpb24gPD0gc2NsYXNzW2pdLm1heHZlcikgeworCQkJCXJldCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlub3V2ZWF1X29iamVjdF9zY2xhc3NfcHV0KCZzY2xhc3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitub3V2ZWF1X29iamVjdF9maW5pKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqKQoreworCXN0cnVjdCB7CisJCXN0cnVjdCBudmlmX2lvY3RsX3YwIGlvY3RsOworCQlzdHJ1Y3QgbnZpZl9pb2N0bF9kZWwgZGVsOworCX0gYXJncyA9IHsKKwkJLmlvY3RsLnR5cGUgPSBOVklGX0lPQ1RMX1YwX0RFTCwKKwl9OworCisJaWYgKG9iai0+ZGF0YSkgeworCQlhYmkxNl9kZWxldGUob2JqKTsKKwkJZnJlZShvYmotPmRhdGEpOworCQlvYmotPmRhdGEgPSBOVUxMOworCQlyZXR1cm47CisJfQorCisJbm91dmVhdV9vYmplY3RfaW9jdGwob2JqLCAmYXJncywgc2l6ZW9mKGFyZ3MpKTsKK30KKworc3RhdGljIGludAorbm91dmVhdV9vYmplY3RfaW5pdChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKnBhcmVudCwgdWludDMyX3QgaGFuZGxlLAorCQkgICAgaW50MzJfdCBvY2xhc3MsIHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemUsCisJCSAgICBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSA9IG5vdXZlYXVfZHJtKHBhcmVudCk7CisJc3RydWN0IHsKKwkJc3RydWN0IG52aWZfaW9jdGxfdjAgaW9jdGw7CisJCXN0cnVjdCBudmlmX2lvY3RsX25ld192MCBuZXc7CisJfSAqYXJnczsKKwl1aW50MzJfdCBhcmdjID0gc2l6ZW9mKCphcmdzKSArIHNpemU7CisJaW50ICgqZnVuYykoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICopOworCWludCByZXQgPSAtRU5PU1lTOworCisJb2JqLT5wYXJlbnQgPSBwYXJlbnQ7CisJb2JqLT5oYW5kbGUgPSBoYW5kbGU7CisJb2JqLT5vY2xhc3MgPSBvY2xhc3M7CisJb2JqLT5sZW5ndGggPSAwOworCW9iai0+ZGF0YSA9IE5VTEw7CisKKwlpZiAoIWFiaTE2X29iamVjdChvYmosICZmdW5jKSAmJiBkcm0tPm52aWYpIHsKKwkJaWYgKCEoYXJncyA9IG1hbGxvYyhhcmdjKSkpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJYXJncy0+aW9jdGwudmVyc2lvbiA9IDA7CisJCWFyZ3MtPmlvY3RsLnR5cGUgPSBOVklGX0lPQ1RMX1YwX05FVzsKKwkJYXJncy0+bmV3LnZlcnNpb24gPSAwOworCQlhcmdzLT5uZXcucm91dGUgPSBOVklGX0lPQ1RMX1YwX1JPVVRFX05WSUY7CisJCWFyZ3MtPm5ldy50b2tlbiA9ICh1bnNpZ25lZCBsb25nKSh2b2lkICopb2JqOworCQlhcmdzLT5uZXcub2JqZWN0ID0gKHVuc2lnbmVkIGxvbmcpKHZvaWQgKilvYmo7CisJCWFyZ3MtPm5ldy5oYW5kbGUgPSBoYW5kbGU7CisJCWFyZ3MtPm5ldy5vY2xhc3MgPSBvY2xhc3M7CisJCW1lbWNweShhcmdzLT5uZXcuZGF0YSwgZGF0YSwgc2l6ZSk7CisJCXJldCA9IG5vdXZlYXVfb2JqZWN0X2lvY3RsKHBhcmVudCwgYXJncywgYXJnYyk7CisJCW1lbWNweShkYXRhLCBhcmdzLT5uZXcuZGF0YSwgc2l6ZSk7CisJCWZyZWUoYXJncyk7CisJfSBlbHNlCisJaWYgKGZ1bmMpIHsKKwkJb2JqLT5sZW5ndGggPSBzaXplID8gc2l6ZSA6IHNpemVvZihzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKik7CisJCWlmICghKG9iai0+ZGF0YSA9IG1hbGxvYyhvYmotPmxlbmd0aCkpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWlmIChkYXRhKQorCQkJbWVtY3B5KG9iai0+ZGF0YSwgZGF0YSwgb2JqLT5sZW5ndGgpOworCQkqKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKilvYmotPmRhdGEgPSBvYmo7CisKKwkJcmV0ID0gZnVuYyhvYmopOworCX0KKworCWlmIChyZXQpIHsKKwkJbm91dmVhdV9vYmplY3RfZmluaShvYmopOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitpbnQKK25vdXZlYXVfb2JqZWN0X25ldyhzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKnBhcmVudCwgdWludDY0X3QgaGFuZGxlLAorCQkgICB1aW50MzJfdCBvY2xhc3MsIHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbmd0aCwKKwkJICAgc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqcG9iaikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iajsKKwlpbnQgcmV0OworCisJaWYgKCEob2JqID0gbWFsbG9jKHNpemVvZigqb2JqKSkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IG5vdXZlYXVfb2JqZWN0X2luaXQocGFyZW50LCBoYW5kbGUsIG9jbGFzcywgZGF0YSwgbGVuZ3RoLCBvYmopOworCWlmIChyZXQpIHsKKwkJZnJlZShvYmopOworCQlyZXR1cm4gcmV0OworCX0KKworCSpwb2JqID0gb2JqOworCXJldHVybiAwOworfQorCit2b2lkCitub3V2ZWF1X29iamVjdF9kZWwoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICoqcG9iaikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKm9iaiA9ICpwb2JqOworCWlmIChvYmopIHsKKwkJbm91dmVhdV9vYmplY3RfZmluaShvYmopOworCQlmcmVlKG9iaik7CisJCSpwb2JqID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQKK25vdXZlYXVfZHJtX2RlbChzdHJ1Y3Qgbm91dmVhdV9kcm0gKipwZHJtKQoreworCWZyZWUoKnBkcm0pOworCSpwZHJtID0gTlVMTDsKK30KKworaW50Citub3V2ZWF1X2RybV9uZXcoaW50IGZkLCBzdHJ1Y3Qgbm91dmVhdV9kcm0gKipwZHJtKQoreworCXN0cnVjdCBub3V2ZWF1X2RybSAqZHJtOworCWRybVZlcnNpb25QdHIgdmVyOworCisjaWZkZWYgREVCVUcKKwlkZWJ1Z19pbml0KGdldGVudigiTk9VVkVBVV9MSUJEUk1fREVCVUciKSk7CisjZW5kaWYKKworCWlmICghKGRybSA9IGNhbGxvYygxLCBzaXplb2YoKmRybSkpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZHJtLT5mZCA9IGZkOworCisJaWYgKCEodmVyID0gZHJtR2V0VmVyc2lvbihmZCkpKSB7CisJCW5vdXZlYXVfZHJtX2RlbCgmZHJtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCSpwZHJtID0gZHJtOworCisJZHJtLT52ZXJzaW9uID0gKHZlci0+dmVyc2lvbl9tYWpvciA8PCAyNCkgfAorCQkgICAgICAgKHZlci0+dmVyc2lvbl9taW5vciA8PCA4KSB8CisJCSAgICAgICAgdmVyLT52ZXJzaW9uX3BhdGNobGV2ZWw7CisJZHJtLT5udmlmID0gKGRybS0+dmVyc2lvbiA+PSAweDAxMDAwMzAxKTsKKwlkcm1GcmVlVmVyc2lvbih2ZXIpOworCXJldHVybiAwOworfQorCisvKiB0aGlzIGlzIHRoZSBvbGQgbGliZHJtJ3MgdmVyc2lvbiBvZiBub3V2ZWF1X2RldmljZV93cmFwKCksIHRoZSBzeW1ib2wKKyAqIGlzIGtlcHQgaGVyZSB0byBwcmV2ZW50IEFJR0xYIGZyb20gY3Jhc2hpbmcgaWYgdGhlIEREWCBpcyBsaW5rZWQgYWdhaW5zdAorICogdGhlIG5ldyBsaWJkcm0sIGJ1dCB0aGUgRFJJIGRyaXZlciBhZ2FpbnN0IHRoZSBvbGQKKyAqLworaW50Citub3V2ZWF1X2RldmljZV9vcGVuX2V4aXN0aW5nKHN0cnVjdCBub3V2ZWF1X2RldmljZSAqKnBkZXYsIGludCBjbG9zZSwgaW50IGZkLAorCQkJICAgICBkcm1fY29udGV4dF90IGN0eCkKK3sKKwlyZXR1cm4gLUVBQ0NFUzsKK30KKworaW50Citub3V2ZWF1X2RldmljZV9uZXcoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpwYXJlbnQsIGludDMyX3Qgb2NsYXNzLAorCQkgICB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplLCBzdHJ1Y3Qgbm91dmVhdV9kZXZpY2UgKipwZGV2KQoreworCXN0cnVjdCBudl9kZXZpY2VfaW5mb192MCBpbmZvID0ge307CisJdW5pb24geworCQlzdHJ1Y3QgbnZfZGV2aWNlX3YwIHYwOworCX0gKmFyZ3MgPSBkYXRhOworCXVpbnQzMl90IGFyZ2MgPSBzaXplOworCXN0cnVjdCBub3V2ZWF1X2RybSAqZHJtID0gbm91dmVhdV9kcm0ocGFyZW50KTsKKwlzdHJ1Y3Qgbm91dmVhdV9kZXZpY2VfcHJpdiAqbnZkZXY7CisJc3RydWN0IG5vdXZlYXVfZGV2aWNlICpkZXY7CisJdWludDY0X3QgdjsKKwljaGFyICp0bXA7CisJaW50IHJldCA9IC1FTk9TWVM7CisKKwlpZiAob2NsYXNzICE9IE5WX0RFVklDRSB8fAorCSAgICBudmlmX3VucGFjayhyZXQsICZkYXRhLCAmc2l6ZSwgYXJncy0+djAsIDAsIDAsIGZhbHNlKSkKKwkJcmV0dXJuIHJldDsKKworCWlmICghKG52ZGV2ID0gY2FsbG9jKDEsIHNpemVvZigqbnZkZXYpKSkpCisJCXJldHVybiAtRU5PTUVNOworCWRldiA9ICpwZGV2ID0gJm52ZGV2LT5iYXNlOworCWRldi0+ZmQgPSAtMTsKKworCWlmIChkcm0tPm52aWYpIHsKKwkJcmV0ID0gbm91dmVhdV9vYmplY3RfaW5pdChwYXJlbnQsIDAsIG9jbGFzcywgYXJncywgYXJnYywKKwkJCQkJICAmZGV2LT5vYmplY3QpOworCQlpZiAocmV0KQorCQkJZ290byBkb25lOworCisJCWluZm8udmVyc2lvbiA9IDA7CisKKwkJcmV0ID0gbm91dmVhdV9vYmplY3RfbXRoZCgmZGV2LT5vYmplY3QsIE5WX0RFVklDRV9WMF9JTkZPLAorCQkJCQkgICZpbmZvLCBzaXplb2YoaW5mbykpOworCQlpZiAocmV0KQorCQkJZ290byBkb25lOworCisJCW52ZGV2LT5iYXNlLmNoaXBzZXQgPSBpbmZvLmNoaXBzZXQ7CisJCW52ZGV2LT5oYXZlX2JvX3VzYWdlID0gdHJ1ZTsKKwl9IGVsc2UKKwlpZiAoYXJncy0+djAuZGV2aWNlID09IH4wVUxMKSB7CisJCW52ZGV2LT5iYXNlLm9iamVjdC5wYXJlbnQgPSAmZHJtLT5jbGllbnQ7CisJCW52ZGV2LT5iYXNlLm9iamVjdC5oYW5kbGUgPSB+MFVMTDsKKwkJbnZkZXYtPmJhc2Uub2JqZWN0Lm9jbGFzcyA9IE5PVVZFQVVfREVWSUNFX0NMQVNTOworCQludmRldi0+YmFzZS5vYmplY3QubGVuZ3RoID0gfjA7CisKKwkJcmV0ID0gbm91dmVhdV9nZXRwYXJhbShkZXYsIE5PVVZFQVVfR0VUUEFSQU1fQ0hJUFNFVF9JRCwgJnYpOworCQlpZiAocmV0KQorCQkJZ290byBkb25lOworCQludmRldi0+YmFzZS5jaGlwc2V0ID0gdjsKKworCQlyZXQgPSBub3V2ZWF1X2dldHBhcmFtKGRldiwgTk9VVkVBVV9HRVRQQVJBTV9IQVNfQk9fVVNBR0UsICZ2KTsKKwkJaWYgKHJldCA9PSAwKQorCQkJbnZkZXYtPmhhdmVfYm9fdXNhZ2UgPSAodiAhPSAwKTsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FTk9TWVM7CisKKwlyZXQgPSBub3V2ZWF1X2dldHBhcmFtKGRldiwgTk9VVkVBVV9HRVRQQVJBTV9GQl9TSVpFLCAmdik7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCW52ZGV2LT5iYXNlLnZyYW1fc2l6ZSA9IHY7CisKKwlyZXQgPSBub3V2ZWF1X2dldHBhcmFtKGRldiwgTk9VVkVBVV9HRVRQQVJBTV9BR1BfU0laRSwgJnYpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKwludmRldi0+YmFzZS5nYXJ0X3NpemUgPSB2OworCisJdG1wID0gZ2V0ZW52KCJOT1VWRUFVX0xJQkRSTV9WUkFNX0xJTUlUX1BFUkNFTlQiKTsKKwlpZiAodG1wKQorCQludmRldi0+dnJhbV9saW1pdF9wZXJjZW50ID0gYXRvaSh0bXApOworCWVsc2UKKwkJbnZkZXYtPnZyYW1fbGltaXRfcGVyY2VudCA9IDgwOworCisJbnZkZXYtPmJhc2UudnJhbV9saW1pdCA9CisJCShudmRldi0+YmFzZS52cmFtX3NpemUgKiBudmRldi0+dnJhbV9saW1pdF9wZXJjZW50KSAvIDEwMDsKKworCXRtcCA9IGdldGVudigiTk9VVkVBVV9MSUJEUk1fR0FSVF9MSU1JVF9QRVJDRU5UIik7CisJaWYgKHRtcCkKKwkJbnZkZXYtPmdhcnRfbGltaXRfcGVyY2VudCA9IGF0b2kodG1wKTsKKwllbHNlCisJCW52ZGV2LT5nYXJ0X2xpbWl0X3BlcmNlbnQgPSA4MDsKKworCW52ZGV2LT5iYXNlLmdhcnRfbGltaXQgPQorCQkobnZkZXYtPmJhc2UuZ2FydF9zaXplICogbnZkZXYtPmdhcnRfbGltaXRfcGVyY2VudCkgLyAxMDA7CisKKwlyZXQgPSBwdGhyZWFkX211dGV4X2luaXQoJm52ZGV2LT5sb2NrLCBOVUxMKTsKKwlEUk1JTklUTElTVEhFQUQoJm52ZGV2LT5ib19saXN0KTsKK2RvbmU6CisJaWYgKHJldCkKKwkJbm91dmVhdV9kZXZpY2VfZGVsKHBkZXYpOworCXJldHVybiByZXQ7Cit9CisKK2ludAorbm91dmVhdV9kZXZpY2Vfd3JhcChpbnQgZmQsIGludCBjbG9zZSwgc3RydWN0IG5vdXZlYXVfZGV2aWNlICoqcGRldikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybTsKKwlzdHJ1Y3Qgbm91dmVhdV9kZXZpY2VfcHJpdiAqbnZkZXY7CisJaW50IHJldDsKKworCXJldCA9IG5vdXZlYXVfZHJtX25ldyhmZCwgJmRybSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlkcm0tPm52aWYgPSBmYWxzZTsKKworCXJldCA9IG5vdXZlYXVfZGV2aWNlX25ldygmZHJtLT5jbGllbnQsIE5WX0RFVklDRSwKKwkJCQkgJihzdHJ1Y3QgbnZfZGV2aWNlX3YwKSB7CisJCQkJCS5kZXZpY2UgPSB+MFVMTCwKKwkJCQkgfSwgc2l6ZW9mKHN0cnVjdCBudl9kZXZpY2VfdjApLCBwZGV2KTsKKwlpZiAocmV0KSB7CisJCW5vdXZlYXVfZHJtX2RlbCgmZHJtKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwludmRldiA9IG5vdXZlYXVfZGV2aWNlKCpwZGV2KTsKKwludmRldi0+YmFzZS5mZCA9IGRybS0+ZmQ7CisJbnZkZXYtPmJhc2UuZHJtX3ZlcnNpb24gPSBkcm0tPnZlcnNpb247CisJbnZkZXYtPmNsb3NlID0gY2xvc2U7CisJcmV0dXJuIDA7Cit9CisKK2ludAorbm91dmVhdV9kZXZpY2Vfb3Blbihjb25zdCBjaGFyICpidXNpZCwgc3RydWN0IG5vdXZlYXVfZGV2aWNlICoqcGRldikKK3sKKwlpbnQgcmV0ID0gLUVOT0RFViwgZmQgPSBkcm1PcGVuKCJub3V2ZWF1IiwgYnVzaWQpOworCWlmIChmZCA+PSAwKSB7CisJCXJldCA9IG5vdXZlYXVfZGV2aWNlX3dyYXAoZmQsIDEsIHBkZXYpOworCQlpZiAocmV0KQorCQkJZHJtQ2xvc2UoZmQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCit2b2lkCitub3V2ZWF1X2RldmljZV9kZWwoc3RydWN0IG5vdXZlYXVfZGV2aWNlICoqcGRldikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9kZXZpY2VfcHJpdiAqbnZkZXYgPSBub3V2ZWF1X2RldmljZSgqcGRldik7CisJaWYgKG52ZGV2KSB7CisJCWZyZWUobnZkZXYtPmNsaWVudCk7CisJCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbnZkZXYtPmxvY2spOworCQlpZiAobnZkZXYtPmJhc2UuZmQgPj0gMCkgeworCQkJc3RydWN0IG5vdXZlYXVfZHJtICpkcm0gPQorCQkJCW5vdXZlYXVfZHJtKCZudmRldi0+YmFzZS5vYmplY3QpOworCQkJbm91dmVhdV9kcm1fZGVsKCZkcm0pOworCQkJaWYgKG52ZGV2LT5jbG9zZSkKKwkJCQlkcm1DbG9zZShudmRldi0+YmFzZS5mZCk7CisJCX0KKwkJZnJlZShudmRldik7CisJCSpwZGV2ID0gTlVMTDsKKwl9Cit9CisKK2ludAorbm91dmVhdV9nZXRwYXJhbShzdHJ1Y3Qgbm91dmVhdV9kZXZpY2UgKmRldiwgdWludDY0X3QgcGFyYW0sIHVpbnQ2NF90ICp2YWx1ZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSA9IG5vdXZlYXVfZHJtKCZkZXYtPm9iamVjdCk7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dldHBhcmFtIHIgPSB7IC5wYXJhbSA9IHBhcmFtIH07CisJaW50IGZkID0gZHJtLT5mZCwgcmV0ID0KKwkJZHJtQ29tbWFuZFdyaXRlUmVhZChmZCwgRFJNX05PVVZFQVVfR0VUUEFSQU0sICZyLCBzaXplb2YocikpOworCSp2YWx1ZSA9IHIudmFsdWU7CisJcmV0dXJuIHJldDsKK30KKworaW50Citub3V2ZWF1X3NldHBhcmFtKHN0cnVjdCBub3V2ZWF1X2RldmljZSAqZGV2LCB1aW50NjRfdCBwYXJhbSwgdWludDY0X3QgdmFsdWUpCit7CisJc3RydWN0IG5vdXZlYXVfZHJtICpkcm0gPSBub3V2ZWF1X2RybSgmZGV2LT5vYmplY3QpOworCXN0cnVjdCBkcm1fbm91dmVhdV9zZXRwYXJhbSByID0geyAucGFyYW0gPSBwYXJhbSwgLnZhbHVlID0gdmFsdWUgfTsKKwlyZXR1cm4gZHJtQ29tbWFuZFdyaXRlKGRybS0+ZmQsIERSTV9OT1VWRUFVX1NFVFBBUkFNLCAmciwgc2l6ZW9mKHIpKTsKK30KKworaW50Citub3V2ZWF1X2NsaWVudF9uZXcoc3RydWN0IG5vdXZlYXVfZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2NsaWVudCAqKnBjbGllbnQpCit7CisJc3RydWN0IG5vdXZlYXVfZGV2aWNlX3ByaXYgKm52ZGV2ID0gbm91dmVhdV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgbm91dmVhdV9jbGllbnRfcHJpdiAqcGNsaTsKKwlpbnQgaWQgPSAwLCBpLCByZXQgPSAtRU5PTUVNOworCXVpbnQzMl90ICpjbGllbnRzOworCisJcHRocmVhZF9tdXRleF9sb2NrKCZudmRldi0+bG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnZkZXYtPm5yX2NsaWVudDsgaSsrKSB7CisJCWlkID0gZmZzKG52ZGV2LT5jbGllbnRbaV0pIC0gMTsKKwkJaWYgKGlkID49IDApCisJCQlnb3RvIG91dDsKKwl9CisKKwljbGllbnRzID0gcmVhbGxvYyhudmRldi0+Y2xpZW50LCBzaXplb2YodWludDMyX3QpICogKGkgKyAxKSk7CisJaWYgKCFjbGllbnRzKQorCQlnb3RvIHVubG9jazsKKwludmRldi0+Y2xpZW50ID0gY2xpZW50czsKKwludmRldi0+Y2xpZW50W2ldID0gMDsKKwludmRldi0+bnJfY2xpZW50Kys7CisKK291dDoKKwlwY2xpID0gY2FsbG9jKDEsIHNpemVvZigqcGNsaSkpOworCWlmIChwY2xpKSB7CisJCW52ZGV2LT5jbGllbnRbaV0gfD0gKDEgPDwgaWQpOworCQlwY2xpLT5iYXNlLmRldmljZSA9IGRldjsKKwkJcGNsaS0+YmFzZS5pZCA9IChpICogMzIpICsgaWQ7CisJCXJldCA9IDA7CisJfQorCisJKnBjbGllbnQgPSAmcGNsaS0+YmFzZTsKKwordW5sb2NrOgorCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZudmRldi0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZAorbm91dmVhdV9jbGllbnRfZGVsKHN0cnVjdCBub3V2ZWF1X2NsaWVudCAqKnBjbGllbnQpCit7CisJc3RydWN0IG5vdXZlYXVfY2xpZW50X3ByaXYgKnBjbGkgPSBub3V2ZWF1X2NsaWVudCgqcGNsaWVudCk7CisJc3RydWN0IG5vdXZlYXVfZGV2aWNlX3ByaXYgKm52ZGV2OworCWlmIChwY2xpKSB7CisJCWludCBpZCA9IHBjbGktPmJhc2UuaWQ7CisJCW52ZGV2ID0gbm91dmVhdV9kZXZpY2UocGNsaS0+YmFzZS5kZXZpY2UpOworCQlwdGhyZWFkX211dGV4X2xvY2soJm52ZGV2LT5sb2NrKTsKKwkJbnZkZXYtPmNsaWVudFtpZCAvIDMyXSAmPSB+KDEgPDwgKGlkICUgMzIpKTsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJm52ZGV2LT5sb2NrKTsKKwkJZnJlZShwY2xpLT5rcmVmKTsKKwkJZnJlZShwY2xpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitub3V2ZWF1X2JvX2RlbChzdHJ1Y3Qgbm91dmVhdV9ibyAqYm8pCit7CisJc3RydWN0IG5vdXZlYXVfZHJtICpkcm0gPSBub3V2ZWF1X2RybSgmYm8tPmRldmljZS0+b2JqZWN0KTsKKwlzdHJ1Y3Qgbm91dmVhdV9kZXZpY2VfcHJpdiAqbnZkZXYgPSBub3V2ZWF1X2RldmljZShiby0+ZGV2aWNlKTsKKwlzdHJ1Y3Qgbm91dmVhdV9ib19wcml2ICpudmJvID0gbm91dmVhdV9ibyhibyk7CisJc3RydWN0IGRybV9nZW1fY2xvc2UgcmVxID0geyAuaGFuZGxlID0gYm8tPmhhbmRsZSB9OworCisJaWYgKG52Ym8tPmhlYWQubmV4dCkgeworCQlwdGhyZWFkX211dGV4X2xvY2soJm52ZGV2LT5sb2NrKTsKKwkJaWYgKGF0b21pY19yZWFkKCZudmJvLT5yZWZjbnQpID09IDApIHsKKwkJCURSTUxJU1RERUwoJm52Ym8tPmhlYWQpOworCQkJLyoKKwkJCSAqIFRoaXMgYm8gaGFzIHRvIGJlIGNsb3NlZCB3aXRoIHRoZSBsb2NrIGhlbGQgYmVjYXVzZQorCQkJICogZ2VtIGhhbmRsZXMgYXJlIG5vdCByZWZjb3VudGVkLiBJZiBhIHNoYXJlZCBibyBpcworCQkJICogY2xvc2VkIGFuZCByZS1vcGVuZWQgaW4gYW5vdGhlciB0aHJlYWQgYSByYWNlCisJCQkgKiBhZ2FpbnN0IERSTV9JT0NUTF9HRU1fT1BFTiBvciBkcm1QcmltZUZEVG9IYW5kbGUKKwkJCSAqIG1pZ2h0IGNhdXNlIHRoZSBibyB0byBiZSBjbG9zZWQgYWNjaWRlbnRhbGx5IHdoaWxlCisJCQkgKiByZS1pbXBvcnRpbmcuCisJCQkgKi8KKwkJCWRybUlvY3RsKGRybS0+ZmQsIERSTV9JT0NUTF9HRU1fQ0xPU0UsICZyZXEpOworCQl9CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZudmRldi0+bG9jayk7CisJfSBlbHNlIHsKKwkJZHJtSW9jdGwoZHJtLT5mZCwgRFJNX0lPQ1RMX0dFTV9DTE9TRSwgJnJlcSk7CisJfQorCWlmIChiby0+bWFwKQorCQlkcm1fbXVubWFwKGJvLT5tYXAsIGJvLT5zaXplKTsKKwlmcmVlKG52Ym8pOworfQorCitpbnQKK25vdXZlYXVfYm9fbmV3KHN0cnVjdCBub3V2ZWF1X2RldmljZSAqZGV2LCB1aW50MzJfdCBmbGFncywgdWludDMyX3QgYWxpZ24sCisJICAgICAgIHVpbnQ2NF90IHNpemUsIHVuaW9uIG5vdXZlYXVfYm9fY29uZmlnICpjb25maWcsCisJICAgICAgIHN0cnVjdCBub3V2ZWF1X2JvICoqcGJvKQoreworCXN0cnVjdCBub3V2ZWF1X2JvX3ByaXYgKm52Ym8gPSBjYWxsb2MoMSwgc2l6ZW9mKCpudmJvKSk7CisJc3RydWN0IG5vdXZlYXVfYm8gKmJvID0gJm52Ym8tPmJhc2U7CisJaW50IHJldDsKKworCWlmICghbnZibykKKwkJcmV0dXJuIC1FTk9NRU07CisJYXRvbWljX3NldCgmbnZiby0+cmVmY250LCAxKTsKKwliby0+ZGV2aWNlID0gZGV2OworCWJvLT5mbGFncyA9IGZsYWdzOworCWJvLT5zaXplID0gc2l6ZTsKKworCXJldCA9IGFiaTE2X2JvX2luaXQoYm8sIGFsaWduLCBjb25maWcpOworCWlmIChyZXQpIHsKKwkJZnJlZShudmJvKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkqcGJvID0gYm87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfYm9fd3JhcF9sb2NrZWQoc3RydWN0IG5vdXZlYXVfZGV2aWNlICpkZXYsIHVpbnQzMl90IGhhbmRsZSwKKwkJICAgICAgIHN0cnVjdCBub3V2ZWF1X2JvICoqcGJvLCBpbnQgbmFtZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSA9IG5vdXZlYXVfZHJtKCZkZXYtPm9iamVjdCk7CisJc3RydWN0IG5vdXZlYXVfZGV2aWNlX3ByaXYgKm52ZGV2ID0gbm91dmVhdV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX2luZm8gcmVxID0geyAuaGFuZGxlID0gaGFuZGxlIH07CisJc3RydWN0IG5vdXZlYXVfYm9fcHJpdiAqbnZibzsKKwlpbnQgcmV0OworCisJRFJNTElTVEZPUkVBQ0hFTlRSWShudmJvLCAmbnZkZXYtPmJvX2xpc3QsIGhlYWQpIHsKKwkJaWYgKG52Ym8tPmJhc2UuaGFuZGxlID09IGhhbmRsZSkgeworCQkJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZudmJvLT5yZWZjbnQpID09IDEpIHsKKwkJCQkvKgorCQkJCSAqIFVoIG9oLCB0aGlzIGJvIGlzIGRlYWQgYW5kIHNvbWVvbmUgZWxzZQorCQkJCSAqIHdpbGwgZnJlZSBpdCwgYnV0IGJlY2F1c2UgcmVmY250IGlzCisJCQkJICogbm93IG5vbi16ZXJvIGZvcnR1bmF0ZWx5IHRoZXkgd29uJ3QKKwkJCQkgKiBjYWxsIHRoZSBpb2N0bCB0byBjbG9zZSB0aGUgYm8uCisJCQkJICoKKwkJCQkgKiBSZW1vdmUgdGhpcyBibyBmcm9tIHRoZSBsaXN0IHNvIG90aGVyCisJCQkJICogY2FsbHMgdG8gbm91dmVhdV9ib193cmFwX2xvY2tlZCB3aWxsCisJCQkJICogc2VlIG91ciByZXBsYWNlbWVudCBudmJvLgorCQkJCSAqLworCQkJCURSTUxJU1RERUwoJm52Ym8tPmhlYWQpOworCQkJCWlmICghbmFtZSkKKwkJCQkJbmFtZSA9IG52Ym8tPm5hbWU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCSpwYm8gPSAmbnZiby0+YmFzZTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0ID0gZHJtQ29tbWFuZFdyaXRlUmVhZChkcm0tPmZkLCBEUk1fTk9VVkVBVV9HRU1fSU5GTywKKwkJCQkgICZyZXEsIHNpemVvZihyZXEpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbnZibyA9IGNhbGxvYygxLCBzaXplb2YoKm52Ym8pKTsKKwlpZiAobnZibykgeworCQlhdG9taWNfc2V0KCZudmJvLT5yZWZjbnQsIDEpOworCQludmJvLT5iYXNlLmRldmljZSA9IGRldjsKKwkJYWJpMTZfYm9faW5mbygmbnZiby0+YmFzZSwgJnJlcSk7CisJCW52Ym8tPm5hbWUgPSBuYW1lOworCQlEUk1MSVNUQUREKCZudmJvLT5oZWFkLCAmbnZkZXYtPmJvX2xpc3QpOworCQkqcGJvID0gJm52Ym8tPmJhc2U7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV9ib19tYWtlX2dsb2JhbChzdHJ1Y3Qgbm91dmVhdV9ib19wcml2ICpudmJvKQoreworCWlmICghbnZiby0+aGVhZC5uZXh0KSB7CisJCXN0cnVjdCBub3V2ZWF1X2RldmljZV9wcml2ICpudmRldiA9IG5vdXZlYXVfZGV2aWNlKG52Ym8tPmJhc2UuZGV2aWNlKTsKKwkJcHRocmVhZF9tdXRleF9sb2NrKCZudmRldi0+bG9jayk7CisJCWlmICghbnZiby0+aGVhZC5uZXh0KQorCQkJRFJNTElTVEFERCgmbnZiby0+aGVhZCwgJm52ZGV2LT5ib19saXN0KTsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJm52ZGV2LT5sb2NrKTsKKwl9Cit9CisKK2ludAorbm91dmVhdV9ib193cmFwKHN0cnVjdCBub3V2ZWF1X2RldmljZSAqZGV2LCB1aW50MzJfdCBoYW5kbGUsCisJCXN0cnVjdCBub3V2ZWF1X2JvICoqcGJvKQoreworCXN0cnVjdCBub3V2ZWF1X2RldmljZV9wcml2ICpudmRldiA9IG5vdXZlYXVfZGV2aWNlKGRldik7CisJaW50IHJldDsKKwlwdGhyZWFkX211dGV4X2xvY2soJm52ZGV2LT5sb2NrKTsKKwlyZXQgPSBub3V2ZWF1X2JvX3dyYXBfbG9ja2VkKGRldiwgaGFuZGxlLCBwYm8sIDApOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZudmRldi0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworaW50Citub3V2ZWF1X2JvX25hbWVfcmVmKHN0cnVjdCBub3V2ZWF1X2RldmljZSAqZGV2LCB1aW50MzJfdCBuYW1lLAorCQkgICAgc3RydWN0IG5vdXZlYXVfYm8gKipwYm8pCit7CisJc3RydWN0IG5vdXZlYXVfZHJtICpkcm0gPSBub3V2ZWF1X2RybSgmZGV2LT5vYmplY3QpOworCXN0cnVjdCBub3V2ZWF1X2RldmljZV9wcml2ICpudmRldiA9IG5vdXZlYXVfZGV2aWNlKGRldik7CisJc3RydWN0IG5vdXZlYXVfYm9fcHJpdiAqbnZibzsKKwlzdHJ1Y3QgZHJtX2dlbV9vcGVuIHJlcSA9IHsgLm5hbWUgPSBuYW1lIH07CisJaW50IHJldDsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmbnZkZXYtPmxvY2spOworCURSTUxJU1RGT1JFQUNIRU5UUlkobnZibywgJm52ZGV2LT5ib19saXN0LCBoZWFkKSB7CisJCWlmIChudmJvLT5uYW1lID09IG5hbWUpIHsKKwkJCXJldCA9IG5vdXZlYXVfYm9fd3JhcF9sb2NrZWQoZGV2LCBudmJvLT5iYXNlLmhhbmRsZSwKKwkJCQkJCSAgICAgcGJvLCBuYW1lKTsKKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZudmRldi0+bG9jayk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0ID0gZHJtSW9jdGwoZHJtLT5mZCwgRFJNX0lPQ1RMX0dFTV9PUEVOLCAmcmVxKTsKKwlpZiAocmV0ID09IDApIHsKKwkJcmV0ID0gbm91dmVhdV9ib193cmFwX2xvY2tlZChkZXYsIHJlcS5oYW5kbGUsIHBibywgbmFtZSk7CisJfQorCisJcHRocmVhZF9tdXRleF91bmxvY2soJm52ZGV2LT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK25vdXZlYXVfYm9fbmFtZV9nZXQoc3RydWN0IG5vdXZlYXVfYm8gKmJvLCB1aW50MzJfdCAqbmFtZSkKK3sKKwlzdHJ1Y3QgZHJtX2dlbV9mbGluayByZXEgPSB7IC5oYW5kbGUgPSBiby0+aGFuZGxlIH07CisJc3RydWN0IG5vdXZlYXVfZHJtICpkcm0gPSBub3V2ZWF1X2RybSgmYm8tPmRldmljZS0+b2JqZWN0KTsKKwlzdHJ1Y3Qgbm91dmVhdV9ib19wcml2ICpudmJvID0gbm91dmVhdV9ibyhibyk7CisKKwkqbmFtZSA9IG52Ym8tPm5hbWU7CisJaWYgKCEqbmFtZSkgeworCQlpbnQgcmV0ID0gZHJtSW9jdGwoZHJtLT5mZCwgRFJNX0lPQ1RMX0dFTV9GTElOSywgJnJlcSk7CisKKwkJaWYgKHJldCkgeworCQkJKm5hbWUgPSAwOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQludmJvLT5uYW1lID0gKm5hbWUgPSByZXEubmFtZTsKKworCQlub3V2ZWF1X2JvX21ha2VfZ2xvYmFsKG52Ym8pOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZAorbm91dmVhdV9ib19yZWYoc3RydWN0IG5vdXZlYXVfYm8gKmJvLCBzdHJ1Y3Qgbm91dmVhdV9ibyAqKnByZWYpCit7CisJc3RydWN0IG5vdXZlYXVfYm8gKnJlZiA9ICpwcmVmOworCWlmIChibykgeworCQlhdG9taWNfaW5jKCZub3V2ZWF1X2JvKGJvKS0+cmVmY250KTsKKwl9CisJaWYgKHJlZikgeworCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmbm91dmVhdV9ibyhyZWYpLT5yZWZjbnQpKQorCQkJbm91dmVhdV9ib19kZWwocmVmKTsKKwl9CisJKnByZWYgPSBibzsKK30KKworaW50Citub3V2ZWF1X2JvX3ByaW1lX2hhbmRsZV9yZWYoc3RydWN0IG5vdXZlYXVfZGV2aWNlICpkZXYsIGludCBwcmltZV9mZCwKKwkJCSAgICBzdHJ1Y3Qgbm91dmVhdV9ibyAqKmJvKQoreworCXN0cnVjdCBub3V2ZWF1X2RybSAqZHJtID0gbm91dmVhdV9kcm0oJmRldi0+b2JqZWN0KTsKKwlzdHJ1Y3Qgbm91dmVhdV9kZXZpY2VfcHJpdiAqbnZkZXYgPSBub3V2ZWF1X2RldmljZShkZXYpOworCWludCByZXQ7CisJdW5zaWduZWQgaW50IGhhbmRsZTsKKworCW5vdXZlYXVfYm9fcmVmKE5VTEwsIGJvKTsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmbnZkZXYtPmxvY2spOworCXJldCA9IGRybVByaW1lRkRUb0hhbmRsZShkcm0tPmZkLCBwcmltZV9mZCwgJmhhbmRsZSk7CisJaWYgKHJldCA9PSAwKSB7CisJCXJldCA9IG5vdXZlYXVfYm9fd3JhcF9sb2NrZWQoZGV2LCBoYW5kbGUsIGJvLCAwKTsKKwl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJm52ZGV2LT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK25vdXZlYXVfYm9fc2V0X3ByaW1lKHN0cnVjdCBub3V2ZWF1X2JvICpibywgaW50ICpwcmltZV9mZCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSA9IG5vdXZlYXVfZHJtKCZiby0+ZGV2aWNlLT5vYmplY3QpOworCXN0cnVjdCBub3V2ZWF1X2JvX3ByaXYgKm52Ym8gPSBub3V2ZWF1X2JvKGJvKTsKKwlpbnQgcmV0OworCisJcmV0ID0gZHJtUHJpbWVIYW5kbGVUb0ZEKGRybS0+ZmQsIG52Ym8tPmJhc2UuaGFuZGxlLCBEUk1fQ0xPRVhFQywgcHJpbWVfZmQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlub3V2ZWF1X2JvX21ha2VfZ2xvYmFsKG52Ym8pOworCXJldHVybiAwOworfQorCitpbnQKK25vdXZlYXVfYm9fd2FpdChzdHJ1Y3Qgbm91dmVhdV9ibyAqYm8sIHVpbnQzMl90IGFjY2VzcywKKwkJc3RydWN0IG5vdXZlYXVfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG5vdXZlYXVfZHJtICpkcm0gPSBub3V2ZWF1X2RybSgmYm8tPmRldmljZS0+b2JqZWN0KTsKKwlzdHJ1Y3Qgbm91dmVhdV9ib19wcml2ICpudmJvID0gbm91dmVhdV9ibyhibyk7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9jcHVfcHJlcCByZXE7CisJc3RydWN0IG5vdXZlYXVfcHVzaGJ1ZiAqcHVzaDsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghKGFjY2VzcyAmIE5PVVZFQVVfQk9fUkRXUikpCisJCXJldHVybiAwOworCisJcHVzaCA9IGNsaV9wdXNoX2dldChjbGllbnQsIGJvKTsKKwlpZiAocHVzaCAmJiBwdXNoLT5jaGFubmVsKQorCQlub3V2ZWF1X3B1c2hidWZfa2ljayhwdXNoLCBwdXNoLT5jaGFubmVsKTsKKworCWlmICghbnZiby0+aGVhZC5uZXh0ICYmICEobnZiby0+YWNjZXNzICYgTk9VVkVBVV9CT19XUikgJiYKKwkJCQkhKGFjY2VzcyAmIE5PVVZFQVVfQk9fV1IpKQorCQlyZXR1cm4gMDsKKworCXJlcS5oYW5kbGUgPSBiby0+aGFuZGxlOworCXJlcS5mbGFncyA9IDA7CisJaWYgKGFjY2VzcyAmIE5PVVZFQVVfQk9fV1IpCisJCXJlcS5mbGFncyB8PSBOT1VWRUFVX0dFTV9DUFVfUFJFUF9XUklURTsKKwlpZiAoYWNjZXNzICYgTk9VVkVBVV9CT19OT0JMT0NLKQorCQlyZXEuZmxhZ3MgfD0gTk9VVkVBVV9HRU1fQ1BVX1BSRVBfTk9XQUlUOworCisJcmV0ID0gZHJtQ29tbWFuZFdyaXRlKGRybS0+ZmQsIERSTV9OT1VWRUFVX0dFTV9DUFVfUFJFUCwKKwkJCSAgICAgICZyZXEsIHNpemVvZihyZXEpKTsKKwlpZiAocmV0ID09IDApCisJCW52Ym8tPmFjY2VzcyA9IDA7CisJcmV0dXJuIHJldDsKK30KKworaW50Citub3V2ZWF1X2JvX21hcChzdHJ1Y3Qgbm91dmVhdV9ibyAqYm8sIHVpbnQzMl90IGFjY2VzcywKKwkgICAgICAgc3RydWN0IG5vdXZlYXVfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG5vdXZlYXVfZHJtICpkcm0gPSBub3V2ZWF1X2RybSgmYm8tPmRldmljZS0+b2JqZWN0KTsKKwlzdHJ1Y3Qgbm91dmVhdV9ib19wcml2ICpudmJvID0gbm91dmVhdV9ibyhibyk7CisJaWYgKGJvLT5tYXAgPT0gTlVMTCkgeworCQliby0+bWFwID0gZHJtX21tYXAoMCwgYm8tPnNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCQkgICAgICAgTUFQX1NIQVJFRCwgZHJtLT5mZCwgbnZiby0+bWFwX2hhbmRsZSk7CisJCWlmIChiby0+bWFwID09IE1BUF9GQUlMRUQpIHsKKwkJCWJvLT5tYXAgPSBOVUxMOworCQkJcmV0dXJuIC1lcnJubzsKKwkJfQorCX0KKwlyZXR1cm4gbm91dmVhdV9ib193YWl0KGJvLCBhY2Nlc3MsIGNsaWVudCk7Cit9CmRpZmYgLS1naXQgYS9ub3V2ZWF1L25vdXZlYXUuaCBiL25vdXZlYXUvbm91dmVhdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNWNlNzcKLS0tIC9kZXYvbnVsbAorKysgYi9ub3V2ZWF1L25vdXZlYXUuaApAQCAtMCwwICsxLDI3NiBAQAorI2lmbmRlZiBfX05PVVZFQVVfSF9fCisjZGVmaW5lIF9fTk9VVkVBVV9IX18KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworLyogU3VwcG9ydGVkIGNsYXNzIGluZm9ybWF0aW9uLCBwcm92aWRlZCBieSB0aGUga2VybmVsICovCitzdHJ1Y3Qgbm91dmVhdV9zY2xhc3MgeworCWludDMyX3Qgb2NsYXNzOworCWludCBtaW52ZXI7CisJaW50IG1heHZlcjsKK307CisKKy8qIENsaWVudC1wcm92aWRlZCBhcnJheSBkZXNjcmliaW5nIGNsYXNzIHZlcnNpb25zIHRoYXQgYXJlIGRlc2lyZWQuCisgKgorICogVGhlc2UgYXJlIHVzZWQgdG8gbWF0Y2ggYWdhaW5zdCB0aGUga2VybmVsJ3MgbGlzdCBvZiBzdXBwb3J0ZWQgY2xhc3Nlcy4KKyAqLworc3RydWN0IG5vdXZlYXVfbWNsYXNzIHsKKwlpbnQzMl90IG9jbGFzczsKKwlpbnQgdmVyc2lvbjsKKwl2b2lkICpkYXRhOworfTsKKworc3RydWN0IG5vdXZlYXVfb2JqZWN0IHsKKwlzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKnBhcmVudDsKKwl1aW50NjRfdCBoYW5kbGU7CisJdWludDMyX3Qgb2NsYXNzOworCXVpbnQzMl90IGxlbmd0aDsJLyogZGVwcmVjYXRlZCAqLworCXZvaWQgKmRhdGE7CQkvKiBkZXByZWNhdGVkICovCit9OworCitpbnQgbm91dmVhdV9vYmplY3RfbmV3KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LCB1aW50NjRfdCBoYW5kbGUsCisJCSAgICAgICB1aW50MzJfdCBvY2xhc3MsIHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbmd0aCwKKwkJICAgICAgIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKik7Cit2b2lkIG5vdXZlYXVfb2JqZWN0X2RlbChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiopOworaW50IG5vdXZlYXVfb2JqZWN0X210aGQoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICosIHVpbnQzMl90IG10aGQsCisJCQl2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplKTsKK2ludCBub3V2ZWF1X29iamVjdF9zY2xhc3NfZ2V0KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLAorCQkJICAgICAgc3RydWN0IG5vdXZlYXVfc2NsYXNzICoqKTsKK3ZvaWQgbm91dmVhdV9vYmplY3Rfc2NsYXNzX3B1dChzdHJ1Y3Qgbm91dmVhdV9zY2xhc3MgKiopOworaW50IG5vdXZlYXVfb2JqZWN0X21jbGFzcyhzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwKKwkJCSAgY29uc3Qgc3RydWN0IG5vdXZlYXVfbWNsYXNzICopOworCitzdHJ1Y3Qgbm91dmVhdV9kcm0geworCXN0cnVjdCBub3V2ZWF1X29iamVjdCBjbGllbnQ7CisJaW50IGZkOworCXVpbnQzMl90IHZlcnNpb247CisJYm9vbCBudmlmOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgbm91dmVhdV9kcm0gKgorbm91dmVhdV9kcm0oc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmopCit7CisJd2hpbGUgKG9iaiAmJiBvYmotPnBhcmVudCkKKwkJb2JqID0gb2JqLT5wYXJlbnQ7CisJcmV0dXJuIChzdHJ1Y3Qgbm91dmVhdV9kcm0gKilvYmo7Cit9CisKK2ludCBub3V2ZWF1X2RybV9uZXcoaW50IGZkLCBzdHJ1Y3Qgbm91dmVhdV9kcm0gKiopOwordm9pZCBub3V2ZWF1X2RybV9kZWwoc3RydWN0IG5vdXZlYXVfZHJtICoqKTsKKworc3RydWN0IG5vdXZlYXVfZGV2aWNlIHsKKwlzdHJ1Y3Qgbm91dmVhdV9vYmplY3Qgb2JqZWN0OworCWludCBmZDsJCQkvKiBkZXByZWNhdGVkICovCisJdWludDMyX3QgbGliX3ZlcnNpb247CS8qIGRlcHJlY2F0ZWQgKi8KKwl1aW50MzJfdCBkcm1fdmVyc2lvbjsJLyogZGVwcmVjYXRlZCAqLworCXVpbnQzMl90IGNoaXBzZXQ7CisJdWludDY0X3QgdnJhbV9zaXplOworCXVpbnQ2NF90IGdhcnRfc2l6ZTsKKwl1aW50NjRfdCB2cmFtX2xpbWl0OworCXVpbnQ2NF90IGdhcnRfbGltaXQ7Cit9OworCitpbnQgbm91dmVhdV9kZXZpY2VfbmV3KHN0cnVjdCBub3V2ZWF1X29iamVjdCAqcGFyZW50LCBpbnQzMl90IG9jbGFzcywKKwkJICAgICAgIHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemUsIHN0cnVjdCBub3V2ZWF1X2RldmljZSAqKik7Cit2b2lkIG5vdXZlYXVfZGV2aWNlX2RlbChzdHJ1Y3Qgbm91dmVhdV9kZXZpY2UgKiopOworCitpbnQgbm91dmVhdV9nZXRwYXJhbShzdHJ1Y3Qgbm91dmVhdV9kZXZpY2UgKiwgdWludDY0X3QgcGFyYW0sIHVpbnQ2NF90ICp2YWx1ZSk7CitpbnQgbm91dmVhdV9zZXRwYXJhbShzdHJ1Y3Qgbm91dmVhdV9kZXZpY2UgKiwgdWludDY0X3QgcGFyYW0sIHVpbnQ2NF90IHZhbHVlKTsKKworLyogZGVwcmVjYXRlZCAqLworaW50IG5vdXZlYXVfZGV2aWNlX3dyYXAoaW50IGZkLCBpbnQgY2xvc2UsIHN0cnVjdCBub3V2ZWF1X2RldmljZSAqKik7CitpbnQgbm91dmVhdV9kZXZpY2Vfb3Blbihjb25zdCBjaGFyICpidXNpZCwgc3RydWN0IG5vdXZlYXVfZGV2aWNlICoqKTsKKworc3RydWN0IG5vdXZlYXVfY2xpZW50IHsKKwlzdHJ1Y3Qgbm91dmVhdV9kZXZpY2UgKmRldmljZTsKKwlpbnQgaWQ7Cit9OworCitpbnQgbm91dmVhdV9jbGllbnRfbmV3KHN0cnVjdCBub3V2ZWF1X2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9jbGllbnQgKiopOwordm9pZCBub3V2ZWF1X2NsaWVudF9kZWwoc3RydWN0IG5vdXZlYXVfY2xpZW50ICoqKTsKKwordW5pb24gbm91dmVhdV9ib19jb25maWcgeworCXN0cnVjdCB7CisjZGVmaW5lIE5WMDRfQk9fMTZCUFAgMHgwMDAwMDAwMQorI2RlZmluZSBOVjA0X0JPXzMyQlBQIDB4MDAwMDAwMDIKKyNkZWZpbmUgTlYwNF9CT19aRVRBICAweDAwMDAwMDA0CisJCXVpbnQzMl90IHN1cmZfZmxhZ3M7CisJCXVpbnQzMl90IHN1cmZfcGl0Y2g7CisJfSBudjA0OworCXN0cnVjdCB7CisJCXVpbnQzMl90IG1lbXR5cGU7CisJCXVpbnQzMl90IHRpbGVfbW9kZTsKKwl9IG52NTA7CisJc3RydWN0IHsKKwkJdWludDMyX3QgbWVtdHlwZTsKKwkJdWludDMyX3QgdGlsZV9tb2RlOworCX0gbnZjMDsKKwl1aW50MzJfdCBkYXRhWzhdOworfTsKKworI2RlZmluZSBOT1VWRUFVX0JPX1ZSQU0gICAgMHgwMDAwMDAwMQorI2RlZmluZSBOT1VWRUFVX0JPX0dBUlQgICAgMHgwMDAwMDAwMgorI2RlZmluZSBOT1VWRUFVX0JPX0FQRVIgICAoTk9VVkVBVV9CT19WUkFNIHwgTk9VVkVBVV9CT19HQVJUKQorI2RlZmluZSBOT1VWRUFVX0JPX1JEICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBOT1VWRUFVX0JPX1dSICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBOT1VWRUFVX0JPX1JEV1IgICAoTk9VVkVBVV9CT19SRCB8IE5PVVZFQVVfQk9fV1IpCisjZGVmaW5lIE5PVVZFQVVfQk9fTk9CTE9DSyAweDAwMDAwNDAwCisjZGVmaW5lIE5PVVZFQVVfQk9fTE9XICAgICAweDAwMDAxMDAwCisjZGVmaW5lIE5PVVZFQVVfQk9fSElHSCAgICAweDAwMDAyMDAwCisjZGVmaW5lIE5PVVZFQVVfQk9fT1IgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIE5PVVZFQVVfQk9fTUFQICAgICAweDgwMDAwMDAwCisjZGVmaW5lIE5PVVZFQVVfQk9fQ09OVElHICAweDQwMDAwMDAwCisjZGVmaW5lIE5PVVZFQVVfQk9fTk9TTk9PUCAweDIwMDAwMDAwCisjZGVmaW5lIE5PVVZFQVVfQk9fQ09IRVJFTlQgMHgxMDAwMDAwMAorCitzdHJ1Y3Qgbm91dmVhdV9ibyB7CisJc3RydWN0IG5vdXZlYXVfZGV2aWNlICpkZXZpY2U7CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQ2NF90IHNpemU7CisJdWludDMyX3QgZmxhZ3M7CisJdWludDY0X3Qgb2Zmc2V0OworCXZvaWQgKm1hcDsKKwl1bmlvbiBub3V2ZWF1X2JvX2NvbmZpZyBjb25maWc7Cit9OworCitpbnQgbm91dmVhdV9ib19uZXcoc3RydWN0IG5vdXZlYXVfZGV2aWNlICosIHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCBhbGlnbiwKKwkJICAgdWludDY0X3Qgc2l6ZSwgdW5pb24gbm91dmVhdV9ib19jb25maWcgKiwKKwkJICAgc3RydWN0IG5vdXZlYXVfYm8gKiopOworaW50IG5vdXZlYXVfYm9fd3JhcChzdHJ1Y3Qgbm91dmVhdV9kZXZpY2UgKiwgdWludDMyX3QgaGFuZGxlLAorCQkgICAgc3RydWN0IG5vdXZlYXVfYm8gKiopOworaW50IG5vdXZlYXVfYm9fbmFtZV9yZWYoc3RydWN0IG5vdXZlYXVfZGV2aWNlICp2LCB1aW50MzJfdCBuYW1lLAorCQkJc3RydWN0IG5vdXZlYXVfYm8gKiopOworaW50IG5vdXZlYXVfYm9fbmFtZV9nZXQoc3RydWN0IG5vdXZlYXVfYm8gKiwgdWludDMyX3QgKm5hbWUpOwordm9pZCBub3V2ZWF1X2JvX3JlZihzdHJ1Y3Qgbm91dmVhdV9ibyAqLCBzdHJ1Y3Qgbm91dmVhdV9ibyAqKik7CitpbnQgbm91dmVhdV9ib19tYXAoc3RydWN0IG5vdXZlYXVfYm8gKiwgdWludDMyX3QgYWNjZXNzLAorCQkgICBzdHJ1Y3Qgbm91dmVhdV9jbGllbnQgKik7CitpbnQgbm91dmVhdV9ib193YWl0KHN0cnVjdCBub3V2ZWF1X2JvICosIHVpbnQzMl90IGFjY2VzcywKKwkJICAgIHN0cnVjdCBub3V2ZWF1X2NsaWVudCAqKTsKK2ludCBub3V2ZWF1X2JvX3ByaW1lX2hhbmRsZV9yZWYoc3RydWN0IG5vdXZlYXVfZGV2aWNlICosIGludCBwcmltZV9mZCwKKwkJCQlzdHJ1Y3Qgbm91dmVhdV9ibyAqKik7CitpbnQgbm91dmVhdV9ib19zZXRfcHJpbWUoc3RydWN0IG5vdXZlYXVfYm8gKiwgaW50ICpwcmltZV9mZCk7CisKK3N0cnVjdCBub3V2ZWF1X2xpc3QgeworCXN0cnVjdCBub3V2ZWF1X2xpc3QgKnByZXY7CisJc3RydWN0IG5vdXZlYXVfbGlzdCAqbmV4dDsKK307CisKK3N0cnVjdCBub3V2ZWF1X2J1ZnJlZiB7CisJc3RydWN0IG5vdXZlYXVfbGlzdCB0aGVhZDsKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqYm87CisJdWludDMyX3QgcGFja2V0OworCXVpbnQzMl90IGZsYWdzOworCXVpbnQzMl90IGRhdGE7CisJdWludDMyX3Qgdm9yOworCXVpbnQzMl90IHRvcjsKKwl1aW50MzJfdCBwcml2X2RhdGE7CisJdm9pZCAqcHJpdjsKK307CisKK3N0cnVjdCBub3V2ZWF1X2J1ZmN0eCB7CisJc3RydWN0IG5vdXZlYXVfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IG5vdXZlYXVfbGlzdCBoZWFkOworCXN0cnVjdCBub3V2ZWF1X2xpc3QgcGVuZGluZzsKKwlzdHJ1Y3Qgbm91dmVhdV9saXN0IGN1cnJlbnQ7CisJaW50IHJlbG9jczsKK307CisKK2ludCBub3V2ZWF1X2J1ZmN0eF9uZXcoc3RydWN0IG5vdXZlYXVfY2xpZW50ICosIGludCBiaW5zLAorCQkgICAgICAgc3RydWN0IG5vdXZlYXVfYnVmY3R4ICoqKTsKK3ZvaWQgbm91dmVhdV9idWZjdHhfZGVsKHN0cnVjdCBub3V2ZWF1X2J1ZmN0eCAqKik7CitzdHJ1Y3Qgbm91dmVhdV9idWZyZWYgKgorbm91dmVhdV9idWZjdHhfcmVmbihzdHJ1Y3Qgbm91dmVhdV9idWZjdHggKiwgaW50IGJpbiwKKwkJICAgIHN0cnVjdCBub3V2ZWF1X2JvICosIHVpbnQzMl90IGZsYWdzKTsKK3N0cnVjdCBub3V2ZWF1X2J1ZnJlZiAqCitub3V2ZWF1X2J1ZmN0eF9tdGhkKHN0cnVjdCBub3V2ZWF1X2J1ZmN0eCAqLCBpbnQgYmluLCAgdWludDMyX3QgcGFja2V0LAorCQkgICAgc3RydWN0IG5vdXZlYXVfYm8gKiwgdWludDY0X3QgZGF0YSwgdWludDMyX3QgZmxhZ3MsCisJCSAgICB1aW50MzJfdCB2b3IsIHVpbnQzMl90IHRvcik7Cit2b2lkIG5vdXZlYXVfYnVmY3R4X3Jlc2V0KHN0cnVjdCBub3V2ZWF1X2J1ZmN0eCAqLCBpbnQgYmluKTsKKworc3RydWN0IG5vdXZlYXVfcHVzaGJ1Zl9rcmVjOworc3RydWN0IG5vdXZlYXVfcHVzaGJ1ZiB7CisJc3RydWN0IG5vdXZlYXVfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpjaGFubmVsOworCXN0cnVjdCBub3V2ZWF1X2J1ZmN0eCAqYnVmY3R4OworCXZvaWQgKCpraWNrX25vdGlmeSkoc3RydWN0IG5vdXZlYXVfcHVzaGJ1ZiAqKTsKKwl2b2lkICp1c2VyX3ByaXY7CisJdWludDMyX3QgcnN2ZF9raWNrOworCXVpbnQzMl90IGZsYWdzOworCXVpbnQzMl90ICpjdXI7CisJdWludDMyX3QgKmVuZDsKK307CisKK3N0cnVjdCBub3V2ZWF1X3B1c2hidWZfcmVmbiB7CisJc3RydWN0IG5vdXZlYXVfYm8gKmJvOworCXVpbnQzMl90IGZsYWdzOworfTsKKworaW50IG5vdXZlYXVfcHVzaGJ1Zl9uZXcoc3RydWN0IG5vdXZlYXVfY2xpZW50ICosIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqY2hhbiwKKwkJCWludCBuciwgdWludDMyX3Qgc2l6ZSwgYm9vbCBpbW1lZGlhdGUsCisJCQlzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmICoqKTsKK3ZvaWQgbm91dmVhdV9wdXNoYnVmX2RlbChzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmICoqKTsKK2ludCBub3V2ZWF1X3B1c2hidWZfc3BhY2Uoc3RydWN0IG5vdXZlYXVfcHVzaGJ1ZiAqLCB1aW50MzJfdCBkd29yZHMsCisJCQkgIHVpbnQzMl90IHJlbG9jcywgdWludDMyX3QgcHVzaGVzKTsKK3ZvaWQgbm91dmVhdV9wdXNoYnVmX2RhdGEoc3RydWN0IG5vdXZlYXVfcHVzaGJ1ZiAqLCBzdHJ1Y3Qgbm91dmVhdV9ibyAqLAorCQkJICB1aW50NjRfdCBvZmZzZXQsIHVpbnQ2NF90IGxlbmd0aCk7CitpbnQgbm91dmVhdV9wdXNoYnVmX3JlZm4oc3RydWN0IG5vdXZlYXVfcHVzaGJ1ZiAqLAorCQkJIHN0cnVjdCBub3V2ZWF1X3B1c2hidWZfcmVmbiAqLCBpbnQgbnIpOworLyogRW1pdHMgYSByZWxvYyBpbnRvIHRoZSBwdXNoIGJ1ZmZlciBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiwgeW91ICptdXN0KgorICogaGF2ZSBwcmV2aW91c2x5IGFkZGVkIHRoZSByZWZlcmVuY2VkIGJ1ZmZlciB0byBhIGJ1ZmZlciBjb250ZXh0LCBhbmQKKyAqIHZhbGlkYXRlZCBpdCBhZ2FpbnN0IHRoZSBjdXJyZW50IHB1c2ggYnVmZmVyLgorICovCit2b2lkIG5vdXZlYXVfcHVzaGJ1Zl9yZWxvYyhzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmICosIHN0cnVjdCBub3V2ZWF1X2JvICosCisJCQkgICB1aW50MzJfdCBkYXRhLCB1aW50MzJfdCBmbGFncywKKwkJCSAgIHVpbnQzMl90IHZvciwgdWludDMyX3QgdG9yKTsKK2ludCBub3V2ZWF1X3B1c2hidWZfdmFsaWRhdGUoc3RydWN0IG5vdXZlYXVfcHVzaGJ1ZiAqKTsKK3VpbnQzMl90IG5vdXZlYXVfcHVzaGJ1Zl9yZWZkKHN0cnVjdCBub3V2ZWF1X3B1c2hidWYgKiwgc3RydWN0IG5vdXZlYXVfYm8gKik7CitpbnQgbm91dmVhdV9wdXNoYnVmX2tpY2soc3RydWN0IG5vdXZlYXVfcHVzaGJ1ZiAqLCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmNoYW4pOworc3RydWN0IG5vdXZlYXVfYnVmY3R4ICoKK25vdXZlYXVfcHVzaGJ1Zl9idWZjdHgoc3RydWN0IG5vdXZlYXVfcHVzaGJ1ZiAqLCBzdHJ1Y3Qgbm91dmVhdV9idWZjdHggKik7CisKKyNkZWZpbmUgTk9VVkVBVV9ERVZJQ0VfQ0xBU1MgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBOT1VWRUFVX0ZJRk9fQ0hBTk5FTF9DTEFTUyAweDgwMDAwMDAxCisjZGVmaW5lIE5PVVZFQVVfTk9USUZJRVJfQ0xBU1MgICAgIDB4ODAwMDAwMDIKKworc3RydWN0IG5vdXZlYXVfZmlmbyB7CisJc3RydWN0IG5vdXZlYXVfb2JqZWN0ICpvYmplY3Q7CisJdWludDMyX3QgY2hhbm5lbDsKKwl1aW50MzJfdCBwdXNoYnVmOworCXVpbnQ2NF90IHVudXNlZDFbM107Cit9OworCitzdHJ1Y3QgbnYwNF9maWZvIHsKKwlzdHJ1Y3Qgbm91dmVhdV9maWZvIGJhc2U7CisJdWludDMyX3QgdnJhbTsKKwl1aW50MzJfdCBnYXJ0OworCXVpbnQzMl90IG5vdGlmeTsKK307CisKK3N0cnVjdCBudmMwX2ZpZm8geworCXN0cnVjdCBub3V2ZWF1X2ZpZm8gYmFzZTsKKwl1aW50MzJfdCBub3RpZnk7Cit9OworCisjZGVmaW5lIE5WRTBfRklGT19FTkdJTkVfR1IgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTlZFMF9GSUZPX0VOR0lORV9WUCAgMHgwMDAwMDAwMgorI2RlZmluZSBOVkUwX0ZJRk9fRU5HSU5FX1BQUCAweDAwMDAwMDA0CisjZGVmaW5lIE5WRTBfRklGT19FTkdJTkVfQlNQIDB4MDAwMDAwMDgKKyNkZWZpbmUgTlZFMF9GSUZPX0VOR0lORV9DRTAgMHgwMDAwMDAxMAorI2RlZmluZSBOVkUwX0ZJRk9fRU5HSU5FX0NFMSAweDAwMDAwMDIwCisjZGVmaW5lIE5WRTBfRklGT19FTkdJTkVfRU5DIDB4MDAwMDAwNDAKKworc3RydWN0IG52ZTBfZmlmbyB7CisJc3RydWN0IHsKKwkJc3RydWN0IG5vdXZlYXVfZmlmbyBiYXNlOworCQl1aW50MzJfdCBub3RpZnk7CisJfTsKKwl1aW50MzJfdCBlbmdpbmU7Cit9OworCitzdHJ1Y3QgbnYwNF9ub3RpZnkgeworCXN0cnVjdCBub3V2ZWF1X29iamVjdCAqb2JqZWN0OworCXVpbnQzMl90IG9mZnNldDsKKwl1aW50MzJfdCBsZW5ndGg7Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9ub3V2ZWF1L252aWYvY2wwMDgwLmggYi9ub3V2ZWF1L252aWYvY2wwMDgwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxNjIwYQotLS0gL2Rldi9udWxsCisrKyBiL25vdXZlYXUvbnZpZi9jbDAwODAuaApAQCAtMCwwICsxLDQ1IEBACisjaWZuZGVmIF9fTlZJRl9DTDAwODBfSF9fCisjZGVmaW5lIF9fTlZJRl9DTDAwODBfSF9fCisKK3N0cnVjdCBudl9kZXZpY2VfdjAgeworCV9fdTggIHZlcnNpb247CisJX191OCAgcGFkMDFbN107CisJX191NjQgZGV2aWNlOwkvKiBkZXZpY2UgaWRlbnRpZmllciwgfjAgZm9yIGNsaWVudCBkZWZhdWx0ICovCit9OworCisjZGVmaW5lIE5WX0RFVklDRV9WMF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIE5WX0RFVklDRV9WMF9USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxCisKK3N0cnVjdCBudl9kZXZpY2VfaW5mb192MCB7CisJX191OCAgdmVyc2lvbjsKKyNkZWZpbmUgTlZfREVWSUNFX0lORk9fVjBfSUdQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTlZfREVWSUNFX0lORk9fVjBfUENJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTlZfREVWSUNFX0lORk9fVjBfQUdQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTlZfREVWSUNFX0lORk9fVjBfUENJRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgTlZfREVWSUNFX0lORk9fVjBfU09DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKwlfX3U4ICBwbGF0Zm9ybTsKKwlfX3UxNiBjaGlwc2V0OwkvKiBmcm9tIE5WX1BNQ19CT09UXzAgKi8KKwlfX3U4ICByZXZpc2lvbjsJLyogZnJvbSBOVl9QTUNfQk9PVF8wICovCisjZGVmaW5lIE5WX0RFVklDRV9JTkZPX1YwX1ROVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIE5WX0RFVklDRV9JTkZPX1YwX0NFTFNJVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIE5WX0RFVklDRV9JTkZPX1YwX0tFTFZJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIE5WX0RFVklDRV9JTkZPX1YwX1JBTktJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIE5WX0RFVklDRV9JTkZPX1YwX0NVUklFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIE5WX0RFVklDRV9JTkZPX1YwX1RFU0xBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIE5WX0RFVklDRV9JTkZPX1YwX0ZFUk1JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3CisjZGVmaW5lIE5WX0RFVklDRV9JTkZPX1YwX0tFUExFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIE5WX0RFVklDRV9JTkZPX1YwX01BWFdFTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5CisJX191OCAgZmFtaWx5OworCV9fdTggIHBhZDA2WzJdOworCV9fdTY0IHJhbV9zaXplOworCV9fdTY0IHJhbV91c2VyOworCWNoYXIgIGNoaXBbMTZdOworCWNoYXIgIG5hbWVbNjRdOworfTsKKworc3RydWN0IG52X2RldmljZV90aW1lX3YwIHsKKwlfX3U4ICB2ZXJzaW9uOworCV9fdTggIHBhZDAxWzddOworCV9fdTY0IHRpbWU7Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9ub3V2ZWF1L252aWYvY2w5MDk3LmggYi9ub3V2ZWF1L252aWYvY2w5MDk3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA1NzY3NgotLS0gL2Rldi9udWxsCisrKyBiL25vdXZlYXUvbnZpZi9jbDkwOTcuaApAQCAtMCwwICsxLDQ0IEBACisjaWZuZGVmIF9fTlZJRl9DTDkwOTdfSF9fCisjZGVmaW5lIF9fTlZJRl9DTDkwOTdfSF9fCisKKyNkZWZpbmUgRkVSTUlfQV9aQkNfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRkVSTUlfQV9aQkNfREVQVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKworc3RydWN0IGZlcm1pX2FfemJjX2NvbG9yX3YwIHsKKwlfX3U4ICB2ZXJzaW9uOworI2RlZmluZSBGRVJNSV9BX1pCQ19DT0xPUl9WMF9GTVRfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBGRVJNSV9BX1pCQ19DT0xPUl9WMF9GTVRfVU5PUk1fT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBGRVJNSV9BX1pCQ19DT0xPUl9WMF9GTVRfUkYzMl9HRjMyX0JGMzJfQUYzMiAgICAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBGRVJNSV9BX1pCQ19DT0xPUl9WMF9GTVRfUjE2X0cxNl9CMTZfQTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBGRVJNSV9BX1pCQ19DT0xPUl9WMF9GTVRfUk4xNl9HTjE2X0JOMTZfQU4xNiAgICAgICAgICAgICAgICAgICAgICAgMHgwYworI2RlZmluZSBGRVJNSV9BX1pCQ19DT0xPUl9WMF9GTVRfUlMxNl9HUzE2X0JTMTZfQVMxNiAgICAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBGRVJNSV9BX1pCQ19DT0xPUl9WMF9GTVRfUlUxNl9HVTE2X0JVMTZfQVUxNiAgICAgICAgICAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBGRVJNSV9BX1pCQ19DT0xPUl9WMF9GTVRfUkYxNl9HRjE2X0JGMTZfQUYxNiAgICAgICAgICAgICAgICAgICAgICAgMHgxNgorI2RlZmluZSBGRVJNSV9BX1pCQ19DT0xPUl9WMF9GTVRfQThSOEc4QjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOAorI2RlZmluZSBGRVJNSV9BX1pCQ19DT0xPUl9WMF9GTVRfQThSTDhHTDhCTDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxYworI2RlZmluZSBGRVJNSV9BX1pCQ19DT0xPUl9WMF9GTVRfQTJCMTBHMTBSMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBGRVJNSV9BX1pCQ19DT0xPUl9WMF9GTVRfQVUyQlUxMEdVMTBSVTEwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNAorI2RlZmluZSBGRVJNSV9BX1pCQ19DT0xPUl9WMF9GTVRfQThCOEc4UjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyOAorI2RlZmluZSBGRVJNSV9BX1pCQ19DT0xPUl9WMF9GTVRfQThCTDhHTDhSTDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyYworI2RlZmluZSBGRVJNSV9BX1pCQ19DT0xPUl9WMF9GTVRfQU44Qk44R044Uk44ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMAorI2RlZmluZSBGRVJNSV9BX1pCQ19DT0xPUl9WMF9GTVRfQVM4QlM4R1M4UlM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNAorI2RlZmluZSBGRVJNSV9BX1pCQ19DT0xPUl9WMF9GTVRfQVU4QlU4R1U4UlU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzOAorI2RlZmluZSBGRVJNSV9BX1pCQ19DT0xPUl9WMF9GTVRfQTJSMTBHMTBCMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzYworI2RlZmluZSBGRVJNSV9BX1pCQ19DT0xPUl9WMF9GTVRfQkYxMEdGMTFSRjExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MAorCV9fdTggIGZvcm1hdDsKKwlfX3U4ICBpbmRleDsKKwlfX3U4ICBwYWQwM1s1XTsKKwlfX3UzMiBkc1s0XTsKKwlfX3UzMiBsMls0XTsKK307CisKK3N0cnVjdCBmZXJtaV9hX3piY19kZXB0aF92MCB7CisJX191OCAgdmVyc2lvbjsKKyNkZWZpbmUgRkVSTUlfQV9aQkNfREVQVEhfVjBfRk1UX0ZQMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKwlfX3U4ICBmb3JtYXQ7CisJX191OCAgaW5kZXg7CisJX191OCAgcGFkMDNbNV07CisJX191MzIgZHM7CisJX191MzIgbDI7Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9ub3V2ZWF1L252aWYvY2xhc3MuaCBiL25vdXZlYXUvbnZpZi9jbGFzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNzljZDYKLS0tIC9kZXYvbnVsbAorKysgYi9ub3V2ZWF1L252aWYvY2xhc3MuaApAQCAtMCwwICsxLDE0MSBAQAorI2lmbmRlZiBfX05WSUZfQ0xBU1NfSF9fCisjZGVmaW5lIF9fTlZJRl9DTEFTU19IX18KKworLyogdGhlc2UgY2xhc3MgbnVtYmVycyBhcmUgbWFkZSB1cCBieSB1cywgYW5kIG5vdCBudmlkaWEtYXNzaWduZWQgKi8KKyNkZWZpbmUgTlZJRl9DTEFTU19DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYwMDAxLmggKi8gLTEKKyNkZWZpbmUgTlZJRl9DTEFTU19QRVJGTU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYwMDAyLmggKi8gLTIKKyNkZWZpbmUgTlZJRl9DTEFTU19QRVJGRE9NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYwMDAzLmggKi8gLTMKKyNkZWZpbmUgTlZJRl9DTEFTU19TV19OVjA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYwMDA0LmggKi8gLTQKKyNkZWZpbmUgTlZJRl9DTEFTU19TV19OVjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYwMDA1LmggKi8gLTUKKyNkZWZpbmUgTlZJRl9DTEFTU19TV19OVjUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYwMDA1LmggKi8gLTYKKyNkZWZpbmUgTlZJRl9DTEFTU19TV19HRjEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYwMDA1LmggKi8gLTcKKworLyogdGhlIGJlbG93IG1hdGNoIG52aWRpYS1hc3NpZ25lZCAoZWl0aGVyIGluIGh3LCBvciBzdykgY2xhc3MgbnVtYmVycyAqLworI2RlZmluZSBOVl9ERVZJQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2wwMDgwLmggKi8gMHgwMDAwMDA4MAorCisjZGVmaW5lIE5WX0RNQV9GUk9NX01FTU9SWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbDAwMDIuaCAqLyAweDAwMDAwMDAyCisjZGVmaW5lIE5WX0RNQV9UT19NRU1PUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbDAwMDIuaCAqLyAweDAwMDAwMDAzCisjZGVmaW5lIE5WX0RNQV9JTl9NRU1PUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbDAwMDIuaCAqLyAweDAwMDAwMDNkCisKKyNkZWZpbmUgRkVSTUlfVFdPRF9BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDkwMmQKKworI2RlZmluZSBGRVJNSV9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVF9BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwOTAzOQorCisjZGVmaW5lIEtFUExFUl9JTkxJTkVfVE9fTUVNT1JZX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBhMDQwCisjZGVmaW5lIEtFUExFUl9JTkxJTkVfVE9fTUVNT1JZX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBhMTQwCisKKyNkZWZpbmUgTlYwNF9ESVNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsMDA0Ni5oICovIDB4MDAwMDAwNDYKKworI2RlZmluZSBOVjAzX0NIQU5ORUxfRE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2w1MDZiLmggKi8gMHgwMDAwMDA2YgorI2RlZmluZSBOVjEwX0NIQU5ORUxfRE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2w1MDZiLmggKi8gMHgwMDAwMDA2ZQorI2RlZmluZSBOVjE3X0NIQU5ORUxfRE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2w1MDZiLmggKi8gMHgwMDAwMTc2ZQorI2RlZmluZSBOVjQwX0NIQU5ORUxfRE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2w1MDZiLmggKi8gMHgwMDAwNDA2ZQorI2RlZmluZSBOVjUwX0NIQU5ORUxfRE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2w1MDZlLmggKi8gMHgwMDAwNTA2ZQorI2RlZmluZSBHODJfQ0hBTk5FTF9ETUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2w4MjZlLmggKi8gMHgwMDAwODI2ZQorCisjZGVmaW5lIE5WNTBfQ0hBTk5FTF9HUEZJRk8gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbDUwNmYuaCAqLyAweDAwMDA1MDZmCisjZGVmaW5lIEc4Ml9DSEFOTkVMX0dQRklGTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbDgyNmYuaCAqLyAweDAwMDA4MjZmCisjZGVmaW5lIEZFUk1JX0NIQU5ORUxfR1BGSUZPICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbDkwNmYuaCAqLyAweDAwMDA5MDZmCisjZGVmaW5lIEtFUExFUl9DSEFOTkVMX0dQRklGT19BICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGEwNmYuaCAqLyAweDAwMDBhMDZmCisjZGVmaW5lIE1BWFdFTExfQ0hBTk5FTF9HUEZJRk9fQSAgICAgICAgICAgICAgICAgICAgICAvKiBjbGEwNmYuaCAqLyAweDAwMDBiMDZmCisKKyNkZWZpbmUgTlY1MF9ESVNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3MC5oICovIDB4MDAwMDUwNzAKKyNkZWZpbmUgRzgyX0RJU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3MC5oICovIDB4MDAwMDgyNzAKKyNkZWZpbmUgR1QyMDBfRElTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3MC5oICovIDB4MDAwMDgzNzAKKyNkZWZpbmUgR1QyMTRfRElTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3MC5oICovIDB4MDAwMDg1NzAKKyNkZWZpbmUgR1QyMDZfRElTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3MC5oICovIDB4MDAwMDg4NzAKKyNkZWZpbmUgR0YxMTBfRElTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3MC5oICovIDB4MDAwMDkwNzAKKyNkZWZpbmUgR0sxMDRfRElTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3MC5oICovIDB4MDAwMDkxNzAKKyNkZWZpbmUgR0sxMTBfRElTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3MC5oICovIDB4MDAwMDkyNzAKKyNkZWZpbmUgR00xMDdfRElTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3MC5oICovIDB4MDAwMDk0NzAKKyNkZWZpbmUgR00yMDRfRElTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3MC5oICovIDB4MDAwMDk1NzAKKworI2RlZmluZSBOVjMxX01QRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMzE3NAorI2RlZmluZSBHODJfTVBFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODI3NAorCisjZGVmaW5lIE5WNzRfVlAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA3NDc2CisKKyNkZWZpbmUgTlY1MF9ESVNQX0NVUlNPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3YS5oICovIDB4MDAwMDUwN2EKKyNkZWZpbmUgRzgyX0RJU1BfQ1VSU09SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3YS5oICovIDB4MDAwMDgyN2EKKyNkZWZpbmUgR1QyMTRfRElTUF9DVVJTT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3YS5oICovIDB4MDAwMDg1N2EKKyNkZWZpbmUgR0YxMTBfRElTUF9DVVJTT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3YS5oICovIDB4MDAwMDkwN2EKKyNkZWZpbmUgR0sxMDRfRElTUF9DVVJTT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3YS5oICovIDB4MDAwMDkxN2EKKworI2RlZmluZSBOVjUwX0RJU1BfT1ZFUkxBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2w1MDdiLmggKi8gMHgwMDAwNTA3YgorI2RlZmluZSBHODJfRElTUF9PVkVSTEFZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2w1MDdiLmggKi8gMHgwMDAwODI3YgorI2RlZmluZSBHVDIxNF9ESVNQX09WRVJMQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2w1MDdiLmggKi8gMHgwMDAwODU3YgorI2RlZmluZSBHRjExMF9ESVNQX09WRVJMQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2w1MDdiLmggKi8gMHgwMDAwOTA3YgorI2RlZmluZSBHSzEwNF9ESVNQX09WRVJMQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2w1MDdiLmggKi8gMHgwMDAwOTE3YgorCisjZGVmaW5lIE5WNTBfRElTUF9CQVNFX0NIQU5ORUxfRE1BICAgICAgICAgICAgICAgICAgICAvKiBjbDUwN2MuaCAqLyAweDAwMDA1MDdjCisjZGVmaW5lIEc4Ml9ESVNQX0JBU0VfQ0hBTk5FTF9ETUEgICAgICAgICAgICAgICAgICAgICAvKiBjbDUwN2MuaCAqLyAweDAwMDA4MjdjCisjZGVmaW5lIEdUMjAwX0RJU1BfQkFTRV9DSEFOTkVMX0RNQSAgICAgICAgICAgICAgICAgICAvKiBjbDUwN2MuaCAqLyAweDAwMDA4MzdjCisjZGVmaW5lIEdUMjE0X0RJU1BfQkFTRV9DSEFOTkVMX0RNQSAgICAgICAgICAgICAgICAgICAvKiBjbDUwN2MuaCAqLyAweDAwMDA4NTdjCisjZGVmaW5lIEdGMTEwX0RJU1BfQkFTRV9DSEFOTkVMX0RNQSAgICAgICAgICAgICAgICAgICAvKiBjbDUwN2MuaCAqLyAweDAwMDA5MDdjCisjZGVmaW5lIEdLMTA0X0RJU1BfQkFTRV9DSEFOTkVMX0RNQSAgICAgICAgICAgICAgICAgICAvKiBjbDUwN2MuaCAqLyAweDAwMDA5MTdjCisjZGVmaW5lIEdLMTEwX0RJU1BfQkFTRV9DSEFOTkVMX0RNQSAgICAgICAgICAgICAgICAgICAvKiBjbDUwN2MuaCAqLyAweDAwMDA5MjdjCisKKyNkZWZpbmUgTlY1MF9ESVNQX0NPUkVfQ0hBTk5FTF9ETUEgICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3ZC5oICovIDB4MDAwMDUwN2QKKyNkZWZpbmUgRzgyX0RJU1BfQ09SRV9DSEFOTkVMX0RNQSAgICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3ZC5oICovIDB4MDAwMDgyN2QKKyNkZWZpbmUgR1QyMDBfRElTUF9DT1JFX0NIQU5ORUxfRE1BICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3ZC5oICovIDB4MDAwMDgzN2QKKyNkZWZpbmUgR1QyMTRfRElTUF9DT1JFX0NIQU5ORUxfRE1BICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3ZC5oICovIDB4MDAwMDg1N2QKKyNkZWZpbmUgR1QyMDZfRElTUF9DT1JFX0NIQU5ORUxfRE1BICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3ZC5oICovIDB4MDAwMDg4N2QKKyNkZWZpbmUgR0YxMTBfRElTUF9DT1JFX0NIQU5ORUxfRE1BICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3ZC5oICovIDB4MDAwMDkwN2QKKyNkZWZpbmUgR0sxMDRfRElTUF9DT1JFX0NIQU5ORUxfRE1BICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3ZC5oICovIDB4MDAwMDkxN2QKKyNkZWZpbmUgR0sxMTBfRElTUF9DT1JFX0NIQU5ORUxfRE1BICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3ZC5oICovIDB4MDAwMDkyN2QKKyNkZWZpbmUgR00xMDdfRElTUF9DT1JFX0NIQU5ORUxfRE1BICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3ZC5oICovIDB4MDAwMDk0N2QKKyNkZWZpbmUgR00yMDRfRElTUF9DT1JFX0NIQU5ORUxfRE1BICAgICAgICAgICAgICAgICAgIC8qIGNsNTA3ZC5oICovIDB4MDAwMDk1N2QKKworI2RlZmluZSBOVjUwX0RJU1BfT1ZFUkxBWV9DSEFOTkVMX0RNQSAgICAgICAgICAgICAgICAgLyogY2w1MDdlLmggKi8gMHgwMDAwNTA3ZQorI2RlZmluZSBHODJfRElTUF9PVkVSTEFZX0NIQU5ORUxfRE1BICAgICAgICAgICAgICAgICAgLyogY2w1MDdlLmggKi8gMHgwMDAwODI3ZQorI2RlZmluZSBHVDIwMF9ESVNQX09WRVJMQVlfQ0hBTk5FTF9ETUEgICAgICAgICAgICAgICAgLyogY2w1MDdlLmggKi8gMHgwMDAwODM3ZQorI2RlZmluZSBHVDIxNF9ESVNQX09WRVJMQVlfQ0hBTk5FTF9ETUEgICAgICAgICAgICAgICAgLyogY2w1MDdlLmggKi8gMHgwMDAwODU3ZQorI2RlZmluZSBHRjExMF9ESVNQX09WRVJMQVlfQ09OVFJPTF9ETUEgICAgICAgICAgICAgICAgLyogY2w1MDdlLmggKi8gMHgwMDAwOTA3ZQorI2RlZmluZSBHSzEwNF9ESVNQX09WRVJMQVlfQ09OVFJPTF9ETUEgICAgICAgICAgICAgICAgLyogY2w1MDdlLmggKi8gMHgwMDAwOTE3ZQorCisjZGVmaW5lIEZFUk1JX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbDkwOTcuaCAqLyAweDAwMDA5MDk3CisjZGVmaW5lIEZFUk1JX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbDkwOTcuaCAqLyAweDAwMDA5MTk3CisjZGVmaW5lIEZFUk1JX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbDkwOTcuaCAqLyAweDAwMDA5Mjk3CisKKyNkZWZpbmUgS0VQTEVSX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsOTA5Ny5oICovIDB4MDAwMGEwOTcKKyNkZWZpbmUgS0VQTEVSX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsOTA5Ny5oICovIDB4MDAwMGExOTcKKyNkZWZpbmUgS0VQTEVSX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsOTA5Ny5oICovIDB4MDAwMGEyOTcKKworI2RlZmluZSBNQVhXRUxMX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2w5MDk3LmggKi8gMHgwMDAwYjA5NworI2RlZmluZSBNQVhXRUxMX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2w5MDk3LmggKi8gMHgwMDAwYjE5NworCisjZGVmaW5lIE5WNzRfQlNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA3NGIwCisKKyNkZWZpbmUgR1QyMTJfTVNWTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDg1YjEKKyNkZWZpbmUgSUdUMjFBX01TVkxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDg2YjEKKyNkZWZpbmUgRzk4X01TVkxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDg4YjEKKyNkZWZpbmUgR0YxMDBfTVNWTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDkwYjEKKyNkZWZpbmUgR0sxMDRfTVNWTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDk1YjEKKworI2RlZmluZSBHVDIxMl9NU1BERUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODViMgorI2RlZmluZSBHOThfTVNQREVDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODhiMgorI2RlZmluZSBHRjEwMF9NU1BERUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwOTBiMgorI2RlZmluZSBHSzEwNF9NU1BERUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwOTViMgorCisjZGVmaW5lIEdUMjEyX01TUFBQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4NWIzCisjZGVmaW5lIEc5OF9NU1BQUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4OGIzCisjZGVmaW5lIEdGMTAwX01TUFBQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA5MGIzCisKKyNkZWZpbmUgRzk4X1NFQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDg4YjQKKworI2RlZmluZSBHVDIxMl9ETUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODViNQorI2RlZmluZSBGRVJNSV9ETUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwOTBiNQorI2RlZmluZSBLRVBMRVJfRE1BX0NPUFlfQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwYTBiNQorI2RlZmluZSBNQVhXRUxMX0RNQV9DT1BZX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwYjBiNQorCisjZGVmaW5lIEZFUk1JX0RFQ09NUFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA5MGI4CisKKyNkZWZpbmUgRkVSTUlfQ09NUFVURV9BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDkwYzAKKyNkZWZpbmUgRkVSTUlfQ09NUFVURV9CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDkxYzAKKyNkZWZpbmUgS0VQTEVSX0NPTVBVVEVfQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMGEwYzAKKyNkZWZpbmUgS0VQTEVSX0NPTVBVVEVfQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMGExYzAKKyNkZWZpbmUgTUFYV0VMTF9DT01QVVRFX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMGIwYzAKKyNkZWZpbmUgTUFYV0VMTF9DT01QVVRFX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMGIxYzAKKworI2RlZmluZSBOVjc0X0NJUEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNzRjMQorI2VuZGlmCmRpZmYgLS1naXQgYS9ub3V2ZWF1L252aWYvaWYwMDAyLmggYi9ub3V2ZWF1L252aWYvaWYwMDAyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA0YzkxZAotLS0gL2Rldi9udWxsCisrKyBiL25vdXZlYXUvbnZpZi9pZjAwMDIuaApAQCAtMCwwICsxLDM4IEBACisjaWZuZGVmIF9fTlZJRl9JRjAwMDJfSF9fCisjZGVmaW5lIF9fTlZJRl9JRjAwMDJfSF9fCisKKyNkZWZpbmUgTlZJRl9QRVJGTU9OX1YwX1FVRVJZX0RPTUFJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTlZJRl9QRVJGTU9OX1YwX1FVRVJZX1NJR05BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTlZJRl9QRVJGTU9OX1YwX1FVRVJZX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKworc3RydWN0IG52aWZfcGVyZm1vbl9xdWVyeV9kb21haW5fdjAgeworCV9fdTggIHZlcnNpb247CisJX191OCAgaWQ7CisJX191OCAgY291bnRlcl9ucjsKKwlfX3U4ICBpdGVyOworCV9fdTE2IHNpZ25hbF9ucjsKKwlfX3U4ICBwYWQwNVsyXTsKKwljaGFyICBuYW1lWzY0XTsKK307CisKK3N0cnVjdCBudmlmX3BlcmZtb25fcXVlcnlfc2lnbmFsX3YwIHsKKwlfX3U4ICB2ZXJzaW9uOworCV9fdTggIGRvbWFpbjsKKwlfX3UxNiBpdGVyOworCV9fdTggIHNpZ25hbDsKKwlfX3U4ICBzb3VyY2VfbnI7CisJX191OCAgcGFkMDVbMl07CisJY2hhciAgbmFtZVs2NF07Cit9OworCitzdHJ1Y3QgbnZpZl9wZXJmbW9uX3F1ZXJ5X3NvdXJjZV92MCB7CisJX191OCAgdmVyc2lvbjsKKwlfX3U4ICBkb21haW47CisJX191OCAgc2lnbmFsOworCV9fdTggIGl0ZXI7CisJX191OCAgcGFkMDRbNF07CisJX191MzIgc291cmNlOworCV9fdTMyIG1hc2s7CisJY2hhciAgbmFtZVs2NF07Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9ub3V2ZWF1L252aWYvaWYwMDAzLmggYi9ub3V2ZWF1L252aWYvaWYwMDAzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkMDNlZgotLS0gL2Rldi9udWxsCisrKyBiL25vdXZlYXUvbnZpZi9pZjAwMDMuaApAQCAtMCwwICsxLDMzIEBACisjaWZuZGVmIF9fTlZJRl9JRjAwMDNfSF9fCisjZGVmaW5lIF9fTlZJRl9JRjAwMDNfSF9fCisKK3N0cnVjdCBudmlmX3BlcmZkb21fdjAgeworCV9fdTggIHZlcnNpb247CisJX191OCAgZG9tYWluOworCV9fdTggIG1vZGU7CisJX191OCAgcGFkMDNbMV07CisJc3RydWN0IHsKKwkJX191OCAgc2lnbmFsWzRdOworCQlfX3U2NCBzb3VyY2VbNF1bOF07CisJCV9fdTE2IGxvZ2ljX29wOworCX0gY3RyWzRdOworfTsKKworI2RlZmluZSBOVklGX1BFUkZET01fVjBfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBOVklGX1BFUkZET01fVjBfU0FNUExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBOVklGX1BFUkZET01fVjBfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorCitzdHJ1Y3QgbnZpZl9wZXJmZG9tX2luaXQgeworfTsKKworc3RydWN0IG52aWZfcGVyZmRvbV9zYW1wbGUgeworfTsKKworc3RydWN0IG52aWZfcGVyZmRvbV9yZWFkX3YwIHsKKwlfX3U4ICB2ZXJzaW9uOworCV9fdTggIHBhZDAxWzddOworCV9fdTMyIGN0cls0XTsKKwlfX3UzMiBjbGs7CisJX191OCAgcGFkMDRbNF07Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9ub3V2ZWF1L252aWYvaW9jdGwuaCBiL25vdXZlYXUvbnZpZi9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZjVlYjgKLS0tIC9kZXYvbnVsbAorKysgYi9ub3V2ZWF1L252aWYvaW9jdGwuaApAQCAtMCwwICsxLDEzMiBAQAorI2lmbmRlZiBfX05WSUZfSU9DVExfSF9fCisjZGVmaW5lIF9fTlZJRl9JT0NUTF9IX18KKworI2RlZmluZSBOVklGX1ZFUlNJT05fTEFURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMFVMTAorCitzdHJ1Y3QgbnZpZl9pb2N0bF92MCB7CisJX191OCAgdmVyc2lvbjsKKyNkZWZpbmUgTlZJRl9JT0NUTF9WMF9OT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTlZJRl9JT0NUTF9WMF9TQ0xBU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTlZJRl9JT0NUTF9WMF9ORVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTlZJRl9JT0NUTF9WMF9ERUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgTlZJRl9JT0NUTF9WMF9NVEhEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgTlZJRl9JT0NUTF9WMF9SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgTlZJRl9JT0NUTF9WMF9XUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgTlZJRl9JT0NUTF9WMF9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgTlZJRl9JT0NUTF9WMF9VTk1BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgTlZJRl9JT0NUTF9WMF9OVEZZX05FVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgTlZJRl9JT0NUTF9WMF9OVEZZX0RFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGEKKyNkZWZpbmUgTlZJRl9JT0NUTF9WMF9OVEZZX0dFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIKKyNkZWZpbmUgTlZJRl9JT0NUTF9WMF9OVEZZX1BVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMKKwlfX3U4ICB0eXBlOworCV9fdTggIHBhZDAyWzRdOworI2RlZmluZSBOVklGX0lPQ1RMX1YwX09XTkVSX05WSUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBOVklGX0lPQ1RMX1YwX09XTkVSX0FOWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZgorCV9fdTggIG93bmVyOworI2RlZmluZSBOVklGX0lPQ1RMX1YwX1JPVVRFX05WSUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBOVklGX0lPQ1RMX1YwX1JPVVRFX0hJRERFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZgorCV9fdTggIHJvdXRlOworCV9fdTY0IHRva2VuOworCV9fdTY0IG9iamVjdDsKKwlfX3U4ICBkYXRhW107CQkvKiBpb2N0bCBkYXRhIChiZWxvdykgKi8KK307CisKK3N0cnVjdCBudmlmX2lvY3RsX25vcF92MCB7CisJX191NjQgdmVyc2lvbjsKK307CisKK3N0cnVjdCBudmlmX2lvY3RsX3NjbGFzc192MCB7CisJLyogbnZpZl9pb2N0bCAuLi4gKi8KKwlfX3U4ICB2ZXJzaW9uOworCV9fdTggIGNvdW50OworCV9fdTggIHBhZDAyWzZdOworCXN0cnVjdCBudmlmX2lvY3RsX3NjbGFzc19vY2xhc3NfdjAgeworCQlfX3MzMiBvY2xhc3M7CisJCV9fczE2IG1pbnZlcjsKKwkJX19zMTYgbWF4dmVyOworCX0gb2NsYXNzW107Cit9OworCitzdHJ1Y3QgbnZpZl9pb2N0bF9uZXdfdjAgeworCS8qIG52aWZfaW9jdGwgLi4uICovCisJX191OCAgdmVyc2lvbjsKKwlfX3U4ICBwYWQwMVs2XTsKKwlfX3U4ICByb3V0ZTsKKwlfX3U2NCB0b2tlbjsKKwlfX3U2NCBvYmplY3Q7CisJX191MzIgaGFuZGxlOworCV9fczMyIG9jbGFzczsKKwlfX3U4ICBkYXRhW107CQkvKiBjbGFzcyBkYXRhIChjbGFzcy5oKSAqLworfTsKKworc3RydWN0IG52aWZfaW9jdGxfZGVsIHsKK307CisKK3N0cnVjdCBudmlmX2lvY3RsX3JkX3YwIHsKKwkvKiBudmlmX2lvY3RsIC4uLiAqLworCV9fdTggIHZlcnNpb247CisJX191OCAgc2l6ZTsKKwlfX3U4ICBwYWQwMlsyXTsKKwlfX3UzMiBkYXRhOworCV9fdTY0IGFkZHI7Cit9OworCitzdHJ1Y3QgbnZpZl9pb2N0bF93cl92MCB7CisJLyogbnZpZl9pb2N0bCAuLi4gKi8KKwlfX3U4ICB2ZXJzaW9uOworCV9fdTggIHNpemU7CisJX191OCAgcGFkMDJbMl07CisJX191MzIgZGF0YTsKKwlfX3U2NCBhZGRyOworfTsKKworc3RydWN0IG52aWZfaW9jdGxfbWFwX3YwIHsKKwkvKiBudmlmX2lvY3RsIC4uLiAqLworCV9fdTggIHZlcnNpb247CisJX191OCAgcGFkMDFbM107CisJX191MzIgbGVuZ3RoOworCV9fdTY0IGhhbmRsZTsKK307CisKK3N0cnVjdCBudmlmX2lvY3RsX3VubWFwIHsKK307CisKK3N0cnVjdCBudmlmX2lvY3RsX250ZnlfbmV3X3YwIHsKKwkvKiBudmlmX2lvY3RsIC4uLiAqLworCV9fdTggIHZlcnNpb247CisJX191OCAgZXZlbnQ7CisJX191OCAgaW5kZXg7CisJX191OCAgcGFkMDNbNV07CisJX191OCAgZGF0YVtdOwkJLyogZXZlbnQgcmVxdWVzdCBkYXRhIChldmVudC5oKSAqLworfTsKKworc3RydWN0IG52aWZfaW9jdGxfbnRmeV9kZWxfdjAgeworCS8qIG52aWZfaW9jdGwgLi4uICovCisJX191OCAgdmVyc2lvbjsKKwlfX3U4ICBpbmRleDsKKwlfX3U4ICBwYWQwMls2XTsKK307CisKK3N0cnVjdCBudmlmX2lvY3RsX250ZnlfZ2V0X3YwIHsKKwkvKiBudmlmX2lvY3RsIC4uLiAqLworCV9fdTggIHZlcnNpb247CisJX191OCAgaW5kZXg7CisJX191OCAgcGFkMDJbNl07Cit9OworCitzdHJ1Y3QgbnZpZl9pb2N0bF9udGZ5X3B1dF92MCB7CisJLyogbnZpZl9pb2N0bCAuLi4gKi8KKwlfX3U4ICB2ZXJzaW9uOworCV9fdTggIGluZGV4OworCV9fdTggIHBhZDAyWzZdOworfTsKKworc3RydWN0IG52aWZfaW9jdGxfbXRoZF92MCB7CisJLyogbnZpZl9pb2N0bCAuLi4gKi8KKwlfX3U4ICB2ZXJzaW9uOworCV9fdTggIG1ldGhvZDsKKwlfX3U4ICBwYWQwMls2XTsKKwlfX3U4ICBkYXRhW107CQkvKiBtZXRob2QgZGF0YSAoY2xhc3MuaCkgKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbm91dmVhdS9udmlmL3VucGFjay5oIGIvbm91dmVhdS9udmlmL3VucGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MWJjZjQKLS0tIC9kZXYvbnVsbAorKysgYi9ub3V2ZWF1L252aWYvdW5wYWNrLmgKQEAgLTAsMCArMSwyOCBAQAorI2lmbmRlZiBfX05WSUZfVU5QQUNLX0hfXworI2RlZmluZSBfX05WSUZfVU5QQUNLX0hfXworCisjZGVmaW5lIG52aWZfdW52ZXJzKHIsZCxzLG0pICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXZvaWQgKipfZGF0YSA9IChkKTsgX191MzIgKl9zaXplID0gKHMpOyBpbnQgX3JldCA9IChyKTsgICAgICAgICAgICAgICAgXAorCWlmIChfcmV0ID09IC1FTk9TWVMgJiYgKl9zaXplID09IHNpemVvZihtKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkqX2RhdGEgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSpfc2l6ZSA9IF9yZXQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKKyNkZWZpbmUgbnZpZl91bnBhY2socixkLHMsbSx2bCx2aCx4KSAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJdm9pZCAqKl9kYXRhID0gKGQpOyBfX3UzMiAqX3NpemUgPSAocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaW50IF9yZXQgPSAociksIF92bCA9ICh2bCksIF92aCA9ICh2aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKF9yZXQgPT0gLUVOT1NZUyAmJiAqX3NpemUgPj0gc2l6ZW9mKG0pICYmICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgIChtKS52ZXJzaW9uID49IF92bCAmJiAobSkudmVyc2lvbiA8PSBfdmgpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSpfZGF0YSA9IChfX3U4ICopKl9kYXRhICsgc2l6ZW9mKG0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJKl9zaXplID0gKl9zaXplIC0gc2l6ZW9mKG0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoX3JldCA9IDAsICEoeCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlfcmV0ID0gKl9zaXplID8gLUUyQklHIDogMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJKl9kYXRhID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCSpfc2l6ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisjZW5kaWYKZGlmZiAtLWdpdCBhL25vdXZlYXUvcHJpdmF0ZS5oIGIvbm91dmVhdS9wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMwNjBmOQotLS0gL2Rldi9udWxsCisrKyBiL25vdXZlYXUvcHJpdmF0ZS5oCkBAIC0wLDAgKzEsMTI0IEBACisjaWZuZGVmIF9fTk9VVkVBVV9MSUJEUk1fUFJJVkFURV9IX18KKyNkZWZpbmUgX19OT1VWRUFVX0xJQkRSTV9QUklWQVRFX0hfXworCisjaW5jbHVkZSA8bGliZHJtX21hY3Jvcy5oPgorI2luY2x1ZGUgPHhmODZkcm0uaD4KKyNpbmNsdWRlIDx4Zjg2YXRvbWljLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCisKKyNpbmNsdWRlICJub3V2ZWF1LmgiCisKKyNpZmRlZiBERUJVRworZHJtX3ByaXZhdGUgdWludDMyX3Qgbm91dmVhdV9kZWJ1ZzsKKyNkZWZpbmUgZGJnX29uKGx2bCkgKG5vdXZlYXVfZGVidWcgJiAoMSA8PCBsdmwpKQorI2RlZmluZSBkYmcobHZsLCBmbXQsIGFyZ3MuLi4pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoZGJnX29uKChsdmwpKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJZnByaW50ZihzdGRlcnIsICJub3V2ZWF1OiAiZm10LCAjI2FyZ3MpOyAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgZGJnX29uKGx2bCkgKDApCisjZGVmaW5lIGRiZyhsdmwsIGZtdCwgYXJncy4uLikKKyNlbmRpZgorI2RlZmluZSBlcnIoZm10LCBhcmdzLi4uKSBmcHJpbnRmKHN0ZGVyciwgIm5vdXZlYXU6ICJmbXQsICMjYXJncykKKworc3RydWN0IG5vdXZlYXVfY2xpZW50X2tyZWYgeworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9ibyAqa3JlZjsKKwlzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmICpwdXNoOworfTsKKworc3RydWN0IG5vdXZlYXVfY2xpZW50X3ByaXYgeworCXN0cnVjdCBub3V2ZWF1X2NsaWVudCBiYXNlOworCXN0cnVjdCBub3V2ZWF1X2NsaWVudF9rcmVmICprcmVmOworCXVuc2lnbmVkIGtyZWZfbnI7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBub3V2ZWF1X2NsaWVudF9wcml2ICoKK25vdXZlYXVfY2xpZW50KHN0cnVjdCBub3V2ZWF1X2NsaWVudCAqY2xpZW50KQoreworCXJldHVybiAoc3RydWN0IG5vdXZlYXVfY2xpZW50X3ByaXYgKiljbGllbnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvICoKK2NsaV9rcmVmX2dldChzdHJ1Y3Qgbm91dmVhdV9jbGllbnQgKmNsaWVudCwgc3RydWN0IG5vdXZlYXVfYm8gKmJvKQoreworCXN0cnVjdCBub3V2ZWF1X2NsaWVudF9wcml2ICpwY2xpID0gbm91dmVhdV9jbGllbnQoY2xpZW50KTsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfYm8gKmtyZWYgPSBOVUxMOworCWlmIChwY2xpLT5rcmVmX25yID4gYm8tPmhhbmRsZSkKKwkJa3JlZiA9IHBjbGktPmtyZWZbYm8tPmhhbmRsZV0ua3JlZjsKKwlyZXR1cm4ga3JlZjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmICoKK2NsaV9wdXNoX2dldChzdHJ1Y3Qgbm91dmVhdV9jbGllbnQgKmNsaWVudCwgc3RydWN0IG5vdXZlYXVfYm8gKmJvKQoreworCXN0cnVjdCBub3V2ZWF1X2NsaWVudF9wcml2ICpwY2xpID0gbm91dmVhdV9jbGllbnQoY2xpZW50KTsKKwlzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmICpwdXNoID0gTlVMTDsKKwlpZiAocGNsaS0+a3JlZl9uciA+IGJvLT5oYW5kbGUpCisJCXB1c2ggPSBwY2xpLT5rcmVmW2JvLT5oYW5kbGVdLnB1c2g7CisJcmV0dXJuIHB1c2g7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY2xpX2tyZWZfc2V0KHN0cnVjdCBub3V2ZWF1X2NsaWVudCAqY2xpZW50LCBzdHJ1Y3Qgbm91dmVhdV9ibyAqYm8sCisJICAgICBzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfYm8gKmtyZWYsCisJICAgICBzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmICpwdXNoKQoreworCXN0cnVjdCBub3V2ZWF1X2NsaWVudF9wcml2ICpwY2xpID0gbm91dmVhdV9jbGllbnQoY2xpZW50KTsKKwlpZiAocGNsaS0+a3JlZl9uciA8PSBiby0+aGFuZGxlKSB7CisJCXBjbGktPmtyZWYgPSByZWFsbG9jKHBjbGktPmtyZWYsCisJCQkJICAgICBzaXplb2YoKnBjbGktPmtyZWYpICogYm8tPmhhbmRsZSAqIDIpOworCQl3aGlsZSAocGNsaS0+a3JlZl9uciA8IGJvLT5oYW5kbGUgKiAyKSB7CisJCQlwY2xpLT5rcmVmW3BjbGktPmtyZWZfbnJdLmtyZWYgPSBOVUxMOworCQkJcGNsaS0+a3JlZltwY2xpLT5rcmVmX25yXS5wdXNoID0gTlVMTDsKKwkJCXBjbGktPmtyZWZfbnIrKzsKKwkJfQorCX0KKwlwY2xpLT5rcmVmW2JvLT5oYW5kbGVdLmtyZWYgPSBrcmVmOworCXBjbGktPmtyZWZbYm8tPmhhbmRsZV0ucHVzaCA9IHB1c2g7Cit9CisKK3N0cnVjdCBub3V2ZWF1X2JvX3ByaXYgeworCXN0cnVjdCBub3V2ZWF1X2JvIGJhc2U7CisJc3RydWN0IG5vdXZlYXVfbGlzdCBoZWFkOworCWF0b21pY190IHJlZmNudDsKKwl1aW50NjRfdCBtYXBfaGFuZGxlOworCXVpbnQzMl90IG5hbWU7CisJdWludDMyX3QgYWNjZXNzOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgbm91dmVhdV9ib19wcml2ICoKK25vdXZlYXVfYm8oc3RydWN0IG5vdXZlYXVfYm8gKmJvKQoreworCXJldHVybiAoc3RydWN0IG5vdXZlYXVfYm9fcHJpdiAqKWJvOworfQorCitzdHJ1Y3Qgbm91dmVhdV9kZXZpY2VfcHJpdiB7CisJc3RydWN0IG5vdXZlYXVfZGV2aWNlIGJhc2U7CisJaW50IGNsb3NlOworCXB0aHJlYWRfbXV0ZXhfdCBsb2NrOworCXN0cnVjdCBub3V2ZWF1X2xpc3QgYm9fbGlzdDsKKwl1aW50MzJfdCAqY2xpZW50OworCWludCBucl9jbGllbnQ7CisJYm9vbCBoYXZlX2JvX3VzYWdlOworCWludCBnYXJ0X2xpbWl0X3BlcmNlbnQsIHZyYW1fbGltaXRfcGVyY2VudDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5vdXZlYXVfZGV2aWNlX3ByaXYgKgorbm91dmVhdV9kZXZpY2Uoc3RydWN0IG5vdXZlYXVfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIChzdHJ1Y3Qgbm91dmVhdV9kZXZpY2VfcHJpdiAqKWRldjsKK30KKworaW50Citub3V2ZWF1X2RldmljZV9vcGVuX2V4aXN0aW5nKHN0cnVjdCBub3V2ZWF1X2RldmljZSAqKiwgaW50LCBpbnQsIGRybV9jb250ZXh0X3QpOworCisvKiBhYmkxNi5jICovCitkcm1fcHJpdmF0ZSBib29sIGFiaTE2X29iamVjdChzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKiwgaW50ICgqKikoc3RydWN0IG5vdXZlYXVfb2JqZWN0ICopKTsKK2RybV9wcml2YXRlIHZvaWQgYWJpMTZfZGVsZXRlKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqKTsKK2RybV9wcml2YXRlIGludCAgYWJpMTZfc2NsYXNzKHN0cnVjdCBub3V2ZWF1X29iamVjdCAqLCBzdHJ1Y3Qgbm91dmVhdV9zY2xhc3MgKiopOworZHJtX3ByaXZhdGUgdm9pZCBhYmkxNl9ib19pbmZvKHN0cnVjdCBub3V2ZWF1X2JvICosIHN0cnVjdCBkcm1fbm91dmVhdV9nZW1faW5mbyAqKTsKK2RybV9wcml2YXRlIGludCAgYWJpMTZfYm9faW5pdChzdHJ1Y3Qgbm91dmVhdV9ibyAqLCB1aW50MzJfdCBhbGlnbm1lbnQsCisJCQkgICAgICAgdW5pb24gbm91dmVhdV9ib19jb25maWcgKik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbm91dmVhdS9wdXNoYnVmLmMgYi9ub3V2ZWF1L3B1c2hidWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzVlMzAxCi0tLSAvZGV2L251bGwKKysrIGIvbm91dmVhdS9wdXNoYnVmLmMKQEAgLTAsMCArMSw3ODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMiBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPHhmODZkcm0uaD4KKyNpbmNsdWRlIDx4Zjg2YXRvbWljLmg+CisjaW5jbHVkZSAibGliZHJtX2xpc3RzLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKKworI2luY2x1ZGUgIm5vdXZlYXUuaCIKKyNpbmNsdWRlICJwcml2YXRlLmgiCisKK3N0cnVjdCBub3V2ZWF1X3B1c2hidWZfa3JlYyB7CisJc3RydWN0IG5vdXZlYXVfcHVzaGJ1Zl9rcmVjICpuZXh0OworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9ibyBidWZmZXJbTk9VVkVBVV9HRU1fTUFYX0JVRkZFUlNdOworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9yZWxvYyByZWxvY1tOT1VWRUFVX0dFTV9NQVhfUkVMT0NTXTsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfcHVzaCBwdXNoW05PVVZFQVVfR0VNX01BWF9QVVNIXTsKKwlpbnQgbnJfYnVmZmVyOworCWludCBucl9yZWxvYzsKKwlpbnQgbnJfcHVzaDsKKwl1aW50NjRfdCB2cmFtX3VzZWQ7CisJdWludDY0X3QgZ2FydF91c2VkOworfTsKKworc3RydWN0IG5vdXZlYXVfcHVzaGJ1Zl9wcml2IHsKKwlzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmIGJhc2U7CisJc3RydWN0IG5vdXZlYXVfcHVzaGJ1Zl9rcmVjICpsaXN0OworCXN0cnVjdCBub3V2ZWF1X3B1c2hidWZfa3JlYyAqa3JlYzsKKwlzdHJ1Y3Qgbm91dmVhdV9saXN0IGJjdHhfbGlzdDsKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqYm87CisJdWludDMyX3QgdHlwZTsKKwl1aW50MzJfdCBzdWZmaXgwOworCXVpbnQzMl90IHN1ZmZpeDE7CisJdWludDMyX3QgKnB0cjsKKwl1aW50MzJfdCAqYmduOworCWludCBib19uZXh0OworCWludCBib19ucjsKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqYm9zW107Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBub3V2ZWF1X3B1c2hidWZfcHJpdiAqCitub3V2ZWF1X3B1c2hidWYoc3RydWN0IG5vdXZlYXVfcHVzaGJ1ZiAqcHVzaCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBub3V2ZWF1X3B1c2hidWZfcHJpdiAqKXB1c2g7Cit9CisKK3N0YXRpYyBpbnQgcHVzaGJ1Zl92YWxpZGF0ZShzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmICosIGJvb2wpOworc3RhdGljIGludCBwdXNoYnVmX2ZsdXNoKHN0cnVjdCBub3V2ZWF1X3B1c2hidWYgKik7CisKK3N0YXRpYyBib29sCitwdXNoYnVmX2tyZWZfZml0cyhzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmICpwdXNoLCBzdHJ1Y3Qgbm91dmVhdV9ibyAqYm8sCisJCSAgdWludDMyX3QgKmRvbWFpbnMpCit7CisJc3RydWN0IG5vdXZlYXVfcHVzaGJ1Zl9wcml2ICpudnBiID0gbm91dmVhdV9wdXNoYnVmKHB1c2gpOworCXN0cnVjdCBub3V2ZWF1X3B1c2hidWZfa3JlYyAqa3JlYyA9IG52cGItPmtyZWM7CisJc3RydWN0IG5vdXZlYXVfZGV2aWNlICpkZXYgPSBwdXNoLT5jbGllbnQtPmRldmljZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqa2JvOworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9ibyAqa3JlZjsKKwlpbnQgaTsKKworCS8qIFZSQU0gaXMgdGhlIG9ubHkgdmFsaWQgZG9tYWluLiAgR0FSVCBhbmQgVlJBTXxHQVJUIGJ1ZmZlcnMKKwkgKiBhcmUgYWxsIGFjY291bnRlZCB0byBHQVJULCBzbyBpZiB0aGlzIGRvZXNuJ3QgZml0IGluIFZSQU0KKwkgKiBzdHJhaWdodCB1cCwgYSBmbHVzaCBpcyBuZWVkZWQuCisJICovCisJaWYgKCpkb21haW5zID09IE5PVVZFQVVfR0VNX0RPTUFJTl9WUkFNKSB7CisJCWlmIChrcmVjLT52cmFtX3VzZWQgKyBiby0+c2l6ZSA+IGRldi0+dnJhbV9saW1pdCkKKwkJCXJldHVybiBmYWxzZTsKKwkJa3JlYy0+dnJhbV91c2VkICs9IGJvLT5zaXplOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiBHQVJUIG9yIFZSQU18R0FSVCBidWZmZXIuICBBY2NvdW50IGJvdGggb2YgdGhlc2UgYnVmZmVyIHR5cGVzCisJICogdG8gR0FSVCBvbmx5IGZvciB0aGUgbW9tZW50LCB3aGljaCBzaW1wbGlmaWVzIHRoaW5ncy4gIElmIHRoZQorCSAqIGJ1ZmZlciBjYW4gZml0IGFscmVhZHksIHdlJ3JlIGRvbmUgaGVyZS4KKwkgKi8KKwlpZiAoa3JlYy0+Z2FydF91c2VkICsgYm8tPnNpemUgPD0gZGV2LT5nYXJ0X2xpbWl0KSB7CisJCWtyZWMtPmdhcnRfdXNlZCArPSBiby0+c2l6ZTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyogUmFuIG91dCBvZiBHQVJUIHNwYWNlLCBpZiBpdCdzIGEgVlJBTXxHQVJUIGJ1ZmZlciBhbmQgaXQnbGwKKwkgKiBmaXQgaW50byBhdmFpbGFibGUgVlJBTSwgdHVybiBpdCBpbnRvIGEgVlJBTSBidWZmZXIKKwkgKi8KKwlpZiAoKCpkb21haW5zICYgTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0pICYmCisJICAgIGtyZWMtPnZyYW1fdXNlZCArIGJvLT5zaXplIDw9IGRldi0+dnJhbV9saW1pdCkgeworCQkqZG9tYWlucyAmPSBOT1VWRUFVX0dFTV9ET01BSU5fVlJBTTsKKwkJa3JlYy0+dnJhbV91c2VkICs9IGJvLT5zaXplOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiBTdGlsbCBjb3VsZG4ndCBmaXQgdGhlIGJ1ZmZlciBpbiBhbnl3aGVyZSwgc28gYXMgYSBsYXN0IHJlc29ydDsKKwkgKiBzY2FuIHRoZSBidWZmZXIgbGlzdCBmb3IgVlJBTXxHQVJUIGJ1ZmZlcnMgYW5kIHR1cm4gdGhlbSBpbnRvCisJICogVlJBTSBidWZmZXJzIHVudGlsIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGluIEdBUlQgZm9yIHRoaXMgb25lCisJICovCisJa3JlZiA9IGtyZWMtPmJ1ZmZlcjsKKwlmb3IgKGkgPSAwOyBpIDwga3JlYy0+bnJfYnVmZmVyOyBpKyssIGtyZWYrKykgeworCQlpZiAoIShrcmVmLT52YWxpZF9kb21haW5zICYgTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQpKQorCQkJY29udGludWU7CisKKwkJa2JvID0gKHZvaWQgKikodW5zaWduZWQgbG9uZylrcmVmLT51c2VyX3ByaXY7CisJCWlmICghKGtyZWYtPnZhbGlkX2RvbWFpbnMgJiBOT1VWRUFVX0dFTV9ET01BSU5fVlJBTSkgfHwKKwkJICAgIGtyZWMtPnZyYW1fdXNlZCArIGtiby0+c2l6ZSA+IGRldi0+dnJhbV9saW1pdCkKKwkJCWNvbnRpbnVlOworCisJCWtyZWYtPnZhbGlkX2RvbWFpbnMgJj0gTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU07CisJCWtyZWMtPmdhcnRfdXNlZCAtPSBrYm8tPnNpemU7CisJCWtyZWMtPnZyYW1fdXNlZCArPSBrYm8tPnNpemU7CisJCWlmIChrcmVjLT5nYXJ0X3VzZWQgKyBiby0+c2l6ZSA8PSBkZXYtPmdhcnRfbGltaXQpIHsKKwkJCWtyZWMtPmdhcnRfdXNlZCArPSBiby0+c2l6ZTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCisJLyogQ291bGRuJ3QgcmVzb2x2ZSBhIHBsYWNlbWVudCwgbmVlZCB0byBmb3JjZSBhIGZsdXNoICovCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvICoKK3B1c2hidWZfa3JlZihzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmICpwdXNoLCBzdHJ1Y3Qgbm91dmVhdV9ibyAqYm8sCisJICAgICB1aW50MzJfdCBmbGFncykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9kZXZpY2UgKmRldiA9IHB1c2gtPmNsaWVudC0+ZGV2aWNlOworCXN0cnVjdCBub3V2ZWF1X3B1c2hidWZfcHJpdiAqbnZwYiA9IG5vdXZlYXVfcHVzaGJ1ZihwdXNoKTsKKwlzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmX2tyZWMgKmtyZWMgPSBudnBiLT5rcmVjOworCXN0cnVjdCBub3V2ZWF1X3B1c2hidWYgKmZwdXNoOworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9ibyAqa3JlZjsKKwl1aW50MzJfdCBkb21haW5zLCBkb21haW5zX3dyLCBkb21haW5zX3JkOworCisJZG9tYWlucyA9IDA7CisJaWYgKGZsYWdzICYgTk9VVkVBVV9CT19WUkFNKQorCQlkb21haW5zIHw9IE5PVVZFQVVfR0VNX0RPTUFJTl9WUkFNOworCWlmIChmbGFncyAmIE5PVVZFQVVfQk9fR0FSVCkKKwkJZG9tYWlucyB8PSBOT1VWRUFVX0dFTV9ET01BSU5fR0FSVDsKKwlkb21haW5zX3dyID0gZG9tYWlucyAqICEhKGZsYWdzICYgTk9VVkVBVV9CT19XUik7CisJZG9tYWluc19yZCA9IGRvbWFpbnMgKiAhIShmbGFncyAmIE5PVVZFQVVfQk9fUkQpOworCisJLyogaWYgYnVmZmVyIGlzIHJlZmVyZW5jZWQgb24gYW5vdGhlciBwdXNoYnVmIHRoYXQgaXMgb3duZWQgYnkgdGhlCisJICogc2FtZSBjbGllbnQsIHdlIG5lZWQgdG8gZmx1c2ggdGhlIG90aGVyIHB1c2hidWYgZmlyc3QgdG8gZW5zdXJlCisJICogdGhlIGNvcnJlY3Qgb3JkZXJpbmcgb2YgY29tbWFuZHMKKwkgKi8KKwlmcHVzaCA9IGNsaV9wdXNoX2dldChwdXNoLT5jbGllbnQsIGJvKTsKKwlpZiAoZnB1c2ggJiYgZnB1c2ggIT0gcHVzaCkKKwkJcHVzaGJ1Zl9mbHVzaChmcHVzaCk7CisKKwlrcmVmID0gY2xpX2tyZWZfZ2V0KHB1c2gtPmNsaWVudCwgYm8pOworCWlmIChrcmVmKSB7CisJCS8qIHBvc3NpYmxlIGNvbmZsaWN0IGluIG1lbW9yeSB0eXBlcyAtIGZsdXNoIGFuZCByZXRyeSAqLworCQlpZiAoIShrcmVmLT52YWxpZF9kb21haW5zICYgZG9tYWlucykpCisJCQlyZXR1cm4gTlVMTDsKKworCQkvKiBWUkFNfEdBUlQgYnVmZmVyIHR1cm5pbmcgaW50byBhIFZSQU0gYnVmZmVyLiAgTWFrZSBzdXJlCisJCSAqIGl0J2xsIGZpdCBpbiBWUkFNIGFuZCBmb3JjZSBhIGZsdXNoIGlmIG5vdC4KKwkJICovCisJCWlmICgoa3JlZi0+dmFsaWRfZG9tYWlucyAgJiBOT1VWRUFVX0dFTV9ET01BSU5fR0FSVCkgJiYKKwkJICAgICggICAgICAgICAgICBkb21haW5zID09IE5PVVZFQVVfR0VNX0RPTUFJTl9WUkFNKSkgeworCQkJaWYgKGtyZWMtPnZyYW1fdXNlZCArIGJvLT5zaXplID4gZGV2LT52cmFtX2xpbWl0KQorCQkJCXJldHVybiBOVUxMOworCQkJa3JlYy0+dnJhbV91c2VkICs9IGJvLT5zaXplOworCQkJa3JlYy0+Z2FydF91c2VkIC09IGJvLT5zaXplOworCQl9CisKKwkJa3JlZi0+dmFsaWRfZG9tYWlucyAmPSBkb21haW5zOworCQlrcmVmLT53cml0ZV9kb21haW5zIHw9IGRvbWFpbnNfd3I7CisJCWtyZWYtPnJlYWRfZG9tYWlucyAgfD0gZG9tYWluc19yZDsKKwl9IGVsc2UgeworCQlpZiAoa3JlYy0+bnJfYnVmZmVyID09IE5PVVZFQVVfR0VNX01BWF9CVUZGRVJTIHx8CisJCSAgICAhcHVzaGJ1Zl9rcmVmX2ZpdHMocHVzaCwgYm8sICZkb21haW5zKSkKKwkJCXJldHVybiBOVUxMOworCisJCWtyZWYgPSAma3JlYy0+YnVmZmVyW2tyZWMtPm5yX2J1ZmZlcisrXTsKKwkJa3JlZi0+dXNlcl9wcml2ID0gKHVuc2lnbmVkIGxvbmcpYm87CisJCWtyZWYtPmhhbmRsZSA9IGJvLT5oYW5kbGU7CisJCWtyZWYtPnZhbGlkX2RvbWFpbnMgPSBkb21haW5zOworCQlrcmVmLT53cml0ZV9kb21haW5zID0gZG9tYWluc193cjsKKwkJa3JlZi0+cmVhZF9kb21haW5zID0gZG9tYWluc19yZDsKKwkJa3JlZi0+cHJlc3VtZWQudmFsaWQgPSAxOworCQlrcmVmLT5wcmVzdW1lZC5vZmZzZXQgPSBiby0+b2Zmc2V0OworCQlpZiAoYm8tPmZsYWdzICYgTk9VVkVBVV9CT19WUkFNKQorCQkJa3JlZi0+cHJlc3VtZWQuZG9tYWluID0gTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU07CisJCWVsc2UKKwkJCWtyZWYtPnByZXN1bWVkLmRvbWFpbiA9IE5PVVZFQVVfR0VNX0RPTUFJTl9HQVJUOworCisJCWNsaV9rcmVmX3NldChwdXNoLT5jbGllbnQsIGJvLCBrcmVmLCBwdXNoKTsKKwkJYXRvbWljX2luYygmbm91dmVhdV9ibyhibyktPnJlZmNudCk7CisJfQorCisJcmV0dXJuIGtyZWY7Cit9CisKK3N0YXRpYyB1aW50MzJfdAorcHVzaGJ1Zl9rcmVsKHN0cnVjdCBub3V2ZWF1X3B1c2hidWYgKnB1c2gsIHN0cnVjdCBub3V2ZWF1X2JvICpibywKKwkgICAgIHVpbnQzMl90IGRhdGEsIHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCB2b3IsIHVpbnQzMl90IHRvcikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmX3ByaXYgKm52cGIgPSBub3V2ZWF1X3B1c2hidWYocHVzaCk7CisJc3RydWN0IG5vdXZlYXVfcHVzaGJ1Zl9rcmVjICprcmVjID0gbnZwYi0+a3JlYzsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfcmVsb2MgKmtyZWw7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvICpwa3JlZjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfYm8gKmJrcmVmOworCXVpbnQzMl90IHJlbG9jID0gZGF0YTsKKworCXBrcmVmID0gY2xpX2tyZWZfZ2V0KHB1c2gtPmNsaWVudCwgbnZwYi0+Ym8pOworCWJrcmVmID0gY2xpX2tyZWZfZ2V0KHB1c2gtPmNsaWVudCwgYm8pOworCWtyZWwgID0gJmtyZWMtPnJlbG9jW2tyZWMtPm5yX3JlbG9jKytdOworCisJYXNzZXJ0KHBrcmVmKTsKKwlhc3NlcnQoYmtyZWYpOworCWtyZWwtPnJlbG9jX2JvX2luZGV4ID0gcGtyZWYgLSBrcmVjLT5idWZmZXI7CisJa3JlbC0+cmVsb2NfYm9fb2Zmc2V0ID0gKHB1c2gtPmN1ciAtIG52cGItPnB0cikgKiA0OworCWtyZWwtPmJvX2luZGV4ID0gYmtyZWYgLSBrcmVjLT5idWZmZXI7CisJa3JlbC0+ZmxhZ3MgPSAwOworCWtyZWwtPmRhdGEgPSBkYXRhOworCWtyZWwtPnZvciA9IHZvcjsKKwlrcmVsLT50b3IgPSB0b3I7CisKKwlpZiAoZmxhZ3MgJiBOT1VWRUFVX0JPX0xPVykgeworCQlyZWxvYyA9IChia3JlZi0+cHJlc3VtZWQub2Zmc2V0ICsgZGF0YSk7CisJCWtyZWwtPmZsYWdzIHw9IE5PVVZFQVVfR0VNX1JFTE9DX0xPVzsKKwl9IGVsc2UKKwlpZiAoZmxhZ3MgJiBOT1VWRUFVX0JPX0hJR0gpIHsKKwkJcmVsb2MgPSAoYmtyZWYtPnByZXN1bWVkLm9mZnNldCArIGRhdGEpID4+IDMyOworCQlrcmVsLT5mbGFncyB8PSBOT1VWRUFVX0dFTV9SRUxPQ19ISUdIOworCX0KKwlpZiAoZmxhZ3MgJiBOT1VWRUFVX0JPX09SKSB7CisJCWlmIChia3JlZi0+cHJlc3VtZWQuZG9tYWluICYgTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0pCisJCQlyZWxvYyB8PSB2b3I7CisJCWVsc2UKKwkJCXJlbG9jIHw9IHRvcjsKKwkJa3JlbC0+ZmxhZ3MgfD0gTk9VVkVBVV9HRU1fUkVMT0NfT1I7CisJfQorCisJcmV0dXJuIHJlbG9jOworfQorCitzdGF0aWMgdm9pZAorcHVzaGJ1Zl9kdW1wKHN0cnVjdCBub3V2ZWF1X3B1c2hidWZfa3JlYyAqa3JlYywgaW50IGtyZWNfaWQsIGludCBjaGlkKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9yZWxvYyAqa3JlbDsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfcHVzaCAqa3BzaDsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfYm8gKmtyZWY7CisJc3RydWN0IG5vdXZlYXVfYm8gKmJvOworCXVpbnQzMl90ICpiZ24sICplbmQ7CisJaW50IGk7CisKKwllcnIoImNoJWQ6IGtyZWMgJWQgcHVzaGVzICVkIGJ1ZnMgJWQgcmVsb2NzICVkXG4iLCBjaGlkLAorCSAgICBrcmVjX2lkLCBrcmVjLT5ucl9wdXNoLCBrcmVjLT5ucl9idWZmZXIsIGtyZWMtPm5yX3JlbG9jKTsKKworCWtyZWYgPSBrcmVjLT5idWZmZXI7CisJZm9yIChpID0gMDsgaSA8IGtyZWMtPm5yX2J1ZmZlcjsgaSsrLCBrcmVmKyspIHsKKwkJZXJyKCJjaCVkOiBidWYgJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLCBjaGlkLCBpLAorCQkgICAga3JlZi0+aGFuZGxlLCBrcmVmLT52YWxpZF9kb21haW5zLAorCQkgICAga3JlZi0+cmVhZF9kb21haW5zLCBrcmVmLT53cml0ZV9kb21haW5zKTsKKwl9CisKKwlrcmVsID0ga3JlYy0+cmVsb2M7CisJZm9yIChpID0gMDsgaSA8IGtyZWMtPm5yX3JlbG9jOyBpKyssIGtyZWwrKykgeworCQllcnIoImNoJWQ6IHJlbCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAorCQkgICAgY2hpZCwga3JlbC0+cmVsb2NfYm9faW5kZXgsIGtyZWwtPnJlbG9jX2JvX29mZnNldCwKKwkJICAgIGtyZWwtPmJvX2luZGV4LCBrcmVsLT5mbGFncywga3JlbC0+ZGF0YSwKKwkJICAgIGtyZWwtPnZvciwga3JlbC0+dG9yKTsKKwl9CisKKwlrcHNoID0ga3JlYy0+cHVzaDsKKwlmb3IgKGkgPSAwOyBpIDwga3JlYy0+bnJfcHVzaDsgaSsrLCBrcHNoKyspIHsKKwkJa3JlZiA9IGtyZWMtPmJ1ZmZlciArIGtwc2gtPmJvX2luZGV4OworCQlibyA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpa3JlZi0+dXNlcl9wcml2OworCQliZ24gPSAodWludDMyX3QgKikoKGNoYXIgKiliby0+bWFwICsga3BzaC0+b2Zmc2V0KTsKKwkJZW5kID0gYmduICsgKGtwc2gtPmxlbmd0aCAvNCk7CisKKwkJZXJyKCJjaCVkOiBwc2ggJTA4eCAlMDEwbGx4ICUwMTBsbHhcbiIsIGNoaWQsIGtwc2gtPmJvX2luZGV4LAorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylrcHNoLT5vZmZzZXQsCisJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKShrcHNoLT5vZmZzZXQgKyBrcHNoLT5sZW5ndGgpKTsKKwkJd2hpbGUgKGJnbiA8IGVuZCkKKwkJCWVycigiXHQweCUwOHhcbiIsICpiZ24rKyk7CisJfQorfQorCitzdGF0aWMgaW50CitwdXNoYnVmX3N1Ym1pdChzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmICpwdXNoLCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmNoYW4pCit7CisJc3RydWN0IG5vdXZlYXVfcHVzaGJ1Zl9wcml2ICpudnBiID0gbm91dmVhdV9wdXNoYnVmKHB1c2gpOworCXN0cnVjdCBub3V2ZWF1X3B1c2hidWZfa3JlYyAqa3JlYyA9IG52cGItPmxpc3Q7CisJc3RydWN0IG5vdXZlYXVfZGV2aWNlICpkZXYgPSBwdXNoLT5jbGllbnQtPmRldmljZTsKKwlzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSA9IG5vdXZlYXVfZHJtKCZkZXYtPm9iamVjdCk7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvX3ByZXN1bWVkICppbmZvOworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9ibyAqa3JlZjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWYgcmVxOworCXN0cnVjdCBub3V2ZWF1X2ZpZm8gKmZpZm8gPSBjaGFuLT5kYXRhOworCXN0cnVjdCBub3V2ZWF1X2JvICpibzsKKwlpbnQga3JlY19pZCA9IDA7CisJaW50IHJldCA9IDAsIGk7CisKKwlpZiAoY2hhbi0+b2NsYXNzICE9IE5PVVZFQVVfRklGT19DSEFOTkVMX0NMQVNTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwdXNoLT5raWNrX25vdGlmeSkKKwkJcHVzaC0+a2lja19ub3RpZnkocHVzaCk7CisKKwlub3V2ZWF1X3B1c2hidWZfZGF0YShwdXNoLCBOVUxMLCAwLCAwKTsKKworCXdoaWxlIChrcmVjICYmIGtyZWMtPm5yX3B1c2gpIHsKKwkJcmVxLmNoYW5uZWwgPSBmaWZvLT5jaGFubmVsOworCQlyZXEubnJfYnVmZmVycyA9IGtyZWMtPm5yX2J1ZmZlcjsKKwkJcmVxLmJ1ZmZlcnMgPSAodWludDY0X3QpKHVuc2lnbmVkIGxvbmcpa3JlYy0+YnVmZmVyOworCQlyZXEubnJfcmVsb2NzID0ga3JlYy0+bnJfcmVsb2M7CisJCXJlcS5ucl9wdXNoID0ga3JlYy0+bnJfcHVzaDsKKwkJcmVxLnJlbG9jcyA9ICh1aW50NjRfdCkodW5zaWduZWQgbG9uZylrcmVjLT5yZWxvYzsKKwkJcmVxLnB1c2ggPSAodWludDY0X3QpKHVuc2lnbmVkIGxvbmcpa3JlYy0+cHVzaDsKKwkJcmVxLnN1ZmZpeDAgPSBudnBiLT5zdWZmaXgwOworCQlyZXEuc3VmZml4MSA9IG52cGItPnN1ZmZpeDE7CisJCXJlcS52cmFtX2F2YWlsYWJsZSA9IDA7IC8qIGZvciB2YWxncmluZCAqLworCQlyZXEuZ2FydF9hdmFpbGFibGUgPSAwOworCisJCWlmIChkYmdfb24oMCkpCisJCQlwdXNoYnVmX2R1bXAoa3JlYywga3JlY19pZCsrLCBmaWZvLT5jaGFubmVsKTsKKworI2lmbmRlZiBTSU1VTEFURQorCQlyZXQgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGRybS0+ZmQsIERSTV9OT1VWRUFVX0dFTV9QVVNIQlVGLAorCQkJCQkgICZyZXEsIHNpemVvZihyZXEpKTsKKwkJbnZwYi0+c3VmZml4MCA9IHJlcS5zdWZmaXgwOworCQludnBiLT5zdWZmaXgxID0gcmVxLnN1ZmZpeDE7CisJCWRldi0+dnJhbV9saW1pdCA9IChyZXEudnJhbV9hdmFpbGFibGUgKgorCQkJCW5vdXZlYXVfZGV2aWNlKGRldiktPnZyYW1fbGltaXRfcGVyY2VudCkgLyAxMDA7CisJCWRldi0+Z2FydF9saW1pdCA9IChyZXEuZ2FydF9hdmFpbGFibGUgKgorCQkJCW5vdXZlYXVfZGV2aWNlKGRldiktPmdhcnRfbGltaXRfcGVyY2VudCkgLyAxMDA7CisjZWxzZQorCQlpZiAoZGJnX29uKDMxKSkKKwkJCXJldCA9IC1FSU5WQUw7CisjZW5kaWYKKworCQlpZiAocmV0KSB7CisJCQllcnIoImtlcm5lbCByZWplY3RlZCBwdXNoYnVmOiAlc1xuIiwgc3RyZXJyb3IoLXJldCkpOworCQkJcHVzaGJ1Zl9kdW1wKGtyZWMsIGtyZWNfaWQrKywgZmlmby0+Y2hhbm5lbCk7CisJCQlicmVhazsKKwkJfQorCisJCWtyZWYgPSBrcmVjLT5idWZmZXI7CisJCWZvciAoaSA9IDA7IGkgPCBrcmVjLT5ucl9idWZmZXI7IGkrKywga3JlZisrKSB7CisJCQlibyA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpa3JlZi0+dXNlcl9wcml2OworCisJCQlpbmZvID0gJmtyZWYtPnByZXN1bWVkOworCQkJaWYgKCFpbmZvLT52YWxpZCkgeworCQkJCWJvLT5mbGFncyAmPSB+Tk9VVkVBVV9CT19BUEVSOworCQkJCWlmIChpbmZvLT5kb21haW4gPT0gTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0pCisJCQkJCWJvLT5mbGFncyB8PSBOT1VWRUFVX0JPX1ZSQU07CisJCQkJZWxzZQorCQkJCQliby0+ZmxhZ3MgfD0gTk9VVkVBVV9CT19HQVJUOworCQkJCWJvLT5vZmZzZXQgPSBpbmZvLT5vZmZzZXQ7CisJCQl9CisKKwkJCWlmIChrcmVmLT53cml0ZV9kb21haW5zKQorCQkJCW5vdXZlYXVfYm8oYm8pLT5hY2Nlc3MgfD0gTk9VVkVBVV9CT19XUjsKKwkJCWlmIChrcmVmLT5yZWFkX2RvbWFpbnMpCisJCQkJbm91dmVhdV9ibyhibyktPmFjY2VzcyB8PSBOT1VWRUFVX0JPX1JEOworCQl9CisKKwkJa3JlYyA9IGtyZWMtPm5leHQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorcHVzaGJ1Zl9mbHVzaChzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmICpwdXNoKQoreworCXN0cnVjdCBub3V2ZWF1X3B1c2hidWZfcHJpdiAqbnZwYiA9IG5vdXZlYXVfcHVzaGJ1ZihwdXNoKTsKKwlzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmX2tyZWMgKmtyZWMgPSBudnBiLT5rcmVjOworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9ibyAqa3JlZjsKKwlzdHJ1Y3Qgbm91dmVhdV9idWZjdHggKmJjdHgsICpidG1wOworCXN0cnVjdCBub3V2ZWF1X2JvICpibzsKKwlpbnQgcmV0ID0gMCwgaTsKKworCWlmIChwdXNoLT5jaGFubmVsKSB7CisJCXJldCA9IHB1c2hidWZfc3VibWl0KHB1c2gsIHB1c2gtPmNoYW5uZWwpOworCX0gZWxzZSB7CisJCW5vdXZlYXVfcHVzaGJ1Zl9kYXRhKHB1c2gsIE5VTEwsIDAsIDApOworCQlrcmVjLT5uZXh0ID0gbWFsbG9jKHNpemVvZigqa3JlYykpOworCQludnBiLT5rcmVjID0ga3JlYy0+bmV4dDsKKwl9CisKKwlrcmVmID0ga3JlYy0+YnVmZmVyOworCWZvciAoaSA9IDA7IGkgPCBrcmVjLT5ucl9idWZmZXI7IGkrKywga3JlZisrKSB7CisJCWJvID0gKHZvaWQgKikodW5zaWduZWQgbG9uZylrcmVmLT51c2VyX3ByaXY7CisJCWNsaV9rcmVmX3NldChwdXNoLT5jbGllbnQsIGJvLCBOVUxMLCBOVUxMKTsKKwkJaWYgKHB1c2gtPmNoYW5uZWwpCisJCQlub3V2ZWF1X2JvX3JlZihOVUxMLCAmYm8pOworCX0KKworCWtyZWMgPSBudnBiLT5rcmVjOworCWtyZWMtPnZyYW1fdXNlZCA9IDA7CisJa3JlYy0+Z2FydF91c2VkID0gMDsKKwlrcmVjLT5ucl9idWZmZXIgPSAwOworCWtyZWMtPm5yX3JlbG9jID0gMDsKKwlrcmVjLT5ucl9wdXNoID0gMDsKKworCURSTUxJU1RGT1JFQUNIRU5UUllTQUZFKGJjdHgsIGJ0bXAsICZudnBiLT5iY3R4X2xpc3QsIGhlYWQpIHsKKwkJRFJNTElTVEpPSU4oJmJjdHgtPmN1cnJlbnQsICZiY3R4LT5wZW5kaW5nKTsKKwkJRFJNSU5JVExJU1RIRUFEKCZiY3R4LT5jdXJyZW50KTsKKwkJRFJNTElTVERFTElOSVQoJmJjdHgtPmhlYWQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitwdXNoYnVmX3JlZm5fZmFpbChzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmICpwdXNoLCBpbnQgc3JlZiwgaW50IHNyZWwpCit7CisJc3RydWN0IG5vdXZlYXVfcHVzaGJ1Zl9wcml2ICpudnBiID0gbm91dmVhdV9wdXNoYnVmKHB1c2gpOworCXN0cnVjdCBub3V2ZWF1X3B1c2hidWZfa3JlYyAqa3JlYyA9IG52cGItPmtyZWM7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvICprcmVmOworCisJa3JlZiA9IGtyZWMtPmJ1ZmZlciArIHNyZWY7CisJd2hpbGUgKGtyZWMtPm5yX2J1ZmZlci0tID4gc3JlZikgeworCQlzdHJ1Y3Qgbm91dmVhdV9ibyAqYm8gPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWtyZWYtPnVzZXJfcHJpdjsKKwkJY2xpX2tyZWZfc2V0KHB1c2gtPmNsaWVudCwgYm8sIE5VTEwsIE5VTEwpOworCQlub3V2ZWF1X2JvX3JlZihOVUxMLCAmYm8pOworCQlrcmVmKys7CisJfQorCWtyZWMtPm5yX2J1ZmZlciA9IHNyZWY7CisJa3JlYy0+bnJfcmVsb2MgPSBzcmVsOworfQorCitzdGF0aWMgaW50CitwdXNoYnVmX3JlZm4oc3RydWN0IG5vdXZlYXVfcHVzaGJ1ZiAqcHVzaCwgYm9vbCByZXRyeSwKKwkgICAgIHN0cnVjdCBub3V2ZWF1X3B1c2hidWZfcmVmbiAqcmVmcywgaW50IG5yKQoreworCXN0cnVjdCBub3V2ZWF1X3B1c2hidWZfcHJpdiAqbnZwYiA9IG5vdXZlYXVfcHVzaGJ1ZihwdXNoKTsKKwlzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmX2tyZWMgKmtyZWMgPSBudnBiLT5rcmVjOworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9ibyAqa3JlZjsKKwlpbnQgc3JlZiA9IGtyZWMtPm5yX2J1ZmZlcjsKKwlpbnQgcmV0ID0gMCwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7CisJCWtyZWYgPSBwdXNoYnVmX2tyZWYocHVzaCwgcmVmc1tpXS5ibywgcmVmc1tpXS5mbGFncyk7CisJCWlmICgha3JlZikgeworCQkJcmV0ID0gLUVOT1NQQzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHJldCkgeworCQlwdXNoYnVmX3JlZm5fZmFpbChwdXNoLCBzcmVmLCBrcmVjLT5ucl9yZWxvYyk7CisJCWlmIChyZXRyeSkgeworCQkJcHVzaGJ1Zl9mbHVzaChwdXNoKTsKKwkJCW5vdXZlYXVfcHVzaGJ1Zl9zcGFjZShwdXNoLCAwLCAwLCAwKTsKKwkJCXJldHVybiBwdXNoYnVmX3JlZm4ocHVzaCwgZmFsc2UsIHJlZnMsIG5yKTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3B1c2hidWZfdmFsaWRhdGUoc3RydWN0IG5vdXZlYXVfcHVzaGJ1ZiAqcHVzaCwgYm9vbCByZXRyeSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmX3ByaXYgKm52cGIgPSBub3V2ZWF1X3B1c2hidWYocHVzaCk7CisJc3RydWN0IG5vdXZlYXVfcHVzaGJ1Zl9rcmVjICprcmVjID0gbnZwYi0+a3JlYzsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfYm8gKmtyZWY7CisJc3RydWN0IG5vdXZlYXVfYnVmY3R4ICpiY3R4ID0gcHVzaC0+YnVmY3R4OworCXN0cnVjdCBub3V2ZWF1X2J1ZnJlZiAqYnJlZjsKKwlpbnQgcmVsb2NzID0gYmN0eCA/IGJjdHgtPnJlbG9jcyAqIDI6IDA7CisJaW50IHNyZWYsIHNyZWwsIHJldDsKKworCXJldCA9IG5vdXZlYXVfcHVzaGJ1Zl9zcGFjZShwdXNoLCByZWxvY3MsIHJlbG9jcywgMCk7CisJaWYgKHJldCB8fCBiY3R4ID09IE5VTEwpCisJCXJldHVybiByZXQ7CisKKwlzcmVmID0ga3JlYy0+bnJfYnVmZmVyOworCXNyZWwgPSBrcmVjLT5ucl9yZWxvYzsKKworCURSTUxJU1RERUwoJmJjdHgtPmhlYWQpOworCURSTUxJU1RBREQoJmJjdHgtPmhlYWQsICZudnBiLT5iY3R4X2xpc3QpOworCisJRFJNTElTVEZPUkVBQ0hFTlRSWShicmVmLCAmYmN0eC0+cGVuZGluZywgdGhlYWQpIHsKKwkJa3JlZiA9IHB1c2hidWZfa3JlZihwdXNoLCBicmVmLT5ibywgYnJlZi0+ZmxhZ3MpOworCQlpZiAoIWtyZWYpIHsKKwkJCXJldCA9IC1FTk9TUEM7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChicmVmLT5wYWNrZXQpIHsKKwkJCXB1c2hidWZfa3JlbChwdXNoLCBicmVmLT5ibywgYnJlZi0+cGFja2V0LCAwLCAwLCAwKTsKKwkJCSpwdXNoLT5jdXIrKyA9IDA7CisJCQlwdXNoYnVmX2tyZWwocHVzaCwgYnJlZi0+Ym8sIGJyZWYtPmRhdGEsIGJyZWYtPmZsYWdzLAorCQkJCQkgICBicmVmLT52b3IsIGJyZWYtPnRvcik7CisJCQkqcHVzaC0+Y3VyKysgPSAwOworCQl9CisJfQorCisJRFJNTElTVEpPSU4oJmJjdHgtPnBlbmRpbmcsICZiY3R4LT5jdXJyZW50KTsKKwlEUk1JTklUTElTVEhFQUQoJmJjdHgtPnBlbmRpbmcpOworCisJaWYgKHJldCkgeworCQlwdXNoYnVmX3JlZm5fZmFpbChwdXNoLCBzcmVmLCBzcmVsKTsKKwkJaWYgKHJldHJ5KSB7CisJCQlwdXNoYnVmX2ZsdXNoKHB1c2gpOworCQkJcmV0dXJuIHB1c2hidWZfdmFsaWRhdGUocHVzaCwgZmFsc2UpOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworaW50Citub3V2ZWF1X3B1c2hidWZfbmV3KHN0cnVjdCBub3V2ZWF1X2NsaWVudCAqY2xpZW50LCBzdHJ1Y3Qgbm91dmVhdV9vYmplY3QgKmNoYW4sCisJCSAgICBpbnQgbnIsIHVpbnQzMl90IHNpemUsIGJvb2wgaW1tZWRpYXRlLAorCQkgICAgc3RydWN0IG5vdXZlYXVfcHVzaGJ1ZiAqKnBwdXNoKQoreworCXN0cnVjdCBub3V2ZWF1X2RybSAqZHJtID0gbm91dmVhdV9kcm0oJmNsaWVudC0+ZGV2aWNlLT5vYmplY3QpOworCXN0cnVjdCBub3V2ZWF1X2ZpZm8gKmZpZm8gPSBjaGFuLT5kYXRhOworCXN0cnVjdCBub3V2ZWF1X3B1c2hidWZfcHJpdiAqbnZwYjsKKwlzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmICpwdXNoOworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1ZiByZXEgPSB7fTsKKwlpbnQgcmV0OworCisJaWYgKGNoYW4tPm9jbGFzcyAhPSBOT1VWRUFVX0ZJRk9fQ0hBTk5FTF9DTEFTUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBub3AgcHVzaGJ1ZiBjYWxsLCB0byBnZXQgdGhlIGN1cnJlbnQgInJldHVybiB0byBtYWluIiBzZXF1ZW5jZQorCSAqIHdlIG5lZWQgdG8gYXBwZW5kIHRvIHRoZSBwdXNoYnVmIG9uIGVhcmx5IGNoaXBzZXRzCisJICovCisJcmVxLmNoYW5uZWwgPSBmaWZvLT5jaGFubmVsOworCXJlcS5ucl9wdXNoID0gMDsKKwlyZXQgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGRybS0+ZmQsIERSTV9OT1VWRUFVX0dFTV9QVVNIQlVGLAorCQkJCSAgJnJlcSwgc2l6ZW9mKHJlcSkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwludnBiID0gY2FsbG9jKDEsIHNpemVvZigqbnZwYikgKyBuciAqIHNpemVvZigqbnZwYi0+Ym9zKSk7CisJaWYgKCFudnBiKQorCQlyZXR1cm4gLUVOT01FTTsKKworI2lmbmRlZiBTSU1VTEFURQorCW52cGItPnN1ZmZpeDAgPSByZXEuc3VmZml4MDsKKwludnBiLT5zdWZmaXgxID0gcmVxLnN1ZmZpeDE7CisjZWxzZQorCW52cGItPnN1ZmZpeDAgPSAweGZmZmZmZmZmOworCW52cGItPnN1ZmZpeDEgPSAweGZmZmZmZmZmOworI2VuZGlmCisJbnZwYi0+a3JlYyA9IGNhbGxvYygxLCBzaXplb2YoKm52cGItPmtyZWMpKTsKKwludnBiLT5saXN0ID0gbnZwYi0+a3JlYzsKKwlpZiAoIW52cGItPmtyZWMpIHsKKwkJZnJlZShudnBiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcHVzaCA9ICZudnBiLT5iYXNlOworCXB1c2gtPmNsaWVudCA9IGNsaWVudDsKKwlwdXNoLT5jaGFubmVsID0gaW1tZWRpYXRlID8gY2hhbiA6IE5VTEw7CisJcHVzaC0+ZmxhZ3MgPSBOT1VWRUFVX0JPX1JEOworCWlmIChmaWZvLT5wdXNoYnVmICYgTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQpIHsKKwkJcHVzaC0+ZmxhZ3MgfD0gTk9VVkVBVV9CT19HQVJUOworCQludnBiLT50eXBlICAgPSBOT1VWRUFVX0JPX0dBUlQ7CisJfSBlbHNlCisJaWYgKGZpZm8tPnB1c2hidWYgJiBOT1VWRUFVX0dFTV9ET01BSU5fVlJBTSkgeworCQlwdXNoLT5mbGFncyB8PSBOT1VWRUFVX0JPX1ZSQU07CisJCW52cGItPnR5cGUgICA9IE5PVVZFQVVfQk9fVlJBTTsKKwl9CisJbnZwYi0+dHlwZSB8PSBOT1VWRUFVX0JPX01BUDsKKworCWZvciAobnZwYi0+Ym9fbnIgPSAwOyBudnBiLT5ib19uciA8IG5yOyBudnBiLT5ib19ucisrKSB7CisJCXJldCA9IG5vdXZlYXVfYm9fbmV3KGNsaWVudC0+ZGV2aWNlLCBudnBiLT50eXBlLCAwLCBzaXplLAorCQkJCSAgICAgTlVMTCwgJm52cGItPmJvc1tudnBiLT5ib19ucl0pOworCQlpZiAocmV0KSB7CisJCQlub3V2ZWF1X3B1c2hidWZfZGVsKCZwdXNoKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlEUk1JTklUTElTVEhFQUQoJm52cGItPmJjdHhfbGlzdCk7CisJKnBwdXNoID0gcHVzaDsKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbm91dmVhdV9wdXNoYnVmX2RlbChzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmICoqcHB1c2gpCit7CisJc3RydWN0IG5vdXZlYXVfcHVzaGJ1Zl9wcml2ICpudnBiID0gbm91dmVhdV9wdXNoYnVmKCpwcHVzaCk7CisJaWYgKG52cGIpIHsKKwkJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvICprcmVmOworCQlzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmX2tyZWMgKmtyZWM7CisJCXdoaWxlICgoa3JlYyA9IG52cGItPmxpc3QpKSB7CisJCQlrcmVmID0ga3JlYy0+YnVmZmVyOworCQkJd2hpbGUgKGtyZWMtPm5yX2J1ZmZlci0tKSB7CisJCQkJdW5zaWduZWQgbG9uZyBwcml2ID0ga3JlZisrLT51c2VyX3ByaXY7CisJCQkJc3RydWN0IG5vdXZlYXVfYm8gKmJvID0gKHZvaWQgKilwcml2OworCQkJCWNsaV9rcmVmX3NldChudnBiLT5iYXNlLmNsaWVudCwgYm8sIE5VTEwsIE5VTEwpOworCQkJCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZibyk7CisJCQl9CisJCQludnBiLT5saXN0ID0ga3JlYy0+bmV4dDsKKwkJCWZyZWUoa3JlYyk7CisJCX0KKwkJd2hpbGUgKG52cGItPmJvX25yLS0pCisJCQlub3V2ZWF1X2JvX3JlZihOVUxMLCAmbnZwYi0+Ym9zW252cGItPmJvX25yXSk7CisJCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZudnBiLT5ibyk7CisJCWZyZWUobnZwYik7CisJfQorCSpwcHVzaCA9IE5VTEw7Cit9CisKK3N0cnVjdCBub3V2ZWF1X2J1ZmN0eCAqCitub3V2ZWF1X3B1c2hidWZfYnVmY3R4KHN0cnVjdCBub3V2ZWF1X3B1c2hidWYgKnB1c2gsIHN0cnVjdCBub3V2ZWF1X2J1ZmN0eCAqY3R4KQoreworCXN0cnVjdCBub3V2ZWF1X2J1ZmN0eCAqcHJldiA9IHB1c2gtPmJ1ZmN0eDsKKwlwdXNoLT5idWZjdHggPSBjdHg7CisJcmV0dXJuIHByZXY7Cit9CisKK2ludAorbm91dmVhdV9wdXNoYnVmX3NwYWNlKHN0cnVjdCBub3V2ZWF1X3B1c2hidWYgKnB1c2gsCisJCSAgICAgIHVpbnQzMl90IGR3b3JkcywgdWludDMyX3QgcmVsb2NzLCB1aW50MzJfdCBwdXNoZXMpCit7CisJc3RydWN0IG5vdXZlYXVfcHVzaGJ1Zl9wcml2ICpudnBiID0gbm91dmVhdV9wdXNoYnVmKHB1c2gpOworCXN0cnVjdCBub3V2ZWF1X3B1c2hidWZfa3JlYyAqa3JlYyA9IG52cGItPmtyZWM7CisJc3RydWN0IG5vdXZlYXVfY2xpZW50ICpjbGllbnQgPSBwdXNoLT5jbGllbnQ7CisJc3RydWN0IG5vdXZlYXVfYm8gKmJvID0gTlVMTDsKKwlib29sIGZsdXNoZWQgPSBmYWxzZTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIHN3aXRjaCB0byBuZXh0IGJ1ZmZlciBpZiBpbnN1ZmZpY2llbnQgc3BhY2UgaW4gdGhlIGN1cnJlbnQgb25lICovCisJaWYgKHB1c2gtPmN1ciArIGR3b3JkcyA+PSBwdXNoLT5lbmQpIHsKKwkJaWYgKG52cGItPmJvX25leHQgPCBudnBiLT5ib19ucikgeworCQkJbm91dmVhdV9ib19yZWYobnZwYi0+Ym9zW252cGItPmJvX25leHQrK10sICZibyk7CisJCQlpZiAobnZwYi0+Ym9fbmV4dCA9PSBudnBiLT5ib19uciAmJiBwdXNoLT5jaGFubmVsKQorCQkJCW52cGItPmJvX25leHQgPSAwOworCQl9IGVsc2UgeworCQkJcmV0ID0gbm91dmVhdV9ib19uZXcoY2xpZW50LT5kZXZpY2UsIG52cGItPnR5cGUsIDAsCisJCQkJCSAgICAgbnZwYi0+Ym9zWzBdLT5zaXplLCBOVUxMLCAmYm8pOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJLyogbWFrZSBzdXJlIHRoZXJlJ3MgYWx3YXlzIGVub3VnaCBzcGFjZSB0byBxdWV1ZSB1cCB0aGUgcGVuZGluZworCSAqIGRhdGEgaW4gdGhlIHB1c2hidWYgcHJvcGVyCisJICovCisJcHVzaGVzKys7CisKKwkvKiBuZWVkIHRvIGZsdXNoIGlmIHdlJ3ZlIHJ1biBvdXQgb2Ygc3BhY2Ugb24gYW4gaW1tZWRpYXRlIHB1c2hidWYsCisJICogaWYgdGhlIG5ldyBidWZmZXIgd29uJ3QgZml0LCBvciBpZiB0aGUga2VybmVsIHB1c2gvcmVsb2MgbGltaXRzCisJICogaGF2ZSBiZWVuIGhpdAorCSAqLworCWlmICgoYm8gJiYgKCBwdXNoLT5jaGFubmVsIHx8CisJCSAgICAhcHVzaGJ1Zl9rcmVmKHB1c2gsIGJvLCBwdXNoLT5mbGFncykpKSB8fAorCSAgICBrcmVjLT5ucl9yZWxvYyArIHJlbG9jcyA+PSBOT1VWRUFVX0dFTV9NQVhfUkVMT0NTIHx8CisJICAgIGtyZWMtPm5yX3B1c2ggKyBwdXNoZXMgPj0gTk9VVkVBVV9HRU1fTUFYX1BVU0gpIHsKKwkJaWYgKG52cGItPmJvICYmIGtyZWMtPm5yX2J1ZmZlcikKKwkJCXB1c2hidWZfZmx1c2gocHVzaCk7CisJCWZsdXNoZWQgPSB0cnVlOworCX0KKworCS8qIGlmIG5lY2Vzc2FyeSwgc3dpdGNoIHRvIG5ldyBidWZmZXIgKi8KKwlpZiAoYm8pIHsKKwkJcmV0ID0gbm91dmVhdV9ib19tYXAoYm8sIE5PVVZFQVVfQk9fV1IsIHB1c2gtPmNsaWVudCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCW5vdXZlYXVfcHVzaGJ1Zl9kYXRhKHB1c2gsIE5VTEwsIDAsIDApOworCQlub3V2ZWF1X2JvX3JlZihibywgJm52cGItPmJvKTsKKwkJbm91dmVhdV9ib19yZWYoTlVMTCwgJmJvKTsKKworCQludnBiLT5iZ24gPSBudnBiLT5iby0+bWFwOworCQludnBiLT5wdHIgPSBudnBiLT5iZ247CisJCXB1c2gtPmN1ciA9IG52cGItPmJnbjsKKwkJcHVzaC0+ZW5kID0gcHVzaC0+Y3VyICsgKG52cGItPmJvLT5zaXplIC8gNCk7CisJCXB1c2gtPmVuZCAtPSAyICsgcHVzaC0+cnN2ZF9raWNrOyAvKiBzcGFjZSBmb3Igc3VmZml4ICovCisJfQorCisJcHVzaGJ1Zl9rcmVmKHB1c2gsIG52cGItPmJvLCBwdXNoLT5mbGFncyk7CisJcmV0dXJuIGZsdXNoZWQgPyBwdXNoYnVmX3ZhbGlkYXRlKHB1c2gsIGZhbHNlKSA6IDA7Cit9CisKK3ZvaWQKK25vdXZlYXVfcHVzaGJ1Zl9kYXRhKHN0cnVjdCBub3V2ZWF1X3B1c2hidWYgKnB1c2gsIHN0cnVjdCBub3V2ZWF1X2JvICpibywKKwkJICAgICB1aW50NjRfdCBvZmZzZXQsIHVpbnQ2NF90IGxlbmd0aCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmX3ByaXYgKm52cGIgPSBub3V2ZWF1X3B1c2hidWYocHVzaCk7CisJc3RydWN0IG5vdXZlYXVfcHVzaGJ1Zl9rcmVjICprcmVjID0gbnZwYi0+a3JlYzsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfcHVzaCAqa3BzaDsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfYm8gKmtyZWY7CisKKwlpZiAoYm8gIT0gbnZwYi0+Ym8gJiYgbnZwYi0+YmduICE9IHB1c2gtPmN1cikgeworCQlpZiAobnZwYi0+c3VmZml4MCB8fCBudnBiLT5zdWZmaXgxKSB7CisJCQkqcHVzaC0+Y3VyKysgPSBudnBiLT5zdWZmaXgwOworCQkJKnB1c2gtPmN1cisrID0gbnZwYi0+c3VmZml4MTsKKwkJfQorCisJCW5vdXZlYXVfcHVzaGJ1Zl9kYXRhKHB1c2gsIG52cGItPmJvLAorCQkJCSAgICAgKG52cGItPmJnbiAtIG52cGItPnB0cikgKiA0LAorCQkJCSAgICAgKHB1c2gtPmN1ciAtIG52cGItPmJnbikgKiA0KTsKKwkJbnZwYi0+YmduID0gcHVzaC0+Y3VyOworCX0KKworCWlmIChibykgeworCQlrcmVmID0gY2xpX2tyZWZfZ2V0KHB1c2gtPmNsaWVudCwgYm8pOworCQlhc3NlcnQoa3JlZik7CisJCWtwc2ggPSAma3JlYy0+cHVzaFtrcmVjLT5ucl9wdXNoKytdOworCQlrcHNoLT5ib19pbmRleCA9IGtyZWYgLSBrcmVjLT5idWZmZXI7CisJCWtwc2gtPm9mZnNldCAgID0gb2Zmc2V0OworCQlrcHNoLT5sZW5ndGggICA9IGxlbmd0aDsKKwl9Cit9CisKK2ludAorbm91dmVhdV9wdXNoYnVmX3JlZm4oc3RydWN0IG5vdXZlYXVfcHVzaGJ1ZiAqcHVzaCwKKwkJICAgICBzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmX3JlZm4gKnJlZnMsIGludCBucikKK3sKKwlyZXR1cm4gcHVzaGJ1Zl9yZWZuKHB1c2gsIHRydWUsIHJlZnMsIG5yKTsKK30KKwordm9pZAorbm91dmVhdV9wdXNoYnVmX3JlbG9jKHN0cnVjdCBub3V2ZWF1X3B1c2hidWYgKnB1c2gsIHN0cnVjdCBub3V2ZWF1X2JvICpibywKKwkJICAgICAgdWludDMyX3QgZGF0YSwgdWludDMyX3QgZmxhZ3MsIHVpbnQzMl90IHZvciwgdWludDMyX3QgdG9yKQoreworCSpwdXNoLT5jdXIgPSBwdXNoYnVmX2tyZWwocHVzaCwgYm8sIGRhdGEsIGZsYWdzLCB2b3IsIHRvcik7CisJcHVzaC0+Y3VyKys7Cit9CisKK2ludAorbm91dmVhdV9wdXNoYnVmX3ZhbGlkYXRlKHN0cnVjdCBub3V2ZWF1X3B1c2hidWYgKnB1c2gpCit7CisJcmV0dXJuIHB1c2hidWZfdmFsaWRhdGUocHVzaCwgdHJ1ZSk7Cit9CisKK3VpbnQzMl90Citub3V2ZWF1X3B1c2hidWZfcmVmZChzdHJ1Y3Qgbm91dmVhdV9wdXNoYnVmICpwdXNoLCBzdHJ1Y3Qgbm91dmVhdV9ibyAqYm8pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvICprcmVmOworCXVpbnQzMl90IGZsYWdzID0gMDsKKworCWlmIChjbGlfcHVzaF9nZXQocHVzaC0+Y2xpZW50LCBibykgPT0gcHVzaCkgeworCQlrcmVmID0gY2xpX2tyZWZfZ2V0KHB1c2gtPmNsaWVudCwgYm8pOworCQlhc3NlcnQoa3JlZik7CisJCWlmIChrcmVmLT5yZWFkX2RvbWFpbnMpCisJCQlmbGFncyB8PSBOT1VWRUFVX0JPX1JEOworCQlpZiAoa3JlZi0+d3JpdGVfZG9tYWlucykKKwkJCWZsYWdzIHw9IE5PVVZFQVVfQk9fV1I7CisJfQorCisJcmV0dXJuIGZsYWdzOworfQorCitpbnQKK25vdXZlYXVfcHVzaGJ1Zl9raWNrKHN0cnVjdCBub3V2ZWF1X3B1c2hidWYgKnB1c2gsIHN0cnVjdCBub3V2ZWF1X29iamVjdCAqY2hhbikKK3sKKwlpZiAoIXB1c2gtPmNoYW5uZWwpCisJCXJldHVybiBwdXNoYnVmX3N1Ym1pdChwdXNoLCBjaGFuKTsKKwlwdXNoYnVmX2ZsdXNoKHB1c2gpOworCXJldHVybiBwdXNoYnVmX3ZhbGlkYXRlKHB1c2gsIGZhbHNlKTsKK30KZGlmZiAtLWdpdCBhL29tYXAvTWFrZWZpbGUuYW0gYi9vbWFwL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OWJiOWQKLS0tIC9kZXYvbnVsbAorKysgYi9vbWFwL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjQgQEAKK0FNX0NGTEFHUyA9IFwKKwkkKFdBUk5fQ0ZMQUdTKSBcCisJLUkkKHRvcF9zcmNkaXIpIFwKKwkkKFBUSFJFQURTVFVCU19DRkxBR1MpIFwKKwktSSQodG9wX3NyY2RpcikvaW5jbHVkZS9kcm0KKworbGliZHJtX29tYXBfbGFfTFRMSUJSQVJJRVMgPSBsaWJkcm1fb21hcC5sYQorbGliZHJtX29tYXBfbGFkaXIgPSAkKGxpYmRpcikKK2xpYmRybV9vbWFwX2xhX0xERkxBR1MgPSAtdmVyc2lvbi1udW1iZXIgMTowOjAgLW5vLXVuZGVmaW5lZAorbGliZHJtX29tYXBfbGFfTElCQUREID0gLi4vbGliZHJtLmxhIEBQVEhSRUFEU1RVQlNfTElCU0AKKworbGliZHJtX29tYXBfbGFfU09VUkNFUyA9IG9tYXBfZHJtLmMKKworbGliZHJtX29tYXBjb21tb25pbmNsdWRlZGlyID0gJHtpbmNsdWRlZGlyfS9vbWFwCitsaWJkcm1fb21hcGNvbW1vbmluY2x1ZGVfSEVBREVSUyA9IG9tYXBfZHJtLmgKKworbGliZHJtX29tYXBpbmNsdWRlZGlyID0gJHtpbmNsdWRlZGlyfS9saWJkcm0KK2xpYmRybV9vbWFwaW5jbHVkZV9IRUFERVJTID0gb21hcF9kcm1pZi5oCisKK3BrZ2NvbmZpZ2RpciA9IEBwa2djb25maWdkaXJACitwa2djb25maWdfREFUQSA9IGxpYmRybV9vbWFwLnBjCisKK1RFU1RTID0gb21hcC1zeW1ib2wtY2hlY2sKK0VYVFJBX0RJU1QgPSAkKFRFU1RTKQpkaWZmIC0tZ2l0IGEvb21hcC9saWJkcm1fb21hcC5wYy5pbiBiL29tYXAvbGliZHJtX29tYXAucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0NTMzYgotLS0gL2Rldi9udWxsCisrKyBiL29tYXAvbGliZHJtX29tYXAucGMuaW4KQEAgLTAsMCArMSwxMSBAQAorcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJACisKK05hbWU6IGxpYmRybV9vbWFwCitEZXNjcmlwdGlvbjogVXNlcnNwYWNlIGludGVyZmFjZSB0byBvbWFwIGtlcm5lbCBEUk0gc2VydmljZXMKK1ZlcnNpb246IDAuNgorTGliczogLUwke2xpYmRpcn0gLWxkcm1fb21hcAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0gLUkke2luY2x1ZGVkaXJ9L2xpYmRybSAtSSR7aW5jbHVkZWRpcn0vb21hcAorUmVxdWlyZXMucHJpdmF0ZTogbGliZHJtCmRpZmYgLS1naXQgYS9vbWFwL29tYXAtc3ltYm9sLWNoZWNrIGIvb21hcC9vbWFwLXN5bWJvbC1jaGVjawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NTljODRiCi0tLSAvZGV2L251bGwKKysrIGIvb21hcC9vbWFwLXN5bWJvbC1jaGVjawpAQCAtMCwwICsxLDM1IEBACisjIS9iaW4vYmFzaAorCisjIFRoZSBmb2xsb3dpbmcgc3ltYm9scyAocGFzdCB0aGUgZmlyc3QgZml2ZSkgYXJlIHRha2VuIGZyb20gdGhlIHB1YmxpYyBoZWFkZXJzLgorIyBBIGxpc3Qgb2YgdGhlIGxhdHRlciBzaG91bGQgYmUgYXZhaWxhYmxlIE1ha2VmaWxlLmFtL2xpYmRybV9vbWFwKkhFQURFUlMKKworRlVOQ1M9JChubSAtRCAtLWZvcm1hdD1ic2QgLS1kZWZpbmVkLW9ubHkgJHsxLS5saWJzL2xpYmRybV9vbWFwLnNvfSB8IGF3ayAne3ByaW50ICQzfSd8IHdoaWxlIHJlYWQgZnVuYzsgZG8KKyggZ3JlcCAtcSAiXiRmdW5jJCIgfHwgZWNobyAkZnVuYyApICA8PEVPRgorX19ic3Nfc3RhcnQKK19lZGF0YQorX2VuZAorX2ZpbmkKK19pbml0CitvbWFwX2JvX2NwdV9maW5pCitvbWFwX2JvX2NwdV9wcmVwCitvbWFwX2JvX2RlbAorb21hcF9ib19kbWFidWYKK29tYXBfYm9fZnJvbV9kbWFidWYKK29tYXBfYm9fZnJvbV9uYW1lCitvbWFwX2JvX2dldF9uYW1lCitvbWFwX2JvX2hhbmRsZQorb21hcF9ib19tYXAKK29tYXBfYm9fbmV3CitvbWFwX2JvX25ld190aWxlZAorb21hcF9ib19yZWYKK29tYXBfYm9fc2l6ZQorb21hcF9kZXZpY2VfZGVsCitvbWFwX2RldmljZV9uZXcKK29tYXBfZGV2aWNlX3JlZgorb21hcF9nZXRfcGFyYW0KK29tYXBfc2V0X3BhcmFtCitFT0YKK2RvbmUpCisKK3Rlc3QgISAtbiAiJEZVTkNTIiB8fCBlY2hvICRGVU5DUwordGVzdCAhIC1uICIkRlVOQ1MiCmRpZmYgLS1naXQgYS9vbWFwL29tYXBfZHJtLmMgYi9vbWFwL29tYXBfZHJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhiYTY0ZQotLS0gL2Rldi9udWxsCisrKyBiL29tYXAvb21hcF9kcm0uYwpAQCAtMCwwICsxLDQ3OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImsmciI7IHRhYi13aWR0aCA0OyBpbmRlbnQtdGFicy1tb2RlOiB0OyAtKi0gKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUZXhhcyBJbnN0cnVtZW50cywgSW5jCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBSb2IgQ2xhcmsgPHJvYkB0aS5jb20+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlIDxsaWJkcm1fbWFjcm9zLmg+CisjaW5jbHVkZSA8eGY4NmRybS5oPgorI2luY2x1ZGUgPHhmODZhdG9taWMuaD4KKworI2luY2x1ZGUgIm9tYXBfZHJtLmgiCisjaW5jbHVkZSAib21hcF9kcm1pZi5oIgorCisjZGVmaW5lIF9fcm91bmRfbWFzayh4LCB5KSAoKF9fdHlwZW9mX18oeCkpKCh5KS0xKSkKKyNkZWZpbmUgcm91bmRfdXAoeCwgeSkgKCgoKHgpLTEpIHwgX19yb3VuZF9tYXNrKHgsIHkpKSsxKQorI2RlZmluZSBQQUdFX1NJWkUgNDA5NgorCitzdGF0aWMgcHRocmVhZF9tdXRleF90IHRhYmxlX2xvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworc3RhdGljIHZvaWQgKiBkZXZfdGFibGU7CisKK3N0cnVjdCBvbWFwX2RldmljZSB7CisJaW50IGZkOworCWF0b21pY190IHJlZmNudDsKKworCS8qIFRoZSBoYW5kbGVfdGFibGUgaXMgdXNlZCB0byB0cmFjayBHRU0gYm8gaGFuZGxlcyBhc3NvY2lhdGVkIHcvCisJICogdGhpcyBmZC4gIFRoaXMgaXMgbmVlZGVkLCBpbiBwYXJ0aWN1bGFyLCB3aGVuIGltcG9ydGluZworCSAqIGRtYWJ1ZidzIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCBtdWx0aXBsZSAnc3RydWN0IG9tYXBfYm8ncworCSAqIGZsb2F0aW5nIGFyb3VuZCB3aXRoIHRoZSBzYW1lIGhhbmRsZS4gIE90aGVyd2lzZSwgd2hlbiB0aGUKKwkgKiBmaXJzdCBvbmUgaXMgb21hcF9ib19kZWwoKSdkIHRoZSBoYW5kbGUgYmVjb21lcyBubyBsb25nZXIKKwkgKiB2YWxpZCwgYW5kIHRoZSByZW1haW5pbmcgJ3N0cnVjdCBvbWFwX2JvJ3MgYXJlIGxlZnQgcG9pbnRpbmcKKwkgKiB0byBhbiBpbnZhbGlkIGhhbmRsZSAoYW5kIHBvc3NpYmxlIGEgR0VNIGJvIHRoYXQgaXMgYWxyZWFkeQorCSAqIGZyZWUnZCkuCisJICovCisJdm9pZCAqaGFuZGxlX3RhYmxlOworfTsKKworLyogYSBHRU0gYnVmZmVyIG9iamVjdCBhbGxvY2F0ZWQgZnJvbSB0aGUgRFJNIGRldmljZSAqLworc3RydWN0IG9tYXBfYm8geworCXN0cnVjdCBvbWFwX2RldmljZQkqZGV2OworCXZvaWQJCSptYXA7CQkvKiB1c2Vyc3BhY2UgbW1hcCdpbmcgKGlmIHRoZXJlIGlzIG9uZSkgKi8KKwl1aW50MzJfdAlzaXplOworCXVpbnQzMl90CWhhbmRsZTsKKwl1aW50MzJfdAluYW1lOwkJLyogZmxpbmsgZ2xvYmFsIGhhbmRsZSAoRFJJMiBuYW1lKSAqLworCXVpbnQ2NF90CW9mZnNldDsJCS8qIG9mZnNldCB0byBtbWFwKCkgKi8KKwlpbnQJCWZkOwkJLyogZG1hYnVmIGhhbmRsZSAqLworCWF0b21pY190CXJlZmNudDsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kZXZpY2UgKiBvbWFwX2RldmljZV9uZXdfaW1wbChpbnQgZmQpCit7CisJc3RydWN0IG9tYXBfZGV2aWNlICpkZXYgPSBjYWxsb2Moc2l6ZW9mKCpkZXYpLCAxKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIE5VTEw7CisJZGV2LT5mZCA9IGZkOworCWF0b21pY19zZXQoJmRldi0+cmVmY250LCAxKTsKKwlkZXYtPmhhbmRsZV90YWJsZSA9IGRybUhhc2hDcmVhdGUoKTsKKwlyZXR1cm4gZGV2OworfQorCitzdHJ1Y3Qgb21hcF9kZXZpY2UgKiBvbWFwX2RldmljZV9uZXcoaW50IGZkKQoreworCXN0cnVjdCBvbWFwX2RldmljZSAqZGV2ID0gTlVMTDsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmdGFibGVfbG9jayk7CisKKwlpZiAoIWRldl90YWJsZSkKKwkJZGV2X3RhYmxlID0gZHJtSGFzaENyZWF0ZSgpOworCisJaWYgKGRybUhhc2hMb29rdXAoZGV2X3RhYmxlLCBmZCwgKHZvaWQgKiopJmRldikpIHsKKwkJLyogbm90IGZvdW5kLCBjcmVhdGUgbmV3IGRldmljZSAqLworCQlkZXYgPSBvbWFwX2RldmljZV9uZXdfaW1wbChmZCk7CisJCWRybUhhc2hJbnNlcnQoZGV2X3RhYmxlLCBmZCwgZGV2KTsKKwl9IGVsc2UgeworCQkvKiBmb3VuZCwganVzdCBpbmNyIHJlZmNudCAqLworCQlkZXYgPSBvbWFwX2RldmljZV9yZWYoZGV2KTsKKwl9CisKKwlwdGhyZWFkX211dGV4X3VubG9jaygmdGFibGVfbG9jayk7CisKKwlyZXR1cm4gZGV2OworfQorCitzdHJ1Y3Qgb21hcF9kZXZpY2UgKiBvbWFwX2RldmljZV9yZWYoc3RydWN0IG9tYXBfZGV2aWNlICpkZXYpCit7CisJYXRvbWljX2luYygmZGV2LT5yZWZjbnQpOworCXJldHVybiBkZXY7Cit9CisKK3ZvaWQgb21hcF9kZXZpY2VfZGVsKHN0cnVjdCBvbWFwX2RldmljZSAqZGV2KQoreworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmZGV2LT5yZWZjbnQpKQorCQlyZXR1cm47CisJcHRocmVhZF9tdXRleF9sb2NrKCZ0YWJsZV9sb2NrKTsKKwlkcm1IYXNoRGVzdHJveShkZXYtPmhhbmRsZV90YWJsZSk7CisJZHJtSGFzaERlbGV0ZShkZXZfdGFibGUsIGRldi0+ZmQpOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0YWJsZV9sb2NrKTsKKwlmcmVlKGRldik7Cit9CisKK2ludAorb21hcF9nZXRfcGFyYW0oc3RydWN0IG9tYXBfZGV2aWNlICpkZXYsIHVpbnQ2NF90IHBhcmFtLCB1aW50NjRfdCAqdmFsdWUpCit7CisJc3RydWN0IGRybV9vbWFwX3BhcmFtIHJlcSA9IHsKKwkJCS5wYXJhbSA9IHBhcmFtLAorCX07CisJaW50IHJldDsKKworCXJldCA9IGRybUNvbW1hbmRXcml0ZVJlYWQoZGV2LT5mZCwgRFJNX09NQVBfR0VUX1BBUkFNLCAmcmVxLCBzaXplb2YocmVxKSk7CisJaWYgKHJldCkgeworCQlyZXR1cm4gcmV0OworCX0KKworCSp2YWx1ZSA9IHJlcS52YWx1ZTsKKworCXJldHVybiAwOworfQorCitpbnQKK29tYXBfc2V0X3BhcmFtKHN0cnVjdCBvbWFwX2RldmljZSAqZGV2LCB1aW50NjRfdCBwYXJhbSwgdWludDY0X3QgdmFsdWUpCit7CisJc3RydWN0IGRybV9vbWFwX3BhcmFtIHJlcSA9IHsKKwkJCS5wYXJhbSA9IHBhcmFtLAorCQkJLnZhbHVlID0gdmFsdWUsCisJfTsKKwlyZXR1cm4gZHJtQ29tbWFuZFdyaXRlKGRldi0+ZmQsIERSTV9PTUFQX1NFVF9QQVJBTSwgJnJlcSwgc2l6ZW9mKHJlcSkpOworfQorCisvKiBsb29rdXAgYSBidWZmZXIgZnJvbSBpdCdzIGhhbmRsZSwgY2FsbCB3LyB0YWJsZV9sb2NrIGhlbGQ6ICovCitzdGF0aWMgc3RydWN0IG9tYXBfYm8gKiBsb29rdXBfYm8oc3RydWN0IG9tYXBfZGV2aWNlICpkZXYsCisJCXVpbnQzMl90IGhhbmRsZSkKK3sKKwlzdHJ1Y3Qgb21hcF9ibyAqYm8gPSBOVUxMOworCWlmICghZHJtSGFzaExvb2t1cChkZXYtPmhhbmRsZV90YWJsZSwgaGFuZGxlLCAodm9pZCAqKikmYm8pKSB7CisJCS8qIGZvdW5kLCBpbmNyIHJlZmNudCBhbmQgcmV0dXJuOiAqLworCQlibyA9IG9tYXBfYm9fcmVmKGJvKTsKKwl9CisJcmV0dXJuIGJvOworfQorCisvKiBhbGxvY2F0ZSBhIG5ldyBidWZmZXIgb2JqZWN0LCBjYWxsIHcvIHRhYmxlX2xvY2sgaGVsZCAqLworc3RhdGljIHN0cnVjdCBvbWFwX2JvICogYm9fZnJvbV9oYW5kbGUoc3RydWN0IG9tYXBfZGV2aWNlICpkZXYsCisJCXVpbnQzMl90IGhhbmRsZSkKK3sKKwlzdHJ1Y3Qgb21hcF9ibyAqYm8gPSBjYWxsb2Moc2l6ZW9mKCpibyksIDEpOworCWlmICghYm8pIHsKKwkJc3RydWN0IGRybV9nZW1fY2xvc2UgcmVxID0geworCQkJCS5oYW5kbGUgPSBoYW5kbGUsCisJCX07CisJCWRybUlvY3RsKGRldi0+ZmQsIERSTV9JT0NUTF9HRU1fQ0xPU0UsICZyZXEpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYm8tPmRldiA9IG9tYXBfZGV2aWNlX3JlZihkZXYpOworCWJvLT5oYW5kbGUgPSBoYW5kbGU7CisJYm8tPmZkID0gLTE7CisJYXRvbWljX3NldCgmYm8tPnJlZmNudCwgMSk7CisJLyogYWRkIG91cnNlbHZlcyB0byB0aGUgaGFuZGxlIHRhYmxlOiAqLworCWRybUhhc2hJbnNlcnQoZGV2LT5oYW5kbGVfdGFibGUsIGhhbmRsZSwgYm8pOworCXJldHVybiBibzsKK30KKworLyogYWxsb2NhdGUgYSBuZXcgYnVmZmVyIG9iamVjdCAqLworc3RhdGljIHN0cnVjdCBvbWFwX2JvICogb21hcF9ib19uZXdfaW1wbChzdHJ1Y3Qgb21hcF9kZXZpY2UgKmRldiwKKwkJdW5pb24gb21hcF9nZW1fc2l6ZSBzaXplLCB1aW50MzJfdCBmbGFncykKK3sKKwlzdHJ1Y3Qgb21hcF9ibyAqYm8gPSBOVUxMOworCXN0cnVjdCBkcm1fb21hcF9nZW1fbmV3IHJlcSA9IHsKKwkJCS5zaXplID0gc2l6ZSwKKwkJCS5mbGFncyA9IGZsYWdzLAorCX07CisKKwlpZiAoc2l6ZS5ieXRlcyA9PSAwKSB7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoZHJtQ29tbWFuZFdyaXRlUmVhZChkZXYtPmZkLCBEUk1fT01BUF9HRU1fTkVXLCAmcmVxLCBzaXplb2YocmVxKSkpIHsKKwkJZ290byBmYWlsOworCX0KKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmdGFibGVfbG9jayk7CisJYm8gPSBib19mcm9tX2hhbmRsZShkZXYsIHJlcS5oYW5kbGUpOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0YWJsZV9sb2NrKTsKKworCWlmIChmbGFncyAmIE9NQVBfQk9fVElMRUQpIHsKKwkJYm8tPnNpemUgPSByb3VuZF91cChzaXplLnRpbGVkLndpZHRoLCBQQUdFX1NJWkUpICogc2l6ZS50aWxlZC5oZWlnaHQ7CisJfSBlbHNlIHsKKwkJYm8tPnNpemUgPSBzaXplLmJ5dGVzOworCX0KKworCXJldHVybiBibzsKKworZmFpbDoKKwlmcmVlKGJvKTsKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKiBhbGxvY2F0ZSBhIG5ldyAodW4tdGlsZWQpIGJ1ZmZlciBvYmplY3QgKi8KK3N0cnVjdCBvbWFwX2JvICoKK29tYXBfYm9fbmV3KHN0cnVjdCBvbWFwX2RldmljZSAqZGV2LCB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBmbGFncykKK3sKKwl1bmlvbiBvbWFwX2dlbV9zaXplIGdzaXplID0geworCQkJLmJ5dGVzID0gc2l6ZSwKKwl9OworCWlmIChmbGFncyAmIE9NQVBfQk9fVElMRUQpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBvbWFwX2JvX25ld19pbXBsKGRldiwgZ3NpemUsIGZsYWdzKTsKK30KKworLyogYWxsb2NhdGUgYSBuZXcgYnVmZmVyIG9iamVjdCAqLworc3RydWN0IG9tYXBfYm8gKgorb21hcF9ib19uZXdfdGlsZWQoc3RydWN0IG9tYXBfZGV2aWNlICpkZXYsIHVpbnQzMl90IHdpZHRoLAorCQkgIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZmxhZ3MpCit7CisJdW5pb24gb21hcF9nZW1fc2l6ZSBnc2l6ZSA9IHsKKwkJCS50aWxlZCA9IHsKKwkJCQkud2lkdGggPSB3aWR0aCwKKwkJCQkuaGVpZ2h0ID0gaGVpZ2h0LAorCQkJfSwKKwl9OworCWlmICghKGZsYWdzICYgT01BUF9CT19USUxFRCkpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBvbWFwX2JvX25ld19pbXBsKGRldiwgZ3NpemUsIGZsYWdzKTsKK30KKworc3RydWN0IG9tYXBfYm8gKm9tYXBfYm9fcmVmKHN0cnVjdCBvbWFwX2JvICpibykKK3sKKwlhdG9taWNfaW5jKCZiby0+cmVmY250KTsKKwlyZXR1cm4gYm87Cit9CisKKy8qIGdldCBidWZmZXIgaW5mbyAqLworc3RhdGljIGludCBnZXRfYnVmZmVyX2luZm8oc3RydWN0IG9tYXBfYm8gKmJvKQoreworCXN0cnVjdCBkcm1fb21hcF9nZW1faW5mbyByZXEgPSB7CisJCQkuaGFuZGxlID0gYm8tPmhhbmRsZSwKKwl9OworCWludCByZXQgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGJvLT5kZXYtPmZkLCBEUk1fT01BUF9HRU1fSU5GTywKKwkJCSZyZXEsIHNpemVvZihyZXEpKTsKKwlpZiAocmV0KSB7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogcmVhbGx5IGFsbCB3ZSBuZWVkIGZvciBub3cgaXMgbW1hcCBvZmZzZXQgKi8KKwliby0+b2Zmc2V0ID0gcmVxLm9mZnNldDsKKwliby0+c2l6ZSA9IHJlcS5zaXplOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGltcG9ydCBhIGJ1ZmZlciBvYmplY3QgZnJvbSBEUkkyIG5hbWUgKi8KK3N0cnVjdCBvbWFwX2JvICoKK29tYXBfYm9fZnJvbV9uYW1lKHN0cnVjdCBvbWFwX2RldmljZSAqZGV2LCB1aW50MzJfdCBuYW1lKQoreworCXN0cnVjdCBvbWFwX2JvICpibyA9IE5VTEw7CisJc3RydWN0IGRybV9nZW1fb3BlbiByZXEgPSB7CisJCQkubmFtZSA9IG5hbWUsCisJfTsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmdGFibGVfbG9jayk7CisKKwlpZiAoZHJtSW9jdGwoZGV2LT5mZCwgRFJNX0lPQ1RMX0dFTV9PUEVOLCAmcmVxKSkgeworCQlnb3RvIGZhaWw7CisJfQorCisJYm8gPSBsb29rdXBfYm8oZGV2LCByZXEuaGFuZGxlKTsKKwlpZiAoIWJvKSB7CisJCWJvID0gYm9fZnJvbV9oYW5kbGUoZGV2LCByZXEuaGFuZGxlKTsKKwkJYm8tPm5hbWUgPSBuYW1lOworCX0KKworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0YWJsZV9sb2NrKTsKKworCXJldHVybiBibzsKKworZmFpbDoKKwlwdGhyZWFkX211dGV4X3VubG9jaygmdGFibGVfbG9jayk7CisJZnJlZShibyk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIGltcG9ydCBhIGJ1ZmZlciBmcm9tIGRtYWJ1ZiBmZCwgZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlCisgKiBmZCBzbyBjYWxsZXIgc2hvdWxkIGNsb3NlKCkgdGhlIGZkIHdoZW4gaXQgaXMgb3RoZXJ3aXNlIGRvbmUKKyAqIHdpdGggaXQgKGV2ZW4gaWYgaXQgaXMgc3RpbGwgdXNpbmcgdGhlICdzdHJ1Y3Qgb21hcF9ibyAqJykKKyAqLworc3RydWN0IG9tYXBfYm8gKgorb21hcF9ib19mcm9tX2RtYWJ1ZihzdHJ1Y3Qgb21hcF9kZXZpY2UgKmRldiwgaW50IGZkKQoreworCXN0cnVjdCBvbWFwX2JvICpibyA9IE5VTEw7CisJc3RydWN0IGRybV9wcmltZV9oYW5kbGUgcmVxID0geworCQkJLmZkID0gZmQsCisJfTsKKwlpbnQgcmV0OworCisJcHRocmVhZF9tdXRleF9sb2NrKCZ0YWJsZV9sb2NrKTsKKworCXJldCA9IGRybUlvY3RsKGRldi0+ZmQsIERSTV9JT0NUTF9QUklNRV9GRF9UT19IQU5ETEUsICZyZXEpOworCWlmIChyZXQpIHsKKwkJZ290byBmYWlsOworCX0KKworCWJvID0gbG9va3VwX2JvKGRldiwgcmVxLmhhbmRsZSk7CisJaWYgKCFibykgeworCQlibyA9IGJvX2Zyb21faGFuZGxlKGRldiwgcmVxLmhhbmRsZSk7CisJfQorCisJcHRocmVhZF9tdXRleF91bmxvY2soJnRhYmxlX2xvY2spOworCisJcmV0dXJuIGJvOworCitmYWlsOgorCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0YWJsZV9sb2NrKTsKKwlmcmVlKGJvKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogZGVzdHJveSBhIGJ1ZmZlciBvYmplY3QgKi8KK3ZvaWQgb21hcF9ib19kZWwoc3RydWN0IG9tYXBfYm8gKmJvKQoreworCWlmICghYm8pIHsKKwkJcmV0dXJuOworCX0KKworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmYm8tPnJlZmNudCkpCisJCXJldHVybjsKKworCWlmIChiby0+bWFwKSB7CisJCW11bm1hcChiby0+bWFwLCBiby0+c2l6ZSk7CisJfQorCisJaWYgKGJvLT5mZCA+PSAwKSB7CisJCWNsb3NlKGJvLT5mZCk7CisJfQorCisJaWYgKGJvLT5oYW5kbGUpIHsKKwkJc3RydWN0IGRybV9nZW1fY2xvc2UgcmVxID0geworCQkJCS5oYW5kbGUgPSBiby0+aGFuZGxlLAorCQl9OworCQlwdGhyZWFkX211dGV4X2xvY2soJnRhYmxlX2xvY2spOworCQlkcm1IYXNoRGVsZXRlKGJvLT5kZXYtPmhhbmRsZV90YWJsZSwgYm8tPmhhbmRsZSk7CisJCWRybUlvY3RsKGJvLT5kZXYtPmZkLCBEUk1fSU9DVExfR0VNX0NMT1NFLCAmcmVxKTsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJnRhYmxlX2xvY2spOworCX0KKworCW9tYXBfZGV2aWNlX2RlbChiby0+ZGV2KTsKKworCWZyZWUoYm8pOworfQorCisvKiBnZXQgdGhlIGdsb2JhbCBmbGluay9EUkkyIGJ1ZmZlciBuYW1lICovCitpbnQgb21hcF9ib19nZXRfbmFtZShzdHJ1Y3Qgb21hcF9ibyAqYm8sIHVpbnQzMl90ICpuYW1lKQoreworCWlmICghYm8tPm5hbWUpIHsKKwkJc3RydWN0IGRybV9nZW1fZmxpbmsgcmVxID0geworCQkJCS5oYW5kbGUgPSBiby0+aGFuZGxlLAorCQl9OworCQlpbnQgcmV0OworCisJCXJldCA9IGRybUlvY3RsKGJvLT5kZXYtPmZkLCBEUk1fSU9DVExfR0VNX0ZMSU5LLCAmcmVxKTsKKwkJaWYgKHJldCkgeworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWJvLT5uYW1lID0gcmVxLm5hbWU7CisJfQorCisJKm5hbWUgPSBiby0+bmFtZTsKKworCXJldHVybiAwOworfQorCit1aW50MzJfdCBvbWFwX2JvX2hhbmRsZShzdHJ1Y3Qgb21hcF9ibyAqYm8pCit7CisJcmV0dXJuIGJvLT5oYW5kbGU7Cit9CisKKy8qIGNhbGxlciBvd25zIHRoZSBkbWFidWYgZmQgdGhhdCBpcyByZXR1cm5lZCBhbmQgaXMgcmVzcG9uc2libGUKKyAqIHRvIGNsb3NlKCkgaXQgd2hlbiBkb25lCisgKi8KK2ludCBvbWFwX2JvX2RtYWJ1ZihzdHJ1Y3Qgb21hcF9ibyAqYm8pCit7CisJaWYgKGJvLT5mZCA8IDApIHsKKwkJc3RydWN0IGRybV9wcmltZV9oYW5kbGUgcmVxID0geworCQkJCS5oYW5kbGUgPSBiby0+aGFuZGxlLAorCQkJCS5mbGFncyA9IERSTV9DTE9FWEVDLAorCQl9OworCQlpbnQgcmV0OworCisJCXJldCA9IGRybUlvY3RsKGJvLT5kZXYtPmZkLCBEUk1fSU9DVExfUFJJTUVfSEFORExFX1RPX0ZELCAmcmVxKTsKKwkJaWYgKHJldCkgeworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWJvLT5mZCA9IHJlcS5mZDsKKwl9CisJcmV0dXJuIGR1cChiby0+ZmQpOworfQorCit1aW50MzJfdCBvbWFwX2JvX3NpemUoc3RydWN0IG9tYXBfYm8gKmJvKQoreworCWlmICghYm8tPnNpemUpIHsKKwkJZ2V0X2J1ZmZlcl9pbmZvKGJvKTsKKwl9CisJcmV0dXJuIGJvLT5zaXplOworfQorCit2b2lkICpvbWFwX2JvX21hcChzdHJ1Y3Qgb21hcF9ibyAqYm8pCit7CisJaWYgKCFiby0+bWFwKSB7CisJCWlmICghYm8tPm9mZnNldCkgeworCQkJZ2V0X2J1ZmZlcl9pbmZvKGJvKTsKKwkJfQorCisJCWJvLT5tYXAgPSBtbWFwKDAsIGJvLT5zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCQkJCU1BUF9TSEFSRUQsIGJvLT5kZXYtPmZkLCBiby0+b2Zmc2V0KTsKKwkJaWYgKGJvLT5tYXAgPT0gTUFQX0ZBSUxFRCkgeworCQkJYm8tPm1hcCA9IE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIGJvLT5tYXA7Cit9CisKK2ludCBvbWFwX2JvX2NwdV9wcmVwKHN0cnVjdCBvbWFwX2JvICpibywgZW51bSBvbWFwX2dlbV9vcCBvcCkKK3sKKwlzdHJ1Y3QgZHJtX29tYXBfZ2VtX2NwdV9wcmVwIHJlcSA9IHsKKwkJCS5oYW5kbGUgPSBiby0+aGFuZGxlLAorCQkJLm9wID0gb3AsCisJfTsKKwlyZXR1cm4gZHJtQ29tbWFuZFdyaXRlKGJvLT5kZXYtPmZkLAorCQkJRFJNX09NQVBfR0VNX0NQVV9QUkVQLCAmcmVxLCBzaXplb2YocmVxKSk7Cit9CisKK2ludCBvbWFwX2JvX2NwdV9maW5pKHN0cnVjdCBvbWFwX2JvICpibywgZW51bSBvbWFwX2dlbV9vcCBvcCkKK3sKKwlzdHJ1Y3QgZHJtX29tYXBfZ2VtX2NwdV9maW5pIHJlcSA9IHsKKwkJCS5oYW5kbGUgPSBiby0+aGFuZGxlLAorCQkJLm9wID0gb3AsCisJCQkubnJlZ2lvbnMgPSAwLAorCX07CisJcmV0dXJuIGRybUNvbW1hbmRXcml0ZShiby0+ZGV2LT5mZCwKKwkJCURSTV9PTUFQX0dFTV9DUFVfRklOSSwgJnJlcSwgc2l6ZW9mKHJlcSkpOworfQpkaWZmIC0tZ2l0IGEvb21hcC9vbWFwX2RybS5oIGIvb21hcC9vbWFwX2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNmMwZTQKLS0tIC9kZXYvbnVsbAorKysgYi9vbWFwL29tYXBfZHJtLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJrJnIiOyB0YWItd2lkdGggNDsgaW5kZW50LXRhYnMtbW9kZTogdDsgLSotICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGV4YXMgSW5zdHJ1bWVudHMsIEluYworICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgUm9iIENsYXJrIDxyb2JAdGkuY29tPgorICovCisKKyNpZm5kZWYgX19PTUFQX0RSTV9IX18KKyNkZWZpbmUgX19PTUFQX0RSTV9IX18KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGRybS5oPgorCisvKiBQbGVhc2Ugbm90ZSB0aGF0IG1vZGlmaWNhdGlvbnMgdG8gYWxsIHN0cnVjdHMgZGVmaW5lZCBoZXJlIGFyZQorICogc3ViamVjdCB0byBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBjb25zdHJhaW50cy4KKyAqLworCisjZGVmaW5lIE9NQVBfUEFSQU1fQ0hJUFNFVF9JRAkxCS8qIGllLiAweDM0MzAsIDB4NDQzMCwgZXRjICovCisKK3N0cnVjdCBkcm1fb21hcF9wYXJhbSB7CisJdWludDY0X3QgcGFyYW07CQkJLyogaW4gKi8KKwl1aW50NjRfdCB2YWx1ZTsJCQkvKiBpbiAoc2V0X3BhcmFtKSwgb3V0IChnZXRfcGFyYW0pICovCit9OworCitzdHJ1Y3QgZHJtX29tYXBfZ2V0X2Jhc2UgeworCWNoYXIgcGx1Z2luX25hbWVbNjRdOwkJLyogaW4gKi8KKwl1aW50MzJfdCBpb2N0bF9iYXNlOwkJLyogb3V0ICovCisJdWludDMyX3QgX19wYWQ7Cit9OworCisjZGVmaW5lIE9NQVBfQk9fU0NBTk9VVAkJMHgwMDAwMDAwMQkvKiBzY2Fub3V0IGNhcGFibGUgKHBoeXMgY29udGlndW91cykgKi8KKyNkZWZpbmUgT01BUF9CT19DQUNIRV9NQVNLCTB4MDAwMDAwMDYJLyogY2FjaGUgdHlwZSBtYXNrLCBzZWUgY2FjaGUgbW9kZXMgKi8KKyNkZWZpbmUgT01BUF9CT19USUxFRF9NQVNLCTB4MDAwMDBmMDAJLyogdGlsZWQgbWFwcGluZyBtYXNrLCBzZWUgdGlsZWQgbW9kZXMgKi8KKworLyogY2FjaGUgbW9kZXMgKi8KKyNkZWZpbmUgT01BUF9CT19DQUNIRUQJCTB4MDAwMDAwMDAJLyogZGVmYXVsdCAqLworI2RlZmluZSBPTUFQX0JPX1dDCQkweDAwMDAwMDAyCS8qIHdyaXRlLWNvbWJpbmUgKi8KKyNkZWZpbmUgT01BUF9CT19VTkNBQ0hFRAkweDAwMDAwMDA0CS8qIHN0cm9uZ2x5LW9yZGVyZWQgKHVuY2FjaGVkKSAqLworCisvKiB0aWxlZCBtb2RlcyAqLworI2RlZmluZSBPTUFQX0JPX1RJTEVEXzgJCTB4MDAwMDAxMDAKKyNkZWZpbmUgT01BUF9CT19USUxFRF8xNgkweDAwMDAwMjAwCisjZGVmaW5lIE9NQVBfQk9fVElMRURfMzIJMHgwMDAwMDMwMAorI2RlZmluZSBPTUFQX0JPX1RJTEVECQkoT01BUF9CT19USUxFRF84IHwgT01BUF9CT19USUxFRF8xNiB8IE9NQVBfQk9fVElMRURfMzIpCisKK3VuaW9uIG9tYXBfZ2VtX3NpemUgeworCXVpbnQzMl90IGJ5dGVzOwkJLyogKGZvciBub24tdGlsZWQgZm9ybWF0cykgKi8KKwlzdHJ1Y3QgeworCQl1aW50MTZfdCB3aWR0aDsKKwkJdWludDE2X3QgaGVpZ2h0OworCX0gdGlsZWQ7CQkvKiAoZm9yIHRpbGVkIGZvcm1hdHMpICovCit9OworCitzdHJ1Y3QgZHJtX29tYXBfZ2VtX25ldyB7CisJdW5pb24gb21hcF9nZW1fc2l6ZSBzaXplOwkvKiBpbiAqLworCXVpbnQzMl90IGZsYWdzOwkJCS8qIGluICovCisJdWludDMyX3QgaGFuZGxlOwkJLyogb3V0ICovCisJdWludDMyX3QgX19wYWQ7Cit9OworCisvKiBtYXNrIG9mIG9wZXJhdGlvbnM6ICovCitlbnVtIG9tYXBfZ2VtX29wIHsKKwlPTUFQX0dFTV9SRUFEID0gMHgwMSwKKwlPTUFQX0dFTV9XUklURSA9IDB4MDIsCit9OworCitzdHJ1Y3QgZHJtX29tYXBfZ2VtX2NwdV9wcmVwIHsKKwl1aW50MzJfdCBoYW5kbGU7CQkvKiBidWZmZXIgaGFuZGxlIChpbikgKi8KKwl1aW50MzJfdCBvcDsJCQkvKiBtYXNrIG9mIG9tYXBfZ2VtX29wIChpbikgKi8KK307CisKK3N0cnVjdCBkcm1fb21hcF9nZW1fY3B1X2ZpbmkgeworCXVpbnQzMl90IGhhbmRsZTsJCS8qIGJ1ZmZlciBoYW5kbGUgKGluKSAqLworCXVpbnQzMl90IG9wOwkJCS8qIG1hc2sgb2Ygb21hcF9nZW1fb3AgKGluKSAqLworCS8qIFRPRE8gbWF5YmUgaGVyZSB3ZSBwYXNzIGRvd24gaW5mbyBhYm91dCB3aGF0IHJlZ2lvbnMgYXJlIHRvdWNoZWQKKwkgKiBieSBzdyBzbyB3ZSBjYW4gYmUgY2xldmVyIGFib3V0IGNhY2hlIG9wcz8gIEZvciBub3cgYSBwbGFjZWhvbGRlciwKKwkgKiBzZXQgdG8gemVybyBhbmQgd2UganVzdCBkbyBmdWxsIGJ1ZmZlciBmbHVzaC4uCisJICovCisJdWludDMyX3QgbnJlZ2lvbnM7CisJdWludDMyX3QgX19wYWQ7Cit9OworCitzdHJ1Y3QgZHJtX29tYXBfZ2VtX2luZm8geworCXVpbnQzMl90IGhhbmRsZTsJCS8qIGJ1ZmZlciBoYW5kbGUgKGluKSAqLworCXVpbnQzMl90IHBhZDsKKwl1aW50NjRfdCBvZmZzZXQ7CQkvKiBtbWFwIG9mZnNldCAob3V0KSAqLworCS8qIG5vdGU6IGluIGNhc2Ugb2YgdGlsZWQgYnVmZmVycywgdGhlIHVzZXIgdmlydHVhbCBzaXplIGNhbiBiZQorCSAqIGRpZmZlcmVudCBmcm9tIHRoZSBwaHlzaWNhbCBzaXplIChpZS4gaG93IG1hbnkgcGFnZXMgYXJlIG5lZWRlZAorCSAqIHRvIGJhY2sgdGhlIG9iamVjdCkgd2hpY2ggaXMgcmV0dXJuZWQgaW4gRFJNX0lPQ1RMX0dFTV9PUEVOLi4KKwkgKiBUaGlzIHNpemUgaGVyZSBpcyB0aGUgb25lIHRoYXQgc2hvdWxkIGJlIHVzZWQgaWYgeW91IHdhbnQgdG8KKwkgKiBtbWFwKCkgdGhlIGJ1ZmZlcjoKKwkgKi8KKwl1aW50MzJfdCBzaXplOwkJCS8qIHZpcnR1YWwgc2l6ZSBmb3IgbW1hcCdpbmcgKG91dCkgKi8KKwl1aW50MzJfdCBfX3BhZDsKK307CisKKyNkZWZpbmUgRFJNX09NQVBfR0VUX1BBUkFNCQkweDAwCisjZGVmaW5lIERSTV9PTUFQX1NFVF9QQVJBTQkJMHgwMQorI2RlZmluZSBEUk1fT01BUF9HRVRfQkFTRQkJMHgwMgorI2RlZmluZSBEUk1fT01BUF9HRU1fTkVXCQkweDAzCisjZGVmaW5lIERSTV9PTUFQX0dFTV9DUFVfUFJFUAkJMHgwNAorI2RlZmluZSBEUk1fT01BUF9HRU1fQ1BVX0ZJTkkJCTB4MDUKKyNkZWZpbmUgRFJNX09NQVBfR0VNX0lORk8JCTB4MDYKKyNkZWZpbmUgRFJNX09NQVBfTlVNX0lPQ1RMUwkJMHgwNworCisjZGVmaW5lIERSTV9JT0NUTF9PTUFQX0dFVF9QQVJBTQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX09NQVBfR0VUX1BBUkFNLCBzdHJ1Y3QgZHJtX29tYXBfcGFyYW0pCisjZGVmaW5lIERSTV9JT0NUTF9PTUFQX1NFVF9QQVJBTQlEUk1fSU9XIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX09NQVBfU0VUX1BBUkFNLCBzdHJ1Y3QgZHJtX29tYXBfcGFyYW0pCisjZGVmaW5lIERSTV9JT0NUTF9PTUFQX0dFVF9CQVNFCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX09NQVBfR0VUX0JBU0UsIHN0cnVjdCBkcm1fb21hcF9nZXRfYmFzZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX09NQVBfR0VNX05FVwkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9PTUFQX0dFTV9ORVcsIHN0cnVjdCBkcm1fb21hcF9nZW1fbmV3KQorI2RlZmluZSBEUk1fSU9DVExfT01BUF9HRU1fQ1BVX1BSRVAJRFJNX0lPVyAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9PTUFQX0dFTV9DUFVfUFJFUCwgc3RydWN0IGRybV9vbWFwX2dlbV9jcHVfcHJlcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX09NQVBfR0VNX0NQVV9GSU5JCURSTV9JT1cgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fT01BUF9HRU1fQ1BVX0ZJTkksIHN0cnVjdCBkcm1fb21hcF9nZW1fY3B1X2ZpbmkpCisjZGVmaW5lIERSTV9JT0NUTF9PTUFQX0dFTV9JTkZPCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX09NQVBfR0VNX0lORk8sIHN0cnVjdCBkcm1fb21hcF9nZW1faW5mbykKKworI2VuZGlmIC8qIF9fT01BUF9EUk1fSF9fICovCmRpZmYgLS1naXQgYS9vbWFwL29tYXBfZHJtaWYuaCBiL29tYXAvb21hcF9kcm1pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MmQxMjcKLS0tIC9kZXYvbnVsbAorKysgYi9vbWFwL29tYXBfZHJtaWYuaApAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRleGFzIEluc3RydW1lbnRzLCBJbmMKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJvYiBDbGFyayA8cm9iQHRpLmNvbT4KKyAqLworCisjaWZuZGVmIE9NQVBfRFJNSUZfSF8KKyNkZWZpbmUgT01BUF9EUk1JRl9IXworCisjaW5jbHVkZSA8eGY4NmRybS5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG9tYXBfZHJtLmg+CisKK3N0cnVjdCBvbWFwX2JvOworc3RydWN0IG9tYXBfZGV2aWNlOworCisvKiBkZXZpY2UgcmVsYXRlZCBmdW5jdGlvbnM6CisgKi8KKworc3RydWN0IG9tYXBfZGV2aWNlICogb21hcF9kZXZpY2VfbmV3KGludCBmZCk7CitzdHJ1Y3Qgb21hcF9kZXZpY2UgKiBvbWFwX2RldmljZV9yZWYoc3RydWN0IG9tYXBfZGV2aWNlICpkZXYpOwordm9pZCBvbWFwX2RldmljZV9kZWwoc3RydWN0IG9tYXBfZGV2aWNlICpkZXYpOworaW50IG9tYXBfZ2V0X3BhcmFtKHN0cnVjdCBvbWFwX2RldmljZSAqZGV2LCB1aW50NjRfdCBwYXJhbSwgdWludDY0X3QgKnZhbHVlKTsKK2ludCBvbWFwX3NldF9wYXJhbShzdHJ1Y3Qgb21hcF9kZXZpY2UgKmRldiwgdWludDY0X3QgcGFyYW0sIHVpbnQ2NF90IHZhbHVlKTsKKworLyogYnVmZmVyLW9iamVjdCByZWxhdGVkIGZ1bmN0aW9uczoKKyAqLworCitzdHJ1Y3Qgb21hcF9ibyAqIG9tYXBfYm9fbmV3KHN0cnVjdCBvbWFwX2RldmljZSAqZGV2LAorCQl1aW50MzJfdCBzaXplLCB1aW50MzJfdCBmbGFncyk7CitzdHJ1Y3Qgb21hcF9ibyAqIG9tYXBfYm9fbmV3X3RpbGVkKHN0cnVjdCBvbWFwX2RldmljZSAqZGV2LAorCQl1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmbGFncyk7CitzdHJ1Y3Qgb21hcF9ibyAqIG9tYXBfYm9fcmVmKHN0cnVjdCBvbWFwX2JvICpibyk7CitzdHJ1Y3Qgb21hcF9ibyAqIG9tYXBfYm9fZnJvbV9uYW1lKHN0cnVjdCBvbWFwX2RldmljZSAqZGV2LCB1aW50MzJfdCBuYW1lKTsKK3N0cnVjdCBvbWFwX2JvICogb21hcF9ib19mcm9tX2RtYWJ1ZihzdHJ1Y3Qgb21hcF9kZXZpY2UgKmRldiwgaW50IGZkKTsKK3ZvaWQgb21hcF9ib19kZWwoc3RydWN0IG9tYXBfYm8gKmJvKTsKK2ludCBvbWFwX2JvX2dldF9uYW1lKHN0cnVjdCBvbWFwX2JvICpibywgdWludDMyX3QgKm5hbWUpOwordWludDMyX3Qgb21hcF9ib19oYW5kbGUoc3RydWN0IG9tYXBfYm8gKmJvKTsKK2ludCBvbWFwX2JvX2RtYWJ1ZihzdHJ1Y3Qgb21hcF9ibyAqYm8pOwordWludDMyX3Qgb21hcF9ib19zaXplKHN0cnVjdCBvbWFwX2JvICpibyk7Cit2b2lkICogb21hcF9ib19tYXAoc3RydWN0IG9tYXBfYm8gKmJvKTsKK2ludCBvbWFwX2JvX2NwdV9wcmVwKHN0cnVjdCBvbWFwX2JvICpibywgZW51bSBvbWFwX2dlbV9vcCBvcCk7CitpbnQgb21hcF9ib19jcHVfZmluaShzdHJ1Y3Qgb21hcF9ibyAqYm8sIGVudW0gb21hcF9nZW1fb3Agb3ApOworCisjZW5kaWYgLyogT01BUF9EUk1JRl9IXyAqLwpkaWZmIC0tZ2l0IGEvcmFkZW9uL0FuZHJvaWQubWsgYi9yYWRlb24vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTA0MGRhCi0tLSAvZGV2L251bGwKKysrIGIvcmFkZW9uL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgSW1wb3J0IHZhcmlhYmxlcyBMSUJEUk1fUkFERU9OX0ZJTEVTLCBMSUJEUk1fUkFERU9OX0hfRklMRVMKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9NYWtlZmlsZS5zb3VyY2VzCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJkcm1fcmFkZW9uCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliZHJtCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKExJQkRSTV9SQURFT05fRklMRVMpCisKK2luY2x1ZGUgJChMSUJEUk1fQ09NTU9OX01LKQoraW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvcmFkZW9uL01ha2VmaWxlLmFtIGIvcmFkZW9uL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNDE1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9yYWRlb24vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NyBAQAorIyBDb3B5cmlnaHQgwqkgMjAwOCBKw6lyw7RtZSBHbGlzc2UKKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyMgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyMgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorIyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyMgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisjIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyMgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorIyBTb2Z0d2FyZS4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyMgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorIyBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorIyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworIyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisjIElOIFRIRSBTT0ZUV0FSRS4KKyMKKyMgQXV0aG9yczoKKyMgICAgSsOpcsO0bWUgR2xpc3NlIDxnbGlzc2VAZnJlZWRlc2t0b3Aub3JnPgorCitpbmNsdWRlIE1ha2VmaWxlLnNvdXJjZXMKKworQU1fQ0ZMQUdTID0gXAorCSQoV0FSTl9DRkxBR1MpIFwKKwktSSQodG9wX3NyY2RpcikgXAorCSQoUFRIUkVBRFNUVUJTX0NGTEFHUykgXAorCS1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlL2RybQorCitsaWJkcm1fcmFkZW9uX2xhX0xUTElCUkFSSUVTID0gbGliZHJtX3JhZGVvbi5sYQorbGliZHJtX3JhZGVvbl9sYWRpciA9ICQobGliZGlyKQorbGliZHJtX3JhZGVvbl9sYV9MREZMQUdTID0gLXZlcnNpb24tbnVtYmVyIDE6MDoxIC1uby11bmRlZmluZWQKK2xpYmRybV9yYWRlb25fbGFfTElCQUREID0gLi4vbGliZHJtLmxhIEBQVEhSRUFEU1RVQlNfTElCU0AKKworbGliZHJtX3JhZGVvbl9sYV9TT1VSQ0VTID0gJChMSUJEUk1fUkFERU9OX0ZJTEVTKQorCitsaWJkcm1fcmFkZW9uaW5jbHVkZWRpciA9ICR7aW5jbHVkZWRpcn0vbGliZHJtCitsaWJkcm1fcmFkZW9uaW5jbHVkZV9IRUFERVJTID0gJChMSUJEUk1fUkFERU9OX0hfRklMRVMpCisKK3BrZ2NvbmZpZ2RpciA9IEBwa2djb25maWdkaXJACitwa2djb25maWdfREFUQSA9IGxpYmRybV9yYWRlb24ucGMKKworVEVTVFMgPSByYWRlb24tc3ltYm9sLWNoZWNrCitFWFRSQV9ESVNUID0gJChMSUJEUk1fUkFERU9OX0JPRl9GSUxFUykgJChURVNUUykKZGlmZiAtLWdpdCBhL3JhZGVvbi9NYWtlZmlsZS5zb3VyY2VzIGIvcmFkZW9uL01ha2VmaWxlLnNvdXJjZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNmNDgyYQotLS0gL2Rldi9udWxsCisrKyBiL3JhZGVvbi9NYWtlZmlsZS5zb3VyY2VzCkBAIC0wLDAgKzEsMjEgQEAKK0xJQkRSTV9SQURFT05fRklMRVMgOj0gXAorCXJhZGVvbl9ib19nZW0uYyBcCisJcmFkZW9uX2NzX2dlbS5jIFwKKwlyYWRlb25fY3Nfc3BhY2UuYyBcCisJcmFkZW9uX2JvLmMgXAorCXJhZGVvbl9jcy5jIFwKKwlyYWRlb25fc3VyZmFjZS5jCisKK0xJQkRSTV9SQURFT05fSF9GSUxFUyA6PSBcCisJcmFkZW9uX2JvLmggXAorCXJhZGVvbl9jcy5oIFwKKwlyYWRlb25fc3VyZmFjZS5oIFwKKwlyYWRlb25fYm9fZ2VtLmggXAorCXJhZGVvbl9jc19nZW0uaCBcCisJcmFkZW9uX2JvX2ludC5oIFwKKwlyYWRlb25fY3NfaW50LmggXAorCXI2MDBfcGNpX2lkcy5oCisKK0xJQkRSTV9SQURFT05fQk9GX0ZJTEVTIDo9IFwKKwlib2YuYyBcCisJYm9mLmgKZGlmZiAtLWdpdCBhL3JhZGVvbi9ib2YuYyBiL3JhZGVvbi9ib2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTk4Y2M2Ci0tLSAvZGV2L251bGwKKysrIGIvcmFkZW9uL2JvZi5jCkBAIC0wLDAgKzEsNDc3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTAgSmVyb21lIEdsaXNzZSA8Z2xpc3NlQGZyZWVkZXNrdG9wLm9yZz4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIG9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIKKyAqIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1IoUykgQU5EL09SIFRIRUlSIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgICBKZXJvbWUgR2xpc3NlCisgKi8KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImJvZi5oIgorCisvKgorICogaGVscGVycworICovCitzdGF0aWMgaW50IGJvZl9lbnRyeV9ncm93KGJvZl90ICpib2YpCit7CisJYm9mX3QgKiphcnJheTsKKworCWlmIChib2YtPmFycmF5X3NpemUgPCBib2YtPm5lbnRyeSkKKwkJcmV0dXJuIDA7CisJYXJyYXkgPSByZWFsbG9jKGJvZi0+YXJyYXksIChib2YtPm5lbnRyeSArIDE2KSAqIHNpemVvZih2b2lkKikpOworCWlmIChhcnJheSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlib2YtPmFycmF5ID0gYXJyYXk7CisJYm9mLT5uZW50cnkgKz0gMTY7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBvYmplY3QgCisgKi8KK2JvZl90ICpib2Zfb2JqZWN0KHZvaWQpCit7CisJYm9mX3QgKm9iamVjdDsKKworCW9iamVjdCA9IGNhbGxvYygxLCBzaXplb2YoYm9mX3QpKTsKKwlpZiAob2JqZWN0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCW9iamVjdC0+cmVmY291bnQgPSAxOworCW9iamVjdC0+dHlwZSA9IEJPRl9UWVBFX09CSkVDVDsKKwlvYmplY3QtPnNpemUgPSAxMjsKKwlyZXR1cm4gb2JqZWN0OworfQorCitib2ZfdCAqYm9mX29iamVjdF9nZXQoYm9mX3QgKm9iamVjdCwgY29uc3QgY2hhciAqa2V5bmFtZSkKK3sKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IG9iamVjdC0+YXJyYXlfc2l6ZTsgaSArPSAyKSB7CisJCWlmICghc3RyY21wKG9iamVjdC0+YXJyYXlbaV0tPnZhbHVlLCBrZXluYW1lKSkgeworCQkJcmV0dXJuIG9iamVjdC0+YXJyYXlbaSArIDFdOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitpbnQgYm9mX29iamVjdF9zZXQoYm9mX3QgKm9iamVjdCwgY29uc3QgY2hhciAqa2V5bmFtZSwgYm9mX3QgKnZhbHVlKQoreworCWJvZl90ICprZXk7CisJaW50IHI7CisKKwlpZiAob2JqZWN0LT50eXBlICE9IEJPRl9UWVBFX09CSkVDVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJciA9IGJvZl9lbnRyeV9ncm93KG9iamVjdCk7CisJaWYgKHIpCisJCXJldHVybiByOworCWtleSA9IGJvZl9zdHJpbmcoa2V5bmFtZSk7CisJaWYgKGtleSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlvYmplY3QtPmFycmF5W29iamVjdC0+YXJyYXlfc2l6ZSsrXSA9IGtleTsKKwlvYmplY3QtPmFycmF5W29iamVjdC0+YXJyYXlfc2l6ZSsrXSA9IHZhbHVlOworCW9iamVjdC0+c2l6ZSArPSB2YWx1ZS0+c2l6ZTsKKwlvYmplY3QtPnNpemUgKz0ga2V5LT5zaXplOworCWJvZl9pbmNyZWYodmFsdWUpOworCXJldHVybiAwOworfQorCisvKgorICogYXJyYXkKKyAqLworYm9mX3QgKmJvZl9hcnJheSh2b2lkKQoreworCWJvZl90ICphcnJheSA9IGJvZl9vYmplY3QoKTsKKworCWlmIChhcnJheSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlhcnJheS0+dHlwZSA9IEJPRl9UWVBFX0FSUkFZOworCWFycmF5LT5zaXplID0gMTI7CisJcmV0dXJuIGFycmF5OworfQorCitpbnQgYm9mX2FycmF5X2FwcGVuZChib2ZfdCAqYXJyYXksIGJvZl90ICp2YWx1ZSkKK3sKKwlpbnQgcjsKKwlpZiAoYXJyYXktPnR5cGUgIT0gQk9GX1RZUEVfQVJSQVkpCisJCXJldHVybiAtRUlOVkFMOworCXIgPSBib2ZfZW50cnlfZ3JvdyhhcnJheSk7CisJaWYgKHIpCisJCXJldHVybiByOworCWFycmF5LT5hcnJheVthcnJheS0+YXJyYXlfc2l6ZSsrXSA9IHZhbHVlOworCWFycmF5LT5zaXplICs9IHZhbHVlLT5zaXplOworCWJvZl9pbmNyZWYodmFsdWUpOworCXJldHVybiAwOworfQorCitib2ZfdCAqYm9mX2FycmF5X2dldChib2ZfdCAqYm9mLCB1bnNpZ25lZCBpKQoreworCWlmICghYm9mX2lzX2FycmF5KGJvZikgfHwgaSA+PSBib2YtPmFycmF5X3NpemUpCisJCXJldHVybiBOVUxMOworCXJldHVybiBib2YtPmFycmF5W2ldOworfQorCit1bnNpZ25lZCBib2ZfYXJyYXlfc2l6ZShib2ZfdCAqYm9mKQoreworCWlmICghYm9mX2lzX2FycmF5KGJvZikpCisJCXJldHVybiAwOworCXJldHVybiBib2YtPmFycmF5X3NpemU7Cit9CisKKy8qCisgKiBibG9iCisgKi8KK2JvZl90ICpib2ZfYmxvYih1bnNpZ25lZCBzaXplLCB2b2lkICp2YWx1ZSkKK3sKKwlib2ZfdCAqYmxvYiA9IGJvZl9vYmplY3QoKTsKKworCWlmIChibG9iID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWJsb2ItPnR5cGUgPSBCT0ZfVFlQRV9CTE9COworCWJsb2ItPnZhbHVlID0gY2FsbG9jKDEsIHNpemUpOworCWlmIChibG9iLT52YWx1ZSA9PSBOVUxMKSB7CisJCWJvZl9kZWNyZWYoYmxvYik7CisJCXJldHVybiBOVUxMOworCX0KKwlibG9iLT5zaXplID0gc2l6ZTsKKwltZW1jcHkoYmxvYi0+dmFsdWUsIHZhbHVlLCBzaXplKTsKKwlibG9iLT5zaXplICs9IDEyOworCXJldHVybiBibG9iOworfQorCit1bnNpZ25lZCBib2ZfYmxvYl9zaXplKGJvZl90ICpib2YpCit7CisJaWYgKCFib2ZfaXNfYmxvYihib2YpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gYm9mLT5zaXplIC0gMTI7Cit9CisKK3ZvaWQgKmJvZl9ibG9iX3ZhbHVlKGJvZl90ICpib2YpCit7CisJaWYgKCFib2ZfaXNfYmxvYihib2YpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gYm9mLT52YWx1ZTsKK30KKworLyoKKyAqIHN0cmluZworICovCitib2ZfdCAqYm9mX3N0cmluZyhjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlib2ZfdCAqc3RyaW5nID0gYm9mX29iamVjdCgpOworCisJaWYgKHN0cmluZyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlzdHJpbmctPnR5cGUgPSBCT0ZfVFlQRV9TVFJJTkc7CisJc3RyaW5nLT5zaXplID0gc3RybGVuKHZhbHVlKSArIDE7CisJc3RyaW5nLT52YWx1ZSA9IGNhbGxvYygxLCBzdHJpbmctPnNpemUpOworCWlmIChzdHJpbmctPnZhbHVlID09IE5VTEwpIHsKKwkJYm9mX2RlY3JlZihzdHJpbmcpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc3RyY3B5KHN0cmluZy0+dmFsdWUsIHZhbHVlKTsKKwlzdHJpbmctPnNpemUgKz0gMTI7CisJcmV0dXJuIHN0cmluZzsKK30KKworLyoKKyAqICBpbnQzMgorICovCitib2ZfdCAqYm9mX2ludDMyKGludDMyX3QgdmFsdWUpCit7CisJYm9mX3QgKmludDMyID0gYm9mX29iamVjdCgpOworCisJaWYgKGludDMyID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWludDMyLT50eXBlID0gQk9GX1RZUEVfSU5UMzI7CisJaW50MzItPnNpemUgPSA0OworCWludDMyLT52YWx1ZSA9IGNhbGxvYygxLCBpbnQzMi0+c2l6ZSk7CisJaWYgKGludDMyLT52YWx1ZSA9PSBOVUxMKSB7CisJCWJvZl9kZWNyZWYoaW50MzIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtY3B5KGludDMyLT52YWx1ZSwgJnZhbHVlLCA0KTsKKwlpbnQzMi0+c2l6ZSArPSAxMjsKKwlyZXR1cm4gaW50MzI7Cit9CisKK2ludDMyX3QgYm9mX2ludDMyX3ZhbHVlKGJvZl90ICpib2YpCit7CisJcmV0dXJuICooKHVpbnQzMl90Kilib2YtPnZhbHVlKTsKK30KKworLyoKKyAqICBjb21tb24KKyAqLworc3RhdGljIHZvaWQgYm9mX2luZGVudChpbnQgbGV2ZWwpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGV2ZWw7IGkrKykKKwkJZnByaW50ZihzdGRlcnIsICIgIik7Cit9CisKK3N0YXRpYyB2b2lkIGJvZl9wcmludF9ib2YoYm9mX3QgKmJvZiwgaW50IGxldmVsLCBpbnQgZW50cnkpCit7CisJYm9mX2luZGVudChsZXZlbCk7CisJaWYgKGJvZiA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiLS1OVUxMLS0gZm9yIGVudHJ5ICVkXG4iLCBlbnRyeSk7CisJCXJldHVybjsKKwl9CisJc3dpdGNoIChib2YtPnR5cGUpIHsKKwljYXNlIEJPRl9UWVBFX1NUUklORzoKKwkJZnByaW50ZihzdGRlcnIsICIlcCBzdHJpbmcgWyVzICVkXVxuIiwgYm9mLCAoY2hhciopYm9mLT52YWx1ZSwgYm9mLT5zaXplKTsKKwkJYnJlYWs7CisJY2FzZSBCT0ZfVFlQRV9JTlQzMjoKKwkJZnByaW50ZihzdGRlcnIsICIlcCBpbnQzMiBbJWQgJWRdXG4iLCBib2YsICooaW50Kilib2YtPnZhbHVlLCBib2YtPnNpemUpOworCQlicmVhazsKKwljYXNlIEJPRl9UWVBFX0JMT0I6CisJCWZwcmludGYoc3RkZXJyLCAiJXAgYmxvYiBbJWRdXG4iLCBib2YsIGJvZi0+c2l6ZSk7CisJCWJyZWFrOworCWNhc2UgQk9GX1RZUEVfTlVMTDoKKwkJZnByaW50ZihzdGRlcnIsICIlcCBudWxsIFslZF1cbiIsIGJvZiwgYm9mLT5zaXplKTsKKwkJYnJlYWs7CisJY2FzZSBCT0ZfVFlQRV9PQkpFQ1Q6CisJCWZwcmludGYoc3RkZXJyLCAiJXAgb2JqZWN0IFslZCAlZF1cbiIsIGJvZiwgYm9mLT5hcnJheV9zaXplIC8gMiwgYm9mLT5zaXplKTsKKwkJYnJlYWs7CisJY2FzZSBCT0ZfVFlQRV9BUlJBWToKKwkJZnByaW50ZihzdGRlcnIsICIlcCBhcnJheSBbJWQgJWRdXG4iLCBib2YsIGJvZi0+YXJyYXlfc2l6ZSwgYm9mLT5zaXplKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRlcnIsICIlcCB1bmtub3duIFslZF1cbiIsIGJvZiwgYm9mLT50eXBlKTsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIHZvaWQgYm9mX3ByaW50X3JlYyhib2ZfdCAqYm9mLCBpbnQgbGV2ZWwsIGludCBlbnRyeSkKK3sKKwl1bnNpZ25lZCBpOworCisJYm9mX3ByaW50X2JvZihib2YsIGxldmVsLCBlbnRyeSk7CisJZm9yIChpID0gMDsgaSA8IGJvZi0+YXJyYXlfc2l6ZTsgaSsrKSB7CisJCWJvZl9wcmludF9yZWMoYm9mLT5hcnJheVtpXSwgbGV2ZWwgKyAyLCBpKTsKKwl9Cit9CisKK3ZvaWQgYm9mX3ByaW50KGJvZl90ICpib2YpCit7CisJYm9mX3ByaW50X3JlYyhib2YsIDAsIDApOworfQorCitzdGF0aWMgaW50IGJvZl9yZWFkKGJvZl90ICpyb290LCBGSUxFICpmaWxlLCBsb25nIGVuZCwgaW50IGxldmVsKQoreworCWJvZl90ICpib2YgPSBOVUxMOworCWludCByOworCisJaWYgKGZ0ZWxsKGZpbGUpID49IGVuZCkgeworCQlyZXR1cm4gMDsKKwl9CisJciA9IGJvZl9lbnRyeV9ncm93KHJvb3QpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwlib2YgPSBib2Zfb2JqZWN0KCk7CisJaWYgKGJvZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlib2YtPm9mZnNldCA9IGZ0ZWxsKGZpbGUpOworCXIgPSBmcmVhZCgmYm9mLT50eXBlLCA0LCAxLCBmaWxlKTsKKwlpZiAociAhPSAxKQorCQlnb3RvIG91dF9lcnI7CisJciA9IGZyZWFkKCZib2YtPnNpemUsIDQsIDEsIGZpbGUpOworCWlmIChyICE9IDEpCisJCWdvdG8gb3V0X2VycjsKKwlyID0gZnJlYWQoJmJvZi0+YXJyYXlfc2l6ZSwgNCwgMSwgZmlsZSk7CisJaWYgKHIgIT0gMSkKKwkJZ290byBvdXRfZXJyOworCXN3aXRjaCAoYm9mLT50eXBlKSB7CisJY2FzZSBCT0ZfVFlQRV9TVFJJTkc6CisJY2FzZSBCT0ZfVFlQRV9JTlQzMjoKKwljYXNlIEJPRl9UWVBFX0JMT0I6CisJCWJvZi0+dmFsdWUgPSBjYWxsb2MoMSwgYm9mLT5zaXplIC0gMTIpOworCQlpZiAoYm9mLT52YWx1ZSA9PSBOVUxMKSB7CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKwkJciA9IGZyZWFkKGJvZi0+dmFsdWUsIGJvZi0+c2l6ZSAtIDEyLCAxLCBmaWxlKTsKKwkJaWYgKHIgIT0gMSkgeworCQkJZnByaW50ZihzdGRlcnIsICJlcnJvciByZWFkaW5nICVkXG4iLCBib2YtPnNpemUgLSAxMik7CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCT0ZfVFlQRV9OVUxMOgorCQlyZXR1cm4gMDsKKwljYXNlIEJPRl9UWVBFX09CSkVDVDoKKwljYXNlIEJPRl9UWVBFX0FSUkFZOgorCQlyID0gYm9mX3JlYWQoYm9mLCBmaWxlLCBib2YtPm9mZnNldCArIGJvZi0+c2l6ZSwgbGV2ZWwgKyAyKTsKKwkJaWYgKHIpCisJCQlnb3RvIG91dF9lcnI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCB0eXBlICVkXG4iLCBib2YtPnR5cGUpOworCQlnb3RvIG91dF9lcnI7CisJfQorCXJvb3QtPmFycmF5W3Jvb3QtPmNlbnRyeSsrXSA9IGJvZjsKKwlyZXR1cm4gYm9mX3JlYWQocm9vdCwgZmlsZSwgZW5kLCBsZXZlbCk7CitvdXRfZXJyOgorCWJvZl9kZWNyZWYoYm9mKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworYm9mX3QgKmJvZl9sb2FkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJYm9mX3QgKnJvb3QgPSBib2Zfb2JqZWN0KCk7CisJaW50IHI7CisKKwlpZiAocm9vdCA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXMgZmFpbGVkIHRvIGNyZWF0ZSByb290IG9iamVjdFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcm9vdC0+ZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworCWlmIChyb290LT5maWxlID09IE5VTEwpCisJCWdvdG8gb3V0X2VycjsKKwlyID0gZnNlZWsocm9vdC0+ZmlsZSwgMEwsIFNFRUtfU0VUKTsKKwlpZiAocikgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGZhaWxlZCB0byBzZWVrIGludG8gZmlsZSAlc1xuIiwgX19mdW5jX18sIGZpbGVuYW1lKTsKKwkJZ290byBvdXRfZXJyOworCX0KKwlyb290LT5vZmZzZXQgPSBmdGVsbChyb290LT5maWxlKTsKKwlyID0gZnJlYWQoJnJvb3QtPnR5cGUsIDQsIDEsIHJvb3QtPmZpbGUpOworCWlmIChyICE9IDEpCisJCWdvdG8gb3V0X2VycjsKKwlyID0gZnJlYWQoJnJvb3QtPnNpemUsIDQsIDEsIHJvb3QtPmZpbGUpOworCWlmIChyICE9IDEpCisJCWdvdG8gb3V0X2VycjsKKwlyID0gZnJlYWQoJnJvb3QtPmFycmF5X3NpemUsIDQsIDEsIHJvb3QtPmZpbGUpOworCWlmIChyICE9IDEpCisJCWdvdG8gb3V0X2VycjsKKwlyID0gYm9mX3JlYWQocm9vdCwgcm9vdC0+ZmlsZSwgcm9vdC0+b2Zmc2V0ICsgcm9vdC0+c2l6ZSwgMik7CisJaWYgKHIpCisJCWdvdG8gb3V0X2VycjsKKwlyZXR1cm4gcm9vdDsKK291dF9lcnI6CisJYm9mX2RlY3JlZihyb290KTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBib2ZfaW5jcmVmKGJvZl90ICpib2YpCit7CisJYm9mLT5yZWZjb3VudCsrOworfQorCit2b2lkIGJvZl9kZWNyZWYoYm9mX3QgKmJvZikKK3sKKwl1bnNpZ25lZCBpOworCisJaWYgKGJvZiA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKC0tYm9mLT5yZWZjb3VudCA+IDApCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgYm9mLT5hcnJheV9zaXplOyBpKyspIHsKKwkJYm9mX2RlY3JlZihib2YtPmFycmF5W2ldKTsKKwkJYm9mLT5hcnJheVtpXSA9IE5VTEw7CisJfQorCWJvZi0+YXJyYXlfc2l6ZSA9IDA7CisJaWYgKGJvZi0+ZmlsZSkgeworCQlmY2xvc2UoYm9mLT5maWxlKTsKKwkJYm9mLT5maWxlID0gTlVMTDsKKwl9CisJZnJlZShib2YtPmFycmF5KTsKKwlmcmVlKGJvZi0+dmFsdWUpOworCWZyZWUoYm9mKTsKK30KKworc3RhdGljIGludCBib2ZfZmlsZV93cml0ZShib2ZfdCAqYm9mLCBGSUxFICpmaWxlKQoreworCXVuc2lnbmVkIGk7CisJaW50IHI7CisKKwlyID0gZndyaXRlKCZib2YtPnR5cGUsIDQsIDEsIGZpbGUpOworCWlmIChyICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCXIgPSBmd3JpdGUoJmJvZi0+c2l6ZSwgNCwgMSwgZmlsZSk7CisJaWYgKHIgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJciA9IGZ3cml0ZSgmYm9mLT5hcnJheV9zaXplLCA0LCAxLCBmaWxlKTsKKwlpZiAociAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzd2l0Y2ggKGJvZi0+dHlwZSkgeworCWNhc2UgQk9GX1RZUEVfTlVMTDoKKwkJaWYgKGJvZi0+c2l6ZSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIEJPRl9UWVBFX1NUUklORzoKKwljYXNlIEJPRl9UWVBFX0lOVDMyOgorCWNhc2UgQk9GX1RZUEVfQkxPQjoKKwkJciA9IGZ3cml0ZShib2YtPnZhbHVlLCBib2YtPnNpemUgLSAxMiwgMSwgZmlsZSk7CisJCWlmIChyICE9IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBCT0ZfVFlQRV9PQkpFQ1Q6CisJY2FzZSBCT0ZfVFlQRV9BUlJBWToKKwkJZm9yIChpID0gMDsgaSA8IGJvZi0+YXJyYXlfc2l6ZTsgaSsrKSB7CisJCQlyID0gYm9mX2ZpbGVfd3JpdGUoYm9mLT5hcnJheVtpXSwgZmlsZSk7CisJCQlpZiAocikKKwkJCQlyZXR1cm4gcjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBib2ZfZHVtcF9maWxlKGJvZl90ICpib2YsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXVuc2lnbmVkIGk7CisJaW50IHIgPSAwOworCisJaWYgKGJvZi0+ZmlsZSkgeworCQlmY2xvc2UoYm9mLT5maWxlKTsKKwkJYm9mLT5maWxlID0gTlVMTDsKKwl9CisJYm9mLT5maWxlID0gZm9wZW4oZmlsZW5hbWUsICJ3Iik7CisJaWYgKGJvZi0+ZmlsZSA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXMgZmFpbGVkIHRvIG9wZW4gZmlsZSAlc1xuIiwgX19mdW5jX18sIGZpbGVuYW1lKTsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2VycjsKKwl9CisJciA9IGZzZWVrKGJvZi0+ZmlsZSwgMEwsIFNFRUtfU0VUKTsKKwlpZiAocikgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGZhaWxlZCB0byBzZWVrIGludG8gZmlsZSAlc1xuIiwgX19mdW5jX18sIGZpbGVuYW1lKTsKKwkJZ290byBvdXRfZXJyOworCX0KKwlyID0gZndyaXRlKCZib2YtPnR5cGUsIDQsIDEsIGJvZi0+ZmlsZSk7CisJaWYgKHIgIT0gMSkKKwkJZ290byBvdXRfZXJyOworCXIgPSBmd3JpdGUoJmJvZi0+c2l6ZSwgNCwgMSwgYm9mLT5maWxlKTsKKwlpZiAociAhPSAxKQorCQlnb3RvIG91dF9lcnI7CisJciA9IGZ3cml0ZSgmYm9mLT5hcnJheV9zaXplLCA0LCAxLCBib2YtPmZpbGUpOworCWlmIChyICE9IDEpCisJCWdvdG8gb3V0X2VycjsKKwlmb3IgKGkgPSAwOyBpIDwgYm9mLT5hcnJheV9zaXplOyBpKyspIHsKKwkJciA9IGJvZl9maWxlX3dyaXRlKGJvZi0+YXJyYXlbaV0sIGJvZi0+ZmlsZSk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJfQorb3V0X2VycjoKKwlmY2xvc2UoYm9mLT5maWxlKTsKKwlib2YtPmZpbGUgPSBOVUxMOworCXJldHVybiByOworfQpkaWZmIC0tZ2l0IGEvcmFkZW9uL2JvZi5oIGIvcmFkZW9uL2JvZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNGFmZmIKLS0tIC9kZXYvbnVsbAorKysgYi9yYWRlb24vYm9mLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwIEplcm9tZSBHbGlzc2UgPGdsaXNzZUBmcmVlZGVza3RvcC5vcmc+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiBvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViCisgKiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SKFMpIEFORC9PUiBUSEVJUiBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgICAgSmVyb21lIEdsaXNzZQorICovCisjaWZuZGVmIEJPRl9ICisjZGVmaW5lIEJPRl9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIEJPRl9UWVBFX1NUUklORwkJMAorI2RlZmluZSBCT0ZfVFlQRV9OVUxMCQkxCisjZGVmaW5lIEJPRl9UWVBFX0JMT0IJCTIKKyNkZWZpbmUgQk9GX1RZUEVfT0JKRUNUCQkzCisjZGVmaW5lIEJPRl9UWVBFX0FSUkFZCQk0CisjZGVmaW5lIEJPRl9UWVBFX0lOVDMyCQk1CisKK3N0cnVjdCBib2Y7CisKK3R5cGVkZWYgc3RydWN0IGJvZiB7CisJc3RydWN0IGJvZgkqKmFycmF5OworCXVuc2lnbmVkCWNlbnRyeTsKKwl1bnNpZ25lZAluZW50cnk7CisJdW5zaWduZWQJcmVmY291bnQ7CisJRklMRQkJKmZpbGU7CisJdWludDMyX3QJdHlwZTsKKwl1aW50MzJfdAlzaXplOworCXVpbnQzMl90CWFycmF5X3NpemU7CisJdm9pZAkJKnZhbHVlOworCWxvbmcJCW9mZnNldDsKK30gYm9mX3Q7CisKK2V4dGVybiBpbnQgYm9mX2ZpbGVfZmx1c2goYm9mX3QgKnJvb3QpOworZXh0ZXJuIGJvZl90ICpib2ZfZmlsZV9uZXcoY29uc3QgY2hhciAqZmlsZW5hbWUpOworZXh0ZXJuIGludCBib2Zfb2JqZWN0X2R1bXAoYm9mX3QgKm9iamVjdCwgY29uc3QgY2hhciAqZmlsZW5hbWUpOworCisvKiBvYmplY3QgKi8KK2V4dGVybiBib2ZfdCAqYm9mX29iamVjdCh2b2lkKTsKK2V4dGVybiBib2ZfdCAqYm9mX29iamVjdF9nZXQoYm9mX3QgKm9iamVjdCwgY29uc3QgY2hhciAqa2V5bmFtZSk7CitleHRlcm4gaW50IGJvZl9vYmplY3Rfc2V0KGJvZl90ICpvYmplY3QsIGNvbnN0IGNoYXIgKmtleW5hbWUsIGJvZl90ICp2YWx1ZSk7CisvKiBhcnJheSAqLworZXh0ZXJuIGJvZl90ICpib2ZfYXJyYXkodm9pZCk7CitleHRlcm4gaW50IGJvZl9hcnJheV9hcHBlbmQoYm9mX3QgKmFycmF5LCBib2ZfdCAqdmFsdWUpOworZXh0ZXJuIGJvZl90ICpib2ZfYXJyYXlfZ2V0KGJvZl90ICpib2YsIHVuc2lnbmVkIGkpOworZXh0ZXJuIHVuc2lnbmVkIGJvZl9hcnJheV9zaXplKGJvZl90ICpib2YpOworLyogYmxvYiAqLworZXh0ZXJuIGJvZl90ICpib2ZfYmxvYih1bnNpZ25lZCBzaXplLCB2b2lkICp2YWx1ZSk7CitleHRlcm4gdW5zaWduZWQgYm9mX2Jsb2Jfc2l6ZShib2ZfdCAqYm9mKTsKK2V4dGVybiB2b2lkICpib2ZfYmxvYl92YWx1ZShib2ZfdCAqYm9mKTsKKy8qIHN0cmluZyAqLworZXh0ZXJuIGJvZl90ICpib2Zfc3RyaW5nKGNvbnN0IGNoYXIgKnZhbHVlKTsKKy8qIGludDMyICovCitleHRlcm4gYm9mX3QgKmJvZl9pbnQzMihpbnQzMl90IHZhbHVlKTsKK2V4dGVybiBpbnQzMl90IGJvZl9pbnQzMl92YWx1ZShib2ZfdCAqYm9mKTsKKy8qIGNvbW1vbiBmdW5jdGlvbnMgKi8KK2V4dGVybiB2b2lkIGJvZl9kZWNyZWYoYm9mX3QgKmJvZik7CitleHRlcm4gdm9pZCBib2ZfaW5jcmVmKGJvZl90ICpib2YpOworZXh0ZXJuIGJvZl90ICpib2ZfbG9hZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKK2V4dGVybiBpbnQgYm9mX2R1bXBfZmlsZShib2ZfdCAqYm9mLCBjb25zdCBjaGFyICpmaWxlbmFtZSk7CitleHRlcm4gdm9pZCBib2ZfcHJpbnQoYm9mX3QgKmJvZik7CisKK3N0YXRpYyBpbmxpbmUgaW50IGJvZl9pc19vYmplY3QoYm9mX3QgKmJvZil7cmV0dXJuIChib2YtPnR5cGUgPT0gQk9GX1RZUEVfT0JKRUNUKTt9CitzdGF0aWMgaW5saW5lIGludCBib2ZfaXNfYmxvYihib2ZfdCAqYm9mKXtyZXR1cm4gKGJvZi0+dHlwZSA9PSBCT0ZfVFlQRV9CTE9CKTt9CitzdGF0aWMgaW5saW5lIGludCBib2ZfaXNfbnVsbChib2ZfdCAqYm9mKXtyZXR1cm4gKGJvZi0+dHlwZSA9PSBCT0ZfVFlQRV9OVUxMKTt9CitzdGF0aWMgaW5saW5lIGludCBib2ZfaXNfaW50MzIoYm9mX3QgKmJvZil7cmV0dXJuIChib2YtPnR5cGUgPT0gQk9GX1RZUEVfSU5UMzIpO30KK3N0YXRpYyBpbmxpbmUgaW50IGJvZl9pc19hcnJheShib2ZfdCAqYm9mKXtyZXR1cm4gKGJvZi0+dHlwZSA9PSBCT0ZfVFlQRV9BUlJBWSk7fQorc3RhdGljIGlubGluZSBpbnQgYm9mX2lzX3N0cmluZyhib2ZfdCAqYm9mKXtyZXR1cm4gKGJvZi0+dHlwZSA9PSBCT0ZfVFlQRV9TVFJJTkcpO30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9yYWRlb24vbGliZHJtX3JhZGVvbi5wYy5pbiBiL3JhZGVvbi9saWJkcm1fcmFkZW9uLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMjk5M2EKLS0tIC9kZXYvbnVsbAorKysgYi9yYWRlb24vbGliZHJtX3JhZGVvbi5wYy5pbgpAQCAtMCwwICsxLDExIEBACitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKKworTmFtZTogbGliZHJtX3JhZGVvbgorRGVzY3JpcHRpb246IFVzZXJzcGFjZSBpbnRlcmZhY2UgdG8ga2VybmVsIERSTSBzZXJ2aWNlcyBmb3IgcmFkZW9uCitWZXJzaW9uOiBAUEFDS0FHRV9WRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWxkcm1fcmFkZW9uCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfSAtSSR7aW5jbHVkZWRpcn0vbGliZHJtCitSZXF1aXJlcy5wcml2YXRlOiBsaWJkcm0KZGlmZiAtLWdpdCBhL3JhZGVvbi9yNjAwX3BjaV9pZHMuaCBiL3JhZGVvbi9yNjAwX3BjaV9pZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2IyZWFjCi0tLSAvZGV2L251bGwKKysrIGIvcmFkZW9uL3I2MDBfcGNpX2lkcy5oCkBAIC0wLDAgKzEsNDg3IEBACitDSElQU0VUKDB4OTQwMCwgUjYwMF85NDAwLCBSNjAwKQorQ0hJUFNFVCgweDk0MDEsIFI2MDBfOTQwMSwgUjYwMCkKK0NISVBTRVQoMHg5NDAyLCBSNjAwXzk0MDIsIFI2MDApCitDSElQU0VUKDB4OTQwMywgUjYwMF85NDAzLCBSNjAwKQorQ0hJUFNFVCgweDk0MDUsIFI2MDBfOTQwNSwgUjYwMCkKK0NISVBTRVQoMHg5NDBBLCBSNjAwXzk0MEEsIFI2MDApCitDSElQU0VUKDB4OTQwQiwgUjYwMF85NDBCLCBSNjAwKQorQ0hJUFNFVCgweDk0MEYsIFI2MDBfOTQwRiwgUjYwMCkKKworQ0hJUFNFVCgweDk0QzAsIFJWNjEwXzk0QzAsIFJWNjEwKQorQ0hJUFNFVCgweDk0QzEsIFJWNjEwXzk0QzEsIFJWNjEwKQorQ0hJUFNFVCgweDk0QzMsIFJWNjEwXzk0QzMsIFJWNjEwKQorQ0hJUFNFVCgweDk0QzQsIFJWNjEwXzk0QzQsIFJWNjEwKQorQ0hJUFNFVCgweDk0QzUsIFJWNjEwXzk0QzUsIFJWNjEwKQorQ0hJUFNFVCgweDk0QzYsIFJWNjEwXzk0QzYsIFJWNjEwKQorQ0hJUFNFVCgweDk0QzcsIFJWNjEwXzk0QzcsIFJWNjEwKQorQ0hJUFNFVCgweDk0QzgsIFJWNjEwXzk0QzgsIFJWNjEwKQorQ0hJUFNFVCgweDk0QzksIFJWNjEwXzk0QzksIFJWNjEwKQorQ0hJUFNFVCgweDk0Q0IsIFJWNjEwXzk0Q0IsIFJWNjEwKQorQ0hJUFNFVCgweDk0Q0MsIFJWNjEwXzk0Q0MsIFJWNjEwKQorQ0hJUFNFVCgweDk0Q0QsIFJWNjEwXzk0Q0QsIFJWNjEwKQorCitDSElQU0VUKDB4OTU4MCwgUlY2MzBfOTU4MCwgUlY2MzApCitDSElQU0VUKDB4OTU4MSwgUlY2MzBfOTU4MSwgUlY2MzApCitDSElQU0VUKDB4OTU4MywgUlY2MzBfOTU4MywgUlY2MzApCitDSElQU0VUKDB4OTU4NiwgUlY2MzBfOTU4NiwgUlY2MzApCitDSElQU0VUKDB4OTU4NywgUlY2MzBfOTU4NywgUlY2MzApCitDSElQU0VUKDB4OTU4OCwgUlY2MzBfOTU4OCwgUlY2MzApCitDSElQU0VUKDB4OTU4OSwgUlY2MzBfOTU4OSwgUlY2MzApCitDSElQU0VUKDB4OTU4QSwgUlY2MzBfOTU4QSwgUlY2MzApCitDSElQU0VUKDB4OTU4QiwgUlY2MzBfOTU4QiwgUlY2MzApCitDSElQU0VUKDB4OTU4QywgUlY2MzBfOTU4QywgUlY2MzApCitDSElQU0VUKDB4OTU4RCwgUlY2MzBfOTU4RCwgUlY2MzApCitDSElQU0VUKDB4OTU4RSwgUlY2MzBfOTU4RSwgUlY2MzApCitDSElQU0VUKDB4OTU4RiwgUlY2MzBfOTU4RiwgUlY2MzApCisKK0NISVBTRVQoMHg5NTAwLCBSVjY3MF85NTAwLCBSVjY3MCkKK0NISVBTRVQoMHg5NTAxLCBSVjY3MF85NTAxLCBSVjY3MCkKK0NISVBTRVQoMHg5NTA0LCBSVjY3MF85NTA0LCBSVjY3MCkKK0NISVBTRVQoMHg5NTA1LCBSVjY3MF85NTA1LCBSVjY3MCkKK0NISVBTRVQoMHg5NTA2LCBSVjY3MF85NTA2LCBSVjY3MCkKK0NISVBTRVQoMHg5NTA3LCBSVjY3MF85NTA3LCBSVjY3MCkKK0NISVBTRVQoMHg5NTA4LCBSVjY3MF85NTA4LCBSVjY3MCkKK0NISVBTRVQoMHg5NTA5LCBSVjY3MF85NTA5LCBSVjY3MCkKK0NISVBTRVQoMHg5NTBGLCBSVjY3MF85NTBGLCBSVjY3MCkKK0NISVBTRVQoMHg5NTExLCBSVjY3MF85NTExLCBSVjY3MCkKK0NISVBTRVQoMHg5NTE1LCBSVjY3MF85NTE1LCBSVjY3MCkKK0NISVBTRVQoMHg5NTE3LCBSVjY3MF85NTE3LCBSVjY3MCkKK0NISVBTRVQoMHg5NTE5LCBSVjY3MF85NTE5LCBSVjY3MCkKKworQ0hJUFNFVCgweDk1QzAsIFJWNjIwXzk1QzAsIFJWNjIwKQorQ0hJUFNFVCgweDk1QzIsIFJWNjIwXzk1QzIsIFJWNjIwKQorQ0hJUFNFVCgweDk1QzQsIFJWNjIwXzk1QzQsIFJWNjIwKQorQ0hJUFNFVCgweDk1QzUsIFJWNjIwXzk1QzUsIFJWNjIwKQorQ0hJUFNFVCgweDk1QzYsIFJWNjIwXzk1QzYsIFJWNjIwKQorQ0hJUFNFVCgweDk1QzcsIFJWNjIwXzk1QzcsIFJWNjIwKQorQ0hJUFNFVCgweDk1QzksIFJWNjIwXzk1QzksIFJWNjIwKQorQ0hJUFNFVCgweDk1Q0MsIFJWNjIwXzk1Q0MsIFJWNjIwKQorQ0hJUFNFVCgweDk1Q0QsIFJWNjIwXzk1Q0QsIFJWNjIwKQorQ0hJUFNFVCgweDk1Q0UsIFJWNjIwXzk1Q0UsIFJWNjIwKQorQ0hJUFNFVCgweDk1Q0YsIFJWNjIwXzk1Q0YsIFJWNjIwKQorCitDSElQU0VUKDB4OTU5MCwgUlY2MzVfOTU5MCwgUlY2MzUpCitDSElQU0VUKDB4OTU5MSwgUlY2MzVfOTU5MSwgUlY2MzUpCitDSElQU0VUKDB4OTU5MywgUlY2MzVfOTU5MywgUlY2MzUpCitDSElQU0VUKDB4OTU5NSwgUlY2MzVfOTU5NSwgUlY2MzUpCitDSElQU0VUKDB4OTU5NiwgUlY2MzVfOTU5NiwgUlY2MzUpCitDSElQU0VUKDB4OTU5NywgUlY2MzVfOTU5NywgUlY2MzUpCitDSElQU0VUKDB4OTU5OCwgUlY2MzVfOTU5OCwgUlY2MzUpCitDSElQU0VUKDB4OTU5OSwgUlY2MzVfOTU5OSwgUlY2MzUpCitDSElQU0VUKDB4OTU5QiwgUlY2MzVfOTU5QiwgUlY2MzUpCisKK0NISVBTRVQoMHg5NjEwLCBSUzc4MF85NjEwLCBSUzc4MCkKK0NISVBTRVQoMHg5NjExLCBSUzc4MF85NjExLCBSUzc4MCkKK0NISVBTRVQoMHg5NjEyLCBSUzc4MF85NjEyLCBSUzc4MCkKK0NISVBTRVQoMHg5NjEzLCBSUzc4MF85NjEzLCBSUzc4MCkKK0NISVBTRVQoMHg5NjE0LCBSUzc4MF85NjE0LCBSUzc4MCkKK0NISVBTRVQoMHg5NjE1LCBSUzc4MF85NjE1LCBSUzc4MCkKK0NISVBTRVQoMHg5NjE2LCBSUzc4MF85NjE2LCBSUzc4MCkKKworQ0hJUFNFVCgweDk3MTAsIFJTODgwXzk3MTAsIFJTODgwKQorQ0hJUFNFVCgweDk3MTEsIFJTODgwXzk3MTEsIFJTODgwKQorQ0hJUFNFVCgweDk3MTIsIFJTODgwXzk3MTIsIFJTODgwKQorQ0hJUFNFVCgweDk3MTMsIFJTODgwXzk3MTMsIFJTODgwKQorQ0hJUFNFVCgweDk3MTQsIFJTODgwXzk3MTQsIFJTODgwKQorQ0hJUFNFVCgweDk3MTUsIFJTODgwXzk3MTUsIFJTODgwKQorCitDSElQU0VUKDB4OTQ0MCwgUlY3NzBfOTQ0MCwgUlY3NzApCitDSElQU0VUKDB4OTQ0MSwgUlY3NzBfOTQ0MSwgUlY3NzApCitDSElQU0VUKDB4OTQ0MiwgUlY3NzBfOTQ0MiwgUlY3NzApCitDSElQU0VUKDB4OTQ0MywgUlY3NzBfOTQ0MywgUlY3NzApCitDSElQU0VUKDB4OTQ0NCwgUlY3NzBfOTQ0NCwgUlY3NzApCitDSElQU0VUKDB4OTQ0NiwgUlY3NzBfOTQ0NiwgUlY3NzApCitDSElQU0VUKDB4OTQ0QSwgUlY3NzBfOTQ0QSwgUlY3NzApCitDSElQU0VUKDB4OTQ0QiwgUlY3NzBfOTQ0QiwgUlY3NzApCitDSElQU0VUKDB4OTQ0QywgUlY3NzBfOTQ0QywgUlY3NzApCitDSElQU0VUKDB4OTQ0RSwgUlY3NzBfOTQ0RSwgUlY3NzApCitDSElQU0VUKDB4OTQ1MCwgUlY3NzBfOTQ1MCwgUlY3NzApCitDSElQU0VUKDB4OTQ1MiwgUlY3NzBfOTQ1MiwgUlY3NzApCitDSElQU0VUKDB4OTQ1NiwgUlY3NzBfOTQ1NiwgUlY3NzApCitDSElQU0VUKDB4OTQ1QSwgUlY3NzBfOTQ1QSwgUlY3NzApCitDSElQU0VUKDB4OTQ1QiwgUlY3NzBfOTQ1QiwgUlY3NzApCitDSElQU0VUKDB4OTQ1RSwgUlY3NzBfOTQ1RSwgUlY3NzApCitDSElQU0VUKDB4OTQ2MCwgUlY3OTBfOTQ2MCwgUlY3NzApCitDSElQU0VUKDB4OTQ2MiwgUlY3OTBfOTQ2MiwgUlY3NzApCitDSElQU0VUKDB4OTQ2QSwgUlY3NzBfOTQ2QSwgUlY3NzApCitDSElQU0VUKDB4OTQ2QiwgUlY3NzBfOTQ2QiwgUlY3NzApCitDSElQU0VUKDB4OTQ3QSwgUlY3NzBfOTQ3QSwgUlY3NzApCitDSElQU0VUKDB4OTQ3QiwgUlY3NzBfOTQ3QiwgUlY3NzApCisKK0NISVBTRVQoMHg5NDgwLCBSVjczMF85NDgwLCBSVjczMCkKK0NISVBTRVQoMHg5NDg3LCBSVjczMF85NDg3LCBSVjczMCkKK0NISVBTRVQoMHg5NDg4LCBSVjczMF85NDg4LCBSVjczMCkKK0NISVBTRVQoMHg5NDg5LCBSVjczMF85NDg5LCBSVjczMCkKK0NISVBTRVQoMHg5NDhBLCBSVjczMF85NDhBLCBSVjczMCkKK0NISVBTRVQoMHg5NDhGLCBSVjczMF85NDhGLCBSVjczMCkKK0NISVBTRVQoMHg5NDkwLCBSVjczMF85NDkwLCBSVjczMCkKK0NISVBTRVQoMHg5NDkxLCBSVjczMF85NDkxLCBSVjczMCkKK0NISVBTRVQoMHg5NDk1LCBSVjczMF85NDk1LCBSVjczMCkKK0NISVBTRVQoMHg5NDk4LCBSVjczMF85NDk4LCBSVjczMCkKK0NISVBTRVQoMHg5NDlDLCBSVjczMF85NDlDLCBSVjczMCkKK0NISVBTRVQoMHg5NDlFLCBSVjczMF85NDlFLCBSVjczMCkKK0NISVBTRVQoMHg5NDlGLCBSVjczMF85NDlGLCBSVjczMCkKKworQ0hJUFNFVCgweDk1NDAsIFJWNzEwXzk1NDAsIFJWNzEwKQorQ0hJUFNFVCgweDk1NDEsIFJWNzEwXzk1NDEsIFJWNzEwKQorQ0hJUFNFVCgweDk1NDIsIFJWNzEwXzk1NDIsIFJWNzEwKQorQ0hJUFNFVCgweDk1NEUsIFJWNzEwXzk1NEUsIFJWNzEwKQorQ0hJUFNFVCgweDk1NEYsIFJWNzEwXzk1NEYsIFJWNzEwKQorQ0hJUFNFVCgweDk1NTIsIFJWNzEwXzk1NTIsIFJWNzEwKQorQ0hJUFNFVCgweDk1NTMsIFJWNzEwXzk1NTMsIFJWNzEwKQorQ0hJUFNFVCgweDk1NTUsIFJWNzEwXzk1NTUsIFJWNzEwKQorQ0hJUFNFVCgweDk1NTcsIFJWNzEwXzk1NTcsIFJWNzEwKQorQ0hJUFNFVCgweDk1NUYsIFJWNzEwXzk1NUYsIFJWNzEwKQorCitDSElQU0VUKDB4OTRBMCwgUlY3NDBfOTRBMCwgUlY3NDApCitDSElQU0VUKDB4OTRBMSwgUlY3NDBfOTRBMSwgUlY3NDApCitDSElQU0VUKDB4OTRBMywgUlY3NDBfOTRBMywgUlY3NDApCitDSElQU0VUKDB4OTRCMSwgUlY3NDBfOTRCMSwgUlY3NDApCitDSElQU0VUKDB4OTRCMywgUlY3NDBfOTRCMywgUlY3NDApCitDSElQU0VUKDB4OTRCNCwgUlY3NDBfOTRCNCwgUlY3NDApCitDSElQU0VUKDB4OTRCNSwgUlY3NDBfOTRCNSwgUlY3NDApCitDSElQU0VUKDB4OTRCOSwgUlY3NDBfOTRCOSwgUlY3NDApCisKK0NISVBTRVQoMHg2OEUwLCBDRURBUl82OEUwLCBDRURBUikKK0NISVBTRVQoMHg2OEUxLCBDRURBUl82OEUxLCBDRURBUikKK0NISVBTRVQoMHg2OEU0LCBDRURBUl82OEU0LCBDRURBUikKK0NISVBTRVQoMHg2OEU1LCBDRURBUl82OEU1LCBDRURBUikKK0NISVBTRVQoMHg2OEU4LCBDRURBUl82OEU4LCBDRURBUikKK0NISVBTRVQoMHg2OEU5LCBDRURBUl82OEU5LCBDRURBUikKK0NISVBTRVQoMHg2OEYxLCBDRURBUl82OEYxLCBDRURBUikKK0NISVBTRVQoMHg2OEYyLCBDRURBUl82OEYyLCBDRURBUikKK0NISVBTRVQoMHg2OEY4LCBDRURBUl82OEY4LCBDRURBUikKK0NISVBTRVQoMHg2OEY5LCBDRURBUl82OEY5LCBDRURBUikKK0NISVBTRVQoMHg2OEZBLCBDRURBUl82OEZBLCBDRURBUikKK0NISVBTRVQoMHg2OEZFLCBDRURBUl82OEZFLCBDRURBUikKKworQ0hJUFNFVCgweDY4QzAsIFJFRFdPT0RfNjhDMCwgUkVEV09PRCkKK0NISVBTRVQoMHg2OEMxLCBSRURXT09EXzY4QzEsIFJFRFdPT0QpCitDSElQU0VUKDB4NjhDNywgUkVEV09PRF82OEM3LCBSRURXT09EKQorQ0hJUFNFVCgweDY4QzgsIFJFRFdPT0RfNjhDOCwgUkVEV09PRCkKK0NISVBTRVQoMHg2OEM5LCBSRURXT09EXzY4QzksIFJFRFdPT0QpCitDSElQU0VUKDB4NjhEOCwgUkVEV09PRF82OEQ4LCBSRURXT09EKQorQ0hJUFNFVCgweDY4RDksIFJFRFdPT0RfNjhEOSwgUkVEV09PRCkKK0NISVBTRVQoMHg2OERBLCBSRURXT09EXzY4REEsIFJFRFdPT0QpCitDSElQU0VUKDB4NjhERSwgUkVEV09PRF82OERFLCBSRURXT09EKQorCitDSElQU0VUKDB4NjhBMCwgSlVOSVBFUl82OEEwLCBKVU5JUEVSKQorQ0hJUFNFVCgweDY4QTEsIEpVTklQRVJfNjhBMSwgSlVOSVBFUikKK0NISVBTRVQoMHg2OEE4LCBKVU5JUEVSXzY4QTgsIEpVTklQRVIpCitDSElQU0VUKDB4NjhBOSwgSlVOSVBFUl82OEE5LCBKVU5JUEVSKQorQ0hJUFNFVCgweDY4QjAsIEpVTklQRVJfNjhCMCwgSlVOSVBFUikKK0NISVBTRVQoMHg2OEI4LCBKVU5JUEVSXzY4QjgsIEpVTklQRVIpCitDSElQU0VUKDB4NjhCOSwgSlVOSVBFUl82OEI5LCBKVU5JUEVSKQorQ0hJUFNFVCgweDY4QkEsIEpVTklQRVJfNjhCQSwgSlVOSVBFUikKK0NISVBTRVQoMHg2OEJFLCBKVU5JUEVSXzY4QkUsIEpVTklQRVIpCitDSElQU0VUKDB4NjhCRiwgSlVOSVBFUl82OEJGLCBKVU5JUEVSKQorCitDSElQU0VUKDB4Njg4MCwgQ1lQUkVTU182ODgwLCBDWVBSRVNTKQorQ0hJUFNFVCgweDY4ODgsIENZUFJFU1NfNjg4OCwgQ1lQUkVTUykKK0NISVBTRVQoMHg2ODg5LCBDWVBSRVNTXzY4ODksIENZUFJFU1MpCitDSElQU0VUKDB4Njg4QSwgQ1lQUkVTU182ODhBLCBDWVBSRVNTKQorQ0hJUFNFVCgweDY4OEMsIENZUFJFU1NfNjg4QywgQ1lQUkVTUykKK0NISVBTRVQoMHg2ODhELCBDWVBSRVNTXzY4OEQsIENZUFJFU1MpCitDSElQU0VUKDB4Njg5OCwgQ1lQUkVTU182ODk4LCBDWVBSRVNTKQorQ0hJUFNFVCgweDY4OTksIENZUFJFU1NfNjg5OSwgQ1lQUkVTUykKK0NISVBTRVQoMHg2ODlCLCBDWVBSRVNTXzY4OUIsIENZUFJFU1MpCitDSElQU0VUKDB4Njg5RSwgQ1lQUkVTU182ODlFLCBDWVBSRVNTKQorCitDSElQU0VUKDB4Njg5QywgSEVNTE9DS182ODlDLCBIRU1MT0NLKQorQ0hJUFNFVCgweDY4OUQsIEhFTUxPQ0tfNjg5RCwgSEVNTE9DSykKKworQ0hJUFNFVCgweDk4MDIsIFBBTE1fOTgwMiwgUEFMTSkKK0NISVBTRVQoMHg5ODAzLCBQQUxNXzk4MDMsIFBBTE0pCitDSElQU0VUKDB4OTgwNCwgUEFMTV85ODA0LCBQQUxNKQorQ0hJUFNFVCgweDk4MDUsIFBBTE1fOTgwNSwgUEFMTSkKK0NISVBTRVQoMHg5ODA2LCBQQUxNXzk4MDYsIFBBTE0pCitDSElQU0VUKDB4OTgwNywgUEFMTV85ODA3LCBQQUxNKQorQ0hJUFNFVCgweDk4MDgsIFBBTE1fOTgwOCwgUEFMTSkKK0NISVBTRVQoMHg5ODA5LCBQQUxNXzk4MDksIFBBTE0pCitDSElQU0VUKDB4OTgwQSwgUEFMTV85ODBBLCBQQUxNKQorCitDSElQU0VUKDB4OTY0MCwgU1VNT185NjQwLCAgU1VNTykKK0NISVBTRVQoMHg5NjQxLCBTVU1PXzk2NDEsICBTVU1PKQorQ0hJUFNFVCgweDk2NDIsIFNVTU8yXzk2NDIsIFNVTU8yKQorQ0hJUFNFVCgweDk2NDMsIFNVTU8yXzk2NDMsIFNVTU8yKQorQ0hJUFNFVCgweDk2NDQsIFNVTU8yXzk2NDQsIFNVTU8yKQorQ0hJUFNFVCgweDk2NDUsIFNVTU8yXzk2NDUsIFNVTU8yKQorQ0hJUFNFVCgweDk2NDcsIFNVTU9fOTY0NywgIFNVTU8pCitDSElQU0VUKDB4OTY0OCwgU1VNT185NjQ4LCAgU1VNTykKK0NISVBTRVQoMHg5NjQ5LCBTVU1PMl85NjQ5LCBTVU1PMikKK0NISVBTRVQoMHg5NjRhLCBTVU1PXzk2NEEsICBTVU1PKQorQ0hJUFNFVCgweDk2NGIsIFNVTU9fOTY0QiwgIFNVTU8pCitDSElQU0VUKDB4OTY0YywgU1VNT185NjRDLCAgU1VNTykKK0NISVBTRVQoMHg5NjRlLCBTVU1PXzk2NEUsICBTVU1PKQorQ0hJUFNFVCgweDk2NGYsIFNVTU9fOTY0RiwgIFNVTU8pCisKK0NISVBTRVQoMHg2NzAwLCBDQVlNQU5fNjcwMCwgQ0FZTUFOKQorQ0hJUFNFVCgweDY3MDEsIENBWU1BTl82NzAxLCBDQVlNQU4pCitDSElQU0VUKDB4NjcwMiwgQ0FZTUFOXzY3MDIsIENBWU1BTikKK0NISVBTRVQoMHg2NzAzLCBDQVlNQU5fNjcwMywgQ0FZTUFOKQorQ0hJUFNFVCgweDY3MDQsIENBWU1BTl82NzA0LCBDQVlNQU4pCitDSElQU0VUKDB4NjcwNSwgQ0FZTUFOXzY3MDUsIENBWU1BTikKK0NISVBTRVQoMHg2NzA2LCBDQVlNQU5fNjcwNiwgQ0FZTUFOKQorQ0hJUFNFVCgweDY3MDcsIENBWU1BTl82NzA3LCBDQVlNQU4pCitDSElQU0VUKDB4NjcwOCwgQ0FZTUFOXzY3MDgsIENBWU1BTikKK0NISVBTRVQoMHg2NzA5LCBDQVlNQU5fNjcwOSwgQ0FZTUFOKQorQ0hJUFNFVCgweDY3MTgsIENBWU1BTl82NzE4LCBDQVlNQU4pCitDSElQU0VUKDB4NjcxOSwgQ0FZTUFOXzY3MTksIENBWU1BTikKK0NISVBTRVQoMHg2NzFDLCBDQVlNQU5fNjcxQywgQ0FZTUFOKQorQ0hJUFNFVCgweDY3MUQsIENBWU1BTl82NzFELCBDQVlNQU4pCitDSElQU0VUKDB4NjcxRiwgQ0FZTUFOXzY3MUYsIENBWU1BTikKKworQ0hJUFNFVCgweDY3MjAsIEJBUlRTXzY3MjAsIEJBUlRTKQorQ0hJUFNFVCgweDY3MjEsIEJBUlRTXzY3MjEsIEJBUlRTKQorQ0hJUFNFVCgweDY3MjIsIEJBUlRTXzY3MjIsIEJBUlRTKQorQ0hJUFNFVCgweDY3MjMsIEJBUlRTXzY3MjMsIEJBUlRTKQorQ0hJUFNFVCgweDY3MjQsIEJBUlRTXzY3MjQsIEJBUlRTKQorQ0hJUFNFVCgweDY3MjUsIEJBUlRTXzY3MjUsIEJBUlRTKQorQ0hJUFNFVCgweDY3MjYsIEJBUlRTXzY3MjYsIEJBUlRTKQorQ0hJUFNFVCgweDY3MjcsIEJBUlRTXzY3MjcsIEJBUlRTKQorQ0hJUFNFVCgweDY3MjgsIEJBUlRTXzY3MjgsIEJBUlRTKQorQ0hJUFNFVCgweDY3MjksIEJBUlRTXzY3MjksIEJBUlRTKQorQ0hJUFNFVCgweDY3MzgsIEJBUlRTXzY3MzgsIEJBUlRTKQorQ0hJUFNFVCgweDY3MzksIEJBUlRTXzY3MzksIEJBUlRTKQorQ0hJUFNFVCgweDY3M0UsIEJBUlRTXzY3M0UsIEJBUlRTKQorCitDSElQU0VUKDB4Njc0MCwgVFVSS1NfNjc0MCwgVFVSS1MpCitDSElQU0VUKDB4Njc0MSwgVFVSS1NfNjc0MSwgVFVSS1MpCitDSElQU0VUKDB4Njc0MiwgVFVSS1NfNjc0MiwgVFVSS1MpCitDSElQU0VUKDB4Njc0MywgVFVSS1NfNjc0MywgVFVSS1MpCitDSElQU0VUKDB4Njc0NCwgVFVSS1NfNjc0NCwgVFVSS1MpCitDSElQU0VUKDB4Njc0NSwgVFVSS1NfNjc0NSwgVFVSS1MpCitDSElQU0VUKDB4Njc0NiwgVFVSS1NfNjc0NiwgVFVSS1MpCitDSElQU0VUKDB4Njc0NywgVFVSS1NfNjc0NywgVFVSS1MpCitDSElQU0VUKDB4Njc0OCwgVFVSS1NfNjc0OCwgVFVSS1MpCitDSElQU0VUKDB4Njc0OSwgVFVSS1NfNjc0OSwgVFVSS1MpCitDSElQU0VUKDB4Njc0QSwgVFVSS1NfNjc0QSwgVFVSS1MpCitDSElQU0VUKDB4Njc1MCwgVFVSS1NfNjc1MCwgVFVSS1MpCitDSElQU0VUKDB4Njc1MSwgVFVSS1NfNjc1MSwgVFVSS1MpCitDSElQU0VUKDB4Njc1OCwgVFVSS1NfNjc1OCwgVFVSS1MpCitDSElQU0VUKDB4Njc1OSwgVFVSS1NfNjc1OSwgVFVSS1MpCitDSElQU0VUKDB4Njc1QiwgVFVSS1NfNjc1QiwgVFVSS1MpCitDSElQU0VUKDB4Njc1RCwgVFVSS1NfNjc1RCwgVFVSS1MpCitDSElQU0VUKDB4Njc1RiwgVFVSS1NfNjc1RiwgVFVSS1MpCitDSElQU0VUKDB4Njg0MCwgVFVSS1NfNjg0MCwgVFVSS1MpCitDSElQU0VUKDB4Njg0MSwgVFVSS1NfNjg0MSwgVFVSS1MpCitDSElQU0VUKDB4Njg0MiwgVFVSS1NfNjg0MiwgVFVSS1MpCitDSElQU0VUKDB4Njg0MywgVFVSS1NfNjg0MywgVFVSS1MpCitDSElQU0VUKDB4Njg0OSwgVFVSS1NfNjg0OSwgVFVSS1MpCitDSElQU0VUKDB4Njg1MCwgVFVSS1NfNjg1MCwgVFVSS1MpCitDSElQU0VUKDB4Njg1OCwgVFVSS1NfNjg1OCwgVFVSS1MpCitDSElQU0VUKDB4Njg1OSwgVFVSS1NfNjg1OSwgVFVSS1MpCisKK0NISVBTRVQoMHg2NzYwLCBDQUlDT1NfNjc2MCwgQ0FJQ09TKQorQ0hJUFNFVCgweDY3NjEsIENBSUNPU182NzYxLCBDQUlDT1MpCitDSElQU0VUKDB4Njc2MiwgQ0FJQ09TXzY3NjIsIENBSUNPUykKK0NISVBTRVQoMHg2NzYzLCBDQUlDT1NfNjc2MywgQ0FJQ09TKQorQ0hJUFNFVCgweDY3NjQsIENBSUNPU182NzY0LCBDQUlDT1MpCitDSElQU0VUKDB4Njc2NSwgQ0FJQ09TXzY3NjUsIENBSUNPUykKK0NISVBTRVQoMHg2NzY2LCBDQUlDT1NfNjc2NiwgQ0FJQ09TKQorQ0hJUFNFVCgweDY3NjcsIENBSUNPU182NzY3LCBDQUlDT1MpCitDSElQU0VUKDB4Njc2OCwgQ0FJQ09TXzY3NjgsIENBSUNPUykKK0NISVBTRVQoMHg2NzcwLCBDQUlDT1NfNjc3MCwgQ0FJQ09TKQorQ0hJUFNFVCgweDY3NzEsIENBSUNPU182NzcxLCBDQUlDT1MpCitDSElQU0VUKDB4Njc3MiwgQ0FJQ09TXzY3NzIsIENBSUNPUykKK0NISVBTRVQoMHg2Nzc4LCBDQUlDT1NfNjc3OCwgQ0FJQ09TKQorQ0hJUFNFVCgweDY3NzksIENBSUNPU182Nzc5LCBDQUlDT1MpCitDSElQU0VUKDB4Njc3QiwgQ0FJQ09TXzY3N0IsIENBSUNPUykKKworQ0hJUFNFVCgweDk5MDAsIEFSVUJBXzk5MDAsIEFSVUJBKQorQ0hJUFNFVCgweDk5MDEsIEFSVUJBXzk5MDEsIEFSVUJBKQorQ0hJUFNFVCgweDk5MDMsIEFSVUJBXzk5MDMsIEFSVUJBKQorQ0hJUFNFVCgweDk5MDQsIEFSVUJBXzk5MDQsIEFSVUJBKQorQ0hJUFNFVCgweDk5MDUsIEFSVUJBXzk5MDUsIEFSVUJBKQorQ0hJUFNFVCgweDk5MDYsIEFSVUJBXzk5MDYsIEFSVUJBKQorQ0hJUFNFVCgweDk5MDcsIEFSVUJBXzk5MDcsIEFSVUJBKQorQ0hJUFNFVCgweDk5MDgsIEFSVUJBXzk5MDgsIEFSVUJBKQorQ0hJUFNFVCgweDk5MDksIEFSVUJBXzk5MDksIEFSVUJBKQorQ0hJUFNFVCgweDk5MEEsIEFSVUJBXzk5MEEsIEFSVUJBKQorQ0hJUFNFVCgweDk5MEIsIEFSVUJBXzk5MEIsIEFSVUJBKQorQ0hJUFNFVCgweDk5MEMsIEFSVUJBXzk5MEMsIEFSVUJBKQorQ0hJUFNFVCgweDk5MEQsIEFSVUJBXzk5MEQsIEFSVUJBKQorQ0hJUFNFVCgweDk5MEUsIEFSVUJBXzk5MEUsIEFSVUJBKQorQ0hJUFNFVCgweDk5MEYsIEFSVUJBXzk5MEYsIEFSVUJBKQorQ0hJUFNFVCgweDk5MTAsIEFSVUJBXzk5MTAsIEFSVUJBKQorQ0hJUFNFVCgweDk5MTMsIEFSVUJBXzk5MTMsIEFSVUJBKQorQ0hJUFNFVCgweDk5MTcsIEFSVUJBXzk5MTcsIEFSVUJBKQorQ0hJUFNFVCgweDk5MTgsIEFSVUJBXzk5MTgsIEFSVUJBKQorQ0hJUFNFVCgweDk5MTksIEFSVUJBXzk5MTksIEFSVUJBKQorQ0hJUFNFVCgweDk5OTAsIEFSVUJBXzk5OTAsIEFSVUJBKQorQ0hJUFNFVCgweDk5OTEsIEFSVUJBXzk5OTEsIEFSVUJBKQorQ0hJUFNFVCgweDk5OTIsIEFSVUJBXzk5OTIsIEFSVUJBKQorQ0hJUFNFVCgweDk5OTMsIEFSVUJBXzk5OTMsIEFSVUJBKQorQ0hJUFNFVCgweDk5OTQsIEFSVUJBXzk5OTQsIEFSVUJBKQorQ0hJUFNFVCgweDk5OTUsIEFSVUJBXzk5OTUsIEFSVUJBKQorQ0hJUFNFVCgweDk5OTYsIEFSVUJBXzk5OTYsIEFSVUJBKQorQ0hJUFNFVCgweDk5OTcsIEFSVUJBXzk5OTcsIEFSVUJBKQorQ0hJUFNFVCgweDk5OTgsIEFSVUJBXzk5OTgsIEFSVUJBKQorQ0hJUFNFVCgweDk5OTksIEFSVUJBXzk5OTksIEFSVUJBKQorQ0hJUFNFVCgweDk5OUEsIEFSVUJBXzk5OUEsIEFSVUJBKQorQ0hJUFNFVCgweDk5OUIsIEFSVUJBXzk5OUIsIEFSVUJBKQorQ0hJUFNFVCgweDk5OUMsIEFSVUJBXzk5OUMsIEFSVUJBKQorQ0hJUFNFVCgweDk5OUQsIEFSVUJBXzk5OUQsIEFSVUJBKQorQ0hJUFNFVCgweDk5QTAsIEFSVUJBXzk5QTAsIEFSVUJBKQorQ0hJUFNFVCgweDk5QTIsIEFSVUJBXzk5QTIsIEFSVUJBKQorQ0hJUFNFVCgweDk5QTQsIEFSVUJBXzk5QTQsIEFSVUJBKQorCitDSElQU0VUKDB4Njc4MCwgVEFISVRJXzY3ODAsIFRBSElUSSkKK0NISVBTRVQoMHg2Nzg0LCBUQUhJVElfNjc4NCwgVEFISVRJKQorQ0hJUFNFVCgweDY3ODgsIFRBSElUSV82Nzg4LCBUQUhJVEkpCitDSElQU0VUKDB4Njc4QSwgVEFISVRJXzY3OEEsIFRBSElUSSkKK0NISVBTRVQoMHg2NzkwLCBUQUhJVElfNjc5MCwgVEFISVRJKQorQ0hJUFNFVCgweDY3OTEsIFRBSElUSV82NzkxLCBUQUhJVEkpCitDSElQU0VUKDB4Njc5MiwgVEFISVRJXzY3OTIsIFRBSElUSSkKK0NISVBTRVQoMHg2Nzk4LCBUQUhJVElfNjc5OCwgVEFISVRJKQorQ0hJUFNFVCgweDY3OTksIFRBSElUSV82Nzk5LCBUQUhJVEkpCitDSElQU0VUKDB4Njc5QSwgVEFISVRJXzY3OUEsIFRBSElUSSkKK0NISVBTRVQoMHg2NzlCLCBUQUhJVElfNjc5QiwgVEFISVRJKQorQ0hJUFNFVCgweDY3OUUsIFRBSElUSV82NzlFLCBUQUhJVEkpCitDSElQU0VUKDB4Njc5RiwgVEFISVRJXzY3OUYsIFRBSElUSSkKKworQ0hJUFNFVCgweDY4MDAsIFBJVENBSVJOXzY4MDAsIFBJVENBSVJOKQorQ0hJUFNFVCgweDY4MDEsIFBJVENBSVJOXzY4MDEsIFBJVENBSVJOKQorQ0hJUFNFVCgweDY4MDIsIFBJVENBSVJOXzY4MDIsIFBJVENBSVJOKQorQ0hJUFNFVCgweDY4MDYsIFBJVENBSVJOXzY4MDYsIFBJVENBSVJOKQorQ0hJUFNFVCgweDY4MDgsIFBJVENBSVJOXzY4MDgsIFBJVENBSVJOKQorQ0hJUFNFVCgweDY4MDksIFBJVENBSVJOXzY4MDksIFBJVENBSVJOKQorQ0hJUFNFVCgweDY4MTAsIFBJVENBSVJOXzY4MTAsIFBJVENBSVJOKQorQ0hJUFNFVCgweDY4MTEsIFBJVENBSVJOXzY4MTEsIFBJVENBSVJOKQorQ0hJUFNFVCgweDY4MTYsIFBJVENBSVJOXzY4MTYsIFBJVENBSVJOKQorQ0hJUFNFVCgweDY4MTcsIFBJVENBSVJOXzY4MTcsIFBJVENBSVJOKQorQ0hJUFNFVCgweDY4MTgsIFBJVENBSVJOXzY4MTgsIFBJVENBSVJOKQorQ0hJUFNFVCgweDY4MTksIFBJVENBSVJOXzY4MTksIFBJVENBSVJOKQorQ0hJUFNFVCgweDY4NEMsIFBJVENBSVJOXzY4NEMsIFBJVENBSVJOKQorCitDSElQU0VUKDB4NjgyMCwgVkVSREVfNjgyMCwgVkVSREUpCitDSElQU0VUKDB4NjgyMSwgVkVSREVfNjgyMSwgVkVSREUpCitDSElQU0VUKDB4NjgyMiwgVkVSREVfNjgyMiwgVkVSREUpCitDSElQU0VUKDB4NjgyMywgVkVSREVfNjgyMywgVkVSREUpCitDSElQU0VUKDB4NjgyNCwgVkVSREVfNjgyNCwgVkVSREUpCitDSElQU0VUKDB4NjgyNSwgVkVSREVfNjgyNSwgVkVSREUpCitDSElQU0VUKDB4NjgyNiwgVkVSREVfNjgyNiwgVkVSREUpCitDSElQU0VUKDB4NjgyNywgVkVSREVfNjgyNywgVkVSREUpCitDSElQU0VUKDB4NjgyOCwgVkVSREVfNjgyOCwgVkVSREUpCitDSElQU0VUKDB4NjgyOSwgVkVSREVfNjgyOSwgVkVSREUpCitDSElQU0VUKDB4NjgyQSwgVkVSREVfNjgyQSwgVkVSREUpCitDSElQU0VUKDB4NjgyQiwgVkVSREVfNjgyQiwgVkVSREUpCitDSElQU0VUKDB4NjgyQywgVkVSREVfNjgyQywgVkVSREUpCitDSElQU0VUKDB4NjgyRCwgVkVSREVfNjgyRCwgVkVSREUpCitDSElQU0VUKDB4NjgyRiwgVkVSREVfNjgyRiwgVkVSREUpCitDSElQU0VUKDB4NjgzMCwgVkVSREVfNjgzMCwgVkVSREUpCitDSElQU0VUKDB4NjgzMSwgVkVSREVfNjgzMSwgVkVSREUpCitDSElQU0VUKDB4NjgzNSwgVkVSREVfNjgzNSwgVkVSREUpCitDSElQU0VUKDB4NjgzNywgVkVSREVfNjgzNywgVkVSREUpCitDSElQU0VUKDB4NjgzOCwgVkVSREVfNjgzOCwgVkVSREUpCitDSElQU0VUKDB4NjgzOSwgVkVSREVfNjgzOSwgVkVSREUpCitDSElQU0VUKDB4NjgzQiwgVkVSREVfNjgzQiwgVkVSREUpCitDSElQU0VUKDB4NjgzRCwgVkVSREVfNjgzRCwgVkVSREUpCitDSElQU0VUKDB4NjgzRiwgVkVSREVfNjgzRiwgVkVSREUpCisKK0NISVBTRVQoMHg2NjAwLCBPTEFORF82NjAwLCBPTEFORCkKK0NISVBTRVQoMHg2NjAxLCBPTEFORF82NjAxLCBPTEFORCkKK0NISVBTRVQoMHg2NjAyLCBPTEFORF82NjAyLCBPTEFORCkKK0NISVBTRVQoMHg2NjAzLCBPTEFORF82NjAzLCBPTEFORCkKK0NISVBTRVQoMHg2NjA0LCBPTEFORF82NjA0LCBPTEFORCkKK0NISVBTRVQoMHg2NjA1LCBPTEFORF82NjA1LCBPTEFORCkKK0NISVBTRVQoMHg2NjA2LCBPTEFORF82NjA2LCBPTEFORCkKK0NISVBTRVQoMHg2NjA3LCBPTEFORF82NjA3LCBPTEFORCkKK0NISVBTRVQoMHg2NjA4LCBPTEFORF82NjA4LCBPTEFORCkKK0NISVBTRVQoMHg2NjEwLCBPTEFORF82NjEwLCBPTEFORCkKK0NISVBTRVQoMHg2NjExLCBPTEFORF82NjExLCBPTEFORCkKK0NISVBTRVQoMHg2NjEzLCBPTEFORF82NjEzLCBPTEFORCkKK0NISVBTRVQoMHg2NjE3LCBPTEFORF82NjE3LCBPTEFORCkKK0NISVBTRVQoMHg2NjIwLCBPTEFORF82NjIwLCBPTEFORCkKK0NISVBTRVQoMHg2NjIxLCBPTEFORF82NjIxLCBPTEFORCkKK0NISVBTRVQoMHg2NjIzLCBPTEFORF82NjIzLCBPTEFORCkKK0NISVBTRVQoMHg2NjMxLCBPTEFORF82NjMxLCBPTEFORCkKKworQ0hJUFNFVCgweDY2NjAsIEhBSU5BTl82NjYwLCBIQUlOQU4pCitDSElQU0VUKDB4NjY2MywgSEFJTkFOXzY2NjMsIEhBSU5BTikKK0NISVBTRVQoMHg2NjY0LCBIQUlOQU5fNjY2NCwgSEFJTkFOKQorQ0hJUFNFVCgweDY2NjUsIEhBSU5BTl82NjY1LCBIQUlOQU4pCitDSElQU0VUKDB4NjY2NywgSEFJTkFOXzY2NjcsIEhBSU5BTikKK0NISVBTRVQoMHg2NjZGLCBIQUlOQU5fNjY2RiwgSEFJTkFOKQorCitDSElQU0VUKDB4NjY0MCwgQk9OQUlSRV82NjQwLCBCT05BSVJFKQorQ0hJUFNFVCgweDY2NDEsIEJPTkFJUkVfNjY0MSwgQk9OQUlSRSkKK0NISVBTRVQoMHg2NjQ2LCBCT05BSVJFXzY2NDYsIEJPTkFJUkUpCitDSElQU0VUKDB4NjY0NywgQk9OQUlSRV82NjQ3LCBCT05BSVJFKQorQ0hJUFNFVCgweDY2NDksIEJPTkFJUkVfNjY0OSwgQk9OQUlSRSkKK0NISVBTRVQoMHg2NjUwLCBCT05BSVJFXzY2NTAsIEJPTkFJUkUpCitDSElQU0VUKDB4NjY1MSwgQk9OQUlSRV82NjUxLCBCT05BSVJFKQorQ0hJUFNFVCgweDY2NTgsIEJPTkFJUkVfNjY1OCwgQk9OQUlSRSkKK0NISVBTRVQoMHg2NjVDLCBCT05BSVJFXzY2NUMsIEJPTkFJUkUpCitDSElQU0VUKDB4NjY1RCwgQk9OQUlSRV82NjVELCBCT05BSVJFKQorQ0hJUFNFVCgweDY2NUYsIEJPTkFJUkVfNjY1RiwgQk9OQUlSRSkKKworQ0hJUFNFVCgweDk4MzAsIEtBQklOSV85ODMwLCBLQUJJTkkpCitDSElQU0VUKDB4OTgzMSwgS0FCSU5JXzk4MzEsIEtBQklOSSkKK0NISVBTRVQoMHg5ODMyLCBLQUJJTklfOTgzMiwgS0FCSU5JKQorQ0hJUFNFVCgweDk4MzMsIEtBQklOSV85ODMzLCBLQUJJTkkpCitDSElQU0VUKDB4OTgzNCwgS0FCSU5JXzk4MzQsIEtBQklOSSkKK0NISVBTRVQoMHg5ODM1LCBLQUJJTklfOTgzNSwgS0FCSU5JKQorQ0hJUFNFVCgweDk4MzYsIEtBQklOSV85ODM2LCBLQUJJTkkpCitDSElQU0VUKDB4OTgzNywgS0FCSU5JXzk4MzcsIEtBQklOSSkKK0NISVBTRVQoMHg5ODM4LCBLQUJJTklfOTgzOCwgS0FCSU5JKQorQ0hJUFNFVCgweDk4MzksIEtBQklOSV85ODM5LCBLQUJJTkkpCitDSElQU0VUKDB4OTgzQSwgS0FCSU5JXzk4M0EsIEtBQklOSSkKK0NISVBTRVQoMHg5ODNCLCBLQUJJTklfOTgzQiwgS0FCSU5JKQorQ0hJUFNFVCgweDk4M0MsIEtBQklOSV85ODNDLCBLQUJJTkkpCitDSElQU0VUKDB4OTgzRCwgS0FCSU5JXzk4M0QsIEtBQklOSSkKK0NISVBTRVQoMHg5ODNFLCBLQUJJTklfOTgzRSwgS0FCSU5JKQorQ0hJUFNFVCgweDk4M0YsIEtBQklOSV85ODNGLCBLQUJJTkkpCisKK0NISVBTRVQoMHg5ODUwLCBNVUxMSU5TXzk4NTAsIE1VTExJTlMpCitDSElQU0VUKDB4OTg1MSwgTVVMTElOU185ODUxLCBNVUxMSU5TKQorQ0hJUFNFVCgweDk4NTIsIE1VTExJTlNfOTg1MiwgTVVMTElOUykKK0NISVBTRVQoMHg5ODUzLCBNVUxMSU5TXzk4NTMsIE1VTExJTlMpCitDSElQU0VUKDB4OTg1NCwgTVVMTElOU185ODU0LCBNVUxMSU5TKQorQ0hJUFNFVCgweDk4NTUsIE1VTExJTlNfOTg1NSwgTVVMTElOUykKK0NISVBTRVQoMHg5ODU2LCBNVUxMSU5TXzk4NTYsIE1VTExJTlMpCitDSElQU0VUKDB4OTg1NywgTVVMTElOU185ODU3LCBNVUxMSU5TKQorQ0hJUFNFVCgweDk4NTgsIE1VTExJTlNfOTg1OCwgTVVMTElOUykKK0NISVBTRVQoMHg5ODU5LCBNVUxMSU5TXzk4NTksIE1VTExJTlMpCitDSElQU0VUKDB4OTg1QSwgTVVMTElOU185ODVBLCBNVUxMSU5TKQorQ0hJUFNFVCgweDk4NUIsIE1VTExJTlNfOTg1QiwgTVVMTElOUykKK0NISVBTRVQoMHg5ODVDLCBNVUxMSU5TXzk4NUMsIE1VTExJTlMpCitDSElQU0VUKDB4OTg1RCwgTVVMTElOU185ODVELCBNVUxMSU5TKQorQ0hJUFNFVCgweDk4NUUsIE1VTExJTlNfOTg1RSwgTVVMTElOUykKK0NISVBTRVQoMHg5ODVGLCBNVUxMSU5TXzk4NUYsIE1VTExJTlMpCisKK0NISVBTRVQoMHgxMzA0LCBLQVZFUklfMTMwNCwgS0FWRVJJKQorQ0hJUFNFVCgweDEzMDUsIEtBVkVSSV8xMzA1LCBLQVZFUkkpCitDSElQU0VUKDB4MTMwNiwgS0FWRVJJXzEzMDYsIEtBVkVSSSkKK0NISVBTRVQoMHgxMzA3LCBLQVZFUklfMTMwNywgS0FWRVJJKQorQ0hJUFNFVCgweDEzMDksIEtBVkVSSV8xMzA5LCBLQVZFUkkpCitDSElQU0VUKDB4MTMwQSwgS0FWRVJJXzEzMEEsIEtBVkVSSSkKK0NISVBTRVQoMHgxMzBCLCBLQVZFUklfMTMwQiwgS0FWRVJJKQorQ0hJUFNFVCgweDEzMEMsIEtBVkVSSV8xMzBDLCBLQVZFUkkpCitDSElQU0VUKDB4MTMwRCwgS0FWRVJJXzEzMEQsIEtBVkVSSSkKK0NISVBTRVQoMHgxMzBFLCBLQVZFUklfMTMwRSwgS0FWRVJJKQorQ0hJUFNFVCgweDEzMEYsIEtBVkVSSV8xMzBGLCBLQVZFUkkpCitDSElQU0VUKDB4MTMxMCwgS0FWRVJJXzEzMTAsIEtBVkVSSSkKK0NISVBTRVQoMHgxMzExLCBLQVZFUklfMTMxMSwgS0FWRVJJKQorQ0hJUFNFVCgweDEzMTIsIEtBVkVSSV8xMzEyLCBLQVZFUkkpCitDSElQU0VUKDB4MTMxMywgS0FWRVJJXzEzMTMsIEtBVkVSSSkKK0NISVBTRVQoMHgxMzE1LCBLQVZFUklfMTMxNSwgS0FWRVJJKQorQ0hJUFNFVCgweDEzMTYsIEtBVkVSSV8xMzE2LCBLQVZFUkkpCitDSElQU0VUKDB4MTMxNywgS0FWRVJJXzEzMTcsIEtBVkVSSSkKK0NISVBTRVQoMHgxMzE4LCBLQVZFUklfMTMxOCwgS0FWRVJJKQorQ0hJUFNFVCgweDEzMUIsIEtBVkVSSV8xMzFCLCBLQVZFUkkpCitDSElQU0VUKDB4MTMxQywgS0FWRVJJXzEzMUMsIEtBVkVSSSkKK0NISVBTRVQoMHgxMzFELCBLQVZFUklfMTMxRCwgS0FWRVJJKQorCitDSElQU0VUKDB4NjdBMCwgSEFXQUlJXzY3QTAsIEhBV0FJSSkKK0NISVBTRVQoMHg2N0ExLCBIQVdBSUlfNjdBMSwgSEFXQUlJKQorQ0hJUFNFVCgweDY3QTIsIEhBV0FJSV82N0EyLCBIQVdBSUkpCitDSElQU0VUKDB4NjdBOCwgSEFXQUlJXzY3QTgsIEhBV0FJSSkKK0NISVBTRVQoMHg2N0E5LCBIQVdBSUlfNjdBOSwgSEFXQUlJKQorQ0hJUFNFVCgweDY3QUEsIEhBV0FJSV82N0FBLCBIQVdBSUkpCitDSElQU0VUKDB4NjdCMCwgSEFXQUlJXzY3QjAsIEhBV0FJSSkKK0NISVBTRVQoMHg2N0IxLCBIQVdBSUlfNjdCMSwgSEFXQUlJKQorQ0hJUFNFVCgweDY3QjgsIEhBV0FJSV82N0I4LCBIQVdBSUkpCitDSElQU0VUKDB4NjdCOSwgSEFXQUlJXzY3QjksIEhBV0FJSSkKK0NISVBTRVQoMHg2N0JBLCBIQVdBSUlfNjdCQSwgSEFXQUlJKQorQ0hJUFNFVCgweDY3QkUsIEhBV0FJSV82N0JFLCBIQVdBSUkpCmRpZmYgLS1naXQgYS9yYWRlb24vcmFkZW9uLXN5bWJvbC1jaGVjayBiL3JhZGVvbi9yYWRlb24tc3ltYm9sLWNoZWNrCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBiZjJmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9yYWRlb24vcmFkZW9uLXN5bWJvbC1jaGVjawpAQCAtMCwwICsxLDYxIEBACisjIS9iaW4vYmFzaAorCisjIFRoZSBmb2xsb3dpbmcgc3ltYm9scyAocGFzdCB0aGUgZmlyc3QgZml2ZSkgYXJlIHRha2VuIGZyb20gdGhlIHB1YmxpYyBoZWFkZXJzLgorIyBBIGxpc3Qgb2YgdGhlIGxhdHRlciBzaG91bGQgYmUgYXZhaWxhYmxlIE1ha2VmaWxlLnNvdXJjZXMvTElCRFJNX1JBREVPTl9IX0ZJTEVTCisKK0ZVTkNTPSQobm0gLUQgLS1mb3JtYXQ9YnNkIC0tZGVmaW5lZC1vbmx5ICR7MS0ubGlicy9saWJkcm1fcmFkZW9uLnNvfSB8IGF3ayAne3ByaW50ICQzfSd8IHdoaWxlIHJlYWQgZnVuYzsgZG8KKyggZ3JlcCAtcSAiXiRmdW5jJCIgfHwgZWNobyAkZnVuYyApICA8PEVPRgorX19ic3Nfc3RhcnQKK19lZGF0YQorX2VuZAorX2ZpbmkKK19pbml0CityYWRlb25fYm9fZGVidWcKK3JhZGVvbl9ib19nZXRfaGFuZGxlCityYWRlb25fYm9fZ2V0X3NyY19kb21haW4KK3JhZGVvbl9ib19nZXRfdGlsaW5nCityYWRlb25fYm9faXNfYnVzeQorcmFkZW9uX2JvX2lzX3JlZmVyZW5jZWRfYnlfY3MKK3JhZGVvbl9ib19pc19zdGF0aWMKK3JhZGVvbl9ib19tYW5hZ2VyX2dlbV9jdG9yCityYWRlb25fYm9fbWFuYWdlcl9nZW1fZHRvcgorcmFkZW9uX2JvX21hcAorcmFkZW9uX2JvX29wZW4KK3JhZGVvbl9ib19yZWYKK3JhZGVvbl9ib19zZXRfdGlsaW5nCityYWRlb25fYm9fdW5tYXAKK3JhZGVvbl9ib191bnJlZgorcmFkZW9uX2JvX3dhaXQKK3JhZGVvbl9jc19iZWdpbgorcmFkZW9uX2NzX2NyZWF0ZQorcmFkZW9uX2NzX2Rlc3Ryb3kKK3JhZGVvbl9jc19lbWl0CityYWRlb25fY3NfZW5kCityYWRlb25fY3NfZXJhc2UKK3JhZGVvbl9jc19nZXRfaWQKK3JhZGVvbl9jc19tYW5hZ2VyX2dlbV9jdG9yCityYWRlb25fY3NfbWFuYWdlcl9nZW1fZHRvcgorcmFkZW9uX2NzX25lZWRfZmx1c2gKK3JhZGVvbl9jc19wcmludAorcmFkZW9uX2NzX3NldF9saW1pdAorcmFkZW9uX2NzX3NwYWNlX2FkZF9wZXJzaXN0ZW50X2JvCityYWRlb25fY3Nfc3BhY2VfY2hlY2sKK3JhZGVvbl9jc19zcGFjZV9jaGVja193aXRoX2JvCityYWRlb25fY3Nfc3BhY2VfcmVzZXRfYm9zCityYWRlb25fY3Nfc3BhY2Vfc2V0X2ZsdXNoCityYWRlb25fY3Nfd3JpdGVfcmVsb2MKK3JhZGVvbl9nZW1fYm9fb3Blbl9wcmltZQorcmFkZW9uX2dlbV9nZXRfa2VybmVsX25hbWUKK3JhZGVvbl9nZW1fZ2V0X3JlbG9jX2luX2NzCityYWRlb25fZ2VtX25hbWVfYm8KK3JhZGVvbl9nZW1fcHJpbWVfc2hhcmVfYm8KK3JhZGVvbl9nZW1fc2V0X2RvbWFpbgorcmFkZW9uX3N1cmZhY2VfYmVzdAorcmFkZW9uX3N1cmZhY2VfaW5pdAorcmFkZW9uX3N1cmZhY2VfbWFuYWdlcl9mcmVlCityYWRlb25fc3VyZmFjZV9tYW5hZ2VyX25ldworRU9GCitkb25lKQorCit0ZXN0ICEgLW4gIiRGVU5DUyIgfHwgZWNobyAkRlVOQ1MKK3Rlc3QgISAtbiAiJEZVTkNTIgpkaWZmIC0tZ2l0IGEvcmFkZW9uL3JhZGVvbl9iby5jIGIvcmFkZW9uL3JhZGVvbl9iby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0N2Y5MjgKLS0tIC9kZXYvbnVsbAorKysgYi9yYWRlb24vcmFkZW9uX2JvLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOCBEYXZlIEFpcmxpZQorICogQ29weXJpZ2h0IMKpIDIwMDggSsOpcsO0bWUgR2xpc3NlCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUworICogQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKi8KKy8qCisgKiBBdXRob3JzOgorICogICAgICBEYXZlIEFpcmxpZQorICogICAgICBKw6lyw7RtZSBHbGlzc2UgPGdsaXNzZUBmcmVlZGVza3RvcC5vcmc+CisgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaWJkcm1fbWFjcm9zLmg+CisjaW5jbHVkZSA8cmFkZW9uX2JvLmg+CisjaW5jbHVkZSA8cmFkZW9uX2JvX2ludC5oPgorCit2b2lkIHJhZGVvbl9ib19kZWJ1ZyhzdHJ1Y3QgcmFkZW9uX2JvICpibywgY29uc3QgY2hhciAqb3ApCit7CisgICAgc3RydWN0IHJhZGVvbl9ib19pbnQgKmJvaSA9IChzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqKWJvOworCisgICAgZnByaW50ZihzdGRlcnIsICIlcyAlcCAweCUwOFggMHglMDhYIDB4JTA4WFxuIiwKKyAgICAgICAgICAgIG9wLCBibywgYm8tPmhhbmRsZSwgYm9pLT5zaXplLCBib2ktPmNyZWYpOworfQorCitzdHJ1Y3QgcmFkZW9uX2JvICoKK3JhZGVvbl9ib19vcGVuKHN0cnVjdCByYWRlb25fYm9fbWFuYWdlciAqYm9tLCB1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IHNpemUsCisJICAgICAgIHVpbnQzMl90IGFsaWdubWVudCwgdWludDMyX3QgZG9tYWlucywgdWludDMyX3QgZmxhZ3MpCit7CisgICAgc3RydWN0IHJhZGVvbl9ibyAqYm87CisgICAgYm8gPSBib20tPmZ1bmNzLT5ib19vcGVuKGJvbSwgaGFuZGxlLCBzaXplLCBhbGlnbm1lbnQsIGRvbWFpbnMsIGZsYWdzKTsKKyAgICByZXR1cm4gYm87Cit9CisKK3ZvaWQgcmFkZW9uX2JvX3JlZihzdHJ1Y3QgcmFkZW9uX2JvICpibykKK3sKKyAgICBzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqYm9pID0gKHN0cnVjdCByYWRlb25fYm9faW50ICopYm87CisgICAgYm9pLT5jcmVmKys7CisgICAgYm9pLT5ib20tPmZ1bmNzLT5ib19yZWYoYm9pKTsKK30KKworc3RydWN0IHJhZGVvbl9ibyAqcmFkZW9uX2JvX3VucmVmKHN0cnVjdCByYWRlb25fYm8gKmJvKQoreworICAgIHN0cnVjdCByYWRlb25fYm9faW50ICpib2kgPSAoc3RydWN0IHJhZGVvbl9ib19pbnQgKilibzsKKyAgICBpZiAoYm8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBib2ktPmNyZWYtLTsKKyAgICByZXR1cm4gYm9pLT5ib20tPmZ1bmNzLT5ib191bnJlZihib2kpOworfQorCitpbnQgcmFkZW9uX2JvX21hcChzdHJ1Y3QgcmFkZW9uX2JvICpibywgaW50IHdyaXRlKQoreworICAgIHN0cnVjdCByYWRlb25fYm9faW50ICpib2kgPSAoc3RydWN0IHJhZGVvbl9ib19pbnQgKilibzsKKyAgICByZXR1cm4gYm9pLT5ib20tPmZ1bmNzLT5ib19tYXAoYm9pLCB3cml0ZSk7Cit9CisKK2ludCByYWRlb25fYm9fdW5tYXAoc3RydWN0IHJhZGVvbl9ibyAqYm8pCit7CisgICAgc3RydWN0IHJhZGVvbl9ib19pbnQgKmJvaSA9IChzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqKWJvOworICAgIHJldHVybiBib2ktPmJvbS0+ZnVuY3MtPmJvX3VubWFwKGJvaSk7Cit9CisKK2ludCByYWRlb25fYm9fd2FpdChzdHJ1Y3QgcmFkZW9uX2JvICpibykKK3sKKyAgICBzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqYm9pID0gKHN0cnVjdCByYWRlb25fYm9faW50ICopYm87CisgICAgaWYgKCFib2ktPmJvbS0+ZnVuY3MtPmJvX3dhaXQpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBib2ktPmJvbS0+ZnVuY3MtPmJvX3dhaXQoYm9pKTsKK30KKworaW50IHJhZGVvbl9ib19pc19idXN5KHN0cnVjdCByYWRlb25fYm8gKmJvLCB1aW50MzJfdCAqZG9tYWluKQoreworICAgIHN0cnVjdCByYWRlb25fYm9faW50ICpib2kgPSAoc3RydWN0IHJhZGVvbl9ib19pbnQgKilibzsKKyAgICByZXR1cm4gYm9pLT5ib20tPmZ1bmNzLT5ib19pc19idXN5KGJvaSwgZG9tYWluKTsKK30KKworaW50CityYWRlb25fYm9fc2V0X3RpbGluZyhzdHJ1Y3QgcmFkZW9uX2JvICpibywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRpbGluZ19mbGFncywgdWludDMyX3QgcGl0Y2gpCit7CisgICAgc3RydWN0IHJhZGVvbl9ib19pbnQgKmJvaSA9IChzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqKWJvOworICAgIHJldHVybiBib2ktPmJvbS0+ZnVuY3MtPmJvX3NldF90aWxpbmcoYm9pLCB0aWxpbmdfZmxhZ3MsIHBpdGNoKTsKK30KKworaW50CityYWRlb25fYm9fZ2V0X3RpbGluZyhzdHJ1Y3QgcmFkZW9uX2JvICpibywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp0aWxpbmdfZmxhZ3MsIHVpbnQzMl90ICpwaXRjaCkKK3sKKyAgICBzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqYm9pID0gKHN0cnVjdCByYWRlb25fYm9faW50ICopYm87CisgICAgcmV0dXJuIGJvaS0+Ym9tLT5mdW5jcy0+Ym9fZ2V0X3RpbGluZyhib2ksIHRpbGluZ19mbGFncywgcGl0Y2gpOworfQorCitpbnQgcmFkZW9uX2JvX2lzX3N0YXRpYyhzdHJ1Y3QgcmFkZW9uX2JvICpibykKK3sKKyAgICBzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqYm9pID0gKHN0cnVjdCByYWRlb25fYm9faW50ICopYm87CisgICAgaWYgKGJvaS0+Ym9tLT5mdW5jcy0+Ym9faXNfc3RhdGljKQorICAgICAgICByZXR1cm4gYm9pLT5ib20tPmZ1bmNzLT5ib19pc19zdGF0aWMoYm9pKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50CityYWRlb25fYm9faXNfcmVmZXJlbmNlZF9ieV9jcyhzdHJ1Y3QgcmFkZW9uX2JvICpibywgc3RydWN0IHJhZGVvbl9jcyAqY3MpCit7CisgICAgc3RydWN0IHJhZGVvbl9ib19pbnQgKmJvaSA9IChzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqKWJvOworICAgIHJldHVybiBib2ktPmNyZWYgPiAxOworfQorCit1aW50MzJfdCByYWRlb25fYm9fZ2V0X2hhbmRsZShzdHJ1Y3QgcmFkZW9uX2JvICpibykKK3sKKyAgICByZXR1cm4gYm8tPmhhbmRsZTsKK30KKwordWludDMyX3QgcmFkZW9uX2JvX2dldF9zcmNfZG9tYWluKHN0cnVjdCByYWRlb25fYm8gKmJvKQoreworICAgIHN0cnVjdCByYWRlb25fYm9faW50ICpib2kgPSAoc3RydWN0IHJhZGVvbl9ib19pbnQgKilibzsKKyAgICB1aW50MzJfdCBzcmNfZG9tYWluOworCisgICAgc3JjX2RvbWFpbiA9IGJvaS0+c3BhY2VfYWNjb3VudGVkICYgMHhmZmZmOworICAgIGlmICghc3JjX2RvbWFpbikKKyAgICAgICAgc3JjX2RvbWFpbiA9IGJvaS0+c3BhY2VfYWNjb3VudGVkID4+IDE2OworCisgICAgcmV0dXJuIHNyY19kb21haW47Cit9CmRpZmYgLS1naXQgYS9yYWRlb24vcmFkZW9uX2JvLmggYi9yYWRlb24vcmFkZW9uX2JvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0NzhhMAotLS0gL2Rldi9udWxsCisrKyBiL3JhZGVvbi9yYWRlb25fYm8uaApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDggSsOpcsO0bWUgR2xpc3NlCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUworICogQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKi8KKy8qCisgKiBBdXRob3JzOgorICogICAgICBKw6lyw7RtZSBHbGlzc2UgPGdsaXNzZUBmcmVlZGVza3RvcC5vcmc+CisgKi8KKyNpZm5kZWYgUkFERU9OX0JPX0gKKyNkZWZpbmUgUkFERU9OX0JPX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIGJvIG9iamVjdCAqLworI2RlZmluZSBSQURFT05fQk9fRkxBR1NfTUFDUk9fVElMRSAgMQorI2RlZmluZSBSQURFT05fQk9fRkxBR1NfTUlDUk9fVElMRSAgMgorI2RlZmluZSBSQURFT05fQk9fRkxBR1NfTUlDUk9fVElMRV9TUVVBUkUgMHgyMAorCitzdHJ1Y3QgcmFkZW9uX2JvX21hbmFnZXI7CitzdHJ1Y3QgcmFkZW9uX2NzOworCitzdHJ1Y3QgcmFkZW9uX2JvIHsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnB0cjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgZmxhZ3M7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIGhhbmRsZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgc2l6ZTsKK307CisKK3N0cnVjdCByYWRlb25fYm9fbWFuYWdlcjsKKwordm9pZCByYWRlb25fYm9fZGVidWcoc3RydWN0IHJhZGVvbl9ibyAqYm8sIGNvbnN0IGNoYXIgKm9wKTsKKworc3RydWN0IHJhZGVvbl9ibyAqcmFkZW9uX2JvX29wZW4oc3RydWN0IHJhZGVvbl9ib19tYW5hZ2VyICpib20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZG9tYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKKwordm9pZCByYWRlb25fYm9fcmVmKHN0cnVjdCByYWRlb25fYm8gKmJvKTsKK3N0cnVjdCByYWRlb25fYm8gKnJhZGVvbl9ib191bnJlZihzdHJ1Y3QgcmFkZW9uX2JvICpibyk7CitpbnQgcmFkZW9uX2JvX21hcChzdHJ1Y3QgcmFkZW9uX2JvICpibywgaW50IHdyaXRlKTsKK2ludCByYWRlb25fYm9fdW5tYXAoc3RydWN0IHJhZGVvbl9ibyAqYm8pOworaW50IHJhZGVvbl9ib193YWl0KHN0cnVjdCByYWRlb25fYm8gKmJvKTsKK2ludCByYWRlb25fYm9faXNfYnVzeShzdHJ1Y3QgcmFkZW9uX2JvICpibywgdWludDMyX3QgKmRvbWFpbik7CitpbnQgcmFkZW9uX2JvX3NldF90aWxpbmcoc3RydWN0IHJhZGVvbl9ibyAqYm8sIHVpbnQzMl90IHRpbGluZ19mbGFncywgdWludDMyX3QgcGl0Y2gpOworaW50IHJhZGVvbl9ib19nZXRfdGlsaW5nKHN0cnVjdCByYWRlb25fYm8gKmJvLCB1aW50MzJfdCAqdGlsaW5nX2ZsYWdzLCB1aW50MzJfdCAqcGl0Y2gpOworaW50IHJhZGVvbl9ib19pc19zdGF0aWMoc3RydWN0IHJhZGVvbl9ibyAqYm8pOworaW50IHJhZGVvbl9ib19pc19yZWZlcmVuY2VkX2J5X2NzKHN0cnVjdCByYWRlb25fYm8gKmJvLCBzdHJ1Y3QgcmFkZW9uX2NzICpjcyk7Cit1aW50MzJfdCByYWRlb25fYm9fZ2V0X2hhbmRsZShzdHJ1Y3QgcmFkZW9uX2JvICpibyk7Cit1aW50MzJfdCByYWRlb25fYm9fZ2V0X3NyY19kb21haW4oc3RydWN0IHJhZGVvbl9ibyAqYm8pOworI2VuZGlmCmRpZmYgLS1naXQgYS9yYWRlb24vcmFkZW9uX2JvX2dlbS5jIGIvcmFkZW9uL3JhZGVvbl9ib19nZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmQ0NTNkCi0tLSAvZGV2L251bGwKKysrIGIvcmFkZW9uL3JhZGVvbl9ib19nZW0uYwpAQCAtMCwwICsxLDQwNyBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA4IERhdmUgQWlybGllCisgKiBDb3B5cmlnaHQgwqkgMjAwOCBKw6lyw7RtZSBHbGlzc2UKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTCisgKiBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqLworLyoKKyAqIEF1dGhvcnM6CisgKiAgICAgIERhdmUgQWlybGllCisgKiAgICAgIErDqXLDtG1lIEdsaXNzZSA8Z2xpc3NlQGZyZWVkZXNrdG9wLm9yZz4KKyAqLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlICJsaWJkcm1fbWFjcm9zLmgiCisjaW5jbHVkZSAieGY4NmRybS5oIgorI2luY2x1ZGUgInhmODZhdG9taWMuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJyYWRlb25fZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uX2JvLmgiCisjaW5jbHVkZSAicmFkZW9uX2JvX2ludC5oIgorI2luY2x1ZGUgInJhZGVvbl9ib19nZW0uaCIKKyNpbmNsdWRlIDxmY250bC5oPgorc3RydWN0IHJhZGVvbl9ib19nZW0geworICAgIHN0cnVjdCByYWRlb25fYm9faW50ICAgIGJhc2U7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbmFtZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtYXBfY291bnQ7CisgICAgYXRvbWljX3QgICAgICAgICAgICAgICAgcmVsb2NfaW5fY3M7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnByaXZfcHRyOworfTsKKworc3RydWN0IGJvX21hbmFnZXJfZ2VtIHsKKyAgICBzdHJ1Y3QgcmFkZW9uX2JvX21hbmFnZXIgICAgYmFzZTsKK307CisKK3N0YXRpYyBpbnQgYm9fd2FpdChzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqYm9pKTsKKyAgICAKK3N0YXRpYyBzdHJ1Y3QgcmFkZW9uX2JvICpib19vcGVuKHN0cnVjdCByYWRlb25fYm9fbWFuYWdlciAqYm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRvbWFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncykKK3sKKyAgICBzdHJ1Y3QgcmFkZW9uX2JvX2dlbSAqYm87CisgICAgaW50IHI7CisKKyAgICBibyA9IChzdHJ1Y3QgcmFkZW9uX2JvX2dlbSopY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcmFkZW9uX2JvX2dlbSkpOworICAgIGlmIChibyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGJvLT5iYXNlLmJvbSA9IGJvbTsKKyAgICBiby0+YmFzZS5oYW5kbGUgPSAwOworICAgIGJvLT5iYXNlLnNpemUgPSBzaXplOworICAgIGJvLT5iYXNlLmFsaWdubWVudCA9IGFsaWdubWVudDsKKyAgICBiby0+YmFzZS5kb21haW5zID0gZG9tYWluczsKKyAgICBiby0+YmFzZS5mbGFncyA9IGZsYWdzOworICAgIGJvLT5iYXNlLnB0ciA9IE5VTEw7CisgICAgYXRvbWljX3NldCgmYm8tPnJlbG9jX2luX2NzLCAwKTsKKyAgICBiby0+bWFwX2NvdW50ID0gMDsKKyAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgIHN0cnVjdCBkcm1fZ2VtX29wZW4gb3Blbl9hcmc7CisKKyAgICAgICAgbWVtc2V0KCZvcGVuX2FyZywgMCwgc2l6ZW9mKG9wZW5fYXJnKSk7CisgICAgICAgIG9wZW5fYXJnLm5hbWUgPSBoYW5kbGU7CisgICAgICAgIHIgPSBkcm1Jb2N0bChib20tPmZkLCBEUk1fSU9DVExfR0VNX09QRU4sICZvcGVuX2FyZyk7CisgICAgICAgIGlmIChyICE9IDApIHsKKyAgICAgICAgICAgIGZyZWUoYm8pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYm8tPmJhc2UuaGFuZGxlID0gb3Blbl9hcmcuaGFuZGxlOworICAgICAgICBiby0+YmFzZS5zaXplID0gb3Blbl9hcmcuc2l6ZTsKKyAgICAgICAgYm8tPm5hbWUgPSBoYW5kbGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RydWN0IGRybV9yYWRlb25fZ2VtX2NyZWF0ZSBhcmdzOworCisgICAgICAgIGFyZ3Muc2l6ZSA9IHNpemU7CisgICAgICAgIGFyZ3MuYWxpZ25tZW50ID0gYWxpZ25tZW50OworICAgICAgICBhcmdzLmluaXRpYWxfZG9tYWluID0gYm8tPmJhc2UuZG9tYWluczsKKyAgICAgICAgYXJncy5mbGFncyA9IGZsYWdzOworICAgICAgICBhcmdzLmhhbmRsZSA9IDA7CisgICAgICAgIHIgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGJvbS0+ZmQsIERSTV9SQURFT05fR0VNX0NSRUFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyZ3MsIHNpemVvZihhcmdzKSk7CisgICAgICAgIGJvLT5iYXNlLmhhbmRsZSA9IGFyZ3MuaGFuZGxlOworICAgICAgICBpZiAocikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gYWxsb2NhdGUgOlxuIik7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgIHNpemUgICAgICA6ICVkIGJ5dGVzXG4iLCBzaXplKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgYWxpZ25tZW50IDogJWQgYnl0ZXNcbiIsIGFsaWdubWVudCk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgIGRvbWFpbnMgICA6ICVkXG4iLCBiby0+YmFzZS5kb21haW5zKTsKKyAgICAgICAgICAgIGZyZWUoYm8pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmFkZW9uX2JvX3JlZigoc3RydWN0IHJhZGVvbl9ibyopYm8pOworICAgIHJldHVybiAoc3RydWN0IHJhZGVvbl9ibyopYm87Cit9CisKK3N0YXRpYyB2b2lkIGJvX3JlZihzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqYm9pKQoreworfQorCitzdGF0aWMgc3RydWN0IHJhZGVvbl9ibyAqYm9fdW5yZWYoc3RydWN0IHJhZGVvbl9ib19pbnQgKmJvaSkKK3sKKyAgICBzdHJ1Y3QgcmFkZW9uX2JvX2dlbSAqYm9fZ2VtID0gKHN0cnVjdCByYWRlb25fYm9fZ2VtKilib2k7CisgICAgc3RydWN0IGRybV9nZW1fY2xvc2UgYXJnczsKKworICAgIGlmIChib2ktPmNyZWYpIHsKKyAgICAgICAgcmV0dXJuIChzdHJ1Y3QgcmFkZW9uX2JvICopYm9pOworICAgIH0KKyAgICBpZiAoYm9fZ2VtLT5wcml2X3B0cikgeworICAgICAgICBkcm1fbXVubWFwKGJvX2dlbS0+cHJpdl9wdHIsIGJvaS0+c2l6ZSk7CisgICAgfQorCisgICAgLyogWmVybyBvdXQgYXJncyB0byBtYWtlIHZhbGdyaW5kIGhhcHB5ICovCisgICAgbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCisgICAgLyogY2xvc2Ugb2JqZWN0ICovCisgICAgYXJncy5oYW5kbGUgPSBib2ktPmhhbmRsZTsKKyAgICBkcm1Jb2N0bChib2ktPmJvbS0+ZmQsIERSTV9JT0NUTF9HRU1fQ0xPU0UsICZhcmdzKTsKKyAgICBtZW1zZXQoYm9fZ2VtLCAwLCBzaXplb2Yoc3RydWN0IHJhZGVvbl9ib19nZW0pKTsKKyAgICBmcmVlKGJvX2dlbSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgYm9fbWFwKHN0cnVjdCByYWRlb25fYm9faW50ICpib2ksIGludCB3cml0ZSkKK3sKKyAgICBzdHJ1Y3QgcmFkZW9uX2JvX2dlbSAqYm9fZ2VtID0gKHN0cnVjdCByYWRlb25fYm9fZ2VtKilib2k7CisgICAgc3RydWN0IGRybV9yYWRlb25fZ2VtX21tYXAgYXJnczsKKyAgICBpbnQgcjsKKyAgICB2b2lkICpwdHI7CisKKyAgICBpZiAoYm9fZ2VtLT5tYXBfY291bnQrKyAhPSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoYm9fZ2VtLT5wcml2X3B0cikgeworICAgICAgICBnb3RvIHdhaXQ7CisgICAgfQorCisgICAgYm9pLT5wdHIgPSBOVUxMOworCisgICAgLyogWmVybyBvdXQgYXJncyB0byBtYWtlIHZhbGdyaW5kIGhhcHB5ICovCisgICAgbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworICAgIGFyZ3MuaGFuZGxlID0gYm9pLT5oYW5kbGU7CisgICAgYXJncy5vZmZzZXQgPSAwOworICAgIGFyZ3Muc2l6ZSA9ICh1aW50NjRfdClib2ktPnNpemU7CisgICAgciA9IGRybUNvbW1hbmRXcml0ZVJlYWQoYm9pLT5ib20tPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSTV9SQURFT05fR0VNX01NQVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFyZ3MpKTsKKyAgICBpZiAocikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yIG1hcHBpbmcgJXAgMHglMDhYIChlcnJvciA9ICVkKVxuIiwKKyAgICAgICAgICAgICAgICBib2ksIGJvaS0+aGFuZGxlLCByKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorICAgIHB0ciA9IGRybV9tbWFwKDAsIGFyZ3Muc2l6ZSwgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGJvaS0+Ym9tLT5mZCwgYXJncy5hZGRyX3B0cik7CisgICAgaWYgKHB0ciA9PSBNQVBfRkFJTEVEKQorICAgICAgICByZXR1cm4gLWVycm5vOworICAgIGJvX2dlbS0+cHJpdl9wdHIgPSBwdHI7Cit3YWl0OgorICAgIGJvaS0+cHRyID0gYm9fZ2VtLT5wcml2X3B0cjsKKyAgICByID0gYm9fd2FpdChib2kpOworICAgIGlmIChyKQorICAgICAgICByZXR1cm4gcjsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBib191bm1hcChzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqYm9pKQoreworICAgIHN0cnVjdCByYWRlb25fYm9fZ2VtICpib19nZW0gPSAoc3RydWN0IHJhZGVvbl9ib19nZW0qKWJvaTsKKworICAgIGlmICgtLWJvX2dlbS0+bWFwX2NvdW50ID4gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy9kcm1fbXVubWFwKGJvLT5wdHIsIGJvLT5zaXplKTsKKyAgICBib2ktPnB0ciA9IE5VTEw7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYm9fd2FpdChzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqYm9pKQoreworICAgIHN0cnVjdCBkcm1fcmFkZW9uX2dlbV93YWl0X2lkbGUgYXJnczsKKyAgICBpbnQgcmV0OworCisgICAgLyogWmVybyBvdXQgYXJncyB0byBtYWtlIHZhbGdyaW5kIGhhcHB5ICovCisgICAgbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworICAgIGFyZ3MuaGFuZGxlID0gYm9pLT5oYW5kbGU7CisgICAgZG8geworICAgICAgICByZXQgPSBkcm1Db21tYW5kV3JpdGUoYm9pLT5ib20tPmZkLCBEUk1fUkFERU9OX0dFTV9XQUlUX0lETEUsCisJCQkgICAgICAmYXJncywgc2l6ZW9mKGFyZ3MpKTsKKyAgICB9IHdoaWxlIChyZXQgPT0gLUVCVVNZKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJvX2lzX2J1c3koc3RydWN0IHJhZGVvbl9ib19pbnQgKmJvaSwgdWludDMyX3QgKmRvbWFpbikKK3sKKyAgICBzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fYnVzeSBhcmdzOworICAgIGludCByZXQ7CisKKyAgICBhcmdzLmhhbmRsZSA9IGJvaS0+aGFuZGxlOworICAgIGFyZ3MuZG9tYWluID0gMDsKKworICAgIHJldCA9IGRybUNvbW1hbmRXcml0ZVJlYWQoYm9pLT5ib20tPmZkLCBEUk1fUkFERU9OX0dFTV9CVVNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyZ3MsIHNpemVvZihhcmdzKSk7CisKKyAgICAqZG9tYWluID0gYXJncy5kb21haW47CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBib19zZXRfdGlsaW5nKHN0cnVjdCByYWRlb25fYm9faW50ICpib2ksIHVpbnQzMl90IHRpbGluZ19mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwaXRjaCkKK3sKKyAgICBzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fc2V0X3RpbGluZyBhcmdzOworICAgIGludCByOworCisgICAgYXJncy5oYW5kbGUgPSBib2ktPmhhbmRsZTsKKyAgICBhcmdzLnRpbGluZ19mbGFncyA9IHRpbGluZ19mbGFnczsKKyAgICBhcmdzLnBpdGNoID0gcGl0Y2g7CisKKyAgICByID0gZHJtQ29tbWFuZFdyaXRlUmVhZChib2ktPmJvbS0+ZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJNX1JBREVPTl9HRU1fU0VUX1RJTElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXJncykpOworICAgIHJldHVybiByOworfQorCitzdGF0aWMgaW50IGJvX2dldF90aWxpbmcoc3RydWN0IHJhZGVvbl9ib19pbnQgKmJvaSwgdWludDMyX3QgKnRpbGluZ19mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcGl0Y2gpCit7CisgICAgc3RydWN0IGRybV9yYWRlb25fZ2VtX3NldF90aWxpbmcgYXJncyA9IHt9OworICAgIGludCByOworCisgICAgYXJncy5oYW5kbGUgPSBib2ktPmhhbmRsZTsKKworICAgIHIgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGJvaS0+Ym9tLT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUk1fUkFERU9OX0dFTV9HRVRfVElMSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcmdzKSk7CisKKyAgICBpZiAocikKKyAgICAgICAgcmV0dXJuIHI7CisKKyAgICAqdGlsaW5nX2ZsYWdzID0gYXJncy50aWxpbmdfZmxhZ3M7CisgICAgKnBpdGNoID0gYXJncy5waXRjaDsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByYWRlb25fYm9fZnVuY3MgYm9fZ2VtX2Z1bmNzID0geworICAgIC5ib19vcGVuID0gYm9fb3BlbiwKKyAgICAuYm9fcmVmID0gYm9fcmVmLAorICAgIC5ib191bnJlZiA9IGJvX3VucmVmLAorICAgIC5ib19tYXAgPSBib19tYXAsCisgICAgLmJvX3VubWFwID0gYm9fdW5tYXAsCisgICAgLmJvX3dhaXQgPSBib193YWl0LAorICAgIC5ib19pc19zdGF0aWMgPSBOVUxMLAorICAgIC5ib19zZXRfdGlsaW5nID0gYm9fc2V0X3RpbGluZywKKyAgICAuYm9fZ2V0X3RpbGluZyA9IGJvX2dldF90aWxpbmcsCisgICAgLmJvX2lzX2J1c3kgPSBib19pc19idXN5LAorICAgIC5ib19pc19yZWZlcmVuY2VkX2J5X2NzID0gTlVMTCwKK307CisKK3N0cnVjdCByYWRlb25fYm9fbWFuYWdlciAqcmFkZW9uX2JvX21hbmFnZXJfZ2VtX2N0b3IoaW50IGZkKQoreworICAgIHN0cnVjdCBib19tYW5hZ2VyX2dlbSAqYm9tZzsKKworICAgIGJvbWcgPSAoc3RydWN0IGJvX21hbmFnZXJfZ2VtKiljYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBib19tYW5hZ2VyX2dlbSkpOworICAgIGlmIChib21nID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGJvbWctPmJhc2UuZnVuY3MgPSAmYm9fZ2VtX2Z1bmNzOworICAgIGJvbWctPmJhc2UuZmQgPSBmZDsKKyAgICByZXR1cm4gKHN0cnVjdCByYWRlb25fYm9fbWFuYWdlciopYm9tZzsKK30KKwordm9pZCByYWRlb25fYm9fbWFuYWdlcl9nZW1fZHRvcihzdHJ1Y3QgcmFkZW9uX2JvX21hbmFnZXIgKmJvbSkKK3sKKyAgICBzdHJ1Y3QgYm9fbWFuYWdlcl9nZW0gKmJvbWcgPSAoc3RydWN0IGJvX21hbmFnZXJfZ2VtKilib207CisKKyAgICBpZiAoYm9tID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmcmVlKGJvbWcpOworfQorCit1aW50MzJfdAorcmFkZW9uX2dlbV9uYW1lX2JvKHN0cnVjdCByYWRlb25fYm8gKmJvKQoreworICAgIHN0cnVjdCByYWRlb25fYm9fZ2VtICpib19nZW0gPSAoc3RydWN0IHJhZGVvbl9ib19nZW0qKWJvOworICAgIHJldHVybiBib19nZW0tPm5hbWU7Cit9CisKK3ZvaWQgKgorcmFkZW9uX2dlbV9nZXRfcmVsb2NfaW5fY3Moc3RydWN0IHJhZGVvbl9ibyAqYm8pCit7CisgICAgc3RydWN0IHJhZGVvbl9ib19nZW0gKmJvX2dlbSA9IChzdHJ1Y3QgcmFkZW9uX2JvX2dlbSopYm87CisgICAgcmV0dXJuICZib19nZW0tPnJlbG9jX2luX2NzOworfQorCitpbnQKK3JhZGVvbl9nZW1fZ2V0X2tlcm5lbF9uYW1lKHN0cnVjdCByYWRlb25fYm8gKmJvLCB1aW50MzJfdCAqbmFtZSkKK3sKKyAgICBzdHJ1Y3QgcmFkZW9uX2JvX2dlbSAqYm9fZ2VtID0gKHN0cnVjdCByYWRlb25fYm9fZ2VtKilibzsKKyAgICBzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqYm9pID0gKHN0cnVjdCByYWRlb25fYm9faW50ICopYm87CisgICAgc3RydWN0IGRybV9nZW1fZmxpbmsgZmxpbms7CisgICAgaW50IHI7CisKKyAgICBpZiAoYm9fZ2VtLT5uYW1lKSB7CisgICAgICAgICpuYW1lID0gYm9fZ2VtLT5uYW1lOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZmxpbmsuaGFuZGxlID0gYm8tPmhhbmRsZTsKKyAgICByID0gZHJtSW9jdGwoYm9pLT5ib20tPmZkLCBEUk1fSU9DVExfR0VNX0ZMSU5LLCAmZmxpbmspOworICAgIGlmIChyKSB7CisgICAgICAgIHJldHVybiByOworICAgIH0KKyAgICBib19nZW0tPm5hbWUgPSBmbGluay5uYW1lOworICAgICpuYW1lID0gZmxpbmsubmFtZTsKKyAgICByZXR1cm4gMDsKK30KKworaW50CityYWRlb25fZ2VtX3NldF9kb21haW4oc3RydWN0IHJhZGVvbl9ibyAqYm8sIHVpbnQzMl90IHJlYWRfZG9tYWlucywgdWludDMyX3Qgd3JpdGVfZG9tYWluKQoreworICAgIHN0cnVjdCByYWRlb25fYm9faW50ICpib2kgPSAoc3RydWN0IHJhZGVvbl9ib19pbnQgKilibzsKKyAgICBzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fc2V0X2RvbWFpbiBhcmdzOworICAgIGludCByOworCisgICAgYXJncy5oYW5kbGUgPSBiby0+aGFuZGxlOworICAgIGFyZ3MucmVhZF9kb21haW5zID0gcmVhZF9kb21haW5zOworICAgIGFyZ3Mud3JpdGVfZG9tYWluID0gd3JpdGVfZG9tYWluOworCisgICAgciA9IGRybUNvbW1hbmRXcml0ZVJlYWQoYm9pLT5ib20tPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSTV9SQURFT05fR0VNX1NFVF9ET01BSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFyZ3MpKTsKKyAgICByZXR1cm4gcjsKK30KKworaW50IHJhZGVvbl9nZW1fcHJpbWVfc2hhcmVfYm8oc3RydWN0IHJhZGVvbl9ibyAqYm8sIGludCAqaGFuZGxlKQoreworICAgIHN0cnVjdCByYWRlb25fYm9fZ2VtICpib19nZW0gPSAoc3RydWN0IHJhZGVvbl9ib19nZW0qKWJvOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBkcm1QcmltZUhhbmRsZVRvRkQoYm9fZ2VtLT5iYXNlLmJvbS0+ZmQsIGJvLT5oYW5kbGUsIERSTV9DTE9FWEVDLCBoYW5kbGUpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0cnVjdCByYWRlb25fYm8gKgorcmFkZW9uX2dlbV9ib19vcGVuX3ByaW1lKHN0cnVjdCByYWRlb25fYm9fbWFuYWdlciAqYm9tLCBpbnQgZmRfaGFuZGxlLCB1aW50MzJfdCBzaXplKQoreworICAgIHN0cnVjdCByYWRlb25fYm9fZ2VtICpibzsKKyAgICBpbnQgcjsKKyAgICB1aW50MzJfdCBoYW5kbGU7CisKKyAgICBibyA9IChzdHJ1Y3QgcmFkZW9uX2JvX2dlbSopY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcmFkZW9uX2JvX2dlbSkpOworICAgIGlmIChibyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGJvLT5iYXNlLmJvbSA9IGJvbTsKKyAgICBiby0+YmFzZS5oYW5kbGUgPSAwOworICAgIGJvLT5iYXNlLnNpemUgPSBzaXplOworICAgIGJvLT5iYXNlLmFsaWdubWVudCA9IDA7CisgICAgYm8tPmJhc2UuZG9tYWlucyA9IFJBREVPTl9HRU1fRE9NQUlOX0dUVDsKKyAgICBiby0+YmFzZS5mbGFncyA9IDA7CisgICAgYm8tPmJhc2UucHRyID0gTlVMTDsKKyAgICBhdG9taWNfc2V0KCZiby0+cmVsb2NfaW5fY3MsIDApOworICAgIGJvLT5tYXBfY291bnQgPSAwOworCisgICAgciA9IGRybVByaW1lRkRUb0hhbmRsZShib20tPmZkLCBmZF9oYW5kbGUsICZoYW5kbGUpOworICAgIGlmIChyICE9IDApIHsKKwlmcmVlKGJvKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBiby0+YmFzZS5oYW5kbGUgPSBoYW5kbGU7CisgICAgYm8tPm5hbWUgPSBoYW5kbGU7CisKKyAgICByYWRlb25fYm9fcmVmKChzdHJ1Y3QgcmFkZW9uX2JvICopYm8pOworICAgIHJldHVybiAoc3RydWN0IHJhZGVvbl9ibyAqKWJvOworCit9CmRpZmYgLS1naXQgYS9yYWRlb24vcmFkZW9uX2JvX2dlbS5oIGIvcmFkZW9uL3JhZGVvbl9ib19nZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODk2NWYzCi0tLSAvZGV2L251bGwKKysrIGIvcmFkZW9uL3JhZGVvbl9ib19nZW0uaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDggRGF2ZSBBaXJsaWUKKyAqIENvcHlyaWdodCDCqSAyMDA4IErDqXLDtG1lIEdsaXNzZQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMKKyAqIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICovCisvKgorICogQXV0aG9yczoKKyAqICAgICAgRGF2ZSBBaXJsaWUKKyAqICAgICAgSsOpcsO0bWUgR2xpc3NlIDxnbGlzc2VAZnJlZWRlc2t0b3Aub3JnPgorICovCisjaWZuZGVmIFJBREVPTl9CT19HRU1fSAorI2RlZmluZSBSQURFT05fQk9fR0VNX0gKKworI2luY2x1ZGUgInJhZGVvbl9iby5oIgorCitzdHJ1Y3QgcmFkZW9uX2JvX21hbmFnZXIgKnJhZGVvbl9ib19tYW5hZ2VyX2dlbV9jdG9yKGludCBmZCk7Cit2b2lkIHJhZGVvbl9ib19tYW5hZ2VyX2dlbV9kdG9yKHN0cnVjdCByYWRlb25fYm9fbWFuYWdlciAqYm9tKTsKKwordWludDMyX3QgcmFkZW9uX2dlbV9uYW1lX2JvKHN0cnVjdCByYWRlb25fYm8gKmJvKTsKK3ZvaWQgKnJhZGVvbl9nZW1fZ2V0X3JlbG9jX2luX2NzKHN0cnVjdCByYWRlb25fYm8gKmJvKTsKK2ludCByYWRlb25fZ2VtX3NldF9kb21haW4oc3RydWN0IHJhZGVvbl9ibyAqYm8sIHVpbnQzMl90IHJlYWRfZG9tYWlucywgdWludDMyX3Qgd3JpdGVfZG9tYWluKTsKK2ludCByYWRlb25fZ2VtX2dldF9rZXJuZWxfbmFtZShzdHJ1Y3QgcmFkZW9uX2JvICpibywgdWludDMyX3QgKm5hbWUpOworaW50IHJhZGVvbl9nZW1fcHJpbWVfc2hhcmVfYm8oc3RydWN0IHJhZGVvbl9ibyAqYm8sIGludCAqaGFuZGxlKTsKK3N0cnVjdCByYWRlb25fYm8gKnJhZGVvbl9nZW1fYm9fb3Blbl9wcmltZShzdHJ1Y3QgcmFkZW9uX2JvX21hbmFnZXIgKmJvbSwKKwkJCQkJICAgaW50IGZkX2hhbmRsZSwKKwkJCQkJICAgdWludDMyX3Qgc2l6ZSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3JhZGVvbi9yYWRlb25fYm9faW50LmggYi9yYWRlb24vcmFkZW9uX2JvX2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOTgxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9yYWRlb24vcmFkZW9uX2JvX2ludC5oCkBAIC0wLDAgKzEsNDUgQEAKKyNpZm5kZWYgUkFERU9OX0JPX0lOVAorI2RlZmluZSBSQURFT05fQk9fSU5UCisKK3N0cnVjdCByYWRlb25fYm9fbWFuYWdlciB7CisgICAgY29uc3Qgc3RydWN0IHJhZGVvbl9ib19mdW5jcyAqZnVuY3M7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZmQ7Cit9OworCitzdHJ1Y3QgcmFkZW9uX2JvX2ludCB7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICpwdHI7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIGZsYWdzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBoYW5kbGU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIHNpemU7CisgICAgLyogcHJpdmF0ZSBtZW1iZXJzICovCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgZG9tYWluczsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgY3JlZjsKKyAgICBzdHJ1Y3QgcmFkZW9uX2JvX21hbmFnZXIgICAgKmJvbTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgc3BhY2VfYWNjb3VudGVkOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkX2luX2NzOworfTsKKworLyogYm8gZnVuY3Rpb25zICovCitzdHJ1Y3QgcmFkZW9uX2JvX2Z1bmNzIHsKKyAgICBzdHJ1Y3QgcmFkZW9uX2JvICooKmJvX29wZW4pKHN0cnVjdCByYWRlb25fYm9fbWFuYWdlciAqYm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRvbWFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7CisgICAgdm9pZCAoKmJvX3JlZikoc3RydWN0IHJhZGVvbl9ib19pbnQgKmJvKTsKKyAgICBzdHJ1Y3QgcmFkZW9uX2JvICooKmJvX3VucmVmKShzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqYm8pOworICAgIGludCAoKmJvX21hcCkoc3RydWN0IHJhZGVvbl9ib19pbnQgKmJvLCBpbnQgd3JpdGUpOworICAgIGludCAoKmJvX3VubWFwKShzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqYm8pOworICAgIGludCAoKmJvX3dhaXQpKHN0cnVjdCByYWRlb25fYm9faW50ICpibyk7CisgICAgaW50ICgqYm9faXNfc3RhdGljKShzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqYm8pOworICAgIGludCAoKmJvX3NldF90aWxpbmcpKHN0cnVjdCByYWRlb25fYm9faW50ICpibywgdWludDMyX3QgdGlsaW5nX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBpdGNoKTsKKyAgICBpbnQgKCpib19nZXRfdGlsaW5nKShzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqYm8sIHVpbnQzMl90ICp0aWxpbmdfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBpdGNoKTsKKyAgICBpbnQgKCpib19pc19idXN5KShzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqYm8sIHVpbnQzMl90ICpkb21haW4pOworICAgIGludCAoKmJvX2lzX3JlZmVyZW5jZWRfYnlfY3MpKHN0cnVjdCByYWRlb25fYm9faW50ICpibywgc3RydWN0IHJhZGVvbl9jcyAqY3MpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9yYWRlb24vcmFkZW9uX2NzLmMgYi9yYWRlb24vcmFkZW9uX2NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmYjg2OQotLS0gL2Rldi9udWxsCisrKyBiL3JhZGVvbi9yYWRlb25fY3MuYwpAQCAtMCwwICsxLDk4IEBACisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisjaW5jbHVkZSAibGliZHJtX21hY3Jvcy5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAicmFkZW9uX2NzLmgiCisjaW5jbHVkZSAicmFkZW9uX2NzX2ludC5oIgorCitzdHJ1Y3QgcmFkZW9uX2NzICoKK3JhZGVvbl9jc19jcmVhdGUoc3RydWN0IHJhZGVvbl9jc19tYW5hZ2VyICpjc20sIHVpbnQzMl90IG5kdykKK3sKKyAgICBzdHJ1Y3QgcmFkZW9uX2NzX2ludCAqY3NpID0gY3NtLT5mdW5jcy0+Y3NfY3JlYXRlKGNzbSwgbmR3KTsKKyAgICByZXR1cm4gKHN0cnVjdCByYWRlb25fY3MgKiljc2k7Cit9CisKK2ludAorcmFkZW9uX2NzX3dyaXRlX3JlbG9jKHN0cnVjdCByYWRlb25fY3MgKmNzLCBzdHJ1Y3QgcmFkZW9uX2JvICpibywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWFkX2RvbWFpbiwgdWludDMyX3Qgd3JpdGVfZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKQoreworICAgIHN0cnVjdCByYWRlb25fY3NfaW50ICpjc2kgPSAoc3RydWN0IHJhZGVvbl9jc19pbnQgKiljczsKKworICAgIHJldHVybiBjc2ktPmNzbS0+ZnVuY3MtPmNzX3dyaXRlX3JlbG9jKGNzaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX2RvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9kb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworfQorCitpbnQKK3JhZGVvbl9jc19iZWdpbihzdHJ1Y3QgcmFkZW9uX2NzICpjcywgdWludDMyX3QgbmR3LAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQoreworICAgIHN0cnVjdCByYWRlb25fY3NfaW50ICpjc2kgPSAoc3RydWN0IHJhZGVvbl9jc19pbnQgKiljczsKKyAgICByZXR1cm4gY3NpLT5jc20tPmZ1bmNzLT5jc19iZWdpbihjc2ksIG5kdywgZmlsZSwgZnVuYywgbGluZSk7Cit9CisKK2ludAorcmFkZW9uX2NzX2VuZChzdHJ1Y3QgcmFkZW9uX2NzICpjcywKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqZnVuYywgaW50IGxpbmUpCit7CisgICAgc3RydWN0IHJhZGVvbl9jc19pbnQgKmNzaSA9IChzdHJ1Y3QgcmFkZW9uX2NzX2ludCAqKWNzOworICAgIHJldHVybiBjc2ktPmNzbS0+ZnVuY3MtPmNzX2VuZChjc2ksIGZpbGUsIGZ1bmMsIGxpbmUpOworfQorCitpbnQgcmFkZW9uX2NzX2VtaXQoc3RydWN0IHJhZGVvbl9jcyAqY3MpCit7CisgICAgc3RydWN0IHJhZGVvbl9jc19pbnQgKmNzaSA9IChzdHJ1Y3QgcmFkZW9uX2NzX2ludCAqKWNzOworICAgIHJldHVybiBjc2ktPmNzbS0+ZnVuY3MtPmNzX2VtaXQoY3NpKTsKK30KKworaW50IHJhZGVvbl9jc19kZXN0cm95KHN0cnVjdCByYWRlb25fY3MgKmNzKQoreworICAgIHN0cnVjdCByYWRlb25fY3NfaW50ICpjc2kgPSAoc3RydWN0IHJhZGVvbl9jc19pbnQgKiljczsKKyAgICByZXR1cm4gY3NpLT5jc20tPmZ1bmNzLT5jc19kZXN0cm95KGNzaSk7Cit9CisKK2ludCByYWRlb25fY3NfZXJhc2Uoc3RydWN0IHJhZGVvbl9jcyAqY3MpCit7CisgICAgc3RydWN0IHJhZGVvbl9jc19pbnQgKmNzaSA9IChzdHJ1Y3QgcmFkZW9uX2NzX2ludCAqKWNzOworICAgIHJldHVybiBjc2ktPmNzbS0+ZnVuY3MtPmNzX2VyYXNlKGNzaSk7Cit9CisKK2ludCByYWRlb25fY3NfbmVlZF9mbHVzaChzdHJ1Y3QgcmFkZW9uX2NzICpjcykKK3sKKyAgICBzdHJ1Y3QgcmFkZW9uX2NzX2ludCAqY3NpID0gKHN0cnVjdCByYWRlb25fY3NfaW50ICopY3M7CisgICAgcmV0dXJuIGNzaS0+Y3NtLT5mdW5jcy0+Y3NfbmVlZF9mbHVzaChjc2kpOworfQorCit2b2lkIHJhZGVvbl9jc19wcmludChzdHJ1Y3QgcmFkZW9uX2NzICpjcywgRklMRSAqZmlsZSkKK3sKKyAgICBzdHJ1Y3QgcmFkZW9uX2NzX2ludCAqY3NpID0gKHN0cnVjdCByYWRlb25fY3NfaW50ICopY3M7CisgICAgY3NpLT5jc20tPmZ1bmNzLT5jc19wcmludChjc2ksIGZpbGUpOworfQorCit2b2lkCityYWRlb25fY3Nfc2V0X2xpbWl0KHN0cnVjdCByYWRlb25fY3MgKmNzLCB1aW50MzJfdCBkb21haW4sIHVpbnQzMl90IGxpbWl0KQoreworICAgIHN0cnVjdCByYWRlb25fY3NfaW50ICpjc2kgPSAoc3RydWN0IHJhZGVvbl9jc19pbnQgKiljczsKKyAgICBpZiAoZG9tYWluID09IFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0pCisgICAgICAgIGNzaS0+Y3NtLT52cmFtX2xpbWl0ID0gbGltaXQ7CisgICAgZWxzZQorICAgICAgICBjc2ktPmNzbS0+Z2FydF9saW1pdCA9IGxpbWl0OworfQorCit2b2lkIHJhZGVvbl9jc19zcGFjZV9zZXRfZmx1c2goc3RydWN0IHJhZGVvbl9jcyAqY3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmZuKSh2b2lkICopLCB2b2lkICpkYXRhKQoreworICAgIHN0cnVjdCByYWRlb25fY3NfaW50ICpjc2kgPSAoc3RydWN0IHJhZGVvbl9jc19pbnQgKiljczsKKyAgICBjc2ktPnNwYWNlX2ZsdXNoX2ZuID0gZm47CisgICAgY3NpLT5zcGFjZV9mbHVzaF9kYXRhID0gZGF0YTsKK30KKwordWludDMyX3QgcmFkZW9uX2NzX2dldF9pZChzdHJ1Y3QgcmFkZW9uX2NzICpjcykKK3sKKyAgICBzdHJ1Y3QgcmFkZW9uX2NzX2ludCAqY3NpID0gKHN0cnVjdCByYWRlb25fY3NfaW50ICopY3M7CisgICAgcmV0dXJuIGNzaS0+aWQ7Cit9CmRpZmYgLS1naXQgYS9yYWRlb24vcmFkZW9uX2NzLmggYi9yYWRlb24vcmFkZW9uX2NzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY4YTYyNAotLS0gL2Rldi9udWxsCisrKyBiL3JhZGVvbi9yYWRlb25fY3MuaApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA4IE5pY29sYWkgSGFlaG5sZQorICogQ29weXJpZ2h0IMKpIDIwMDggSsOpcsO0bWUgR2xpc3NlCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqLworLyoKKyAqIEF1dGhvcnM6CisgKiAgICAgIEFhcG8gVGFoa29sYSA8YWV0QHJhc3RlcmJ1cm4ub3JnPgorICogICAgICBOaWNvbGFpIEhhZWhubGUgPHByZWZlY3RfQGdteC5uZXQ+CisgKiAgICAgIErDqXLDtG1lIEdsaXNzZSA8Z2xpc3NlQGZyZWVkZXNrdG9wLm9yZz4KKyAqLworI2lmbmRlZiBSQURFT05fQ1NfSAorI2RlZmluZSBSQURFT05fQ1NfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uX2RybS5oIgorI2luY2x1ZGUgInJhZGVvbl9iby5oIgorCitzdHJ1Y3QgcmFkZW9uX2NzX3JlbG9jIHsKKyAgICBzdHJ1Y3QgcmFkZW9uX2JvICAgICpibzsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIHJlYWRfZG9tYWluOworICAgIHVpbnQzMl90ICAgICAgICAgICAgd3JpdGVfZG9tYWluOworICAgIHVpbnQzMl90ICAgICAgICAgICAgZmxhZ3M7Cit9OworCisKKyNkZWZpbmUgUkFERU9OX0NTX1NQQUNFX09LIDAKKyNkZWZpbmUgUkFERU9OX0NTX1NQQUNFX09QX1RPX0JJRyAxCisjZGVmaW5lIFJBREVPTl9DU19TUEFDRV9GTFVTSCAyCisKK3N0cnVjdCByYWRlb25fY3MgeworICAgIHVpbnQzMl90ICpwYWNrZXRzOworICAgIHVuc2lnbmVkIGNkdzsKKyAgICB1bnNpZ25lZCBuZHc7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25fbmR3OworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICBzZWN0aW9uX2NkdzsKK307CisKKyNkZWZpbmUgTUFYX1NQQUNFX0JPUyAoMzIpCisKK3N0cnVjdCByYWRlb25fY3NfbWFuYWdlcjsKKworZXh0ZXJuIHN0cnVjdCByYWRlb25fY3MgKnJhZGVvbl9jc19jcmVhdGUoc3RydWN0IHJhZGVvbl9jc19tYW5hZ2VyICpjc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuZHcpOworCitleHRlcm4gaW50IHJhZGVvbl9jc19iZWdpbihzdHJ1Y3QgcmFkZW9uX2NzICpjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5kdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSk7CitleHRlcm4gaW50IHJhZGVvbl9jc19lbmQoc3RydWN0IHJhZGVvbl9jcyAqY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKTsKK2V4dGVybiBpbnQgcmFkZW9uX2NzX2VtaXQoc3RydWN0IHJhZGVvbl9jcyAqY3MpOworZXh0ZXJuIGludCByYWRlb25fY3NfZGVzdHJveShzdHJ1Y3QgcmFkZW9uX2NzICpjcyk7CitleHRlcm4gaW50IHJhZGVvbl9jc19lcmFzZShzdHJ1Y3QgcmFkZW9uX2NzICpjcyk7CitleHRlcm4gaW50IHJhZGVvbl9jc19uZWVkX2ZsdXNoKHN0cnVjdCByYWRlb25fY3MgKmNzKTsKK2V4dGVybiB2b2lkIHJhZGVvbl9jc19wcmludChzdHJ1Y3QgcmFkZW9uX2NzICpjcywgRklMRSAqZmlsZSk7CitleHRlcm4gdm9pZCByYWRlb25fY3Nfc2V0X2xpbWl0KHN0cnVjdCByYWRlb25fY3MgKmNzLCB1aW50MzJfdCBkb21haW4sIHVpbnQzMl90IGxpbWl0KTsKK2V4dGVybiB2b2lkIHJhZGVvbl9jc19zcGFjZV9zZXRfZmx1c2goc3RydWN0IHJhZGVvbl9jcyAqY3MsIHZvaWQgKCpmbikodm9pZCAqKSwgdm9pZCAqZGF0YSk7CitleHRlcm4gaW50IHJhZGVvbl9jc193cml0ZV9yZWxvYyhzdHJ1Y3QgcmFkZW9uX2NzICpjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fYm8gKmJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVhZF9kb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3cml0ZV9kb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7CitleHRlcm4gdWludDMyX3QgcmFkZW9uX2NzX2dldF9pZChzdHJ1Y3QgcmFkZW9uX2NzICpjcyk7CisvKgorICogYWRkIGEgcGVyc2lzdGVudCBCTyB0byB0aGUgbGlzdAorICogYSBwZXJzaXN0ZW50IEJPIGlzIG9uZSB0aGF0IHdpbGwgYmUgcmVmZXJlbmNlZCBhY3Jvc3MgZmx1c2hlcywKKyAqIGkuZS4gY29sb3JidWZmZXIsIHRleHR1cmVzIGV0Yy4KKyAqIFRoZXkgZ2V0IHJlc2V0IHdoZW4gYSBuZXcgIm9wZXJhdGlvbiIgaGFwcGVucywgd2hlcmUgYW4gb3BlcmF0aW9uCisgKiBpcyBhIHN0YXRlIGVtaXNzaW9uIHdpdGggYSBjb2xvci90ZXh0dXJlcyBldGMgZm9sbG93ZWQgYnkgYSBidW5jaCBvZiB2ZXJ0aWNlcy4KKyAqLwordm9pZCByYWRlb25fY3Nfc3BhY2VfYWRkX3BlcnNpc3RlbnRfYm8oc3RydWN0IHJhZGVvbl9jcyAqY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFkZW9uX2JvICpibywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlYWRfZG9tYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdyaXRlX2RvbWFpbik7CisKKy8qIHJlc2V0IHRoZSBwZXJzaXN0ZW50IEJPIGxpc3QgKi8KK3ZvaWQgcmFkZW9uX2NzX3NwYWNlX3Jlc2V0X2JvcyhzdHJ1Y3QgcmFkZW9uX2NzICpjcyk7CisKKy8qIGRvIGEgc3BhY2UgY2hlY2sgd2l0aCB0aGUgY3VycmVudCBwZXJzaXN0ZW50IEJPIGxpc3QgKi8KK2ludCByYWRlb25fY3Nfc3BhY2VfY2hlY2soc3RydWN0IHJhZGVvbl9jcyAqY3MpOworCisvKiBkbyBhIHNwYWNlIGNoZWNrIHdpdGggdGhlIGN1cnJlbnQgcGVyc2lzdGVudCBCTyBsaXN0IGFuZCBhIHRlbXBvcmFyeSBCTworICogYSB0ZW1wb3JhcnkgQk8gaXMgbGlrZSBhIERNQSBidWZmZXIsIHdoaWNoICBnZXRzIGZsdXNoZWQgd2l0aCB0aGUKKyAqIGNvbW1hbmQgYnVmZmVyICovCitpbnQgcmFkZW9uX2NzX3NwYWNlX2NoZWNrX3dpdGhfYm8oc3RydWN0IHJhZGVvbl9jcyAqY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJhZGVvbl9ibyAqYm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVhZF9kb21haW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdyaXRlX2RvbWFpbik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByYWRlb25fY3Nfd3JpdGVfZHdvcmQoc3RydWN0IHJhZGVvbl9jcyAqY3MsIHVpbnQzMl90IGR3b3JkKQoreworICAgIGNzLT5wYWNrZXRzW2NzLT5jZHcrK10gPSBkd29yZDsKKyAgICBpZiAoY3MtPnNlY3Rpb25fbmR3KSB7CisgICAgICAgIGNzLT5zZWN0aW9uX2NkdysrOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJhZGVvbl9jc193cml0ZV9xd29yZChzdHJ1Y3QgcmFkZW9uX2NzICpjcywgdWludDY0X3QgcXdvcmQpCit7CisgICAgbWVtY3B5KGNzLT5wYWNrZXRzICsgY3MtPmNkdywgJnF3b3JkLCBzaXplb2YodWludDY0X3QpKTsKKyAgICBjcy0+Y2R3ICs9IDI7CisgICAgaWYgKGNzLT5zZWN0aW9uX25kdykgeworICAgICAgICBjcy0+c2VjdGlvbl9jZHcgKz0gMjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByYWRlb25fY3Nfd3JpdGVfdGFibGUoc3RydWN0IHJhZGVvbl9jcyAqY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemUpCit7CisgICAgbWVtY3B5KGNzLT5wYWNrZXRzICsgY3MtPmNkdywgZGF0YSwgc2l6ZSAqIDQpOworICAgIGNzLT5jZHcgKz0gc2l6ZTsKKyAgICBpZiAoY3MtPnNlY3Rpb25fbmR3KSB7CisgICAgICAgIGNzLT5zZWN0aW9uX2NkdyArPSBzaXplOworICAgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcmFkZW9uL3JhZGVvbl9jc19nZW0uYyBiL3JhZGVvbi9yYWRlb25fY3NfZ2VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNkY2NiNgotLS0gL2Rldi9udWxsCisrKyBiL3JhZGVvbi9yYWRlb25fY3NfZ2VtLmMKQEAgLTAsMCArMSw1NTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOCBKw6lyw7RtZSBHbGlzc2UKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTCisgKiBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqLworLyoKKyAqIEF1dGhvcnM6CisgKiAgICAgIEFhcG8gVGFoa29sYSA8YWV0QHJhc3RlcmJ1cm4ub3JnPgorICogICAgICBOaWNvbGFpIEhhZWhubGUgPHByZWZlY3RfQGdteC5uZXQ+CisgKiAgICAgIErDqXLDtG1lIEdsaXNzZSA8Z2xpc3NlQGZyZWVkZXNrdG9wLm9yZz4KKyAqLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgInJhZGVvbl9jcy5oIgorI2luY2x1ZGUgInJhZGVvbl9jc19pbnQuaCIKKyNpbmNsdWRlICJyYWRlb25fYm9faW50LmgiCisjaW5jbHVkZSAicmFkZW9uX2NzX2dlbS5oIgorI2luY2x1ZGUgInJhZGVvbl9ib19nZW0uaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJsaWJkcm1fbWFjcm9zLmgiCisjaW5jbHVkZSAieGY4NmRybS5oIgorI2luY2x1ZGUgInhmODZhdG9taWMuaCIKKyNpbmNsdWRlICJyYWRlb25fZHJtLmgiCisKKy8qIEFkZCBMSUJEUk1fUkFERU9OX0JPRl9GSUxFUyB0byBsaWJkcm1fcmFkZW9uX2xhX1NPVVJDRVMgd2hlbiBidWlsZGluZyB3aXRoIEJPRl9EVU1QICovCisjZGVmaW5lIENTX0JPRl9EVU1QIDAKKyNpZiBDU19CT0ZfRFVNUAorI2luY2x1ZGUgImJvZi5oIgorI2VuZGlmCisKK3N0cnVjdCByYWRlb25fY3NfbWFuYWdlcl9nZW0geworICAgIHN0cnVjdCByYWRlb25fY3NfbWFuYWdlciAgICBiYXNlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBkZXZpY2VfaWQ7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgIG5ib2Y7Cit9OworCisjcHJhZ21hIHBhY2soMSkKK3N0cnVjdCBjc19yZWxvY19nZW0geworICAgIHVpbnQzMl90ICAgIGhhbmRsZTsKKyAgICB1aW50MzJfdCAgICByZWFkX2RvbWFpbjsKKyAgICB1aW50MzJfdCAgICB3cml0ZV9kb21haW47CisgICAgdWludDMyX3QgICAgZmxhZ3M7Cit9OworCisjcHJhZ21hIHBhY2soKQorI2RlZmluZSBSRUxPQ19TSVpFIChzaXplb2Yoc3RydWN0IGNzX3JlbG9jX2dlbSkgLyBzaXplb2YodWludDMyX3QpKQorCitzdHJ1Y3QgY3NfZ2VtIHsKKyAgICBzdHJ1Y3QgcmFkZW9uX2NzX2ludCAgICAgICAgYmFzZTsKKyAgICBzdHJ1Y3QgZHJtX3JhZGVvbl9jcyAgICAgICAgY3M7CisgICAgc3RydWN0IGRybV9yYWRlb25fY3NfY2h1bmsgIGNodW5rc1syXTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgbnJlbG9jczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgKnJlbG9jczsKKyAgICBzdHJ1Y3QgcmFkZW9uX2JvX2ludCAgICAgICAgKipyZWxvY3NfYm87Cit9OworCitzdGF0aWMgcHRocmVhZF9tdXRleF90IGlkX211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKK3N0YXRpYyB1aW50MzJfdCBjc19pZF9zb3VyY2UgPSAwOworCisvKioKKyAqIHJlc3VsdCBpcyB1bmRlZmluZWQgaWYgY2FsbGVkIHdpdGggfjAKKyAqLworc3RhdGljIHVpbnQzMl90IGdldF9maXJzdF96ZXJvKGNvbnN0IHVpbnQzMl90IG4pCit7CisgICAgLyogX19idWlsdGluX2N0eiByZXR1cm5zIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvcy4gKi8KKyAgICByZXR1cm4gMSA8PCBfX2J1aWx0aW5fY3R6KH5uKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgZnJlZSBpZCBmb3IgY3MuCisgKiBJZiB0aGVyZSBpcyBubyBmcmVlIGlkIHdlIHJldHVybiB6ZXJvCisgKiovCitzdGF0aWMgdWludDMyX3QgZ2VuZXJhdGVfaWQodm9pZCkKK3sKKyAgICB1aW50MzJfdCByID0gMDsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soICZpZF9tdXRleCApOworICAgIC8qIGNoZWNrIGZvciBmcmVlIGlkcyAqLworICAgIGlmIChjc19pZF9zb3VyY2UgIT0gfnIpIHsKKyAgICAgICAgLyogZmluZCBmaXJzdCB6ZXJvIGJpdCAqLworICAgICAgICByID0gZ2V0X2ZpcnN0X3plcm8oY3NfaWRfc291cmNlKTsKKworICAgICAgICAvKiBzZXQgaWQgYXMgcmVzZXJ2ZWQgKi8KKyAgICAgICAgY3NfaWRfc291cmNlIHw9IHI7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmaWRfbXV0ZXggKTsKKyAgICByZXR1cm4gcjsKK30KKworLyoqCisgKiBGcmVlIHRoZSBpZCBmb3IgbGF0ZXIgcmV1c2UKKyAqKi8KK3N0YXRpYyB2b2lkIGZyZWVfaWQodWludDMyX3QgaWQpCit7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCAmaWRfbXV0ZXggKTsKKworICAgIGNzX2lkX3NvdXJjZSAmPSB+aWQ7CisKKyAgICBwdGhyZWFkX211dGV4X3VubG9jayggJmlkX211dGV4ICk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmFkZW9uX2NzX2ludCAqY3NfZ2VtX2NyZWF0ZShzdHJ1Y3QgcmFkZW9uX2NzX21hbmFnZXIgKmNzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5kdykKK3sKKyAgICBzdHJ1Y3QgY3NfZ2VtICpjc2c7CisKKyAgICAvKiBtYXggY21kIGJ1ZmZlciBzaXplIGlzIDY0S2IgKi8KKyAgICBpZiAobmR3ID4gKDY0ICogMTAyNCAvIDQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjc2cgPSAoc3RydWN0IGNzX2dlbSopY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgY3NfZ2VtKSk7CisgICAgaWYgKGNzZyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjc2ctPmJhc2UuY3NtID0gY3NtOworICAgIGNzZy0+YmFzZS5uZHcgPSA2NCAqIDEwMjQgLyA0OworICAgIGNzZy0+YmFzZS5wYWNrZXRzID0gKHVpbnQzMl90KiljYWxsb2MoMSwgNjQgKiAxMDI0KTsKKyAgICBpZiAoY3NnLT5iYXNlLnBhY2tldHMgPT0gTlVMTCkgeworICAgICAgICBmcmVlKGNzZyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjc2ctPmJhc2UucmVsb2NzX3RvdGFsX3NpemUgPSAwOworICAgIGNzZy0+YmFzZS5jcmVsb2NzID0gMDsKKyAgICBjc2ctPmJhc2UuaWQgPSBnZW5lcmF0ZV9pZCgpOworICAgIGNzZy0+bnJlbG9jcyA9IDQwOTYgLyAoNCAqIDQpIDsKKyAgICBjc2ctPnJlbG9jc19ibyA9IChzdHJ1Y3QgcmFkZW9uX2JvX2ludCoqKWNhbGxvYygxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NnLT5ucmVsb2NzKnNpemVvZih2b2lkKikpOworICAgIGlmIChjc2ctPnJlbG9jc19ibyA9PSBOVUxMKSB7CisgICAgICAgIGZyZWUoY3NnLT5iYXNlLnBhY2tldHMpOworICAgICAgICBmcmVlKGNzZyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjc2ctPmJhc2UucmVsb2NzID0gY3NnLT5yZWxvY3MgPSAodWludDMyX3QqKWNhbGxvYygxLCA0MDk2KTsKKyAgICBpZiAoY3NnLT5yZWxvY3MgPT0gTlVMTCkgeworICAgICAgICBmcmVlKGNzZy0+cmVsb2NzX2JvKTsKKyAgICAgICAgZnJlZShjc2ctPmJhc2UucGFja2V0cyk7CisgICAgICAgIGZyZWUoY3NnKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGNzZy0+Y2h1bmtzWzBdLmNodW5rX2lkID0gUkFERU9OX0NIVU5LX0lEX0lCOworICAgIGNzZy0+Y2h1bmtzWzBdLmxlbmd0aF9kdyA9IDA7CisgICAgY3NnLT5jaHVua3NbMF0uY2h1bmtfZGF0YSA9ICh1aW50NjRfdCkodWludHB0cl90KWNzZy0+YmFzZS5wYWNrZXRzOworICAgIGNzZy0+Y2h1bmtzWzFdLmNodW5rX2lkID0gUkFERU9OX0NIVU5LX0lEX1JFTE9DUzsKKyAgICBjc2ctPmNodW5rc1sxXS5sZW5ndGhfZHcgPSAwOworICAgIGNzZy0+Y2h1bmtzWzFdLmNodW5rX2RhdGEgPSAodWludDY0X3QpKHVpbnRwdHJfdCljc2ctPnJlbG9jczsKKyAgICByZXR1cm4gKHN0cnVjdCByYWRlb25fY3NfaW50Kiljc2c7Cit9CisKK3N0YXRpYyBpbnQgY3NfZ2VtX3dyaXRlX3JlbG9jKHN0cnVjdCByYWRlb25fY3NfaW50ICpjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fYm8gKmJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVhZF9kb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3cml0ZV9kb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncykKK3sKKyAgICBzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqYm9pID0gKHN0cnVjdCByYWRlb25fYm9faW50ICopYm87CisgICAgc3RydWN0IGNzX2dlbSAqY3NnID0gKHN0cnVjdCBjc19nZW0qKWNzOworICAgIHN0cnVjdCBjc19yZWxvY19nZW0gKnJlbG9jOworICAgIHVpbnQzMl90IGlkeDsKKyAgICB1bnNpZ25lZCBpOworCisgICAgYXNzZXJ0KGJvaS0+c3BhY2VfYWNjb3VudGVkKTsKKworICAgIC8qIGNoZWNrIGRvbWFpbnMgKi8KKyAgICBpZiAoKHJlYWRfZG9tYWluICYmIHdyaXRlX2RvbWFpbikgfHwgKCFyZWFkX2RvbWFpbiAmJiAhd3JpdGVfZG9tYWluKSkgeworICAgICAgICAvKiBpbiBvbmUgQ1MgYSBibyBjYW4gb25seSBiZSBpbiByZWFkIG9yIHdyaXRlIGRvbWFpbiBidXQgbm90CisgICAgICAgICAqIGluIHJlYWQgJiB3cml0ZSBkb21haW4gYXQgdGhlIHNhbWUgdGltZQorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGlmIChyZWFkX2RvbWFpbiA9PSBSQURFT05fR0VNX0RPTUFJTl9DUFUpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGlmICh3cml0ZV9kb21haW4gPT0gUkFERU9OX0dFTV9ET01BSU5fQ1BVKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICAvKiB1c2UgYml0IGZpZWxkIGhhc2ggZnVuY3Rpb24gdG8gZGV0ZXJtaW5lCisgICAgICAgaWYgdGhpcyBibyBpcyBmb3Igc3VyZSBub3QgaW4gdGhpcyBjcy4qLworICAgIGlmICgoYXRvbWljX3JlYWQoKGF0b21pY190ICopcmFkZW9uX2dlbV9nZXRfcmVsb2NfaW5fY3MoYm8pKSAmIGNzLT5pZCkpIHsKKyAgICAgICAgLyogY2hlY2sgaWYgYm8gaXMgYWxyZWFkeSByZWZlcmVuY2VkLgorICAgICAgICAgKiBTY2FubmluZyBmcm9tIGVuZCB0byBiZWdpbiByZWR1Y2VzIGN5Y2xlcyB3aXRoIG1lc2EgYmVjYXVzZQorICAgICAgICAgKiBpdCBvZnRlbiByZWxvY2F0ZXMgc2FtZSBzaGFyZWQgZG1hIGJvIGFnYWluLiAqLworICAgICAgICBmb3IoaSA9IGNzLT5jcmVsb2NzOyBpICE9IDA7KSB7CisgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICBpZHggPSBpICogUkVMT0NfU0laRTsKKyAgICAgICAgICAgIHJlbG9jID0gKHN0cnVjdCBjc19yZWxvY19nZW0qKSZjc2ctPnJlbG9jc1tpZHhdOworICAgICAgICAgICAgaWYgKHJlbG9jLT5oYW5kbGUgPT0gYm8tPmhhbmRsZSkgeworICAgICAgICAgICAgICAgIC8qIENoZWNrIGRvbWFpbnMgbXVzdCBiZSBpbiByZWFkIG9yIHdyaXRlLiBBcyB3ZSBjaGVjayBhbHJlYWR5CisgICAgICAgICAgICAgICAgICogY2hlY2tlZCB0aGF0IGluIGFyZ3VtZW50IG9uZSBvZiB0aGUgcmVhZCBvciB3cml0ZSBkb21haW4gd2FzCisgICAgICAgICAgICAgICAgICogc2V0IHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGF0IGlmIHByZXZpb3VzIHJlbG9jIGFzIHRoZSByZWFkCisgICAgICAgICAgICAgICAgICogZG9tYWluIHNldCB0aGVuIHRoZSByZWFkX2RvbWFpbiBzaG91bGQgYWxzbyBiZSBzZXQgZm9yIHRoaXMKKyAgICAgICAgICAgICAgICAgKiBuZXcgcmVsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAvKiB0aGUgRERYIGV4cGVjdHMgdG8gcmVhZCBhbmQgd3JpdGUgZnJvbSBzYW1lIHBpeG1hcCAqLworICAgICAgICAgICAgICAgIGlmICh3cml0ZV9kb21haW4gJiYgKHJlbG9jLT5yZWFkX2RvbWFpbiAmIHdyaXRlX2RvbWFpbikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVsb2MtPnJlYWRfZG9tYWluID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcmVsb2MtPndyaXRlX2RvbWFpbiA9IHdyaXRlX2RvbWFpbjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlYWRfZG9tYWluICYgcmVsb2MtPndyaXRlX2RvbWFpbikgeworICAgICAgICAgICAgICAgICAgICByZWxvYy0+cmVhZF9kb21haW4gPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZV9kb21haW4gIT0gcmVsb2MtPndyaXRlX2RvbWFpbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBpZiAocmVhZF9kb21haW4gIT0gcmVsb2MtPnJlYWRfZG9tYWluKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmVsb2MtPnJlYWRfZG9tYWluIHw9IHJlYWRfZG9tYWluOworICAgICAgICAgICAgICAgIHJlbG9jLT53cml0ZV9kb21haW4gfD0gd3JpdGVfZG9tYWluOworICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBmbGFncyAqLworICAgICAgICAgICAgICAgIHJlbG9jLT5mbGFncyB8PSAoZmxhZ3MgJiByZWxvYy0+ZmxhZ3MpOworICAgICAgICAgICAgICAgIC8qIHdyaXRlIHJlbG9jYXRpb24gcGFja2V0ICovCisgICAgICAgICAgICAgICAgcmFkZW9uX2NzX3dyaXRlX2R3b3JkKChzdHJ1Y3QgcmFkZW9uX2NzICopY3MsIDB4YzAwMDEwMDApOworICAgICAgICAgICAgICAgIHJhZGVvbl9jc193cml0ZV9kd29yZCgoc3RydWN0IHJhZGVvbl9jcyAqKWNzLCBpZHgpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qIG5ldyByZWxvY2F0aW9uICovCisgICAgaWYgKGNzZy0+YmFzZS5jcmVsb2NzID49IGNzZy0+bnJlbG9jcykgeworICAgICAgICAvKiBhbGxvY2F0ZSBtb3JlIG1lbW9yeSAoVE9ETzogc2hvdWxkIHVzZSBhIHNsYWIgYWxsb2NhdG9yIG1heWJlKSAqLworICAgICAgICB1aW50MzJfdCAqdG1wLCBzaXplOworICAgICAgICBzaXplID0gKChjc2ctPm5yZWxvY3MgKyAxKSAqIHNpemVvZihzdHJ1Y3QgcmFkZW9uX2JvKikpOworICAgICAgICB0bXAgPSAodWludDMyX3QqKXJlYWxsb2MoY3NnLT5yZWxvY3NfYm8sIHNpemUpOworICAgICAgICBpZiAodG1wID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICB9CisgICAgICAgIGNzZy0+cmVsb2NzX2JvID0gKHN0cnVjdCByYWRlb25fYm9faW50ICoqKXRtcDsKKyAgICAgICAgc2l6ZSA9ICgoY3NnLT5ucmVsb2NzICsgMSkgKiBSRUxPQ19TSVpFICogNCk7CisgICAgICAgIHRtcCA9ICh1aW50MzJfdCopcmVhbGxvYyhjc2ctPnJlbG9jcywgc2l6ZSk7CisgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIH0KKyAgICAgICAgY3MtPnJlbG9jcyA9IGNzZy0+cmVsb2NzID0gdG1wOworICAgICAgICBjc2ctPm5yZWxvY3MgKz0gMTsKKyAgICAgICAgY3NnLT5jaHVua3NbMV0uY2h1bmtfZGF0YSA9ICh1aW50NjRfdCkodWludHB0cl90KWNzZy0+cmVsb2NzOworICAgIH0KKyAgICBjc2ctPnJlbG9jc19ib1tjc2ctPmJhc2UuY3JlbG9jc10gPSBib2k7CisgICAgaWR4ID0gKGNzZy0+YmFzZS5jcmVsb2NzKyspICogUkVMT0NfU0laRTsKKyAgICByZWxvYyA9IChzdHJ1Y3QgY3NfcmVsb2NfZ2VtKikmY3NnLT5yZWxvY3NbaWR4XTsKKyAgICByZWxvYy0+aGFuZGxlID0gYm8tPmhhbmRsZTsKKyAgICByZWxvYy0+cmVhZF9kb21haW4gPSByZWFkX2RvbWFpbjsKKyAgICByZWxvYy0+d3JpdGVfZG9tYWluID0gd3JpdGVfZG9tYWluOworICAgIHJlbG9jLT5mbGFncyA9IGZsYWdzOworICAgIGNzZy0+Y2h1bmtzWzFdLmxlbmd0aF9kdyArPSBSRUxPQ19TSVpFOworICAgIHJhZGVvbl9ib19yZWYoYm8pOworICAgIC8qIGJvIG1pZ2h0IGJlIHJlZmVyZW5jZWQgZnJvbSBhbm90aGVyIGNvbnRleHQgc28gaGF2ZSB0byB1c2UgYXRvbWljIG9wZXJhdGlvbnMgKi8KKyAgICBhdG9taWNfYWRkKChhdG9taWNfdCAqKXJhZGVvbl9nZW1fZ2V0X3JlbG9jX2luX2NzKGJvKSwgY3MtPmlkKTsKKyAgICBjcy0+cmVsb2NzX3RvdGFsX3NpemUgKz0gYm9pLT5zaXplOworICAgIHJhZGVvbl9jc193cml0ZV9kd29yZCgoc3RydWN0IHJhZGVvbl9jcyAqKWNzLCAweGMwMDAxMDAwKTsKKyAgICByYWRlb25fY3Nfd3JpdGVfZHdvcmQoKHN0cnVjdCByYWRlb25fY3MgKiljcywgaWR4KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjc19nZW1fYmVnaW4oc3RydWN0IHJhZGVvbl9jc19pbnQgKmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbmR3LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkKK3sKKworICAgIGlmIChjcy0+c2VjdGlvbl9uZHcpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDUyBhbHJlYWR5IGluIGEgc2VjdGlvbiglcywlcywlZClcbiIsCisgICAgICAgICAgICAgICAgY3MtPnNlY3Rpb25fZmlsZSwgY3MtPnNlY3Rpb25fZnVuYywgY3MtPnNlY3Rpb25fbGluZSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ1MgY2FuJ3Qgc3RhcnQgc2VjdGlvbiglcywlcywlZClcbiIsCisgICAgICAgICAgICAgICAgZmlsZSwgZnVuYywgbGluZSk7CisgICAgICAgIHJldHVybiAtRVBJUEU7CisgICAgfQorICAgIGNzLT5zZWN0aW9uX25kdyA9IG5kdzsKKyAgICBjcy0+c2VjdGlvbl9jZHcgPSAwOworICAgIGNzLT5zZWN0aW9uX2ZpbGUgPSBmaWxlOworICAgIGNzLT5zZWN0aW9uX2Z1bmMgPSBmdW5jOworICAgIGNzLT5zZWN0aW9uX2xpbmUgPSBsaW5lOworCisgICAgaWYgKGNzLT5jZHcgKyBuZHcgPiBjcy0+bmR3KSB7CisgICAgICAgIHVpbnQzMl90IHRtcCwgKnB0cjsKKworICAgICAgICAvKiByb3VuZCB1cCB0aGUgcmVxdWlyZWQgc2l6ZSB0byBhIG11bHRpcGxlIG9mIDEwMjQgKi8KKyAgICAgICAgdG1wID0gKGNzLT5jZHcgKyBuZHcgKyAweDNGRikgJiAofjB4M0ZGKTsKKyAgICAgICAgcHRyID0gKHVpbnQzMl90KilyZWFsbG9jKGNzLT5wYWNrZXRzLCA0ICogdG1wKTsKKyAgICAgICAgaWYgKHB0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgfQorICAgICAgICBjcy0+cGFja2V0cyA9IHB0cjsKKyAgICAgICAgY3MtPm5kdyA9IHRtcDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3NfZ2VtX2VuZChzdHJ1Y3QgcmFkZW9uX2NzX2ludCAqY3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jLAorICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKQorCit7CisgICAgaWYgKCFjcy0+c2VjdGlvbl9uZHcpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDUyBubyBzZWN0aW9uIHRvIGVuZCBhdCAoJXMsJXMsJWQpXG4iLAorICAgICAgICAgICAgICAgIGZpbGUsIGZ1bmMsIGxpbmUpOworICAgICAgICByZXR1cm4gLUVQSVBFOworICAgIH0KKyAgICBpZiAoY3MtPnNlY3Rpb25fbmR3ICE9IGNzLT5zZWN0aW9uX2NkdykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNTIHNlY3Rpb24gc2l6ZSBtaXNtYXRjaCBzdGFydCBhdCAoJXMsJXMsJWQpICVkIHZzICVkXG4iLAorICAgICAgICAgICAgICAgIGNzLT5zZWN0aW9uX2ZpbGUsIGNzLT5zZWN0aW9uX2Z1bmMsIGNzLT5zZWN0aW9uX2xpbmUsIGNzLT5zZWN0aW9uX25kdywgY3MtPnNlY3Rpb25fY2R3KTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDUyBzZWN0aW9uIGVuZCBhdCAoJXMsJXMsJWQpXG4iLAorICAgICAgICAgICAgICAgIGZpbGUsIGZ1bmMsIGxpbmUpOworCisgICAgICAgIC8qIFdlIG11c3QgcmVzZXQgdGhlIHNlY3Rpb24gZXZlbiB3aGVuIHRoZXJlIGlzIGVycm9yLiAqLworICAgICAgICBjcy0+c2VjdGlvbl9uZHcgPSAwOworICAgICAgICByZXR1cm4gLUVQSVBFOworICAgIH0KKyAgICBjcy0+c2VjdGlvbl9uZHcgPSAwOworICAgIHJldHVybiAwOworfQorCisjaWYgQ1NfQk9GX0RVTVAKK3N0YXRpYyB2b2lkIGNzX2dlbV9kdW1wX2JvZihzdHJ1Y3QgcmFkZW9uX2NzX2ludCAqY3MpCit7CisgICAgc3RydWN0IGNzX2dlbSAqY3NnID0gKHN0cnVjdCBjc19nZW0qKWNzOworICAgIHN0cnVjdCByYWRlb25fY3NfbWFuYWdlcl9nZW0gKmNzbTsKKyAgICBib2ZfdCAqYmNzLCAqYmxvYiwgKmFycmF5LCAqYm8sICpzaXplLCAqaGFuZGxlLCAqZGV2aWNlX2lkLCAqcm9vdDsKKyAgICBjaGFyIHRtcFsyNTZdOworICAgIHVuc2lnbmVkIGk7CisKKyAgICBjc20gPSAoc3RydWN0IHJhZGVvbl9jc19tYW5hZ2VyX2dlbSAqKWNzLT5jc207CisgICAgcm9vdCA9IGRldmljZV9pZCA9IGJjcyA9IGJsb2IgPSBhcnJheSA9IGJvID0gc2l6ZSA9IGhhbmRsZSA9IE5VTEw7CisgICAgcm9vdCA9IGJvZl9vYmplY3QoKTsKKyAgICBpZiAocm9vdCA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dF9lcnI7CisgICAgZGV2aWNlX2lkID0gYm9mX2ludDMyKGNzbS0+ZGV2aWNlX2lkKTsKKyAgICBpZiAoZGV2aWNlX2lkID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoYm9mX29iamVjdF9zZXQocm9vdCwgImRldmljZV9pZCIsIGRldmljZV9pZCkpCisgICAgICAgIGdvdG8gb3V0X2VycjsKKyAgICBib2ZfZGVjcmVmKGRldmljZV9pZCk7CisgICAgZGV2aWNlX2lkID0gTlVMTDsKKyAgICAvKiBkdW1wIHJlbG9jcyAqLworICAgIGJsb2IgPSBib2ZfYmxvYihjc2ctPm5yZWxvY3MgKiAxNiwgY3NnLT5yZWxvY3MpOworICAgIGlmIChibG9iID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0X2VycjsKKyAgICBpZiAoYm9mX29iamVjdF9zZXQocm9vdCwgInJlbG9jIiwgYmxvYikpCisgICAgICAgIGdvdG8gb3V0X2VycjsKKyAgICBib2ZfZGVjcmVmKGJsb2IpOworICAgIGJsb2IgPSBOVUxMOworICAgIC8qIGR1bXAgY3MgKi8KKyAgICBibG9iID0gYm9mX2Jsb2IoY3MtPmNkdyAqIDQsIGNzLT5wYWNrZXRzKTsKKyAgICBpZiAoYmxvYiA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dF9lcnI7CisgICAgaWYgKGJvZl9vYmplY3Rfc2V0KHJvb3QsICJwbTQiLCBibG9iKSkKKyAgICAgICAgZ290byBvdXRfZXJyOworICAgIGJvZl9kZWNyZWYoYmxvYik7CisgICAgYmxvYiA9IE5VTEw7CisgICAgLyogZHVtcCBibyAqLworICAgIGFycmF5ID0gYm9mX2FycmF5KCk7CisgICAgaWYgKGFycmF5ID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0X2VycjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3NnLT5iYXNlLmNyZWxvY3M7IGkrKykgeworICAgICAgICBibyA9IGJvZl9vYmplY3QoKTsKKyAgICAgICAgaWYgKGJvID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIG91dF9lcnI7CisgICAgICAgIHNpemUgPSBib2ZfaW50MzIoY3NnLT5yZWxvY3NfYm9baV0tPnNpemUpOworICAgICAgICBpZiAoc2l6ZSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBvdXRfZXJyOworICAgICAgICBpZiAoYm9mX29iamVjdF9zZXQoYm8sICJzaXplIiwgc2l6ZSkpCisgICAgICAgICAgICBnb3RvIG91dF9lcnI7CisgICAgICAgIGJvZl9kZWNyZWYoc2l6ZSk7CisgICAgICAgIHNpemUgPSBOVUxMOworICAgICAgICBoYW5kbGUgPSBib2ZfaW50MzIoY3NnLT5yZWxvY3NfYm9baV0tPmhhbmRsZSk7CisgICAgICAgIGlmIChoYW5kbGUgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gb3V0X2VycjsKKyAgICAgICAgaWYgKGJvZl9vYmplY3Rfc2V0KGJvLCAiaGFuZGxlIiwgaGFuZGxlKSkKKyAgICAgICAgICAgIGdvdG8gb3V0X2VycjsKKyAgICAgICAgYm9mX2RlY3JlZihoYW5kbGUpOworICAgICAgICBoYW5kbGUgPSBOVUxMOworICAgICAgICByYWRlb25fYm9fbWFwKChzdHJ1Y3QgcmFkZW9uX2JvKiljc2ctPnJlbG9jc19ib1tpXSwgMCk7CisgICAgICAgIGJsb2IgPSBib2ZfYmxvYihjc2ctPnJlbG9jc19ib1tpXS0+c2l6ZSwgY3NnLT5yZWxvY3NfYm9baV0tPnB0cik7CisgICAgICAgIHJhZGVvbl9ib191bm1hcCgoc3RydWN0IHJhZGVvbl9ibyopY3NnLT5yZWxvY3NfYm9baV0pOworICAgICAgICBpZiAoYmxvYiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBvdXRfZXJyOworICAgICAgICBpZiAoYm9mX29iamVjdF9zZXQoYm8sICJkYXRhIiwgYmxvYikpCisgICAgICAgICAgICBnb3RvIG91dF9lcnI7CisgICAgICAgIGJvZl9kZWNyZWYoYmxvYik7CisgICAgICAgIGJsb2IgPSBOVUxMOworICAgICAgICBpZiAoYm9mX2FycmF5X2FwcGVuZChhcnJheSwgYm8pKQorICAgICAgICAgICAgZ290byBvdXRfZXJyOworICAgICAgICBib2ZfZGVjcmVmKGJvKTsKKyAgICAgICAgYm8gPSBOVUxMOworICAgIH0KKyAgICBpZiAoYm9mX29iamVjdF9zZXQocm9vdCwgImJvIiwgYXJyYXkpKQorICAgICAgICBnb3RvIG91dF9lcnI7CisgICAgc3ByaW50Zih0bXAsICJkLTB4JTA0WC0lMDhkLmJvZiIsIGNzbS0+ZGV2aWNlX2lkLCBjc20tPm5ib2YrKyk7CisgICAgYm9mX2R1bXBfZmlsZShyb290LCB0bXApOworb3V0X2VycjoKKyAgICBib2ZfZGVjcmVmKGJsb2IpOworICAgIGJvZl9kZWNyZWYoYXJyYXkpOworICAgIGJvZl9kZWNyZWYoYm8pOworICAgIGJvZl9kZWNyZWYoc2l6ZSk7CisgICAgYm9mX2RlY3JlZihoYW5kbGUpOworICAgIGJvZl9kZWNyZWYoZGV2aWNlX2lkKTsKKyAgICBib2ZfZGVjcmVmKHJvb3QpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgY3NfZ2VtX2VtaXQoc3RydWN0IHJhZGVvbl9jc19pbnQgKmNzKQoreworICAgIHN0cnVjdCBjc19nZW0gKmNzZyA9IChzdHJ1Y3QgY3NfZ2VtKiljczsKKyAgICB1aW50NjRfdCBjaHVua19hcnJheVsyXTsKKyAgICB1bnNpZ25lZCBpOworICAgIGludCByOworCisgICAgd2hpbGUgKGNzLT5jZHcgJiA3KQorCXJhZGVvbl9jc193cml0ZV9kd29yZCgoc3RydWN0IHJhZGVvbl9jcyAqKWNzLCAweDgwMDAwMDAwKTsKKworI2lmIENTX0JPRl9EVU1QCisgICAgY3NfZ2VtX2R1bXBfYm9mKGNzKTsKKyNlbmRpZgorICAgIGNzZy0+Y2h1bmtzWzBdLmxlbmd0aF9kdyA9IGNzLT5jZHc7CisKKyAgICBjaHVua19hcnJheVswXSA9ICh1aW50NjRfdCkodWludHB0cl90KSZjc2ctPmNodW5rc1swXTsKKyAgICBjaHVua19hcnJheVsxXSA9ICh1aW50NjRfdCkodWludHB0cl90KSZjc2ctPmNodW5rc1sxXTsKKworICAgIGNzZy0+Y3MubnVtX2NodW5rcyA9IDI7CisgICAgY3NnLT5jcy5jaHVua3MgPSAodWludDY0X3QpKHVpbnRwdHJfdCljaHVua19hcnJheTsKKworICAgIHIgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGNzLT5jc20tPmZkLCBEUk1fUkFERU9OX0NTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjc2ctPmNzLCBzaXplb2Yoc3RydWN0IGRybV9yYWRlb25fY3MpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3NnLT5iYXNlLmNyZWxvY3M7IGkrKykgeworICAgICAgICBjc2ctPnJlbG9jc19ib1tpXS0+c3BhY2VfYWNjb3VudGVkID0gMDsKKyAgICAgICAgLyogYm8gbWlnaHQgYmUgcmVmZXJlbmNlZCBmcm9tIGFub3RoZXIgY29udGV4dCBzbyBoYXZlIHRvIHVzZSBhdG9taWMgb3BlcmF0aW9ucyAqLworICAgICAgICBhdG9taWNfZGVjKChhdG9taWNfdCAqKXJhZGVvbl9nZW1fZ2V0X3JlbG9jX2luX2NzKChzdHJ1Y3QgcmFkZW9uX2JvKiljc2ctPnJlbG9jc19ib1tpXSksIGNzLT5pZCk7CisgICAgICAgIHJhZGVvbl9ib191bnJlZigoc3RydWN0IHJhZGVvbl9ibyAqKWNzZy0+cmVsb2NzX2JvW2ldKTsKKyAgICAgICAgY3NnLT5yZWxvY3NfYm9baV0gPSBOVUxMOworICAgIH0KKworICAgIGNzLT5jc20tPnJlYWRfdXNlZCA9IDA7CisgICAgY3MtPmNzbS0+dnJhbV93cml0ZV91c2VkID0gMDsKKyAgICBjcy0+Y3NtLT5nYXJ0X3dyaXRlX3VzZWQgPSAwOworICAgIHJldHVybiByOworfQorCitzdGF0aWMgaW50IGNzX2dlbV9kZXN0cm95KHN0cnVjdCByYWRlb25fY3NfaW50ICpjcykKK3sKKyAgICBzdHJ1Y3QgY3NfZ2VtICpjc2cgPSAoc3RydWN0IGNzX2dlbSopY3M7CisKKyAgICBmcmVlX2lkKGNzLT5pZCk7CisgICAgZnJlZShjc2ctPnJlbG9jc19ibyk7CisgICAgZnJlZShjcy0+cmVsb2NzKTsKKyAgICBmcmVlKGNzLT5wYWNrZXRzKTsKKyAgICBmcmVlKGNzKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjc19nZW1fZXJhc2Uoc3RydWN0IHJhZGVvbl9jc19pbnQgKmNzKQoreworICAgIHN0cnVjdCBjc19nZW0gKmNzZyA9IChzdHJ1Y3QgY3NfZ2VtKiljczsKKyAgICB1bnNpZ25lZCBpOworCisgICAgaWYgKGNzZy0+cmVsb2NzX2JvKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjc2ctPmJhc2UuY3JlbG9jczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY3NnLT5yZWxvY3NfYm9baV0pIHsKKyAgICAgICAgICAgICAgICAvKiBibyBtaWdodCBiZSByZWZlcmVuY2VkIGZyb20gYW5vdGhlciBjb250ZXh0IHNvIGhhdmUgdG8gdXNlIGF0b21pYyBvcGVyYXRpb25zICovCisgICAgICAgICAgICAgICAgYXRvbWljX2RlYygoYXRvbWljX3QgKilyYWRlb25fZ2VtX2dldF9yZWxvY19pbl9jcygoc3RydWN0IHJhZGVvbl9ibyopY3NnLT5yZWxvY3NfYm9baV0pLCBjcy0+aWQpOworICAgICAgICAgICAgICAgIHJhZGVvbl9ib191bnJlZigoc3RydWN0IHJhZGVvbl9ibyAqKWNzZy0+cmVsb2NzX2JvW2ldKTsKKyAgICAgICAgICAgICAgICBjc2ctPnJlbG9jc19ib1tpXSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY3MtPnJlbG9jc190b3RhbF9zaXplID0gMDsKKyAgICBjcy0+Y2R3ID0gMDsKKyAgICBjcy0+c2VjdGlvbl9uZHcgPSAwOworICAgIGNzLT5jcmVsb2NzID0gMDsKKyAgICBjc2ctPmNodW5rc1swXS5sZW5ndGhfZHcgPSAwOworICAgIGNzZy0+Y2h1bmtzWzFdLmxlbmd0aF9kdyA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3NfZ2VtX25lZWRfZmx1c2goc3RydWN0IHJhZGVvbl9jc19pbnQgKmNzKQoreworICAgIHJldHVybiAwOyAvLyhjcy0+cmVsb2NzX3RvdGFsX3NpemUgPiAoMzIqMTAyNCoxMDI0KSk7Cit9CisKK3N0YXRpYyB2b2lkIGNzX2dlbV9wcmludChzdHJ1Y3QgcmFkZW9uX2NzX2ludCAqY3MsIEZJTEUgKmZpbGUpCit7CisgICAgc3RydWN0IHJhZGVvbl9jc19tYW5hZ2VyX2dlbSAqY3NtOworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgY3NtID0gKHN0cnVjdCByYWRlb25fY3NfbWFuYWdlcl9nZW0gKiljcy0+Y3NtOworICAgIGZwcmludGYoZmlsZSwgIlZFTkRPUklEOkRFVklDRUlEIDB4JTA0WDoweCUwNFhcbiIsIDB4MTAwMiwgY3NtLT5kZXZpY2VfaWQpOworICAgIGZvciAoaSA9IDA7IGkgPCBjcy0+Y2R3OyBpKyspIHsKKyAgICAgICAgZnByaW50ZihmaWxlLCAiMHglMDhYXG4iLCBjcy0+cGFja2V0c1tpXSk7CisgICAgfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJhZGVvbl9jc19mdW5jcyByYWRlb25fY3NfZ2VtX2Z1bmNzID0geworICAgIC5jc19jcmVhdGUgPSBjc19nZW1fY3JlYXRlLAorICAgIC5jc193cml0ZV9yZWxvYyA9IGNzX2dlbV93cml0ZV9yZWxvYywKKyAgICAuY3NfYmVnaW4gPSBjc19nZW1fYmVnaW4sCisgICAgLmNzX2VuZCA9IGNzX2dlbV9lbmQsCisgICAgLmNzX2VtaXQgPSBjc19nZW1fZW1pdCwKKyAgICAuY3NfZGVzdHJveSA9IGNzX2dlbV9kZXN0cm95LAorICAgIC5jc19lcmFzZSA9IGNzX2dlbV9lcmFzZSwKKyAgICAuY3NfbmVlZF9mbHVzaCA9IGNzX2dlbV9uZWVkX2ZsdXNoLAorICAgIC5jc19wcmludCA9IGNzX2dlbV9wcmludCwKK307CisKK3N0YXRpYyBpbnQgcmFkZW9uX2dldF9kZXZpY2VfaWQoaW50IGZkLCB1aW50MzJfdCAqZGV2aWNlX2lkKQoreworICAgIHN0cnVjdCBkcm1fcmFkZW9uX2luZm8gaW5mbyA9IHt9OworICAgIGludCByOworCisgICAgKmRldmljZV9pZCA9IDA7CisgICAgaW5mby5yZXF1ZXN0ID0gUkFERU9OX0lORk9fREVWSUNFX0lEOworICAgIGluZm8udmFsdWUgPSAodWludHB0cl90KWRldmljZV9pZDsKKyAgICByID0gZHJtQ29tbWFuZFdyaXRlUmVhZChmZCwgRFJNX1JBREVPTl9JTkZPLCAmaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGRybV9yYWRlb25faW5mbykpOworICAgIHJldHVybiByOworfQorCitzdHJ1Y3QgcmFkZW9uX2NzX21hbmFnZXIgKnJhZGVvbl9jc19tYW5hZ2VyX2dlbV9jdG9yKGludCBmZCkKK3sKKyAgICBzdHJ1Y3QgcmFkZW9uX2NzX21hbmFnZXJfZ2VtICpjc207CisKKyAgICBjc20gPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCByYWRlb25fY3NfbWFuYWdlcl9nZW0pKTsKKyAgICBpZiAoY3NtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGNzbS0+YmFzZS5mdW5jcyA9ICZyYWRlb25fY3NfZ2VtX2Z1bmNzOworICAgIGNzbS0+YmFzZS5mZCA9IGZkOworICAgIHJhZGVvbl9nZXRfZGV2aWNlX2lkKGZkLCAmY3NtLT5kZXZpY2VfaWQpOworICAgIHJldHVybiAmY3NtLT5iYXNlOworfQorCit2b2lkIHJhZGVvbl9jc19tYW5hZ2VyX2dlbV9kdG9yKHN0cnVjdCByYWRlb25fY3NfbWFuYWdlciAqY3NtKQoreworICAgIGZyZWUoY3NtKTsKK30KZGlmZiAtLWdpdCBhL3JhZGVvbi9yYWRlb25fY3NfZ2VtLmggYi9yYWRlb24vcmFkZW9uX2NzX2dlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZWEzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9yYWRlb24vcmFkZW9uX2NzX2dlbS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOCBOaWNvbGFpIEhhZWhubGUKKyAqIENvcHlyaWdodCDCqSAyMDA4IErDqXLDtG1lIEdsaXNzZQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMKKyAqIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICovCisvKgorICogQXV0aG9yczoKKyAqICAgICAgQWFwbyBUYWhrb2xhIDxhZXRAcmFzdGVyYnVybi5vcmc+CisgKiAgICAgIE5pY29sYWkgSGFlaG5sZSA8cHJlZmVjdF9AZ214Lm5ldD4KKyAqICAgICAgSsOpcsO0bWUgR2xpc3NlIDxnbGlzc2VAZnJlZWRlc2t0b3Aub3JnPgorICovCisjaWZuZGVmIFJBREVPTl9DU19HRU1fSAorI2RlZmluZSBSQURFT05fQ1NfR0VNX0gKKworI2luY2x1ZGUgInJhZGVvbl9jcy5oIgorCitzdHJ1Y3QgcmFkZW9uX2NzX21hbmFnZXIgKnJhZGVvbl9jc19tYW5hZ2VyX2dlbV9jdG9yKGludCBmZCk7Cit2b2lkIHJhZGVvbl9jc19tYW5hZ2VyX2dlbV9kdG9yKHN0cnVjdCByYWRlb25fY3NfbWFuYWdlciAqY3NtKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9yYWRlb24vcmFkZW9uX2NzX2ludC5oIGIvcmFkZW9uL3JhZGVvbl9jc19pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTA2YWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcmFkZW9uL3JhZGVvbl9jc19pbnQuaApAQCAtMCwwICsxLDY3IEBACisKKyNpZm5kZWYgX1JBREVPTl9DU19JTlRfSF8KKyNkZWZpbmUgX1JBREVPTl9DU19JTlRfSF8KKworc3RydWN0IHJhZGVvbl9jc19zcGFjZV9jaGVjayB7CisgICAgc3RydWN0IHJhZGVvbl9ib19pbnQgKmJvOworICAgIHVpbnQzMl90IHJlYWRfZG9tYWluczsKKyAgICB1aW50MzJfdCB3cml0ZV9kb21haW47CisgICAgdWludDMyX3QgbmV3X2FjY291bnRlZDsKK307CisKK3N0cnVjdCByYWRlb25fY3NfaW50IHsKKyAgICAvKiBrZWVwIGZpcnN0IHR3byBpbiBzYW1lIHBsYWNlICovCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICpwYWNrZXRzOyAgICAKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgY2R3OworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICBuZHc7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25fbmR3OworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICBzZWN0aW9uX2NkdzsKKyAgICAvKiBwcml2YXRlIG1lbWJlcnMgKi8KKyAgICBzdHJ1Y3QgcmFkZW9uX2NzX21hbmFnZXIgICAgKmNzbTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnJlbG9jczsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgY3JlbG9jczsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgcmVsb2NzX3RvdGFsX3NpemU7CisgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpzZWN0aW9uX2ZpbGU7CisgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpzZWN0aW9uX2Z1bmM7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25fbGluZTsKKyAgICBzdHJ1Y3QgcmFkZW9uX2NzX3NwYWNlX2NoZWNrIGJvc1tNQVhfU1BBQ0VfQk9TXTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgYm9fY291bnQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICgqc3BhY2VfZmx1c2hfZm4pKHZvaWQgKik7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICpzcGFjZV9mbHVzaF9kYXRhOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBpZDsKK307CisKKy8qIGNzIGZ1bmN0aW9ucyAqLworc3RydWN0IHJhZGVvbl9jc19mdW5jcyB7CisgICAgc3RydWN0IHJhZGVvbl9jc19pbnQgKigqY3NfY3JlYXRlKShzdHJ1Y3QgcmFkZW9uX2NzX21hbmFnZXIgKmNzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbmR3KTsKKyAgICBpbnQgKCpjc193cml0ZV9yZWxvYykoc3RydWN0IHJhZGVvbl9jc19pbnQgKmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFkZW9uX2JvICpibywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVhZF9kb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdyaXRlX2RvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOworICAgIGludCAoKmNzX2JlZ2luKShzdHJ1Y3QgcmFkZW9uX2NzX2ludCAqY3MsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5kdywKKwkJICAgIGNvbnN0IGNoYXIgKmZpbGUsCisJCSAgICBjb25zdCBjaGFyICpmdW5jLAorCQkgICAgaW50IGxpbmUpOworICAgIGludCAoKmNzX2VuZCkoc3RydWN0IHJhZGVvbl9jc19pbnQgKmNzLAorCQkgIGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKmZ1bmMsCisJCSAgaW50IGxpbmUpOworCisKKyAgICBpbnQgKCpjc19lbWl0KShzdHJ1Y3QgcmFkZW9uX2NzX2ludCAqY3MpOworICAgIGludCAoKmNzX2Rlc3Ryb3kpKHN0cnVjdCByYWRlb25fY3NfaW50ICpjcyk7CisgICAgaW50ICgqY3NfZXJhc2UpKHN0cnVjdCByYWRlb25fY3NfaW50ICpjcyk7CisgICAgaW50ICgqY3NfbmVlZF9mbHVzaCkoc3RydWN0IHJhZGVvbl9jc19pbnQgKmNzKTsKKyAgICB2b2lkICgqY3NfcHJpbnQpKHN0cnVjdCByYWRlb25fY3NfaW50ICpjcywgRklMRSAqZmlsZSk7Cit9OworCitzdHJ1Y3QgcmFkZW9uX2NzX21hbmFnZXIgeworICAgIGNvbnN0IHN0cnVjdCByYWRlb25fY3NfZnVuY3MgICpmdW5jczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBmZDsKKyAgICBpbnQzMl90IHZyYW1fbGltaXQsIGdhcnRfbGltaXQ7CisgICAgaW50MzJfdCB2cmFtX3dyaXRlX3VzZWQsIGdhcnRfd3JpdGVfdXNlZDsKKyAgICBpbnQzMl90IHJlYWRfdXNlZDsKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL3JhZGVvbi9yYWRlb25fY3Nfc3BhY2UuYyBiL3JhZGVvbi9yYWRlb25fY3Nfc3BhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTI4N2JlCi0tLSAvZGV2L251bGwKKysrIGIvcmFkZW9uL3JhZGVvbl9jc19zcGFjZS5jCkBAIC0wLDAgKzEsMjUxIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDkgUmVkIEhhdCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUworICogQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKi8KKy8qCisgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImxpYmRybV9tYWNyb3MuaCIKKyNpbmNsdWRlICJyYWRlb25fY3MuaCIKKyNpbmNsdWRlICJyYWRlb25fYm9faW50LmgiCisjaW5jbHVkZSAicmFkZW9uX2NzX2ludC5oIgorCitzdHJ1Y3QgcmFkX3NpemVzIHsKKyAgICBpbnQzMl90IG9wX3JlYWQ7CisgICAgaW50MzJfdCBvcF9nYXJ0X3dyaXRlOworICAgIGludDMyX3Qgb3BfdnJhbV93cml0ZTsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IHJhZGVvbl9jc19zZXR1cF9ibyhzdHJ1Y3QgcmFkZW9uX2NzX3NwYWNlX2NoZWNrICpzYywgc3RydWN0IHJhZF9zaXplcyAqc2l6ZXMpCit7CisgICAgdWludDMyX3QgcmVhZF9kb21haW5zLCB3cml0ZV9kb21haW47CisgICAgc3RydWN0IHJhZGVvbl9ib19pbnQgKmJvOworCisgICAgYm8gPSBzYy0+Ym87CisgICAgc2MtPm5ld19hY2NvdW50ZWQgPSAwOworICAgIHJlYWRfZG9tYWlucyA9IHNjLT5yZWFkX2RvbWFpbnM7CisgICAgd3JpdGVfZG9tYWluID0gc2MtPndyaXRlX2RvbWFpbjsKKworICAgIC8qIGxlZ2FjeSBuZWVkcyBhIHN0YXRpYyBjaGVjayAqLworICAgIGlmIChyYWRlb25fYm9faXNfc3RhdGljKChzdHJ1Y3QgcmFkZW9uX2JvICopc2MtPmJvKSkgeworICAgICAgICBiby0+c3BhY2VfYWNjb3VudGVkID0gc2MtPm5ld19hY2NvdW50ZWQgPSAocmVhZF9kb21haW5zIDw8IDE2KSB8IHdyaXRlX2RvbWFpbjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogYWxyZWFkeSBhY2NvdW50ZWQgdGhpcyBibyAqLworICAgIGlmICh3cml0ZV9kb21haW4gJiYgKHdyaXRlX2RvbWFpbiA9PSBiby0+c3BhY2VfYWNjb3VudGVkKSkgeworICAgICAgICBzYy0+bmV3X2FjY291bnRlZCA9IGJvLT5zcGFjZV9hY2NvdW50ZWQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAocmVhZF9kb21haW5zICYmICgocmVhZF9kb21haW5zIDw8IDE2KSA9PSBiby0+c3BhY2VfYWNjb3VudGVkKSkgeworICAgICAgICBzYy0+bmV3X2FjY291bnRlZCA9IGJvLT5zcGFjZV9hY2NvdW50ZWQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChiby0+c3BhY2VfYWNjb3VudGVkID09IDApIHsKKyAgICAgICAgaWYgKHdyaXRlX2RvbWFpbikgeworICAgICAgICAgICAgaWYgKHdyaXRlX2RvbWFpbiA9PSBSQURFT05fR0VNX0RPTUFJTl9WUkFNKQorICAgICAgICAgICAgICAgIHNpemVzLT5vcF92cmFtX3dyaXRlICs9IGJvLT5zaXplOworICAgICAgICAgICAgZWxzZSBpZiAod3JpdGVfZG9tYWluID09IFJBREVPTl9HRU1fRE9NQUlOX0dUVCkKKyAgICAgICAgICAgICAgICBzaXplcy0+b3BfZ2FydF93cml0ZSArPSBiby0+c2l6ZTsKKyAgICAgICAgICAgIHNjLT5uZXdfYWNjb3VudGVkID0gd3JpdGVfZG9tYWluOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZXMtPm9wX3JlYWQgKz0gYm8tPnNpemU7CisgICAgICAgICAgICBzYy0+bmV3X2FjY291bnRlZCA9IHJlYWRfZG9tYWlucyA8PCAxNjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQxNl90IG9sZF9yZWFkLCBvbGRfd3JpdGU7CisKKyAgICAgICAgb2xkX3JlYWQgPSBiby0+c3BhY2VfYWNjb3VudGVkID4+IDE2OworICAgICAgICBvbGRfd3JpdGUgPSBiby0+c3BhY2VfYWNjb3VudGVkICYgMHhmZmZmOworCisgICAgICAgIGlmICh3cml0ZV9kb21haW4gJiYgKG9sZF9yZWFkICYgd3JpdGVfZG9tYWluKSkgeworICAgICAgICAgICAgc2MtPm5ld19hY2NvdW50ZWQgPSB3cml0ZV9kb21haW47CisgICAgICAgICAgICAvKiBtb3ZpbmcgZnJvbSByZWFkIHRvIGEgd3JpdGUgZG9tYWluICovCisgICAgICAgICAgICBpZiAod3JpdGVfZG9tYWluID09IFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0pIHsKKyAgICAgICAgICAgICAgICBzaXplcy0+b3BfcmVhZCAtPSBiby0+c2l6ZTsKKyAgICAgICAgICAgICAgICBzaXplcy0+b3BfdnJhbV93cml0ZSArPSBiby0+c2l6ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod3JpdGVfZG9tYWluID09IFJBREVPTl9HRU1fRE9NQUlOX0dUVCkgeworICAgICAgICAgICAgICAgIHNpemVzLT5vcF9yZWFkIC09IGJvLT5zaXplOworICAgICAgICAgICAgICAgIHNpemVzLT5vcF9nYXJ0X3dyaXRlICs9IGJvLT5zaXplOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHJlYWRfZG9tYWlucyAmIG9sZF93cml0ZSkgeworICAgICAgICAgICAgc2MtPm5ld19hY2NvdW50ZWQgPSBiby0+c3BhY2VfYWNjb3VudGVkICYgMHhmZmZmOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogcmV3cml0ZSB0aGUgZG9tYWlucyAqLworICAgICAgICAgICAgaWYgKHdyaXRlX2RvbWFpbiAhPSBvbGRfd3JpdGUpCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIldSSVRFIERPTUFJTiBSRUxPQyBGQUlMVVJFIDB4JXggJWQgJWRcbiIsIGJvLT5oYW5kbGUsIHdyaXRlX2RvbWFpbiwgb2xkX3dyaXRlKTsKKyAgICAgICAgICAgIGlmIChyZWFkX2RvbWFpbnMgIT0gb2xkX3JlYWQpCisgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiUkVBRCBET01BSU4gUkVMT0MgRkFJTFVSRSAweCV4ICVkICVkXG4iLCBiby0+aGFuZGxlLCByZWFkX2RvbWFpbnMsIG9sZF9yZWFkKTsKKyAgICAgICAgICAgIHJldHVybiBSQURFT05fQ1NfU1BBQ0VfRkxVU0g7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2NzX2RvX3NwYWNlX2NoZWNrKHN0cnVjdCByYWRlb25fY3NfaW50ICpjcywgc3RydWN0IHJhZGVvbl9jc19zcGFjZV9jaGVjayAqbmV3X3RtcCkKK3sKKyAgICBzdHJ1Y3QgcmFkZW9uX2NzX21hbmFnZXIgKmNzbSA9IGNzLT5jc207CisgICAgaW50IGk7CisgICAgc3RydWN0IHJhZGVvbl9ib19pbnQgKmJvOworICAgIHN0cnVjdCByYWRfc2l6ZXMgc2l6ZXM7CisgICAgaW50IHJldDsKKworICAgIC8qIGNoZWNrIHRoZSB0b3RhbHMgZm9yIHRoaXMgb3BlcmF0aW9uICovCisKKyAgICBpZiAoY3MtPmJvX2NvdW50ID09IDAgJiYgIW5ld190bXApCisgICAgICAgIHJldHVybiAwOworCisgICAgbWVtc2V0KCZzaXplcywgMCwgc2l6ZW9mKHN0cnVjdCByYWRfc2l6ZXMpKTsKKworICAgIC8qIHByZXBhcmUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgY3MtPmJvX2NvdW50OyBpKyspIHsKKyAgICAgICAgcmV0ID0gcmFkZW9uX2NzX3NldHVwX2JvKCZjcy0+Ym9zW2ldLCAmc2l6ZXMpOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAobmV3X3RtcCkgeworICAgICAgICByZXQgPSByYWRlb25fY3Nfc2V0dXBfYm8obmV3X3RtcCwgJnNpemVzKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKHNpemVzLm9wX3JlYWQgPCAwKQorICAgICAgICBzaXplcy5vcF9yZWFkID0gMDsKKworICAgIC8qIGNoZWNrIHNpemVzIC0gb3BlcmF0aW9uIGZpcnN0ICovCisgICAgaWYgKChzaXplcy5vcF9yZWFkICsgc2l6ZXMub3BfZ2FydF93cml0ZSA+IGNzbS0+Z2FydF9saW1pdCkgfHwKKyAgICAgICAgKHNpemVzLm9wX3ZyYW1fd3JpdGUgPiBjc20tPnZyYW1fbGltaXQpKSB7CisgICAgICAgIHJldHVybiBSQURFT05fQ1NfU1BBQ0VfT1BfVE9fQklHOworICAgIH0KKworICAgIGlmICgoKGNzbS0+dnJhbV93cml0ZV91c2VkICsgc2l6ZXMub3BfdnJhbV93cml0ZSkgPiBjc20tPnZyYW1fbGltaXQpIHx8CisgICAgICAgICgoY3NtLT5yZWFkX3VzZWQgKyBjc20tPmdhcnRfd3JpdGVfdXNlZCArIHNpemVzLm9wX2dhcnRfd3JpdGUgKyBzaXplcy5vcF9yZWFkKSA+IGNzbS0+Z2FydF9saW1pdCkpIHsKKyAgICAgICAgcmV0dXJuIFJBREVPTl9DU19TUEFDRV9GTFVTSDsKKyAgICB9CisKKyAgICBjc20tPmdhcnRfd3JpdGVfdXNlZCArPSBzaXplcy5vcF9nYXJ0X3dyaXRlOworICAgIGNzbS0+dnJhbV93cml0ZV91c2VkICs9IHNpemVzLm9wX3ZyYW1fd3JpdGU7CisgICAgY3NtLT5yZWFkX3VzZWQgKz0gc2l6ZXMub3BfcmVhZDsKKyAgICAvKiBjb21taXQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgY3MtPmJvX2NvdW50OyBpKyspIHsKKyAgICAgICAgYm8gPSBjcy0+Ym9zW2ldLmJvOworICAgICAgICBiby0+c3BhY2VfYWNjb3VudGVkID0gY3MtPmJvc1tpXS5uZXdfYWNjb3VudGVkOworICAgIH0KKyAgICBpZiAobmV3X3RtcCkKKyAgICAgICAgbmV3X3RtcC0+Ym8tPnNwYWNlX2FjY291bnRlZCA9IG5ld190bXAtPm5ld19hY2NvdW50ZWQ7CisKKyAgICByZXR1cm4gUkFERU9OX0NTX1NQQUNFX09LOworfQorCit2b2lkCityYWRlb25fY3Nfc3BhY2VfYWRkX3BlcnNpc3RlbnRfYm8oc3RydWN0IHJhZGVvbl9jcyAqY3MsIHN0cnVjdCByYWRlb25fYm8gKmJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlYWRfZG9tYWlucywgdWludDMyX3Qgd3JpdGVfZG9tYWluKQoreworICAgIHN0cnVjdCByYWRlb25fY3NfaW50ICpjc2kgPSAoc3RydWN0IHJhZGVvbl9jc19pbnQgKiljczsKKyAgICBzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqYm9pID0gKHN0cnVjdCByYWRlb25fYm9faW50ICopYm87CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGNzaS0+Ym9fY291bnQ7IGkrKykgeworICAgICAgICBpZiAoY3NpLT5ib3NbaV0uYm8gPT0gYm9pICYmCisgICAgICAgICAgICBjc2ktPmJvc1tpXS5yZWFkX2RvbWFpbnMgPT0gcmVhZF9kb21haW5zICYmCisgICAgICAgICAgICBjc2ktPmJvc1tpXS53cml0ZV9kb21haW4gPT0gd3JpdGVfZG9tYWluKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByYWRlb25fYm9fcmVmKGJvKTsKKyAgICBpID0gY3NpLT5ib19jb3VudDsKKyAgICBjc2ktPmJvc1tpXS5ibyA9IGJvaTsKKyAgICBjc2ktPmJvc1tpXS5yZWFkX2RvbWFpbnMgPSByZWFkX2RvbWFpbnM7CisgICAgY3NpLT5ib3NbaV0ud3JpdGVfZG9tYWluID0gd3JpdGVfZG9tYWluOworICAgIGNzaS0+Ym9zW2ldLm5ld19hY2NvdW50ZWQgPSAwOworICAgIGNzaS0+Ym9fY291bnQrKzsKKworICAgIGFzc2VydChjc2ktPmJvX2NvdW50IDwgTUFYX1NQQUNFX0JPUyk7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2NzX2NoZWNrX3NwYWNlX2ludGVybmFsKHN0cnVjdCByYWRlb25fY3NfaW50ICpjcywKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFkZW9uX2NzX3NwYWNlX2NoZWNrICp0bXBfYm8pCit7CisgICAgaW50IHJldDsKKyAgICBpbnQgZmx1c2hlZCA9IDA7CisKK2FnYWluOgorICAgIHJldCA9IHJhZGVvbl9jc19kb19zcGFjZV9jaGVjayhjcywgdG1wX2JvKTsKKyAgICBpZiAocmV0ID09IFJBREVPTl9DU19TUEFDRV9PUF9UT19CSUcpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAocmV0ID09IFJBREVPTl9DU19TUEFDRV9GTFVTSCkgeworICAgICAgICAoKmNzLT5zcGFjZV9mbHVzaF9mbikoY3MtPnNwYWNlX2ZsdXNoX2RhdGEpOworICAgICAgICBpZiAoZmx1c2hlZCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZmx1c2hlZCA9IDE7CisgICAgICAgIGdvdG8gYWdhaW47CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQKK3JhZGVvbl9jc19zcGFjZV9jaGVja193aXRoX2JvKHN0cnVjdCByYWRlb25fY3MgKmNzLCBzdHJ1Y3QgcmFkZW9uX2JvICpibywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlYWRfZG9tYWlucywgdWludDMyX3Qgd3JpdGVfZG9tYWluKQoreworICAgIHN0cnVjdCByYWRlb25fY3NfaW50ICpjc2kgPSAoc3RydWN0IHJhZGVvbl9jc19pbnQgKiljczsKKyAgICBzdHJ1Y3QgcmFkZW9uX2JvX2ludCAqYm9pID0gKHN0cnVjdCByYWRlb25fYm9faW50ICopYm87CisgICAgc3RydWN0IHJhZGVvbl9jc19zcGFjZV9jaGVjayB0ZW1wX2JvOworCisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoYm8pIHsKKyAgICAgICAgdGVtcF9iby5ibyA9IGJvaTsKKyAgICAgICAgdGVtcF9iby5yZWFkX2RvbWFpbnMgPSByZWFkX2RvbWFpbnM7CisgICAgICAgIHRlbXBfYm8ud3JpdGVfZG9tYWluID0gd3JpdGVfZG9tYWluOworICAgICAgICB0ZW1wX2JvLm5ld19hY2NvdW50ZWQgPSAwOworICAgIH0KKworICAgIHJldCA9IHJhZGVvbl9jc19jaGVja19zcGFjZV9pbnRlcm5hbChjc2ksIGJvID8gJnRlbXBfYm8gOiBOVUxMKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgcmFkZW9uX2NzX3NwYWNlX2NoZWNrKHN0cnVjdCByYWRlb25fY3MgKmNzKQoreworICAgIHN0cnVjdCByYWRlb25fY3NfaW50ICpjc2kgPSAoc3RydWN0IHJhZGVvbl9jc19pbnQgKiljczsKKyAgICByZXR1cm4gcmFkZW9uX2NzX2NoZWNrX3NwYWNlX2ludGVybmFsKGNzaSwgTlVMTCk7Cit9CisKK3ZvaWQgcmFkZW9uX2NzX3NwYWNlX3Jlc2V0X2JvcyhzdHJ1Y3QgcmFkZW9uX2NzICpjcykKK3sKKyAgICBzdHJ1Y3QgcmFkZW9uX2NzX2ludCAqY3NpID0gKHN0cnVjdCByYWRlb25fY3NfaW50ICopY3M7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGNzaS0+Ym9fY291bnQ7IGkrKykgeworICAgICAgICByYWRlb25fYm9fdW5yZWYoKHN0cnVjdCByYWRlb25fYm8gKiljc2ktPmJvc1tpXS5ibyk7CisgICAgICAgIGNzaS0+Ym9zW2ldLmJvID0gTlVMTDsKKyAgICAgICAgY3NpLT5ib3NbaV0ucmVhZF9kb21haW5zID0gMDsKKyAgICAgICAgY3NpLT5ib3NbaV0ud3JpdGVfZG9tYWluID0gMDsKKyAgICAgICAgY3NpLT5ib3NbaV0ubmV3X2FjY291bnRlZCA9IDA7CisgICAgfQorICAgIGNzaS0+Ym9fY291bnQgPSAwOworfQpkaWZmIC0tZ2l0IGEvcmFkZW9uL3JhZGVvbl9zdXJmYWNlLmMgYi9yYWRlb24vcmFkZW9uX3N1cmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGRmNzdkCi0tLSAvZGV2L251bGwKKysrIGIvcmFkZW9uL3JhZGVvbl9zdXJmYWNlLmMKQEAgLTAsMCArMSwyNTY5IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTEgUmVkIEhhdCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUworICogQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKi8KKy8qCisgKiBBdXRob3JzOgorICogICAgICBKw6lyw7RtZSBHbGlzc2UgPGpnbGlzc2VAcmVkaGF0LmNvbT4KKyAqLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibGliZHJtX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmODZkcm0uaCIKKyNpbmNsdWRlICJyYWRlb25fZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uX3N1cmZhY2UuaCIKKworI2RlZmluZSBDSUtfVElMRV9NT0RFX0NPTE9SXzJECQkJMTQKKyNkZWZpbmUgQ0lLX1RJTEVfTU9ERV9DT0xPUl8yRF9TQ0FOT1VUCQkxMAorI2RlZmluZSBDSUtfVElMRV9NT0RFX0RFUFRIX1NURU5DSUxfMkRfVElMRVNQTElUXzY0ICAgICAgIDAKKyNkZWZpbmUgQ0lLX1RJTEVfTU9ERV9ERVBUSF9TVEVOQ0lMXzJEX1RJTEVTUExJVF8xMjggICAgICAxCisjZGVmaW5lIENJS19USUxFX01PREVfREVQVEhfU1RFTkNJTF8yRF9USUxFU1BMSVRfMjU2ICAgICAgMgorI2RlZmluZSBDSUtfVElMRV9NT0RFX0RFUFRIX1NURU5DSUxfMkRfVElMRVNQTElUXzUxMiAgICAgIDMKKyNkZWZpbmUgQ0lLX1RJTEVfTU9ERV9ERVBUSF9TVEVOQ0lMXzJEX1RJTEVTUExJVF9ST1dfU0laRSA0CisKKyNkZWZpbmUgQUxJR04odmFsdWUsIGFsaWdubWVudCkgKCgodmFsdWUpICsgYWxpZ25tZW50IC0gMSkgJiB+KGFsaWdubWVudCAtIDEpKQorI2RlZmluZSBNQVgyKEEsIEIpICAgICAgICAgICAgICAoKEEpID4gKEIpID8gKEEpIDogKEIpKQorI2RlZmluZSBNSU4yKEEsIEIpICAgICAgICAgICAgICAoKEEpIDwgKEIpID8gKEEpIDogKEIpKQorCisvKiBrZWVwIHRoaXMgcHJpdmF0ZSAqLworZW51bSByYWRlb25fZmFtaWx5IHsKKyAgICBDSElQX1VOS05PV04sCisgICAgQ0hJUF9SNjAwLAorICAgIENISVBfUlY2MTAsCisgICAgQ0hJUF9SVjYzMCwKKyAgICBDSElQX1JWNjcwLAorICAgIENISVBfUlY2MjAsCisgICAgQ0hJUF9SVjYzNSwKKyAgICBDSElQX1JTNzgwLAorICAgIENISVBfUlM4ODAsCisgICAgQ0hJUF9SVjc3MCwKKyAgICBDSElQX1JWNzMwLAorICAgIENISVBfUlY3MTAsCisgICAgQ0hJUF9SVjc0MCwKKyAgICBDSElQX0NFREFSLAorICAgIENISVBfUkVEV09PRCwKKyAgICBDSElQX0pVTklQRVIsCisgICAgQ0hJUF9DWVBSRVNTLAorICAgIENISVBfSEVNTE9DSywKKyAgICBDSElQX1BBTE0sCisgICAgQ0hJUF9TVU1PLAorICAgIENISVBfU1VNTzIsCisgICAgQ0hJUF9CQVJUUywKKyAgICBDSElQX1RVUktTLAorICAgIENISVBfQ0FJQ09TLAorICAgIENISVBfQ0FZTUFOLAorICAgIENISVBfQVJVQkEsCisgICAgQ0hJUF9UQUhJVEksCisgICAgQ0hJUF9QSVRDQUlSTiwKKyAgICBDSElQX1ZFUkRFLAorICAgIENISVBfT0xBTkQsCisgICAgQ0hJUF9IQUlOQU4sCisgICAgQ0hJUF9CT05BSVJFLAorICAgIENISVBfS0FWRVJJLAorICAgIENISVBfS0FCSU5JLAorICAgIENISVBfSEFXQUlJLAorICAgIENISVBfTVVMTElOUywKKyAgICBDSElQX0xBU1QsCit9OworCit0eXBlZGVmIGludCAoKmh3X2luaXRfc3VyZmFjZV90KShzdHJ1Y3QgcmFkZW9uX3N1cmZhY2VfbWFuYWdlciAqc3VyZl9tYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFkZW9uX3N1cmZhY2UgKnN1cmYpOwordHlwZWRlZiBpbnQgKCpod19iZXN0X3N1cmZhY2VfdCkoc3RydWN0IHJhZGVvbl9zdXJmYWNlX21hbmFnZXIgKnN1cmZfbWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJhZGVvbl9zdXJmYWNlICpzdXJmKTsKKworc3RydWN0IHJhZGVvbl9od19pbmZvIHsKKyAgICAvKiBhcHBseSB0byByNiwgZWcgKi8KKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5dGVzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2JhbmtzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BpcGVzOworICAgIC8qIGFwcGx5IHRvIGVnICovCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICByb3dfc2l6ZTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93XzJkOworICAgIC8qIGFwcGx5IHRvIHNpICovCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICB0aWxlX21vZGVfYXJyYXlbMzJdOworICAgIC8qIGFwcGx5IHRvIGNpayAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm90aWxlX21vZGVfYXJyYXlbMTZdOworfTsKKworc3RydWN0IHJhZGVvbl9zdXJmYWNlX21hbmFnZXIgeworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBmZDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2lkOworICAgIHN0cnVjdCByYWRlb25faHdfaW5mbyAgICAgICBod19pbmZvOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICBmYW1pbHk7CisgICAgaHdfaW5pdF9zdXJmYWNlX3QgICAgICAgICAgIHN1cmZhY2VfaW5pdDsKKyAgICBod19iZXN0X3N1cmZhY2VfdCAgICAgICAgICAgc3VyZmFjZV9iZXN0OworfTsKKworLyogaGVscGVyICovCitzdGF0aWMgaW50IHJhZGVvbl9nZXRfdmFsdWUoaW50IGZkLCB1bnNpZ25lZCByZXEsIHVpbnQzMl90ICp2YWx1ZSkKK3sKKyAgICBzdHJ1Y3QgZHJtX3JhZGVvbl9pbmZvIGluZm8gPSB7fTsKKyAgICBpbnQgcjsKKworICAgICp2YWx1ZSA9IDA7CisgICAgaW5mby5yZXF1ZXN0ID0gcmVxOworICAgIGluZm8udmFsdWUgPSAodWludHB0cl90KXZhbHVlOworICAgIHIgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGZkLCBEUk1fUkFERU9OX0lORk8sICZpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgZHJtX3JhZGVvbl9pbmZvKSk7CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2dldF9mYW1pbHkoc3RydWN0IHJhZGVvbl9zdXJmYWNlX21hbmFnZXIgKnN1cmZfbWFuKQoreworICAgIHN3aXRjaCAoc3VyZl9tYW4tPmRldmljZV9pZCkgeworI2RlZmluZSBDSElQU0VUKHBjaV9pZCwgbmFtZSwgZmFtKSBjYXNlIHBjaV9pZDogc3VyZl9tYW4tPmZhbWlseSA9IENISVBfIyNmYW07IGJyZWFrOworI2luY2x1ZGUgInI2MDBfcGNpX2lkcy5oIgorI3VuZGVmIENISVBTRVQKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBuZXh0X3Bvd2VyX29mX3R3byh1bnNpZ25lZCB4KQoreworICAgaWYgKHggPD0gMSkKKyAgICAgICByZXR1cm4gMTsKKworICAgcmV0dXJuICgxIDw8ICgoc2l6ZW9mKHVuc2lnbmVkKSAqIDgpIC0gX19idWlsdGluX2Nseih4IC0gMSkpKTsKK30KKworc3RhdGljIHVuc2lnbmVkIG1pcF9taW5pZnkodW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgbGV2ZWwpCit7CisgICAgdW5zaWduZWQgdmFsOworCisgICAgdmFsID0gTUFYMigxLCBzaXplID4+IGxldmVsKTsKKyAgICBpZiAobGV2ZWwgPiAwKQorICAgICAgICB2YWwgPSBuZXh0X3Bvd2VyX29mX3R3byh2YWwpOworICAgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHN1cmZfbWluaWZ5KHN0cnVjdCByYWRlb25fc3VyZmFjZSAqc3VyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZV9sZXZlbCAqc3VyZmxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYnBlLCB1bnNpZ25lZCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHhhbGlnbiwgdWludDMyX3QgeWFsaWduLCB1aW50MzJfdCB6YWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBvZmZzZXQpCit7CisgICAgc3VyZmxldmVsLT5ucGl4X3ggPSBtaXBfbWluaWZ5KHN1cmYtPm5waXhfeCwgbGV2ZWwpOworICAgIHN1cmZsZXZlbC0+bnBpeF95ID0gbWlwX21pbmlmeShzdXJmLT5ucGl4X3ksIGxldmVsKTsKKyAgICBzdXJmbGV2ZWwtPm5waXhfeiA9IG1pcF9taW5pZnkoc3VyZi0+bnBpeF96LCBsZXZlbCk7CisgICAgc3VyZmxldmVsLT5uYmxrX3ggPSAoc3VyZmxldmVsLT5ucGl4X3ggKyBzdXJmLT5ibGtfdyAtIDEpIC8gc3VyZi0+YmxrX3c7CisgICAgc3VyZmxldmVsLT5uYmxrX3kgPSAoc3VyZmxldmVsLT5ucGl4X3kgKyBzdXJmLT5ibGtfaCAtIDEpIC8gc3VyZi0+YmxrX2g7CisgICAgc3VyZmxldmVsLT5uYmxrX3ogPSAoc3VyZmxldmVsLT5ucGl4X3ogKyBzdXJmLT5ibGtfZCAtIDEpIC8gc3VyZi0+YmxrX2Q7CisgICAgaWYgKHN1cmYtPm5zYW1wbGVzID09IDEgJiYgc3VyZmxldmVsLT5tb2RlID09IFJBREVPTl9TVVJGX01PREVfMkQgJiYKKyAgICAgICAgIShzdXJmLT5mbGFncyAmIFJBREVPTl9TVVJGX0ZNQVNLKSkgeworICAgICAgICBpZiAoc3VyZmxldmVsLT5uYmxrX3ggPCB4YWxpZ24gfHwgc3VyZmxldmVsLT5uYmxrX3kgPCB5YWxpZ24pIHsKKyAgICAgICAgICAgIHN1cmZsZXZlbC0+bW9kZSA9IFJBREVPTl9TVVJGX01PREVfMUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgc3VyZmxldmVsLT5uYmxrX3ggID0gQUxJR04oc3VyZmxldmVsLT5uYmxrX3gsIHhhbGlnbik7CisgICAgc3VyZmxldmVsLT5uYmxrX3kgID0gQUxJR04oc3VyZmxldmVsLT5uYmxrX3ksIHlhbGlnbik7CisgICAgc3VyZmxldmVsLT5uYmxrX3ogID0gQUxJR04oc3VyZmxldmVsLT5uYmxrX3osIHphbGlnbik7CisKKyAgICBzdXJmbGV2ZWwtPm9mZnNldCA9IG9mZnNldDsKKyAgICBzdXJmbGV2ZWwtPnBpdGNoX2J5dGVzID0gc3VyZmxldmVsLT5uYmxrX3ggKiBicGUgKiBzdXJmLT5uc2FtcGxlczsKKyAgICBzdXJmbGV2ZWwtPnNsaWNlX3NpemUgPSAodWludDY0X3Qpc3VyZmxldmVsLT5waXRjaF9ieXRlcyAqIHN1cmZsZXZlbC0+bmJsa195OworCisgICAgc3VyZi0+Ym9fc2l6ZSA9IG9mZnNldCArIHN1cmZsZXZlbC0+c2xpY2Vfc2l6ZSAqIHN1cmZsZXZlbC0+bmJsa196ICogc3VyZi0+YXJyYXlfc2l6ZTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiByNjAwL3I3MDAgZmFtaWx5CisgKi8KK3N0YXRpYyBpbnQgcjZfaW5pdF9od19pbmZvKHN0cnVjdCByYWRlb25fc3VyZmFjZV9tYW5hZ2VyICpzdXJmX21hbikKK3sKKyAgICB1aW50MzJfdCB0aWxpbmdfY29uZmlnOworICAgIGRybVZlcnNpb25QdHIgdmVyc2lvbjsKKyAgICBpbnQgcjsKKworICAgIHIgPSByYWRlb25fZ2V0X3ZhbHVlKHN1cmZfbWFuLT5mZCwgUkFERU9OX0lORk9fVElMSU5HX0NPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmdGlsaW5nX2NvbmZpZyk7CisgICAgaWYgKHIpIHsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgc3VyZl9tYW4tPmh3X2luZm8uYWxsb3dfMmQgPSAwOworICAgIHZlcnNpb24gPSBkcm1HZXRWZXJzaW9uKHN1cmZfbWFuLT5mZCk7CisgICAgaWYgKHZlcnNpb24gJiYgdmVyc2lvbi0+dmVyc2lvbl9taW5vciA+PSAxNCkgeworICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5hbGxvd18yZCA9IDE7CisgICAgfQorICAgIGRybUZyZWVWZXJzaW9uKHZlcnNpb24pOworCisgICAgc3dpdGNoICgodGlsaW5nX2NvbmZpZyAmIDB4ZSkgPj4gMSkgeworICAgIGNhc2UgMDoKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8ubnVtX3BpcGVzID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5udW1fcGlwZXMgPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLm51bV9waXBlcyA9IDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8ubnVtX3BpcGVzID0gODsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8ubnVtX3BpcGVzID0gODsKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8uYWxsb3dfMmQgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKCh0aWxpbmdfY29uZmlnICYgMHgzMCkgPj4gNCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8ubnVtX2JhbmtzID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5udW1fYmFua3MgPSA4OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5udW1fYmFua3MgPSA4OworICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5hbGxvd18yZCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoKHRpbGluZ19jb25maWcgJiAweGMwKSA+PiA2KSB7CisgICAgY2FzZSAwOgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5ncm91cF9ieXRlcyA9IDI1NjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5ncm91cF9ieXRlcyA9IDUxMjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8uZ3JvdXBfYnl0ZXMgPSAyNTY7CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLmFsbG93XzJkID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHI2X3N1cmZhY2VfaW5pdF9saW5lYXIoc3RydWN0IHJhZGVvbl9zdXJmYWNlX21hbmFnZXIgKnN1cmZfbWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZSAqc3VyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBvZmZzZXQsIHVuc2lnbmVkIHN0YXJ0X2xldmVsKQoreworICAgIHVpbnQzMl90IHhhbGlnbiwgeWFsaWduLCB6YWxpZ247CisgICAgdW5zaWduZWQgaTsKKworICAgIC8qIGNvbXB1dGUgYWxpZ25tZW50ICovCisgICAgaWYgKCFzdGFydF9sZXZlbCkgeworICAgICAgICBzdXJmLT5ib19hbGlnbm1lbnQgPSBNQVgyKDI1Niwgc3VyZl9tYW4tPmh3X2luZm8uZ3JvdXBfYnl0ZXMpOworICAgIH0KKyAgICAvKiB0aGUgMzIgYWxpZ25tZW50IGlzIGZvciBzY2Fub3V0LCBjYiBvciBkYiBidXQgdG8gYWxsb3cgdGV4dHVyZSB0byBiZQorICAgICAqIGVhc2lseSBib3VuZCBhcyBzdWNoIHdlIGZvcmNlIHRoaXMgYWxpZ25tZW50IHRvIGFsbCBzdXJmYWNlCisgICAgICovCisgICAgeGFsaWduID0gTUFYMigxLCBzdXJmX21hbi0+aHdfaW5mby5ncm91cF9ieXRlcyAvIHN1cmYtPmJwZSk7CisgICAgeWFsaWduID0gMTsKKyAgICB6YWxpZ24gPSAxOworICAgIGlmIChzdXJmLT5mbGFncyAmIFJBREVPTl9TVVJGX1NDQU5PVVQpIHsKKyAgICAgICAgeGFsaWduID0gTUFYMigoc3VyZi0+YnBlID09IDEpID8gNjQgOiAzMiwgeGFsaWduKTsKKyAgICB9CisKKyAgICAvKiBidWlsZCBtaXBtYXAgdHJlZSAqLworICAgIGZvciAoaSA9IHN0YXJ0X2xldmVsOyBpIDw9IHN1cmYtPmxhc3RfbGV2ZWw7IGkrKykgeworICAgICAgICBzdXJmLT5sZXZlbFtpXS5tb2RlID0gUkFERU9OX1NVUkZfTU9ERV9MSU5FQVI7CisgICAgICAgIHN1cmZfbWluaWZ5KHN1cmYsIHN1cmYtPmxldmVsK2ksIHN1cmYtPmJwZSwgaSwgeGFsaWduLCB5YWxpZ24sIHphbGlnbiwgb2Zmc2V0KTsKKyAgICAgICAgLyogbGV2ZWwwIGFuZCBmaXJzdCBtaXBtYXAgbmVlZCB0byBoYXZlIGFsaWdubWVudCAqLworICAgICAgICBvZmZzZXQgPSBzdXJmLT5ib19zaXplOworICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICBvZmZzZXQgPSBBTElHTihvZmZzZXQsIHN1cmYtPmJvX2FsaWdubWVudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjZfc3VyZmFjZV9pbml0X2xpbmVhcl9hbGlnbmVkKHN0cnVjdCByYWRlb25fc3VyZmFjZV9tYW5hZ2VyICpzdXJmX21hbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZSAqc3VyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IG9mZnNldCwgdW5zaWduZWQgc3RhcnRfbGV2ZWwpCit7CisgICAgdWludDMyX3QgeGFsaWduLCB5YWxpZ24sIHphbGlnbjsKKyAgICB1bnNpZ25lZCBpOworCisgICAgLyogY29tcHV0ZSBhbGlnbm1lbnQgKi8KKyAgICBpZiAoIXN0YXJ0X2xldmVsKSB7CisgICAgICAgIHN1cmYtPmJvX2FsaWdubWVudCA9IE1BWDIoMjU2LCBzdXJmX21hbi0+aHdfaW5mby5ncm91cF9ieXRlcyk7CisgICAgfQorICAgIHhhbGlnbiA9IE1BWDIoNjQsIHN1cmZfbWFuLT5od19pbmZvLmdyb3VwX2J5dGVzIC8gc3VyZi0+YnBlKTsKKyAgICB5YWxpZ24gPSAxOworICAgIHphbGlnbiA9IDE7CisKKyAgICAvKiBidWlsZCBtaXBtYXAgdHJlZSAqLworICAgIGZvciAoaSA9IHN0YXJ0X2xldmVsOyBpIDw9IHN1cmYtPmxhc3RfbGV2ZWw7IGkrKykgeworICAgICAgICBzdXJmLT5sZXZlbFtpXS5tb2RlID0gUkFERU9OX1NVUkZfTU9ERV9MSU5FQVJfQUxJR05FRDsKKyAgICAgICAgc3VyZl9taW5pZnkoc3VyZiwgc3VyZi0+bGV2ZWwraSwgc3VyZi0+YnBlLCBpLCB4YWxpZ24sIHlhbGlnbiwgemFsaWduLCBvZmZzZXQpOworICAgICAgICAvKiBsZXZlbDAgYW5kIGZpcnN0IG1pcG1hcCBuZWVkIHRvIGhhdmUgYWxpZ25tZW50ICovCisgICAgICAgIG9mZnNldCA9IHN1cmYtPmJvX3NpemU7CisgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgIG9mZnNldCA9IEFMSUdOKG9mZnNldCwgc3VyZi0+Ym9fYWxpZ25tZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByNl9zdXJmYWNlX2luaXRfMWQoc3RydWN0IHJhZGVvbl9zdXJmYWNlX21hbmFnZXIgKnN1cmZfbWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJhZGVvbl9zdXJmYWNlICpzdXJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgb2Zmc2V0LCB1bnNpZ25lZCBzdGFydF9sZXZlbCkKK3sKKyAgICB1aW50MzJfdCB4YWxpZ24sIHlhbGlnbiwgemFsaWduLCB0aWxldzsKKyAgICB1bnNpZ25lZCBpOworCisgICAgLyogY29tcHV0ZSBhbGlnbm1lbnQgKi8KKyAgICB0aWxldyA9IDg7CisgICAgeGFsaWduID0gc3VyZl9tYW4tPmh3X2luZm8uZ3JvdXBfYnl0ZXMgLyAodGlsZXcgKiBzdXJmLT5icGUgKiBzdXJmLT5uc2FtcGxlcyk7CisgICAgeGFsaWduID0gTUFYMih0aWxldywgeGFsaWduKTsKKyAgICB5YWxpZ24gPSB0aWxldzsKKyAgICB6YWxpZ24gPSAxOworICAgIGlmIChzdXJmLT5mbGFncyAmIFJBREVPTl9TVVJGX1NDQU5PVVQpIHsKKyAgICAgICAgeGFsaWduID0gTUFYMigoc3VyZi0+YnBlID09IDEpID8gNjQgOiAzMiwgeGFsaWduKTsKKyAgICB9CisgICAgaWYgKCFzdGFydF9sZXZlbCkgeworICAgICAgICBzdXJmLT5ib19hbGlnbm1lbnQgPSBNQVgyKDI1Niwgc3VyZl9tYW4tPmh3X2luZm8uZ3JvdXBfYnl0ZXMpOworICAgIH0KKworICAgIC8qIGJ1aWxkIG1pcG1hcCB0cmVlICovCisgICAgZm9yIChpID0gc3RhcnRfbGV2ZWw7IGkgPD0gc3VyZi0+bGFzdF9sZXZlbDsgaSsrKSB7CisgICAgICAgIHN1cmYtPmxldmVsW2ldLm1vZGUgPSBSQURFT05fU1VSRl9NT0RFXzFEOworICAgICAgICBzdXJmX21pbmlmeShzdXJmLCBzdXJmLT5sZXZlbCtpLCBzdXJmLT5icGUsIGksIHhhbGlnbiwgeWFsaWduLCB6YWxpZ24sIG9mZnNldCk7CisgICAgICAgIC8qIGxldmVsMCBhbmQgZmlyc3QgbWlwbWFwIG5lZWQgdG8gaGF2ZSBhbGlnbm1lbnQgKi8KKyAgICAgICAgb2Zmc2V0ID0gc3VyZi0+Ym9fc2l6ZTsKKyAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgb2Zmc2V0ID0gQUxJR04ob2Zmc2V0LCBzdXJmLT5ib19hbGlnbm1lbnQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHI2X3N1cmZhY2VfaW5pdF8yZChzdHJ1Y3QgcmFkZW9uX3N1cmZhY2VfbWFuYWdlciAqc3VyZl9tYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFkZW9uX3N1cmZhY2UgKnN1cmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBvZmZzZXQsIHVuc2lnbmVkIHN0YXJ0X2xldmVsKQoreworICAgIHVpbnQzMl90IHhhbGlnbiwgeWFsaWduLCB6YWxpZ24sIHRpbGV3OworICAgIHVuc2lnbmVkIGk7CisKKyAgICAvKiBjb21wdXRlIGFsaWdubWVudCAqLworICAgIHRpbGV3ID0gODsKKyAgICB6YWxpZ24gPSAxOworICAgIHhhbGlnbiA9IChzdXJmX21hbi0+aHdfaW5mby5ncm91cF9ieXRlcyAqIHN1cmZfbWFuLT5od19pbmZvLm51bV9iYW5rcykgLworICAgICAgICAgICAgICh0aWxldyAqIHN1cmYtPmJwZSAqIHN1cmYtPm5zYW1wbGVzKTsKKyAgICB4YWxpZ24gPSBNQVgyKHRpbGV3ICogc3VyZl9tYW4tPmh3X2luZm8ubnVtX2JhbmtzLCB4YWxpZ24pOworICAgIGlmIChzdXJmLT5mbGFncyAmIFJBREVPTl9TVVJGX0ZNQVNLKQorCXhhbGlnbiA9IE1BWDIoMTI4LCB4YWxpZ24pOworICAgIHlhbGlnbiA9IHRpbGV3ICogc3VyZl9tYW4tPmh3X2luZm8ubnVtX3BpcGVzOworICAgIGlmIChzdXJmLT5mbGFncyAmIFJBREVPTl9TVVJGX1NDQU5PVVQpIHsKKyAgICAgICAgeGFsaWduID0gTUFYMigoc3VyZi0+YnBlID09IDEpID8gNjQgOiAzMiwgeGFsaWduKTsKKyAgICB9CisgICAgaWYgKCFzdGFydF9sZXZlbCkgeworICAgICAgICBzdXJmLT5ib19hbGlnbm1lbnQgPQorICAgICAgICAgICAgTUFYMihzdXJmX21hbi0+aHdfaW5mby5udW1fcGlwZXMgKgorICAgICAgICAgICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5udW1fYmFua3MgKgorICAgICAgICAgICAgICAgICBzdXJmLT5uc2FtcGxlcyAqIHN1cmYtPmJwZSAqIDY0LAorICAgICAgICAgICAgICAgICB4YWxpZ24gKiB5YWxpZ24gKiBzdXJmLT5uc2FtcGxlcyAqIHN1cmYtPmJwZSk7CisgICAgfQorCisgICAgLyogYnVpbGQgbWlwbWFwIHRyZWUgKi8KKyAgICBmb3IgKGkgPSBzdGFydF9sZXZlbDsgaSA8PSBzdXJmLT5sYXN0X2xldmVsOyBpKyspIHsKKyAgICAgICAgc3VyZi0+bGV2ZWxbaV0ubW9kZSA9IFJBREVPTl9TVVJGX01PREVfMkQ7CisgICAgICAgIHN1cmZfbWluaWZ5KHN1cmYsIHN1cmYtPmxldmVsK2ksIHN1cmYtPmJwZSwgaSwgeGFsaWduLCB5YWxpZ24sIHphbGlnbiwgb2Zmc2V0KTsKKyAgICAgICAgaWYgKHN1cmYtPmxldmVsW2ldLm1vZGUgPT0gUkFERU9OX1NVUkZfTU9ERV8xRCkgeworICAgICAgICAgICAgcmV0dXJuIHI2X3N1cmZhY2VfaW5pdF8xZChzdXJmX21hbiwgc3VyZiwgb2Zmc2V0LCBpKTsKKyAgICAgICAgfQorICAgICAgICAvKiBsZXZlbDAgYW5kIGZpcnN0IG1pcG1hcCBuZWVkIHRvIGhhdmUgYWxpZ25tZW50ICovCisgICAgICAgIG9mZnNldCA9IHN1cmYtPmJvX3NpemU7CisgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgIG9mZnNldCA9IEFMSUdOKG9mZnNldCwgc3VyZi0+Ym9fYWxpZ25tZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByNl9zdXJmYWNlX2luaXQoc3RydWN0IHJhZGVvbl9zdXJmYWNlX21hbmFnZXIgKnN1cmZfbWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJhZGVvbl9zdXJmYWNlICpzdXJmKQoreworICAgIHVuc2lnbmVkIG1vZGU7CisgICAgaW50IHI7CisKKyAgICAvKiBNU0FBIHN1cmZhY2VzIHN1cHBvcnQgdGhlIDJEIG1vZGUgb25seS4gKi8KKyAgICBpZiAoc3VyZi0+bnNhbXBsZXMgPiAxKSB7CisgICAgICAgIHN1cmYtPmZsYWdzID0gUkFERU9OX1NVUkZfQ0xSKHN1cmYtPmZsYWdzLCBNT0RFKTsKKyAgICAgICAgc3VyZi0+ZmxhZ3MgfD0gUkFERU9OX1NVUkZfU0VUKFJBREVPTl9TVVJGX01PREVfMkQsIE1PREUpOworICAgIH0KKworICAgIC8qIHRpbGluZyBtb2RlICovCisgICAgbW9kZSA9IChzdXJmLT5mbGFncyA+PiBSQURFT05fU1VSRl9NT0RFX1NISUZUKSAmIFJBREVPTl9TVVJGX01PREVfTUFTSzsKKworICAgIGlmIChzdXJmLT5mbGFncyAmIChSQURFT05fU1VSRl9aQlVGRkVSIHwgUkFERU9OX1NVUkZfU0JVRkZFUikpIHsKKyAgICAgICAgLyogemJ1ZmZlciBvbmx5IHN1cHBvcnQgMUQgb3IgMkQgdGlsZWQgc3VyZmFjZSAqLworICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgY2FzZSBSQURFT05fU1VSRl9NT0RFXzFEOgorICAgICAgICBjYXNlIFJBREVPTl9TVVJGX01PREVfMkQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1vZGUgPSBSQURFT05fU1VSRl9NT0RFXzFEOworICAgICAgICAgICAgc3VyZi0+ZmxhZ3MgPSBSQURFT05fU1VSRl9DTFIoc3VyZi0+ZmxhZ3MsIE1PREUpOworICAgICAgICAgICAgc3VyZi0+ZmxhZ3MgfD0gUkFERU9OX1NVUkZfU0VUKFJBREVPTl9TVVJGX01PREVfMUQsIE1PREUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBmb3JjZSAxZCBvbiBrZXJuZWwgdGhhdCBjYW4ndCBkbyAyZCAqLworICAgIGlmICghc3VyZl9tYW4tPmh3X2luZm8uYWxsb3dfMmQgJiYgbW9kZSA+IFJBREVPTl9TVVJGX01PREVfMUQpIHsKKyAgICAgICAgaWYgKHN1cmYtPm5zYW1wbGVzID4gMSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJyYWRlb246IENhbm5vdCB1c2UgMkQgdGlsaW5nIGZvciBhbiBNU0FBIHN1cmZhY2UgKCVpKS5cbiIsIF9fTElORV9fKTsKKyAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICB9CisgICAgICAgIG1vZGUgPSBSQURFT05fU1VSRl9NT0RFXzFEOworICAgICAgICBzdXJmLT5mbGFncyA9IFJBREVPTl9TVVJGX0NMUihzdXJmLT5mbGFncywgTU9ERSk7CisgICAgICAgIHN1cmYtPmZsYWdzIHw9IFJBREVPTl9TVVJGX1NFVChtb2RlLCBNT0RFKTsKKyAgICB9CisKKyAgICAvKiBjaGVjayBzdXJmYWNlIGRpbWVuc2lvbiAqLworICAgIGlmIChzdXJmLT5ucGl4X3ggPiA4MTkyIHx8IHN1cmYtPm5waXhfeSA+IDgxOTIgfHwgc3VyZi0+bnBpeF96ID4gODE5MikgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvKiBjaGVjayBtaXBtYXAgbGFzdF9sZXZlbCAqLworICAgIGlmIChzdXJmLT5sYXN0X2xldmVsID4gMTQpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLyogY2hlY2sgdGlsaW5nIG1vZGUgKi8KKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIFJBREVPTl9TVVJGX01PREVfTElORUFSOgorICAgICAgICByID0gcjZfc3VyZmFjZV9pbml0X2xpbmVhcihzdXJmX21hbiwgc3VyZiwgMCwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkFERU9OX1NVUkZfTU9ERV9MSU5FQVJfQUxJR05FRDoKKyAgICAgICAgciA9IHI2X3N1cmZhY2VfaW5pdF9saW5lYXJfYWxpZ25lZChzdXJmX21hbiwgc3VyZiwgMCwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkFERU9OX1NVUkZfTU9ERV8xRDoKKyAgICAgICAgciA9IHI2X3N1cmZhY2VfaW5pdF8xZChzdXJmX21hbiwgc3VyZiwgMCwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkFERU9OX1NVUkZfTU9ERV8yRDoKKyAgICAgICAgciA9IHI2X3N1cmZhY2VfaW5pdF8yZChzdXJmX21hbiwgc3VyZiwgMCwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGludCByNl9zdXJmYWNlX2Jlc3Qoc3RydWN0IHJhZGVvbl9zdXJmYWNlX21hbmFnZXIgKnN1cmZfbWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJhZGVvbl9zdXJmYWNlICpzdXJmKQoreworICAgIC8qIG5vIHZhbHVlIHRvIG9wdGltaXplIGZvciByNnh4L3I3eHggKi8KKyAgICByZXR1cm4gMDsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIGV2ZXJncmVlbiBmYW1pbHkKKyAqLworc3RhdGljIGludCBlZ19pbml0X2h3X2luZm8oc3RydWN0IHJhZGVvbl9zdXJmYWNlX21hbmFnZXIgKnN1cmZfbWFuKQoreworICAgIHVpbnQzMl90IHRpbGluZ19jb25maWc7CisgICAgZHJtVmVyc2lvblB0ciB2ZXJzaW9uOworICAgIGludCByOworCisgICAgciA9IHJhZGVvbl9nZXRfdmFsdWUoc3VyZl9tYW4tPmZkLCBSQURFT05fSU5GT19USUxJTkdfQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgICZ0aWxpbmdfY29uZmlnKTsKKyAgICBpZiAocikgeworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBzdXJmX21hbi0+aHdfaW5mby5hbGxvd18yZCA9IDA7CisgICAgdmVyc2lvbiA9IGRybUdldFZlcnNpb24oc3VyZl9tYW4tPmZkKTsKKyAgICBpZiAodmVyc2lvbiAmJiB2ZXJzaW9uLT52ZXJzaW9uX21pbm9yID49IDE2KSB7CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLmFsbG93XzJkID0gMTsKKyAgICB9CisgICAgZHJtRnJlZVZlcnNpb24odmVyc2lvbik7CisKKyAgICBzd2l0Y2ggKHRpbGluZ19jb25maWcgJiAweGYpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLm51bV9waXBlcyA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8ubnVtX3BpcGVzID0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5udW1fcGlwZXMgPSA0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLm51bV9waXBlcyA9IDg7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLm51bV9waXBlcyA9IDg7CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLmFsbG93XzJkID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoICgodGlsaW5nX2NvbmZpZyAmIDB4ZjApID4+IDQpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLm51bV9iYW5rcyA9IDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8ubnVtX2JhbmtzID0gODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5udW1fYmFua3MgPSAxNjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8ubnVtX2JhbmtzID0gODsKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8uYWxsb3dfMmQgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKCh0aWxpbmdfY29uZmlnICYgMHhmMDApID4+IDgpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLmdyb3VwX2J5dGVzID0gMjU2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLmdyb3VwX2J5dGVzID0gNTEyOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5ncm91cF9ieXRlcyA9IDI1NjsKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8uYWxsb3dfMmQgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKCh0aWxpbmdfY29uZmlnICYgMHhmMDAwKSA+PiAxMikgeworICAgIGNhc2UgMDoKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8ucm93X3NpemUgPSAxMDI0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLnJvd19zaXplID0gMjA0ODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5yb3dfc2l6ZSA9IDQwOTY7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLnJvd19zaXplID0gNDA5NjsKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8uYWxsb3dfMmQgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVnX3N1cmZfbWluaWZ5KHN0cnVjdCByYWRlb25fc3VyZmFjZSAqc3VyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZV9sZXZlbCAqc3VyZmxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYnBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzbGljZV9wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG10aWxldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG10aWxlaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG10aWxlYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IG9mZnNldCkKK3sKKyAgICB1bnNpZ25lZCBtdGlsZV9wciwgbXRpbGVfcHM7CisKKyAgICBzdXJmbGV2ZWwtPm5waXhfeCA9IG1pcF9taW5pZnkoc3VyZi0+bnBpeF94LCBsZXZlbCk7CisgICAgc3VyZmxldmVsLT5ucGl4X3kgPSBtaXBfbWluaWZ5KHN1cmYtPm5waXhfeSwgbGV2ZWwpOworICAgIHN1cmZsZXZlbC0+bnBpeF96ID0gbWlwX21pbmlmeShzdXJmLT5ucGl4X3osIGxldmVsKTsKKyAgICBzdXJmbGV2ZWwtPm5ibGtfeCA9IChzdXJmbGV2ZWwtPm5waXhfeCArIHN1cmYtPmJsa193IC0gMSkgLyBzdXJmLT5ibGtfdzsKKyAgICBzdXJmbGV2ZWwtPm5ibGtfeSA9IChzdXJmbGV2ZWwtPm5waXhfeSArIHN1cmYtPmJsa19oIC0gMSkgLyBzdXJmLT5ibGtfaDsKKyAgICBzdXJmbGV2ZWwtPm5ibGtfeiA9IChzdXJmbGV2ZWwtPm5waXhfeiArIHN1cmYtPmJsa19kIC0gMSkgLyBzdXJmLT5ibGtfZDsKKyAgICBpZiAoc3VyZi0+bnNhbXBsZXMgPT0gMSAmJiBzdXJmbGV2ZWwtPm1vZGUgPT0gUkFERU9OX1NVUkZfTU9ERV8yRCAmJgorICAgICAgICAhKHN1cmYtPmZsYWdzICYgUkFERU9OX1NVUkZfRk1BU0spKSB7CisgICAgICAgIGlmIChzdXJmbGV2ZWwtPm5ibGtfeCA8IG10aWxldyB8fCBzdXJmbGV2ZWwtPm5ibGtfeSA8IG10aWxlaCkgeworICAgICAgICAgICAgc3VyZmxldmVsLT5tb2RlID0gUkFERU9OX1NVUkZfTU9ERV8xRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdXJmbGV2ZWwtPm5ibGtfeCAgPSBBTElHTihzdXJmbGV2ZWwtPm5ibGtfeCwgbXRpbGV3KTsKKyAgICBzdXJmbGV2ZWwtPm5ibGtfeSAgPSBBTElHTihzdXJmbGV2ZWwtPm5ibGtfeSwgbXRpbGVoKTsKKyAgICBzdXJmbGV2ZWwtPm5ibGtfeiAgPSBBTElHTihzdXJmbGV2ZWwtPm5ibGtfeiwgMSk7CisKKyAgICAvKiBtYWNybyB0aWxlIHBlciByb3cgKi8KKyAgICBtdGlsZV9wciA9IHN1cmZsZXZlbC0+bmJsa194IC8gbXRpbGV3OworICAgIC8qIG1hY3JvIHRpbGUgcGVyIHNsaWNlICovCisgICAgbXRpbGVfcHMgPSAobXRpbGVfcHIgKiBzdXJmbGV2ZWwtPm5ibGtfeSkgLyBtdGlsZWg7CisKKyAgICBzdXJmbGV2ZWwtPm9mZnNldCA9IG9mZnNldDsKKyAgICBzdXJmbGV2ZWwtPnBpdGNoX2J5dGVzID0gc3VyZmxldmVsLT5uYmxrX3ggKiBicGUgKiBzdXJmLT5uc2FtcGxlczsKKyAgICBzdXJmbGV2ZWwtPnNsaWNlX3NpemUgPSAodWludDY0X3QpbXRpbGVfcHMgKiBtdGlsZWIgKiBzbGljZV9wdDsKKworICAgIHN1cmYtPmJvX3NpemUgPSBvZmZzZXQgKyBzdXJmbGV2ZWwtPnNsaWNlX3NpemUgKiBzdXJmbGV2ZWwtPm5ibGtfeiAqIHN1cmYtPmFycmF5X3NpemU7Cit9CisKK3N0YXRpYyBpbnQgZWdfc3VyZmFjZV9pbml0XzFkKHN0cnVjdCByYWRlb25fc3VyZmFjZV9tYW5hZ2VyICpzdXJmX21hbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZSAqc3VyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZV9sZXZlbCAqbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBicGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBvZmZzZXQsIHVuc2lnbmVkIHN0YXJ0X2xldmVsKQoreworICAgIHVpbnQzMl90IHhhbGlnbiwgeWFsaWduLCB6YWxpZ24sIHRpbGV3OworICAgIHVuc2lnbmVkIGk7CisKKyAgICAvKiBjb21wdXRlIGFsaWdubWVudCAqLworICAgIHRpbGV3ID0gODsKKyAgICB4YWxpZ24gPSBzdXJmX21hbi0+aHdfaW5mby5ncm91cF9ieXRlcyAvICh0aWxldyAqIGJwZSAqIHN1cmYtPm5zYW1wbGVzKTsKKyAgICB4YWxpZ24gPSBNQVgyKHRpbGV3LCB4YWxpZ24pOworICAgIHlhbGlnbiA9IHRpbGV3OworICAgIHphbGlnbiA9IDE7CisgICAgaWYgKHN1cmYtPmZsYWdzICYgUkFERU9OX1NVUkZfU0NBTk9VVCkgeworICAgICAgICB4YWxpZ24gPSBNQVgyKChicGUgPT0gMSkgPyA2NCA6IDMyLCB4YWxpZ24pOworICAgIH0KKworICAgIGlmICghc3RhcnRfbGV2ZWwpIHsKKyAgICAgICAgdW5zaWduZWQgYWxpZ25tZW50ID0gTUFYMigyNTYsIHN1cmZfbWFuLT5od19pbmZvLmdyb3VwX2J5dGVzKTsKKyAgICAgICAgc3VyZi0+Ym9fYWxpZ25tZW50ID0gTUFYMihzdXJmLT5ib19hbGlnbm1lbnQsIGFsaWdubWVudCk7CisKKyAgICAgICAgaWYgKG9mZnNldCkgeworICAgICAgICAgICAgb2Zmc2V0ID0gQUxJR04ob2Zmc2V0LCBhbGlnbm1lbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogYnVpbGQgbWlwbWFwIHRyZWUgKi8KKyAgICBmb3IgKGkgPSBzdGFydF9sZXZlbDsgaSA8PSBzdXJmLT5sYXN0X2xldmVsOyBpKyspIHsKKyAgICAgICAgbGV2ZWxbaV0ubW9kZSA9IFJBREVPTl9TVVJGX01PREVfMUQ7CisgICAgICAgIHN1cmZfbWluaWZ5KHN1cmYsIGxldmVsK2ksIGJwZSwgaSwgeGFsaWduLCB5YWxpZ24sIHphbGlnbiwgb2Zmc2V0KTsKKyAgICAgICAgLyogbGV2ZWwwIGFuZCBmaXJzdCBtaXBtYXAgbmVlZCB0byBoYXZlIGFsaWdubWVudCAqLworICAgICAgICBvZmZzZXQgPSBzdXJmLT5ib19zaXplOworICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICBvZmZzZXQgPSBBTElHTihvZmZzZXQsIHN1cmYtPmJvX2FsaWdubWVudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZWdfc3VyZmFjZV9pbml0XzJkKHN0cnVjdCByYWRlb25fc3VyZmFjZV9tYW5hZ2VyICpzdXJmX21hbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZSAqc3VyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZV9sZXZlbCAqbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBicGUsIHVuc2lnbmVkIHRpbGVfc3BsaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBvZmZzZXQsIHVuc2lnbmVkIHN0YXJ0X2xldmVsKQoreworICAgIHVuc2lnbmVkIHRpbGV3LCB0aWxlaCwgdGlsZWI7CisgICAgdW5zaWduZWQgbXRpbGV3LCBtdGlsZWgsIG10aWxlYjsKKyAgICB1bnNpZ25lZCBzbGljZV9wdDsKKyAgICB1bnNpZ25lZCBpOworCisgICAgLyogY29tcHV0ZSB0aWxlIHZhbHVlcyAqLworICAgIHRpbGV3ID0gODsKKyAgICB0aWxlaCA9IDg7CisgICAgdGlsZWIgPSB0aWxldyAqIHRpbGVoICogYnBlICogc3VyZi0+bnNhbXBsZXM7CisgICAgLyogc2xpY2VzIHBlciB0aWxlICovCisgICAgc2xpY2VfcHQgPSAxOworICAgIGlmICh0aWxlYiA+IHRpbGVfc3BsaXQgJiYgdGlsZV9zcGxpdCkgeworICAgICAgICBzbGljZV9wdCA9IHRpbGViIC8gdGlsZV9zcGxpdDsKKyAgICB9CisgICAgdGlsZWIgPSB0aWxlYiAvIHNsaWNlX3B0OworCisgICAgLyogbWFjcm8gdGlsZSB3aWR0aCAmIGhlaWdodCAqLworICAgIG10aWxldyA9ICh0aWxldyAqIHN1cmYtPmJhbmt3ICogc3VyZl9tYW4tPmh3X2luZm8ubnVtX3BpcGVzKSAqIHN1cmYtPm10aWxlYTsKKyAgICBtdGlsZWggPSAodGlsZWggKiBzdXJmLT5iYW5raCAqIHN1cmZfbWFuLT5od19pbmZvLm51bV9iYW5rcykgLyBzdXJmLT5tdGlsZWE7CisgICAgLyogbWFjcm8gdGlsZSBieXRlcyAqLworICAgIG10aWxlYiA9IChtdGlsZXcgLyB0aWxldykgKiAobXRpbGVoIC8gdGlsZWgpICogdGlsZWI7CisKKyAgICBpZiAoIXN0YXJ0X2xldmVsKSB7CisgICAgICAgIHVuc2lnbmVkIGFsaWdubWVudCA9IE1BWDIoMjU2LCBtdGlsZWIpOworICAgICAgICBzdXJmLT5ib19hbGlnbm1lbnQgPSBNQVgyKHN1cmYtPmJvX2FsaWdubWVudCwgYWxpZ25tZW50KTsKKworICAgICAgICBpZiAob2Zmc2V0KSB7CisgICAgICAgICAgICBvZmZzZXQgPSBBTElHTihvZmZzZXQsIGFsaWdubWVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBidWlsZCBtaXBtYXAgdHJlZSAqLworICAgIGZvciAoaSA9IHN0YXJ0X2xldmVsOyBpIDw9IHN1cmYtPmxhc3RfbGV2ZWw7IGkrKykgeworICAgICAgICBsZXZlbFtpXS5tb2RlID0gUkFERU9OX1NVUkZfTU9ERV8yRDsKKyAgICAgICAgZWdfc3VyZl9taW5pZnkoc3VyZiwgbGV2ZWwraSwgYnBlLCBpLCBzbGljZV9wdCwgbXRpbGV3LCBtdGlsZWgsIG10aWxlYiwgb2Zmc2V0KTsKKyAgICAgICAgaWYgKGxldmVsW2ldLm1vZGUgPT0gUkFERU9OX1NVUkZfTU9ERV8xRCkgeworICAgICAgICAgICAgcmV0dXJuIGVnX3N1cmZhY2VfaW5pdF8xZChzdXJmX21hbiwgc3VyZiwgbGV2ZWwsIGJwZSwgb2Zmc2V0LCBpKTsKKyAgICAgICAgfQorICAgICAgICAvKiBsZXZlbDAgYW5kIGZpcnN0IG1pcG1hcCBuZWVkIHRvIGhhdmUgYWxpZ25tZW50ICovCisgICAgICAgIG9mZnNldCA9IHN1cmYtPmJvX3NpemU7CisgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgIG9mZnNldCA9IEFMSUdOKG9mZnNldCwgc3VyZi0+Ym9fYWxpZ25tZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlZ19zdXJmYWNlX3Nhbml0eShzdHJ1Y3QgcmFkZW9uX3N1cmZhY2VfbWFuYWdlciAqc3VyZl9tYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZSAqc3VyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbW9kZSkKK3sKKyAgICB1bnNpZ25lZCB0aWxlYjsKKworICAgIC8qIGNoZWNrIHN1cmZhY2UgZGltZW5zaW9uICovCisgICAgaWYgKHN1cmYtPm5waXhfeCA+IDE2Mzg0IHx8IHN1cmYtPm5waXhfeSA+IDE2Mzg0IHx8IHN1cmYtPm5waXhfeiA+IDE2Mzg0KSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8qIGNoZWNrIG1pcG1hcCBsYXN0X2xldmVsICovCisgICAgaWYgKHN1cmYtPmxhc3RfbGV2ZWwgPiAxNSkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvKiBmb3JjZSAxZCBvbiBrZXJuZWwgdGhhdCBjYW4ndCBkbyAyZCAqLworICAgIGlmICghc3VyZl9tYW4tPmh3X2luZm8uYWxsb3dfMmQgJiYgbW9kZSA+IFJBREVPTl9TVVJGX01PREVfMUQpIHsKKyAgICAgICAgaWYgKHN1cmYtPm5zYW1wbGVzID4gMSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJyYWRlb246IENhbm5vdCB1c2UgMkQgdGlsaW5nIGZvciBhbiBNU0FBIHN1cmZhY2UgKCVpKS5cbiIsIF9fTElORV9fKTsKKyAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICB9CisgICAgICAgIG1vZGUgPSBSQURFT05fU1VSRl9NT0RFXzFEOworICAgICAgICBzdXJmLT5mbGFncyA9IFJBREVPTl9TVVJGX0NMUihzdXJmLT5mbGFncywgTU9ERSk7CisgICAgICAgIHN1cmYtPmZsYWdzIHw9IFJBREVPTl9TVVJGX1NFVChtb2RlLCBNT0RFKTsKKyAgICB9CisKKyAgICAvKiBjaGVjayB0aWxlIHNwbGl0ICovCisgICAgaWYgKG1vZGUgPT0gUkFERU9OX1NVUkZfTU9ERV8yRCkgeworICAgICAgICBzd2l0Y2ggKHN1cmYtPnRpbGVfc3BsaXQpIHsKKyAgICAgICAgY2FzZSA2NDoKKyAgICAgICAgY2FzZSAxMjg6CisgICAgICAgIGNhc2UgMjU2OgorICAgICAgICBjYXNlIDUxMjoKKyAgICAgICAgY2FzZSAxMDI0OgorICAgICAgICBjYXNlIDIwNDg6CisgICAgICAgIGNhc2UgNDA5NjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChzdXJmLT5tdGlsZWEpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAvKiBjaGVjayBhc3BlY3QgcmF0aW8gKi8KKyAgICAgICAgaWYgKHN1cmZfbWFuLT5od19pbmZvLm51bV9iYW5rcyA8IHN1cmYtPm10aWxlYSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgLyogY2hlY2sgYmFuayB3aWR0aCAqLworICAgICAgICBzd2l0Y2ggKHN1cmYtPmJhbmt3KSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAyOgorICAgICAgICBjYXNlIDQ6CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgLyogY2hlY2sgYmFuayBoZWlnaHQgKi8KKyAgICAgICAgc3dpdGNoIChzdXJmLT5iYW5raCkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgY2FzZSA0OgorICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIHRpbGViID0gTUlOMihzdXJmLT50aWxlX3NwbGl0LCA2NCAqIHN1cmYtPmJwZSAqIHN1cmYtPm5zYW1wbGVzKTsKKyAgICAgICAgaWYgKCh0aWxlYiAqIHN1cmYtPmJhbmtoICogc3VyZi0+YmFua3cpIDwgc3VyZl9tYW4tPmh3X2luZm8uZ3JvdXBfYnl0ZXMpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZWdfc3VyZmFjZV9pbml0XzFkX21pcHRyZWVzKHN0cnVjdCByYWRlb25fc3VyZmFjZV9tYW5hZ2VyICpzdXJmX21hbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZSAqc3VyZikKK3sKKyAgICB1bnNpZ25lZCB6c19mbGFncyA9IFJBREVPTl9TVVJGX1pCVUZGRVIgfCBSQURFT05fU1VSRl9TQlVGRkVSOworICAgIGludCByLCBpc19kZXB0aF9zdGVuY2lsID0gKHN1cmYtPmZsYWdzICYgenNfZmxhZ3MpID09IHpzX2ZsYWdzOworICAgIC8qIE9sZCBsaWJkcm1fbWFjcm9zLmhlYWRlcnMgZGlkbid0IGhhdmUgc3RlbmNpbF9sZXZlbCBpbiBpdC4gVGhpcyBwcmV2ZW50cyBjcmFzaGVzLiAqLworICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZV9sZXZlbCB0bXBbUkFERU9OX1NVUkZfTUFYX0xFVkVMXTsKKyAgICBzdHJ1Y3QgcmFkZW9uX3N1cmZhY2VfbGV2ZWwgKnN0ZW5jaWxfbGV2ZWwgPQorICAgICAgICAoc3VyZi0+ZmxhZ3MgJiBSQURFT05fU1VSRl9IQVNfU0JVRkZFUl9NSVBUUkVFKSA/IHN1cmYtPnN0ZW5jaWxfbGV2ZWwgOiB0bXA7CisKKyAgICByID0gZWdfc3VyZmFjZV9pbml0XzFkKHN1cmZfbWFuLCBzdXJmLCBzdXJmLT5sZXZlbCwgc3VyZi0+YnBlLCAwLCAwKTsKKyAgICBpZiAocikKKyAgICAgICAgcmV0dXJuIHI7CisKKyAgICBpZiAoaXNfZGVwdGhfc3RlbmNpbCkgeworICAgICAgICByID0gZWdfc3VyZmFjZV9pbml0XzFkKHN1cmZfbWFuLCBzdXJmLCBzdGVuY2lsX2xldmVsLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmYtPmJvX3NpemUsIDApOworICAgICAgICBzdXJmLT5zdGVuY2lsX29mZnNldCA9IHN0ZW5jaWxfbGV2ZWxbMF0ub2Zmc2V0OworICAgIH0KKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGludCBlZ19zdXJmYWNlX2luaXRfMmRfbWlwdHJlZXMoc3RydWN0IHJhZGVvbl9zdXJmYWNlX21hbmFnZXIgKnN1cmZfbWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJhZGVvbl9zdXJmYWNlICpzdXJmKQoreworICAgIHVuc2lnbmVkIHpzX2ZsYWdzID0gUkFERU9OX1NVUkZfWkJVRkZFUiB8IFJBREVPTl9TVVJGX1NCVUZGRVI7CisgICAgaW50IHIsIGlzX2RlcHRoX3N0ZW5jaWwgPSAoc3VyZi0+ZmxhZ3MgJiB6c19mbGFncykgPT0genNfZmxhZ3M7CisgICAgLyogT2xkIGxpYmRybV9tYWNyb3MuaGVhZGVycyBkaWRuJ3QgaGF2ZSBzdGVuY2lsX2xldmVsIGluIGl0LiBUaGlzIHByZXZlbnRzIGNyYXNoZXMuICovCisgICAgc3RydWN0IHJhZGVvbl9zdXJmYWNlX2xldmVsIHRtcFtSQURFT05fU1VSRl9NQVhfTEVWRUxdOworICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZV9sZXZlbCAqc3RlbmNpbF9sZXZlbCA9CisgICAgICAgIChzdXJmLT5mbGFncyAmIFJBREVPTl9TVVJGX0hBU19TQlVGRkVSX01JUFRSRUUpID8gc3VyZi0+c3RlbmNpbF9sZXZlbCA6IHRtcDsKKworICAgIHIgPSBlZ19zdXJmYWNlX2luaXRfMmQoc3VyZl9tYW4sIHN1cmYsIHN1cmYtPmxldmVsLCBzdXJmLT5icGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmLT50aWxlX3NwbGl0LCAwLCAwKTsKKyAgICBpZiAocikKKyAgICAgICAgcmV0dXJuIHI7CisKKyAgICBpZiAoaXNfZGVwdGhfc3RlbmNpbCkgeworICAgICAgICByID0gZWdfc3VyZmFjZV9pbml0XzJkKHN1cmZfbWFuLCBzdXJmLCBzdGVuY2lsX2xldmVsLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmYtPnN0ZW5jaWxfdGlsZV9zcGxpdCwgc3VyZi0+Ym9fc2l6ZSwgMCk7CisgICAgICAgIHN1cmYtPnN0ZW5jaWxfb2Zmc2V0ID0gc3RlbmNpbF9sZXZlbFswXS5vZmZzZXQ7CisgICAgfQorICAgIHJldHVybiByOworfQorCitzdGF0aWMgaW50IGVnX3N1cmZhY2VfaW5pdChzdHJ1Y3QgcmFkZW9uX3N1cmZhY2VfbWFuYWdlciAqc3VyZl9tYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFkZW9uX3N1cmZhY2UgKnN1cmYpCit7CisgICAgdW5zaWduZWQgbW9kZTsKKyAgICBpbnQgcjsKKworICAgIC8qIE1TQUEgc3VyZmFjZXMgc3VwcG9ydCB0aGUgMkQgbW9kZSBvbmx5LiAqLworICAgIGlmIChzdXJmLT5uc2FtcGxlcyA+IDEpIHsKKyAgICAgICAgc3VyZi0+ZmxhZ3MgPSBSQURFT05fU1VSRl9DTFIoc3VyZi0+ZmxhZ3MsIE1PREUpOworICAgICAgICBzdXJmLT5mbGFncyB8PSBSQURFT05fU1VSRl9TRVQoUkFERU9OX1NVUkZfTU9ERV8yRCwgTU9ERSk7CisgICAgfQorCisgICAgLyogdGlsaW5nIG1vZGUgKi8KKyAgICBtb2RlID0gKHN1cmYtPmZsYWdzID4+IFJBREVPTl9TVVJGX01PREVfU0hJRlQpICYgUkFERU9OX1NVUkZfTU9ERV9NQVNLOworCisgICAgaWYgKHN1cmYtPmZsYWdzICYgKFJBREVPTl9TVVJGX1pCVUZGRVIgfCBSQURFT05fU1VSRl9TQlVGRkVSKSkgeworICAgICAgICAvKiB6YnVmZmVyIG9ubHkgc3VwcG9ydCAxRCBvciAyRCB0aWxlZCBzdXJmYWNlICovCisgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIFJBREVPTl9TVVJGX01PREVfMUQ6CisgICAgICAgIGNhc2UgUkFERU9OX1NVUkZfTU9ERV8yRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbW9kZSA9IFJBREVPTl9TVVJGX01PREVfMUQ7CisgICAgICAgICAgICBzdXJmLT5mbGFncyA9IFJBREVPTl9TVVJGX0NMUihzdXJmLT5mbGFncywgTU9ERSk7CisgICAgICAgICAgICBzdXJmLT5mbGFncyB8PSBSQURFT05fU1VSRl9TRVQoUkFERU9OX1NVUkZfTU9ERV8xRCwgTU9ERSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHIgPSBlZ19zdXJmYWNlX3Nhbml0eShzdXJmX21hbiwgc3VyZiwgbW9kZSk7CisgICAgaWYgKHIpIHsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgc3VyZi0+c3RlbmNpbF9vZmZzZXQgPSAwOworICAgIHN1cmYtPmJvX2FsaWdubWVudCA9IDA7CisKKyAgICAvKiBjaGVjayB0aWxpbmcgbW9kZSAqLworICAgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgUkFERU9OX1NVUkZfTU9ERV9MSU5FQVI6CisgICAgICAgIHIgPSByNl9zdXJmYWNlX2luaXRfbGluZWFyKHN1cmZfbWFuLCBzdXJmLCAwLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSQURFT05fU1VSRl9NT0RFX0xJTkVBUl9BTElHTkVEOgorICAgICAgICByID0gcjZfc3VyZmFjZV9pbml0X2xpbmVhcl9hbGlnbmVkKHN1cmZfbWFuLCBzdXJmLCAwLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSQURFT05fU1VSRl9NT0RFXzFEOgorICAgICAgICByID0gZWdfc3VyZmFjZV9pbml0XzFkX21pcHRyZWVzKHN1cmZfbWFuLCBzdXJmKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSQURFT05fU1VSRl9NT0RFXzJEOgorICAgICAgICByID0gZWdfc3VyZmFjZV9pbml0XzJkX21pcHRyZWVzKHN1cmZfbWFuLCBzdXJmKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHJldHVybiByOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9nMl9pbnQodW5zaWduZWQgeCkKK3sKKyAgICB1bnNpZ25lZCBsOworCisgICAgaWYgKHggPCAyKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmb3IgKGwgPSAyOyA7IGwrKykgeworICAgICAgICBpZiAoKHVuc2lnbmVkKSgxIDw8IGwpID4geCkgeworICAgICAgICAgICAgcmV0dXJuIGwgLSAxOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBjb21wdXRlIGJlc3QgdGlsZV9zcGxpdCwgYmFua3csIGJhbmtoLCBtdGlsZWEKKyAqIGRlcGVuZGluZyBvbiBzdXJmYWNlCisgKi8KK3N0YXRpYyBpbnQgZWdfc3VyZmFjZV9iZXN0KHN0cnVjdCByYWRlb25fc3VyZmFjZV9tYW5hZ2VyICpzdXJmX21hbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZSAqc3VyZikKK3sKKyAgICB1bnNpZ25lZCBtb2RlLCB0aWxlYiwgaF9vdmVyX3c7CisgICAgaW50IHI7CisKKyAgICAvKiB0aWxpbmcgbW9kZSAqLworICAgIG1vZGUgPSAoc3VyZi0+ZmxhZ3MgPj4gUkFERU9OX1NVUkZfTU9ERV9TSElGVCkgJiBSQURFT05fU1VSRl9NT0RFX01BU0s7CisKKyAgICAvKiBzZXQgc29tZSBkZWZhdWx0IHZhbHVlIHRvIGF2b2lkIHNhbml0eSBjaGVjayBjaG9raW5nIG9uIHRoZW0gKi8KKyAgICBzdXJmLT50aWxlX3NwbGl0ID0gMTAyNDsKKyAgICBzdXJmLT5iYW5rdyA9IDE7CisgICAgc3VyZi0+YmFua2ggPSAxOworICAgIHN1cmYtPm10aWxlYSA9IHN1cmZfbWFuLT5od19pbmZvLm51bV9iYW5rczsKKyAgICB0aWxlYiA9IE1JTjIoc3VyZi0+dGlsZV9zcGxpdCwgNjQgKiBzdXJmLT5icGUgKiBzdXJmLT5uc2FtcGxlcyk7CisgICAgZm9yICg7IHN1cmYtPmJhbmtoIDw9IDg7IHN1cmYtPmJhbmtoICo9IDIpIHsKKyAgICAgICAgaWYgKCh0aWxlYiAqIHN1cmYtPmJhbmtoICogc3VyZi0+YmFua3cpID49IHN1cmZfbWFuLT5od19pbmZvLmdyb3VwX2J5dGVzKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3VyZi0+bXRpbGVhID4gOCkgeworICAgICAgICBzdXJmLT5tdGlsZWEgPSA4OworICAgIH0KKworICAgIHIgPSBlZ19zdXJmYWNlX3Nhbml0eShzdXJmX21hbiwgc3VyZiwgbW9kZSk7CisgICAgaWYgKHIpIHsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgaWYgKG1vZGUgIT0gUkFERU9OX1NVUkZfTU9ERV8yRCkgeworICAgICAgICAvKiBub3RoaW5nIHRvIGRvIGZvciBub24gMkQgdGlsZWQgc3VyZmFjZSAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBUd2VhayBUSUxFX1NQTElUIGZvciBwZXJmb3JtYW5jZSBoZXJlLiAqLworICAgIGlmIChzdXJmLT5uc2FtcGxlcyA+IDEpIHsKKyAgICAgICAgaWYgKHN1cmYtPmZsYWdzICYgKFJBREVPTl9TVVJGX1pCVUZGRVIgfCBSQURFT05fU1VSRl9TQlVGRkVSKSkgeworICAgICAgICAgICAgc3dpdGNoIChzdXJmLT5uc2FtcGxlcykgeworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHN1cmYtPnRpbGVfc3BsaXQgPSAxMjg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgc3VyZi0+dGlsZV9zcGxpdCA9IDEyODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICBzdXJmLT50aWxlX3NwbGl0ID0gMjU2OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjogLyogY2F5bWFuIG9ubHkgKi8KKyAgICAgICAgICAgICAgICBzdXJmLT50aWxlX3NwbGl0ID0gNTEyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInJhZGVvbjogV3JvbmcgbnVtYmVyIG9mIHNhbXBsZXMgJWkgKCVpKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1cmYtPm5zYW1wbGVzLCBfX0xJTkVfXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdXJmLT5zdGVuY2lsX3RpbGVfc3BsaXQgPSA2NDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIHRpbGUgc3BsaXQgbXVzdCBiZSA+PSAyNTYgZm9yIGNvbG9yYnVmZmVyIHN1cmZhY2VzLAorICAgICAgICAgICAgICogU0FNUExFX1NQTElUID0gdGlsZV9zcGxpdCAvIChicGUgKiA2NCksIHRoZSBvcHRpbWFsIHZhbHVlIGlzIDIKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3VyZi0+dGlsZV9zcGxpdCA9IE1BWDIoMiAqIHN1cmYtPmJwZSAqIDY0LCAyNTYpOworICAgICAgICAgICAgaWYgKHN1cmYtPnRpbGVfc3BsaXQgPiA0MDk2KQorICAgICAgICAgICAgICAgIHN1cmYtPnRpbGVfc3BsaXQgPSA0MDk2OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogc2V0IHRpbGUgc3BsaXQgdG8gcm93IHNpemUgKi8KKyAgICAgICAgc3VyZi0+dGlsZV9zcGxpdCA9IHN1cmZfbWFuLT5od19pbmZvLnJvd19zaXplOworICAgICAgICBzdXJmLT5zdGVuY2lsX3RpbGVfc3BsaXQgPSBzdXJmX21hbi0+aHdfaW5mby5yb3dfc2l6ZSAvIDI7CisgICAgfQorCisgICAgLyogYmFua3cgb3IgYmFua2ggZ3JlYXRlciB0aGFuIDEgaW5jcmVhc2UgYWxpZ25tZW50IHJlcXVpcmVtZW50LCBub3QKKyAgICAgKiBzdXJlIGlmIGl0J3Mgd29ydGggdXNpbmcgc21hbGxlciBiYW5rdyAmIGJhbmtoIHRvIHN0aWNrIHdpdGggMkQKKyAgICAgKiB0aWxpbmcgb24gc21hbGwgc3VyZmFjZSByYXRoZXIgdGhhbiBmYWxsaW5nIGJhY2sgdG8gMUQgdGlsaW5nLgorICAgICAqIFVzZSByZWNvbW1lbmRlZCB2YWx1ZSBiYXNlZCBvbiB0aWxlIHNpemUgZm9yIG5vdy4KKyAgICAgKgorICAgICAqIGZtYXNrIGJ1ZmZlciBoYXMgZGlmZmVyZW50IG9wdGltYWwgdmFsdWUgZmlndXJlIHRoZW0gb3V0IG9uY2Ugd2UKKyAgICAgKiB1c2UgaXQuCisgICAgICovCisgICAgaWYgKHN1cmYtPmZsYWdzICYgUkFERU9OX1NVUkZfU0JVRkZFUikgeworICAgICAgICAvKiBhc3N1bWUgMSBieXRlcyBmb3Igc3RlbmNpbCwgd2Ugb3B0aW1pemUgZm9yIHN0ZW5jaWwgYXMgc3RlbmNpbAorICAgICAgICAgKiBhbmQgZGVwdGggc2hhcmVzIHN1cmZhY2UgdmFsdWVzCisgICAgICAgICAqLworICAgICAgICB0aWxlYiA9IE1JTjIoc3VyZi0+dGlsZV9zcGxpdCwgNjQgKiBzdXJmLT5uc2FtcGxlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGlsZWIgPSBNSU4yKHN1cmYtPnRpbGVfc3BsaXQsIDY0ICogc3VyZi0+YnBlICogc3VyZi0+bnNhbXBsZXMpOworICAgIH0KKworICAgIC8qIHVzZSBiYW5rdyBvZiAxIHRvIG1pbmltaXplIHdpZHRoIGFsaWdubWVudCwgbWlnaHQgYmUgaW50ZXJlc3RpbmcgdG8KKyAgICAgKiBpbmNyZWFzZSBpdCBmb3IgbGFyZ2Ugc3VyZmFjZQorICAgICAqLworICAgIHN1cmYtPmJhbmt3ID0gMTsKKyAgICBzd2l0Y2ggKHRpbGViKSB7CisgICAgY2FzZSA2NDoKKyAgICAgICAgc3VyZi0+YmFua2ggPSA0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEyODoKKyAgICBjYXNlIDI1NjoKKyAgICAgICAgc3VyZi0+YmFua2ggPSAyOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzdXJmLT5iYW5raCA9IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvKiBkb3VibGUgY2hlY2sgdGhlIGNvbnN0cmFpbnQgKi8KKyAgICBmb3IgKDsgc3VyZi0+YmFua2ggPD0gODsgc3VyZi0+YmFua2ggKj0gMikgeworICAgICAgICBpZiAoKHRpbGViICogc3VyZi0+YmFua2ggKiBzdXJmLT5iYW5rdykgPj0gc3VyZl9tYW4tPmh3X2luZm8uZ3JvdXBfYnl0ZXMpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaF9vdmVyX3cgPSAoKChzdXJmLT5iYW5raCAqIHN1cmZfbWFuLT5od19pbmZvLm51bV9iYW5rcykgPDwgMTYpIC8KKyAgICAgICAgICAgICAgICAoc3VyZi0+YmFua3cgKiBzdXJmX21hbi0+aHdfaW5mby5udW1fcGlwZXMpKSA+PiAxNjsKKyAgICBzdXJmLT5tdGlsZWEgPSAxIDw8IChsb2cyX2ludChoX292ZXJfdykgPj4gMSk7CisKKyAgICByZXR1cm4gMDsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNvdXRoZXJuIElzbGFuZHMgZmFtaWx5CisgKi8KKyNkZWZpbmUgU0lfX0dCX1RJTEVfTU9ERV9fUElQRV9DT05GSUcoeCkgICAgICAgICgoKHgpID4+IDYpICYgMHgxZikKKyNkZWZpbmUgICAgIFNJX19QSVBFX0NPTkZJR19fQUREUl9TVVJGX1AyICAgICAgICAgICAgICAgMAorI2RlZmluZSAgICAgU0lfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDRfOHgxNiAgICAgICAgICA0CisjZGVmaW5lICAgICBTSV9fUElQRV9DT05GSUdfX0FERFJfU1VSRl9QNF8xNngxNiAgICAgICAgIDUKKyNkZWZpbmUgICAgIFNJX19QSVBFX0NPTkZJR19fQUREUl9TVVJGX1A0XzE2eDMyICAgICAgICAgNgorI2RlZmluZSAgICAgU0lfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDRfMzJ4MzIgICAgICAgICA3CisjZGVmaW5lICAgICBTSV9fUElQRV9DT05GSUdfX0FERFJfU1VSRl9QOF8xNngxNl84eDE2ICAgIDgKKyNkZWZpbmUgICAgIFNJX19QSVBFX0NPTkZJR19fQUREUl9TVVJGX1A4XzE2eDMyXzh4MTYgICAgOQorI2RlZmluZSAgICAgU0lfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDhfMzJ4MzJfOHgxNiAgICAxMAorI2RlZmluZSAgICAgU0lfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDhfMTZ4MzJfMTZ4MTYgICAxMQorI2RlZmluZSAgICAgU0lfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDhfMzJ4MzJfMTZ4MTYgICAxMgorI2RlZmluZSAgICAgU0lfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDhfMzJ4MzJfMTZ4MzIgICAxMworI2RlZmluZSAgICAgU0lfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDhfMzJ4NjRfMzJ4MzIgICAxNAorI2RlZmluZSBTSV9fR0JfVElMRV9NT0RFX19USUxFX1NQTElUKHgpICAgICAgICAgKCgoeCkgPj4gMTEpICYgMHg3KQorI2RlZmluZSAgICAgU0lfX1RJTEVfU1BMSVRfXzY0QiAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lICAgICBTSV9fVElMRV9TUExJVF9fMTI4QiAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgICAgIFNJX19USUxFX1NQTElUX18yNTZCICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSAgICAgU0lfX1RJTEVfU1BMSVRfXzUxMkIgICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lICAgICBTSV9fVElMRV9TUExJVF9fMTAyNEIgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgICAgIFNJX19USUxFX1NQTElUX18yMDQ4QiAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSAgICAgU0lfX1RJTEVfU1BMSVRfXzQwOTZCICAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFNJX19HQl9USUxFX01PREVfX0JBTktfV0lEVEgoeCkgICAgICAgICAoKCh4KSA+PiAxNCkgJiAweDMpCisjZGVmaW5lICAgICBTSV9fQkFOS19XSURUSF9fMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgICAgIFNJX19CQU5LX1dJRFRIX18yICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSAgICAgU0lfX0JBTktfV0lEVEhfXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lICAgICBTSV9fQkFOS19XSURUSF9fOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgU0lfX0dCX1RJTEVfTU9ERV9fQkFOS19IRUlHSFQoeCkgICAgICAgICgoKHgpID4+IDE2KSAmIDB4MykKKyNkZWZpbmUgICAgIFNJX19CQU5LX0hFSUdIVF9fMSAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSAgICAgU0lfX0JBTktfSEVJR0hUX18yICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lICAgICBTSV9fQkFOS19IRUlHSFRfXzQgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgICAgIFNJX19CQU5LX0hFSUdIVF9fOCAgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBTSV9fR0JfVElMRV9NT0RFX19NQUNST19USUxFX0FTUEVDVCh4KSAgKCgoeCkgPj4gMTgpICYgMHgzKQorI2RlZmluZSAgICAgU0lfX01BQ1JPX1RJTEVfQVNQRUNUX18xICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lICAgICBTSV9fTUFDUk9fVElMRV9BU1BFQ1RfXzIgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgICAgIFNJX19NQUNST19USUxFX0FTUEVDVF9fNCAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSAgICAgU0lfX01BQ1JPX1RJTEVfQVNQRUNUX184ICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFNJX19HQl9USUxFX01PREVfX05VTV9CQU5LUyh4KSAgICAgICAgICAoKCh4KSA+PiAyMCkgJiAweDMpCisjZGVmaW5lICAgICBTSV9fTlVNX0JBTktTX18yX0JBTksgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgICAgIFNJX19OVU1fQkFOS1NfXzRfQkFOSyAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSAgICAgU0lfX05VTV9CQU5LU19fOF9CQU5LICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lICAgICBTSV9fTlVNX0JBTktTX18xNl9CQU5LICAgICAgICAgICAgICAgICAgICAgIDMKKworCitzdGF0aWMgdm9pZCBzaV9nYl90aWxlX21vZGUodWludDMyX3QgZ2JfdGlsZV9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpudW1fcGlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKm51bV9iYW5rcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbWFjcm9fdGlsZV9hc3BlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmJhbmtfdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqYmFua19oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp0aWxlX3NwbGl0KQoreworICAgIGlmIChudW1fcGlwZXMpIHsKKyAgICAgICAgc3dpdGNoIChTSV9fR0JfVElMRV9NT0RFX19QSVBFX0NPTkZJRyhnYl90aWxlX21vZGUpKSB7CisgICAgICAgIGNhc2UgU0lfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAqbnVtX3BpcGVzID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJX19QSVBFX0NPTkZJR19fQUREUl9TVVJGX1A0Xzh4MTY6CisgICAgICAgIGNhc2UgU0lfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDRfMTZ4MTY6CisgICAgICAgIGNhc2UgU0lfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDRfMTZ4MzI6CisgICAgICAgIGNhc2UgU0lfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDRfMzJ4MzI6CisgICAgICAgICAgICAqbnVtX3BpcGVzID0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJX19QSVBFX0NPTkZJR19fQUREUl9TVVJGX1A4XzE2eDE2Xzh4MTY6CisgICAgICAgIGNhc2UgU0lfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDhfMTZ4MzJfOHgxNjoKKyAgICAgICAgY2FzZSBTSV9fUElQRV9DT05GSUdfX0FERFJfU1VSRl9QOF8zMngzMl84eDE2OgorICAgICAgICBjYXNlIFNJX19QSVBFX0NPTkZJR19fQUREUl9TVVJGX1A4XzE2eDMyXzE2eDE2OgorICAgICAgICBjYXNlIFNJX19QSVBFX0NPTkZJR19fQUREUl9TVVJGX1A4XzMyeDMyXzE2eDE2OgorICAgICAgICBjYXNlIFNJX19QSVBFX0NPTkZJR19fQUREUl9TVVJGX1A4XzMyeDMyXzE2eDMyOgorICAgICAgICBjYXNlIFNJX19QSVBFX0NPTkZJR19fQUREUl9TVVJGX1A4XzMyeDY0XzMyeDMyOgorICAgICAgICAgICAgKm51bV9waXBlcyA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobnVtX2JhbmtzKSB7CisgICAgICAgIHN3aXRjaCAoU0lfX0dCX1RJTEVfTU9ERV9fTlVNX0JBTktTKGdiX3RpbGVfbW9kZSkpIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2FzZSBTSV9fTlVNX0JBTktTX18yX0JBTks6CisgICAgICAgICAgICAqbnVtX2JhbmtzID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJX19OVU1fQkFOS1NfXzRfQkFOSzoKKyAgICAgICAgICAgICpudW1fYmFua3MgPSA0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lfX05VTV9CQU5LU19fOF9CQU5LOgorICAgICAgICAgICAgKm51bV9iYW5rcyA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSV9fTlVNX0JBTktTX18xNl9CQU5LOgorICAgICAgICAgICAgKm51bV9iYW5rcyA9IDE2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1hY3JvX3RpbGVfYXNwZWN0KSB7CisgICAgICAgIHN3aXRjaCAoU0lfX0dCX1RJTEVfTU9ERV9fTUFDUk9fVElMRV9BU1BFQ1QoZ2JfdGlsZV9tb2RlKSkgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlIFNJX19NQUNST19USUxFX0FTUEVDVF9fMToKKyAgICAgICAgICAgICptYWNyb190aWxlX2FzcGVjdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSV9fTUFDUk9fVElMRV9BU1BFQ1RfXzI6CisgICAgICAgICAgICAqbWFjcm9fdGlsZV9hc3BlY3QgPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lfX01BQ1JPX1RJTEVfQVNQRUNUX180OgorICAgICAgICAgICAgKm1hY3JvX3RpbGVfYXNwZWN0ID0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJX19NQUNST19USUxFX0FTUEVDVF9fODoKKyAgICAgICAgICAgICptYWNyb190aWxlX2FzcGVjdCA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYmFua193KSB7CisgICAgICAgIHN3aXRjaCAoU0lfX0dCX1RJTEVfTU9ERV9fQkFOS19XSURUSChnYl90aWxlX21vZGUpKSB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgU0lfX0JBTktfV0lEVEhfXzE6CisgICAgICAgICAgICAqYmFua193ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJX19CQU5LX1dJRFRIX18yOgorICAgICAgICAgICAgKmJhbmtfdyA9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSV9fQkFOS19XSURUSF9fNDoKKyAgICAgICAgICAgICpiYW5rX3cgPSA0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lfX0JBTktfV0lEVEhfXzg6CisgICAgICAgICAgICAqYmFua193ID0gODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChiYW5rX2gpIHsKKyAgICAgICAgc3dpdGNoIChTSV9fR0JfVElMRV9NT0RFX19CQU5LX0hFSUdIVChnYl90aWxlX21vZGUpKSB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgU0lfX0JBTktfSEVJR0hUX18xOgorICAgICAgICAgICAgKmJhbmtfaCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSV9fQkFOS19IRUlHSFRfXzI6CisgICAgICAgICAgICAqYmFua19oID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJX19CQU5LX0hFSUdIVF9fNDoKKyAgICAgICAgICAgICpiYW5rX2ggPSA0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lfX0JBTktfSEVJR0hUX184OgorICAgICAgICAgICAgKmJhbmtfaCA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodGlsZV9zcGxpdCkgeworICAgICAgICBzd2l0Y2ggKFNJX19HQl9USUxFX01PREVfX1RJTEVfU1BMSVQoZ2JfdGlsZV9tb2RlKSkgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlIFNJX19USUxFX1NQTElUX182NEI6CisgICAgICAgICAgICAqdGlsZV9zcGxpdCA9IDY0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lfX1RJTEVfU1BMSVRfXzEyOEI6CisgICAgICAgICAgICAqdGlsZV9zcGxpdCA9IDEyODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJX19USUxFX1NQTElUX18yNTZCOgorICAgICAgICAgICAgKnRpbGVfc3BsaXQgPSAyNTY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSV9fVElMRV9TUExJVF9fNTEyQjoKKyAgICAgICAgICAgICp0aWxlX3NwbGl0ID0gNTEyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lfX1RJTEVfU1BMSVRfXzEwMjRCOgorICAgICAgICAgICAgKnRpbGVfc3BsaXQgPSAxMDI0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lfX1RJTEVfU1BMSVRfXzIwNDhCOgorICAgICAgICAgICAgKnRpbGVfc3BsaXQgPSAyMDQ4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lfX1RJTEVfU1BMSVRfXzQwOTZCOgorICAgICAgICAgICAgKnRpbGVfc3BsaXQgPSA0MDk2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgc2lfaW5pdF9od19pbmZvKHN0cnVjdCByYWRlb25fc3VyZmFjZV9tYW5hZ2VyICpzdXJmX21hbikKK3sKKyAgICB1aW50MzJfdCB0aWxpbmdfY29uZmlnOworICAgIGRybVZlcnNpb25QdHIgdmVyc2lvbjsKKyAgICBpbnQgcjsKKworICAgIHIgPSByYWRlb25fZ2V0X3ZhbHVlKHN1cmZfbWFuLT5mZCwgUkFERU9OX0lORk9fVElMSU5HX0NPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmdGlsaW5nX2NvbmZpZyk7CisgICAgaWYgKHIpIHsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgc3VyZl9tYW4tPmh3X2luZm8uYWxsb3dfMmQgPSAwOworICAgIHZlcnNpb24gPSBkcm1HZXRWZXJzaW9uKHN1cmZfbWFuLT5mZCk7CisgICAgaWYgKHZlcnNpb24gJiYgdmVyc2lvbi0+dmVyc2lvbl9taW5vciA+PSAzMykgeworICAgICAgICBpZiAoIXJhZGVvbl9nZXRfdmFsdWUoc3VyZl9tYW4tPmZkLCBSQURFT05fSU5GT19TSV9USUxFX01PREVfQVJSQVksIHN1cmZfbWFuLT5od19pbmZvLnRpbGVfbW9kZV9hcnJheSkpIHsKKyAgICAgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLmFsbG93XzJkID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkcm1GcmVlVmVyc2lvbih2ZXJzaW9uKTsKKworICAgIHN3aXRjaCAodGlsaW5nX2NvbmZpZyAmIDB4ZikgeworICAgIGNhc2UgMDoKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8ubnVtX3BpcGVzID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5udW1fcGlwZXMgPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLm51bV9waXBlcyA9IDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8ubnVtX3BpcGVzID0gODsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8ubnVtX3BpcGVzID0gODsKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8uYWxsb3dfMmQgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKCh0aWxpbmdfY29uZmlnICYgMHhmMCkgPj4gNCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8ubnVtX2JhbmtzID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5udW1fYmFua3MgPSA4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLm51bV9iYW5rcyA9IDE2OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5udW1fYmFua3MgPSA4OworICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5hbGxvd18yZCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoKHRpbGluZ19jb25maWcgJiAweGYwMCkgPj4gOCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8uZ3JvdXBfYnl0ZXMgPSAyNTY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8uZ3JvdXBfYnl0ZXMgPSA1MTI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLmdyb3VwX2J5dGVzID0gMjU2OworICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5hbGxvd18yZCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoKHRpbGluZ19jb25maWcgJiAweGYwMDApID4+IDEyKSB7CisgICAgY2FzZSAwOgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5yb3dfc2l6ZSA9IDEwMjQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8ucm93X3NpemUgPSAyMDQ4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLnJvd19zaXplID0gNDA5NjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8ucm93X3NpemUgPSA0MDk2OworICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5hbGxvd18yZCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaV9zdXJmYWNlX3Nhbml0eShzdHJ1Y3QgcmFkZW9uX3N1cmZhY2VfbWFuYWdlciAqc3VyZl9tYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZSAqc3VyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbW9kZSwgdW5zaWduZWQgKnRpbGVfbW9kZSwgdW5zaWduZWQgKnN0ZW5jaWxfdGlsZV9tb2RlKQoreworICAgIHVpbnQzMl90IGdiX3RpbGVfbW9kZTsKKworICAgIC8qIGNoZWNrIHN1cmZhY2UgZGltZW5zaW9uICovCisgICAgaWYgKHN1cmYtPm5waXhfeCA+IDE2Mzg0IHx8IHN1cmYtPm5waXhfeSA+IDE2Mzg0IHx8IHN1cmYtPm5waXhfeiA+IDE2Mzg0KSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8qIGNoZWNrIG1pcG1hcCBsYXN0X2xldmVsICovCisgICAgaWYgKHN1cmYtPmxhc3RfbGV2ZWwgPiAxNSkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvKiBmb3JjZSAxZCBvbiBrZXJuZWwgdGhhdCBjYW4ndCBkbyAyZCAqLworICAgIGlmIChtb2RlID4gUkFERU9OX1NVUkZfTU9ERV8xRCAmJgorICAgICAgICAoIXN1cmZfbWFuLT5od19pbmZvLmFsbG93XzJkIHx8ICEoc3VyZi0+ZmxhZ3MgJiBSQURFT05fU1VSRl9IQVNfVElMRV9NT0RFX0lOREVYKSkpIHsKKyAgICAgICAgaWYgKHN1cmYtPm5zYW1wbGVzID4gMSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJyYWRlb246IENhbm5vdCB1c2UgMUQgdGlsaW5nIGZvciBhbiBNU0FBIHN1cmZhY2UgKCVpKS5cbiIsIF9fTElORV9fKTsKKyAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICB9CisgICAgICAgIG1vZGUgPSBSQURFT05fU1VSRl9NT0RFXzFEOworICAgICAgICBzdXJmLT5mbGFncyA9IFJBREVPTl9TVVJGX0NMUihzdXJmLT5mbGFncywgTU9ERSk7CisgICAgICAgIHN1cmYtPmZsYWdzIHw9IFJBREVPTl9TVVJGX1NFVChtb2RlLCBNT0RFKTsKKyAgICB9CisKKyAgICBpZiAoc3VyZi0+bnNhbXBsZXMgPiAxICYmIG1vZGUgIT0gUkFERU9OX1NVUkZfTU9ERV8yRCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoIXN1cmYtPnRpbGVfc3BsaXQpIHsKKyAgICAgICAgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICBzdXJmLT5tdGlsZWEgPSAxOworICAgICAgICBzdXJmLT5iYW5rdyA9IDE7CisgICAgICAgIHN1cmYtPmJhbmtoID0gMTsKKyAgICAgICAgc3VyZi0+dGlsZV9zcGxpdCA9IDY0OworICAgICAgICBzdXJmLT5zdGVuY2lsX3RpbGVfc3BsaXQgPSA2NDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIFJBREVPTl9TVVJGX01PREVfMkQ6CisgICAgICAgIGlmIChzdXJmLT5mbGFncyAmIFJBREVPTl9TVVJGX1NCVUZGRVIpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3VyZi0+bnNhbXBsZXMpIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAqc3RlbmNpbF90aWxlX21vZGUgPSBTSV9USUxFX01PREVfREVQVEhfU1RFTkNJTF8yRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAqc3RlbmNpbF90aWxlX21vZGUgPSBTSV9USUxFX01PREVfREVQVEhfU1RFTkNJTF8yRF8yQUE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgKnN0ZW5jaWxfdGlsZV9tb2RlID0gU0lfVElMRV9NT0RFX0RFUFRIX1NURU5DSUxfMkRfNEFBOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICpzdGVuY2lsX3RpbGVfbW9kZSA9IFNJX1RJTEVfTU9ERV9ERVBUSF9TVEVOQ0lMXzJEXzhBQTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiByZXRyaWV2ZSB0aWxpbmcgbW9kZSB2YWx1ZSAqLworICAgICAgICAgICAgZ2JfdGlsZV9tb2RlID0gc3VyZl9tYW4tPmh3X2luZm8udGlsZV9tb2RlX2FycmF5WypzdGVuY2lsX3RpbGVfbW9kZV07CisgICAgICAgICAgICBzaV9nYl90aWxlX21vZGUoZ2JfdGlsZV9tb2RlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAmc3VyZi0+c3RlbmNpbF90aWxlX3NwbGl0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3VyZi0+ZmxhZ3MgJiBSQURFT05fU1VSRl9aQlVGRkVSKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHN1cmYtPm5zYW1wbGVzKSB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgKnRpbGVfbW9kZSA9IFNJX1RJTEVfTU9ERV9ERVBUSF9TVEVOQ0lMXzJEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICp0aWxlX21vZGUgPSBTSV9USUxFX01PREVfREVQVEhfU1RFTkNJTF8yRF8yQUE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgKnRpbGVfbW9kZSA9IFNJX1RJTEVfTU9ERV9ERVBUSF9TVEVOQ0lMXzJEXzRBQTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAqdGlsZV9tb2RlID0gU0lfVElMRV9NT0RFX0RFUFRIX1NURU5DSUxfMkRfOEFBOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzdXJmLT5mbGFncyAmIFJBREVPTl9TVVJGX1NDQU5PVVQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3VyZi0+YnBlKSB7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgKnRpbGVfbW9kZSA9IFNJX1RJTEVfTU9ERV9DT0xPUl8yRF9TQ0FOT1VUXzE2QlBQOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICp0aWxlX21vZGUgPSBTSV9USUxFX01PREVfQ09MT1JfMkRfU0NBTk9VVF8zMkJQUDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKHN1cmYtPmJwZSkgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICp0aWxlX21vZGUgPSBTSV9USUxFX01PREVfQ09MT1JfMkRfOEJQUDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAqdGlsZV9tb2RlID0gU0lfVElMRV9NT0RFX0NPTE9SXzJEXzE2QlBQOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICp0aWxlX21vZGUgPSBTSV9USUxFX01PREVfQ09MT1JfMkRfMzJCUFA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICp0aWxlX21vZGUgPSBTSV9USUxFX01PREVfQ09MT1JfMkRfNjRCUFA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIHJldHJpZXZlIHRpbGluZyBtb2RlIHZhbHVlICovCisgICAgICAgIGdiX3RpbGVfbW9kZSA9IHN1cmZfbWFuLT5od19pbmZvLnRpbGVfbW9kZV9hcnJheVsqdGlsZV9tb2RlXTsKKyAgICAgICAgc2lfZ2JfdGlsZV9tb2RlKGdiX3RpbGVfbW9kZSwgTlVMTCwgTlVMTCwgJnN1cmYtPm10aWxlYSwgJnN1cmYtPmJhbmt3LCAmc3VyZi0+YmFua2gsICZzdXJmLT50aWxlX3NwbGl0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSQURFT05fU1VSRl9NT0RFXzFEOgorICAgICAgICBpZiAoc3VyZi0+ZmxhZ3MgJiBSQURFT05fU1VSRl9TQlVGRkVSKSB7CisgICAgICAgICAgICAqc3RlbmNpbF90aWxlX21vZGUgPSBTSV9USUxFX01PREVfREVQVEhfU1RFTkNJTF8xRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3VyZi0+ZmxhZ3MgJiBSQURFT05fU1VSRl9aQlVGRkVSKSB7CisgICAgICAgICAgICAqdGlsZV9tb2RlID0gU0lfVElMRV9NT0RFX0RFUFRIX1NURU5DSUxfMUQ7CisgICAgICAgIH0gZWxzZSBpZiAoc3VyZi0+ZmxhZ3MgJiBSQURFT05fU1VSRl9TQ0FOT1VUKSB7CisgICAgICAgICAgICAqdGlsZV9tb2RlID0gU0lfVElMRV9NT0RFX0NPTE9SXzFEX1NDQU5PVVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqdGlsZV9tb2RlID0gU0lfVElMRV9NT0RFX0NPTE9SXzFEOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkFERU9OX1NVUkZfTU9ERV9MSU5FQVJfQUxJR05FRDoKKyAgICBkZWZhdWx0OgorICAgICAgICAqdGlsZV9tb2RlID0gU0lfVElMRV9NT0RFX0NPTE9SX0xJTkVBUl9BTElHTkVEOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzaV9zdXJmX21pbmlmeShzdHJ1Y3QgcmFkZW9uX3N1cmZhY2UgKnN1cmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFkZW9uX3N1cmZhY2VfbGV2ZWwgKnN1cmZsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGJwZSwgdW5zaWduZWQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB4YWxpZ24sIHVpbnQzMl90IHlhbGlnbiwgdWludDMyX3QgemFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2xpY2VfYWxpZ24sIHVpbnQ2NF90IG9mZnNldCkKK3sKKyAgICBpZiAobGV2ZWwgPT0gMCkgeworICAgICAgICBzdXJmbGV2ZWwtPm5waXhfeCA9IHN1cmYtPm5waXhfeDsKKyAgICB9IGVsc2UgeworICAgICAgICBzdXJmbGV2ZWwtPm5waXhfeCA9IG1pcF9taW5pZnkobmV4dF9wb3dlcl9vZl90d28oc3VyZi0+bnBpeF94KSwgbGV2ZWwpOworICAgIH0KKyAgICBzdXJmbGV2ZWwtPm5waXhfeSA9IG1pcF9taW5pZnkoc3VyZi0+bnBpeF95LCBsZXZlbCk7CisgICAgc3VyZmxldmVsLT5ucGl4X3ogPSBtaXBfbWluaWZ5KHN1cmYtPm5waXhfeiwgbGV2ZWwpOworCisgICAgaWYgKGxldmVsID09IDAgJiYgc3VyZi0+bGFzdF9sZXZlbCA+IDApIHsKKyAgICAgICAgc3VyZmxldmVsLT5uYmxrX3ggPSAobmV4dF9wb3dlcl9vZl90d28oc3VyZmxldmVsLT5ucGl4X3gpICsgc3VyZi0+YmxrX3cgLSAxKSAvIHN1cmYtPmJsa193OworICAgICAgICBzdXJmbGV2ZWwtPm5ibGtfeSA9IChuZXh0X3Bvd2VyX29mX3R3byhzdXJmbGV2ZWwtPm5waXhfeSkgKyBzdXJmLT5ibGtfaCAtIDEpIC8gc3VyZi0+YmxrX2g7CisgICAgICAgIHN1cmZsZXZlbC0+bmJsa196ID0gKG5leHRfcG93ZXJfb2ZfdHdvKHN1cmZsZXZlbC0+bnBpeF96KSArIHN1cmYtPmJsa19kIC0gMSkgLyBzdXJmLT5ibGtfZDsKKyAgICB9IGVsc2UgeworICAgICAgICBzdXJmbGV2ZWwtPm5ibGtfeCA9IChzdXJmbGV2ZWwtPm5waXhfeCArIHN1cmYtPmJsa193IC0gMSkgLyBzdXJmLT5ibGtfdzsKKyAgICAgICAgc3VyZmxldmVsLT5uYmxrX3kgPSAoc3VyZmxldmVsLT5ucGl4X3kgKyBzdXJmLT5ibGtfaCAtIDEpIC8gc3VyZi0+YmxrX2g7CisgICAgICAgIHN1cmZsZXZlbC0+bmJsa196ID0gKHN1cmZsZXZlbC0+bnBpeF96ICsgc3VyZi0+YmxrX2QgLSAxKSAvIHN1cmYtPmJsa19kOworICAgIH0KKworICAgIHN1cmZsZXZlbC0+bmJsa195ICA9IEFMSUdOKHN1cmZsZXZlbC0+bmJsa195LCB5YWxpZ24pOworCisgICAgLyogWFhYOiBUZXh0dXJlIHNhbXBsaW5nIHVzZXMgdW5leHBlY3RlZGx5IGxhcmdlIHBpdGNoZXMgaW4gc29tZSBjYXNlcywKKyAgICAgKiB0aGVzZSBhcmUganVzdCBndWVzc2VzIGZvciB0aGUgcnVsZXMgYmVoaW5kIHRob3NlCisgICAgICovCisgICAgaWYgKGxldmVsID09IDAgJiYgc3VyZi0+bGFzdF9sZXZlbCA9PSAwKQorICAgICAgICAvKiBOb24tbWlwbWFwIHBpdGNoIHBhZGRlZCB0byBzbGljZSBhbGlnbm1lbnQgKi8KKyAgICAgICAgLyogVXNpbmcganVzdCBicGUgaGVyZSBicmVha3Mgc3RlbmNpbCBibGl0dGluZzsgc3VyZi0+YnBlIHdvcmtzLiAqLworICAgICAgICB4YWxpZ24gPSBNQVgyKHhhbGlnbiwgc2xpY2VfYWxpZ24gLyBzdXJmLT5icGUpOworICAgIGVsc2UgaWYgKHN1cmZsZXZlbC0+bW9kZSA9PSBSQURFT05fU1VSRl9NT0RFX0xJTkVBUl9BTElHTkVEKQorICAgICAgICAvKiBTbWFsbCByb3dzIGV2ZW5seSBkaXN0cmlidXRlZCBhY3Jvc3Mgc2xpY2UgKi8KKyAgICAgICAgeGFsaWduID0gTUFYMih4YWxpZ24sIHNsaWNlX2FsaWduIC8gYnBlIC8gc3VyZmxldmVsLT5uYmxrX3kpOworCisgICAgc3VyZmxldmVsLT5uYmxrX3ggID0gQUxJR04oc3VyZmxldmVsLT5uYmxrX3gsIHhhbGlnbik7CisgICAgc3VyZmxldmVsLT5uYmxrX3ogID0gQUxJR04oc3VyZmxldmVsLT5uYmxrX3osIHphbGlnbik7CisKKyAgICBzdXJmbGV2ZWwtPm9mZnNldCA9IG9mZnNldDsKKyAgICBzdXJmbGV2ZWwtPnBpdGNoX2J5dGVzID0gc3VyZmxldmVsLT5uYmxrX3ggKiBicGUgKiBzdXJmLT5uc2FtcGxlczsKKyAgICBzdXJmbGV2ZWwtPnNsaWNlX3NpemUgPSBBTElHTigodWludDY0X3Qpc3VyZmxldmVsLT5waXRjaF9ieXRlcyAqIHN1cmZsZXZlbC0+bmJsa195LAorCQkJCSAgKHVpbnQ2NF90KXNsaWNlX2FsaWduKTsKKworICAgIHN1cmYtPmJvX3NpemUgPSBvZmZzZXQgKyBzdXJmbGV2ZWwtPnNsaWNlX3NpemUgKiBzdXJmbGV2ZWwtPm5ibGtfeiAqIHN1cmYtPmFycmF5X3NpemU7Cit9CisKK3N0YXRpYyB2b2lkIHNpX3N1cmZfbWluaWZ5XzJkKHN0cnVjdCByYWRlb25fc3VyZmFjZSAqc3VyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZV9sZXZlbCAqc3VyZmxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYnBlLCB1bnNpZ25lZCBsZXZlbCwgdW5zaWduZWQgc2xpY2VfcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB4YWxpZ24sIHVpbnQzMl90IHlhbGlnbiwgdWludDMyX3QgemFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbXRpbGViLCB1aW50NjRfdCBvZmZzZXQpCit7CisgICAgdW5zaWduZWQgbXRpbGVfcHIsIG10aWxlX3BzOworCisgICAgaWYgKGxldmVsID09IDApIHsKKyAgICAgICAgc3VyZmxldmVsLT5ucGl4X3ggPSBzdXJmLT5ucGl4X3g7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3VyZmxldmVsLT5ucGl4X3ggPSBtaXBfbWluaWZ5KG5leHRfcG93ZXJfb2ZfdHdvKHN1cmYtPm5waXhfeCksIGxldmVsKTsKKyAgICB9CisgICAgc3VyZmxldmVsLT5ucGl4X3kgPSBtaXBfbWluaWZ5KHN1cmYtPm5waXhfeSwgbGV2ZWwpOworICAgIHN1cmZsZXZlbC0+bnBpeF96ID0gbWlwX21pbmlmeShzdXJmLT5ucGl4X3osIGxldmVsKTsKKworICAgIGlmIChsZXZlbCA9PSAwICYmIHN1cmYtPmxhc3RfbGV2ZWwgPiAwKSB7CisgICAgICAgIHN1cmZsZXZlbC0+bmJsa194ID0gKG5leHRfcG93ZXJfb2ZfdHdvKHN1cmZsZXZlbC0+bnBpeF94KSArIHN1cmYtPmJsa193IC0gMSkgLyBzdXJmLT5ibGtfdzsKKyAgICAgICAgc3VyZmxldmVsLT5uYmxrX3kgPSAobmV4dF9wb3dlcl9vZl90d28oc3VyZmxldmVsLT5ucGl4X3kpICsgc3VyZi0+YmxrX2ggLSAxKSAvIHN1cmYtPmJsa19oOworICAgICAgICBzdXJmbGV2ZWwtPm5ibGtfeiA9IChuZXh0X3Bvd2VyX29mX3R3byhzdXJmbGV2ZWwtPm5waXhfeikgKyBzdXJmLT5ibGtfZCAtIDEpIC8gc3VyZi0+YmxrX2Q7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3VyZmxldmVsLT5uYmxrX3ggPSAoc3VyZmxldmVsLT5ucGl4X3ggKyBzdXJmLT5ibGtfdyAtIDEpIC8gc3VyZi0+YmxrX3c7CisgICAgICAgIHN1cmZsZXZlbC0+bmJsa195ID0gKHN1cmZsZXZlbC0+bnBpeF95ICsgc3VyZi0+YmxrX2ggLSAxKSAvIHN1cmYtPmJsa19oOworICAgICAgICBzdXJmbGV2ZWwtPm5ibGtfeiA9IChzdXJmbGV2ZWwtPm5waXhfeiArIHN1cmYtPmJsa19kIC0gMSkgLyBzdXJmLT5ibGtfZDsKKyAgICB9CisKKyAgICBpZiAoc3VyZi0+bnNhbXBsZXMgPT0gMSAmJiBzdXJmbGV2ZWwtPm1vZGUgPT0gUkFERU9OX1NVUkZfTU9ERV8yRCAmJgorICAgICAgICAhKHN1cmYtPmZsYWdzICYgUkFERU9OX1NVUkZfRk1BU0spKSB7CisgICAgICAgIGlmIChzdXJmbGV2ZWwtPm5ibGtfeCA8IHhhbGlnbiB8fCBzdXJmbGV2ZWwtPm5ibGtfeSA8IHlhbGlnbikgeworICAgICAgICAgICAgc3VyZmxldmVsLT5tb2RlID0gUkFERU9OX1NVUkZfTU9ERV8xRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdXJmbGV2ZWwtPm5ibGtfeCAgPSBBTElHTihzdXJmbGV2ZWwtPm5ibGtfeCwgeGFsaWduKTsKKyAgICBzdXJmbGV2ZWwtPm5ibGtfeSAgPSBBTElHTihzdXJmbGV2ZWwtPm5ibGtfeSwgeWFsaWduKTsKKyAgICBzdXJmbGV2ZWwtPm5ibGtfeiAgPSBBTElHTihzdXJmbGV2ZWwtPm5ibGtfeiwgemFsaWduKTsKKworICAgIC8qIG1hY3JvIHRpbGUgcGVyIHJvdyAqLworICAgIG10aWxlX3ByID0gc3VyZmxldmVsLT5uYmxrX3ggLyB4YWxpZ247CisgICAgLyogbWFjcm8gdGlsZSBwZXIgc2xpY2UgKi8KKyAgICBtdGlsZV9wcyA9IChtdGlsZV9wciAqIHN1cmZsZXZlbC0+bmJsa195KSAvIHlhbGlnbjsKKyAgICBzdXJmbGV2ZWwtPm9mZnNldCA9IG9mZnNldDsKKyAgICBzdXJmbGV2ZWwtPnBpdGNoX2J5dGVzID0gc3VyZmxldmVsLT5uYmxrX3ggKiBicGUgKiBzdXJmLT5uc2FtcGxlczsKKyAgICBzdXJmbGV2ZWwtPnNsaWNlX3NpemUgPSAodWludDY0X3QpbXRpbGVfcHMgKiBtdGlsZWIgKiBzbGljZV9wdDsKKworICAgIHN1cmYtPmJvX3NpemUgPSBvZmZzZXQgKyBzdXJmbGV2ZWwtPnNsaWNlX3NpemUgKiBzdXJmbGV2ZWwtPm5ibGtfeiAqIHN1cmYtPmFycmF5X3NpemU7Cit9CisKK3N0YXRpYyBpbnQgc2lfc3VyZmFjZV9pbml0X2xpbmVhcl9hbGlnbmVkKHN0cnVjdCByYWRlb25fc3VyZmFjZV9tYW5hZ2VyICpzdXJmX21hbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZSAqc3VyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHRpbGVfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IG9mZnNldCwgdW5zaWduZWQgc3RhcnRfbGV2ZWwpCit7CisgICAgdWludDMyX3QgeGFsaWduLCB5YWxpZ24sIHphbGlnbiwgc2xpY2VfYWxpZ247CisgICAgdW5zaWduZWQgaTsKKworICAgIC8qIGNvbXB1dGUgYWxpZ25tZW50ICovCisgICAgaWYgKCFzdGFydF9sZXZlbCkgeworICAgICAgICBzdXJmLT5ib19hbGlnbm1lbnQgPSBNQVgyKDI1Niwgc3VyZl9tYW4tPmh3X2luZm8uZ3JvdXBfYnl0ZXMpOworICAgIH0KKyAgICB4YWxpZ24gPSBNQVgyKDgsIDY0IC8gc3VyZi0+YnBlKTsKKyAgICB5YWxpZ24gPSAxOworICAgIHphbGlnbiA9IDE7CisgICAgc2xpY2VfYWxpZ24gPSBNQVgyKDY0ICogc3VyZi0+YnBlLCBzdXJmX21hbi0+aHdfaW5mby5ncm91cF9ieXRlcyk7CisKKyAgICAvKiBidWlsZCBtaXBtYXAgdHJlZSAqLworICAgIGZvciAoaSA9IHN0YXJ0X2xldmVsOyBpIDw9IHN1cmYtPmxhc3RfbGV2ZWw7IGkrKykgeworICAgICAgICBzdXJmLT5sZXZlbFtpXS5tb2RlID0gUkFERU9OX1NVUkZfTU9ERV9MSU5FQVJfQUxJR05FRDsKKyAgICAgICAgc2lfc3VyZl9taW5pZnkoc3VyZiwgc3VyZi0+bGV2ZWwraSwgc3VyZi0+YnBlLCBpLCB4YWxpZ24sIHlhbGlnbiwgemFsaWduLCBzbGljZV9hbGlnbiwgb2Zmc2V0KTsKKyAgICAgICAgLyogbGV2ZWwwIGFuZCBmaXJzdCBtaXBtYXAgbmVlZCB0byBoYXZlIGFsaWdubWVudCAqLworICAgICAgICBvZmZzZXQgPSBzdXJmLT5ib19zaXplOworICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICBvZmZzZXQgPSBBTElHTihvZmZzZXQsIHN1cmYtPmJvX2FsaWdubWVudCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN1cmYtPmZsYWdzICYgUkFERU9OX1NVUkZfSEFTX1RJTEVfTU9ERV9JTkRFWCkgeworICAgICAgICAgICAgc3VyZi0+dGlsaW5nX2luZGV4W2ldID0gdGlsZV9tb2RlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNpX3N1cmZhY2VfaW5pdF8xZChzdHJ1Y3QgcmFkZW9uX3N1cmZhY2VfbWFuYWdlciAqc3VyZl9tYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFkZW9uX3N1cmZhY2UgKnN1cmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFkZW9uX3N1cmZhY2VfbGV2ZWwgKmxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYnBlLCB1bnNpZ25lZCB0aWxlX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBvZmZzZXQsIHVuc2lnbmVkIHN0YXJ0X2xldmVsKQoreworICAgIHVpbnQzMl90IHhhbGlnbiwgeWFsaWduLCB6YWxpZ24sIHNsaWNlX2FsaWduOworICAgIHVuc2lnbmVkIGFsaWdubWVudCA9IE1BWDIoMjU2LCBzdXJmX21hbi0+aHdfaW5mby5ncm91cF9ieXRlcyk7CisgICAgdW5zaWduZWQgaTsKKworICAgIC8qIGNvbXB1dGUgYWxpZ25tZW50ICovCisgICAgeGFsaWduID0gODsKKyAgICB5YWxpZ24gPSA4OworICAgIHphbGlnbiA9IDE7CisgICAgc2xpY2VfYWxpZ24gPSBzdXJmX21hbi0+aHdfaW5mby5ncm91cF9ieXRlczsKKyAgICBpZiAoc3VyZi0+ZmxhZ3MgJiBSQURFT05fU1VSRl9TQ0FOT1VUKSB7CisgICAgICAgIHhhbGlnbiA9IE1BWDIoKGJwZSA9PSAxKSA/IDY0IDogMzIsIHhhbGlnbik7CisgICAgfQorCisgICAgaWYgKHN0YXJ0X2xldmVsIDw9IDEpIHsKKyAgICAgICAgc3VyZi0+Ym9fYWxpZ25tZW50ID0gTUFYMihzdXJmLT5ib19hbGlnbm1lbnQsIGFsaWdubWVudCk7CisKKyAgICAgICAgaWYgKG9mZnNldCkgeworICAgICAgICAgICAgb2Zmc2V0ID0gQUxJR04ob2Zmc2V0LCBhbGlnbm1lbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogYnVpbGQgbWlwbWFwIHRyZWUgKi8KKyAgICBmb3IgKGkgPSBzdGFydF9sZXZlbDsgaSA8PSBzdXJmLT5sYXN0X2xldmVsOyBpKyspIHsKKyAgICAgICAgbGV2ZWxbaV0ubW9kZSA9IFJBREVPTl9TVVJGX01PREVfMUQ7CisgICAgICAgIHNpX3N1cmZfbWluaWZ5KHN1cmYsIGxldmVsK2ksIGJwZSwgaSwgeGFsaWduLCB5YWxpZ24sIHphbGlnbiwgc2xpY2VfYWxpZ24sIG9mZnNldCk7CisgICAgICAgIC8qIGxldmVsMCBhbmQgZmlyc3QgbWlwbWFwIG5lZWQgdG8gaGF2ZSBhbGlnbm1lbnQgKi8KKyAgICAgICAgb2Zmc2V0ID0gc3VyZi0+Ym9fc2l6ZTsKKyAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgb2Zmc2V0ID0gQUxJR04ob2Zmc2V0LCBhbGlnbm1lbnQpOworICAgICAgICB9CisgICAgICAgIGlmIChzdXJmLT5mbGFncyAmIFJBREVPTl9TVVJGX0hBU19USUxFX01PREVfSU5ERVgpIHsKKyAgICAgICAgICAgIGlmIChzdXJmLT5sZXZlbCA9PSBsZXZlbCkgeworICAgICAgICAgICAgICAgIHN1cmYtPnRpbGluZ19pbmRleFtpXSA9IHRpbGVfbW9kZTsKKyAgICAgICAgICAgICAgICAvKiBpdCdzIG9rIGJlY2F1c2Ugc3RlbmNpbCBpcyBkb25lIGFmdGVyICovCisgICAgICAgICAgICAgICAgc3VyZi0+c3RlbmNpbF90aWxpbmdfaW5kZXhbaV0gPSB0aWxlX21vZGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN1cmYtPnN0ZW5jaWxfdGlsaW5nX2luZGV4W2ldID0gdGlsZV9tb2RlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNpX3N1cmZhY2VfaW5pdF8xZF9taXB0cmVlcyhzdHJ1Y3QgcmFkZW9uX3N1cmZhY2VfbWFuYWdlciAqc3VyZl9tYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFkZW9uX3N1cmZhY2UgKnN1cmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB0aWxlX21vZGUsIHVuc2lnbmVkIHN0ZW5jaWxfdGlsZV9tb2RlKQoreworICAgIGludCByOworCisgICAgciA9IHNpX3N1cmZhY2VfaW5pdF8xZChzdXJmX21hbiwgc3VyZiwgc3VyZi0+bGV2ZWwsIHN1cmYtPmJwZSwgdGlsZV9tb2RlLCAwLCAwKTsKKyAgICBpZiAocikgeworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBpZiAoc3VyZi0+ZmxhZ3MgJiBSQURFT05fU1VSRl9TQlVGRkVSKSB7CisgICAgICAgIHIgPSBzaV9zdXJmYWNlX2luaXRfMWQoc3VyZl9tYW4sIHN1cmYsIHN1cmYtPnN0ZW5jaWxfbGV2ZWwsIDEsIHN0ZW5jaWxfdGlsZV9tb2RlLCBzdXJmLT5ib19zaXplLCAwKTsKKyAgICAgICAgc3VyZi0+c3RlbmNpbF9vZmZzZXQgPSBzdXJmLT5zdGVuY2lsX2xldmVsWzBdLm9mZnNldDsKKyAgICB9CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc2lfc3VyZmFjZV9pbml0XzJkKHN0cnVjdCByYWRlb25fc3VyZmFjZV9tYW5hZ2VyICpzdXJmX21hbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZSAqc3VyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZV9sZXZlbCAqbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBicGUsIHVuc2lnbmVkIHRpbGVfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV9waXBlcywgdW5zaWduZWQgbnVtX2JhbmtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdGlsZV9zcGxpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHN0YXJ0X2xldmVsKQoreworICAgIHVpbnQ2NF90IGFsaWduZWRfb2Zmc2V0ID0gb2Zmc2V0OworICAgIHVuc2lnbmVkIHRpbGV3LCB0aWxlaCwgdGlsZWI7CisgICAgdW5zaWduZWQgbXRpbGV3LCBtdGlsZWgsIG10aWxlYjsKKyAgICB1bnNpZ25lZCBzbGljZV9wdDsKKyAgICB1bnNpZ25lZCBpOworCisgICAgLyogY29tcHV0ZSB0aWxlIHZhbHVlcyAqLworICAgIHRpbGV3ID0gODsKKyAgICB0aWxlaCA9IDg7CisgICAgdGlsZWIgPSB0aWxldyAqIHRpbGVoICogYnBlICogc3VyZi0+bnNhbXBsZXM7CisgICAgLyogc2xpY2VzIHBlciB0aWxlICovCisgICAgc2xpY2VfcHQgPSAxOworICAgIGlmICh0aWxlYiA+IHRpbGVfc3BsaXQgJiYgdGlsZV9zcGxpdCkgeworICAgICAgICBzbGljZV9wdCA9IHRpbGViIC8gdGlsZV9zcGxpdDsKKyAgICB9CisgICAgdGlsZWIgPSB0aWxlYiAvIHNsaWNlX3B0OworCisgICAgLyogbWFjcm8gdGlsZSB3aWR0aCAmIGhlaWdodCAqLworICAgIG10aWxldyA9ICh0aWxldyAqIHN1cmYtPmJhbmt3ICogbnVtX3BpcGVzKSAqIHN1cmYtPm10aWxlYTsKKyAgICBtdGlsZWggPSAodGlsZWggKiBzdXJmLT5iYW5raCAqIG51bV9iYW5rcykgLyBzdXJmLT5tdGlsZWE7CisKKyAgICAvKiBtYWNybyB0aWxlIGJ5dGVzICovCisgICAgbXRpbGViID0gKG10aWxldyAvIHRpbGV3KSAqIChtdGlsZWggLyB0aWxlaCkgKiB0aWxlYjsKKworICAgIGlmIChzdGFydF9sZXZlbCA8PSAxKSB7CisgICAgICAgIHVuc2lnbmVkIGFsaWdubWVudCA9IE1BWDIoMjU2LCBtdGlsZWIpOworICAgICAgICBzdXJmLT5ib19hbGlnbm1lbnQgPSBNQVgyKHN1cmYtPmJvX2FsaWdubWVudCwgYWxpZ25tZW50KTsKKworICAgICAgICBpZiAoYWxpZ25lZF9vZmZzZXQpIHsKKyAgICAgICAgICAgIGFsaWduZWRfb2Zmc2V0ID0gQUxJR04oYWxpZ25lZF9vZmZzZXQsIGFsaWdubWVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBidWlsZCBtaXBtYXAgdHJlZSAqLworICAgIGZvciAoaSA9IHN0YXJ0X2xldmVsOyBpIDw9IHN1cmYtPmxhc3RfbGV2ZWw7IGkrKykgeworICAgICAgICBsZXZlbFtpXS5tb2RlID0gUkFERU9OX1NVUkZfTU9ERV8yRDsKKyAgICAgICAgc2lfc3VyZl9taW5pZnlfMmQoc3VyZiwgbGV2ZWwraSwgYnBlLCBpLCBzbGljZV9wdCwgbXRpbGV3LCBtdGlsZWgsIDEsIG10aWxlYiwgYWxpZ25lZF9vZmZzZXQpOworICAgICAgICBpZiAobGV2ZWxbaV0ubW9kZSA9PSBSQURFT05fU1VSRl9NT0RFXzFEKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHRpbGVfbW9kZSkgeworICAgICAgICAgICAgY2FzZSBTSV9USUxFX01PREVfQ09MT1JfMkRfOEJQUDoKKyAgICAgICAgICAgIGNhc2UgU0lfVElMRV9NT0RFX0NPTE9SXzJEXzE2QlBQOgorICAgICAgICAgICAgY2FzZSBTSV9USUxFX01PREVfQ09MT1JfMkRfMzJCUFA6CisgICAgICAgICAgICBjYXNlIFNJX1RJTEVfTU9ERV9DT0xPUl8yRF82NEJQUDoKKyAgICAgICAgICAgICAgICB0aWxlX21vZGUgPSBTSV9USUxFX01PREVfQ09MT1JfMUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNJX1RJTEVfTU9ERV9DT0xPUl8yRF9TQ0FOT1VUXzE2QlBQOgorICAgICAgICAgICAgY2FzZSBTSV9USUxFX01PREVfQ09MT1JfMkRfU0NBTk9VVF8zMkJQUDoKKyAgICAgICAgICAgICAgICB0aWxlX21vZGUgPSBTSV9USUxFX01PREVfQ09MT1JfMURfU0NBTk9VVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0lfVElMRV9NT0RFX0RFUFRIX1NURU5DSUxfMkQ6CisgICAgICAgICAgICAgICAgdGlsZV9tb2RlID0gU0lfVElMRV9NT0RFX0RFUFRIX1NURU5DSUxfMUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNpX3N1cmZhY2VfaW5pdF8xZChzdXJmX21hbiwgc3VyZiwgbGV2ZWwsIGJwZSwgdGlsZV9tb2RlLCBvZmZzZXQsIGkpOworICAgICAgICB9CisgICAgICAgIC8qIGxldmVsMCBhbmQgZmlyc3QgbWlwbWFwIG5lZWQgdG8gaGF2ZSBhbGlnbm1lbnQgKi8KKyAgICAgICAgYWxpZ25lZF9vZmZzZXQgPSBvZmZzZXQgPSBzdXJmLT5ib19zaXplOworICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICBhbGlnbmVkX29mZnNldCA9IEFMSUdOKGFsaWduZWRfb2Zmc2V0LCBzdXJmLT5ib19hbGlnbm1lbnQpOworICAgICAgICB9CisgICAgICAgIGlmIChzdXJmLT5mbGFncyAmIFJBREVPTl9TVVJGX0hBU19USUxFX01PREVfSU5ERVgpIHsKKyAgICAgICAgICAgIGlmIChzdXJmLT5sZXZlbCA9PSBsZXZlbCkgeworICAgICAgICAgICAgICAgIHN1cmYtPnRpbGluZ19pbmRleFtpXSA9IHRpbGVfbW9kZTsKKyAgICAgICAgICAgICAgICAvKiBpdCdzIG9rIGJlY2F1c2Ugc3RlbmNpbCBpcyBkb25lIGFmdGVyICovCisgICAgICAgICAgICAgICAgc3VyZi0+c3RlbmNpbF90aWxpbmdfaW5kZXhbaV0gPSB0aWxlX21vZGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN1cmYtPnN0ZW5jaWxfdGlsaW5nX2luZGV4W2ldID0gdGlsZV9tb2RlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNpX3N1cmZhY2VfaW5pdF8yZF9taXB0cmVlcyhzdHJ1Y3QgcmFkZW9uX3N1cmZhY2VfbWFuYWdlciAqc3VyZl9tYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFkZW9uX3N1cmZhY2UgKnN1cmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB0aWxlX21vZGUsIHVuc2lnbmVkIHN0ZW5jaWxfdGlsZV9tb2RlKQoreworICAgIHVuc2lnbmVkIG51bV9waXBlcywgbnVtX2JhbmtzOworICAgIHVpbnQzMl90IGdiX3RpbGVfbW9kZTsKKyAgICBpbnQgcjsKKworICAgIC8qIHJldHJpZXZlIHRpbGluZyBtb2RlIHZhbHVlICovCisgICAgZ2JfdGlsZV9tb2RlID0gc3VyZl9tYW4tPmh3X2luZm8udGlsZV9tb2RlX2FycmF5W3RpbGVfbW9kZV07CisgICAgc2lfZ2JfdGlsZV9tb2RlKGdiX3RpbGVfbW9kZSwgJm51bV9waXBlcywgJm51bV9iYW5rcywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgICByID0gc2lfc3VyZmFjZV9pbml0XzJkKHN1cmZfbWFuLCBzdXJmLCBzdXJmLT5sZXZlbCwgc3VyZi0+YnBlLCB0aWxlX21vZGUsIG51bV9waXBlcywgbnVtX2JhbmtzLCBzdXJmLT50aWxlX3NwbGl0LCAwLCAwKTsKKyAgICBpZiAocikgeworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBpZiAoc3VyZi0+ZmxhZ3MgJiBSQURFT05fU1VSRl9TQlVGRkVSKSB7CisgICAgICAgIHIgPSBzaV9zdXJmYWNlX2luaXRfMmQoc3VyZl9tYW4sIHN1cmYsIHN1cmYtPnN0ZW5jaWxfbGV2ZWwsIDEsIHN0ZW5jaWxfdGlsZV9tb2RlLCBudW1fcGlwZXMsIG51bV9iYW5rcywgc3VyZi0+c3RlbmNpbF90aWxlX3NwbGl0LCBzdXJmLT5ib19zaXplLCAwKTsKKyAgICAgICAgc3VyZi0+c3RlbmNpbF9vZmZzZXQgPSBzdXJmLT5zdGVuY2lsX2xldmVsWzBdLm9mZnNldDsKKyAgICB9CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc2lfc3VyZmFjZV9pbml0KHN0cnVjdCByYWRlb25fc3VyZmFjZV9tYW5hZ2VyICpzdXJmX21hbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZSAqc3VyZikKK3sKKyAgICB1bnNpZ25lZCBtb2RlLCB0aWxlX21vZGUsIHN0ZW5jaWxfdGlsZV9tb2RlOworICAgIGludCByOworCisgICAgLyogTVNBQSBzdXJmYWNlcyBzdXBwb3J0IHRoZSAyRCBtb2RlIG9ubHkuICovCisgICAgaWYgKHN1cmYtPm5zYW1wbGVzID4gMSkgeworICAgICAgICBzdXJmLT5mbGFncyA9IFJBREVPTl9TVVJGX0NMUihzdXJmLT5mbGFncywgTU9ERSk7CisgICAgICAgIHN1cmYtPmZsYWdzIHw9IFJBREVPTl9TVVJGX1NFVChSQURFT05fU1VSRl9NT0RFXzJELCBNT0RFKTsKKyAgICB9CisKKyAgICAvKiB0aWxpbmcgbW9kZSAqLworICAgIG1vZGUgPSAoc3VyZi0+ZmxhZ3MgPj4gUkFERU9OX1NVUkZfTU9ERV9TSElGVCkgJiBSQURFT05fU1VSRl9NT0RFX01BU0s7CisKKyAgICBpZiAoc3VyZi0+ZmxhZ3MgJiAoUkFERU9OX1NVUkZfWkJVRkZFUiB8IFJBREVPTl9TVVJGX1NCVUZGRVIpKSB7CisgICAgICAgIC8qIHpidWZmZXIgb25seSBzdXBwb3J0IDFEIG9yIDJEIHRpbGVkIHN1cmZhY2UgKi8KKyAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgUkFERU9OX1NVUkZfTU9ERV8xRDoKKyAgICAgICAgY2FzZSBSQURFT05fU1VSRl9NT0RFXzJEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtb2RlID0gUkFERU9OX1NVUkZfTU9ERV8xRDsKKyAgICAgICAgICAgIHN1cmYtPmZsYWdzID0gUkFERU9OX1NVUkZfQ0xSKHN1cmYtPmZsYWdzLCBNT0RFKTsKKyAgICAgICAgICAgIHN1cmYtPmZsYWdzIHw9IFJBREVPTl9TVVJGX1NFVChSQURFT05fU1VSRl9NT0RFXzFELCBNT0RFKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgciA9IHNpX3N1cmZhY2Vfc2FuaXR5KHN1cmZfbWFuLCBzdXJmLCBtb2RlLCAmdGlsZV9tb2RlLCAmc3RlbmNpbF90aWxlX21vZGUpOworICAgIGlmIChyKSB7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIHN1cmYtPnN0ZW5jaWxfb2Zmc2V0ID0gMDsKKyAgICBzdXJmLT5ib19hbGlnbm1lbnQgPSAwOworCisgICAgLyogY2hlY2sgdGlsaW5nIG1vZGUgKi8KKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIFJBREVPTl9TVVJGX01PREVfTElORUFSOgorICAgICAgICByID0gcjZfc3VyZmFjZV9pbml0X2xpbmVhcihzdXJmX21hbiwgc3VyZiwgMCwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkFERU9OX1NVUkZfTU9ERV9MSU5FQVJfQUxJR05FRDoKKyAgICAgICAgciA9IHNpX3N1cmZhY2VfaW5pdF9saW5lYXJfYWxpZ25lZChzdXJmX21hbiwgc3VyZiwgdGlsZV9tb2RlLCAwLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSQURFT05fU1VSRl9NT0RFXzFEOgorICAgICAgICByID0gc2lfc3VyZmFjZV9pbml0XzFkX21pcHRyZWVzKHN1cmZfbWFuLCBzdXJmLCB0aWxlX21vZGUsIHN0ZW5jaWxfdGlsZV9tb2RlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSQURFT05fU1VSRl9NT0RFXzJEOgorICAgICAgICByID0gc2lfc3VyZmFjZV9pbml0XzJkX21pcHRyZWVzKHN1cmZfbWFuLCBzdXJmLCB0aWxlX21vZGUsIHN0ZW5jaWxfdGlsZV9tb2RlKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHJldHVybiByOworfQorCisvKgorICogZGVwZW5kaW5nIG9uIHN1cmZhY2UKKyAqLworc3RhdGljIGludCBzaV9zdXJmYWNlX2Jlc3Qoc3RydWN0IHJhZGVvbl9zdXJmYWNlX21hbmFnZXIgKnN1cmZfbWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJhZGVvbl9zdXJmYWNlICpzdXJmKQoreworICAgIHVuc2lnbmVkIG1vZGUsIHRpbGVfbW9kZSwgc3RlbmNpbF90aWxlX21vZGU7CisKKyAgICAvKiB0aWxpbmcgbW9kZSAqLworICAgIG1vZGUgPSAoc3VyZi0+ZmxhZ3MgPj4gUkFERU9OX1NVUkZfTU9ERV9TSElGVCkgJiBSQURFT05fU1VSRl9NT0RFX01BU0s7CisKKyAgICBpZiAoc3VyZi0+ZmxhZ3MgJiAoUkFERU9OX1NVUkZfWkJVRkZFUiB8IFJBREVPTl9TVVJGX1NCVUZGRVIpICYmCisgICAgICAgICEoc3VyZi0+ZmxhZ3MgJiBSQURFT05fU1VSRl9IQVNfVElMRV9NT0RFX0lOREVYKSkgeworICAgICAgICAvKiBkZXB0aC9zdGVuY2lsIGZvcmNlIDFkIHRpbGluZyBmb3Igb2xkIG1lc2EgKi8KKyAgICAgICAgc3VyZi0+ZmxhZ3MgPSBSQURFT05fU1VSRl9DTFIoc3VyZi0+ZmxhZ3MsIE1PREUpOworICAgICAgICBzdXJmLT5mbGFncyB8PSBSQURFT05fU1VSRl9TRVQoUkFERU9OX1NVUkZfTU9ERV8xRCwgTU9ERSk7CisgICAgfQorCisgICAgcmV0dXJuIHNpX3N1cmZhY2Vfc2FuaXR5KHN1cmZfbWFuLCBzdXJmLCBtb2RlLCAmdGlsZV9tb2RlLCAmc3RlbmNpbF90aWxlX21vZGUpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VhIElzbGFuZHMgZmFtaWx5CisgKi8KKyNkZWZpbmUgQ0lLX19HQl9USUxFX01PREVfX1BJUEVfQ09ORklHKHgpICAgICAgICAoKCh4KSA+PiA2KSAmIDB4MWYpCisjZGVmaW5lICAgICBDSUtfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDIgICAgICAgICAgICAgICAwCisjZGVmaW5lICAgICBDSUtfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDRfOHgxNiAgICAgICAgICA0CisjZGVmaW5lICAgICBDSUtfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDRfMTZ4MTYgICAgICAgICA1CisjZGVmaW5lICAgICBDSUtfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDRfMTZ4MzIgICAgICAgICA2CisjZGVmaW5lICAgICBDSUtfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDRfMzJ4MzIgICAgICAgICA3CisjZGVmaW5lICAgICBDSUtfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDhfMTZ4MTZfOHgxNiAgICA4CisjZGVmaW5lICAgICBDSUtfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDhfMTZ4MzJfOHgxNiAgICA5CisjZGVmaW5lICAgICBDSUtfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDhfMzJ4MzJfOHgxNiAgICAxMAorI2RlZmluZSAgICAgQ0lLX19QSVBFX0NPTkZJR19fQUREUl9TVVJGX1A4XzE2eDMyXzE2eDE2ICAgMTEKKyNkZWZpbmUgICAgIENJS19fUElQRV9DT05GSUdfX0FERFJfU1VSRl9QOF8zMngzMl8xNngxNiAgIDEyCisjZGVmaW5lICAgICBDSUtfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDhfMzJ4MzJfMTZ4MzIgICAxMworI2RlZmluZSAgICAgQ0lLX19QSVBFX0NPTkZJR19fQUREUl9TVVJGX1A4XzMyeDY0XzMyeDMyICAgMTQKKyNkZWZpbmUgICAgIENJS19fUElQRV9DT05GSUdfX0FERFJfU1VSRl9QMTZfMzJYMzJfOFgxNiAgIDE2CisjZGVmaW5lICAgICBDSUtfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDE2XzMyWDMyXzE2WDE2ICAxNworI2RlZmluZSBDSUtfX0dCX1RJTEVfTU9ERV9fVElMRV9TUExJVCh4KSAgICAgICAgICgoKHgpID4+IDExKSAmIDB4NykKKyNkZWZpbmUgICAgIENJS19fVElMRV9TUExJVF9fNjRCICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgICAgIENJS19fVElMRV9TUExJVF9fMTI4QiAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgICAgIENJS19fVElMRV9TUExJVF9fMjU2QiAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgICAgIENJS19fVElMRV9TUExJVF9fNTEyQiAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgICAgIENJS19fVElMRV9TUExJVF9fMTAyNEIgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgICAgIENJS19fVElMRV9TUExJVF9fMjA0OEIgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgICAgIENJS19fVElMRV9TUExJVF9fNDA5NkIgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQ0lLX19HQl9USUxFX01PREVfX1NBTVBMRV9TUExJVCh4KSAgICAgICAgICgoKHgpID4+IDI1KSAmIDB4MykKKyNkZWZpbmUgICAgIENJS19fU0FNUExFX1NQTElUX18xICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgICAgIENJS19fU0FNUExFX1NQTElUX18yICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgICAgIENJS19fU0FNUExFX1NQTElUX180ICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgICAgIENJS19fU0FNUExFX1NQTElUX184ICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQ0lLX19HQl9NQUNST1RJTEVfTU9ERV9fQkFOS19XSURUSCh4KSAgICAgICAgKCh4KSAmIDB4MykKKyNkZWZpbmUgICAgIENJS19fQkFOS19XSURUSF9fMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgICAgIENJS19fQkFOS19XSURUSF9fMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgICAgIENJS19fQkFOS19XSURUSF9fNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgICAgIENJS19fQkFOS19XSURUSF9fOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQ0lLX19HQl9NQUNST1RJTEVfTU9ERV9fQkFOS19IRUlHSFQoeCkgICAgICAgKCgoeCkgPj4gMikgJiAweDMpCisjZGVmaW5lICAgICBDSUtfX0JBTktfSEVJR0hUX18xICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lICAgICBDSUtfX0JBTktfSEVJR0hUX18yICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lICAgICBDSUtfX0JBTktfSEVJR0hUX180ICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lICAgICBDSUtfX0JBTktfSEVJR0hUX184ICAgICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIENJS19fR0JfTUFDUk9USUxFX01PREVfX01BQ1JPX1RJTEVfQVNQRUNUKHgpICgoKHgpID4+IDQpICYgMHgzKQorI2RlZmluZSAgICAgQ0lLX19NQUNST19USUxFX0FTUEVDVF9fMSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSAgICAgQ0lLX19NQUNST19USUxFX0FTUEVDVF9fMiAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSAgICAgQ0lLX19NQUNST19USUxFX0FTUEVDVF9fNCAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSAgICAgQ0lLX19NQUNST19USUxFX0FTUEVDVF9fOCAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBDSUtfX0dCX01BQ1JPVElMRV9NT0RFX19OVU1fQkFOS1MoeCkgICAgICAgICAoKCh4KSA+PiA2KSAmIDB4MykKKyNkZWZpbmUgICAgIENJS19fTlVNX0JBTktTX18yX0JBTksgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgICAgIENJS19fTlVNX0JBTktTX180X0JBTksgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgICAgIENJS19fTlVNX0JBTktTX184X0JBTksgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgICAgIENJS19fTlVNX0JBTktTX18xNl9CQU5LICAgICAgICAgICAgICAgICAgICAgIDMKKworCitzdGF0aWMgdm9pZCBjaWtfZ2V0XzJkX3BhcmFtcyhzdHJ1Y3QgcmFkZW9uX3N1cmZhY2VfbWFuYWdlciAqc3VyZl9tYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBicGUsIHVuc2lnbmVkIG5zYW1wbGVzLCBib29sIGlzX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdGlsZV9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bV9waXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp0aWxlX3NwbGl0X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1fYmFua3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbWFjcm9fdGlsZV9hc3BlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqYmFua193LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmJhbmtfaCkKK3sKKyAgICB1aW50MzJfdCBnYl90aWxlX21vZGUgPSBzdXJmX21hbi0+aHdfaW5mby50aWxlX21vZGVfYXJyYXlbdGlsZV9tb2RlXTsKKyAgICB1bnNpZ25lZCB0aWxlYl8xeCwgdGlsZWI7CisgICAgdW5zaWduZWQgZ2JfbWFjcm90aWxlX21vZGU7CisgICAgdW5zaWduZWQgbWFjcm90aWxlX2luZGV4OworICAgIHVuc2lnbmVkIHRpbGVfc3BsaXQsIHNhbXBsZV9zcGxpdDsKKworICAgIGlmIChudW1fcGlwZXMpIHsKKyAgICAgICAgc3dpdGNoIChDSUtfX0dCX1RJTEVfTU9ERV9fUElQRV9DT05GSUcoZ2JfdGlsZV9tb2RlKSkgeworICAgICAgICBjYXNlIENJS19fUElQRV9DT05GSUdfX0FERFJfU1VSRl9QMjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICpudW1fcGlwZXMgPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0lLX19QSVBFX0NPTkZJR19fQUREUl9TVVJGX1A0Xzh4MTY6CisgICAgICAgIGNhc2UgQ0lLX19QSVBFX0NPTkZJR19fQUREUl9TVVJGX1A0XzE2eDE2OgorICAgICAgICBjYXNlIENJS19fUElQRV9DT05GSUdfX0FERFJfU1VSRl9QNF8xNngzMjoKKyAgICAgICAgY2FzZSBDSUtfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDRfMzJ4MzI6CisgICAgICAgICAgICAqbnVtX3BpcGVzID0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENJS19fUElQRV9DT05GSUdfX0FERFJfU1VSRl9QOF8xNngxNl84eDE2OgorICAgICAgICBjYXNlIENJS19fUElQRV9DT05GSUdfX0FERFJfU1VSRl9QOF8xNngzMl84eDE2OgorICAgICAgICBjYXNlIENJS19fUElQRV9DT05GSUdfX0FERFJfU1VSRl9QOF8zMngzMl84eDE2OgorICAgICAgICBjYXNlIENJS19fUElQRV9DT05GSUdfX0FERFJfU1VSRl9QOF8xNngzMl8xNngxNjoKKyAgICAgICAgY2FzZSBDSUtfX1BJUEVfQ09ORklHX19BRERSX1NVUkZfUDhfMzJ4MzJfMTZ4MTY6CisgICAgICAgIGNhc2UgQ0lLX19QSVBFX0NPTkZJR19fQUREUl9TVVJGX1A4XzMyeDMyXzE2eDMyOgorICAgICAgICBjYXNlIENJS19fUElQRV9DT05GSUdfX0FERFJfU1VSRl9QOF8zMng2NF8zMngzMjoKKyAgICAgICAgICAgICpudW1fcGlwZXMgPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0lLX19QSVBFX0NPTkZJR19fQUREUl9TVVJGX1AxNl8zMlgzMl84WDE2OgorICAgICAgICBjYXNlIENJS19fUElQRV9DT05GSUdfX0FERFJfU1VSRl9QMTZfMzJYMzJfMTZYMTY6CisgICAgICAgICAgICAqbnVtX3BpcGVzID0gMTY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBzd2l0Y2ggKENJS19fR0JfVElMRV9NT0RFX19USUxFX1NQTElUKGdiX3RpbGVfbW9kZSkpIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgQ0lLX19USUxFX1NQTElUX182NEI6CisgICAgICAgIHRpbGVfc3BsaXQgPSA2NDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDSUtfX1RJTEVfU1BMSVRfXzEyOEI6CisgICAgICAgIHRpbGVfc3BsaXQgPSAxMjg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0lLX19USUxFX1NQTElUX18yNTZCOgorICAgICAgICB0aWxlX3NwbGl0ID0gMjU2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIENJS19fVElMRV9TUExJVF9fNTEyQjoKKyAgICAgICAgdGlsZV9zcGxpdCA9IDUxMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDSUtfX1RJTEVfU1BMSVRfXzEwMjRCOgorICAgICAgICB0aWxlX3NwbGl0ID0gMTAyNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDSUtfX1RJTEVfU1BMSVRfXzIwNDhCOgorICAgICAgICB0aWxlX3NwbGl0ID0gMjA0ODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDSUtfX1RJTEVfU1BMSVRfXzQwOTZCOgorICAgICAgICB0aWxlX3NwbGl0ID0gNDA5NjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHN3aXRjaCAoQ0lLX19HQl9USUxFX01PREVfX1NBTVBMRV9TUExJVChnYl90aWxlX21vZGUpKSB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIENJS19fU0FNUExFX1NQTElUX18xOgorICAgICAgICBzYW1wbGVfc3BsaXQgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENJS19fU0FNUExFX1NQTElUX18yOgorICAgICAgICBzYW1wbGVfc3BsaXQgPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENJS19fU0FNUExFX1NQTElUX180OgorICAgICAgICBzYW1wbGVfc3BsaXQgPSA0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIENJS19fU0FNUExFX1NQTElUX184OgorICAgICAgICBzYW1wbGVfc3BsaXQgPSA4OworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBBZGp1c3QgdGhlIHRpbGUgc3BsaXQuICovCisgICAgdGlsZWJfMXggPSA4ICogOCAqIGJwZTsKKyAgICBpZiAoaXNfY29sb3IpIHsKKyAgICAgICAgdGlsZV9zcGxpdCA9IE1BWDIoMjU2LCBzYW1wbGVfc3BsaXQgKiB0aWxlYl8xeCk7CisgICAgfQorICAgIHRpbGVfc3BsaXQgPSBNSU4yKHN1cmZfbWFuLT5od19pbmZvLnJvd19zaXplLCB0aWxlX3NwbGl0KTsKKworICAgIC8qIERldGVybWluZSB0aGUgbWFjcm90aWxlIGluZGV4LiAqLworICAgIHRpbGViID0gTUlOMih0aWxlX3NwbGl0LCBuc2FtcGxlcyAqIHRpbGViXzF4KTsKKworICAgIGZvciAobWFjcm90aWxlX2luZGV4ID0gMDsgdGlsZWIgPiA2NDsgbWFjcm90aWxlX2luZGV4KyspIHsKKyAgICAgICAgdGlsZWIgPj49IDE7CisgICAgfQorICAgIGdiX21hY3JvdGlsZV9tb2RlID0gc3VyZl9tYW4tPmh3X2luZm8ubWFjcm90aWxlX21vZGVfYXJyYXlbbWFjcm90aWxlX2luZGV4XTsKKworICAgIGlmICh0aWxlX3NwbGl0X3B0cikgeworICAgICAgICAqdGlsZV9zcGxpdF9wdHIgPSB0aWxlX3NwbGl0OworICAgIH0KKyAgICBpZiAobnVtX2JhbmtzKSB7CisgICAgICAgIHN3aXRjaCAoQ0lLX19HQl9NQUNST1RJTEVfTU9ERV9fTlVNX0JBTktTKGdiX21hY3JvdGlsZV9tb2RlKSkgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlIENJS19fTlVNX0JBTktTX18yX0JBTks6CisgICAgICAgICAgICAqbnVtX2JhbmtzID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENJS19fTlVNX0JBTktTX180X0JBTks6CisgICAgICAgICAgICAqbnVtX2JhbmtzID0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENJS19fTlVNX0JBTktTX184X0JBTks6CisgICAgICAgICAgICAqbnVtX2JhbmtzID0gODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENJS19fTlVNX0JBTktTX18xNl9CQU5LOgorICAgICAgICAgICAgKm51bV9iYW5rcyA9IDE2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1hY3JvX3RpbGVfYXNwZWN0KSB7CisgICAgICAgIHN3aXRjaCAoQ0lLX19HQl9NQUNST1RJTEVfTU9ERV9fTUFDUk9fVElMRV9BU1BFQ1QoZ2JfbWFjcm90aWxlX21vZGUpKSB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgQ0lLX19NQUNST19USUxFX0FTUEVDVF9fMToKKyAgICAgICAgICAgICptYWNyb190aWxlX2FzcGVjdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDSUtfX01BQ1JPX1RJTEVfQVNQRUNUX18yOgorICAgICAgICAgICAgKm1hY3JvX3RpbGVfYXNwZWN0ID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENJS19fTUFDUk9fVElMRV9BU1BFQ1RfXzQ6CisgICAgICAgICAgICAqbWFjcm9fdGlsZV9hc3BlY3QgPSA0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0lLX19NQUNST19USUxFX0FTUEVDVF9fODoKKyAgICAgICAgICAgICptYWNyb190aWxlX2FzcGVjdCA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYmFua193KSB7CisgICAgICAgIHN3aXRjaCAoQ0lLX19HQl9NQUNST1RJTEVfTU9ERV9fQkFOS19XSURUSChnYl9tYWNyb3RpbGVfbW9kZSkpIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2FzZSBDSUtfX0JBTktfV0lEVEhfXzE6CisgICAgICAgICAgICAqYmFua193ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENJS19fQkFOS19XSURUSF9fMjoKKyAgICAgICAgICAgICpiYW5rX3cgPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0lLX19CQU5LX1dJRFRIX180OgorICAgICAgICAgICAgKmJhbmtfdyA9IDQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDSUtfX0JBTktfV0lEVEhfXzg6CisgICAgICAgICAgICAqYmFua193ID0gODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChiYW5rX2gpIHsKKyAgICAgICAgc3dpdGNoIChDSUtfX0dCX01BQ1JPVElMRV9NT0RFX19CQU5LX0hFSUdIVChnYl9tYWNyb3RpbGVfbW9kZSkpIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2FzZSBDSUtfX0JBTktfSEVJR0hUX18xOgorICAgICAgICAgICAgKmJhbmtfaCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDSUtfX0JBTktfSEVJR0hUX18yOgorICAgICAgICAgICAgKmJhbmtfaCA9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDSUtfX0JBTktfSEVJR0hUX180OgorICAgICAgICAgICAgKmJhbmtfaCA9IDQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDSUtfX0JBTktfSEVJR0hUX184OgorICAgICAgICAgICAgKmJhbmtfaCA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBjaWtfaW5pdF9od19pbmZvKHN0cnVjdCByYWRlb25fc3VyZmFjZV9tYW5hZ2VyICpzdXJmX21hbikKK3sKKyAgICB1aW50MzJfdCB0aWxpbmdfY29uZmlnOworICAgIGRybVZlcnNpb25QdHIgdmVyc2lvbjsKKyAgICBpbnQgcjsKKworICAgIHIgPSByYWRlb25fZ2V0X3ZhbHVlKHN1cmZfbWFuLT5mZCwgUkFERU9OX0lORk9fVElMSU5HX0NPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmdGlsaW5nX2NvbmZpZyk7CisgICAgaWYgKHIpIHsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgc3VyZl9tYW4tPmh3X2luZm8uYWxsb3dfMmQgPSAwOworICAgIHZlcnNpb24gPSBkcm1HZXRWZXJzaW9uKHN1cmZfbWFuLT5mZCk7CisgICAgaWYgKHZlcnNpb24gJiYgdmVyc2lvbi0+dmVyc2lvbl9taW5vciA+PSAzNSkgeworICAgICAgICBpZiAoIXJhZGVvbl9nZXRfdmFsdWUoc3VyZl9tYW4tPmZkLCBSQURFT05fSU5GT19TSV9USUxFX01PREVfQVJSQVksIHN1cmZfbWFuLT5od19pbmZvLnRpbGVfbW9kZV9hcnJheSkgJiYKKwkgICAgIXJhZGVvbl9nZXRfdmFsdWUoc3VyZl9tYW4tPmZkLCBSQURFT05fSU5GT19DSUtfTUFDUk9USUxFX01PREVfQVJSQVksIHN1cmZfbWFuLT5od19pbmZvLm1hY3JvdGlsZV9tb2RlX2FycmF5KSkgeworICAgICAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8uYWxsb3dfMmQgPSAxOworICAgICAgICB9CisgICAgfQorICAgIGRybUZyZWVWZXJzaW9uKHZlcnNpb24pOworCisgICAgc3dpdGNoICh0aWxpbmdfY29uZmlnICYgMHhmKSB7CisgICAgY2FzZSAwOgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5udW1fcGlwZXMgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLm51bV9waXBlcyA9IDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8ubnVtX3BpcGVzID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5udW1fcGlwZXMgPSA4OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5udW1fcGlwZXMgPSA4OworICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5hbGxvd18yZCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoKHRpbGluZ19jb25maWcgJiAweGYwKSA+PiA0KSB7CisgICAgY2FzZSAwOgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5udW1fYmFua3MgPSA0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLm51bV9iYW5rcyA9IDg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8ubnVtX2JhbmtzID0gMTY7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLm51bV9iYW5rcyA9IDg7CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLmFsbG93XzJkID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoICgodGlsaW5nX2NvbmZpZyAmIDB4ZjAwKSA+PiA4KSB7CisgICAgY2FzZSAwOgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5ncm91cF9ieXRlcyA9IDI1NjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5ncm91cF9ieXRlcyA9IDUxMjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8uZ3JvdXBfYnl0ZXMgPSAyNTY7CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLmFsbG93XzJkID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoICgodGlsaW5nX2NvbmZpZyAmIDB4ZjAwMCkgPj4gMTIpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLnJvd19zaXplID0gMTAyNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5yb3dfc2l6ZSA9IDIwNDg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgc3VyZl9tYW4tPmh3X2luZm8ucm93X3NpemUgPSA0MDk2OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzdXJmX21hbi0+aHdfaW5mby5yb3dfc2l6ZSA9IDQwOTY7CisgICAgICAgIHN1cmZfbWFuLT5od19pbmZvLmFsbG93XzJkID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNpa19zdXJmYWNlX3Nhbml0eShzdHJ1Y3QgcmFkZW9uX3N1cmZhY2VfbWFuYWdlciAqc3VyZl9tYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFkZW9uX3N1cmZhY2UgKnN1cmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtb2RlLCB1bnNpZ25lZCAqdGlsZV9tb2RlLCB1bnNpZ25lZCAqc3RlbmNpbF90aWxlX21vZGUpCit7CisgICAgLyogY2hlY2sgc3VyZmFjZSBkaW1lbnNpb24gKi8KKyAgICBpZiAoc3VyZi0+bnBpeF94ID4gMTYzODQgfHwgc3VyZi0+bnBpeF95ID4gMTYzODQgfHwgc3VyZi0+bnBpeF96ID4gMTYzODQpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLyogY2hlY2sgbWlwbWFwIGxhc3RfbGV2ZWwgKi8KKyAgICBpZiAoc3VyZi0+bGFzdF9sZXZlbCA+IDE1KSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8qIGZvcmNlIDFkIG9uIGtlcm5lbCB0aGF0IGNhbid0IGRvIDJkICovCisgICAgaWYgKG1vZGUgPiBSQURFT05fU1VSRl9NT0RFXzFEICYmCisgICAgICAgICghc3VyZl9tYW4tPmh3X2luZm8uYWxsb3dfMmQgfHwgIShzdXJmLT5mbGFncyAmIFJBREVPTl9TVVJGX0hBU19USUxFX01PREVfSU5ERVgpKSkgeworICAgICAgICBpZiAoc3VyZi0+bnNhbXBsZXMgPiAxKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInJhZGVvbjogQ2Fubm90IHVzZSAxRCB0aWxpbmcgZm9yIGFuIE1TQUEgc3VyZmFjZSAoJWkpLlxuIiwgX19MSU5FX18pOworICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgIH0KKyAgICAgICAgbW9kZSA9IFJBREVPTl9TVVJGX01PREVfMUQ7CisgICAgICAgIHN1cmYtPmZsYWdzID0gUkFERU9OX1NVUkZfQ0xSKHN1cmYtPmZsYWdzLCBNT0RFKTsKKyAgICAgICAgc3VyZi0+ZmxhZ3MgfD0gUkFERU9OX1NVUkZfU0VUKG1vZGUsIE1PREUpOworICAgIH0KKworICAgIGlmIChzdXJmLT5uc2FtcGxlcyA+IDEgJiYgbW9kZSAhPSBSQURFT05fU1VSRl9NT0RFXzJEKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmICghc3VyZi0+dGlsZV9zcGxpdCkgeworICAgICAgICAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgIHN1cmYtPm10aWxlYSA9IDE7CisgICAgICAgIHN1cmYtPmJhbmt3ID0gMTsKKyAgICAgICAgc3VyZi0+YmFua2ggPSAxOworICAgICAgICBzdXJmLT50aWxlX3NwbGl0ID0gNjQ7CisgICAgICAgIHN1cmYtPnN0ZW5jaWxfdGlsZV9zcGxpdCA9IDY0OworICAgIH0KKworICAgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgUkFERU9OX1NVUkZfTU9ERV8yRDogeworICAgICAgICBpZiAoc3VyZi0+ZmxhZ3MgJiBSQURFT05fU1VSRl9aX09SX1NCVUZGRVIpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3VyZi0+bnNhbXBsZXMpIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAqdGlsZV9tb2RlID0gQ0lLX1RJTEVfTU9ERV9ERVBUSF9TVEVOQ0lMXzJEX1RJTEVTUExJVF82NDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAqdGlsZV9tb2RlID0gQ0lLX1RJTEVfTU9ERV9ERVBUSF9TVEVOQ0lMXzJEX1RJTEVTUExJVF8xMjg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgKnRpbGVfbW9kZSA9IENJS19USUxFX01PREVfREVQVEhfU1RFTkNJTF8yRF9USUxFU1BMSVRfMjU2OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN1cmYtPmZsYWdzICYgUkFERU9OX1NVUkZfU0JVRkZFUikgeworICAgICAgICAgICAgICAgICpzdGVuY2lsX3RpbGVfbW9kZSA9ICp0aWxlX21vZGU7CisKKyAgICAgICAgICAgICAgICBjaWtfZ2V0XzJkX3BhcmFtcyhzdXJmX21hbiwgMSwgc3VyZi0+bnNhbXBsZXMsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGVuY2lsX3RpbGVfbW9kZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3VyZi0+c3RlbmNpbF90aWxlX3NwbGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN1cmYtPmZsYWdzICYgUkFERU9OX1NVUkZfU0NBTk9VVCkgeworICAgICAgICAgICAgKnRpbGVfbW9kZSA9IENJS19USUxFX01PREVfQ09MT1JfMkRfU0NBTk9VVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICp0aWxlX21vZGUgPSBDSUtfVElMRV9NT0RFX0NPTE9SXzJEOworICAgICAgICB9CisKKyAgICAgICAgLyogcmV0cmlldmUgdGlsaW5nIG1vZGUgdmFsdWVzICovCisgICAgICAgIGNpa19nZXRfMmRfcGFyYW1zKHN1cmZfbWFuLCBzdXJmLT5icGUsIHN1cmYtPm5zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAhKHN1cmYtPmZsYWdzICYgUkFERU9OX1NVUkZfWl9PUl9TQlVGRkVSKSwgKnRpbGVfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnN1cmYtPnRpbGVfc3BsaXQsIE5VTEwsICZzdXJmLT5tdGlsZWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdXJmLT5iYW5rdywgJnN1cmYtPmJhbmtoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUkFERU9OX1NVUkZfTU9ERV8xRDoKKyAgICAgICAgaWYgKHN1cmYtPmZsYWdzICYgUkFERU9OX1NVUkZfU0JVRkZFUikgeworICAgICAgICAgICAgKnN0ZW5jaWxfdGlsZV9tb2RlID0gQ0lLX1RJTEVfTU9ERV9ERVBUSF9TVEVOQ0lMXzFEOworICAgICAgICB9CisgICAgICAgIGlmIChzdXJmLT5mbGFncyAmIFJBREVPTl9TVVJGX1pCVUZGRVIpIHsKKyAgICAgICAgICAgICp0aWxlX21vZGUgPSBDSUtfVElMRV9NT0RFX0RFUFRIX1NURU5DSUxfMUQ7CisgICAgICAgIH0gZWxzZSBpZiAoc3VyZi0+ZmxhZ3MgJiBSQURFT05fU1VSRl9TQ0FOT1VUKSB7CisgICAgICAgICAgICAqdGlsZV9tb2RlID0gU0lfVElMRV9NT0RFX0NPTE9SXzFEX1NDQU5PVVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqdGlsZV9tb2RlID0gU0lfVElMRV9NT0RFX0NPTE9SXzFEOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkFERU9OX1NVUkZfTU9ERV9MSU5FQVJfQUxJR05FRDoKKyAgICBkZWZhdWx0OgorICAgICAgICAqdGlsZV9tb2RlID0gU0lfVElMRV9NT0RFX0NPTE9SX0xJTkVBUl9BTElHTkVEOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNpa19zdXJmYWNlX2luaXRfMmQoc3RydWN0IHJhZGVvbl9zdXJmYWNlX21hbmFnZXIgKnN1cmZfbWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZSAqc3VyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFkZW9uX3N1cmZhY2VfbGV2ZWwgKmxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGJwZSwgdW5zaWduZWQgdGlsZV9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHRpbGVfc3BsaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX3BpcGVzLCB1bnNpZ25lZCBudW1fYmFua3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHN0YXJ0X2xldmVsKQoreworICAgIHVpbnQ2NF90IGFsaWduZWRfb2Zmc2V0ID0gb2Zmc2V0OworICAgIHVuc2lnbmVkIHRpbGV3LCB0aWxlaCwgdGlsZWJfMXgsIHRpbGViOworICAgIHVuc2lnbmVkIG10aWxldywgbXRpbGVoLCBtdGlsZWI7CisgICAgdW5zaWduZWQgc2xpY2VfcHQ7CisgICAgdW5zaWduZWQgaTsKKworICAgIC8qIGNvbXB1dGUgdGlsZSB2YWx1ZXMgKi8KKyAgICB0aWxldyA9IDg7CisgICAgdGlsZWggPSA4OworICAgIHRpbGViXzF4ID0gdGlsZXcgKiB0aWxlaCAqIGJwZTsKKworICAgIHRpbGVfc3BsaXQgPSBNSU4yKHN1cmZfbWFuLT5od19pbmZvLnJvd19zaXplLCB0aWxlX3NwbGl0KTsKKworICAgIHRpbGViID0gc3VyZi0+bnNhbXBsZXMgKiB0aWxlYl8xeDsKKworICAgIC8qIHNsaWNlcyBwZXIgdGlsZSAqLworICAgIHNsaWNlX3B0ID0gMTsKKyAgICBpZiAodGlsZWIgPiB0aWxlX3NwbGl0ICYmIHRpbGVfc3BsaXQpIHsKKyAgICAgICAgc2xpY2VfcHQgPSB0aWxlYiAvIHRpbGVfc3BsaXQ7CisgICAgICAgIHRpbGViID0gdGlsZWIgLyBzbGljZV9wdDsKKyAgICB9CisKKyAgICAvKiBtYWNybyB0aWxlIHdpZHRoICYgaGVpZ2h0ICovCisgICAgbXRpbGV3ID0gKHRpbGV3ICogc3VyZi0+YmFua3cgKiBudW1fcGlwZXMpICogc3VyZi0+bXRpbGVhOworICAgIG10aWxlaCA9ICh0aWxlaCAqIHN1cmYtPmJhbmtoICogbnVtX2JhbmtzKSAvIHN1cmYtPm10aWxlYTsKKworICAgIC8qIG1hY3JvIHRpbGUgYnl0ZXMgKi8KKyAgICBtdGlsZWIgPSAobXRpbGV3IC8gdGlsZXcpICogKG10aWxlaCAvIHRpbGVoKSAqIHRpbGViOworCisgICAgaWYgKHN0YXJ0X2xldmVsIDw9IDEpIHsKKyAgICAgICAgdW5zaWduZWQgYWxpZ25tZW50ID0gTUFYMigyNTYsIG10aWxlYik7CisgICAgICAgIHN1cmYtPmJvX2FsaWdubWVudCA9IE1BWDIoc3VyZi0+Ym9fYWxpZ25tZW50LCBhbGlnbm1lbnQpOworCisgICAgICAgIGlmIChhbGlnbmVkX29mZnNldCkgeworICAgICAgICAgICAgYWxpZ25lZF9vZmZzZXQgPSBBTElHTihhbGlnbmVkX29mZnNldCwgYWxpZ25tZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGJ1aWxkIG1pcG1hcCB0cmVlICovCisgICAgZm9yIChpID0gc3RhcnRfbGV2ZWw7IGkgPD0gc3VyZi0+bGFzdF9sZXZlbDsgaSsrKSB7CisgICAgICAgIGxldmVsW2ldLm1vZGUgPSBSQURFT05fU1VSRl9NT0RFXzJEOworICAgICAgICBzaV9zdXJmX21pbmlmeV8yZChzdXJmLCBsZXZlbCtpLCBicGUsIGksIHNsaWNlX3B0LCBtdGlsZXcsIG10aWxlaCwgMSwgbXRpbGViLCBhbGlnbmVkX29mZnNldCk7CisgICAgICAgIGlmIChsZXZlbFtpXS5tb2RlID09IFJBREVPTl9TVVJGX01PREVfMUQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAodGlsZV9tb2RlKSB7CisgICAgICAgICAgICBjYXNlIENJS19USUxFX01PREVfQ09MT1JfMkQ6CisgICAgICAgICAgICAgICAgdGlsZV9tb2RlID0gU0lfVElMRV9NT0RFX0NPTE9SXzFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDSUtfVElMRV9NT0RFX0NPTE9SXzJEX1NDQU5PVVQ6CisgICAgICAgICAgICAgICAgdGlsZV9tb2RlID0gU0lfVElMRV9NT0RFX0NPTE9SXzFEX1NDQU5PVVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENJS19USUxFX01PREVfREVQVEhfU1RFTkNJTF8yRF9USUxFU1BMSVRfNjQ6CisgICAgICAgICAgICBjYXNlIENJS19USUxFX01PREVfREVQVEhfU1RFTkNJTF8yRF9USUxFU1BMSVRfMTI4OgorICAgICAgICAgICAgY2FzZSBDSUtfVElMRV9NT0RFX0RFUFRIX1NURU5DSUxfMkRfVElMRVNQTElUXzI1NjoKKyAgICAgICAgICAgIGNhc2UgQ0lLX1RJTEVfTU9ERV9ERVBUSF9TVEVOQ0lMXzJEX1RJTEVTUExJVF81MTI6CisgICAgICAgICAgICBjYXNlIENJS19USUxFX01PREVfREVQVEhfU1RFTkNJTF8yRF9USUxFU1BMSVRfUk9XX1NJWkU6CisgICAgICAgICAgICAgICAgdGlsZV9tb2RlID0gQ0lLX1RJTEVfTU9ERV9ERVBUSF9TVEVOQ0lMXzFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzaV9zdXJmYWNlX2luaXRfMWQoc3VyZl9tYW4sIHN1cmYsIGxldmVsLCBicGUsIHRpbGVfbW9kZSwgb2Zmc2V0LCBpKTsKKyAgICAgICAgfQorICAgICAgICAvKiBsZXZlbDAgYW5kIGZpcnN0IG1pcG1hcCBuZWVkIHRvIGhhdmUgYWxpZ25tZW50ICovCisgICAgICAgIGFsaWduZWRfb2Zmc2V0ID0gb2Zmc2V0ID0gc3VyZi0+Ym9fc2l6ZTsKKyAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgYWxpZ25lZF9vZmZzZXQgPSBBTElHTihhbGlnbmVkX29mZnNldCwgc3VyZi0+Ym9fYWxpZ25tZW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3VyZi0+ZmxhZ3MgJiBSQURFT05fU1VSRl9IQVNfVElMRV9NT0RFX0lOREVYKSB7CisgICAgICAgICAgICBpZiAoc3VyZi0+bGV2ZWwgPT0gbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBzdXJmLT50aWxpbmdfaW5kZXhbaV0gPSB0aWxlX21vZGU7CisgICAgICAgICAgICAgICAgLyogaXQncyBvayBiZWNhdXNlIHN0ZW5jaWwgaXMgZG9uZSBhZnRlciAqLworICAgICAgICAgICAgICAgIHN1cmYtPnN0ZW5jaWxfdGlsaW5nX2luZGV4W2ldID0gdGlsZV9tb2RlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdXJmLT5zdGVuY2lsX3RpbGluZ19pbmRleFtpXSA9IHRpbGVfbW9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaWtfc3VyZmFjZV9pbml0XzJkX21pcHRyZWVzKHN0cnVjdCByYWRlb25fc3VyZmFjZV9tYW5hZ2VyICpzdXJmX21hbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFkZW9uX3N1cmZhY2UgKnN1cmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdGlsZV9tb2RlLCB1bnNpZ25lZCBzdGVuY2lsX3RpbGVfbW9kZSkKK3sKKyAgICBpbnQgcjsKKyAgICB1aW50MzJfdCBudW1fcGlwZXMsIG51bV9iYW5rczsKKworICAgIGNpa19nZXRfMmRfcGFyYW1zKHN1cmZfbWFuLCBzdXJmLT5icGUsIHN1cmYtPm5zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIShzdXJmLT5mbGFncyAmIFJBREVPTl9TVVJGX1pfT1JfU0JVRkZFUiksIHRpbGVfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZudW1fcGlwZXMsIE5VTEwsICZudW1fYmFua3MsIE5VTEwsIE5VTEwsIE5VTEwpOworCisgICAgciA9IGNpa19zdXJmYWNlX2luaXRfMmQoc3VyZl9tYW4sIHN1cmYsIHN1cmYtPmxldmVsLCBzdXJmLT5icGUsIHRpbGVfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmLT50aWxlX3NwbGl0LCBudW1fcGlwZXMsIG51bV9iYW5rcywgMCwgMCk7CisgICAgaWYgKHIpIHsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgaWYgKHN1cmYtPmZsYWdzICYgUkFERU9OX1NVUkZfU0JVRkZFUikgeworICAgICAgICByID0gY2lrX3N1cmZhY2VfaW5pdF8yZChzdXJmX21hbiwgc3VyZiwgc3VyZi0+c3RlbmNpbF9sZXZlbCwgMSwgc3RlbmNpbF90aWxlX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmYtPnN0ZW5jaWxfdGlsZV9zcGxpdCwgbnVtX3BpcGVzLCBudW1fYmFua3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmYtPmJvX3NpemUsIDApOworICAgICAgICBzdXJmLT5zdGVuY2lsX29mZnNldCA9IHN1cmYtPnN0ZW5jaWxfbGV2ZWxbMF0ub2Zmc2V0OworICAgIH0KKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGludCBjaWtfc3VyZmFjZV9pbml0KHN0cnVjdCByYWRlb25fc3VyZmFjZV9tYW5hZ2VyICpzdXJmX21hbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFkZW9uX3N1cmZhY2UgKnN1cmYpCit7CisgICAgdW5zaWduZWQgbW9kZSwgdGlsZV9tb2RlLCBzdGVuY2lsX3RpbGVfbW9kZTsKKyAgICBpbnQgcjsKKworICAgIC8qIE1TQUEgc3VyZmFjZXMgc3VwcG9ydCB0aGUgMkQgbW9kZSBvbmx5LiAqLworICAgIGlmIChzdXJmLT5uc2FtcGxlcyA+IDEpIHsKKyAgICAgICAgc3VyZi0+ZmxhZ3MgPSBSQURFT05fU1VSRl9DTFIoc3VyZi0+ZmxhZ3MsIE1PREUpOworICAgICAgICBzdXJmLT5mbGFncyB8PSBSQURFT05fU1VSRl9TRVQoUkFERU9OX1NVUkZfTU9ERV8yRCwgTU9ERSk7CisgICAgfQorCisgICAgLyogdGlsaW5nIG1vZGUgKi8KKyAgICBtb2RlID0gKHN1cmYtPmZsYWdzID4+IFJBREVPTl9TVVJGX01PREVfU0hJRlQpICYgUkFERU9OX1NVUkZfTU9ERV9NQVNLOworCisgICAgaWYgKHN1cmYtPmZsYWdzICYgKFJBREVPTl9TVVJGX1pCVUZGRVIgfCBSQURFT05fU1VSRl9TQlVGRkVSKSkgeworICAgICAgICAvKiB6YnVmZmVyIG9ubHkgc3VwcG9ydCAxRCBvciAyRCB0aWxlZCBzdXJmYWNlICovCisgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIFJBREVPTl9TVVJGX01PREVfMUQ6CisgICAgICAgIGNhc2UgUkFERU9OX1NVUkZfTU9ERV8yRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbW9kZSA9IFJBREVPTl9TVVJGX01PREVfMUQ7CisgICAgICAgICAgICBzdXJmLT5mbGFncyA9IFJBREVPTl9TVVJGX0NMUihzdXJmLT5mbGFncywgTU9ERSk7CisgICAgICAgICAgICBzdXJmLT5mbGFncyB8PSBSQURFT05fU1VSRl9TRVQoUkFERU9OX1NVUkZfTU9ERV8xRCwgTU9ERSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHIgPSBjaWtfc3VyZmFjZV9zYW5pdHkoc3VyZl9tYW4sIHN1cmYsIG1vZGUsICZ0aWxlX21vZGUsICZzdGVuY2lsX3RpbGVfbW9kZSk7CisgICAgaWYgKHIpIHsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgc3VyZi0+c3RlbmNpbF9vZmZzZXQgPSAwOworICAgIHN1cmYtPmJvX2FsaWdubWVudCA9IDA7CisKKyAgICAvKiBjaGVjayB0aWxpbmcgbW9kZSAqLworICAgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgUkFERU9OX1NVUkZfTU9ERV9MSU5FQVI6CisgICAgICAgIHIgPSByNl9zdXJmYWNlX2luaXRfbGluZWFyKHN1cmZfbWFuLCBzdXJmLCAwLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSQURFT05fU1VSRl9NT0RFX0xJTkVBUl9BTElHTkVEOgorICAgICAgICByID0gc2lfc3VyZmFjZV9pbml0X2xpbmVhcl9hbGlnbmVkKHN1cmZfbWFuLCBzdXJmLCB0aWxlX21vZGUsIDAsIDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJBREVPTl9TVVJGX01PREVfMUQ6CisgICAgICAgIHIgPSBzaV9zdXJmYWNlX2luaXRfMWRfbWlwdHJlZXMoc3VyZl9tYW4sIHN1cmYsIHRpbGVfbW9kZSwgc3RlbmNpbF90aWxlX21vZGUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJBREVPTl9TVVJGX01PREVfMkQ6CisgICAgICAgIHIgPSBjaWtfc3VyZmFjZV9pbml0XzJkX21pcHRyZWVzKHN1cmZfbWFuLCBzdXJmLCB0aWxlX21vZGUsIHN0ZW5jaWxfdGlsZV9tb2RlKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHJldHVybiByOworfQorCisvKgorICogZGVwZW5kaW5nIG9uIHN1cmZhY2UKKyAqLworc3RhdGljIGludCBjaWtfc3VyZmFjZV9iZXN0KHN0cnVjdCByYWRlb25fc3VyZmFjZV9tYW5hZ2VyICpzdXJmX21hbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFkZW9uX3N1cmZhY2UgKnN1cmYpCit7CisgICAgdW5zaWduZWQgbW9kZSwgdGlsZV9tb2RlLCBzdGVuY2lsX3RpbGVfbW9kZTsKKworICAgIC8qIHRpbGluZyBtb2RlICovCisgICAgbW9kZSA9IChzdXJmLT5mbGFncyA+PiBSQURFT05fU1VSRl9NT0RFX1NISUZUKSAmIFJBREVPTl9TVVJGX01PREVfTUFTSzsKKworICAgIGlmIChzdXJmLT5mbGFncyAmIChSQURFT05fU1VSRl9aQlVGRkVSIHwgUkFERU9OX1NVUkZfU0JVRkZFUikgJiYKKyAgICAgICAgIShzdXJmLT5mbGFncyAmIFJBREVPTl9TVVJGX0hBU19USUxFX01PREVfSU5ERVgpKSB7CisgICAgICAgIC8qIGRlcHRoL3N0ZW5jaWwgZm9yY2UgMWQgdGlsaW5nIGZvciBvbGQgbWVzYSAqLworICAgICAgICBzdXJmLT5mbGFncyA9IFJBREVPTl9TVVJGX0NMUihzdXJmLT5mbGFncywgTU9ERSk7CisgICAgICAgIHN1cmYtPmZsYWdzIHw9IFJBREVPTl9TVVJGX1NFVChSQURFT05fU1VSRl9NT0RFXzFELCBNT0RFKTsKKyAgICB9CisKKyAgICByZXR1cm4gY2lrX3N1cmZhY2Vfc2FuaXR5KHN1cmZfbWFuLCBzdXJmLCBtb2RlLCAmdGlsZV9tb2RlLCAmc3RlbmNpbF90aWxlX21vZGUpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogcHVibGljIEFQSQorICovCitzdHJ1Y3QgcmFkZW9uX3N1cmZhY2VfbWFuYWdlciAqCityYWRlb25fc3VyZmFjZV9tYW5hZ2VyX25ldyhpbnQgZmQpCit7CisgICAgc3RydWN0IHJhZGVvbl9zdXJmYWNlX21hbmFnZXIgKnN1cmZfbWFuOworCisgICAgc3VyZl9tYW4gPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCByYWRlb25fc3VyZmFjZV9tYW5hZ2VyKSk7CisgICAgaWYgKHN1cmZfbWFuID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN1cmZfbWFuLT5mZCA9IGZkOworICAgIGlmIChyYWRlb25fZ2V0X3ZhbHVlKGZkLCBSQURFT05fSU5GT19ERVZJQ0VfSUQsICZzdXJmX21hbi0+ZGV2aWNlX2lkKSkgeworICAgICAgICBnb3RvIG91dF9lcnI7CisgICAgfQorICAgIGlmIChyYWRlb25fZ2V0X2ZhbWlseShzdXJmX21hbikpIHsKKyAgICAgICAgZ290byBvdXRfZXJyOworICAgIH0KKworICAgIGlmIChzdXJmX21hbi0+ZmFtaWx5IDw9IENISVBfUlY3NDApIHsKKyAgICAgICAgaWYgKHI2X2luaXRfaHdfaW5mbyhzdXJmX21hbikpIHsKKyAgICAgICAgICAgIGdvdG8gb3V0X2VycjsKKyAgICAgICAgfQorICAgICAgICBzdXJmX21hbi0+c3VyZmFjZV9pbml0ID0gJnI2X3N1cmZhY2VfaW5pdDsKKyAgICAgICAgc3VyZl9tYW4tPnN1cmZhY2VfYmVzdCA9ICZyNl9zdXJmYWNlX2Jlc3Q7CisgICAgfSBlbHNlIGlmIChzdXJmX21hbi0+ZmFtaWx5IDw9IENISVBfQVJVQkEpIHsKKyAgICAgICAgaWYgKGVnX2luaXRfaHdfaW5mbyhzdXJmX21hbikpIHsKKyAgICAgICAgICAgIGdvdG8gb3V0X2VycjsKKyAgICAgICAgfQorICAgICAgICBzdXJmX21hbi0+c3VyZmFjZV9pbml0ID0gJmVnX3N1cmZhY2VfaW5pdDsKKyAgICAgICAgc3VyZl9tYW4tPnN1cmZhY2VfYmVzdCA9ICZlZ19zdXJmYWNlX2Jlc3Q7CisgICAgfSBlbHNlIGlmIChzdXJmX21hbi0+ZmFtaWx5IDwgQ0hJUF9CT05BSVJFKSB7CisgICAgICAgIGlmIChzaV9pbml0X2h3X2luZm8oc3VyZl9tYW4pKSB7CisgICAgICAgICAgICBnb3RvIG91dF9lcnI7CisgICAgICAgIH0KKyAgICAgICAgc3VyZl9tYW4tPnN1cmZhY2VfaW5pdCA9ICZzaV9zdXJmYWNlX2luaXQ7CisgICAgICAgIHN1cmZfbWFuLT5zdXJmYWNlX2Jlc3QgPSAmc2lfc3VyZmFjZV9iZXN0OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjaWtfaW5pdF9od19pbmZvKHN1cmZfbWFuKSkgeworICAgICAgICAgICAgZ290byBvdXRfZXJyOworICAgICAgICB9CisgICAgICAgIHN1cmZfbWFuLT5zdXJmYWNlX2luaXQgPSAmY2lrX3N1cmZhY2VfaW5pdDsKKyAgICAgICAgc3VyZl9tYW4tPnN1cmZhY2VfYmVzdCA9ICZjaWtfc3VyZmFjZV9iZXN0OworICAgIH0KKworICAgIHJldHVybiBzdXJmX21hbjsKK291dF9lcnI6CisgICAgZnJlZShzdXJmX21hbik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQKK3JhZGVvbl9zdXJmYWNlX21hbmFnZXJfZnJlZShzdHJ1Y3QgcmFkZW9uX3N1cmZhY2VfbWFuYWdlciAqc3VyZl9tYW4pCit7CisgICAgZnJlZShzdXJmX21hbik7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX3N1cmZhY2Vfc2FuaXR5KHN0cnVjdCByYWRlb25fc3VyZmFjZV9tYW5hZ2VyICpzdXJmX21hbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZSAqc3VyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtb2RlKQoreworICAgIGlmIChzdXJmX21hbiA9PSBOVUxMIHx8IHN1cmZfbWFuLT5zdXJmYWNlX2luaXQgPT0gTlVMTCB8fCBzdXJmID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLyogYWxsIGRpbWVuc2lvbiBtdXN0IGJlIGF0IGxlYXN0IDEgISAqLworICAgIGlmICghc3VyZi0+bnBpeF94IHx8ICFzdXJmLT5ucGl4X3kgfHwgIXN1cmYtPm5waXhfeikgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKCFzdXJmLT5ibGtfdyB8fCAhc3VyZi0+YmxrX2ggfHwgIXN1cmYtPmJsa19kKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoIXN1cmYtPmFycmF5X3NpemUpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIC8qIGFycmF5IHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIDIgKi8KKyAgICBzdXJmLT5hcnJheV9zaXplID0gbmV4dF9wb3dlcl9vZl90d28oc3VyZi0+YXJyYXlfc2l6ZSk7CisKKyAgICBzd2l0Y2ggKHN1cmYtPm5zYW1wbGVzKSB7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICBjYXNlIDQ6CisgICAgY2FzZSA4OgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgLyogY2hlY2sgdHlwZSAqLworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgUkFERU9OX1NVUkZfVFlQRV8xRDoKKyAgICAgICAgaWYgKHN1cmYtPm5waXhfeSA+IDEpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgY2FzZSBSQURFT05fU1VSRl9UWVBFXzJEOgorICAgICAgICBpZiAoc3VyZi0+bnBpeF96ID4gMSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSQURFT05fU1VSRl9UWVBFX0NVQkVNQVA6CisgICAgICAgIGlmIChzdXJmLT5ucGl4X3ogPiAxKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAvKiBkZWFsIHdpdGggY3ViZW1hcCBhcyB0aGV5IHdlcmUgdGV4dHVyZSBhcnJheSAqLworICAgICAgICBpZiAoc3VyZl9tYW4tPmZhbWlseSA+PSBDSElQX1JWNzcwKSB7CisgICAgICAgICAgICBzdXJmLT5hcnJheV9zaXplID0gODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cmYtPmFycmF5X3NpemUgPSA2OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkFERU9OX1NVUkZfVFlQRV8zRDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSQURFT05fU1VSRl9UWVBFXzFEX0FSUkFZOgorICAgICAgICBpZiAoc3VyZi0+bnBpeF95ID4gMSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICBjYXNlIFJBREVPTl9TVVJGX1RZUEVfMkRfQVJSQVk6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50CityYWRlb25fc3VyZmFjZV9pbml0KHN0cnVjdCByYWRlb25fc3VyZmFjZV9tYW5hZ2VyICpzdXJmX21hbiwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJhZGVvbl9zdXJmYWNlICpzdXJmKQoreworICAgIHVuc2lnbmVkIG1vZGUsIHR5cGU7CisgICAgaW50IHI7CisKKyAgICB0eXBlID0gUkFERU9OX1NVUkZfR0VUKHN1cmYtPmZsYWdzLCBUWVBFKTsKKyAgICBtb2RlID0gUkFERU9OX1NVUkZfR0VUKHN1cmYtPmZsYWdzLCBNT0RFKTsKKworICAgIHIgPSByYWRlb25fc3VyZmFjZV9zYW5pdHkoc3VyZl9tYW4sIHN1cmYsIHR5cGUsIG1vZGUpOworICAgIGlmIChyKSB7CisgICAgICAgIHJldHVybiByOworICAgIH0KKyAgICByZXR1cm4gc3VyZl9tYW4tPnN1cmZhY2VfaW5pdChzdXJmX21hbiwgc3VyZik7Cit9CisKK2ludAorcmFkZW9uX3N1cmZhY2VfYmVzdChzdHJ1Y3QgcmFkZW9uX3N1cmZhY2VfbWFuYWdlciAqc3VyZl9tYW4sCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZSAqc3VyZikKK3sKKyAgICB1bnNpZ25lZCBtb2RlLCB0eXBlOworICAgIGludCByOworCisgICAgdHlwZSA9IFJBREVPTl9TVVJGX0dFVChzdXJmLT5mbGFncywgVFlQRSk7CisgICAgbW9kZSA9IFJBREVPTl9TVVJGX0dFVChzdXJmLT5mbGFncywgTU9ERSk7CisKKyAgICByID0gcmFkZW9uX3N1cmZhY2Vfc2FuaXR5KHN1cmZfbWFuLCBzdXJmLCB0eXBlLCBtb2RlKTsKKyAgICBpZiAocikgeworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisgICAgcmV0dXJuIHN1cmZfbWFuLT5zdXJmYWNlX2Jlc3Qoc3VyZl9tYW4sIHN1cmYpOworfQpkaWZmIC0tZ2l0IGEvcmFkZW9uL3JhZGVvbl9zdXJmYWNlLmggYi9yYWRlb24vcmFkZW9uX3N1cmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjdjYWI2Ci0tLSAvZGV2L251bGwKKysrIGIvcmFkZW9uL3JhZGVvbl9zdXJmYWNlLmgKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBSZWQgSGF0IEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTCisgKiBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqLworLyoKKyAqIEF1dGhvcnM6CisgKiAgICAgIErDqXLDtG1lIEdsaXNzZSA8amdsaXNzZUByZWRoYXQuY29tPgorICovCisjaWZuZGVmIFJBREVPTl9TVVJGQUNFX0gKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0VfSAorCisvKiBOb3RlIDoKKyAqCisgKiBGb3IgdGV4dHVyZSBhcnJheSwgdGhlIG4gbGF5ZXIgYXJlIHN0b3JlZCBvbmUgYWZ0ZXIgdGhlIG90aGVyIHdpdGhpbiBlYWNoCisgKiBtaXBtYXAgbGV2ZWwuIDAgdmFsdWUgZm9yIGZpZWxkIHRoYW4gY2FuIGJlIGhpbnQgaXMgYWx3YXlzIHZhbGlkLgorICovCisKKyNkZWZpbmUgUkFERU9OX1NVUkZfTUFYX0xFVkVMICAgICAgICAgICAgICAgICAgIDMyCisKKyNkZWZpbmUgUkFERU9OX1NVUkZfVFlQRV9NQVNLICAgICAgICAgICAgICAgICAgIDB4RkYKKyNkZWZpbmUgUkFERU9OX1NVUkZfVFlQRV9TSElGVCAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgICAgIFJBREVPTl9TVVJGX1RZUEVfMUQgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lICAgICBSQURFT05fU1VSRl9UWVBFXzJEICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSAgICAgUkFERU9OX1NVUkZfVFlQRV8zRCAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgICAgIFJBREVPTl9TVVJGX1RZUEVfQ1VCRU1BUCAgICAgICAgICAgICAgICAzCisjZGVmaW5lICAgICBSQURFT05fU1VSRl9UWVBFXzFEX0FSUkFZICAgICAgICAgICAgICAgNAorI2RlZmluZSAgICAgUkFERU9OX1NVUkZfVFlQRV8yRF9BUlJBWSAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgUkFERU9OX1NVUkZfTU9ERV9NQVNLICAgICAgICAgICAgICAgICAgIDB4RkYKKyNkZWZpbmUgUkFERU9OX1NVUkZfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgICAgIFJBREVPTl9TVVJGX01PREVfTElORUFSICAgICAgICAgICAgICAgICAwCisjZGVmaW5lICAgICBSQURFT05fU1VSRl9NT0RFX0xJTkVBUl9BTElHTkVEICAgICAgICAgMQorI2RlZmluZSAgICAgUkFERU9OX1NVUkZfTU9ERV8xRCAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgICAgIFJBREVPTl9TVVJGX01PREVfMkQgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFJBREVPTl9TVVJGX1NDQU5PVVQgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNikKKyNkZWZpbmUgUkFERU9OX1NVUkZfWkJVRkZFUiAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE3KQorI2RlZmluZSBSQURFT05fU1VSRl9TQlVGRkVSICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTgpCisjZGVmaW5lIFJBREVPTl9TVVJGX1pfT1JfU0JVRkZFUiAgICAgICAgICAgICAgICAoUkFERU9OX1NVUkZfWkJVRkZFUiB8IFJBREVPTl9TVVJGX1NCVUZGRVIpCisjZGVmaW5lIFJBREVPTl9TVVJGX0hBU19TQlVGRkVSX01JUFRSRUUgICAgICAgICAoMSA8PCAxOSkKKyNkZWZpbmUgUkFERU9OX1NVUkZfSEFTX1RJTEVfTU9ERV9JTkRFWCAgICAgICAgICgxIDw8IDIwKQorI2RlZmluZSBSQURFT05fU1VSRl9GTUFTSyAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjEpCisKKyNkZWZpbmUgUkFERU9OX1NVUkZfR0VUKHYsIGZpZWxkKSAgICgoKHYpID4+IFJBREVPTl9TVVJGXyAjIyBmaWVsZCAjIyBfU0hJRlQpICYgUkFERU9OX1NVUkZfICMjIGZpZWxkICMjIF9NQVNLKQorI2RlZmluZSBSQURFT05fU1VSRl9TRVQodiwgZmllbGQpICAgKCgodikgJiBSQURFT05fU1VSRl8gIyMgZmllbGQgIyMgX01BU0spIDw8IFJBREVPTl9TVVJGXyAjIyBmaWVsZCAjIyBfU0hJRlQpCisjZGVmaW5lIFJBREVPTl9TVVJGX0NMUih2LCBmaWVsZCkgICAoKHYpICYgfihSQURFT05fU1VSRl8gIyMgZmllbGQgIyMgX01BU0sgPDwgUkFERU9OX1NVUkZfICMjIGZpZWxkICMjIF9TSElGVCkpCisKKy8qIGZpcnN0IGZpZWxkIHVwIHRvIG1vZGUgbmVlZCB0byBtYXRjaCByNiBzdHJ1Y3Qgc28gdGhhdCB3ZSBjYW4gcmV1c2UKKyAqIHNhbWUgZnVuY3Rpb24gZm9yIGxpbmVhciAmIGxpbmVhciBhbGlnbmVkCisgKi8KK3N0cnVjdCByYWRlb25fc3VyZmFjZV9sZXZlbCB7CisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgIG9mZnNldDsKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgc2xpY2Vfc2l6ZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgbnBpeF94OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBucGl4X3k7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIG5waXhfejsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgbmJsa194OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBuYmxrX3k7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIG5ibGtfejsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgcGl0Y2hfYnl0ZXM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIG1vZGU7Cit9OworCitlbnVtIHNpX3RpbGluZ19tb2RlIHsKKyAgICBTSV9USUxJTkdfQVVUTyA9IDAsCisKKyAgICBTSV9USUxJTkdfQ09MT1JfMUQsCisgICAgU0lfVElMSU5HX0NPTE9SXzFEX1NDQU5PVVQsCisgICAgU0lfVElMSU5HX0NPTE9SXzJEXzhCUFAsCisgICAgU0lfVElMSU5HX0NPTE9SXzJEXzE2QlBQLAorICAgIFNJX1RJTElOR19DT0xPUl8yRF8zMkJQUCwKKyAgICBTSV9USUxJTkdfQ09MT1JfMkRfNjRCUFAsCisgICAgU0lfVElMSU5HX0NPTE9SXzJEX1NDQU5PVVRfMTZCUFAsCisgICAgU0lfVElMSU5HX0NPTE9SXzJEX1NDQU5PVVRfMzJCUFAsCisgICAgU0lfVElMSU5HX0NPTE9SX0xJTkVBUiwKKworICAgIFNJX1RJTElOR19TVEVOQ0lMXzFELAorICAgIFNJX1RJTElOR19TVEVOQ0lMXzJELAorICAgIFNJX1RJTElOR19TVEVOQ0lMXzJEXzJBQSwKKyAgICBTSV9USUxJTkdfU1RFTkNJTF8yRF80QUEsCisgICAgU0lfVElMSU5HX1NURU5DSUxfMkRfOEFBLAorCisgICAgU0lfVElMSU5HX0RFUFRIXzFELAorICAgIFNJX1RJTElOR19ERVBUSF8yRCwKKyAgICBTSV9USUxJTkdfREVQVEhfMkRfMkFBLAorICAgIFNJX1RJTElOR19ERVBUSF8yRF80QUEsCisgICAgU0lfVElMSU5HX0RFUFRIXzJEXzhBQSwKKworICAgIFNJX1RJTElOR19MQVNUX01PREUsCit9OworCitzdHJ1Y3QgcmFkZW9uX3N1cmZhY2UgeworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBucGl4X3g7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIG5waXhfeTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgbnBpeF96OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBibGtfdzsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgYmxrX2g7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIGJsa19kOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBhcnJheV9zaXplOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBsYXN0X2xldmVsOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBicGU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIG5zYW1wbGVzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBmbGFnczsKKyAgICAvKiBGb2xsb3dpbmcgaXMgdXBkYXRlZC9maWxsIGJ5IHRoZSBhbGxvY2F0b3IuIEl0J3MgYWxsb3dlZCB0bworICAgICAqIHNldCBzb21lIG9mIHRoZSB2YWx1ZSBidXQgdGhleSBhcmUgdXNlIGFzIGhpbnQgYW5kIGNhbiBiZQorICAgICAqIG92ZXJyaWRkZW4gKHRoaW5ncyBsaWxlIGJhbmt3L2JhbmtoIG9uIGV2ZXJncmVlbiBmb3IKKyAgICAgKiBpbnN0YW5jZSkuCisgICAgICovCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgIGJvX3NpemU7CisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgIGJvX2FsaWdubWVudDsKKyAgICAvKiBhcHBseSB0byBlZyAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBiYW5rdzsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgYmFua2g7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIG10aWxlYTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgdGlsZV9zcGxpdDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgc3RlbmNpbF90aWxlX3NwbGl0OworICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICBzdGVuY2lsX29mZnNldDsKKyAgICBzdHJ1Y3QgcmFkZW9uX3N1cmZhY2VfbGV2ZWwgbGV2ZWxbUkFERU9OX1NVUkZfTUFYX0xFVkVMXTsKKyAgICBzdHJ1Y3QgcmFkZW9uX3N1cmZhY2VfbGV2ZWwgc3RlbmNpbF9sZXZlbFtSQURFT05fU1VSRl9NQVhfTEVWRUxdOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICB0aWxpbmdfaW5kZXhbUkFERU9OX1NVUkZfTUFYX0xFVkVMXTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgc3RlbmNpbF90aWxpbmdfaW5kZXhbUkFERU9OX1NVUkZfTUFYX0xFVkVMXTsKK307CisKK3N0cnVjdCByYWRlb25fc3VyZmFjZV9tYW5hZ2VyICpyYWRlb25fc3VyZmFjZV9tYW5hZ2VyX25ldyhpbnQgZmQpOwordm9pZCByYWRlb25fc3VyZmFjZV9tYW5hZ2VyX2ZyZWUoc3RydWN0IHJhZGVvbl9zdXJmYWNlX21hbmFnZXIgKnN1cmZfbWFuKTsKK2ludCByYWRlb25fc3VyZmFjZV9pbml0KHN0cnVjdCByYWRlb25fc3VyZmFjZV9tYW5hZ2VyICpzdXJmX21hbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRlb25fc3VyZmFjZSAqc3VyZik7CitpbnQgcmFkZW9uX3N1cmZhY2VfYmVzdChzdHJ1Y3QgcmFkZW9uX3N1cmZhY2VfbWFuYWdlciAqc3VyZl9tYW4sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFkZW9uX3N1cmZhY2UgKnN1cmYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3RlZ3JhLy5naXRpZ25vcmUgYi90ZWdyYS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Y2ZlNDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZWdyYS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKK2xpYmRybV90ZWdyYS5wYwpkaWZmIC0tZ2l0IGEvdGVncmEvTWFrZWZpbGUuYW0gYi90ZWdyYS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjQwYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVncmEvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyNSBAQAorQU1fQ1BQRkxBR1MgPSBcCisJLUkkKHRvcF9zcmNkaXIpIFwKKwktSSQodG9wX3NyY2RpcikvaW5jbHVkZS9kcm0KKworQU1fQ0ZMQUdTID0gXAorCUBQVEhSRUFEU1RVQlNfQ0ZMQUdTQCBcCisJJChXQVJOX0NGTEFHUykKKworbGliZHJtX3RlZ3JhX2xhZGlyID0gJChsaWJkaXIpCitsaWJkcm1fdGVncmFfbGFfTFRMSUJSQVJJRVMgPSBsaWJkcm1fdGVncmEubGEKK2xpYmRybV90ZWdyYV9sYV9MREZMQUdTID0gLXZlcnNpb24tbnVtYmVyIDA6MDowIC1uby11bmRlZmluZWQKK2xpYmRybV90ZWdyYV9sYV9MSUJBREQgPSAuLi9saWJkcm0ubGEgQFBUSFJFQURTVFVCU19MSUJTQAorCitsaWJkcm1fdGVncmFfbGFfU09VUkNFUyA9IFwKKwlwcml2YXRlLmggXAorCXRlZ3JhLmMKKworbGliZHJtX3RlZ3JhaW5jbHVkZWRpciA9ICR7aW5jbHVkZWRpcn0vbGliZHJtCitsaWJkcm1fdGVncmFpbmNsdWRlX0hFQURFUlMgPSB0ZWdyYS5oCisKK3BrZ2NvbmZpZ2RpciA9IEBwa2djb25maWdkaXJACitwa2djb25maWdfREFUQSA9IGxpYmRybV90ZWdyYS5wYworCitURVNUUyA9IHRlZ3JhLXN5bWJvbC1jaGVjaworRVhUUkFfRElTVCA9ICQoVEVTVFMpCmRpZmYgLS1naXQgYS90ZWdyYS9saWJkcm1fdGVncmEucGMuaW4gYi90ZWdyYS9saWJkcm1fdGVncmEucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUwNmY0OQotLS0gL2Rldi9udWxsCisrKyBiL3RlZ3JhL2xpYmRybV90ZWdyYS5wYy5pbgpAQCAtMCwwICsxLDExIEBACitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKKworTmFtZTogbGliZHJtX3RlZ3JhCitEZXNjcmlwdGlvbjogVXNlcnNwYWNlIGludGVyZmFjZSB0byBUZWdyYSBrZXJuZWwgRFJNIHNlcnZpY2VzCitWZXJzaW9uOiBAUEFDS0FHRV9WRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWxkcm1fdGVncmEKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9IC1JJHtpbmNsdWRlZGlyfS9saWJkcm0KK1JlcXVpcmVzLnByaXZhdGU6IGxpYmRybQpkaWZmIC0tZ2l0IGEvdGVncmEvcHJpdmF0ZS5oIGIvdGVncmEvcHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNmMxYTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZWdyYS9wcml2YXRlLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDEyLCAyMDEzIFRoaWVycnkgUmVkaW5nCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBFcmlrIEZheWUtTHVuZAorICogQ29weXJpZ2h0IMKpIDIwMTQgTlZJRElBIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX0RSTV9URUdSQV9QUklWQVRFX0hfXworI2RlZmluZSBfX0RSTV9URUdSQV9QUklWQVRFX0hfXyAxCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxsaWJkcm1fbWFjcm9zLmg+CisjaW5jbHVkZSA8eGY4NmF0b21pYy5oPgorCisjaW5jbHVkZSAidGVncmEuaCIKKworc3RydWN0IGRybV90ZWdyYSB7CisJYm9vbCBjbG9zZTsKKwlpbnQgZmQ7Cit9OworCitzdHJ1Y3QgZHJtX3RlZ3JhX2JvIHsKKwlzdHJ1Y3QgZHJtX3RlZ3JhICpkcm07CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IG9mZnNldDsKKwl1aW50MzJfdCBmbGFnczsKKwl1aW50MzJfdCBzaXplOworCWF0b21pY190IHJlZjsKKwl2b2lkICptYXA7Cit9OworCisjZW5kaWYgLyogX19EUk1fVEVHUkFfUFJJVkFURV9IX18gKi8KZGlmZiAtLWdpdCBhL3RlZ3JhL3RlZ3JhLXN5bWJvbC1jaGVjayBiL3RlZ3JhL3RlZ3JhLXN5bWJvbC1jaGVjawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MjA0NjlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVncmEvdGVncmEtc3ltYm9sLWNoZWNrCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9iYXNoCisKKyMgVGhlIGZvbGxvd2luZyBzeW1ib2xzIChwYXN0IHRoZSBmaXJzdCBuaW5lKSBhcmUgdGFrZW4gZnJvbSB0ZWdyYS5oLgorCitGVU5DUz0kKG5tIC1EIC0tZm9ybWF0PWJzZCAtLWRlZmluZWQtb25seSAkezEtLmxpYnMvbGliZHJtX3RlZ3JhLnNvfSB8IGF3ayAne3ByaW50ICQzfSd8IHdoaWxlIHJlYWQgZnVuYzsgZG8KKyggZ3JlcCAtcSAiXiRmdW5jJCIgfHwgZWNobyAkZnVuYyApICA8PEVPRgorX19ic3NfZW5kX18KK19fYnNzX3N0YXJ0X18KK19fYnNzX3N0YXJ0CitfX2VuZF9fCitfYnNzX2VuZF9fCitfZWRhdGEKK19lbmQKK19maW5pCitfaW5pdAorZHJtX3RlZ3JhX2JvX2dldF9mbGFncworZHJtX3RlZ3JhX2JvX2dldF9oYW5kbGUKK2RybV90ZWdyYV9ib19nZXRfdGlsaW5nCitkcm1fdGVncmFfYm9fbWFwCitkcm1fdGVncmFfYm9fbmV3Citkcm1fdGVncmFfYm9fcmVmCitkcm1fdGVncmFfYm9fc2V0X2ZsYWdzCitkcm1fdGVncmFfYm9fc2V0X3RpbGluZworZHJtX3RlZ3JhX2JvX3VubWFwCitkcm1fdGVncmFfYm9fdW5yZWYKK2RybV90ZWdyYV9ib193cmFwCitkcm1fdGVncmFfY2xvc2UKK2RybV90ZWdyYV9uZXcKK0VPRgorZG9uZSkKKwordGVzdCAhIC1uICIkRlVOQ1MiIHx8IGVjaG8gJEZVTkNTCit0ZXN0ICEgLW4gIiRGVU5DUyIKZGlmZiAtLWdpdCBhL3RlZ3JhL3RlZ3JhLmMgYi90ZWdyYS90ZWdyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZGM4OWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZWdyYS90ZWdyYS5jCkBAIC0wLDAgKzEsMzMyIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTIsIDIwMTMgVGhpZXJyeSBSZWRpbmcKKyAqIENvcHlyaWdodCDCqSAyMDEzIEVyaWsgRmF5ZS1MdW5kCisgKiBDb3B5cmlnaHQgwqkgMjAxNCBOVklESUEgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpbmNsdWRlIDx4Zjg2ZHJtLmg+CisKKyNpbmNsdWRlIDx0ZWdyYV9kcm0uaD4KKworI2luY2x1ZGUgInByaXZhdGUuaCIKKworc3RhdGljIHZvaWQgZHJtX3RlZ3JhX2JvX2ZyZWUoc3RydWN0IGRybV90ZWdyYV9ibyAqYm8pCit7CisJc3RydWN0IGRybV90ZWdyYSAqZHJtID0gYm8tPmRybTsKKwlzdHJ1Y3QgZHJtX2dlbV9jbG9zZSBhcmdzOworCisJaWYgKGJvLT5tYXApCisJCW11bm1hcChiby0+bWFwLCBiby0+c2l6ZSk7CisKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisJYXJncy5oYW5kbGUgPSBiby0+aGFuZGxlOworCisJZHJtSW9jdGwoZHJtLT5mZCwgRFJNX0lPQ1RMX0dFTV9DTE9TRSwgJmFyZ3MpOworCisJZnJlZShibyk7Cit9CisKK3N0YXRpYyBpbnQgZHJtX3RlZ3JhX3dyYXAoc3RydWN0IGRybV90ZWdyYSAqKmRybXAsIGludCBmZCwgYm9vbCBjbG9zZSkKK3sKKwlzdHJ1Y3QgZHJtX3RlZ3JhICpkcm07CisKKwlpZiAoZmQgPCAwIHx8ICFkcm1wKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRybSA9IGNhbGxvYygxLCBzaXplb2YoKmRybSkpOworCWlmICghZHJtKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRybS0+Y2xvc2UgPSBjbG9zZTsKKwlkcm0tPmZkID0gZmQ7CisKKwkqZHJtcCA9IGRybTsKKworCXJldHVybiAwOworfQorCitpbnQgZHJtX3RlZ3JhX25ldyhzdHJ1Y3QgZHJtX3RlZ3JhICoqZHJtcCwgaW50IGZkKQoreworCWJvb2wgc3VwcG9ydGVkID0gZmFsc2U7CisJZHJtVmVyc2lvblB0ciB2ZXJzaW9uOworCisJdmVyc2lvbiA9IGRybUdldFZlcnNpb24oZmQpOworCWlmICghdmVyc2lvbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoIXN0cm5jbXAodmVyc2lvbi0+bmFtZSwgInRlZ3JhIiwgdmVyc2lvbi0+bmFtZV9sZW4pKQorCQlzdXBwb3J0ZWQgPSB0cnVlOworCisJZHJtRnJlZVZlcnNpb24odmVyc2lvbik7CisKKwlpZiAoIXN1cHBvcnRlZCkKKwkJcmV0dXJuIC1FTk9UU1VQOworCisJcmV0dXJuIGRybV90ZWdyYV93cmFwKGRybXAsIGZkLCBmYWxzZSk7Cit9CisKK3ZvaWQgZHJtX3RlZ3JhX2Nsb3NlKHN0cnVjdCBkcm1fdGVncmEgKmRybSkKK3sKKwlpZiAoIWRybSkKKwkJcmV0dXJuOworCisJaWYgKGRybS0+Y2xvc2UpCisJCWNsb3NlKGRybS0+ZmQpOworCisJZnJlZShkcm0pOworfQorCitpbnQgZHJtX3RlZ3JhX2JvX25ldyhzdHJ1Y3QgZHJtX3RlZ3JhX2JvICoqYm9wLCBzdHJ1Y3QgZHJtX3RlZ3JhICpkcm0sCisJCSAgICAgdWludDMyX3QgZmxhZ3MsIHVpbnQzMl90IHNpemUpCit7CisJc3RydWN0IGRybV90ZWdyYV9nZW1fY3JlYXRlIGFyZ3M7CisJc3RydWN0IGRybV90ZWdyYV9ibyAqYm87CisJaW50IGVycjsKKworCWlmICghZHJtIHx8IHNpemUgPT0gMCB8fCAhYm9wKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJvID0gY2FsbG9jKDEsIHNpemVvZigqYm8pKTsKKwlpZiAoIWJvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWF0b21pY19zZXQoJmJvLT5yZWYsIDEpOworCWJvLT5mbGFncyA9IGZsYWdzOworCWJvLT5zaXplID0gc2l6ZTsKKwliby0+ZHJtID0gZHJtOworCisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCWFyZ3MuZmxhZ3MgPSBmbGFnczsKKwlhcmdzLnNpemUgPSBzaXplOworCisJZXJyID0gZHJtQ29tbWFuZFdyaXRlUmVhZChkcm0tPmZkLCBEUk1fVEVHUkFfR0VNX0NSRUFURSwgJmFyZ3MsCisJCQkJICBzaXplb2YoYXJncykpOworCWlmIChlcnIgPCAwKSB7CisJCWVyciA9IC1lcnJubzsKKwkJZnJlZShibyk7CisJCXJldHVybiBlcnI7CisJfQorCisJYm8tPmhhbmRsZSA9IGFyZ3MuaGFuZGxlOworCisJKmJvcCA9IGJvOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkcm1fdGVncmFfYm9fd3JhcChzdHJ1Y3QgZHJtX3RlZ3JhX2JvICoqYm9wLCBzdHJ1Y3QgZHJtX3RlZ3JhICpkcm0sCisJCSAgICAgIHVpbnQzMl90IGhhbmRsZSwgdWludDMyX3QgZmxhZ3MsIHVpbnQzMl90IHNpemUpCit7CisJc3RydWN0IGRybV90ZWdyYV9ibyAqYm87CisKKwlpZiAoIWRybSB8fCAhYm9wKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJvID0gY2FsbG9jKDEsIHNpemVvZigqYm8pKTsKKwlpZiAoIWJvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWF0b21pY19zZXQoJmJvLT5yZWYsIDEpOworCWJvLT5oYW5kbGUgPSBoYW5kbGU7CisJYm8tPmZsYWdzID0gZmxhZ3M7CisJYm8tPnNpemUgPSBzaXplOworCWJvLT5kcm0gPSBkcm07CisKKwkqYm9wID0gYm87CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGRybV90ZWdyYV9ibyAqZHJtX3RlZ3JhX2JvX3JlZihzdHJ1Y3QgZHJtX3RlZ3JhX2JvICpibykKK3sKKwlpZiAoYm8pCisJCWF0b21pY19pbmMoJmJvLT5yZWYpOworCisJcmV0dXJuIGJvOworfQorCit2b2lkIGRybV90ZWdyYV9ib191bnJlZihzdHJ1Y3QgZHJtX3RlZ3JhX2JvICpibykKK3sKKwlpZiAoYm8gJiYgYXRvbWljX2RlY19hbmRfdGVzdCgmYm8tPnJlZikpCisJCWRybV90ZWdyYV9ib19mcmVlKGJvKTsKK30KKworaW50IGRybV90ZWdyYV9ib19nZXRfaGFuZGxlKHN0cnVjdCBkcm1fdGVncmFfYm8gKmJvLCB1aW50MzJfdCAqaGFuZGxlKQoreworCWlmICghYm8gfHwgIWhhbmRsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqaGFuZGxlID0gYm8tPmhhbmRsZTsKKworCXJldHVybiAwOworfQorCitpbnQgZHJtX3RlZ3JhX2JvX21hcChzdHJ1Y3QgZHJtX3RlZ3JhX2JvICpibywgdm9pZCAqKnB0cikKK3sKKwlzdHJ1Y3QgZHJtX3RlZ3JhICpkcm0gPSBiby0+ZHJtOworCisJaWYgKCFiby0+bWFwKSB7CisJCXN0cnVjdCBkcm1fdGVncmFfZ2VtX21tYXAgYXJnczsKKwkJaW50IGVycjsKKworCQltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisJCWFyZ3MuaGFuZGxlID0gYm8tPmhhbmRsZTsKKworCQllcnIgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGRybS0+ZmQsIERSTV9URUdSQV9HRU1fTU1BUCwgJmFyZ3MsCisJCQkJCSAgc2l6ZW9mKGFyZ3MpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gLWVycm5vOworCisJCWJvLT5vZmZzZXQgPSBhcmdzLm9mZnNldDsKKworCQliby0+bWFwID0gbW1hcCgwLCBiby0+c2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwKKwkJCSAgICAgICBkcm0tPmZkLCBiby0+b2Zmc2V0KTsKKwkJaWYgKGJvLT5tYXAgPT0gTUFQX0ZBSUxFRCkgeworCQkJYm8tPm1hcCA9IE5VTEw7CisJCQlyZXR1cm4gLWVycm5vOworCQl9CisJfQorCisJaWYgKHB0cikKKwkJKnB0ciA9IGJvLT5tYXA7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRybV90ZWdyYV9ib191bm1hcChzdHJ1Y3QgZHJtX3RlZ3JhX2JvICpibykKK3sKKwlpZiAoIWJvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghYm8tPm1hcCkKKwkJcmV0dXJuIDA7CisKKwlpZiAobXVubWFwKGJvLT5tYXAsIGJvLT5zaXplKSkKKwkJcmV0dXJuIC1lcnJubzsKKworCWJvLT5tYXAgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkcm1fdGVncmFfYm9fZ2V0X2ZsYWdzKHN0cnVjdCBkcm1fdGVncmFfYm8gKmJvLCB1aW50MzJfdCAqZmxhZ3MpCit7CisJc3RydWN0IGRybV90ZWdyYV9nZW1fZ2V0X2ZsYWdzIGFyZ3M7CisJc3RydWN0IGRybV90ZWdyYSAqZHJtID0gYm8tPmRybTsKKwlpbnQgZXJyOworCisJaWYgKCFibykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisJYXJncy5oYW5kbGUgPSBiby0+aGFuZGxlOworCisJZXJyID0gZHJtQ29tbWFuZFdyaXRlUmVhZChkcm0tPmZkLCBEUk1fVEVHUkFfR0VNX0dFVF9GTEFHUywgJmFyZ3MsCisJCQkJICBzaXplb2YoYXJncykpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gLWVycm5vOworCisJaWYgKGZsYWdzKQorCQkqZmxhZ3MgPSBhcmdzLmZsYWdzOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkcm1fdGVncmFfYm9fc2V0X2ZsYWdzKHN0cnVjdCBkcm1fdGVncmFfYm8gKmJvLCB1aW50MzJfdCBmbGFncykKK3sKKwlzdHJ1Y3QgZHJtX3RlZ3JhX2dlbV9nZXRfZmxhZ3MgYXJnczsKKwlzdHJ1Y3QgZHJtX3RlZ3JhICpkcm0gPSBiby0+ZHJtOworCWludCBlcnI7CisKKwlpZiAoIWJvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKwlhcmdzLmhhbmRsZSA9IGJvLT5oYW5kbGU7CisJYXJncy5mbGFncyA9IGZsYWdzOworCisJZXJyID0gZHJtQ29tbWFuZFdyaXRlUmVhZChkcm0tPmZkLCBEUk1fVEVHUkFfR0VNX1NFVF9GTEFHUywgJmFyZ3MsCisJCQkJICBzaXplb2YoYXJncykpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gLWVycm5vOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkcm1fdGVncmFfYm9fZ2V0X3RpbGluZyhzdHJ1Y3QgZHJtX3RlZ3JhX2JvICpibywKKwkJCSAgICBzdHJ1Y3QgZHJtX3RlZ3JhX2JvX3RpbGluZyAqdGlsaW5nKQoreworCXN0cnVjdCBkcm1fdGVncmFfZ2VtX2dldF90aWxpbmcgYXJnczsKKwlzdHJ1Y3QgZHJtX3RlZ3JhICpkcm0gPSBiby0+ZHJtOworCWludCBlcnI7CisKKwlpZiAoIWJvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKwlhcmdzLmhhbmRsZSA9IGJvLT5oYW5kbGU7CisKKwllcnIgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGRybS0+ZmQsIERSTV9URUdSQV9HRU1fR0VUX1RJTElORywgJmFyZ3MsCisJCQkJICBzaXplb2YoYXJncykpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gLWVycm5vOworCisJaWYgKHRpbGluZykgeworCQl0aWxpbmctPm1vZGUgPSBhcmdzLm1vZGU7CisJCXRpbGluZy0+dmFsdWUgPSBhcmdzLnZhbHVlOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZHJtX3RlZ3JhX2JvX3NldF90aWxpbmcoc3RydWN0IGRybV90ZWdyYV9ibyAqYm8sCisJCQkgICAgY29uc3Qgc3RydWN0IGRybV90ZWdyYV9ib190aWxpbmcgKnRpbGluZykKK3sKKwlzdHJ1Y3QgZHJtX3RlZ3JhX2dlbV9zZXRfdGlsaW5nIGFyZ3M7CisJc3RydWN0IGRybV90ZWdyYSAqZHJtID0gYm8tPmRybTsKKwlpbnQgZXJyOworCisJaWYgKCFibykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisJYXJncy5oYW5kbGUgPSBiby0+aGFuZGxlOworCWFyZ3MubW9kZSA9IHRpbGluZy0+bW9kZTsKKwlhcmdzLnZhbHVlID0gdGlsaW5nLT52YWx1ZTsKKworCWVyciA9IGRybUNvbW1hbmRXcml0ZVJlYWQoZHJtLT5mZCwgRFJNX1RFR1JBX0dFTV9TRVRfVElMSU5HLCAmYXJncywKKwkJCQkgIHNpemVvZihhcmdzKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiAtZXJybm87CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3RlZ3JhL3RlZ3JhLmggYi90ZWdyYS90ZWdyYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYjA5OTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZWdyYS90ZWdyYS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMiwgMjAxMyBUaGllcnJ5IFJlZGluZworICogQ29weXJpZ2h0IMKpIDIwMTMgRXJpayBGYXllLUx1bmQKKyAqIENvcHlyaWdodCDCqSAyMDE0IE5WSURJQSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19EUk1fVEVHUkFfSF9fCisjZGVmaW5lIF9fRFJNX1RFR1JBX0hfXyAxCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RydWN0IGRybV90ZWdyYV9ibzsKK3N0cnVjdCBkcm1fdGVncmE7CisKK2ludCBkcm1fdGVncmFfbmV3KHN0cnVjdCBkcm1fdGVncmEgKipkcm1wLCBpbnQgZmQpOwordm9pZCBkcm1fdGVncmFfY2xvc2Uoc3RydWN0IGRybV90ZWdyYSAqZHJtKTsKKworaW50IGRybV90ZWdyYV9ib19uZXcoc3RydWN0IGRybV90ZWdyYV9ibyAqKmJvcCwgc3RydWN0IGRybV90ZWdyYSAqZHJtLAorCQkgICAgIHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCBzaXplKTsKK2ludCBkcm1fdGVncmFfYm9fd3JhcChzdHJ1Y3QgZHJtX3RlZ3JhX2JvICoqYm9wLCBzdHJ1Y3QgZHJtX3RlZ3JhICpkcm0sCisJCSAgICAgIHVpbnQzMl90IGhhbmRsZSwgdWludDMyX3QgZmxhZ3MsIHVpbnQzMl90IHNpemUpOworc3RydWN0IGRybV90ZWdyYV9ibyAqZHJtX3RlZ3JhX2JvX3JlZihzdHJ1Y3QgZHJtX3RlZ3JhX2JvICpibyk7Cit2b2lkIGRybV90ZWdyYV9ib191bnJlZihzdHJ1Y3QgZHJtX3RlZ3JhX2JvICpibyk7CitpbnQgZHJtX3RlZ3JhX2JvX2dldF9oYW5kbGUoc3RydWN0IGRybV90ZWdyYV9ibyAqYm8sIHVpbnQzMl90ICpoYW5kbGUpOworaW50IGRybV90ZWdyYV9ib19tYXAoc3RydWN0IGRybV90ZWdyYV9ibyAqYm8sIHZvaWQgKipwdHIpOworaW50IGRybV90ZWdyYV9ib191bm1hcChzdHJ1Y3QgZHJtX3RlZ3JhX2JvICpibyk7CisKK2ludCBkcm1fdGVncmFfYm9fZ2V0X2ZsYWdzKHN0cnVjdCBkcm1fdGVncmFfYm8gKmJvLCB1aW50MzJfdCAqZmxhZ3MpOworaW50IGRybV90ZWdyYV9ib19zZXRfZmxhZ3Moc3RydWN0IGRybV90ZWdyYV9ibyAqYm8sIHVpbnQzMl90IGZsYWdzKTsKKworc3RydWN0IGRybV90ZWdyYV9ib190aWxpbmcgeworCXVpbnQzMl90IG1vZGU7CisJdWludDMyX3QgdmFsdWU7Cit9OworCitpbnQgZHJtX3RlZ3JhX2JvX2dldF90aWxpbmcoc3RydWN0IGRybV90ZWdyYV9ibyAqYm8sCisJCQkgICAgc3RydWN0IGRybV90ZWdyYV9ib190aWxpbmcgKnRpbGluZyk7CitpbnQgZHJtX3RlZ3JhX2JvX3NldF90aWxpbmcoc3RydWN0IGRybV90ZWdyYV9ibyAqYm8sCisJCQkgICAgY29uc3Qgc3RydWN0IGRybV90ZWdyYV9ib190aWxpbmcgKnRpbGluZyk7CisKKyNlbmRpZiAvKiBfX0RSTV9URUdSQV9IX18gKi8KZGlmZiAtLWdpdCBhL3Rlc3RzL0FuZHJvaWQubWsgYi90ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNTNlN2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEgQEAKK2luY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUuYW0gYi90ZXN0cy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzU1YTkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NyBAQAorU1VCRElSUyA9IHV0aWwga21zIG1vZGVwcmludCBwcm9wdGVzdCBtb2RldGVzdCB2Ymx0ZXN0CisKK2lmIEhBVkVfTElCS01TCitTVUJESVJTICs9IGttc3Rlc3QKK2VuZGlmCisKK2lmIEhBVkVfUkFERU9OCitTVUJESVJTICs9IHJhZGVvbgorZW5kaWYKKworaWYgSEFWRV9BTURHUFUKK2lmIEhBVkVfQ1VOSVQKK1NVQkRJUlMgKz0gYW1kZ3B1CitlbmRpZgorZW5kaWYKKworaWYgSEFWRV9FWFlOT1MKK1NVQkRJUlMgKz0gZXh5bm9zCitlbmRpZgorCitpZiBIQVZFX1RFR1JBCitTVUJESVJTICs9IHRlZ3JhCitlbmRpZgorCitpZiBIQVZFX0VUTkFWSVYKK1NVQkRJUlMgKz0gZXRuYXZpdgorZW5kaWYKKworaWYgSEFWRV9OT1VWRUFVCitTVUJESVJTICs9IG5vdXZlYXUKK2VuZGlmCisKK0FNX0NGTEFHUyA9IFwKKwkkKFdBUk5fQ0ZMQUdTKVwKKwktSSAkKHRvcF9zcmNkaXIpL2luY2x1ZGUvZHJtIFwKKwktSSAkKHRvcF9zcmNkaXIpCisKK0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYmRybS5sYQorCitURVNUUyA9IFwKKwlkcm1zbCBcCisJaGFzaCBcCisJcmFuZG9tCisKK2NoZWNrX1BST0dSQU1TID0gXAorCSQoVEVTVFMpIFwKKwlkcm1kZXZpY2UKZGlmZiAtLWdpdCBhL3Rlc3RzL2FtZGdwdS9NYWtlZmlsZS5hbSBiL3Rlc3RzL2FtZGdwdS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzAwYzRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYW1kZ3B1L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzQgQEAKK0FNX0NGTEFHUyA9IFwKKwktSSAkKHRvcF9zcmNkaXIpL2luY2x1ZGUvZHJtIFwKKwktSSAkKHRvcF9zcmNkaXIpL2FtZGdwdSBcCisJLUkgJCh0b3Bfc3JjZGlyKSBcCisJLXB0aHJlYWQKKworTERBREQgPSAkKHRvcF9idWlsZGRpcikvbGliZHJtLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvYW1kZ3B1L2xpYmRybV9hbWRncHUubGEgXAorCSQoQ1VOSVRfTElCUykKKworaWYgSEFWRV9JTlNUQUxMX1RFU1RTCitiaW5fUFJPR1JBTVMgPSBcCisJYW1kZ3B1X3Rlc3QKK2Vsc2UKK25vaW5zdF9QUk9HUkFNUyA9IFwKKwlhbWRncHVfdGVzdAorZW5kaWYKKworYW1kZ3B1X3Rlc3RfQ1BQRkxBR1MgPSAkKENVTklUX0NGTEFHUykKKworYW1kZ3B1X3Rlc3RfU09VUkNFUyA9IFwKKwlhbWRncHVfdGVzdC5jIFwKKwlhbWRncHVfdGVzdC5oIFwKKwliYXNpY190ZXN0cy5jIFwKKwlib190ZXN0cy5jIFwKKwljc190ZXN0cy5jIFwKKwlkZWNvZGVfbWVzc2FnZXMuaCBcCisJdmNlX3Rlc3RzLmMgXAorCXZjZV9pYi5oIFwKKwlmcmFtZS5oIFwKKwl1dmRfZW5jX3Rlc3RzLmMgXAorCXZjbl90ZXN0cy5jIFwKKwl1dmVfaWIuaCBcCisJZGVhZGxvY2tfdGVzdHMuYwpkaWZmIC0tZ2l0IGEvdGVzdHMvYW1kZ3B1L2FtZGdwdV90ZXN0LmMgYi90ZXN0cy9hbWRncHUvYW1kZ3B1X3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTI1NTAzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYW1kZ3B1L2FtZGdwdV90ZXN0LmMKQEAgLTAsMCArMSw0NTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAieGY4NmRybU1vZGUuaCIKKyNpbmNsdWRlICJ4Zjg2ZHJtLmgiCisKKyNpbmNsdWRlICJDVW5pdC9CYXNpYy5oIgorCisjaW5jbHVkZSAiYW1kZ3B1X3Rlc3QuaCIKKworLyoqCisgKiAgT3BlbiBoYW5kbGVzIGZvciBhbWRncHUgZGV2aWNlcworICoKKyAqLworaW50IGRybV9hbWRncHVbTUFYX0NBUkRTX1NVUFBPUlRFRF07CisKKy8qKiBPcGVuIHJlbmRlciBub2RlIHRvIHRlc3QgKi8KK2ludCBvcGVuX3JlbmRlcl9ub2RlID0gMDsJLyogQnkgZGVmYXVsdCBydW4gbW9zdCB0ZXN0cyBvbiBwcmltYXJ5IG5vZGUgKi8KKworLyoqIFRoZSB0YWJsZSBvZiBhbGwga25vd24gdGVzdCBzdWl0ZXMgdG8gcnVuICovCitzdGF0aWMgQ1VfU3VpdGVJbmZvIHN1aXRlc1tdID0geworCXsKKwkJLnBOYW1lID0gIkJhc2ljIFRlc3RzIiwKKwkJLnBJbml0RnVuYyA9IHN1aXRlX2Jhc2ljX3Rlc3RzX2luaXQsCisJCS5wQ2xlYW51cEZ1bmMgPSBzdWl0ZV9iYXNpY190ZXN0c19jbGVhbiwKKwkJLnBUZXN0cyA9IGJhc2ljX3Rlc3RzLAorCX0sCisJeworCQkucE5hbWUgPSAiQk8gVGVzdHMiLAorCQkucEluaXRGdW5jID0gc3VpdGVfYm9fdGVzdHNfaW5pdCwKKwkJLnBDbGVhbnVwRnVuYyA9IHN1aXRlX2JvX3Rlc3RzX2NsZWFuLAorCQkucFRlc3RzID0gYm9fdGVzdHMsCisJfSwKKwl7CisJCS5wTmFtZSA9ICJDUyBUZXN0cyIsCisJCS5wSW5pdEZ1bmMgPSBzdWl0ZV9jc190ZXN0c19pbml0LAorCQkucENsZWFudXBGdW5jID0gc3VpdGVfY3NfdGVzdHNfY2xlYW4sCisJCS5wVGVzdHMgPSBjc190ZXN0cywKKwl9LAorCXsKKwkJLnBOYW1lID0gIlZDRSBUZXN0cyIsCisJCS5wSW5pdEZ1bmMgPSBzdWl0ZV92Y2VfdGVzdHNfaW5pdCwKKwkJLnBDbGVhbnVwRnVuYyA9IHN1aXRlX3ZjZV90ZXN0c19jbGVhbiwKKwkJLnBUZXN0cyA9IHZjZV90ZXN0cywKKwl9LAorCXsKKwkJLnBOYW1lID0gIlZDTiBUZXN0cyIsCisJCS5wSW5pdEZ1bmMgPSBzdWl0ZV92Y25fdGVzdHNfaW5pdCwKKwkJLnBDbGVhbnVwRnVuYyA9IHN1aXRlX3Zjbl90ZXN0c19jbGVhbiwKKwkJLnBUZXN0cyA9IHZjbl90ZXN0cywKKwl9LAorCXsKKwkJLnBOYW1lID0gIlVWRCBFTkMgVGVzdHMiLAorCQkucEluaXRGdW5jID0gc3VpdGVfdXZkX2VuY190ZXN0c19pbml0LAorCQkucENsZWFudXBGdW5jID0gc3VpdGVfdXZkX2VuY190ZXN0c19jbGVhbiwKKwkJLnBUZXN0cyA9IHV2ZF9lbmNfdGVzdHMsCisJfSwKKwl7CisJCS5wTmFtZSA9ICJEZWFkbG9jayBUZXN0cyIsCisJCS5wSW5pdEZ1bmMgPSBzdWl0ZV9kZWFkbG9ja190ZXN0c19pbml0LAorCQkucENsZWFudXBGdW5jID0gc3VpdGVfZGVhZGxvY2tfdGVzdHNfY2xlYW4sCisJCS5wVGVzdHMgPSBkZWFkbG9ja190ZXN0cywKKwl9LAorCUNVX1NVSVRFX0lORk9fTlVMTCwKK307CisKKworLyoqIERpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYWxsICBzdWl0ZXMgYW5kIHRoZWlyIHRlc3RzICovCitzdGF0aWMgdm9pZCBkaXNwbGF5X3Rlc3Rfc3VpdGVzKHZvaWQpCit7CisJaW50IGlTdWl0ZTsKKwlpbnQgaVRlc3Q7CisKKwlwcmludGYoIlN1aXRlc1xuIik7CisKKwlmb3IgKGlTdWl0ZSA9IDA7IHN1aXRlc1tpU3VpdGVdLnBOYW1lICE9IE5VTEw7IGlTdWl0ZSsrKSB7CisJCXByaW50ZigiU3VpdGUgaWQgPSAlZDogTmFtZSAnJXMnXG4iLAorCQkJCWlTdWl0ZSArIDEsIHN1aXRlc1tpU3VpdGVdLnBOYW1lKTsKKworCQlmb3IgKGlUZXN0ID0gMDsgc3VpdGVzW2lTdWl0ZV0ucFRlc3RzW2lUZXN0XS5wTmFtZSAhPSBOVUxMOworCQkJaVRlc3QrKykgeworCQkJcHJpbnRmKCIJVGVzdCBpZCAlZDogTmFtZTogJyVzJ1xuIiwgaVRlc3QgKyAxLAorCQkJCQlzdWl0ZXNbaVN1aXRlXS5wVGVzdHNbaVRlc3RdLnBOYW1lKTsKKwkJfQorCX0KK30KKworCisvKiogSGVscCBzdHJpbmcgZm9yIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgY29uc3QgY2hhciB1c2FnZVtdID0KKwkiVXNhZ2U6ICVzIFstaGxwcl0gWzwtcyA8c3VpdGUgaWQ+PiBbLXQgPHRlc3QgaWQ+XV0gIgorCSJbLWIgPHBjaV9idXNfaWQ+IFstZCA8cGNpX2RldmljZV9pZD5dXVxuIgorCSJ3aGVyZTpcbiIKKwkiICAgICAgIGwgLSBEaXNwbGF5IGFsbCBzdWl0ZXMgYW5kIHRoZWlyIHRlc3RzXG4iCisJIiAgICAgICByIC0gUnVuIHRoZSB0ZXN0cyBvbiByZW5kZXIgbm9kZVxuIgorCSIgICAgICAgYiAtIFNwZWNpZnkgZGV2aWNlJ3MgUENJIGJ1cyBpZCB0byBydW4gdGVzdHNcbiIKKwkiICAgICAgIGQgLSBTcGVjaWZ5IGRldmljZSdzIFBDSSBkZXZpY2UgaWQgdG8gcnVuIHRlc3RzIChvcHRpb25hbClcbiIKKwkiICAgICAgIHAgLSBEaXNwbGF5IGluZm9ybWF0aW9uIG9mIEFNREdQVSBkZXZpY2VzIGluIHN5c3RlbVxuIgorCSIgICAgICAgaCAtIERpc3BsYXkgdGhpcyBoZWxwXG4iOworLyoqIFNwZWNpZmllZCBvcHRpb25zIHN0cmluZ3MgZm9yIGdldG9wdCAqLworc3RhdGljIGNvbnN0IGNoYXIgb3B0aW9uc1tdICAgPSAiaGxycHM6dDpiOmQ6IjsKKworLyogT3BlbiBBTUQgZGV2aWNlcy4KKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIEFNRCBkZXZpY2Ugb3Blbm5lZC4KKyAqLworc3RhdGljIGludCBhbWRncHVfb3Blbl9kZXZpY2VzKGludCBvcGVuX3JlbmRlcl9ub2RlKQoreworCWRybURldmljZVB0ciBkZXZpY2VzW01BWF9DQVJEU19TVVBQT1JURURdOworCWludCByZXQ7CisJaW50IGk7CisJaW50IGRybV9ub2RlOworCWludCBhbWRfaW5kZXggPSAwOworCWludCBkcm1fY291bnQ7CisJaW50IGZkOworCWRybVZlcnNpb25QdHIgdmVyc2lvbjsKKworCWRybV9jb3VudCA9IGRybUdldERldmljZXMyKDAsIGRldmljZXMsIE1BWF9DQVJEU19TVVBQT1JURUQpOworCisJaWYgKGRybV9jb3VudCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiZHJtR2V0RGV2aWNlczIoKSByZXR1cm5lZCBhbiBlcnJvciAlZFxuIiwKKwkJCWRybV9jb3VudCk7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBkcm1fY291bnQ7IGkrKykgeworCQkvKiBJZiB0aGlzIGlzIG5vdCBQQ0kgZGV2aWNlLCBza2lwKi8KKwkJaWYgKGRldmljZXNbaV0tPmJ1c3R5cGUgIT0gRFJNX0JVU19QQ0kpCisJCQljb250aW51ZTsKKworCQkvKiBJZiB0aGlzIGlzIG5vdCBBTUQgR1BVIHZlbmRlciBJRCwgc2tpcCovCisJCWlmIChkZXZpY2VzW2ldLT5kZXZpY2VpbmZvLnBjaS0+dmVuZG9yX2lkICE9IDB4MTAwMikKKwkJCWNvbnRpbnVlOworCisJCWlmIChvcGVuX3JlbmRlcl9ub2RlKQorCQkJZHJtX25vZGUgPSBEUk1fTk9ERV9SRU5ERVI7CisJCWVsc2UKKwkJCWRybV9ub2RlID0gRFJNX05PREVfUFJJTUFSWTsKKworCQlmZCA9IC0xOworCQlpZiAoZGV2aWNlc1tpXS0+YXZhaWxhYmxlX25vZGVzICYgMSA8PCBkcm1fbm9kZSkKKwkJCWZkID0gb3BlbigKKwkJCQlkZXZpY2VzW2ldLT5ub2Rlc1tkcm1fbm9kZV0sCisJCQkJT19SRFdSIHwgT19DTE9FWEVDKTsKKworCQkvKiBUaGlzIG5vZGUgaXMgbm90IGF2YWlsYWJsZS4gKi8KKwkJaWYgKGZkIDwgMCkgY29udGludWU7CisKKwkJdmVyc2lvbiA9IGRybUdldFZlcnNpb24oZmQpOworCQlpZiAoIXZlcnNpb24pIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJXYXJuaW5nOiBDYW5ub3QgZ2V0IHZlcnNpb24gZm9yICVzLiIKKwkJCQkiRXJyb3IgaXMgJXNcbiIsCisJCQkJZGV2aWNlc1tpXS0+bm9kZXNbZHJtX25vZGVdLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCQljbG9zZShmZCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzdHJjbXAodmVyc2lvbi0+bmFtZSwgImFtZGdwdSIpKSB7CisJCQkvKiBUaGlzIGlzIG5vdCBBTURHUFUgZHJpdmVyLCBza2lwLiovCisJCQlkcm1GcmVlVmVyc2lvbih2ZXJzaW9uKTsKKwkJCWNsb3NlKGZkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZHJtRnJlZVZlcnNpb24odmVyc2lvbik7CisKKwkJZHJtX2FtZGdwdVthbWRfaW5kZXhdID0gZmQ7CisJCWFtZF9pbmRleCsrOworCX0KKworCWRybUZyZWVEZXZpY2VzKGRldmljZXMsIGRybV9jb3VudCk7CisJcmV0dXJuIGFtZF9pbmRleDsKK30KKworLyogQ2xvc2UgQU1EIGRldmljZXMuCisgKi8KK3N0YXRpYyB2b2lkIGFtZGdwdV9jbG9zZV9kZXZpY2VzKCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NBUkRTX1NVUFBPUlRFRDsgaSsrKQorCQlpZiAoZHJtX2FtZGdwdVtpXSA+PTApCisJCQljbG9zZShkcm1fYW1kZ3B1W2ldKTsKK30KKworLyogUHJpbnQgQU1EIGRldmljZXMgaW5mb3JtYXRpb24gKi8KK3N0YXRpYyB2b2lkIGFtZGdwdV9wcmludF9kZXZpY2VzKCkKK3sKKwlpbnQgaTsKKwlkcm1EZXZpY2VQdHIgZGV2aWNlOworCisJLyogT3BlbiB0aGUgZmlyc3QgQU1EIGRldmNpZSB0byBwcmludCBkcml2ZXIgaW5mb3JtYXRpb24uICovCisJaWYgKGRybV9hbWRncHVbMF0gPj0wKSB7CisJCS8qIERpc3BsYXkgQU1EIGRyaXZlciB2ZXJzaW9uIGluZm9ybWF0aW9uLiovCisJCWRybVZlcnNpb25QdHIgcmV0dmFsID0gZHJtR2V0VmVyc2lvbihkcm1fYW1kZ3B1WzBdKTsKKworCQlpZiAocmV0dmFsID09IE5VTEwpIHsKKwkJCXBlcnJvcigiQ2Fubm90IGdldCB2ZXJzaW9uIGZvciBBTURHUFUgZGV2aWNlIik7CisJCQlyZXR1cm47CisJCX0KKworCQlwcmludGYoIkRyaXZlciBuYW1lOiAlcywgRGF0ZTogJXMsIERlc2NyaXB0aW9uOiAlcy5cbiIsCisJCQlyZXR2YWwtPm5hbWUsIHJldHZhbC0+ZGF0ZSwgcmV0dmFsLT5kZXNjKTsKKwkJZHJtRnJlZVZlcnNpb24ocmV0dmFsKTsKKwl9CisKKwkvKiBEaXNwbGF5IGluZm9ybWF0aW9uIG9mIEFNRCBkZXZpY2VzICovCisJcHJpbnRmKCJEZXZpY2VzOlxuIik7CisJZm9yIChpID0gMDsgaSA8IE1BWF9DQVJEU19TVVBQT1JURUQgJiYgZHJtX2FtZGdwdVtpXSA+PTA7IGkrKykKKwkJaWYgKGRybUdldERldmljZTIoZHJtX2FtZGdwdVtpXSwKKwkJCURSTV9ERVZJQ0VfR0VUX1BDSV9SRVZJU0lPTiwKKwkJCSZkZXZpY2UpID09IDApIHsKKwkJCWlmIChkZXZpY2UtPmJ1c3R5cGUgPT0gRFJNX0JVU19QQ0kpIHsKKwkJCQlwcmludGYoIlBDSSAiKTsKKwkJCQlwcmludGYoIiBkb21haW46JTA0eCIsCisJCQkJCWRldmljZS0+YnVzaW5mby5wY2ktPmRvbWFpbik7CisJCQkJcHJpbnRmKCIgYnVzOiUwMngiLAorCQkJCQlkZXZpY2UtPmJ1c2luZm8ucGNpLT5idXMpOworCQkJCXByaW50ZigiIGRldmljZTolMDJ4IiwKKwkJCQkJZGV2aWNlLT5idXNpbmZvLnBjaS0+ZGV2KTsKKwkJCQlwcmludGYoIiBmdW5jdGlvbjolMDF4IiwKKwkJCQkJZGV2aWNlLT5idXNpbmZvLnBjaS0+ZnVuYyk7CisJCQkJcHJpbnRmKCIgdmVuZG9yX2lkOiUwNHgiLAorCQkJCQlkZXZpY2UtPmRldmljZWluZm8ucGNpLT52ZW5kb3JfaWQpOworCQkJCXByaW50ZigiIGRldmljZV9pZDolMDR4IiwKKwkJCQkJZGV2aWNlLT5kZXZpY2VpbmZvLnBjaS0+ZGV2aWNlX2lkKTsKKwkJCQlwcmludGYoIiBzdWJ2ZW5kb3JfaWQ6JTA0eCIsCisJCQkJCWRldmljZS0+ZGV2aWNlaW5mby5wY2ktPnN1YnZlbmRvcl9pZCk7CisJCQkJcHJpbnRmKCIgc3ViZGV2aWNlX2lkOiUwNHgiLAorCQkJCQlkZXZpY2UtPmRldmljZWluZm8ucGNpLT5zdWJkZXZpY2VfaWQpOworCQkJCXByaW50ZigiIHJldmlzaW9uX2lkOiUwMngiLAorCQkJCQlkZXZpY2UtPmRldmljZWluZm8ucGNpLT5yZXZpc2lvbl9pZCk7CisJCQkJcHJpbnRmKCJcbiIpOworCQkJfQorCQkJZHJtRnJlZURldmljZSgmZGV2aWNlKTsKKwkJfQorfQorCisvKiBGaW5kIGEgbWF0Y2ggQU1EIGRldmljZSBpbiBQQ0kgYnVzCisgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBkZXZpY2Ugb3IgLTEgaWYgbm90IGZvdW5kCisgKi8KK3N0YXRpYyBpbnQgYW1kZ3B1X2ZpbmRfZGV2aWNlKHVpbnQ4X3QgYnVzLCB1aW50MTZfdCBkZXYpCit7CisJaW50IGk7CisJZHJtRGV2aWNlUHRyIGRldmljZTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0FSRFNfU1VQUE9SVEVEICYmIGRybV9hbWRncHVbaV0gPj0gMDsgaSsrKSB7CisJCWlmIChkcm1HZXREZXZpY2UyKGRybV9hbWRncHVbaV0sCisJCQlEUk1fREVWSUNFX0dFVF9QQ0lfUkVWSVNJT04sCisJCQkmZGV2aWNlKSA9PSAwKSB7CisJCQlpZiAoZGV2aWNlLT5idXN0eXBlID09IERSTV9CVVNfUENJKQorCQkJCWlmICgoYnVzID09IDB4RkYgfHwgZGV2aWNlLT5idXNpbmZvLnBjaS0+YnVzID09IGJ1cykgJiYKKwkJCQkJZGV2aWNlLT5kZXZpY2VpbmZvLnBjaS0+ZGV2aWNlX2lkID09IGRldikgeworCQkJCQlkcm1GcmVlRGV2aWNlKCZkZXZpY2UpOworCQkJCQlyZXR1cm4gaTsKKwkJCQl9CisKKwkJCWRybUZyZWVEZXZpY2UoJmRldmljZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qIFRoZSBtYWluKCkgZnVuY3Rpb24gZm9yIHNldHRpbmcgdXAgYW5kIHJ1bm5pbmcgdGhlIHRlc3RzLgorICogUmV0dXJucyBhIENVRV9TVUNDRVNTIG9uIHN1Y2Nlc3NmdWwgcnVubmluZywgYW5vdGhlcgorICogQ1VuaXQgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGM7CQkJLyogQ2hhcmFjdGVyIHJlY2VpdmVkIGZyb20gZ2V0b3B0ICovCisJaW50IGkgPSAwOworCWludCBzdWl0ZV9pZCA9IC0xOwkvKiBCeSBkZWZhdWx0IHJ1biBldmVyeXRoaW5nICovCisJaW50IHRlc3RfaWQgID0gLTE7CS8qIEJ5IGRlZmF1bHQgcnVuIGFsbCB0ZXN0cyBpbiB0aGUgc3VpdGUgKi8KKwlpbnQgcGNpX2J1c19pZCA9IC0xOyAgICAvKiBCeSBkZWZhdWx0IFBDIGJ1cyBJRCBpcyBub3Qgc3BlY2lmaWVkICovCisJaW50IHBjaV9kZXZpY2VfaWQgPSAwOyAgLyogQnkgZGVmYXVsdCBQQyBkZXZpY2UgSUQgaXMgemVybyAqLworCWludCBkaXNwbGF5X2RldmljZXMgPSAwOy8qIEJ5IGRlZmF1bHQgbm90IHRvIGRpc3BsYXkgZGV2aWNlcycgaW5mbyAqLworCUNVX3BTdWl0ZSBwU3VpdGUgPSBOVUxMOworCUNVX3BUZXN0ICBwVGVzdCAgPSBOVUxMOworCWludCB0ZXN0X2RldmljZV9pbmRleDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0FSRFNfU1VQUE9SVEVEOyBpKyspCisJCWRybV9hbWRncHVbaV0gPSAtMTsKKworCisJLyogUGFyc2UgY29tbWFuZCBsaW5lIHN0cmluZyAqLworCW9wdGVyciA9IDA7CQkvKiBEbyBub3QgcHJpbnQgZXJyb3IgbWVzc2FnZXMgZnJvbSBnZXRvcHQgKi8KKwl3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgb3B0aW9ucykpICE9IC0xKSB7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdsJzoKKwkJCWRpc3BsYXlfdGVzdF9zdWl0ZXMoKTsKKwkJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKwkJY2FzZSAncyc6CisJCQlzdWl0ZV9pZCA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCXRlc3RfaWQgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnYic6CisJCQlwY2lfYnVzX2lkID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJc3NjYW5mKG9wdGFyZywgIiV4IiwgJnBjaV9kZXZpY2VfaWQpOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJZGlzcGxheV9kZXZpY2VzID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCW9wZW5fcmVuZGVyX25vZGUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQljYXNlICdoJzoKKwkJCWZwcmludGYoc3RkZXJyLCB1c2FnZSwgYXJndlswXSk7CisJCQlleGl0KEVYSVRfU1VDQ0VTUyk7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKHN0ZGVyciwgdXNhZ2UsIGFyZ3ZbMF0pOworCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQl9CisJfQorCisJaWYgKGFtZGdwdV9vcGVuX2RldmljZXMob3Blbl9yZW5kZXJfbm9kZSkgPD0gMCkgeworCQlwZXJyb3IoIkNhbm5vdCBvcGVuIEFNREdQVSBkZXZpY2UiKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKworCWlmIChkcm1fYW1kZ3B1WzBdIDwgMCkgeworCQlwZXJyb3IoIkNhbm5vdCBvcGVuIEFNREdQVSBkZXZpY2UiKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKworCWlmIChkaXNwbGF5X2RldmljZXMpIHsKKwkJYW1kZ3B1X3ByaW50X2RldmljZXMoKTsKKwkJYW1kZ3B1X2Nsb3NlX2RldmljZXMoKTsKKwkJZXhpdChFWElUX1NVQ0NFU1MpOworCX0KKworCWlmIChwY2lfYnVzX2lkID4gMCB8fCBwY2lfZGV2aWNlX2lkKSB7CisJCS8qIEEgZGV2aWNlIHdhcyBzcGVjaWZpZWQgdG8gcnVuIHRoZSB0ZXN0ICovCisJCXRlc3RfZGV2aWNlX2luZGV4ID0gYW1kZ3B1X2ZpbmRfZGV2aWNlKHBjaV9idXNfaWQsCisJCQkJCQkgICAgICAgcGNpX2RldmljZV9pZCk7CisKKwkJaWYgKHRlc3RfZGV2aWNlX2luZGV4ID49IDApIHsKKwkJCS8qIE1vc3QgdGVzdHMgcnVuIG9uIGRldmljZSBvZiBkcm1fYW1kZ3B1WzBdLgorCQkJICogU3dhcCB0aGUgY2hvc2VuIGRldmljZSB0byBkcm1fYW1kZ3B1WzBdLgorCQkJICovCisJCQlpID0gZHJtX2FtZGdwdVswXTsKKwkJCWRybV9hbWRncHVbMF0gPSBkcm1fYW1kZ3B1W3Rlc3RfZGV2aWNlX2luZGV4XTsKKwkJCWRybV9hbWRncHVbdGVzdF9kZXZpY2VfaW5kZXhdID0gaTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJUaGUgc3BlY2lmaWVkIEdQVSBkZXZpY2UgZG9lcyBub3QgZXhpc3QuXG4iKTsKKwkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJfQorCX0KKworCS8qIEluaXRpYWxpemUgdGVzdCBzdWl0ZXMgdG8gcnVuICovCisKKwkvKiBpbml0aWFsaXplIHRoZSBDVW5pdCB0ZXN0IHJlZ2lzdHJ5ICovCisJaWYgKENVRV9TVUNDRVNTICE9IENVX2luaXRpYWxpemVfcmVnaXN0cnkoKSkgeworCQlhbWRncHVfY2xvc2VfZGV2aWNlcygpOworCQlyZXR1cm4gQ1VfZ2V0X2Vycm9yKCk7CisJfQorCisJLyogUmVnaXN0ZXIgc3VpdGVzLiAqLworCWlmIChDVV9yZWdpc3Rlcl9zdWl0ZXMoc3VpdGVzKSAhPSBDVUVfU1VDQ0VTUykgeworCQlmcHJpbnRmKHN0ZGVyciwgInN1aXRlIHJlZ2lzdHJhdGlvbiBmYWlsZWQgLSAlc1xuIiwKKwkJCQlDVV9nZXRfZXJyb3JfbXNnKCkpOworCQlDVV9jbGVhbnVwX3JlZ2lzdHJ5KCk7CisJCWFtZGdwdV9jbG9zZV9kZXZpY2VzKCk7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwkvKiBSdW4gdGVzdHMgdXNpbmcgdGhlIENVbml0IEJhc2ljIGludGVyZmFjZSAqLworCUNVX2Jhc2ljX3NldF9tb2RlKENVX0JSTV9WRVJCT1NFKTsKKworCWlmIChzdWl0ZV9pZCAhPSAtMSkgewkvKiBJZiB1c2VyIHNwZWNpZnkgcGFydGljdWxhciBzdWl0ZT8gKi8KKwkJcFN1aXRlID0gQ1VfZ2V0X3N1aXRlX2J5X2luZGV4KCh1bnNpZ25lZCBpbnQpIHN1aXRlX2lkLAorCQkJCQkJQ1VfZ2V0X3JlZ2lzdHJ5KCkpOworCisJCWlmIChwU3VpdGUpIHsKKwkJCWlmICh0ZXN0X2lkICE9IC0xKSB7ICAgLyogSWYgdXNlciBzcGVjaWZ5IHRlc3QgaWQgKi8KKwkJCQlwVGVzdCA9IENVX2dldF90ZXN0X2J5X2luZGV4KAorCQkJCQkJKHVuc2lnbmVkIGludCkgdGVzdF9pZCwKKwkJCQkJCXBTdWl0ZSk7CisJCQkJaWYgKHBUZXN0KQorCQkJCQlDVV9iYXNpY19ydW5fdGVzdChwU3VpdGUsIHBUZXN0KTsKKwkJCQllbHNlIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHRlc3QgaWQ6ICVkXG4iLAorCQkJCQkJCQl0ZXN0X2lkKTsKKwkJCQkJQ1VfY2xlYW51cF9yZWdpc3RyeSgpOworCQkJCQlhbWRncHVfY2xvc2VfZGV2aWNlcygpOworCQkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJQ1VfYmFzaWNfcnVuX3N1aXRlKHBTdWl0ZSk7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgc3VpdGUgaWQgOiAlZFxuIiwKKwkJCQkJc3VpdGVfaWQpOworCQkJQ1VfY2xlYW51cF9yZWdpc3RyeSgpOworCQkJYW1kZ3B1X2Nsb3NlX2RldmljZXMoKTsKKwkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJfQorCX0gZWxzZQorCQlDVV9iYXNpY19ydW5fdGVzdHMoKTsKKworCUNVX2NsZWFudXBfcmVnaXN0cnkoKTsKKwlhbWRncHVfY2xvc2VfZGV2aWNlcygpOworCXJldHVybiBDVV9nZXRfZXJyb3IoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FtZGdwdS9hbWRncHVfdGVzdC5oIGIvdGVzdHMvYW1kZ3B1L2FtZGdwdV90ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlOTNmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FtZGdwdS9hbWRncHVfdGVzdC5oCkBAIC0wLDAgKzEsMjg0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyovCisKKyNpZm5kZWYgX0FNREdQVV9URVNUX0hfCisjZGVmaW5lIF9BTURHUFVfVEVTVF9IXworCisjaW5jbHVkZSAiYW1kZ3B1LmgiCisjaW5jbHVkZSAiYW1kZ3B1X2RybS5oIgorCisvKioKKyAqIERlZmluZSBtYXguIG51bWJlciBvZiBjYXJkIGluIHN5c3RlbSB3aGljaCB3ZSBhcmUgYWJsZSB0byBoYW5kbGUKKyAqLworI2RlZmluZSBNQVhfQ0FSRFNfU1VQUE9SVEVEICAgICA0CisKKy8qIEZvcndhcmQgcmVmZXJlbmNlIGZvciBhcnJheSB0byBrZWVwICJkcm0iIGhhbmRsZXMgKi8KK2V4dGVybiBpbnQgZHJtX2FtZGdwdVtNQVhfQ0FSRFNfU1VQUE9SVEVEXTsKKworLyogR2xvYmFsIHZhcmlhYmxlcyAqLworZXh0ZXJuIGludCBvcGVuX3JlbmRlcl9ub2RlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiAgQmFzaWMgdGVzdCBzdWl0ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIERlZmluZSBiYXNpYyB0ZXN0IHN1aXRlIHRvIHNlcnZlIGFzIHRoZSBzdGFydGluZyBwb2ludCBmb3IgZnV0dXJlIHRlc3RpbmcKKyovCisKKy8qKgorICogSW5pdGlhbGl6ZSBiYXNpYyB0ZXN0IHN1aXRlCisgKi8KK2ludCBzdWl0ZV9iYXNpY190ZXN0c19pbml0KCk7CisKKy8qKgorICogRGVpbml0aWFsaXplIGJhc2ljIHRlc3Qgc3VpdGUKKyAqLworaW50IHN1aXRlX2Jhc2ljX3Rlc3RzX2NsZWFuKCk7CisKKy8qKgorICogVGVzdHMgaW4gYmFzaWMgdGVzdCBzdWl0ZQorICovCitleHRlcm4gQ1VfVGVzdEluZm8gYmFzaWNfdGVzdHNbXTsKKworLyoqCisgKiBJbml0aWFsaXplIGJvIHRlc3Qgc3VpdGUKKyAqLworaW50IHN1aXRlX2JvX3Rlc3RzX2luaXQoKTsKKworLyoqCisgKiBEZWluaXRpYWxpemUgYm8gdGVzdCBzdWl0ZQorICovCitpbnQgc3VpdGVfYm9fdGVzdHNfY2xlYW4oKTsKKworLyoqCisgKiBUZXN0cyBpbiBibyB0ZXN0IHN1aXRlCisgKi8KK2V4dGVybiBDVV9UZXN0SW5mbyBib190ZXN0c1tdOworCisvKioKKyAqIEluaXRpYWxpemUgY3MgdGVzdCBzdWl0ZQorICovCitpbnQgc3VpdGVfY3NfdGVzdHNfaW5pdCgpOworCisvKioKKyAqIERlaW5pdGlhbGl6ZSBjcyB0ZXN0IHN1aXRlCisgKi8KK2ludCBzdWl0ZV9jc190ZXN0c19jbGVhbigpOworCisvKioKKyAqIFRlc3RzIGluIGNzIHRlc3Qgc3VpdGUKKyAqLworZXh0ZXJuIENVX1Rlc3RJbmZvIGNzX3Rlc3RzW107CisKKy8qKgorICogSW5pdGlhbGl6ZSB2Y2UgdGVzdCBzdWl0ZQorICovCitpbnQgc3VpdGVfdmNlX3Rlc3RzX2luaXQoKTsKKworLyoqCisgKiBEZWluaXRpYWxpemUgdmNlIHRlc3Qgc3VpdGUKKyAqLworaW50IHN1aXRlX3ZjZV90ZXN0c19jbGVhbigpOworCisvKioKKyAqIFRlc3RzIGluIHZjZSB0ZXN0IHN1aXRlCisgKi8KK2V4dGVybiBDVV9UZXN0SW5mbyB2Y2VfdGVzdHNbXTsKKworLyoqCisrICogSW5pdGlhbGl6ZSB2Y24gdGVzdCBzdWl0ZQorKyAqLworaW50IHN1aXRlX3Zjbl90ZXN0c19pbml0KCk7CisKKy8qKgorKyAqIERlaW5pdGlhbGl6ZSB2Y24gdGVzdCBzdWl0ZQorKyAqLworaW50IHN1aXRlX3Zjbl90ZXN0c19jbGVhbigpOworCisvKioKKysgKiBUZXN0cyBpbiB2Y24gdGVzdCBzdWl0ZQorKyAqLworZXh0ZXJuIENVX1Rlc3RJbmZvIHZjbl90ZXN0c1tdOworCisvKioKKyAqIEluaXRpYWxpemUgdXZkIGVuYyB0ZXN0IHN1aXRlCisgKi8KK2ludCBzdWl0ZV91dmRfZW5jX3Rlc3RzX2luaXQoKTsKKworLyoqCisgKiBEZWluaXRpYWxpemUgdXZkIGVuYyB0ZXN0IHN1aXRlCisgKi8KK2ludCBzdWl0ZV91dmRfZW5jX3Rlc3RzX2NsZWFuKCk7CisKKy8qKgorICogVGVzdHMgaW4gdXZkIGVuYyB0ZXN0IHN1aXRlCisgKi8KK2V4dGVybiBDVV9UZXN0SW5mbyB1dmRfZW5jX3Rlc3RzW107CisKKy8qKgorICogSW5pdGlhbGl6ZSBkZWFkbG9jayB0ZXN0IHN1aXRlCisgKi8KK2ludCBzdWl0ZV9kZWFkbG9ja190ZXN0c19pbml0KCk7CisKKy8qKgorICogRGVpbml0aWFsaXplIGRlYWRsb2NrIHRlc3Qgc3VpdGUKKyAqLworaW50IHN1aXRlX2RlYWRsb2NrX3Rlc3RzX2NsZWFuKCk7CisKKy8qKgorICogVGVzdHMgaW4gdXZkIGVuYyB0ZXN0IHN1aXRlCisgKi8KK2V4dGVybiBDVV9UZXN0SW5mbyBkZWFkbG9ja190ZXN0c1tdOworCisvKioKKyAqIEhlbHBlciBmdW5jdGlvbnMKKyAqLworc3RhdGljIGlubGluZSBhbWRncHVfYm9faGFuZGxlIGdwdV9tZW1fYWxsb2MoCisJCQkJCWFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldmljZV9oYW5kbGUsCisJCQkJCXVpbnQ2NF90IHNpemUsCisJCQkJCXVpbnQ2NF90IGFsaWdubWVudCwKKwkJCQkJdWludDMyX3QgdHlwZSwKKwkJCQkJdWludDY0X3QgZmxhZ3MsCisJCQkJCXVpbnQ2NF90ICp2bWNfYWRkciwKKwkJCQkJYW1kZ3B1X3ZhX2hhbmRsZSAqdmFfaGFuZGxlKQoreworCXN0cnVjdCBhbWRncHVfYm9fYWxsb2NfcmVxdWVzdCByZXEgPSB7MH07CisJYW1kZ3B1X2JvX2hhbmRsZSBidWZfaGFuZGxlOworCWludCByOworCisJQ1VfQVNTRVJUX05PVF9FUVVBTCh2bWNfYWRkciwgTlVMTCk7CisKKwlyZXEuYWxsb2Nfc2l6ZSA9IHNpemU7CisJcmVxLnBoeXNfYWxpZ25tZW50ID0gYWxpZ25tZW50OworCXJlcS5wcmVmZXJyZWRfaGVhcCA9IHR5cGU7CisJcmVxLmZsYWdzID0gZmxhZ3M7CisKKwlyID0gYW1kZ3B1X2JvX2FsbG9jKGRldmljZV9oYW5kbGUsICZyZXEsICZidWZfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X3ZhX3JhbmdlX2FsbG9jKGRldmljZV9oYW5kbGUsCisJCQkJICBhbWRncHVfZ3B1X3ZhX3JhbmdlX2dlbmVyYWwsCisJCQkJICBzaXplLCBhbGlnbm1lbnQsIDAsIHZtY19hZGRyLAorCQkJCSAgdmFfaGFuZGxlLCAwKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X2JvX3ZhX29wKGJ1Zl9oYW5kbGUsIDAsIHNpemUsICp2bWNfYWRkciwgMCwgQU1ER1BVX1ZBX09QX01BUCk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJcmV0dXJuIGJ1Zl9oYW5kbGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdwdV9tZW1fZnJlZShhbWRncHVfYm9faGFuZGxlIGJvLAorCQkJICAgICAgIGFtZGdwdV92YV9oYW5kbGUgdmFfaGFuZGxlLAorCQkJICAgICAgIHVpbnQ2NF90IHZtY19hZGRyLAorCQkJICAgICAgIHVpbnQ2NF90IHNpemUpCit7CisJaW50IHI7CisKKwlyID0gYW1kZ3B1X2JvX3ZhX29wKGJvLCAwLCBzaXplLCB2bWNfYWRkciwgMCwgQU1ER1BVX1ZBX09QX1VOTUFQKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X3ZhX3JhbmdlX2ZyZWUodmFfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X2JvX2ZyZWUoYm8pOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorYW1kZ3B1X2JvX2FsbG9jX2FuZF9tYXAoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LCB1bnNpZ25lZCBzaXplLAorCQkJdW5zaWduZWQgYWxpZ25tZW50LCB1bnNpZ25lZCBoZWFwLCB1aW50NjRfdCBmbGFncywKKwkJCWFtZGdwdV9ib19oYW5kbGUgKmJvLCB2b2lkICoqY3B1LCB1aW50NjRfdCAqbWNfYWRkcmVzcywKKwkJCWFtZGdwdV92YV9oYW5kbGUgKnZhX2hhbmRsZSkKK3sKKwlzdHJ1Y3QgYW1kZ3B1X2JvX2FsbG9jX3JlcXVlc3QgcmVxdWVzdCA9IHt9OworCWFtZGdwdV9ib19oYW5kbGUgYnVmX2hhbmRsZTsKKwlhbWRncHVfdmFfaGFuZGxlIGhhbmRsZTsKKwl1aW50NjRfdCB2bWNfYWRkcjsKKwlpbnQgcjsKKworCXJlcXVlc3QuYWxsb2Nfc2l6ZSA9IHNpemU7CisJcmVxdWVzdC5waHlzX2FsaWdubWVudCA9IGFsaWdubWVudDsKKwlyZXF1ZXN0LnByZWZlcnJlZF9oZWFwID0gaGVhcDsKKwlyZXF1ZXN0LmZsYWdzID0gZmxhZ3M7CisKKwlyID0gYW1kZ3B1X2JvX2FsbG9jKGRldiwgJnJlcXVlc3QsICZidWZfaGFuZGxlKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gYW1kZ3B1X3ZhX3JhbmdlX2FsbG9jKGRldiwKKwkJCQkgIGFtZGdwdV9ncHVfdmFfcmFuZ2VfZ2VuZXJhbCwKKwkJCQkgIHNpemUsIGFsaWdubWVudCwgMCwgJnZtY19hZGRyLAorCQkJCSAgJmhhbmRsZSwgMCk7CisJaWYgKHIpCisJCWdvdG8gZXJyb3JfdmFfYWxsb2M7CisKKwlyID0gYW1kZ3B1X2JvX3ZhX29wKGJ1Zl9oYW5kbGUsIDAsIHNpemUsIHZtY19hZGRyLCAwLCBBTURHUFVfVkFfT1BfTUFQKTsKKwlpZiAocikKKwkJZ290byBlcnJvcl92YV9tYXA7CisKKwlyID0gYW1kZ3B1X2JvX2NwdV9tYXAoYnVmX2hhbmRsZSwgY3B1KTsKKwlpZiAocikKKwkJZ290byBlcnJvcl9jcHVfbWFwOworCisJKmJvID0gYnVmX2hhbmRsZTsKKwkqbWNfYWRkcmVzcyA9IHZtY19hZGRyOworCSp2YV9oYW5kbGUgPSBoYW5kbGU7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfY3B1X21hcDoKKwlhbWRncHVfYm9fY3B1X3VubWFwKGJ1Zl9oYW5kbGUpOworCitlcnJvcl92YV9tYXA6CisJYW1kZ3B1X2JvX3ZhX29wKGJ1Zl9oYW5kbGUsIDAsIHNpemUsIHZtY19hZGRyLCAwLCBBTURHUFVfVkFfT1BfVU5NQVApOworCitlcnJvcl92YV9hbGxvYzoKKwlhbWRncHVfYm9fZnJlZShidWZfaGFuZGxlKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2FtZGdwdV9ib191bm1hcF9hbmRfZnJlZShhbWRncHVfYm9faGFuZGxlIGJvLCBhbWRncHVfdmFfaGFuZGxlIHZhX2hhbmRsZSwKKwkJCSB1aW50NjRfdCBtY19hZGRyLCB1aW50NjRfdCBzaXplKQoreworCWFtZGdwdV9ib19jcHVfdW5tYXAoYm8pOworCWFtZGdwdV9ib192YV9vcChibywgMCwgc2l6ZSwgbWNfYWRkciwgMCwgQU1ER1BVX1ZBX09QX1VOTUFQKTsKKwlhbWRncHVfdmFfcmFuZ2VfZnJlZSh2YV9oYW5kbGUpOworCWFtZGdwdV9ib19mcmVlKGJvKTsKKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbmxpbmUgaW50CithbWRncHVfZ2V0X2JvX2xpc3QoYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2LCBhbWRncHVfYm9faGFuZGxlIGJvMSwKKwkJICAgYW1kZ3B1X2JvX2hhbmRsZSBibzIsIGFtZGdwdV9ib19saXN0X2hhbmRsZSAqbGlzdCkKK3sKKwlhbWRncHVfYm9faGFuZGxlIHJlc291cmNlc1tdID0ge2JvMSwgYm8yfTsKKworCXJldHVybiBhbWRncHVfYm9fbGlzdF9jcmVhdGUoZGV2LCBibzIgPyAyIDogMSwgcmVzb3VyY2VzLCBOVUxMLCBsaXN0KTsKK30KKworI2VuZGlmICAvKiAjaWZkZWYgX0FNREdQVV9URVNUX0hfICovCmRpZmYgLS1naXQgYS90ZXN0cy9hbWRncHUvYmFzaWNfdGVzdHMuYyBiL3Rlc3RzL2FtZGdwdS9iYXNpY190ZXN0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YmNmOTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hbWRncHUvYmFzaWNfdGVzdHMuYwpAQCAtMCwwICsxLDE0MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZmRlZiBIQVZFX0FMTE9DQV9ICisjIGluY2x1ZGUgPGFsbG9jYS5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworI2luY2x1ZGUgIkNVbml0L0Jhc2ljLmgiCisKKyNpbmNsdWRlICJhbWRncHVfdGVzdC5oIgorI2luY2x1ZGUgImFtZGdwdV9kcm0uaCIKKworc3RhdGljICBhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXZpY2VfaGFuZGxlOworc3RhdGljICB1aW50MzJfdCAgbWFqb3JfdmVyc2lvbjsKK3N0YXRpYyAgdWludDMyX3QgIG1pbm9yX3ZlcnNpb247CitzdGF0aWMgIHVpbnQzMl90ICBmYW1pbHlfaWQ7CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9xdWVyeV9pbmZvX3Rlc3Qodm9pZCk7CitzdGF0aWMgdm9pZCBhbWRncHVfbWVtb3J5X2FsbG9jKHZvaWQpOworc3RhdGljIHZvaWQgYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9nZngodm9pZCk7CitzdGF0aWMgdm9pZCBhbWRncHVfY29tbWFuZF9zdWJtaXNzaW9uX2NvbXB1dGUodm9pZCk7CitzdGF0aWMgdm9pZCBhbWRncHVfY29tbWFuZF9zdWJtaXNzaW9uX211bHRpX2ZlbmNlKHZvaWQpOworc3RhdGljIHZvaWQgYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9zZG1hKHZvaWQpOworc3RhdGljIHZvaWQgYW1kZ3B1X3VzZXJwdHJfdGVzdCh2b2lkKTsKK3N0YXRpYyB2b2lkIGFtZGdwdV9zZW1hcGhvcmVfdGVzdCh2b2lkKTsKKworc3RhdGljIHZvaWQgYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl93cml0ZV9saW5lYXJfaGVscGVyKHVuc2lnbmVkIGlwX3R5cGUpOworc3RhdGljIHZvaWQgYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9jb25zdF9maWxsX2hlbHBlcih1bnNpZ25lZCBpcF90eXBlKTsKK3N0YXRpYyB2b2lkIGFtZGdwdV9jb21tYW5kX3N1Ym1pc3Npb25fY29weV9saW5lYXJfaGVscGVyKHVuc2lnbmVkIGlwX3R5cGUpOworCitDVV9UZXN0SW5mbyBiYXNpY190ZXN0c1tdID0geworCXsgIlF1ZXJ5IEluZm8gVGVzdCIsICBhbWRncHVfcXVlcnlfaW5mb190ZXN0IH0sCisJeyAiTWVtb3J5IGFsbG9jIFRlc3QiLCAgYW1kZ3B1X21lbW9yeV9hbGxvYyB9LAorCXsgIlVzZXJwdHIgVGVzdCIsICBhbWRncHVfdXNlcnB0cl90ZXN0IH0sCisJeyAiQ29tbWFuZCBzdWJtaXNzaW9uIFRlc3QgKEdGWCkiLCAgYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9nZnggfSwKKwl7ICJDb21tYW5kIHN1Ym1pc3Npb24gVGVzdCAoQ29tcHV0ZSkiLCBhbWRncHVfY29tbWFuZF9zdWJtaXNzaW9uX2NvbXB1dGUgfSwKKwl7ICJDb21tYW5kIHN1Ym1pc3Npb24gVGVzdCAoTXVsdGktRmVuY2UpIiwgYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9tdWx0aV9mZW5jZSB9LAorCXsgIkNvbW1hbmQgc3VibWlzc2lvbiBUZXN0IChTRE1BKSIsIGFtZGdwdV9jb21tYW5kX3N1Ym1pc3Npb25fc2RtYSB9LAorCXsgIlNXIHNlbWFwaG9yZSBUZXN0IiwgIGFtZGdwdV9zZW1hcGhvcmVfdGVzdCB9LAorCUNVX1RFU1RfSU5GT19OVUxMLAorfTsKKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDggKiAxMDI0KQorI2RlZmluZSBTRE1BX1BLVF9IRUFERVJfb3Bfb2Zmc2V0IDAKKyNkZWZpbmUgU0RNQV9QS1RfSEVBREVSX29wX21hc2sgICAweDAwMDAwMEZGCisjZGVmaW5lIFNETUFfUEtUX0hFQURFUl9vcF9zaGlmdCAgMAorI2RlZmluZSBTRE1BX1BLVF9IRUFERVJfT1AoeCkgKCgoeCkgJiBTRE1BX1BLVF9IRUFERVJfb3BfbWFzaykgPDwgU0RNQV9QS1RfSEVBREVSX29wX3NoaWZ0KQorI2RlZmluZSBTRE1BX09QQ09ERV9DT05TVEFOVF9GSUxMICAxMQorIyAgICAgICBkZWZpbmUgU0RNQV9DT05TVEFOVF9GSUxMX0VYVFJBX1NJWkUoeCkgICAgICAgICAgICgoeCkgPDwgMTQpCisJLyogMCA9IGJ5dGUgZmlsbAorCSAqIDIgPSBEVyBmaWxsCisJICovCisjZGVmaW5lIFNETUFfUEFDS0VUKG9wLCBzdWJfb3AsIGUpCSgoKChlKSAmIDB4RkZGRikgPDwgMTYpIHwJXAorCQkJCQkoKChzdWJfb3ApICYgMHhGRikgPDwgOCkgfAlcCisJCQkJCSgoKG9wKSAmIDB4RkYpIDw8IDApKQorI2RlZmluZQlTRE1BX09QQ09ERV9XUklURQkJCQkgIDIKKyMgICAgICAgZGVmaW5lIFNETUFfV1JJVEVfU1VCX09QQ09ERV9MSU5FQVIgICAgICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBTRE1BX1dSVElFX1NVQl9PUENPREVfVElMRUQgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lCVNETUFfT1BDT0RFX0NPUFkJCQkJICAxCisjICAgICAgIGRlZmluZSBTRE1BX0NPUFlfU1VCX09QQ09ERV9MSU5FQVIgICAgICAgICAgICAgICAgMAorCisjZGVmaW5lIEdGWF9DT01QVVRFX05PUCAgMHhmZmZmMTAwMAorI2RlZmluZSBTRE1BX05PUCAgMHgwCisKKy8qIFBNNCAqLworI2RlZmluZQlQQUNLRVRfVFlQRTAJMAorI2RlZmluZQlQQUNLRVRfVFlQRTEJMQorI2RlZmluZQlQQUNLRVRfVFlQRTIJMgorI2RlZmluZQlQQUNLRVRfVFlQRTMJMworCisjZGVmaW5lIENQX1BBQ0tFVF9HRVRfVFlQRShoKSAoKChoKSA+PiAzMCkgJiAzKQorI2RlZmluZSBDUF9QQUNLRVRfR0VUX0NPVU5UKGgpICgoKGgpID4+IDE2KSAmIDB4M0ZGRikKKyNkZWZpbmUgQ1BfUEFDS0VUMF9HRVRfUkVHKGgpICgoaCkgJiAweEZGRkYpCisjZGVmaW5lIENQX1BBQ0tFVDNfR0VUX09QQ09ERShoKSAoKChoKSA+PiA4KSAmIDB4RkYpCisjZGVmaW5lIFBBQ0tFVDAocmVnLCBuKQkoKFBBQ0tFVF9UWVBFMCA8PCAzMCkgfAkJCQlcCisJCQkgKChyZWcpICYgMHhGRkZGKSB8CQkJXAorCQkJICgobikgJiAweDNGRkYpIDw8IDE2KQorI2RlZmluZSBDUF9QQUNLRVQyCQkJMHg4MDAwMDAwMAorI2RlZmluZQkJUEFDS0VUMl9QQURfU0hJRlQJCTAKKyNkZWZpbmUJCVBBQ0tFVDJfUEFEX01BU0sJCSgweDNmZmZmZmZmIDw8IDApCisKKyNkZWZpbmUgUEFDS0VUMih2KQkoQ1BfUEFDS0VUMiB8IFJFR19TRVQoUEFDS0VUMl9QQUQsICh2KSkpCisKKyNkZWZpbmUgUEFDS0VUMyhvcCwgbikJKChQQUNLRVRfVFlQRTMgPDwgMzApIHwJCQkJXAorCQkJICgoKG9wKSAmIDB4RkYpIDw8IDgpIHwJCQkJXAorCQkJICgobikgJiAweDNGRkYpIDw8IDE2KQorCisvKiBQYWNrZXQgMyB0eXBlcyAqLworI2RlZmluZQlQQUNLRVQzX05PUAkJCQkJMHgxMAorCisjZGVmaW5lCVBBQ0tFVDNfV1JJVEVfREFUQQkJCQkweDM3CisjZGVmaW5lCQlXUklURV9EQVRBX0RTVF9TRUwoeCkgICAgICAgICAgICAgICAgICAgKCh4KSA8PCA4KQorCQkvKiAwIC0gcmVnaXN0ZXIKKwkJICogMSAtIG1lbW9yeSAoc3luYyAtIHZpYSBHUkJNKQorCQkgKiAyIC0gZ2wyCisJCSAqIDMgLSBnZHMKKwkJICogNCAtIHJlc2VydmVkCisJCSAqIDUgLSBtZW1vcnkgKGFzeW5jIC0gZGlyZWN0KQorCQkgKi8KKyNkZWZpbmUJCVdSX09ORV9BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNikKKyNkZWZpbmUJCVdSX0NPTkZJUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyMCkKKyNkZWZpbmUJCVdSSVRFX0RBVEFfQ0FDSEVfUE9MSUNZKHgpICAgICAgICAgICAgICAoKHgpIDw8IDI1KQorCQkvKiAwIC0gTFJVCisJCSAqIDEgLSBTdHJlYW0KKwkJICovCisjZGVmaW5lCQlXUklURV9EQVRBX0VOR0lORV9TRUwoeCkgICAgICAgICAgICAgICAgKCh4KSA8PCAzMCkKKwkJLyogMCAtIG1lCisJCSAqIDEgLSBwZnAKKwkJICogMiAtIGNlCisJCSAqLworCisjZGVmaW5lCVBBQ0tFVDNfRE1BX0RBVEEJCQkJMHg1MAorLyogMS4gaGVhZGVyCisgKiAyLiBDT05UUk9MCisgKiAzLiBTUkNfQUREUl9MTyBvciBEQVRBIFszMTowXQorICogNC4gU1JDX0FERFJfSEkgWzMxOjBdCisgKiA1LiBEU1RfQUREUl9MTyBbMzE6MF0KKyAqIDYuIERTVF9BRERSX0hJIFs3OjBdCisgKiA3LiBDT01NQU5EIFszMDoyMV0gfCBCWVRFX0NPVU5UIFsyMDowXQorICovCisvKiBDT05UUk9MICovCisjICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19ETUFfREFUQV9FTkdJTkUoeCkgICAgICgoeCkgPDwgMCkKKwkJLyogMCAtIE1FCisJCSAqIDEgLSBQRlAKKwkJICovCisjICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19ETUFfREFUQV9TUkNfQ0FDSEVfUE9MSUNZKHgpICgoeCkgPDwgMTMpCisJCS8qIDAgLSBMUlUKKwkJICogMSAtIFN0cmVhbQorCQkgKiAyIC0gQnlwYXNzCisJCSAqLworIyAgICAgICAgICAgICAgZGVmaW5lIFBBQ0tFVDNfRE1BX0RBVEFfU1JDX1ZPTEFUSUxFICgxIDw8IDE1KQorIyAgICAgICAgICAgICAgZGVmaW5lIFBBQ0tFVDNfRE1BX0RBVEFfRFNUX1NFTCh4KSAgKCh4KSA8PCAyMCkKKwkJLyogMCAtIERTVF9BRERSIHVzaW5nIERBUworCQkgKiAxIC0gR0RTCisJCSAqIDMgLSBEU1RfQUREUiB1c2luZyBMMgorCQkgKi8KKyMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX0RNQV9EQVRBX0RTVF9DQUNIRV9QT0xJQ1koeCkgKCh4KSA8PCAyNSkKKwkJLyogMCAtIExSVQorCQkgKiAxIC0gU3RyZWFtCisJCSAqIDIgLSBCeXBhc3MKKwkJICovCisjICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19ETUFfREFUQV9EU1RfVk9MQVRJTEUgKDEgPDwgMjcpCisjICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19ETUFfREFUQV9TUkNfU0VMKHgpICAoKHgpIDw8IDI5KQorCQkvKiAwIC0gU1JDX0FERFIgdXNpbmcgU0FTCisJCSAqIDEgLSBHRFMKKwkJICogMiAtIERBVEEKKwkJICogMyAtIFNSQ19BRERSIHVzaW5nIEwyCisJCSAqLworIyAgICAgICAgICAgICAgZGVmaW5lIFBBQ0tFVDNfRE1BX0RBVEFfQ1BfU1lOQyAgICAgKDEgPDwgMzEpCisvKiBDT01NQU5EICovCisjICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19ETUFfREFUQV9ESVNfV0MgICAgICAoMSA8PCAyMSkKKyMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX0RNQV9EQVRBX0NNRF9TUkNfU1dBUCh4KSAoKHgpIDw8IDIyKQorCQkvKiAwIC0gbm9uZQorCQkgKiAxIC0gOCBpbiAxNgorCQkgKiAyIC0gOCBpbiAzMgorCQkgKiAzIC0gOCBpbiA2NAorCQkgKi8KKyMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX0RNQV9EQVRBX0NNRF9EU1RfU1dBUCh4KSAoKHgpIDw8IDI0KQorCQkvKiAwIC0gbm9uZQorCQkgKiAxIC0gOCBpbiAxNgorCQkgKiAyIC0gOCBpbiAzMgorCQkgKiAzIC0gOCBpbiA2NAorCQkgKi8KKyMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX0RNQV9EQVRBX0NNRF9TQVMgICAgICgxIDw8IDI2KQorCQkvKiAwIC0gbWVtb3J5CisJCSAqIDEgLSByZWdpc3RlcgorCQkgKi8KKyMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX0RNQV9EQVRBX0NNRF9EQVMgICAgICgxIDw8IDI3KQorCQkvKiAwIC0gbWVtb3J5CisJCSAqIDEgLSByZWdpc3RlcgorCQkgKi8KKyMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX0RNQV9EQVRBX0NNRF9TQUlDICAgICgxIDw8IDI4KQorIyAgICAgICAgICAgICAgZGVmaW5lIFBBQ0tFVDNfRE1BX0RBVEFfQ01EX0RBSUMgICAgKDEgPDwgMjkpCisjICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19ETUFfREFUQV9DTURfUkFXX1dBSVQgICgxIDw8IDMwKQorCisjZGVmaW5lIFNETUFfUEFDS0VUX1NJKG9wLCBiLCB0LCBzLCBjbnQpCSgoKChvcCkgJiAweEYpIDw8IDI4KSB8CVwKKwkJCQkJCSgoKGIpICYgMHgxKSA8PCAyNikgfAkJXAorCQkJCQkJKCgodCkgJiAweDEpIDw8IDIzKSB8CQlcCisJCQkJCQkoKChzKSAmIDB4MSkgPDwgMjIpIHwJCVwKKwkJCQkJCSgoKGNudCkgJiAweEZGRkZGKSA8PCAwKSkKKyNkZWZpbmUJU0RNQV9PUENPREVfQ09QWV9TSQkzCisjZGVmaW5lIFNETUFfT1BDT0RFX0NPTlNUQU5UX0ZJTExfU0kJMTMKKyNkZWZpbmUgU0RNQV9OT1BfU0kgIDB4ZgorI2RlZmluZSBHRlhfQ09NUFVURV9OT1BfU0kgMHg4MDAwMDAwMAorI2RlZmluZQlQQUNLRVQzX0RNQV9EQVRBX1NJCTB4NDEKKyMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX0RNQV9EQVRBX1NJX0VOR0lORSh4KSAgICAgKCh4KSA8PCAyNykKKwkJLyogMCAtIE1FCisJCSAqIDEgLSBQRlAKKwkJICovCisjICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19ETUFfREFUQV9TSV9EU1RfU0VMKHgpICAoKHgpIDw8IDIwKQorCQkvKiAwIC0gRFNUX0FERFIgdXNpbmcgREFTCisJCSAqIDEgLSBHRFMKKwkJICogMyAtIERTVF9BRERSIHVzaW5nIEwyCisJCSAqLworIyAgICAgICAgICAgICAgZGVmaW5lIFBBQ0tFVDNfRE1BX0RBVEFfU0lfU1JDX1NFTCh4KSAgKCh4KSA8PCAyOSkKKwkJLyogMCAtIFNSQ19BRERSIHVzaW5nIFNBUworCQkgKiAxIC0gR0RTCisJCSAqIDIgLSBEQVRBCisJCSAqIDMgLSBTUkNfQUREUiB1c2luZyBMMgorCQkgKi8KKyMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX0RNQV9EQVRBX1NJX0NQX1NZTkMgICAgICgxIDw8IDMxKQorCitpbnQgc3VpdGVfYmFzaWNfdGVzdHNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBhbWRncHVfZ3B1X2luZm8gZ3B1X2luZm8gPSB7MH07CisJaW50IHI7CisKKwlyID0gYW1kZ3B1X2RldmljZV9pbml0aWFsaXplKGRybV9hbWRncHVbMF0sICZtYWpvcl92ZXJzaW9uLAorCQkJCSAgICZtaW5vcl92ZXJzaW9uLCAmZGV2aWNlX2hhbmRsZSk7CisKKwlpZiAocikgeworCQlpZiAoKHIgPT0gLUVBQ0NFUykgJiYgKGVycm5vID09IEVBQ0NFUykpCisJCQlwcmludGYoIlxuXG5FcnJvcjolcy4gIgorCQkJCSJIaW50OlRyeSB0byBydW4gdGhpcyB0ZXN0IHByb2dyYW0gYXMgcm9vdC4iLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiBDVUVfU0lOSVRfRkFJTEVEOworCX0KKworCXIgPSBhbWRncHVfcXVlcnlfZ3B1X2luZm8oZGV2aWNlX2hhbmRsZSwgJmdwdV9pbmZvKTsKKwlpZiAocikKKwkJcmV0dXJuIENVRV9TSU5JVF9GQUlMRUQ7CisKKwlmYW1pbHlfaWQgPSBncHVfaW5mby5mYW1pbHlfaWQ7CisKKwlyZXR1cm4gQ1VFX1NVQ0NFU1M7Cit9CisKK2ludCBzdWl0ZV9iYXNpY190ZXN0c19jbGVhbih2b2lkKQoreworCWludCByID0gYW1kZ3B1X2RldmljZV9kZWluaXRpYWxpemUoZGV2aWNlX2hhbmRsZSk7CisKKwlpZiAociA9PSAwKQorCQlyZXR1cm4gQ1VFX1NVQ0NFU1M7CisJZWxzZQorCQlyZXR1cm4gQ1VFX1NDTEVBTl9GQUlMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9xdWVyeV9pbmZvX3Rlc3Qodm9pZCkKK3sKKwlzdHJ1Y3QgYW1kZ3B1X2dwdV9pbmZvIGdwdV9pbmZvID0gezB9OworCXVpbnQzMl90IHZlcnNpb24sIGZlYXR1cmU7CisJaW50IHI7CisKKwlyID0gYW1kZ3B1X3F1ZXJ5X2dwdV9pbmZvKGRldmljZV9oYW5kbGUsICZncHVfaW5mbyk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJciA9IGFtZGdwdV9xdWVyeV9maXJtd2FyZV92ZXJzaW9uKGRldmljZV9oYW5kbGUsIEFNREdQVV9JTkZPX0ZXX1ZDRSwgMCwKKwkJCQkJICAwLCAmdmVyc2lvbiwgJmZlYXR1cmUpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKK30KKworc3RhdGljIHZvaWQgYW1kZ3B1X21lbW9yeV9hbGxvYyh2b2lkKQoreworCWFtZGdwdV9ib19oYW5kbGUgYm87CisJYW1kZ3B1X3ZhX2hhbmRsZSB2YV9oYW5kbGU7CisJdWludDY0X3QgYm9fbWM7CisJaW50IHI7CisKKwkvKiBUZXN0IHZpc2libGUgVlJBTSAqLworCWJvID0gZ3B1X21lbV9hbGxvYyhkZXZpY2VfaGFuZGxlLAorCQkJNDA5NiwgNDA5NiwKKwkJCUFNREdQVV9HRU1fRE9NQUlOX1ZSQU0sCisJCQlBTURHUFVfR0VNX0NSRUFURV9DUFVfQUNDRVNTX1JFUVVJUkVELAorCQkJJmJvX21jLCAmdmFfaGFuZGxlKTsKKworCXIgPSBncHVfbWVtX2ZyZWUoYm8sIHZhX2hhbmRsZSwgYm9fbWMsIDQwOTYpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCS8qIFRlc3QgaW52aXNpYmxlIFZSQU0gKi8KKwlibyA9IGdwdV9tZW1fYWxsb2MoZGV2aWNlX2hhbmRsZSwKKwkJCTQwOTYsIDQwOTYsCisJCQlBTURHUFVfR0VNX0RPTUFJTl9WUkFNLAorCQkJQU1ER1BVX0dFTV9DUkVBVEVfTk9fQ1BVX0FDQ0VTUywKKwkJCSZib19tYywgJnZhX2hhbmRsZSk7CisKKwlyID0gZ3B1X21lbV9mcmVlKGJvLCB2YV9oYW5kbGUsIGJvX21jLCA0MDk2KTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwkvKiBUZXN0IEdBUlQgQ2FjaGVhYmxlICovCisJYm8gPSBncHVfbWVtX2FsbG9jKGRldmljZV9oYW5kbGUsCisJCQk0MDk2LCA0MDk2LAorCQkJQU1ER1BVX0dFTV9ET01BSU5fR1RULAorCQkJMCwgJmJvX21jLCAmdmFfaGFuZGxlKTsKKworCXIgPSBncHVfbWVtX2ZyZWUoYm8sIHZhX2hhbmRsZSwgYm9fbWMsIDQwOTYpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCS8qIFRlc3QgR0FSVCBVU1dDICovCisJYm8gPSBncHVfbWVtX2FsbG9jKGRldmljZV9oYW5kbGUsCisJCQk0MDk2LCA0MDk2LAorCQkJQU1ER1BVX0dFTV9ET01BSU5fR1RULAorCQkJQU1ER1BVX0dFTV9DUkVBVEVfQ1BVX0dUVF9VU1dDLAorCQkJJmJvX21jLCAmdmFfaGFuZGxlKTsKKworCXIgPSBncHVfbWVtX2ZyZWUoYm8sIHZhX2hhbmRsZSwgYm9fbWMsIDQwOTYpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKK30KKworc3RhdGljIHZvaWQgYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9nZnhfc2VwYXJhdGVfaWJzKHZvaWQpCit7CisJYW1kZ3B1X2NvbnRleHRfaGFuZGxlIGNvbnRleHRfaGFuZGxlOworCWFtZGdwdV9ib19oYW5kbGUgaWJfcmVzdWx0X2hhbmRsZSwgaWJfcmVzdWx0X2NlX2hhbmRsZTsKKwl2b2lkICppYl9yZXN1bHRfY3B1LCAqaWJfcmVzdWx0X2NlX2NwdTsKKwl1aW50NjRfdCBpYl9yZXN1bHRfbWNfYWRkcmVzcywgaWJfcmVzdWx0X2NlX21jX2FkZHJlc3M7CisJc3RydWN0IGFtZGdwdV9jc19yZXF1ZXN0IGlic19yZXF1ZXN0ID0gezB9OworCXN0cnVjdCBhbWRncHVfY3NfaWJfaW5mbyBpYl9pbmZvWzJdOworCXN0cnVjdCBhbWRncHVfY3NfZmVuY2UgZmVuY2Vfc3RhdHVzID0gezB9OworCXVpbnQzMl90ICpwdHI7CisJdWludDMyX3QgZXhwaXJlZDsKKwlhbWRncHVfYm9fbGlzdF9oYW5kbGUgYm9fbGlzdDsKKwlhbWRncHVfdmFfaGFuZGxlIHZhX2hhbmRsZSwgdmFfaGFuZGxlX2NlOworCWludCByLCBpID0gMDsKKworCXIgPSBhbWRncHVfY3NfY3R4X2NyZWF0ZShkZXZpY2VfaGFuZGxlLCAmY29udGV4dF9oYW5kbGUpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCXIgPSBhbWRncHVfYm9fYWxsb2NfYW5kX21hcChkZXZpY2VfaGFuZGxlLCA0MDk2LCA0MDk2LAorCQkJCSAgICBBTURHUFVfR0VNX0RPTUFJTl9HVFQsIDAsCisJCQkJICAgICZpYl9yZXN1bHRfaGFuZGxlLCAmaWJfcmVzdWx0X2NwdSwKKwkJCQkgICAgJmliX3Jlc3VsdF9tY19hZGRyZXNzLCAmdmFfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X2JvX2FsbG9jX2FuZF9tYXAoZGV2aWNlX2hhbmRsZSwgNDA5NiwgNDA5NiwKKwkJCQkgICAgQU1ER1BVX0dFTV9ET01BSU5fR1RULCAwLAorCQkJCSAgICAmaWJfcmVzdWx0X2NlX2hhbmRsZSwgJmliX3Jlc3VsdF9jZV9jcHUsCisJCQkJICAgICZpYl9yZXN1bHRfY2VfbWNfYWRkcmVzcywgJnZhX2hhbmRsZV9jZSk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJciA9IGFtZGdwdV9nZXRfYm9fbGlzdChkZXZpY2VfaGFuZGxlLCBpYl9yZXN1bHRfaGFuZGxlLAorCQkJICAgICAgIGliX3Jlc3VsdF9jZV9oYW5kbGUsICZib19saXN0KTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwltZW1zZXQoaWJfaW5mbywgMCwgMiAqIHNpemVvZihzdHJ1Y3QgYW1kZ3B1X2NzX2liX2luZm8pKTsKKworCS8qIElUX1NFVF9DRV9ERV9DT1VOVEVSUyAqLworCXB0ciA9IGliX3Jlc3VsdF9jZV9jcHU7CisJaWYgKGZhbWlseV9pZCAhPSBBTURHUFVfRkFNSUxZX1NJKSB7CisJCXB0cltpKytdID0gMHhjMDAwODkwMDsKKwkJcHRyW2krK10gPSAwOworCX0KKwlwdHJbaSsrXSA9IDB4YzAwMDg0MDA7CisJcHRyW2krK10gPSAxOworCWliX2luZm9bMF0uaWJfbWNfYWRkcmVzcyA9IGliX3Jlc3VsdF9jZV9tY19hZGRyZXNzOworCWliX2luZm9bMF0uc2l6ZSA9IGk7CisJaWJfaW5mb1swXS5mbGFncyA9IEFNREdQVV9JQl9GTEFHX0NFOworCisJLyogSVRfV0FJVF9PTl9DRV9DT1VOVEVSICovCisJcHRyID0gaWJfcmVzdWx0X2NwdTsKKwlwdHJbMF0gPSAweGMwMDA4NjAwOworCXB0clsxXSA9IDB4MDAwMDAwMDE7CisJaWJfaW5mb1sxXS5pYl9tY19hZGRyZXNzID0gaWJfcmVzdWx0X21jX2FkZHJlc3M7CisJaWJfaW5mb1sxXS5zaXplID0gMjsKKworCWlic19yZXF1ZXN0LmlwX3R5cGUgPSBBTURHUFVfSFdfSVBfR0ZYOworCWlic19yZXF1ZXN0Lm51bWJlcl9vZl9pYnMgPSAyOworCWlic19yZXF1ZXN0LmlicyA9IGliX2luZm87CisJaWJzX3JlcXVlc3QucmVzb3VyY2VzID0gYm9fbGlzdDsKKwlpYnNfcmVxdWVzdC5mZW5jZV9pbmZvLmhhbmRsZSA9IE5VTEw7CisKKwlyID0gYW1kZ3B1X2NzX3N1Ym1pdChjb250ZXh0X2hhbmRsZSwgMCwmaWJzX3JlcXVlc3QsIDEpOworCisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJZmVuY2Vfc3RhdHVzLmNvbnRleHQgPSBjb250ZXh0X2hhbmRsZTsKKwlmZW5jZV9zdGF0dXMuaXBfdHlwZSA9IEFNREdQVV9IV19JUF9HRlg7CisJZmVuY2Vfc3RhdHVzLmlwX2luc3RhbmNlID0gMDsKKwlmZW5jZV9zdGF0dXMuZmVuY2UgPSBpYnNfcmVxdWVzdC5zZXFfbm87CisKKwlyID0gYW1kZ3B1X2NzX3F1ZXJ5X2ZlbmNlX3N0YXR1cygmZmVuY2Vfc3RhdHVzLAorCQkJCQkgQU1ER1BVX1RJTUVPVVRfSU5GSU5JVEUsCisJCQkJCSAwLCAmZXhwaXJlZCk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJciA9IGFtZGdwdV9ib191bm1hcF9hbmRfZnJlZShpYl9yZXN1bHRfaGFuZGxlLCB2YV9oYW5kbGUsCisJCQkJICAgICBpYl9yZXN1bHRfbWNfYWRkcmVzcywgNDA5Nik7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJciA9IGFtZGdwdV9ib191bm1hcF9hbmRfZnJlZShpYl9yZXN1bHRfY2VfaGFuZGxlLCB2YV9oYW5kbGVfY2UsCisJCQkJICAgICBpYl9yZXN1bHRfY2VfbWNfYWRkcmVzcywgNDA5Nik7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJciA9IGFtZGdwdV9ib19saXN0X2Rlc3Ryb3koYm9fbGlzdCk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJciA9IGFtZGdwdV9jc19jdHhfZnJlZShjb250ZXh0X2hhbmRsZSk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9jb21tYW5kX3N1Ym1pc3Npb25fZ2Z4X3NoYXJlZF9pYih2b2lkKQoreworCWFtZGdwdV9jb250ZXh0X2hhbmRsZSBjb250ZXh0X2hhbmRsZTsKKwlhbWRncHVfYm9faGFuZGxlIGliX3Jlc3VsdF9oYW5kbGU7CisJdm9pZCAqaWJfcmVzdWx0X2NwdTsKKwl1aW50NjRfdCBpYl9yZXN1bHRfbWNfYWRkcmVzczsKKwlzdHJ1Y3QgYW1kZ3B1X2NzX3JlcXVlc3QgaWJzX3JlcXVlc3QgPSB7MH07CisJc3RydWN0IGFtZGdwdV9jc19pYl9pbmZvIGliX2luZm9bMl07CisJc3RydWN0IGFtZGdwdV9jc19mZW5jZSBmZW5jZV9zdGF0dXMgPSB7MH07CisJdWludDMyX3QgKnB0cjsKKwl1aW50MzJfdCBleHBpcmVkOworCWFtZGdwdV9ib19saXN0X2hhbmRsZSBib19saXN0OworCWFtZGdwdV92YV9oYW5kbGUgdmFfaGFuZGxlOworCWludCByLCBpID0gMDsKKworCXIgPSBhbWRncHVfY3NfY3R4X2NyZWF0ZShkZXZpY2VfaGFuZGxlLCAmY29udGV4dF9oYW5kbGUpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCXIgPSBhbWRncHVfYm9fYWxsb2NfYW5kX21hcChkZXZpY2VfaGFuZGxlLCA0MDk2LCA0MDk2LAorCQkJCSAgICBBTURHUFVfR0VNX0RPTUFJTl9HVFQsIDAsCisJCQkJICAgICZpYl9yZXN1bHRfaGFuZGxlLCAmaWJfcmVzdWx0X2NwdSwKKwkJCQkgICAgJmliX3Jlc3VsdF9tY19hZGRyZXNzLCAmdmFfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X2dldF9ib19saXN0KGRldmljZV9oYW5kbGUsIGliX3Jlc3VsdF9oYW5kbGUsIE5VTEwsCisJCQkgICAgICAgJmJvX2xpc3QpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCW1lbXNldChpYl9pbmZvLCAwLCAyICogc2l6ZW9mKHN0cnVjdCBhbWRncHVfY3NfaWJfaW5mbykpOworCisJLyogSVRfU0VUX0NFX0RFX0NPVU5URVJTICovCisJcHRyID0gaWJfcmVzdWx0X2NwdTsKKwlpZiAoZmFtaWx5X2lkICE9IEFNREdQVV9GQU1JTFlfU0kpIHsKKwkJcHRyW2krK10gPSAweGMwMDA4OTAwOworCQlwdHJbaSsrXSA9IDA7CisJfQorCXB0cltpKytdID0gMHhjMDAwODQwMDsKKwlwdHJbaSsrXSA9IDE7CisJaWJfaW5mb1swXS5pYl9tY19hZGRyZXNzID0gaWJfcmVzdWx0X21jX2FkZHJlc3M7CisJaWJfaW5mb1swXS5zaXplID0gaTsKKwlpYl9pbmZvWzBdLmZsYWdzID0gQU1ER1BVX0lCX0ZMQUdfQ0U7CisKKwlwdHIgPSAodWludDMyX3QgKilpYl9yZXN1bHRfY3B1ICsgNDsKKwlwdHJbMF0gPSAweGMwMDA4NjAwOworCXB0clsxXSA9IDB4MDAwMDAwMDE7CisJaWJfaW5mb1sxXS5pYl9tY19hZGRyZXNzID0gaWJfcmVzdWx0X21jX2FkZHJlc3MgKyAxNjsKKwlpYl9pbmZvWzFdLnNpemUgPSAyOworCisJaWJzX3JlcXVlc3QuaXBfdHlwZSA9IEFNREdQVV9IV19JUF9HRlg7CisJaWJzX3JlcXVlc3QubnVtYmVyX29mX2licyA9IDI7CisJaWJzX3JlcXVlc3QuaWJzID0gaWJfaW5mbzsKKwlpYnNfcmVxdWVzdC5yZXNvdXJjZXMgPSBib19saXN0OworCWlic19yZXF1ZXN0LmZlbmNlX2luZm8uaGFuZGxlID0gTlVMTDsKKworCXIgPSBhbWRncHVfY3Nfc3VibWl0KGNvbnRleHRfaGFuZGxlLCAwLCAmaWJzX3JlcXVlc3QsIDEpOworCisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJZmVuY2Vfc3RhdHVzLmNvbnRleHQgPSBjb250ZXh0X2hhbmRsZTsKKwlmZW5jZV9zdGF0dXMuaXBfdHlwZSA9IEFNREdQVV9IV19JUF9HRlg7CisJZmVuY2Vfc3RhdHVzLmlwX2luc3RhbmNlID0gMDsKKwlmZW5jZV9zdGF0dXMuZmVuY2UgPSBpYnNfcmVxdWVzdC5zZXFfbm87CisKKwlyID0gYW1kZ3B1X2NzX3F1ZXJ5X2ZlbmNlX3N0YXR1cygmZmVuY2Vfc3RhdHVzLAorCQkJCQkgQU1ER1BVX1RJTUVPVVRfSU5GSU5JVEUsCisJCQkJCSAwLCAmZXhwaXJlZCk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJciA9IGFtZGdwdV9ib191bm1hcF9hbmRfZnJlZShpYl9yZXN1bHRfaGFuZGxlLCB2YV9oYW5kbGUsCisJCQkJICAgICBpYl9yZXN1bHRfbWNfYWRkcmVzcywgNDA5Nik7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJciA9IGFtZGdwdV9ib19saXN0X2Rlc3Ryb3koYm9fbGlzdCk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJciA9IGFtZGdwdV9jc19jdHhfZnJlZShjb250ZXh0X2hhbmRsZSk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworfQorCitzdGF0aWMgdm9pZCBhbWRncHVfY29tbWFuZF9zdWJtaXNzaW9uX2dmeF9jcF93cml0ZV9kYXRhKHZvaWQpCit7CisJYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl93cml0ZV9saW5lYXJfaGVscGVyKEFNREdQVV9IV19JUF9HRlgpOworfQorCitzdGF0aWMgdm9pZCBhbWRncHVfY29tbWFuZF9zdWJtaXNzaW9uX2dmeF9jcF9jb25zdF9maWxsKHZvaWQpCit7CisJYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9jb25zdF9maWxsX2hlbHBlcihBTURHUFVfSFdfSVBfR0ZYKTsKK30KKworc3RhdGljIHZvaWQgYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9nZnhfY3BfY29weV9kYXRhKHZvaWQpCit7CisJYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9jb3B5X2xpbmVhcl9oZWxwZXIoQU1ER1BVX0hXX0lQX0dGWCk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9jb21tYW5kX3N1Ym1pc3Npb25fZ2Z4KHZvaWQpCit7CisJLyogd3JpdGUgZGF0YSB1c2luZyB0aGUgQ1AgKi8KKwlhbWRncHVfY29tbWFuZF9zdWJtaXNzaW9uX2dmeF9jcF93cml0ZV9kYXRhKCk7CisJLyogY29uc3QgZmlsbCB1c2luZyB0aGUgQ1AgKi8KKwlhbWRncHVfY29tbWFuZF9zdWJtaXNzaW9uX2dmeF9jcF9jb25zdF9maWxsKCk7CisJLyogY29weSBkYXRhIHVzaW5nIHRoZSBDUCAqLworCWFtZGdwdV9jb21tYW5kX3N1Ym1pc3Npb25fZ2Z4X2NwX2NvcHlfZGF0YSgpOworCS8qIHNlcGFyYXRlIElCIGJ1ZmZlcnMgZm9yIG11bHRpLUlCIHN1Ym1pc3Npb24gKi8KKwlhbWRncHVfY29tbWFuZF9zdWJtaXNzaW9uX2dmeF9zZXBhcmF0ZV9pYnMoKTsKKwkvKiBzaGFyZWQgSUIgYnVmZmVyIGZvciBtdWx0aS1JQiBzdWJtaXNzaW9uICovCisJYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9nZnhfc2hhcmVkX2liKCk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9zZW1hcGhvcmVfdGVzdCh2b2lkKQoreworCWFtZGdwdV9jb250ZXh0X2hhbmRsZSBjb250ZXh0X2hhbmRsZVsyXTsKKwlhbWRncHVfc2VtYXBob3JlX2hhbmRsZSBzZW07CisJYW1kZ3B1X2JvX2hhbmRsZSBpYl9yZXN1bHRfaGFuZGxlWzJdOworCXZvaWQgKmliX3Jlc3VsdF9jcHVbMl07CisJdWludDY0X3QgaWJfcmVzdWx0X21jX2FkZHJlc3NbMl07CisJc3RydWN0IGFtZGdwdV9jc19yZXF1ZXN0IGlic19yZXF1ZXN0WzJdID0gezB9OworCXN0cnVjdCBhbWRncHVfY3NfaWJfaW5mbyBpYl9pbmZvWzJdID0gezB9OworCXN0cnVjdCBhbWRncHVfY3NfZmVuY2UgZmVuY2Vfc3RhdHVzID0gezB9OworCXVpbnQzMl90ICpwdHI7CisJdWludDMyX3QgZXhwaXJlZDsKKwl1aW50MzJfdCBzZG1hX25vcCwgZ2Z4X25vcDsKKwlhbWRncHVfYm9fbGlzdF9oYW5kbGUgYm9fbGlzdFsyXTsKKwlhbWRncHVfdmFfaGFuZGxlIHZhX2hhbmRsZVsyXTsKKwlpbnQgciwgaTsKKworCWlmIChmYW1pbHlfaWQgPT0gQU1ER1BVX0ZBTUlMWV9TSSkgeworCQlzZG1hX25vcCA9IFNETUFfUEFDS0VUX1NJKFNETUFfTk9QX1NJLCAwLCAwLCAwLCAwKTsKKwkJZ2Z4X25vcCA9IEdGWF9DT01QVVRFX05PUF9TSTsKKwl9IGVsc2UgeworCQlzZG1hX25vcCA9IFNETUFfUEtUX0hFQURFUl9PUChTRE1BX05PUCk7CisJCWdmeF9ub3AgPSBHRlhfQ09NUFVURV9OT1A7CisJfQorCisJciA9IGFtZGdwdV9jc19jcmVhdGVfc2VtYXBob3JlKCZzZW0pOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXIgPSBhbWRncHVfY3NfY3R4X2NyZWF0ZShkZXZpY2VfaGFuZGxlLCAmY29udGV4dF9oYW5kbGVbaV0pOworCQlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwkJciA9IGFtZGdwdV9ib19hbGxvY19hbmRfbWFwKGRldmljZV9oYW5kbGUsIDQwOTYsIDQwOTYsCisJCQkJCSAgICBBTURHUFVfR0VNX0RPTUFJTl9HVFQsIDAsCisJCQkJCSAgICAmaWJfcmVzdWx0X2hhbmRsZVtpXSwgJmliX3Jlc3VsdF9jcHVbaV0sCisJCQkJCSAgICAmaWJfcmVzdWx0X21jX2FkZHJlc3NbaV0sICZ2YV9oYW5kbGVbaV0pOworCQlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwkJciA9IGFtZGdwdV9nZXRfYm9fbGlzdChkZXZpY2VfaGFuZGxlLCBpYl9yZXN1bHRfaGFuZGxlW2ldLAorCQkJCSAgICAgICBOVUxMLCAmYm9fbGlzdFtpXSk7CisJCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKwl9CisKKwkvKiAxLiBzYW1lIGNvbnRleHQgZGlmZmVyZW50IGVuZ2luZSAqLworCXB0ciA9IGliX3Jlc3VsdF9jcHVbMF07CisJcHRyWzBdID0gc2RtYV9ub3A7CisJaWJfaW5mb1swXS5pYl9tY19hZGRyZXNzID0gaWJfcmVzdWx0X21jX2FkZHJlc3NbMF07CisJaWJfaW5mb1swXS5zaXplID0gMTsKKworCWlic19yZXF1ZXN0WzBdLmlwX3R5cGUgPSBBTURHUFVfSFdfSVBfRE1BOworCWlic19yZXF1ZXN0WzBdLm51bWJlcl9vZl9pYnMgPSAxOworCWlic19yZXF1ZXN0WzBdLmlicyA9ICZpYl9pbmZvWzBdOworCWlic19yZXF1ZXN0WzBdLnJlc291cmNlcyA9IGJvX2xpc3RbMF07CisJaWJzX3JlcXVlc3RbMF0uZmVuY2VfaW5mby5oYW5kbGUgPSBOVUxMOworCXIgPSBhbWRncHVfY3Nfc3VibWl0KGNvbnRleHRfaGFuZGxlWzBdLCAwLCZpYnNfcmVxdWVzdFswXSwgMSk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCXIgPSBhbWRncHVfY3Nfc2lnbmFsX3NlbWFwaG9yZShjb250ZXh0X2hhbmRsZVswXSwgQU1ER1BVX0hXX0lQX0RNQSwgMCwgMCwgc2VtKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X2NzX3dhaXRfc2VtYXBob3JlKGNvbnRleHRfaGFuZGxlWzBdLCBBTURHUFVfSFdfSVBfR0ZYLCAwLCAwLCBzZW0pOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKwlwdHIgPSBpYl9yZXN1bHRfY3B1WzFdOworCXB0clswXSA9IGdmeF9ub3A7CisJaWJfaW5mb1sxXS5pYl9tY19hZGRyZXNzID0gaWJfcmVzdWx0X21jX2FkZHJlc3NbMV07CisJaWJfaW5mb1sxXS5zaXplID0gMTsKKworCWlic19yZXF1ZXN0WzFdLmlwX3R5cGUgPSBBTURHUFVfSFdfSVBfR0ZYOworCWlic19yZXF1ZXN0WzFdLm51bWJlcl9vZl9pYnMgPSAxOworCWlic19yZXF1ZXN0WzFdLmlicyA9ICZpYl9pbmZvWzFdOworCWlic19yZXF1ZXN0WzFdLnJlc291cmNlcyA9IGJvX2xpc3RbMV07CisJaWJzX3JlcXVlc3RbMV0uZmVuY2VfaW5mby5oYW5kbGUgPSBOVUxMOworCisJciA9IGFtZGdwdV9jc19zdWJtaXQoY29udGV4dF9oYW5kbGVbMF0sIDAsJmlic19yZXF1ZXN0WzFdLCAxKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlmZW5jZV9zdGF0dXMuY29udGV4dCA9IGNvbnRleHRfaGFuZGxlWzBdOworCWZlbmNlX3N0YXR1cy5pcF90eXBlID0gQU1ER1BVX0hXX0lQX0dGWDsKKwlmZW5jZV9zdGF0dXMuaXBfaW5zdGFuY2UgPSAwOworCWZlbmNlX3N0YXR1cy5mZW5jZSA9IGlic19yZXF1ZXN0WzFdLnNlcV9ubzsKKwlyID0gYW1kZ3B1X2NzX3F1ZXJ5X2ZlbmNlX3N0YXR1cygmZmVuY2Vfc3RhdHVzLAorCQkJCQkgNTAwMDAwMDAwLCAwLCAmZXhwaXJlZCk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCUNVX0FTU0VSVF9FUVVBTChleHBpcmVkLCB0cnVlKTsKKworCS8qIDIuIHNhbWUgZW5naW5lIGRpZmZlcmVudCBjb250ZXh0ICovCisJcHRyID0gaWJfcmVzdWx0X2NwdVswXTsKKwlwdHJbMF0gPSBnZnhfbm9wOworCWliX2luZm9bMF0uaWJfbWNfYWRkcmVzcyA9IGliX3Jlc3VsdF9tY19hZGRyZXNzWzBdOworCWliX2luZm9bMF0uc2l6ZSA9IDE7CisKKwlpYnNfcmVxdWVzdFswXS5pcF90eXBlID0gQU1ER1BVX0hXX0lQX0dGWDsKKwlpYnNfcmVxdWVzdFswXS5udW1iZXJfb2ZfaWJzID0gMTsKKwlpYnNfcmVxdWVzdFswXS5pYnMgPSAmaWJfaW5mb1swXTsKKwlpYnNfcmVxdWVzdFswXS5yZXNvdXJjZXMgPSBib19saXN0WzBdOworCWlic19yZXF1ZXN0WzBdLmZlbmNlX2luZm8uaGFuZGxlID0gTlVMTDsKKwlyID0gYW1kZ3B1X2NzX3N1Ym1pdChjb250ZXh0X2hhbmRsZVswXSwgMCwmaWJzX3JlcXVlc3RbMF0sIDEpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKwlyID0gYW1kZ3B1X2NzX3NpZ25hbF9zZW1hcGhvcmUoY29udGV4dF9oYW5kbGVbMF0sIEFNREdQVV9IV19JUF9HRlgsIDAsIDAsIHNlbSk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJciA9IGFtZGdwdV9jc193YWl0X3NlbWFwaG9yZShjb250ZXh0X2hhbmRsZVsxXSwgQU1ER1BVX0hXX0lQX0dGWCwgMCwgMCwgc2VtKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisJcHRyID0gaWJfcmVzdWx0X2NwdVsxXTsKKwlwdHJbMF0gPSBnZnhfbm9wOworCWliX2luZm9bMV0uaWJfbWNfYWRkcmVzcyA9IGliX3Jlc3VsdF9tY19hZGRyZXNzWzFdOworCWliX2luZm9bMV0uc2l6ZSA9IDE7CisKKwlpYnNfcmVxdWVzdFsxXS5pcF90eXBlID0gQU1ER1BVX0hXX0lQX0dGWDsKKwlpYnNfcmVxdWVzdFsxXS5udW1iZXJfb2ZfaWJzID0gMTsKKwlpYnNfcmVxdWVzdFsxXS5pYnMgPSAmaWJfaW5mb1sxXTsKKwlpYnNfcmVxdWVzdFsxXS5yZXNvdXJjZXMgPSBib19saXN0WzFdOworCWlic19yZXF1ZXN0WzFdLmZlbmNlX2luZm8uaGFuZGxlID0gTlVMTDsKKwlyID0gYW1kZ3B1X2NzX3N1Ym1pdChjb250ZXh0X2hhbmRsZVsxXSwgMCwmaWJzX3JlcXVlc3RbMV0sIDEpOworCisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJZmVuY2Vfc3RhdHVzLmNvbnRleHQgPSBjb250ZXh0X2hhbmRsZVsxXTsKKwlmZW5jZV9zdGF0dXMuaXBfdHlwZSA9IEFNREdQVV9IV19JUF9HRlg7CisJZmVuY2Vfc3RhdHVzLmlwX2luc3RhbmNlID0gMDsKKwlmZW5jZV9zdGF0dXMuZmVuY2UgPSBpYnNfcmVxdWVzdFsxXS5zZXFfbm87CisJciA9IGFtZGdwdV9jc19xdWVyeV9mZW5jZV9zdGF0dXMoJmZlbmNlX3N0YXR1cywKKwkJCQkJIDUwMDAwMDAwMCwgMCwgJmV4cGlyZWQpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKwlDVV9BU1NFUlRfRVFVQUwoZXhwaXJlZCwgdHJ1ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXIgPSBhbWRncHVfYm9fdW5tYXBfYW5kX2ZyZWUoaWJfcmVzdWx0X2hhbmRsZVtpXSwgdmFfaGFuZGxlW2ldLAorCQkJCQkgICAgIGliX3Jlc3VsdF9tY19hZGRyZXNzW2ldLCA0MDk2KTsKKwkJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJCXIgPSBhbWRncHVfYm9fbGlzdF9kZXN0cm95KGJvX2xpc3RbaV0pOworCQlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwkJciA9IGFtZGdwdV9jc19jdHhfZnJlZShjb250ZXh0X2hhbmRsZVtpXSk7CisJCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKwl9CisKKwlyID0gYW1kZ3B1X2NzX2Rlc3Ryb3lfc2VtYXBob3JlKHNlbSk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworfQorCitzdGF0aWMgdm9pZCBhbWRncHVfY29tbWFuZF9zdWJtaXNzaW9uX2NvbXB1dGVfbm9wKHZvaWQpCit7CisJYW1kZ3B1X2NvbnRleHRfaGFuZGxlIGNvbnRleHRfaGFuZGxlOworCWFtZGdwdV9ib19oYW5kbGUgaWJfcmVzdWx0X2hhbmRsZTsKKwl2b2lkICppYl9yZXN1bHRfY3B1OworCXVpbnQ2NF90IGliX3Jlc3VsdF9tY19hZGRyZXNzOworCXN0cnVjdCBhbWRncHVfY3NfcmVxdWVzdCBpYnNfcmVxdWVzdDsKKwlzdHJ1Y3QgYW1kZ3B1X2NzX2liX2luZm8gaWJfaW5mbzsKKwlzdHJ1Y3QgYW1kZ3B1X2NzX2ZlbmNlIGZlbmNlX3N0YXR1czsKKwl1aW50MzJfdCAqcHRyOworCXVpbnQzMl90IGV4cGlyZWQ7CisJaW50IGksIHIsIGluc3RhbmNlOworCWFtZGdwdV9ib19saXN0X2hhbmRsZSBib19saXN0OworCWFtZGdwdV92YV9oYW5kbGUgdmFfaGFuZGxlOworCXN0cnVjdCBkcm1fYW1kZ3B1X2luZm9faHdfaXAgaW5mbzsKKworCXIgPSBhbWRncHVfcXVlcnlfaHdfaXBfaW5mbyhkZXZpY2VfaGFuZGxlLCBBTURHUFVfSFdfSVBfQ09NUFVURSwgMCwgJmluZm8pOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCXIgPSBhbWRncHVfY3NfY3R4X2NyZWF0ZShkZXZpY2VfaGFuZGxlLCAmY29udGV4dF9oYW5kbGUpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCWZvciAoaW5zdGFuY2UgPSAwOyAoMSA8PCBpbnN0YW5jZSkgJiBpbmZvLmF2YWlsYWJsZV9yaW5nczsgaW5zdGFuY2UrKykgeworCQlyID0gYW1kZ3B1X2JvX2FsbG9jX2FuZF9tYXAoZGV2aWNlX2hhbmRsZSwgNDA5NiwgNDA5NiwKKwkJCQkJICAgIEFNREdQVV9HRU1fRE9NQUlOX0dUVCwgMCwKKwkJCQkJICAgICZpYl9yZXN1bHRfaGFuZGxlLCAmaWJfcmVzdWx0X2NwdSwKKwkJCQkJICAgICZpYl9yZXN1bHRfbWNfYWRkcmVzcywgJnZhX2hhbmRsZSk7CisJCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCQlyID0gYW1kZ3B1X2dldF9ib19saXN0KGRldmljZV9oYW5kbGUsIGliX3Jlc3VsdF9oYW5kbGUsIE5VTEwsCisJCQkJICAgICAgICZib19saXN0KTsKKwkJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJCXB0ciA9IGliX3Jlc3VsdF9jcHU7CisJCW1lbXNldChwdHIsIDAsIDE2KTsKKwkJcHRyWzBdPVBBQ0tFVDMoUEFDS0VUM19OT1AsIDE0KTsKKworCQltZW1zZXQoJmliX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgYW1kZ3B1X2NzX2liX2luZm8pKTsKKwkJaWJfaW5mby5pYl9tY19hZGRyZXNzID0gaWJfcmVzdWx0X21jX2FkZHJlc3M7CisJCWliX2luZm8uc2l6ZSA9IDE2OworCisJCW1lbXNldCgmaWJzX3JlcXVlc3QsIDAsIHNpemVvZihzdHJ1Y3QgYW1kZ3B1X2NzX3JlcXVlc3QpKTsKKwkJaWJzX3JlcXVlc3QuaXBfdHlwZSA9IEFNREdQVV9IV19JUF9DT01QVVRFOworCQlpYnNfcmVxdWVzdC5yaW5nID0gaW5zdGFuY2U7CisJCWlic19yZXF1ZXN0Lm51bWJlcl9vZl9pYnMgPSAxOworCQlpYnNfcmVxdWVzdC5pYnMgPSAmaWJfaW5mbzsKKwkJaWJzX3JlcXVlc3QucmVzb3VyY2VzID0gYm9fbGlzdDsKKwkJaWJzX3JlcXVlc3QuZmVuY2VfaW5mby5oYW5kbGUgPSBOVUxMOworCisJCW1lbXNldCgmZmVuY2Vfc3RhdHVzLCAwLCBzaXplb2Yoc3RydWN0IGFtZGdwdV9jc19mZW5jZSkpOworCQlyID0gYW1kZ3B1X2NzX3N1Ym1pdChjb250ZXh0X2hhbmRsZSwgMCwmaWJzX3JlcXVlc3QsIDEpOworCQlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwkJZmVuY2Vfc3RhdHVzLmNvbnRleHQgPSBjb250ZXh0X2hhbmRsZTsKKwkJZmVuY2Vfc3RhdHVzLmlwX3R5cGUgPSBBTURHUFVfSFdfSVBfQ09NUFVURTsKKwkJZmVuY2Vfc3RhdHVzLmlwX2luc3RhbmNlID0gMDsKKwkJZmVuY2Vfc3RhdHVzLnJpbmcgPSBpbnN0YW5jZTsKKwkJZmVuY2Vfc3RhdHVzLmZlbmNlID0gaWJzX3JlcXVlc3Quc2VxX25vOworCisJCXIgPSBhbWRncHVfY3NfcXVlcnlfZmVuY2Vfc3RhdHVzKCZmZW5jZV9zdGF0dXMsCisJCQkJCQkgQU1ER1BVX1RJTUVPVVRfSU5GSU5JVEUsCisJCQkJCQkgMCwgJmV4cGlyZWQpOworCQlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwkJciA9IGFtZGdwdV9ib19saXN0X2Rlc3Ryb3koYm9fbGlzdCk7CisJCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCQlyID0gYW1kZ3B1X2JvX3VubWFwX2FuZF9mcmVlKGliX3Jlc3VsdF9oYW5kbGUsIHZhX2hhbmRsZSwKKwkJCQkJICAgICBpYl9yZXN1bHRfbWNfYWRkcmVzcywgNDA5Nik7CisJCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKwl9CisKKwlyID0gYW1kZ3B1X2NzX2N0eF9mcmVlKGNvbnRleHRfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9jb21tYW5kX3N1Ym1pc3Npb25fY29tcHV0ZV9jcF93cml0ZV9kYXRhKHZvaWQpCit7CisJYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl93cml0ZV9saW5lYXJfaGVscGVyKEFNREdQVV9IV19JUF9DT01QVVRFKTsKK30KKworc3RhdGljIHZvaWQgYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9jb21wdXRlX2NwX2NvbnN0X2ZpbGwodm9pZCkKK3sKKwlhbWRncHVfY29tbWFuZF9zdWJtaXNzaW9uX2NvbnN0X2ZpbGxfaGVscGVyKEFNREdQVV9IV19JUF9DT01QVVRFKTsKK30KKworc3RhdGljIHZvaWQgYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9jb21wdXRlX2NwX2NvcHlfZGF0YSh2b2lkKQoreworCWFtZGdwdV9jb21tYW5kX3N1Ym1pc3Npb25fY29weV9saW5lYXJfaGVscGVyKEFNREdQVV9IV19JUF9DT01QVVRFKTsKK30KKworc3RhdGljIHZvaWQgYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9jb21wdXRlKHZvaWQpCit7CisJLyogd3JpdGUgZGF0YSB1c2luZyB0aGUgQ1AgKi8KKwlhbWRncHVfY29tbWFuZF9zdWJtaXNzaW9uX2NvbXB1dGVfY3Bfd3JpdGVfZGF0YSgpOworCS8qIGNvbnN0IGZpbGwgdXNpbmcgdGhlIENQICovCisJYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9jb21wdXRlX2NwX2NvbnN0X2ZpbGwoKTsKKwkvKiBjb3B5IGRhdGEgdXNpbmcgdGhlIENQICovCisJYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9jb21wdXRlX2NwX2NvcHlfZGF0YSgpOworCS8qIG5vcCB0ZXN0ICovCisJYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9jb21wdXRlX25vcCgpOworfQorCisvKgorICogY2FsbGVyIG5lZWQgY3JlYXRlL3JlbGVhc2U6CisgKiBwbTRfc3JjLCByZXNvdXJjZXMsIGliX2luZm8sIGFuZCBpYnNfcmVxdWVzdAorICogc3VibWl0IGNvbW1hbmQgc3RyZWFtIGRlc2NyaWJlZCBpbiBpYnNfcmVxdWVzdCBhbmQgd2FpdCBmb3IgdGhpcyBJQiBhY2NvbXBsaXNoZWQKKyAqLworc3RhdGljIHZvaWQgYW1kZ3B1X3Rlc3RfZXhlY19jc19oZWxwZXIoYW1kZ3B1X2NvbnRleHRfaGFuZGxlIGNvbnRleHRfaGFuZGxlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpcF90eXBlLAorCQkJCSAgICAgICBpbnQgaW5zdGFuY2UsIGludCBwbTRfZHcsIHVpbnQzMl90ICpwbTRfc3JjLAorCQkJCSAgICAgICBpbnQgcmVzX2NudCwgYW1kZ3B1X2JvX2hhbmRsZSAqcmVzb3VyY2VzLAorCQkJCSAgICAgICBzdHJ1Y3QgYW1kZ3B1X2NzX2liX2luZm8gKmliX2luZm8sCisJCQkJICAgICAgIHN0cnVjdCBhbWRncHVfY3NfcmVxdWVzdCAqaWJzX3JlcXVlc3QpCit7CisJaW50IHI7CisJdWludDMyX3QgZXhwaXJlZDsKKwl1aW50MzJfdCAqcmluZ19wdHI7CisJYW1kZ3B1X2JvX2hhbmRsZSBpYl9yZXN1bHRfaGFuZGxlOworCXZvaWQgKmliX3Jlc3VsdF9jcHU7CisJdWludDY0X3QgaWJfcmVzdWx0X21jX2FkZHJlc3M7CisJc3RydWN0IGFtZGdwdV9jc19mZW5jZSBmZW5jZV9zdGF0dXMgPSB7MH07CisJYW1kZ3B1X2JvX2hhbmRsZSAqYWxsX3JlcyA9IGFsbG9jYShzaXplb2YocmVzb3VyY2VzWzBdKSAqIChyZXNfY250ICsgMSkpOworCWFtZGdwdV92YV9oYW5kbGUgdmFfaGFuZGxlOworCisJLyogcHJlcGFyZSBDUyAqLworCUNVX0FTU0VSVF9OT1RfRVFVQUwocG00X3NyYywgTlVMTCk7CisJQ1VfQVNTRVJUX05PVF9FUVVBTChyZXNvdXJjZXMsIE5VTEwpOworCUNVX0FTU0VSVF9OT1RfRVFVQUwoaWJfaW5mbywgTlVMTCk7CisJQ1VfQVNTRVJUX05PVF9FUVVBTChpYnNfcmVxdWVzdCwgTlVMTCk7CisJQ1VfQVNTRVJUX1RSVUUocG00X2R3IDw9IDEwMjQpOworCisJLyogYWxsb2NhdGUgSUIgKi8KKwlyID0gYW1kZ3B1X2JvX2FsbG9jX2FuZF9tYXAoZGV2aWNlX2hhbmRsZSwgNDA5NiwgNDA5NiwKKwkJCQkgICAgQU1ER1BVX0dFTV9ET01BSU5fR1RULCAwLAorCQkJCSAgICAmaWJfcmVzdWx0X2hhbmRsZSwgJmliX3Jlc3VsdF9jcHUsCisJCQkJICAgICZpYl9yZXN1bHRfbWNfYWRkcmVzcywgJnZhX2hhbmRsZSk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJLyogY29weSBQTTQgcGFja2V0IHRvIHJpbmcgZnJvbSBjYWxsZXIgKi8KKwlyaW5nX3B0ciA9IGliX3Jlc3VsdF9jcHU7CisJbWVtY3B5KHJpbmdfcHRyLCBwbTRfc3JjLCBwbTRfZHcgKiBzaXplb2YoKnBtNF9zcmMpKTsKKworCWliX2luZm8tPmliX21jX2FkZHJlc3MgPSBpYl9yZXN1bHRfbWNfYWRkcmVzczsKKwlpYl9pbmZvLT5zaXplID0gcG00X2R3OworCisJaWJzX3JlcXVlc3QtPmlwX3R5cGUgPSBpcF90eXBlOworCWlic19yZXF1ZXN0LT5yaW5nID0gaW5zdGFuY2U7CisJaWJzX3JlcXVlc3QtPm51bWJlcl9vZl9pYnMgPSAxOworCWlic19yZXF1ZXN0LT5pYnMgPSBpYl9pbmZvOworCWlic19yZXF1ZXN0LT5mZW5jZV9pbmZvLmhhbmRsZSA9IE5VTEw7CisKKwltZW1jcHkoYWxsX3JlcywgcmVzb3VyY2VzLCBzaXplb2YocmVzb3VyY2VzWzBdKSAqIHJlc19jbnQpOworCWFsbF9yZXNbcmVzX2NudF0gPSBpYl9yZXN1bHRfaGFuZGxlOworCisJciA9IGFtZGdwdV9ib19saXN0X2NyZWF0ZShkZXZpY2VfaGFuZGxlLCByZXNfY250KzEsIGFsbF9yZXMsCisJCQkJICBOVUxMLCAmaWJzX3JlcXVlc3QtPnJlc291cmNlcyk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJQ1VfQVNTRVJUX05PVF9FUVVBTChpYnNfcmVxdWVzdCwgTlVMTCk7CisKKwkvKiBzdWJtaXQgQ1MgKi8KKwlyID0gYW1kZ3B1X2NzX3N1Ym1pdChjb250ZXh0X2hhbmRsZSwgMCwgaWJzX3JlcXVlc3QsIDEpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCXIgPSBhbWRncHVfYm9fbGlzdF9kZXN0cm95KGlic19yZXF1ZXN0LT5yZXNvdXJjZXMpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCWZlbmNlX3N0YXR1cy5pcF90eXBlID0gaXBfdHlwZTsKKwlmZW5jZV9zdGF0dXMuaXBfaW5zdGFuY2UgPSAwOworCWZlbmNlX3N0YXR1cy5yaW5nID0gaWJzX3JlcXVlc3QtPnJpbmc7CisJZmVuY2Vfc3RhdHVzLmNvbnRleHQgPSBjb250ZXh0X2hhbmRsZTsKKwlmZW5jZV9zdGF0dXMuZmVuY2UgPSBpYnNfcmVxdWVzdC0+c2VxX25vOworCisJLyogd2FpdCBmb3IgSUIgYWNjb21wbGlzaGVkICovCisJciA9IGFtZGdwdV9jc19xdWVyeV9mZW5jZV9zdGF0dXMoJmZlbmNlX3N0YXR1cywKKwkJCQkJIEFNREdQVV9USU1FT1VUX0lORklOSVRFLAorCQkJCQkgMCwgJmV4cGlyZWQpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKwlDVV9BU1NFUlRfRVFVQUwoZXhwaXJlZCwgdHJ1ZSk7CisKKwlyID0gYW1kZ3B1X2JvX3VubWFwX2FuZF9mcmVlKGliX3Jlc3VsdF9oYW5kbGUsIHZhX2hhbmRsZSwKKwkJCQkgICAgIGliX3Jlc3VsdF9tY19hZGRyZXNzLCA0MDk2KTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9jb21tYW5kX3N1Ym1pc3Npb25fd3JpdGVfbGluZWFyX2hlbHBlcih1bnNpZ25lZCBpcF90eXBlKQoreworCWNvbnN0IGludCBzZG1hX3dyaXRlX2xlbmd0aCA9IDEyODsKKwljb25zdCBpbnQgcG00X2R3ID0gMjU2OworCWFtZGdwdV9jb250ZXh0X2hhbmRsZSBjb250ZXh0X2hhbmRsZTsKKwlhbWRncHVfYm9faGFuZGxlIGJvOworCWFtZGdwdV9ib19oYW5kbGUgKnJlc291cmNlczsKKwl1aW50MzJfdCAqcG00OworCXN0cnVjdCBhbWRncHVfY3NfaWJfaW5mbyAqaWJfaW5mbzsKKwlzdHJ1Y3QgYW1kZ3B1X2NzX3JlcXVlc3QgKmlic19yZXF1ZXN0OworCXVpbnQ2NF90IGJvX21jOworCXZvbGF0aWxlIHVpbnQzMl90ICpib19jcHU7CisJaW50IGksIGosIHIsIGxvb3A7CisJdWludDY0X3QgZ3R0X2ZsYWdzWzJdID0gezAsIEFNREdQVV9HRU1fQ1JFQVRFX0NQVV9HVFRfVVNXQ307CisJYW1kZ3B1X3ZhX2hhbmRsZSB2YV9oYW5kbGU7CisKKwlwbTQgPSBjYWxsb2MocG00X2R3LCBzaXplb2YoKnBtNCkpOworCUNVX0FTU0VSVF9OT1RfRVFVQUwocG00LCBOVUxMKTsKKworCWliX2luZm8gPSBjYWxsb2MoMSwgc2l6ZW9mKCppYl9pbmZvKSk7CisJQ1VfQVNTRVJUX05PVF9FUVVBTChpYl9pbmZvLCBOVUxMKTsKKworCWlic19yZXF1ZXN0ID0gY2FsbG9jKDEsIHNpemVvZigqaWJzX3JlcXVlc3QpKTsKKwlDVV9BU1NFUlRfTk9UX0VRVUFMKGlic19yZXF1ZXN0LCBOVUxMKTsKKworCXIgPSBhbWRncHVfY3NfY3R4X2NyZWF0ZShkZXZpY2VfaGFuZGxlLCAmY29udGV4dF9oYW5kbGUpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCS8qIHByZXBhcmUgcmVzb3VyY2UgKi8KKwlyZXNvdXJjZXMgPSBjYWxsb2MoMSwgc2l6ZW9mKGFtZGdwdV9ib19oYW5kbGUpKTsKKwlDVV9BU1NFUlRfTk9UX0VRVUFMKHJlc291cmNlcywgTlVMTCk7CisKKwlsb29wID0gMDsKKwl3aGlsZShsb29wIDwgMikgeworCQkvKiBhbGxvY2F0ZSBVQyBibyBmb3Igc0RNQSB1c2UgKi8KKwkJciA9IGFtZGdwdV9ib19hbGxvY19hbmRfbWFwKGRldmljZV9oYW5kbGUsCisJCQkJCSAgICBzZG1hX3dyaXRlX2xlbmd0aCAqIHNpemVvZih1aW50MzJfdCksCisJCQkJCSAgICA0MDk2LCBBTURHUFVfR0VNX0RPTUFJTl9HVFQsCisJCQkJCSAgICBndHRfZmxhZ3NbbG9vcF0sICZibywgKHZvaWQqKikmYm9fY3B1LAorCQkJCQkgICAgJmJvX21jLCAmdmFfaGFuZGxlKTsKKwkJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJCS8qIGNsZWFyIGJvICovCisJCW1lbXNldCgodm9pZCopYm9fY3B1LCAwLCBzZG1hX3dyaXRlX2xlbmd0aCAqIHNpemVvZih1aW50MzJfdCkpOworCisKKwkJcmVzb3VyY2VzWzBdID0gYm87CisKKwkJLyogZnVsZmlsbCBQTTQ6IHRlc3QgRE1BIHdyaXRlLWxpbmVhciAqLworCQlpID0gaiA9IDA7CisJCWlmIChpcF90eXBlID09IEFNREdQVV9IV19JUF9ETUEpIHsKKwkJCWlmIChmYW1pbHlfaWQgPT0gQU1ER1BVX0ZBTUlMWV9TSSkKKwkJCQlwbTRbaSsrXSA9IFNETUFfUEFDS0VUX1NJKFNETUFfT1BDT0RFX1dSSVRFLCAwLCAwLCAwLAorCQkJCQkJCSAgc2RtYV93cml0ZV9sZW5ndGgpOworCQkJZWxzZQorCQkJCXBtNFtpKytdID0gU0RNQV9QQUNLRVQoU0RNQV9PUENPREVfV1JJVEUsCisJCQkJCQkgICAgICAgU0RNQV9XUklURV9TVUJfT1BDT0RFX0xJTkVBUiwgMCk7CisJCQlwbTRbaSsrXSA9IDB4ZmZmZmZmZmYgJiBib19tYzsKKwkJCXBtNFtpKytdID0gKDB4ZmZmZmZmZmYwMDAwMDAwMCAmIGJvX21jKSA+PiAzMjsKKwkJCWlmIChmYW1pbHlfaWQgPj0gQU1ER1BVX0ZBTUlMWV9BSSkKKwkJCQlwbTRbaSsrXSA9IHNkbWFfd3JpdGVfbGVuZ3RoIC0gMTsKKwkJCWVsc2UgaWYgKGZhbWlseV9pZCAhPSBBTURHUFVfRkFNSUxZX1NJKQorCQkJCXBtNFtpKytdID0gc2RtYV93cml0ZV9sZW5ndGg7CisJCQl3aGlsZShqKysgPCBzZG1hX3dyaXRlX2xlbmd0aCkKKwkJCQlwbTRbaSsrXSA9IDB4ZGVhZGJlYWY7CisJCX0gZWxzZSBpZiAoKGlwX3R5cGUgPT0gQU1ER1BVX0hXX0lQX0dGWCkgfHwKKwkJCSAgIChpcF90eXBlID09IEFNREdQVV9IV19JUF9DT01QVVRFKSkgeworCQkJcG00W2krK10gPSBQQUNLRVQzKFBBQ0tFVDNfV1JJVEVfREFUQSwgMiArIHNkbWFfd3JpdGVfbGVuZ3RoKTsKKwkJCXBtNFtpKytdID0gV1JJVEVfREFUQV9EU1RfU0VMKDUpIHwgV1JfQ09ORklSTTsKKwkJCXBtNFtpKytdID0gMHhmZmZmZmZmYyAmIGJvX21jOworCQkJcG00W2krK10gPSAoMHhmZmZmZmZmZjAwMDAwMDAwICYgYm9fbWMpID4+IDMyOworCQkJd2hpbGUoaisrIDwgc2RtYV93cml0ZV9sZW5ndGgpCisJCQkJcG00W2krK10gPSAweGRlYWRiZWFmOworCQl9CisKKwkJYW1kZ3B1X3Rlc3RfZXhlY19jc19oZWxwZXIoY29udGV4dF9oYW5kbGUsCisJCQkJCSAgIGlwX3R5cGUsIDAsCisJCQkJCSAgIGksIHBtNCwKKwkJCQkJICAgMSwgcmVzb3VyY2VzLAorCQkJCQkgICBpYl9pbmZvLCBpYnNfcmVxdWVzdCk7CisKKwkJLyogdmVyaWZ5IGlmIFNETUEgdGVzdCByZXN1bHQgbWVldHMgd2l0aCBleHBlY3RlZCAqLworCQlpID0gMDsKKwkJd2hpbGUoaSA8IHNkbWFfd3JpdGVfbGVuZ3RoKSB7CisJCQlDVV9BU1NFUlRfRVFVQUwoYm9fY3B1W2krK10sIDB4ZGVhZGJlYWYpOworCQl9CisKKwkJciA9IGFtZGdwdV9ib191bm1hcF9hbmRfZnJlZShibywgdmFfaGFuZGxlLCBib19tYywKKwkJCQkJICAgICBzZG1hX3dyaXRlX2xlbmd0aCAqIHNpemVvZih1aW50MzJfdCkpOworCQlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisJCWxvb3ArKzsKKwl9CisJLyogY2xlYW4gcmVzb3VyY2VzICovCisJZnJlZShyZXNvdXJjZXMpOworCWZyZWUoaWJzX3JlcXVlc3QpOworCWZyZWUoaWJfaW5mbyk7CisJZnJlZShwbTQpOworCisJLyogZW5kIG9mIHRlc3QgKi8KKwlyID0gYW1kZ3B1X2NzX2N0eF9mcmVlKGNvbnRleHRfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9jb21tYW5kX3N1Ym1pc3Npb25fc2RtYV93cml0ZV9saW5lYXIodm9pZCkKK3sKKwlhbWRncHVfY29tbWFuZF9zdWJtaXNzaW9uX3dyaXRlX2xpbmVhcl9oZWxwZXIoQU1ER1BVX0hXX0lQX0RNQSk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9jb21tYW5kX3N1Ym1pc3Npb25fY29uc3RfZmlsbF9oZWxwZXIodW5zaWduZWQgaXBfdHlwZSkKK3sKKwljb25zdCBpbnQgc2RtYV93cml0ZV9sZW5ndGggPSAxMDI0ICogMTAyNDsKKwljb25zdCBpbnQgcG00X2R3ID0gMjU2OworCWFtZGdwdV9jb250ZXh0X2hhbmRsZSBjb250ZXh0X2hhbmRsZTsKKwlhbWRncHVfYm9faGFuZGxlIGJvOworCWFtZGdwdV9ib19oYW5kbGUgKnJlc291cmNlczsKKwl1aW50MzJfdCAqcG00OworCXN0cnVjdCBhbWRncHVfY3NfaWJfaW5mbyAqaWJfaW5mbzsKKwlzdHJ1Y3QgYW1kZ3B1X2NzX3JlcXVlc3QgKmlic19yZXF1ZXN0OworCXVpbnQ2NF90IGJvX21jOworCXZvbGF0aWxlIHVpbnQzMl90ICpib19jcHU7CisJaW50IGksIGosIHIsIGxvb3A7CisJdWludDY0X3QgZ3R0X2ZsYWdzWzJdID0gezAsIEFNREdQVV9HRU1fQ1JFQVRFX0NQVV9HVFRfVVNXQ307CisJYW1kZ3B1X3ZhX2hhbmRsZSB2YV9oYW5kbGU7CisKKwlwbTQgPSBjYWxsb2MocG00X2R3LCBzaXplb2YoKnBtNCkpOworCUNVX0FTU0VSVF9OT1RfRVFVQUwocG00LCBOVUxMKTsKKworCWliX2luZm8gPSBjYWxsb2MoMSwgc2l6ZW9mKCppYl9pbmZvKSk7CisJQ1VfQVNTRVJUX05PVF9FUVVBTChpYl9pbmZvLCBOVUxMKTsKKworCWlic19yZXF1ZXN0ID0gY2FsbG9jKDEsIHNpemVvZigqaWJzX3JlcXVlc3QpKTsKKwlDVV9BU1NFUlRfTk9UX0VRVUFMKGlic19yZXF1ZXN0LCBOVUxMKTsKKworCXIgPSBhbWRncHVfY3NfY3R4X2NyZWF0ZShkZXZpY2VfaGFuZGxlLCAmY29udGV4dF9oYW5kbGUpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCS8qIHByZXBhcmUgcmVzb3VyY2UgKi8KKwlyZXNvdXJjZXMgPSBjYWxsb2MoMSwgc2l6ZW9mKGFtZGdwdV9ib19oYW5kbGUpKTsKKwlDVV9BU1NFUlRfTk9UX0VRVUFMKHJlc291cmNlcywgTlVMTCk7CisKKwlsb29wID0gMDsKKwl3aGlsZShsb29wIDwgMikgeworCQkvKiBhbGxvY2F0ZSBVQyBibyBmb3Igc0RNQSB1c2UgKi8KKwkJciA9IGFtZGdwdV9ib19hbGxvY19hbmRfbWFwKGRldmljZV9oYW5kbGUsCisJCQkJCSAgICBzZG1hX3dyaXRlX2xlbmd0aCwgNDA5NiwKKwkJCQkJICAgIEFNREdQVV9HRU1fRE9NQUlOX0dUVCwKKwkJCQkJICAgIGd0dF9mbGFnc1tsb29wXSwgJmJvLCAodm9pZCoqKSZib19jcHUsCisJCQkJCSAgICAmYm9fbWMsICZ2YV9oYW5kbGUpOworCQlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwkJLyogY2xlYXIgYm8gKi8KKwkJbWVtc2V0KCh2b2lkKilib19jcHUsIDAsIHNkbWFfd3JpdGVfbGVuZ3RoKTsKKworCQlyZXNvdXJjZXNbMF0gPSBibzsKKworCQkvKiBmdWxmaWxsIFBNNDogdGVzdCBETUEgY29uc3QgZmlsbCAqLworCQlpID0gaiA9IDA7CisJCWlmIChpcF90eXBlID09IEFNREdQVV9IV19JUF9ETUEpIHsKKwkJCWlmIChmYW1pbHlfaWQgPT0gQU1ER1BVX0ZBTUlMWV9TSSkgeworCQkJCXBtNFtpKytdID0gU0RNQV9QQUNLRVRfU0koU0RNQV9PUENPREVfQ09OU1RBTlRfRklMTF9TSSwgMCwgMCwgMCwKKwkJCQkJCQkgIHNkbWFfd3JpdGVfbGVuZ3RoIC8gNCk7CisJCQkJcG00W2krK10gPSAweGZmZmZmZmZjICYgYm9fbWM7CisJCQkJcG00W2krK10gPSAweGRlYWRiZWFmOworCQkJCXBtNFtpKytdID0gKDB4ZmZmZmZmZmYwMDAwMDAwMCAmIGJvX21jKSA+PiAxNjsKKwkJCX0gZWxzZSB7CisJCQkJcG00W2krK10gPSBTRE1BX1BBQ0tFVChTRE1BX09QQ09ERV9DT05TVEFOVF9GSUxMLCAwLAorCQkJCQkJICAgICAgIFNETUFfQ09OU1RBTlRfRklMTF9FWFRSQV9TSVpFKDIpKTsKKwkJCQlwbTRbaSsrXSA9IDB4ZmZmZmZmZmYgJiBib19tYzsKKwkJCQlwbTRbaSsrXSA9ICgweGZmZmZmZmZmMDAwMDAwMDAgJiBib19tYykgPj4gMzI7CisJCQkJcG00W2krK10gPSAweGRlYWRiZWFmOworCQkJCWlmIChmYW1pbHlfaWQgPj0gQU1ER1BVX0ZBTUlMWV9BSSkKKwkJCQkJcG00W2krK10gPSBzZG1hX3dyaXRlX2xlbmd0aCAtIDE7CisJCQkJZWxzZQorCQkJCQlwbTRbaSsrXSA9IHNkbWFfd3JpdGVfbGVuZ3RoOworCQkJfQorCQl9IGVsc2UgaWYgKChpcF90eXBlID09IEFNREdQVV9IV19JUF9HRlgpIHx8CisJCQkgICAoaXBfdHlwZSA9PSBBTURHUFVfSFdfSVBfQ09NUFVURSkpIHsKKwkJCWlmIChmYW1pbHlfaWQgPT0gQU1ER1BVX0ZBTUlMWV9TSSkgeworCQkJCXBtNFtpKytdID0gUEFDS0VUMyhQQUNLRVQzX0RNQV9EQVRBX1NJLCA0KTsKKwkJCQlwbTRbaSsrXSA9IDB4ZGVhZGJlYWY7CisJCQkJcG00W2krK10gPSBQQUNLRVQzX0RNQV9EQVRBX1NJX0VOR0lORSgwKSB8CisJCQkJCVBBQ0tFVDNfRE1BX0RBVEFfU0lfRFNUX1NFTCgwKSB8CisJCQkJCVBBQ0tFVDNfRE1BX0RBVEFfU0lfU1JDX1NFTCgyKSB8CisJCQkJCVBBQ0tFVDNfRE1BX0RBVEFfU0lfQ1BfU1lOQzsKKwkJCQlwbTRbaSsrXSA9IDB4ZmZmZmZmZmYgJiBib19tYzsKKwkJCQlwbTRbaSsrXSA9ICgweGZmZmZmZmZmMDAwMDAwMDAgJiBib19tYykgPj4gMzI7CisJCQkJcG00W2krK10gPSBzZG1hX3dyaXRlX2xlbmd0aDsKKwkJCX0gZWxzZSB7CisJCQkJcG00W2krK10gPSBQQUNLRVQzKFBBQ0tFVDNfRE1BX0RBVEEsIDUpOworCQkJCXBtNFtpKytdID0gUEFDS0VUM19ETUFfREFUQV9FTkdJTkUoMCkgfAorCQkJCQlQQUNLRVQzX0RNQV9EQVRBX0RTVF9TRUwoMCkgfAorCQkJCQlQQUNLRVQzX0RNQV9EQVRBX1NSQ19TRUwoMikgfAorCQkJCQlQQUNLRVQzX0RNQV9EQVRBX0NQX1NZTkM7CisJCQkJcG00W2krK10gPSAweGRlYWRiZWFmOworCQkJCXBtNFtpKytdID0gMDsKKwkJCQlwbTRbaSsrXSA9IDB4ZmZmZmZmZmMgJiBib19tYzsKKwkJCQlwbTRbaSsrXSA9ICgweGZmZmZmZmZmMDAwMDAwMDAgJiBib19tYykgPj4gMzI7CisJCQkJcG00W2krK10gPSBzZG1hX3dyaXRlX2xlbmd0aDsKKwkJCX0KKwkJfQorCisJCWFtZGdwdV90ZXN0X2V4ZWNfY3NfaGVscGVyKGNvbnRleHRfaGFuZGxlLAorCQkJCQkgICBpcF90eXBlLCAwLAorCQkJCQkgICBpLCBwbTQsCisJCQkJCSAgIDEsIHJlc291cmNlcywKKwkJCQkJICAgaWJfaW5mbywgaWJzX3JlcXVlc3QpOworCisJCS8qIHZlcmlmeSBpZiBTRE1BIHRlc3QgcmVzdWx0IG1lZXRzIHdpdGggZXhwZWN0ZWQgKi8KKwkJaSA9IDA7CisJCXdoaWxlKGkgPCAoc2RtYV93cml0ZV9sZW5ndGggLyA0KSkgeworCQkJQ1VfQVNTRVJUX0VRVUFMKGJvX2NwdVtpKytdLCAweGRlYWRiZWFmKTsKKwkJfQorCisJCXIgPSBhbWRncHVfYm9fdW5tYXBfYW5kX2ZyZWUoYm8sIHZhX2hhbmRsZSwgYm9fbWMsCisJCQkJCSAgICAgc2RtYV93cml0ZV9sZW5ndGgpOworCQlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisJCWxvb3ArKzsKKwl9CisJLyogY2xlYW4gcmVzb3VyY2VzICovCisJZnJlZShyZXNvdXJjZXMpOworCWZyZWUoaWJzX3JlcXVlc3QpOworCWZyZWUoaWJfaW5mbyk7CisJZnJlZShwbTQpOworCisJLyogZW5kIG9mIHRlc3QgKi8KKwlyID0gYW1kZ3B1X2NzX2N0eF9mcmVlKGNvbnRleHRfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9jb21tYW5kX3N1Ym1pc3Npb25fc2RtYV9jb25zdF9maWxsKHZvaWQpCit7CisJYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9jb25zdF9maWxsX2hlbHBlcihBTURHUFVfSFdfSVBfRE1BKTsKK30KKworc3RhdGljIHZvaWQgYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9jb3B5X2xpbmVhcl9oZWxwZXIodW5zaWduZWQgaXBfdHlwZSkKK3sKKwljb25zdCBpbnQgc2RtYV93cml0ZV9sZW5ndGggPSAxMDI0OworCWNvbnN0IGludCBwbTRfZHcgPSAyNTY7CisJYW1kZ3B1X2NvbnRleHRfaGFuZGxlIGNvbnRleHRfaGFuZGxlOworCWFtZGdwdV9ib19oYW5kbGUgYm8xLCBibzI7CisJYW1kZ3B1X2JvX2hhbmRsZSAqcmVzb3VyY2VzOworCXVpbnQzMl90ICpwbTQ7CisJc3RydWN0IGFtZGdwdV9jc19pYl9pbmZvICppYl9pbmZvOworCXN0cnVjdCBhbWRncHVfY3NfcmVxdWVzdCAqaWJzX3JlcXVlc3Q7CisJdWludDY0X3QgYm8xX21jLCBibzJfbWM7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYm8xX2NwdSwgKmJvMl9jcHU7CisJaW50IGksIGosIHIsIGxvb3AxLCBsb29wMjsKKwl1aW50NjRfdCBndHRfZmxhZ3NbMl0gPSB7MCwgQU1ER1BVX0dFTV9DUkVBVEVfQ1BVX0dUVF9VU1dDfTsKKwlhbWRncHVfdmFfaGFuZGxlIGJvMV92YV9oYW5kbGUsIGJvMl92YV9oYW5kbGU7CisKKwlwbTQgPSBjYWxsb2MocG00X2R3LCBzaXplb2YoKnBtNCkpOworCUNVX0FTU0VSVF9OT1RfRVFVQUwocG00LCBOVUxMKTsKKworCWliX2luZm8gPSBjYWxsb2MoMSwgc2l6ZW9mKCppYl9pbmZvKSk7CisJQ1VfQVNTRVJUX05PVF9FUVVBTChpYl9pbmZvLCBOVUxMKTsKKworCWlic19yZXF1ZXN0ID0gY2FsbG9jKDEsIHNpemVvZigqaWJzX3JlcXVlc3QpKTsKKwlDVV9BU1NFUlRfTk9UX0VRVUFMKGlic19yZXF1ZXN0LCBOVUxMKTsKKworCXIgPSBhbWRncHVfY3NfY3R4X2NyZWF0ZShkZXZpY2VfaGFuZGxlLCAmY29udGV4dF9oYW5kbGUpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCS8qIHByZXBhcmUgcmVzb3VyY2UgKi8KKwlyZXNvdXJjZXMgPSBjYWxsb2MoMiwgc2l6ZW9mKGFtZGdwdV9ib19oYW5kbGUpKTsKKwlDVV9BU1NFUlRfTk9UX0VRVUFMKHJlc291cmNlcywgTlVMTCk7CisKKwlsb29wMSA9IGxvb3AyID0gMDsKKwkvKiBydW4gOSBjaXJjbGUgdG8gdGVzdCBhbGwgbWFwcGluZyBjb21iaW5hdGlvbiAqLworCXdoaWxlKGxvb3AxIDwgMikgeworCQl3aGlsZShsb29wMiA8IDIpIHsKKwkJCS8qIGFsbG9jYXRlIFVDIGJvMWZvciBzRE1BIHVzZSAqLworCQkJciA9IGFtZGdwdV9ib19hbGxvY19hbmRfbWFwKGRldmljZV9oYW5kbGUsCisJCQkJCQkgICAgc2RtYV93cml0ZV9sZW5ndGgsIDQwOTYsCisJCQkJCQkgICAgQU1ER1BVX0dFTV9ET01BSU5fR1RULAorCQkJCQkJICAgIGd0dF9mbGFnc1tsb29wMV0sICZibzEsCisJCQkJCQkgICAgKHZvaWQqKikmYm8xX2NwdSwgJmJvMV9tYywKKwkJCQkJCSAgICAmYm8xX3ZhX2hhbmRsZSk7CisJCQlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwkJCS8qIHNldCBibzEgKi8KKwkJCW1lbXNldCgodm9pZCopYm8xX2NwdSwgMHhhYSwgc2RtYV93cml0ZV9sZW5ndGgpOworCisJCQkvKiBhbGxvY2F0ZSBVQyBibzIgZm9yIHNETUEgdXNlICovCisJCQlyID0gYW1kZ3B1X2JvX2FsbG9jX2FuZF9tYXAoZGV2aWNlX2hhbmRsZSwKKwkJCQkJCSAgICBzZG1hX3dyaXRlX2xlbmd0aCwgNDA5NiwKKwkJCQkJCSAgICBBTURHUFVfR0VNX0RPTUFJTl9HVFQsCisJCQkJCQkgICAgZ3R0X2ZsYWdzW2xvb3AyXSwgJmJvMiwKKwkJCQkJCSAgICAodm9pZCoqKSZibzJfY3B1LCAmYm8yX21jLAorCQkJCQkJICAgICZibzJfdmFfaGFuZGxlKTsKKwkJCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCQkJLyogY2xlYXIgYm8yICovCisJCQltZW1zZXQoKHZvaWQqKWJvMl9jcHUsIDAsIHNkbWFfd3JpdGVfbGVuZ3RoKTsKKworCQkJcmVzb3VyY2VzWzBdID0gYm8xOworCQkJcmVzb3VyY2VzWzFdID0gYm8yOworCisJCQkvKiBmdWxmaWxsIFBNNDogdGVzdCBETUEgY29weSBsaW5lYXIgKi8KKwkJCWkgPSBqID0gMDsKKwkJCWlmIChpcF90eXBlID09IEFNREdQVV9IV19JUF9ETUEpIHsKKwkJCQlpZiAoZmFtaWx5X2lkID09IEFNREdQVV9GQU1JTFlfU0kpIHsKKwkJCQkJcG00W2krK10gPSBTRE1BX1BBQ0tFVF9TSShTRE1BX09QQ09ERV9DT1BZX1NJLCAwLCAwLCAwLAorCQkJCQkJCQkgIHNkbWFfd3JpdGVfbGVuZ3RoKTsKKwkJCQkJcG00W2krK10gPSAweGZmZmZmZmZmICYgYm8yX21jOworCQkJCQlwbTRbaSsrXSA9IDB4ZmZmZmZmZmYgJiBibzFfbWM7CisJCQkJCXBtNFtpKytdID0gKDB4ZmZmZmZmZmYwMDAwMDAwMCAmIGJvMl9tYykgPj4gMzI7CisJCQkJCXBtNFtpKytdID0gKDB4ZmZmZmZmZmYwMDAwMDAwMCAmIGJvMV9tYykgPj4gMzI7CisJCQkJfSBlbHNlIHsKKwkJCQkJcG00W2krK10gPSBTRE1BX1BBQ0tFVChTRE1BX09QQ09ERV9DT1BZLCBTRE1BX0NPUFlfU1VCX09QQ09ERV9MSU5FQVIsIDApOworCQkJCQlpZiAoZmFtaWx5X2lkID49IEFNREdQVV9GQU1JTFlfQUkpCisJCQkJCQlwbTRbaSsrXSA9IHNkbWFfd3JpdGVfbGVuZ3RoIC0gMTsKKwkJCQkJZWxzZQorCQkJCQkJcG00W2krK10gPSBzZG1hX3dyaXRlX2xlbmd0aDsKKwkJCQkJcG00W2krK10gPSAwOworCQkJCQlwbTRbaSsrXSA9IDB4ZmZmZmZmZmYgJiBibzFfbWM7CisJCQkJCXBtNFtpKytdID0gKDB4ZmZmZmZmZmYwMDAwMDAwMCAmIGJvMV9tYykgPj4gMzI7CisJCQkJCXBtNFtpKytdID0gMHhmZmZmZmZmZiAmIGJvMl9tYzsKKwkJCQkJcG00W2krK10gPSAoMHhmZmZmZmZmZjAwMDAwMDAwICYgYm8yX21jKSA+PiAzMjsKKwkJCQl9CisKKwkJCX0gZWxzZSBpZiAoKGlwX3R5cGUgPT0gQU1ER1BVX0hXX0lQX0dGWCkgfHwKKwkJCQkgICAoaXBfdHlwZSA9PSBBTURHUFVfSFdfSVBfQ09NUFVURSkpIHsKKwkJCQlpZiAoZmFtaWx5X2lkID09IEFNREdQVV9GQU1JTFlfU0kpIHsKKwkJCQkJcG00W2krK10gPSBQQUNLRVQzKFBBQ0tFVDNfRE1BX0RBVEFfU0ksIDQpOworCQkJCQlwbTRbaSsrXSA9IDB4ZmZmZmZmZmMgJiBibzFfbWM7CisJCQkJCXBtNFtpKytdID0gUEFDS0VUM19ETUFfREFUQV9TSV9FTkdJTkUoMCkgfAorCQkJCQkJUEFDS0VUM19ETUFfREFUQV9TSV9EU1RfU0VMKDApIHwKKwkJCQkJCVBBQ0tFVDNfRE1BX0RBVEFfU0lfU1JDX1NFTCgwKSB8CisJCQkJCQlQQUNLRVQzX0RNQV9EQVRBX1NJX0NQX1NZTkMgfAorCQkJCQkJKDB4ZmZmZjAwMDAwMDAwICYgYm8xX21jKSA+PiAzMjsKKwkJCQkJcG00W2krK10gPSAweGZmZmZmZmZjICYgYm8yX21jOworCQkJCQlwbTRbaSsrXSA9ICgweGZmZmZmZmZmMDAwMDAwMDAgJiBibzJfbWMpID4+IDMyOworCQkJCQlwbTRbaSsrXSA9IHNkbWFfd3JpdGVfbGVuZ3RoOworCQkJCX0gZWxzZSB7CisJCQkJCXBtNFtpKytdID0gUEFDS0VUMyhQQUNLRVQzX0RNQV9EQVRBLCA1KTsKKwkJCQkJcG00W2krK10gPSBQQUNLRVQzX0RNQV9EQVRBX0VOR0lORSgwKSB8CisJCQkJCQlQQUNLRVQzX0RNQV9EQVRBX0RTVF9TRUwoMCkgfAorCQkJCQkJUEFDS0VUM19ETUFfREFUQV9TUkNfU0VMKDApIHwKKwkJCQkJCVBBQ0tFVDNfRE1BX0RBVEFfQ1BfU1lOQzsKKwkJCQkJcG00W2krK10gPSAweGZmZmZmZmZjICYgYm8xX21jOworCQkJCQlwbTRbaSsrXSA9ICgweGZmZmZmZmZmMDAwMDAwMDAgJiBibzFfbWMpID4+IDMyOworCQkJCQlwbTRbaSsrXSA9IDB4ZmZmZmZmZmMgJiBibzJfbWM7CisJCQkJCXBtNFtpKytdID0gKDB4ZmZmZmZmZmYwMDAwMDAwMCAmIGJvMl9tYykgPj4gMzI7CisJCQkJCXBtNFtpKytdID0gc2RtYV93cml0ZV9sZW5ndGg7CisJCQkJfQorCQkJfQorCisJCQlhbWRncHVfdGVzdF9leGVjX2NzX2hlbHBlcihjb250ZXh0X2hhbmRsZSwKKwkJCQkJCSAgIGlwX3R5cGUsIDAsCisJCQkJCQkgICBpLCBwbTQsCisJCQkJCQkgICAyLCByZXNvdXJjZXMsCisJCQkJCQkgICBpYl9pbmZvLCBpYnNfcmVxdWVzdCk7CisKKwkJCS8qIHZlcmlmeSBpZiBTRE1BIHRlc3QgcmVzdWx0IG1lZXRzIHdpdGggZXhwZWN0ZWQgKi8KKwkJCWkgPSAwOworCQkJd2hpbGUoaSA8IHNkbWFfd3JpdGVfbGVuZ3RoKSB7CisJCQkJQ1VfQVNTRVJUX0VRVUFMKGJvMl9jcHVbaSsrXSwgMHhhYSk7CisJCQl9CisJCQlyID0gYW1kZ3B1X2JvX3VubWFwX2FuZF9mcmVlKGJvMSwgYm8xX3ZhX2hhbmRsZSwgYm8xX21jLAorCQkJCQkJICAgICBzZG1hX3dyaXRlX2xlbmd0aCk7CisJCQlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisJCQlyID0gYW1kZ3B1X2JvX3VubWFwX2FuZF9mcmVlKGJvMiwgYm8yX3ZhX2hhbmRsZSwgYm8yX21jLAorCQkJCQkJICAgICBzZG1hX3dyaXRlX2xlbmd0aCk7CisJCQlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisJCQlsb29wMisrOworCQl9CisJCWxvb3AxKys7CisJfQorCS8qIGNsZWFuIHJlc291cmNlcyAqLworCWZyZWUocmVzb3VyY2VzKTsKKwlmcmVlKGlic19yZXF1ZXN0KTsKKwlmcmVlKGliX2luZm8pOworCWZyZWUocG00KTsKKworCS8qIGVuZCBvZiB0ZXN0ICovCisJciA9IGFtZGdwdV9jc19jdHhfZnJlZShjb250ZXh0X2hhbmRsZSk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworfQorCitzdGF0aWMgdm9pZCBhbWRncHVfY29tbWFuZF9zdWJtaXNzaW9uX3NkbWFfY29weV9saW5lYXIodm9pZCkKK3sKKwlhbWRncHVfY29tbWFuZF9zdWJtaXNzaW9uX2NvcHlfbGluZWFyX2hlbHBlcihBTURHUFVfSFdfSVBfRE1BKTsKK30KKworc3RhdGljIHZvaWQgYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9zZG1hKHZvaWQpCit7CisJYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9zZG1hX3dyaXRlX2xpbmVhcigpOworCWFtZGdwdV9jb21tYW5kX3N1Ym1pc3Npb25fc2RtYV9jb25zdF9maWxsKCk7CisJYW1kZ3B1X2NvbW1hbmRfc3VibWlzc2lvbl9zZG1hX2NvcHlfbGluZWFyKCk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9jb21tYW5kX3N1Ym1pc3Npb25fbXVsdGlfZmVuY2Vfd2FpdF9hbGwoYm9vbCB3YWl0X2FsbCkKK3sKKwlhbWRncHVfY29udGV4dF9oYW5kbGUgY29udGV4dF9oYW5kbGU7CisJYW1kZ3B1X2JvX2hhbmRsZSBpYl9yZXN1bHRfaGFuZGxlLCBpYl9yZXN1bHRfY2VfaGFuZGxlOworCXZvaWQgKmliX3Jlc3VsdF9jcHUsICppYl9yZXN1bHRfY2VfY3B1OworCXVpbnQ2NF90IGliX3Jlc3VsdF9tY19hZGRyZXNzLCBpYl9yZXN1bHRfY2VfbWNfYWRkcmVzczsKKwlzdHJ1Y3QgYW1kZ3B1X2NzX3JlcXVlc3QgaWJzX3JlcXVlc3RbMl0gPSB7MH07CisJc3RydWN0IGFtZGdwdV9jc19pYl9pbmZvIGliX2luZm9bMl07CisJc3RydWN0IGFtZGdwdV9jc19mZW5jZSBmZW5jZV9zdGF0dXNbMl0gPSB7MH07CisJdWludDMyX3QgKnB0cjsKKwl1aW50MzJfdCBleHBpcmVkOworCWFtZGdwdV9ib19saXN0X2hhbmRsZSBib19saXN0OworCWFtZGdwdV92YV9oYW5kbGUgdmFfaGFuZGxlLCB2YV9oYW5kbGVfY2U7CisJaW50IHI7CisJaW50IGkgPSAwLCBpYl9jc19udW0gPSAyOworCisJciA9IGFtZGdwdV9jc19jdHhfY3JlYXRlKGRldmljZV9oYW5kbGUsICZjb250ZXh0X2hhbmRsZSk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJciA9IGFtZGdwdV9ib19hbGxvY19hbmRfbWFwKGRldmljZV9oYW5kbGUsIDQwOTYsIDQwOTYsCisJCQkJICAgIEFNREdQVV9HRU1fRE9NQUlOX0dUVCwgMCwKKwkJCQkgICAgJmliX3Jlc3VsdF9oYW5kbGUsICZpYl9yZXN1bHRfY3B1LAorCQkJCSAgICAmaWJfcmVzdWx0X21jX2FkZHJlc3MsICZ2YV9oYW5kbGUpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCXIgPSBhbWRncHVfYm9fYWxsb2NfYW5kX21hcChkZXZpY2VfaGFuZGxlLCA0MDk2LCA0MDk2LAorCQkJCSAgICBBTURHUFVfR0VNX0RPTUFJTl9HVFQsIDAsCisJCQkJICAgICZpYl9yZXN1bHRfY2VfaGFuZGxlLCAmaWJfcmVzdWx0X2NlX2NwdSwKKwkJCQkgICAgJmliX3Jlc3VsdF9jZV9tY19hZGRyZXNzLCAmdmFfaGFuZGxlX2NlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X2dldF9ib19saXN0KGRldmljZV9oYW5kbGUsIGliX3Jlc3VsdF9oYW5kbGUsCisJCQkgICAgICAgaWJfcmVzdWx0X2NlX2hhbmRsZSwgJmJvX2xpc3QpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCW1lbXNldChpYl9pbmZvLCAwLCAyICogc2l6ZW9mKHN0cnVjdCBhbWRncHVfY3NfaWJfaW5mbykpOworCisJLyogSVRfU0VUX0NFX0RFX0NPVU5URVJTICovCisJcHRyID0gaWJfcmVzdWx0X2NlX2NwdTsKKwlpZiAoZmFtaWx5X2lkICE9IEFNREdQVV9GQU1JTFlfU0kpIHsKKwkJcHRyW2krK10gPSAweGMwMDA4OTAwOworCQlwdHJbaSsrXSA9IDA7CisJfQorCXB0cltpKytdID0gMHhjMDAwODQwMDsKKwlwdHJbaSsrXSA9IDE7CisJaWJfaW5mb1swXS5pYl9tY19hZGRyZXNzID0gaWJfcmVzdWx0X2NlX21jX2FkZHJlc3M7CisJaWJfaW5mb1swXS5zaXplID0gaTsKKwlpYl9pbmZvWzBdLmZsYWdzID0gQU1ER1BVX0lCX0ZMQUdfQ0U7CisKKwkvKiBJVF9XQUlUX09OX0NFX0NPVU5URVIgKi8KKwlwdHIgPSBpYl9yZXN1bHRfY3B1OworCXB0clswXSA9IDB4YzAwMDg2MDA7CisJcHRyWzFdID0gMHgwMDAwMDAwMTsKKwlpYl9pbmZvWzFdLmliX21jX2FkZHJlc3MgPSBpYl9yZXN1bHRfbWNfYWRkcmVzczsKKwlpYl9pbmZvWzFdLnNpemUgPSAyOworCisJZm9yIChpID0gMDsgaSA8IGliX2NzX251bTsgaSsrKSB7CisJCWlic19yZXF1ZXN0W2ldLmlwX3R5cGUgPSBBTURHUFVfSFdfSVBfR0ZYOworCQlpYnNfcmVxdWVzdFtpXS5udW1iZXJfb2ZfaWJzID0gMjsKKwkJaWJzX3JlcXVlc3RbaV0uaWJzID0gaWJfaW5mbzsKKwkJaWJzX3JlcXVlc3RbaV0ucmVzb3VyY2VzID0gYm9fbGlzdDsKKwkJaWJzX3JlcXVlc3RbaV0uZmVuY2VfaW5mby5oYW5kbGUgPSBOVUxMOworCX0KKworCXIgPSBhbWRncHVfY3Nfc3VibWl0KGNvbnRleHRfaGFuZGxlLCAwLGlic19yZXF1ZXN0LCBpYl9jc19udW0pOworCisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJZm9yIChpID0gMDsgaSA8IGliX2NzX251bTsgaSsrKSB7CisJCWZlbmNlX3N0YXR1c1tpXS5jb250ZXh0ID0gY29udGV4dF9oYW5kbGU7CisJCWZlbmNlX3N0YXR1c1tpXS5pcF90eXBlID0gQU1ER1BVX0hXX0lQX0dGWDsKKwkJZmVuY2Vfc3RhdHVzW2ldLmZlbmNlID0gaWJzX3JlcXVlc3RbaV0uc2VxX25vOworCX0KKworCXIgPSBhbWRncHVfY3Nfd2FpdF9mZW5jZXMoZmVuY2Vfc3RhdHVzLCBpYl9jc19udW0sIHdhaXRfYWxsLAorCQkJCUFNREdQVV9USU1FT1VUX0lORklOSVRFLAorCQkJCSZleHBpcmVkLCBOVUxMKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X2JvX3VubWFwX2FuZF9mcmVlKGliX3Jlc3VsdF9oYW5kbGUsIHZhX2hhbmRsZSwKKwkJCQkgICAgIGliX3Jlc3VsdF9tY19hZGRyZXNzLCA0MDk2KTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X2JvX3VubWFwX2FuZF9mcmVlKGliX3Jlc3VsdF9jZV9oYW5kbGUsIHZhX2hhbmRsZV9jZSwKKwkJCQkgICAgIGliX3Jlc3VsdF9jZV9tY19hZGRyZXNzLCA0MDk2KTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X2JvX2xpc3RfZGVzdHJveShib19saXN0KTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X2NzX2N0eF9mcmVlKGNvbnRleHRfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9jb21tYW5kX3N1Ym1pc3Npb25fbXVsdGlfZmVuY2Uodm9pZCkKK3sKKwlhbWRncHVfY29tbWFuZF9zdWJtaXNzaW9uX211bHRpX2ZlbmNlX3dhaXRfYWxsKHRydWUpOworCWFtZGdwdV9jb21tYW5kX3N1Ym1pc3Npb25fbXVsdGlfZmVuY2Vfd2FpdF9hbGwoZmFsc2UpOworfQorCitzdGF0aWMgdm9pZCBhbWRncHVfdXNlcnB0cl90ZXN0KHZvaWQpCit7CisJaW50IGksIHIsIGo7CisJdWludDMyX3QgKnBtNCA9IE5VTEw7CisJdWludDY0X3QgYm9fbWM7CisJdm9pZCAqcHRyID0gTlVMTDsKKwlpbnQgcG00X2R3ID0gMjU2OworCWludCBzZG1hX3dyaXRlX2xlbmd0aCA9IDQ7CisJYW1kZ3B1X2JvX2hhbmRsZSBoYW5kbGU7CisJYW1kZ3B1X2NvbnRleHRfaGFuZGxlIGNvbnRleHRfaGFuZGxlOworCXN0cnVjdCBhbWRncHVfY3NfaWJfaW5mbyAqaWJfaW5mbzsKKwlzdHJ1Y3QgYW1kZ3B1X2NzX3JlcXVlc3QgKmlic19yZXF1ZXN0OworCWFtZGdwdV9ib19oYW5kbGUgYnVmX2hhbmRsZTsKKwlhbWRncHVfdmFfaGFuZGxlIHZhX2hhbmRsZTsKKworCXBtNCA9IGNhbGxvYyhwbTRfZHcsIHNpemVvZigqcG00KSk7CisJQ1VfQVNTRVJUX05PVF9FUVVBTChwbTQsIE5VTEwpOworCisJaWJfaW5mbyA9IGNhbGxvYygxLCBzaXplb2YoKmliX2luZm8pKTsKKwlDVV9BU1NFUlRfTk9UX0VRVUFMKGliX2luZm8sIE5VTEwpOworCisJaWJzX3JlcXVlc3QgPSBjYWxsb2MoMSwgc2l6ZW9mKCppYnNfcmVxdWVzdCkpOworCUNVX0FTU0VSVF9OT1RfRVFVQUwoaWJzX3JlcXVlc3QsIE5VTEwpOworCisJciA9IGFtZGdwdV9jc19jdHhfY3JlYXRlKGRldmljZV9oYW5kbGUsICZjb250ZXh0X2hhbmRsZSk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJcG9zaXhfbWVtYWxpZ24oJnB0ciwgc3lzY29uZihfU0NfUEFHRV9TSVpFKSwgQlVGRkVSX1NJWkUpOworCUNVX0FTU0VSVF9OT1RfRVFVQUwocHRyLCBOVUxMKTsKKwltZW1zZXQocHRyLCAwLCBCVUZGRVJfU0laRSk7CisKKwlyID0gYW1kZ3B1X2NyZWF0ZV9ib19mcm9tX3VzZXJfbWVtKGRldmljZV9oYW5kbGUsCisJCQkJCSAgIHB0ciwgQlVGRkVSX1NJWkUsICZidWZfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X3ZhX3JhbmdlX2FsbG9jKGRldmljZV9oYW5kbGUsCisJCQkJICBhbWRncHVfZ3B1X3ZhX3JhbmdlX2dlbmVyYWwsCisJCQkJICBCVUZGRVJfU0laRSwgMSwgMCwgJmJvX21jLAorCQkJCSAgJnZhX2hhbmRsZSwgMCk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJciA9IGFtZGdwdV9ib192YV9vcChidWZfaGFuZGxlLCAwLCBCVUZGRVJfU0laRSwgYm9fbWMsIDAsIEFNREdQVV9WQV9PUF9NQVApOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCWhhbmRsZSA9IGJ1Zl9oYW5kbGU7CisKKwlqID0gaSA9IDA7CisKKwlpZiAoZmFtaWx5X2lkID09IEFNREdQVV9GQU1JTFlfU0kpCisJCXBtNFtpKytdID0gU0RNQV9QQUNLRVRfU0koU0RNQV9PUENPREVfV1JJVEUsIDAsIDAsIDAsCisJCQkJc2RtYV93cml0ZV9sZW5ndGgpOworCWVsc2UKKwkJcG00W2krK10gPSBTRE1BX1BBQ0tFVChTRE1BX09QQ09ERV9XUklURSwKKwkJCQlTRE1BX1dSSVRFX1NVQl9PUENPREVfTElORUFSLCAwKTsKKwlwbTRbaSsrXSA9IDB4ZmZmZmZmZmYgJiBib19tYzsKKwlwbTRbaSsrXSA9ICgweGZmZmZmZmZmMDAwMDAwMDAgJiBib19tYykgPj4gMzI7CisJaWYgKGZhbWlseV9pZCA+PSBBTURHUFVfRkFNSUxZX0FJKQorCQlwbTRbaSsrXSA9IHNkbWFfd3JpdGVfbGVuZ3RoIC0gMTsKKwllbHNlIGlmIChmYW1pbHlfaWQgIT0gQU1ER1BVX0ZBTUlMWV9TSSkKKwkJcG00W2krK10gPSBzZG1hX3dyaXRlX2xlbmd0aDsKKworCXdoaWxlIChqKysgPCBzZG1hX3dyaXRlX2xlbmd0aCkKKwkJcG00W2krK10gPSAweGRlYWRiZWFmOworCisJaWYgKCFmb3JrKCkpIHsKKwkJcG00WzBdID0gMHgwOworCQlleGl0KDApOworCX0KKworCWFtZGdwdV90ZXN0X2V4ZWNfY3NfaGVscGVyKGNvbnRleHRfaGFuZGxlLAorCQkJCSAgIEFNREdQVV9IV19JUF9ETUEsIDAsCisJCQkJICAgaSwgcG00LAorCQkJCSAgIDEsICZoYW5kbGUsCisJCQkJICAgaWJfaW5mbywgaWJzX3JlcXVlc3QpOworCWkgPSAwOworCXdoaWxlIChpIDwgc2RtYV93cml0ZV9sZW5ndGgpIHsKKwkJQ1VfQVNTRVJUX0VRVUFMKCgoaW50KilwdHIpW2krK10sIDB4ZGVhZGJlYWYpOworCX0KKwlmcmVlKGlic19yZXF1ZXN0KTsKKwlmcmVlKGliX2luZm8pOworCWZyZWUocG00KTsKKworCXIgPSBhbWRncHVfYm9fdmFfb3AoYnVmX2hhbmRsZSwgMCwgQlVGRkVSX1NJWkUsIGJvX21jLCAwLCBBTURHUFVfVkFfT1BfVU5NQVApOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKwlyID0gYW1kZ3B1X3ZhX3JhbmdlX2ZyZWUodmFfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisJciA9IGFtZGdwdV9ib19mcmVlKGJ1Zl9oYW5kbGUpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKwlmcmVlKHB0cik7CisKKwlyID0gYW1kZ3B1X2NzX2N0eF9mcmVlKGNvbnRleHRfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwl3YWl0KE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYW1kZ3B1L2JvX3Rlc3RzLmMgYi90ZXN0cy9hbWRncHUvYm9fdGVzdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGI1ZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYW1kZ3B1L2JvX3Rlc3RzLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIkNVbml0L0Jhc2ljLmgiCisKKyNpbmNsdWRlICJhbWRncHVfdGVzdC5oIgorI2luY2x1ZGUgImFtZGdwdV9kcm0uaCIKKworI2RlZmluZSBCVUZGRVJfU0laRSAoNCoxMDI0KQorI2RlZmluZSBCVUZGRVJfQUxJR04gKDQqMTAyNCkKKworc3RhdGljIGFtZGdwdV9kZXZpY2VfaGFuZGxlIGRldmljZV9oYW5kbGU7CitzdGF0aWMgdWludDMyX3QgbWFqb3JfdmVyc2lvbjsKK3N0YXRpYyB1aW50MzJfdCBtaW5vcl92ZXJzaW9uOworCitzdGF0aWMgYW1kZ3B1X2JvX2hhbmRsZSBidWZmZXJfaGFuZGxlOworc3RhdGljIHVpbnQ2NF90IHZpcnR1YWxfbWNfYmFzZV9hZGRyZXNzOworc3RhdGljIGFtZGdwdV92YV9oYW5kbGUgdmFfaGFuZGxlOworCitzdGF0aWMgdm9pZCBhbWRncHVfYm9fZXhwb3J0X2ltcG9ydCh2b2lkKTsKK3N0YXRpYyB2b2lkIGFtZGdwdV9ib19tZXRhZGF0YSh2b2lkKTsKK3N0YXRpYyB2b2lkIGFtZGdwdV9ib19tYXBfdW5tYXAodm9pZCk7CisKK0NVX1Rlc3RJbmZvIGJvX3Rlc3RzW10gPSB7CisJeyAiRXhwb3J0L0ltcG9ydCIsICBhbWRncHVfYm9fZXhwb3J0X2ltcG9ydCB9LAorI2lmIDAKKwl7ICJNZXRhZGF0YSIsICBhbWRncHVfYm9fbWV0YWRhdGEgfSwKKyNlbmRpZgorCXsgIkNQVSBtYXAvdW5tYXAiLCAgYW1kZ3B1X2JvX21hcF91bm1hcCB9LAorCUNVX1RFU1RfSU5GT19OVUxMLAorfTsKKworaW50IHN1aXRlX2JvX3Rlc3RzX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgYW1kZ3B1X2JvX2FsbG9jX3JlcXVlc3QgcmVxID0gezB9OworCWFtZGdwdV9ib19oYW5kbGUgYnVmX2hhbmRsZTsKKwl1aW50NjRfdCB2YTsKKwlpbnQgcjsKKworCXIgPSBhbWRncHVfZGV2aWNlX2luaXRpYWxpemUoZHJtX2FtZGdwdVswXSwgJm1ham9yX3ZlcnNpb24sCisJCQkJICAmbWlub3JfdmVyc2lvbiwgJmRldmljZV9oYW5kbGUpOworCWlmIChyKSB7CisJCWlmICgociA9PSAtRUFDQ0VTKSAmJiAoZXJybm8gPT0gRUFDQ0VTKSkKKwkJCXByaW50ZigiXG5cbkVycm9yOiVzLiAiCisJCQkJIkhpbnQ6VHJ5IHRvIHJ1biB0aGlzIHRlc3QgcHJvZ3JhbSBhcyByb290LiIsCisJCQkJc3RyZXJyb3IoZXJybm8pKTsKKworCQlyZXR1cm4gQ1VFX1NJTklUX0ZBSUxFRDsKKwl9CisKKwlyZXEuYWxsb2Nfc2l6ZSA9IEJVRkZFUl9TSVpFOworCXJlcS5waHlzX2FsaWdubWVudCA9IEJVRkZFUl9BTElHTjsKKwlyZXEucHJlZmVycmVkX2hlYXAgPSBBTURHUFVfR0VNX0RPTUFJTl9HVFQ7CisKKwlyID0gYW1kZ3B1X2JvX2FsbG9jKGRldmljZV9oYW5kbGUsICZyZXEsICZidWZfaGFuZGxlKTsKKwlpZiAocikKKwkJcmV0dXJuIENVRV9TSU5JVF9GQUlMRUQ7CisKKwlyID0gYW1kZ3B1X3ZhX3JhbmdlX2FsbG9jKGRldmljZV9oYW5kbGUsCisJCQkJICBhbWRncHVfZ3B1X3ZhX3JhbmdlX2dlbmVyYWwsCisJCQkJICBCVUZGRVJfU0laRSwgQlVGRkVSX0FMSUdOLCAwLAorCQkJCSAgJnZhLCAmdmFfaGFuZGxlLCAwKTsKKwlpZiAocikKKwkJZ290byBlcnJvcl92YV9hbGxvYzsKKworCXIgPSBhbWRncHVfYm9fdmFfb3AoYnVmX2hhbmRsZSwgMCwgQlVGRkVSX1NJWkUsIHZhLCAwLCBBTURHUFVfVkFfT1BfTUFQKTsKKwlpZiAocikKKwkJZ290byBlcnJvcl92YV9tYXA7CisKKwlidWZmZXJfaGFuZGxlID0gYnVmX2hhbmRsZTsKKwl2aXJ0dWFsX21jX2Jhc2VfYWRkcmVzcyA9IHZhOworCisJcmV0dXJuIENVRV9TVUNDRVNTOworCitlcnJvcl92YV9tYXA6CisJYW1kZ3B1X3ZhX3JhbmdlX2ZyZWUodmFfaGFuZGxlKTsKKworZXJyb3JfdmFfYWxsb2M6CisJYW1kZ3B1X2JvX2ZyZWUoYnVmX2hhbmRsZSk7CisJcmV0dXJuIENVRV9TSU5JVF9GQUlMRUQ7Cit9CisKK2ludCBzdWl0ZV9ib190ZXN0c19jbGVhbih2b2lkKQoreworCWludCByOworCisJciA9IGFtZGdwdV9ib192YV9vcChidWZmZXJfaGFuZGxlLCAwLCBCVUZGRVJfU0laRSwKKwkJCSAgICB2aXJ0dWFsX21jX2Jhc2VfYWRkcmVzcywgMCwKKwkJCSAgICBBTURHUFVfVkFfT1BfVU5NQVApOworCWlmIChyKQorCQlyZXR1cm4gQ1VFX1NDTEVBTl9GQUlMRUQ7CisKKwlyID0gYW1kZ3B1X3ZhX3JhbmdlX2ZyZWUodmFfaGFuZGxlKTsKKwlpZiAocikKKwkJcmV0dXJuIENVRV9TQ0xFQU5fRkFJTEVEOworCisJciA9IGFtZGdwdV9ib19mcmVlKGJ1ZmZlcl9oYW5kbGUpOworCWlmIChyKQorCQlyZXR1cm4gQ1VFX1NDTEVBTl9GQUlMRUQ7CisKKwlyID0gYW1kZ3B1X2RldmljZV9kZWluaXRpYWxpemUoZGV2aWNlX2hhbmRsZSk7CisJaWYgKHIpCisJCXJldHVybiBDVUVfU0NMRUFOX0ZBSUxFRDsKKworCXJldHVybiBDVUVfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgYW1kZ3B1X2JvX2V4cG9ydF9pbXBvcnRfZG9fdHlwZShlbnVtIGFtZGdwdV9ib19oYW5kbGVfdHlwZSB0eXBlKQoreworCXN0cnVjdCBhbWRncHVfYm9faW1wb3J0X3Jlc3VsdCByZXMgPSB7MH07CisJdWludDMyX3Qgc2hhcmVkX2hhbmRsZTsKKwlpbnQgcjsKKworCXIgPSBhbWRncHVfYm9fZXhwb3J0KGJ1ZmZlcl9oYW5kbGUsIHR5cGUsICZzaGFyZWRfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X2JvX2ltcG9ydChkZXZpY2VfaGFuZGxlLCB0eXBlLCBzaGFyZWRfaGFuZGxlLCAmcmVzKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlDVV9BU1NFUlRfRVFVQUwocmVzLmJ1Zl9oYW5kbGUsIGJ1ZmZlcl9oYW5kbGUpOworCUNVX0FTU0VSVF9FUVVBTChyZXMuYWxsb2Nfc2l6ZSwgQlVGRkVSX1NJWkUpOworCisJciA9IGFtZGdwdV9ib19mcmVlKHJlcy5idWZfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9ib19leHBvcnRfaW1wb3J0KHZvaWQpCit7CisJaWYgKG9wZW5fcmVuZGVyX25vZGUpIHsKKwkJcHJpbnRmKCIoRFJNIHJlbmRlciBub2RlIGlzIHVzZWQuIFNraXAgZXhwb3J0L0ltcG9ydCB0ZXN0KSAiKTsKKwkJcmV0dXJuOworCX0KKworCWFtZGdwdV9ib19leHBvcnRfaW1wb3J0X2RvX3R5cGUoYW1kZ3B1X2JvX2hhbmRsZV90eXBlX2dlbV9mbGlua19uYW1lKTsKKwlhbWRncHVfYm9fZXhwb3J0X2ltcG9ydF9kb190eXBlKGFtZGdwdV9ib19oYW5kbGVfdHlwZV9kbWFfYnVmX2ZkKTsKK30KKworc3RhdGljIHZvaWQgYW1kZ3B1X2JvX21ldGFkYXRhKHZvaWQpCit7CisJc3RydWN0IGFtZGdwdV9ib19tZXRhZGF0YSBtZXRhID0gezB9OworCXN0cnVjdCBhbWRncHVfYm9faW5mbyBpbmZvID0gezB9OworCWludCByOworCisJbWV0YS5zaXplX21ldGFkYXRhID0gMTsKKwltZXRhLnVtZF9tZXRhZGF0YVswXSA9IDB4ZGVhZGJlZWY7CisKKwlyID0gYW1kZ3B1X2JvX3NldF9tZXRhZGF0YShidWZmZXJfaGFuZGxlLCAmbWV0YSk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJciA9IGFtZGdwdV9ib19xdWVyeV9pbmZvKGJ1ZmZlcl9oYW5kbGUsICZpbmZvKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlDVV9BU1NFUlRfRVFVQUwoaW5mby5tZXRhZGF0YS5zaXplX21ldGFkYXRhLCAxKTsKKwlDVV9BU1NFUlRfRVFVQUwoaW5mby5tZXRhZGF0YS51bWRfbWV0YWRhdGFbMF0sIDB4ZGVhZGJlZWYpOworfQorCitzdGF0aWMgdm9pZCBhbWRncHVfYm9fbWFwX3VubWFwKHZvaWQpCit7CisJdWludDMyX3QgKnB0cjsKKwlpbnQgaSwgcjsKKworCXIgPSBhbWRncHVfYm9fY3B1X21hcChidWZmZXJfaGFuZGxlLCAodm9pZCAqKikmcHRyKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisJQ1VfQVNTRVJUX05PVF9FUVVBTChwdHIsIE5VTEwpOworCisJZm9yIChpID0gMDsgaSA8IChCVUZGRVJfU0laRSAvIDQpOyArK2kpCisJCXB0cltpXSA9IDB4ZGVhZGJlZWY7CisKKwlyID0gYW1kZ3B1X2JvX2NwdV91bm1hcChidWZmZXJfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hbWRncHUvY3NfdGVzdHMuYyBiL3Rlc3RzL2FtZGdwdS9jc190ZXN0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMmYxN2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hbWRncHUvY3NfdGVzdHMuYwpAQCAtMCwwICsxLDQ3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiQ1VuaXQvQmFzaWMuaCIKKworI2luY2x1ZGUgInV0aWxfbWF0aC5oIgorCisjaW5jbHVkZSAiYW1kZ3B1X3Rlc3QuaCIKKyNpbmNsdWRlICJkZWNvZGVfbWVzc2FnZXMuaCIKKyNpbmNsdWRlICJhbWRncHVfZHJtLmgiCisjaW5jbHVkZSAiYW1kZ3B1X2ludGVybmFsLmgiCisKKyNkZWZpbmUgSUJfU0laRQkJNDA5NgorI2RlZmluZSBNQVhfUkVTT1VSQ0VTCTE2CisKK3N0YXRpYyBhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXZpY2VfaGFuZGxlOworc3RhdGljIHVpbnQzMl90IG1ham9yX3ZlcnNpb247CitzdGF0aWMgdWludDMyX3QgbWlub3JfdmVyc2lvbjsKK3N0YXRpYyB1aW50MzJfdCBmYW1pbHlfaWQ7CitzdGF0aWMgdWludDMyX3QgY2hpcF9yZXY7CitzdGF0aWMgdWludDMyX3QgY2hpcF9pZDsKKworc3RhdGljIGFtZGdwdV9jb250ZXh0X2hhbmRsZSBjb250ZXh0X2hhbmRsZTsKK3N0YXRpYyBhbWRncHVfYm9faGFuZGxlIGliX2hhbmRsZTsKK3N0YXRpYyB1aW50NjRfdCBpYl9tY19hZGRyZXNzOworc3RhdGljIHVpbnQzMl90ICppYl9jcHU7CitzdGF0aWMgYW1kZ3B1X3ZhX2hhbmRsZSBpYl92YV9oYW5kbGU7CisKK3N0YXRpYyBhbWRncHVfYm9faGFuZGxlIHJlc291cmNlc1tNQVhfUkVTT1VSQ0VTXTsKK3N0YXRpYyB1bnNpZ25lZCBudW1fcmVzb3VyY2VzOworCitzdGF0aWMgdm9pZCBhbWRncHVfY3NfdXZkX2NyZWF0ZSh2b2lkKTsKK3N0YXRpYyB2b2lkIGFtZGdwdV9jc191dmRfZGVjb2RlKHZvaWQpOworc3RhdGljIHZvaWQgYW1kZ3B1X2NzX3V2ZF9kZXN0cm95KHZvaWQpOworCitDVV9UZXN0SW5mbyBjc190ZXN0c1tdID0geworCXsgIlVWRCBjcmVhdGUiLCAgYW1kZ3B1X2NzX3V2ZF9jcmVhdGUgfSwKKwl7ICJVVkQgZGVjb2RlIiwgIGFtZGdwdV9jc191dmRfZGVjb2RlIH0sCisJeyAiVVZEIGRlc3Ryb3kiLCAgYW1kZ3B1X2NzX3V2ZF9kZXN0cm95IH0sCisJQ1VfVEVTVF9JTkZPX05VTEwsCit9OworCitpbnQgc3VpdGVfY3NfdGVzdHNfaW5pdCh2b2lkKQoreworCWFtZGdwdV9ib19oYW5kbGUgaWJfcmVzdWx0X2hhbmRsZTsKKwl2b2lkICppYl9yZXN1bHRfY3B1OworCXVpbnQ2NF90IGliX3Jlc3VsdF9tY19hZGRyZXNzOworCWFtZGdwdV92YV9oYW5kbGUgaWJfcmVzdWx0X3ZhX2hhbmRsZTsKKwlpbnQgcjsKKworCXIgPSBhbWRncHVfZGV2aWNlX2luaXRpYWxpemUoZHJtX2FtZGdwdVswXSwgJm1ham9yX3ZlcnNpb24sCisJCQkJICAgICAmbWlub3JfdmVyc2lvbiwgJmRldmljZV9oYW5kbGUpOworCWlmIChyKSB7CisJCWlmICgociA9PSAtRUFDQ0VTKSAmJiAoZXJybm8gPT0gRUFDQ0VTKSkKKwkJCXByaW50ZigiXG5cbkVycm9yOiVzLiAiCisJCQkJIkhpbnQ6VHJ5IHRvIHJ1biB0aGlzIHRlc3QgcHJvZ3JhbSBhcyByb290LiIsCisJCQkJc3RyZXJyb3IoZXJybm8pKTsKKworCQlyZXR1cm4gQ1VFX1NJTklUX0ZBSUxFRDsKKwl9CisKKwlmYW1pbHlfaWQgPSBkZXZpY2VfaGFuZGxlLT5pbmZvLmZhbWlseV9pZDsKKwkvKiBWSSBhc2ljIFBPTEFSSVMxMC8xMSBoYXZlIHNwZWNpZmljIGV4dGVybmFsX3Jldl9pZCAqLworCWNoaXBfcmV2ID0gZGV2aWNlX2hhbmRsZS0+aW5mby5jaGlwX3JldjsKKwljaGlwX2lkID0gZGV2aWNlX2hhbmRsZS0+aW5mby5jaGlwX2V4dGVybmFsX3JldjsKKworCWlmIChmYW1pbHlfaWQgPj0gQU1ER1BVX0ZBTUlMWV9SViB8fCBmYW1pbHlfaWQgPT0gQU1ER1BVX0ZBTUlMWV9TSSkgeworCQlwcmludGYoIlxuXG5UaGUgQVNJQyBOT1Qgc3VwcG9ydCBVVkQsIGFsbCBzdWItdGVzdHMgd2lsbCBwYXNzXG4iKTsKKwkJcmV0dXJuIENVRV9TVUNDRVNTOworCX0KKworCXIgPSBhbWRncHVfY3NfY3R4X2NyZWF0ZShkZXZpY2VfaGFuZGxlLCAmY29udGV4dF9oYW5kbGUpOworCWlmIChyKQorCQlyZXR1cm4gQ1VFX1NJTklUX0ZBSUxFRDsKKworCXIgPSBhbWRncHVfYm9fYWxsb2NfYW5kX21hcChkZXZpY2VfaGFuZGxlLCBJQl9TSVpFLCA0MDk2LAorCQkJCSAgICBBTURHUFVfR0VNX0RPTUFJTl9HVFQsIDAsCisJCQkJICAgICZpYl9yZXN1bHRfaGFuZGxlLCAmaWJfcmVzdWx0X2NwdSwKKwkJCQkgICAgJmliX3Jlc3VsdF9tY19hZGRyZXNzLAorCQkJCSAgICAmaWJfcmVzdWx0X3ZhX2hhbmRsZSk7CisJaWYgKHIpCisJCXJldHVybiBDVUVfU0lOSVRfRkFJTEVEOworCisJaWJfaGFuZGxlID0gaWJfcmVzdWx0X2hhbmRsZTsKKwlpYl9tY19hZGRyZXNzID0gaWJfcmVzdWx0X21jX2FkZHJlc3M7CisJaWJfY3B1ID0gaWJfcmVzdWx0X2NwdTsKKwlpYl92YV9oYW5kbGUgPSBpYl9yZXN1bHRfdmFfaGFuZGxlOworCisJcmV0dXJuIENVRV9TVUNDRVNTOworfQorCitpbnQgc3VpdGVfY3NfdGVzdHNfY2xlYW4odm9pZCkKK3sKKwlpbnQgcjsKKworCWlmIChmYW1pbHlfaWQgPj0gQU1ER1BVX0ZBTUlMWV9SViB8fCBmYW1pbHlfaWQgPT0gQU1ER1BVX0ZBTUlMWV9TSSkgeworCQlyID0gYW1kZ3B1X2RldmljZV9kZWluaXRpYWxpemUoZGV2aWNlX2hhbmRsZSk7CisJCWlmIChyKQorCQkJcmV0dXJuIENVRV9TQ0xFQU5fRkFJTEVEOworCX0gZWxzZSB7CisJCXIgPSBhbWRncHVfYm9fdW5tYXBfYW5kX2ZyZWUoaWJfaGFuZGxlLCBpYl92YV9oYW5kbGUsCisJCQkJCSAgICAgaWJfbWNfYWRkcmVzcywgSUJfU0laRSk7CisJCWlmIChyKQorCQkJcmV0dXJuIENVRV9TQ0xFQU5fRkFJTEVEOworCisJCXIgPSBhbWRncHVfY3NfY3R4X2ZyZWUoY29udGV4dF9oYW5kbGUpOworCQlpZiAocikKKwkJCXJldHVybiBDVUVfU0NMRUFOX0ZBSUxFRDsKKworCQlyID0gYW1kZ3B1X2RldmljZV9kZWluaXRpYWxpemUoZGV2aWNlX2hhbmRsZSk7CisJCWlmIChyKQorCQkJcmV0dXJuIENVRV9TQ0xFQU5fRkFJTEVEOworCX0KKworCXJldHVybiBDVUVfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzdWJtaXQodW5zaWduZWQgbmR3LCB1bnNpZ25lZCBpcCkKK3sKKwlzdHJ1Y3QgYW1kZ3B1X2NzX3JlcXVlc3QgaWJzX3JlcXVlc3QgPSB7MH07CisJc3RydWN0IGFtZGdwdV9jc19pYl9pbmZvIGliX2luZm8gPSB7MH07CisJc3RydWN0IGFtZGdwdV9jc19mZW5jZSBmZW5jZV9zdGF0dXMgPSB7MH07CisJdWludDMyX3QgZXhwaXJlZDsKKwlpbnQgcjsKKworCWliX2luZm8uaWJfbWNfYWRkcmVzcyA9IGliX21jX2FkZHJlc3M7CisJaWJfaW5mby5zaXplID0gbmR3OworCisJaWJzX3JlcXVlc3QuaXBfdHlwZSA9IGlwOworCisJciA9IGFtZGdwdV9ib19saXN0X2NyZWF0ZShkZXZpY2VfaGFuZGxlLCBudW1fcmVzb3VyY2VzLCByZXNvdXJjZXMsCisJCQkJICBOVUxMLCAmaWJzX3JlcXVlc3QucmVzb3VyY2VzKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpYnNfcmVxdWVzdC5udW1iZXJfb2ZfaWJzID0gMTsKKwlpYnNfcmVxdWVzdC5pYnMgPSAmaWJfaW5mbzsKKwlpYnNfcmVxdWVzdC5mZW5jZV9pbmZvLmhhbmRsZSA9IE5VTEw7CisKKwlyID0gYW1kZ3B1X2NzX3N1Ym1pdChjb250ZXh0X2hhbmRsZSwgMCwgJmlic19yZXF1ZXN0LCAxKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gYW1kZ3B1X2JvX2xpc3RfZGVzdHJveShpYnNfcmVxdWVzdC5yZXNvdXJjZXMpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWZlbmNlX3N0YXR1cy5jb250ZXh0ID0gY29udGV4dF9oYW5kbGU7CisJZmVuY2Vfc3RhdHVzLmlwX3R5cGUgPSBpcDsKKwlmZW5jZV9zdGF0dXMuZmVuY2UgPSBpYnNfcmVxdWVzdC5zZXFfbm87CisKKwlyID0gYW1kZ3B1X2NzX3F1ZXJ5X2ZlbmNlX3N0YXR1cygmZmVuY2Vfc3RhdHVzLAorCQkJCQkgQU1ER1BVX1RJTUVPVVRfSU5GSU5JVEUsCisJCQkJCSAwLCAmZXhwaXJlZCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHV2ZF9jbWQodWludDY0X3QgYWRkciwgdW5zaWduZWQgY21kLCBpbnQgKmlkeCkKK3sKKwlpYl9jcHVbKCppZHgpKytdID0gKGZhbWlseV9pZCA8IEFNREdQVV9GQU1JTFlfQUkpID8gMHgzQkM0IDogMHg4MUM0OworCWliX2NwdVsoKmlkeCkrK10gPSBhZGRyOworCWliX2NwdVsoKmlkeCkrK10gPSAoZmFtaWx5X2lkIDwgQU1ER1BVX0ZBTUlMWV9BSSkgPyAweDNCQzUgOiAweDgxQzU7CisJaWJfY3B1WygqaWR4KSsrXSA9IGFkZHIgPj4gMzI7CisJaWJfY3B1WygqaWR4KSsrXSA9IChmYW1pbHlfaWQgPCBBTURHUFVfRkFNSUxZX0FJKSA/IDB4M0JDMyA6IDB4ODFDMzsKKwlpYl9jcHVbKCppZHgpKytdID0gY21kIDw8IDE7Cit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9jc191dmRfY3JlYXRlKHZvaWQpCit7CisJc3RydWN0IGFtZGdwdV9ib19hbGxvY19yZXF1ZXN0IHJlcSA9IHswfTsKKwlhbWRncHVfYm9faGFuZGxlIGJ1Zl9oYW5kbGU7CisJdWludDY0X3QgdmEgPSAwOworCWFtZGdwdV92YV9oYW5kbGUgdmFfaGFuZGxlOworCXZvaWQgKm1zZzsKKwlpbnQgaSwgcjsKKworCWlmIChmYW1pbHlfaWQgPj0gQU1ER1BVX0ZBTUlMWV9SViB8fCBmYW1pbHlfaWQgPT0gQU1ER1BVX0ZBTUlMWV9TSSkKKwkJcmV0dXJuOworCisJcmVxLmFsbG9jX3NpemUgPSA0KjEwMjQ7CisJcmVxLnByZWZlcnJlZF9oZWFwID0gQU1ER1BVX0dFTV9ET01BSU5fR1RUOworCisJciA9IGFtZGdwdV9ib19hbGxvYyhkZXZpY2VfaGFuZGxlLCAmcmVxLCAmYnVmX2hhbmRsZSk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJciA9IGFtZGdwdV92YV9yYW5nZV9hbGxvYyhkZXZpY2VfaGFuZGxlLAorCQkJCSAgYW1kZ3B1X2dwdV92YV9yYW5nZV9nZW5lcmFsLAorCQkJCSAgNDA5NiwgMSwgMCwgJnZhLAorCQkJCSAgJnZhX2hhbmRsZSwgMCk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJciA9IGFtZGdwdV9ib192YV9vcChidWZfaGFuZGxlLCAwLCA0MDk2LCB2YSwgMCwgQU1ER1BVX1ZBX09QX01BUCk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJciA9IGFtZGdwdV9ib19jcHVfbWFwKGJ1Zl9oYW5kbGUsICZtc2cpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCW1lbWNweShtc2csIHV2ZF9jcmVhdGVfbXNnLCBzaXplb2YodXZkX2NyZWF0ZV9tc2cpKTsKKworCWlmIChmYW1pbHlfaWQgPj0gQU1ER1BVX0ZBTUlMWV9WSSkgeworCQkoKHVpbnQ4X3QqKW1zZylbMHgxMF0gPSA3OworCQkvKiBjaGlwIGJleW9uZCBwb2xhcmlzIDEwLzExICovCisJCWlmICgoZmFtaWx5X2lkID09IEFNREdQVV9GQU1JTFlfQUkpIHx8CisJCSAgICAoY2hpcF9pZCA9PSBjaGlwX3JldisweDUwIHx8IGNoaXBfaWQgPT0gY2hpcF9yZXYrMHg1QSB8fAorCQkgICAgIGNoaXBfaWQgPT0gY2hpcF9yZXYrMHg2NCkpIHsKKwkJCS8qIGRwYiBzaXplICovCisJCQkoKHVpbnQ4X3QqKW1zZylbMHgyOF0gPSAweDAwOworCQkJKCh1aW50OF90Kiltc2cpWzB4MjldID0gMHg5NDsKKwkJCSgodWludDhfdCopbXNnKVsweDJBXSA9IDB4NkI7CisJCQkoKHVpbnQ4X3QqKW1zZylbMHgyQl0gPSAweDAwOworCQl9CisJfQorCisJciA9IGFtZGdwdV9ib19jcHVfdW5tYXAoYnVmX2hhbmRsZSk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJbnVtX3Jlc291cmNlcyA9IDA7CisJcmVzb3VyY2VzW251bV9yZXNvdXJjZXMrK10gPSBidWZfaGFuZGxlOworCXJlc291cmNlc1tudW1fcmVzb3VyY2VzKytdID0gaWJfaGFuZGxlOworCisJaSA9IDA7CisJdXZkX2NtZCh2YSwgMHgwLCAmaSk7CisJZm9yICg7IGkgJSAxNjsgKytpKQorCQlpYl9jcHVbaV0gPSAweDgwMDAwMDAwOworCisJciA9IHN1Ym1pdChpLCBBTURHUFVfSFdfSVBfVVZEKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X2JvX3ZhX29wKGJ1Zl9oYW5kbGUsIDAsIDQwOTYsIHZhLCAwLCBBTURHUFVfVkFfT1BfVU5NQVApOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCXIgPSBhbWRncHVfdmFfcmFuZ2VfZnJlZSh2YV9oYW5kbGUpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCXIgPSBhbWRncHVfYm9fZnJlZShidWZfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9jc191dmRfZGVjb2RlKHZvaWQpCit7CisJY29uc3QgdW5zaWduZWQgZHBiX3NpemUgPSAxNTkyMzU4NCwgY3R4X3NpemUgPSA1Mjg3NjgwLCBkdF9zaXplID0gNzM3MjgwOworCXVpbnQ2NF90IG1zZ19hZGRyLCBmYl9hZGRyLCBic19hZGRyLCBkcGJfYWRkciwgY3R4X2FkZHIsIGR0X2FkZHIsIGl0X2FkZHI7CisJc3RydWN0IGFtZGdwdV9ib19hbGxvY19yZXF1ZXN0IHJlcSA9IHswfTsKKwlhbWRncHVfYm9faGFuZGxlIGJ1Zl9oYW5kbGU7CisJYW1kZ3B1X3ZhX2hhbmRsZSB2YV9oYW5kbGU7CisJdWludDY0X3QgdmEgPSAwOworCXVpbnQ2NF90IHN1bTsKKwl1aW50OF90ICpwdHI7CisJaW50IGksIHI7CisKKwlpZiAoZmFtaWx5X2lkID49IEFNREdQVV9GQU1JTFlfUlYgfHwgZmFtaWx5X2lkID09IEFNREdQVV9GQU1JTFlfU0kpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisJcmVxLmFsbG9jX3NpemUgPSA0KjEwMjQ7IC8qIG1zZyAqLworCXJlcS5hbGxvY19zaXplICs9IDQqMTAyNDsgLyogZmIgKi8KKwlpZiAoZmFtaWx5X2lkID49IEFNREdQVV9GQU1JTFlfVkkpCisJCXJlcS5hbGxvY19zaXplICs9IDQwOTY7IC8qaXRfc2NhbGluZ190YWJsZSovCisJcmVxLmFsbG9jX3NpemUgKz0gQUxJR04oc2l6ZW9mKHV2ZF9iaXRzdHJlYW0pLCA0KjEwMjQpOworCXJlcS5hbGxvY19zaXplICs9IEFMSUdOKGRwYl9zaXplLCA0KjEwMjQpOworCXJlcS5hbGxvY19zaXplICs9IEFMSUdOKGR0X3NpemUsIDQqMTAyNCk7CisKKwlyZXEucHJlZmVycmVkX2hlYXAgPSBBTURHUFVfR0VNX0RPTUFJTl9HVFQ7CisKKwlyID0gYW1kZ3B1X2JvX2FsbG9jKGRldmljZV9oYW5kbGUsICZyZXEsICZidWZfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X3ZhX3JhbmdlX2FsbG9jKGRldmljZV9oYW5kbGUsCisJCQkJICBhbWRncHVfZ3B1X3ZhX3JhbmdlX2dlbmVyYWwsCisJCQkJICByZXEuYWxsb2Nfc2l6ZSwgMSwgMCwgJnZhLAorCQkJCSAgJnZhX2hhbmRsZSwgMCk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJciA9IGFtZGdwdV9ib192YV9vcChidWZfaGFuZGxlLCAwLCByZXEuYWxsb2Nfc2l6ZSwgdmEsIDAsCisJCQkgICAgQU1ER1BVX1ZBX09QX01BUCk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJciA9IGFtZGdwdV9ib19jcHVfbWFwKGJ1Zl9oYW5kbGUsICh2b2lkICoqKSZwdHIpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCW1lbWNweShwdHIsIHV2ZF9kZWNvZGVfbXNnLCBzaXplb2YodXZkX2RlY29kZV9tc2cpKTsKKwltZW1jcHkocHRyICsgc2l6ZW9mKHV2ZF9kZWNvZGVfbXNnKSwgYXZjX2RlY29kZV9tc2csIHNpemVvZihhdmNfZGVjb2RlX21zZykpOworCisJaWYgKGZhbWlseV9pZCA+PSBBTURHUFVfRkFNSUxZX1ZJKSB7CisJCXB0clsweDEwXSA9IDc7CisJCXB0clsweDk4XSA9IDB4MDA7CisJCXB0clsweDk5XSA9IDB4MDI7CisJCS8qIGNoaXAgYmV5b25kIHBvbGFyaXMxMC8xMSAqLworCQlpZiAoKGZhbWlseV9pZCA9PSBBTURHUFVfRkFNSUxZX0FJKSB8fAorCQkgICAgKGNoaXBfaWQgPT0gY2hpcF9yZXYrMHg1MCB8fCBjaGlwX2lkID09IGNoaXBfcmV2KzB4NUEgfHwKKwkJICAgICBjaGlwX2lkID09IGNoaXBfcmV2KzB4NjQpKSB7CisJCQkvKiBkcGIgc2l6ZSAqLworCQkJcHRyWzB4MjRdID0gMHgwMDsKKwkJCXB0clsweDI1XSA9IDB4OTQ7CisJCQlwdHJbMHgyNl0gPSAweDZCOworCQkJcHRyWzB4MjddID0gMHgwMDsKKwkJCS8qY3R4IHNpemUgKi8KKwkJCXB0clsweDJDXSA9IDB4MDA7CisJCQlwdHJbMHgyRF0gPSAweEFGOworCQkJcHRyWzB4MkVdID0gMHg1MDsKKwkJCXB0clsweDJGXSA9IDB4MDA7CisJCX0KKwl9CisKKwlwdHIgKz0gNCoxMDI0OworCW1lbXNldChwdHIsIDAsIDQqMTAyNCk7CisJaWYgKGZhbWlseV9pZCA+PSBBTURHUFVfRkFNSUxZX1ZJKSB7CisJCXB0ciArPSA0KjEwMjQ7CisJCW1lbWNweShwdHIsIHV2ZF9pdF9zY2FsaW5nX3RhYmxlLCBzaXplb2YodXZkX2l0X3NjYWxpbmdfdGFibGUpKTsKKwl9CisKKwlwdHIgKz0gNCoxMDI0OworCW1lbWNweShwdHIsIHV2ZF9iaXRzdHJlYW0sIHNpemVvZih1dmRfYml0c3RyZWFtKSk7CisKKwlwdHIgKz0gQUxJR04oc2l6ZW9mKHV2ZF9iaXRzdHJlYW0pLCA0KjEwMjQpOworCW1lbXNldChwdHIsIDAsIGRwYl9zaXplKTsKKworCXB0ciArPSBBTElHTihkcGJfc2l6ZSwgNCoxMDI0KTsKKwltZW1zZXQocHRyLCAwLCBkdF9zaXplKTsKKworCW51bV9yZXNvdXJjZXMgPSAwOworCXJlc291cmNlc1tudW1fcmVzb3VyY2VzKytdID0gYnVmX2hhbmRsZTsKKwlyZXNvdXJjZXNbbnVtX3Jlc291cmNlcysrXSA9IGliX2hhbmRsZTsKKworCW1zZ19hZGRyID0gdmE7CisJZmJfYWRkciA9IG1zZ19hZGRyICsgNCoxMDI0OworCWlmIChmYW1pbHlfaWQgPj0gQU1ER1BVX0ZBTUlMWV9WSSkgeworCQlpdF9hZGRyID0gZmJfYWRkciArIDQqMTAyNDsKKwkJYnNfYWRkciA9IGl0X2FkZHIgKyA0KjEwMjQ7CisJfSBlbHNlCisJCWJzX2FkZHIgPSBmYl9hZGRyICsgNCoxMDI0OworCWRwYl9hZGRyID0gQUxJR04oYnNfYWRkciArIHNpemVvZih1dmRfYml0c3RyZWFtKSwgNCoxMDI0KTsKKworCWlmIChmYW1pbHlfaWQgPj0gQU1ER1BVX0ZBTUlMWV9WSSkgeworCQlpZiAoKGZhbWlseV9pZCA9PSBBTURHUFVfRkFNSUxZX0FJKSB8fAorCQkgICAgKGNoaXBfaWQgPT0gY2hpcF9yZXYrMHg1MCB8fCBjaGlwX2lkID09IGNoaXBfcmV2KzB4NUEgfHwKKwkJICAgICBjaGlwX2lkID09IGNoaXBfcmV2KzB4NjQpKSB7CisJCQljdHhfYWRkciA9IEFMSUdOKGRwYl9hZGRyICsgMHgwMDZCOTQwMCwgNCoxMDI0KTsKKwkJfQorCX0KKworCWR0X2FkZHIgPSBBTElHTihkcGJfYWRkciArIGRwYl9zaXplLCA0KjEwMjQpOworCisJaSA9IDA7CisJdXZkX2NtZChtc2dfYWRkciwgMHgwLCAmaSk7CisJdXZkX2NtZChkcGJfYWRkciwgMHgxLCAmaSk7CisJdXZkX2NtZChkdF9hZGRyLCAweDIsICZpKTsKKwl1dmRfY21kKGZiX2FkZHIsIDB4MywgJmkpOworCXV2ZF9jbWQoYnNfYWRkciwgMHgxMDAsICZpKTsKKworCWlmIChmYW1pbHlfaWQgPj0gQU1ER1BVX0ZBTUlMWV9WSSkgeworCQl1dmRfY21kKGl0X2FkZHIsIDB4MjA0LCAmaSk7CisJCWlmICgoZmFtaWx5X2lkID09IEFNREdQVV9GQU1JTFlfQUkpIHx8CisJCSAgICAoY2hpcF9pZCA9PSBjaGlwX3JldisweDUwIHx8IGNoaXBfaWQgPT0gY2hpcF9yZXYrMHg1QSB8fAorCQkgICAgIGNoaXBfaWQgPT0gY2hpcF9yZXYrMHg2NCkpCisJCQl1dmRfY21kKGN0eF9hZGRyLCAweDIwNiwgJmkpOworCX0KKworCWliX2NwdVtpKytdID0gKGZhbWlseV9pZCA8IEFNREdQVV9GQU1JTFlfQUkpID8gMHgzQkM2IDogMHg4MUM2OworCWliX2NwdVtpKytdID0gMHgxOworCWZvciAoOyBpICUgMTY7ICsraSkKKwkJaWJfY3B1W2ldID0gMHg4MDAwMDAwMDsKKworCXIgPSBzdWJtaXQoaSwgQU1ER1BVX0hXX0lQX1VWRCk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJLyogVE9ETzogdXNlIGEgcmVhbCBDUkMzMiAqLworCWZvciAoaSA9IDAsIHN1bSA9IDA7IGkgPCBkdF9zaXplOyArK2kpCisJCXN1bSArPSBwdHJbaV07CisJQ1VfQVNTRVJUX0VRVUFMKHN1bSwgU1VNX0RFQ09ERSk7CisKKwlyID0gYW1kZ3B1X2JvX2NwdV91bm1hcChidWZfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X2JvX3ZhX29wKGJ1Zl9oYW5kbGUsIDAsIHJlcS5hbGxvY19zaXplLCB2YSwgMCwgQU1ER1BVX1ZBX09QX1VOTUFQKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X3ZhX3JhbmdlX2ZyZWUodmFfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X2JvX2ZyZWUoYnVmX2hhbmRsZSk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworfQorCitzdGF0aWMgdm9pZCBhbWRncHVfY3NfdXZkX2Rlc3Ryb3kodm9pZCkKK3sKKwlzdHJ1Y3QgYW1kZ3B1X2JvX2FsbG9jX3JlcXVlc3QgcmVxID0gezB9OworCWFtZGdwdV9ib19oYW5kbGUgYnVmX2hhbmRsZTsKKwlhbWRncHVfdmFfaGFuZGxlIHZhX2hhbmRsZTsKKwl1aW50NjRfdCB2YSA9IDA7CisJdm9pZCAqbXNnOworCWludCBpLCByOworCisJaWYgKGZhbWlseV9pZCA+PSBBTURHUFVfRkFNSUxZX1JWIHx8IGZhbWlseV9pZCA9PSBBTURHUFVfRkFNSUxZX1NJKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworCXJlcS5hbGxvY19zaXplID0gNCoxMDI0OworCXJlcS5wcmVmZXJyZWRfaGVhcCA9IEFNREdQVV9HRU1fRE9NQUlOX0dUVDsKKworCXIgPSBhbWRncHVfYm9fYWxsb2MoZGV2aWNlX2hhbmRsZSwgJnJlcSwgJmJ1Zl9oYW5kbGUpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCXIgPSBhbWRncHVfdmFfcmFuZ2VfYWxsb2MoZGV2aWNlX2hhbmRsZSwKKwkJCQkgIGFtZGdwdV9ncHVfdmFfcmFuZ2VfZ2VuZXJhbCwKKwkJCQkgIHJlcS5hbGxvY19zaXplLCAxLCAwLCAmdmEsCisJCQkJICAmdmFfaGFuZGxlLCAwKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X2JvX3ZhX29wKGJ1Zl9oYW5kbGUsIDAsIHJlcS5hbGxvY19zaXplLCB2YSwgMCwKKwkJCSAgICBBTURHUFVfVkFfT1BfTUFQKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X2JvX2NwdV9tYXAoYnVmX2hhbmRsZSwgJm1zZyk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJbWVtY3B5KG1zZywgdXZkX2Rlc3Ryb3lfbXNnLCBzaXplb2YodXZkX2Rlc3Ryb3lfbXNnKSk7CisJaWYgKGZhbWlseV9pZCA+PSBBTURHUFVfRkFNSUxZX1ZJKQorCQkoKHVpbnQ4X3QqKW1zZylbMHgxMF0gPSA3OworCisJciA9IGFtZGdwdV9ib19jcHVfdW5tYXAoYnVmX2hhbmRsZSk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJbnVtX3Jlc291cmNlcyA9IDA7CisJcmVzb3VyY2VzW251bV9yZXNvdXJjZXMrK10gPSBidWZfaGFuZGxlOworCXJlc291cmNlc1tudW1fcmVzb3VyY2VzKytdID0gaWJfaGFuZGxlOworCisJaSA9IDA7CisJdXZkX2NtZCh2YSwgMHgwLCAmaSk7CisJZm9yICg7IGkgJSAxNjsgKytpKQorCQlpYl9jcHVbaV0gPSAweDgwMDAwMDAwOworCisJciA9IHN1Ym1pdChpLCBBTURHUFVfSFdfSVBfVVZEKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X2JvX3ZhX29wKGJ1Zl9oYW5kbGUsIDAsIHJlcS5hbGxvY19zaXplLCB2YSwgMCwgQU1ER1BVX1ZBX09QX1VOTUFQKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X3ZhX3JhbmdlX2ZyZWUodmFfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X2JvX2ZyZWUoYnVmX2hhbmRsZSk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYW1kZ3B1L2RlYWRsb2NrX3Rlc3RzLmMgYi90ZXN0cy9hbWRncHUvZGVhZGxvY2tfdGVzdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjNkOTAzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYW1kZ3B1L2RlYWRsb2NrX3Rlc3RzLmMKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZmRlZiBIQVZFX0FMTE9DQV9ICisjIGluY2x1ZGUgPGFsbG9jYS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJDVW5pdC9CYXNpYy5oIgorCisjaW5jbHVkZSAiYW1kZ3B1X3Rlc3QuaCIKKyNpbmNsdWRlICJhbWRncHVfZHJtLmgiCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKworLyoKKyAqIFRoaXMgZGVmaW5lcyB0aGUgZGVsYXkgaW4gTVMgYWZ0ZXIgd2hpY2ggbWVtb3J5IGxvY2F0aW9uIGRlc2lnbmF0ZWQgZm9yCisgKiBjb21wcmVzc2lvbiBhZ2FpbnN0IHJlZmVyZW5jZSB2YWx1ZSBpcyB3cml0dGVuIHRvLCB1bmJsb2NraW5nIGNvbW1hbmQKKyAqIHByb2Nlc3NvcgorICovCisjZGVmaW5lIFdSSVRFX01FTV9BRERSRVNTX0RFTEFZX01TIDEwMAorCisjZGVmaW5lCVBBQ0tFVF9UWVBFMwkzCisKKyNkZWZpbmUgUEFDS0VUMyhvcCwgbikJKChQQUNLRVRfVFlQRTMgPDwgMzApIHwJCQkJXAorCQkJICgoKG9wKSAmIDB4RkYpIDw8IDgpIHwJCQkJXAorCQkJICgobikgJiAweDNGRkYpIDw8IDE2KQorCisjZGVmaW5lCVBBQ0tFVDNfV0FJVF9SRUdfTUVNCQkJCTB4M0MKKyNkZWZpbmUJCVdBSVRfUkVHX01FTV9GVU5DVElPTih4KSAgICAgICAgICAgICAgICAoKHgpIDw8IDApCisJCS8qIDAgLSBhbHdheXMKKwkJICogMSAtIDwKKwkJICogMiAtIDw9CisJCSAqIDMgLSA9PQorCQkgKiA0IC0gIT0KKwkJICogNSAtID49CisJCSAqIDYgLSA+CisJCSAqLworI2RlZmluZQkJV0FJVF9SRUdfTUVNX01FTV9TUEFDRSh4KSAgICAgICAgICAgICAgICgoeCkgPDwgNCkKKwkJLyogMCAtIHJlZworCQkgKiAxIC0gbWVtCisJCSAqLworI2RlZmluZQkJV0FJVF9SRUdfTUVNX09QRVJBVElPTih4KSAgICAgICAgICAgICAgICgoeCkgPDwgNikKKwkJLyogMCAtIHdhaXRfcmVnX21lbQorCQkgKiAxIC0gd3Jfd2FpdF93cl9yZWcKKwkJICovCisjZGVmaW5lCQlXQUlUX1JFR19NRU1fRU5HSU5FKHgpICAgICAgICAgICAgICAgICAgKCh4KSA8PCA4KQorCQkvKiAwIC0gbWUKKwkJICogMSAtIHBmcAorCQkgKi8KKworc3RhdGljICBhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXZpY2VfaGFuZGxlOworc3RhdGljICB1aW50MzJfdCAgbWFqb3JfdmVyc2lvbjsKK3N0YXRpYyAgdWludDMyX3QgIG1pbm9yX3ZlcnNpb247CisKK3N0YXRpYyBwdGhyZWFkX3Qgc3RyZXNzX3RocmVhZDsKK3N0YXRpYyB1aW50MzJfdCAqcHRyOworCitzdGF0aWMgdm9pZCBhbWRncHVfZGVhZGxvY2tfaGVscGVyKHVuc2lnbmVkIGlwX3R5cGUpOworc3RhdGljIHZvaWQgYW1kZ3B1X2RlYWRsb2NrX2dmeCh2b2lkKTsKK3N0YXRpYyB2b2lkIGFtZGdwdV9kZWFkbG9ja19jb21wdXRlKHZvaWQpOworCitpbnQgc3VpdGVfZGVhZGxvY2tfdGVzdHNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBhbWRncHVfZ3B1X2luZm8gZ3B1X2luZm8gPSB7MH07CisJaW50IHI7CisKKwlyID0gYW1kZ3B1X2RldmljZV9pbml0aWFsaXplKGRybV9hbWRncHVbMF0sICZtYWpvcl92ZXJzaW9uLAorCQkJCSAgICZtaW5vcl92ZXJzaW9uLCAmZGV2aWNlX2hhbmRsZSk7CisKKwlpZiAocikgeworCQlpZiAoKHIgPT0gLUVBQ0NFUykgJiYgKGVycm5vID09IEVBQ0NFUykpCisJCQlwcmludGYoIlxuXG5FcnJvcjolcy4gIgorCQkJCSJIaW50OlRyeSB0byBydW4gdGhpcyB0ZXN0IHByb2dyYW0gYXMgcm9vdC4iLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiBDVUVfU0lOSVRfRkFJTEVEOworCX0KKworCXJldHVybiBDVUVfU1VDQ0VTUzsKK30KKworaW50IHN1aXRlX2RlYWRsb2NrX3Rlc3RzX2NsZWFuKHZvaWQpCit7CisJaW50IHIgPSBhbWRncHVfZGV2aWNlX2RlaW5pdGlhbGl6ZShkZXZpY2VfaGFuZGxlKTsKKworCWlmIChyID09IDApCisJCXJldHVybiBDVUVfU1VDQ0VTUzsKKwllbHNlCisJCXJldHVybiBDVUVfU0NMRUFOX0ZBSUxFRDsKK30KKworCitDVV9UZXN0SW5mbyBkZWFkbG9ja190ZXN0c1tdID0geworCXsgImdmeCByaW5nIGJsb2NrIHRlc3QiLCAgYW1kZ3B1X2RlYWRsb2NrX2dmeCB9LAorCisJLyoKKwkqIEJVRzogQ29tcHV0ZSByaW5nIHN0YWxscyBhbmQgbmV2ZXIgcmVjb3ZlcnMgd2hlbiB0aGUgYWRkcmVzcyBpcworCSogd3JpdHRlbiBhZnRlciB0aGUgY29tbWFuZCBhbHJlYWR5IHN1Ym1pdHRlZAorCSovCisJLyogeyAiY29tcHV0ZSByaW5nIGJsb2NrIHRlc3QiLCAgYW1kZ3B1X2RlYWRsb2NrX2NvbXB1dGUgfSwgKi8KKworCUNVX1RFU1RfSU5GT19OVUxMLAorfTsKKworc3RhdGljIHZvaWQgKndyaXRlX21lbV9hZGRyZXNzKHZvaWQgKmRhdGEpCit7CisJaW50IGk7CisKKwkvKiB1c2Vjb25kc190IHJhbmdlIGlzIFswLCAxLDAwMCwwMDBdIHNvIHVzZSBsb29wIGZvciB3YWl0cyA+IDFzICovCisJZm9yIChpID0gMDsgaSA8IFdSSVRFX01FTV9BRERSRVNTX0RFTEFZX01TOyBpKyspCisJCXVzbGVlcCgxMDAwKTsKKworCXB0clsyNTZdID0gMHgxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9kZWFkbG9ja19nZngodm9pZCkKK3sKKwlhbWRncHVfZGVhZGxvY2tfaGVscGVyKEFNREdQVV9IV19JUF9HRlgpOworfQorCitzdGF0aWMgdm9pZCBhbWRncHVfZGVhZGxvY2tfY29tcHV0ZSh2b2lkKQoreworCWFtZGdwdV9kZWFkbG9ja19oZWxwZXIoQU1ER1BVX0hXX0lQX0NPTVBVVEUpOworfQorCitzdGF0aWMgdm9pZCBhbWRncHVfZGVhZGxvY2tfaGVscGVyKHVuc2lnbmVkIGlwX3R5cGUpCit7CisJYW1kZ3B1X2NvbnRleHRfaGFuZGxlIGNvbnRleHRfaGFuZGxlOworCWFtZGdwdV9ib19oYW5kbGUgaWJfcmVzdWx0X2hhbmRsZTsKKwl2b2lkICppYl9yZXN1bHRfY3B1OworCXVpbnQ2NF90IGliX3Jlc3VsdF9tY19hZGRyZXNzOworCXN0cnVjdCBhbWRncHVfY3NfcmVxdWVzdCBpYnNfcmVxdWVzdDsKKwlzdHJ1Y3QgYW1kZ3B1X2NzX2liX2luZm8gaWJfaW5mbzsKKwlzdHJ1Y3QgYW1kZ3B1X2NzX2ZlbmNlIGZlbmNlX3N0YXR1czsKKwl1aW50MzJfdCBleHBpcmVkOworCWludCBpLCByLCBpbnN0YW5jZTsKKwlhbWRncHVfYm9fbGlzdF9oYW5kbGUgYm9fbGlzdDsKKwlhbWRncHVfdmFfaGFuZGxlIHZhX2hhbmRsZTsKKworCXIgPSBwdGhyZWFkX2NyZWF0ZSgmc3RyZXNzX3RocmVhZCwgTlVMTCwgd3JpdGVfbWVtX2FkZHJlc3MsIE5VTEwpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCXIgPSBhbWRncHVfY3NfY3R4X2NyZWF0ZShkZXZpY2VfaGFuZGxlLCAmY29udGV4dF9oYW5kbGUpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCXIgPSBhbWRncHVfYm9fYWxsb2NfYW5kX21hcChkZXZpY2VfaGFuZGxlLCA0MDk2LCA0MDk2LAorCQkJQU1ER1BVX0dFTV9ET01BSU5fR1RULCAwLAorCQkJCQkJICAgICZpYl9yZXN1bHRfaGFuZGxlLCAmaWJfcmVzdWx0X2NwdSwKKwkJCQkJCSAgICAmaWJfcmVzdWx0X21jX2FkZHJlc3MsICZ2YV9oYW5kbGUpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCXIgPSBhbWRncHVfZ2V0X2JvX2xpc3QoZGV2aWNlX2hhbmRsZSwgaWJfcmVzdWx0X2hhbmRsZSwgTlVMTCwKKwkJCSAgICAgICAmYm9fbGlzdCk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJcHRyID0gaWJfcmVzdWx0X2NwdTsKKworCXB0clswXSA9IFBBQ0tFVDMoUEFDS0VUM19XQUlUX1JFR19NRU0sIDUpOworCXB0clsxXSA9IChXQUlUX1JFR19NRU1fTUVNX1NQQUNFKDEpIHwgLyogbWVtb3J5ICovCisJCQkgV0FJVF9SRUdfTUVNX0ZVTkNUSU9OKDQpIHwgLyogIT0gKi8KKwkJCSBXQUlUX1JFR19NRU1fRU5HSU5FKDApKTsgIC8qIG1lICovCisJcHRyWzJdID0gKGliX3Jlc3VsdF9tY19hZGRyZXNzICsgMjU2KjQpICYgMHhmZmZmZmZmYzsKKwlwdHJbM10gPSAoKGliX3Jlc3VsdF9tY19hZGRyZXNzICsgMjU2KjQpID4+IDMyKSAmIDB4ZmZmZmZmZmY7CisJcHRyWzRdID0gMHgwMDAwMDAwMDsgLyogcmVmZXJlbmNlIHZhbHVlICovCisJcHRyWzVdID0gMHhmZmZmZmZmZjsgLyogYW5kIG1hc2sgKi8KKwlwdHJbNl0gPSAweDAwMDAwMDA0OyAvKiBwb2xsIGludGVydmFsICovCisKKwlmb3IgKGkgPSA3OyBpIDwgMTY7ICsraSkKKwkJcHRyW2ldID0gMHhmZmZmMTAwMDsKKworCisJcHRyWzI1Nl0gPSAweDA7IC8qIHRoZSBtZW1vcnkgd2Ugd2FpdCBvbiB0byBjaGFuZ2UgKi8KKworCisKKwltZW1zZXQoJmliX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgYW1kZ3B1X2NzX2liX2luZm8pKTsKKwlpYl9pbmZvLmliX21jX2FkZHJlc3MgPSBpYl9yZXN1bHRfbWNfYWRkcmVzczsKKwlpYl9pbmZvLnNpemUgPSAxNjsKKworCW1lbXNldCgmaWJzX3JlcXVlc3QsIDAsIHNpemVvZihzdHJ1Y3QgYW1kZ3B1X2NzX3JlcXVlc3QpKTsKKwlpYnNfcmVxdWVzdC5pcF90eXBlID0gaXBfdHlwZTsKKwlpYnNfcmVxdWVzdC5yaW5nID0gMDsKKwlpYnNfcmVxdWVzdC5udW1iZXJfb2ZfaWJzID0gMTsKKwlpYnNfcmVxdWVzdC5pYnMgPSAmaWJfaW5mbzsKKwlpYnNfcmVxdWVzdC5yZXNvdXJjZXMgPSBib19saXN0OworCWlic19yZXF1ZXN0LmZlbmNlX2luZm8uaGFuZGxlID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCAyMDA7IGkrKykgeworCQlyID0gYW1kZ3B1X2NzX3N1Ym1pdChjb250ZXh0X2hhbmRsZSwgMCwmaWJzX3JlcXVlc3QsIDEpOworCQlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwl9CisKKwltZW1zZXQoJmZlbmNlX3N0YXR1cywgMCwgc2l6ZW9mKHN0cnVjdCBhbWRncHVfY3NfZmVuY2UpKTsKKwlmZW5jZV9zdGF0dXMuY29udGV4dCA9IGNvbnRleHRfaGFuZGxlOworCWZlbmNlX3N0YXR1cy5pcF90eXBlID0gaXBfdHlwZTsKKwlmZW5jZV9zdGF0dXMuaXBfaW5zdGFuY2UgPSAwOworCWZlbmNlX3N0YXR1cy5yaW5nID0gMDsKKwlmZW5jZV9zdGF0dXMuZmVuY2UgPSBpYnNfcmVxdWVzdC5zZXFfbm87CisKKwlyID0gYW1kZ3B1X2NzX3F1ZXJ5X2ZlbmNlX3N0YXR1cygmZmVuY2Vfc3RhdHVzLAorCQkJQU1ER1BVX1RJTUVPVVRfSU5GSU5JVEUsMCwgJmV4cGlyZWQpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCXIgPSBhbWRncHVfYm9fbGlzdF9kZXN0cm95KGJvX2xpc3QpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCXIgPSBhbWRncHVfYm9fdW5tYXBfYW5kX2ZyZWUoaWJfcmVzdWx0X2hhbmRsZSwgdmFfaGFuZGxlLAorCQkJCSAgICAgaWJfcmVzdWx0X21jX2FkZHJlc3MsIDQwOTYpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCXIgPSBhbWRncHVfY3NfY3R4X2ZyZWUoY29udGV4dF9oYW5kbGUpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCXB0aHJlYWRfam9pbihzdHJlc3NfdGhyZWFkLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FtZGdwdS9kZWNvZGVfbWVzc2FnZXMuaCBiL3Rlc3RzL2FtZGdwdS9kZWNvZGVfbWVzc2FnZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDZmZTRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYW1kZ3B1L2RlY29kZV9tZXNzYWdlcy5oCkBAIC0wLDAgKzEsODQ4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9ERUNPREVfTUVTU0FHRVNfSF8KKyNkZWZpbmUgX0RFQ09ERV9NRVNTQUdFU19IXworCisjZGVmaW5lIFNVTV9ERUNPREUgMHgyMDM0NWQ4CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHV2ZF9jcmVhdGVfbXNnW10gPSB7CisJMHhlNCwweDBkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwMCwweDQ0LDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDYwLDB4MDMsMHgwMCwweDAwLAorCTB4ZTAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgwLDB4ZjksMHhmMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHV2ZF9iaXRzdHJlYW1bXSA9eworCTB4MDAsMHgwMCwweDAxLDB4MjUsMHhiOCwweDIwLDB4MjAsMHgyMSwweDQ0LDB4YzUsMHgwMCwweDAxLDB4NTcsMHg5YiwweGVmLDB4YmUsCisJMHhmYiwweGVmLDB4YmUsMHhmYiwweGVmLDB4YmUsMHhmYiwweGVmLDB4YmUsMHhmYiwweGVmLDB4YmUsMHhmYiwweGVmLDB4YmUsMHhmYiwKKwkweGVmLDB4YmUsMHhmYiwweGVmLDB4YmUsMHhmYiwweGVmLDB4YmUsMHhmYiwweGVmLDB4YmUsMHhmYiwweGVmLDB4YmUsMHhmYiwweGVmLAorCTB4YmUsMHhmYiwweGVmLDB4YmUsMHhmZiwweDg3LDB4ZmYsMHhjMiwweDU4LDB4MGUsMHgwMCwweDAyLDB4MDIsMHhhMCwweDAwLDB4MjAsCisJMHgzYSwweDAwLDB4MGQsMHgwMCwweDAxLDB4MDEsMHhhNCwweGNiLDB4OTQsMHg3MywweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwKKwkweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLAorCTB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsCisJMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwKKwkweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLAorCTB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsCisJMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwKKwkweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLAorCTB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsCisJMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwKKwkweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLAorCTB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsCisJMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwKKwkweGViLDB4YWUsMHhiYSwweGViLDB4YWYsMHgwMCwweDAwLDB4MDEsMHgyNSwweDAwLDB4YTIsMHhiOCwweDIwLDB4MjAsMHgyMSwweDQ0LAorCTB4YzUsMHgwMCwweDAxLDB4NTcsMHg5YiwweGVmLDB4YmUsMHhmYiwweGVmLDB4YmUsMHhmYiwweGVmLDB4YmUsMHhmYiwweGVmLDB4YmUsCisJMHhmYiwweGVmLDB4YmUsMHhmYiwweGVmLDB4YmUsMHhmYiwweGVmLDB4YmUsMHhmYiwweGVmLDB4YmUsMHhmYiwweGVmLDB4YmUsMHhmYiwKKwkweGVmLDB4YmUsMHhmYiwweGVmLDB4YmUsMHhmYiwweGVmLDB4YmUsMHhmYiwweGVmLDB4YmUsMHhmZiwweDg3LDB4ZmYsMHhjMiwweDU4LAorCTB4MGUsMHgwMCwweDAyLDB4MDIsMHhhMCwweDAwLDB4MjAsMHgzYSwweDAwLDB4MGQsMHgwMCwweDAxLDB4MDEsMHhhNCwweGNiLDB4OTQsCisJMHg3MywweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwKKwkweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLAorCTB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsCisJMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwKKwkweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLAorCTB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsCisJMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwKKwkweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLAorCTB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsCisJMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwKKwkweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLAorCTB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsCisJMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWUsMHhiYSwweGViLDB4YWYsMHgwMCwweDAwLDB4MDEsMHgyNSwKKwkweDAwLDB4NTEsMHgyZSwweDA4LDB4MDgsMHgwOCwweDUxLDB4MzEsMHg0MCwweDAwLDB4NTUsMHhlNiwweGZiLDB4ZWYsMHhiZSwweGZiLAorCTB4ZWYsMHhiZSwweGZiLDB4ZWYsMHhiZSwweGZiLDB4ZWYsMHhiZSwweGZiLDB4ZWYsMHhiZSwweGZiLDB4ZWYsMHhiZSwweGZiLDB4ZWYsCisJMHhiZSwweGZiLDB4ZWYsMHhiZSwweGZiLDB4ZWYsMHhiZSwweGZiLDB4ZWYsMHhiZSwweGZiLDB4ZWYsMHhiZSwweGZiLDB4ZWYsMHhiZSwKKwkweGZiLDB4ZWYsMHhiZiwweGUxLDB4ZmYsMHhmMCwweDk2LDB4MDMsMHg4MCwweDAwLDB4ODAsMHhhOCwweDAwLDB4MDgsMHgwZSwweDgwLAorCTB4MDMsMHg0MCwweDAwLDB4NDAsMHg2OSwweDMyLDB4ZTUsMHgxYywweGZhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsCisJMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwKKwkweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLAorCTB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsCisJMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwKKwkweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLAorCTB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsCisJMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwKKwkweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLAorCTB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsCisJMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwKKwkweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLAorCTB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsCisJMHhhZSwweGJhLDB4ZWIsMHhjMCwweDAwLDB4MDAsMHgwMSwweDI1LDB4MDAsMHg3OSwweGFlLDB4MDgsMHgwOCwweDA4LDB4NTEsMHgzMSwKKwkweDQwLDB4MDAsMHg1NSwweGU2LDB4ZmIsMHhlZiwweGJlLDB4ZmIsMHhlZiwweGJlLDB4ZmIsMHhlZiwweGJlLDB4ZmIsMHhlZiwweGJlLAorCTB4ZmIsMHhlZiwweGJlLDB4ZmIsMHhlZiwweGJlLDB4ZmIsMHhlZiwweGJlLDB4ZmIsMHhlZiwweGJlLDB4ZmIsMHhlZiwweGJlLDB4ZmIsCisJMHhlZiwweGJlLDB4ZmIsMHhlZiwweGJlLDB4ZmIsMHhlZiwweGJlLDB4ZmIsMHhlZiwweGJmLDB4ZTEsMHhmZiwweGYwLDB4OTYsMHgwMywKKwkweDgwLDB4MDAsMHg4MCwweGE4LDB4MDAsMHgwOCwweDBlLDB4ODAsMHgwMywweDQwLDB4MDAsMHg0MCwweDY5LDB4MzIsMHhlNSwweDFjLAorCTB4ZmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsCisJMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwKKwkweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLAorCTB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsCisJMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwKKwkweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLAorCTB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsCisJMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwKKwkweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLAorCTB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsCisJMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwKKwkweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLAorCTB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGFlLDB4YmEsMHhlYiwweGMwLDB4MDAsMHgwMCwweDAxLDB4MjUsCisJMHgwMCwweDI4LDB4OGIsMHg4MiwweDAyLDB4MDIsMHgxNCwweDRjLDB4NTAsMHgwMCwweDE1LDB4NzksMHhiZSwweGZiLDB4ZWYsMHhiZSwKKwkweGZiLDB4ZWYsMHhiZSwweGZiLDB4ZWYsMHhiZSwweGZiLDB4ZWYsMHhiZSwweGZiLDB4ZWYsMHhiZSwweGZiLDB4ZWYsMHhiZSwweGZiLAorCTB4ZWYsMHhiZSwweGZiLDB4ZWYsMHhiZSwweGZiLDB4ZWYsMHhiZSwweGZiLDB4ZWYsMHhiZSwweGZiLDB4ZWYsMHhiZSwweGZiLDB4ZWYsCisJMHhiZSwweGZiLDB4ZWYsMHhmOCwweDdmLDB4ZmMsMHgyNSwweDgwLDB4ZTAsMHgwMCwweDIwLDB4MmEsMHgwMCwweDAyLDB4MDMsMHhhMCwKKwkweDAwLDB4ZDAsMHgwMCwweDEwLDB4MWEsMHg0YywweGI5LDB4NDcsMHgzZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLAorCTB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsCisJMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwKKwkweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLAorCTB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsCisJMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwKKwkweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLAorCTB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsCisJMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwKKwkweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLAorCTB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsCisJMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwKKwkweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLDB4ZWIsMHhhZSwweGJhLAorCTB4ZWIsMHhhZSwweGJhLDB4ZjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB1dmRfZGVjb2RlX21zZ1tdID0geworCTB4ZTQsMHgwZCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAzLDB4MDAsMHg0NCwweDQwLDB4MDEsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4NjAsMHgwMywweDAwLDB4MDAsMHhlMCwweDAxLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHhmOSwweGYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhjMCwweDAzLDB4MDAsMHgwMCwweDgwLDB4MDcsMHgwMCwweDAwLDB4NjAsMHgwOSwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGF2Y19kZWNvZGVfbXNnW10gPSB7CisJMHgwMiwweDAwLDB4MDAsMHgwMCwweDFlLDB4MDAsMHgwMCwweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsMHg4OCwweDAwLDB4MDAsMHgwMCwKKwkweDAxLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMywweDAyLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsCisJMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwKKwkweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLAorCTB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsCisJMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwKKwkweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLAorCTB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsCisJMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwKKwkweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLAorCTB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsCisJMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwKKwkweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLAorCTB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsCisJMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwKKwkweDEwLDB4MTAsMHgxMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdXZkX2Rlc3Ryb3lfbXNnW10gPSB7CisJMHhlNCwweDBkLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwMCwweDQ0LDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHV2ZF9pdF9zY2FsaW5nX3RhYmxlW10gPSB7CisJMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwKKwkweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLAorCTB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsCisJMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwKKwkweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLAorCTB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsCisJMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwKKwkweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLAorCTB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsCisJMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwKKwkweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLAorCTB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsCisJMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwKKwkweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdmNuX2RlY19jcmVhdGVfbXNnW10gPSB7CisJMHgyOCwweDAwLDB4MDAsMHgwMCwweDM4LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAzLDB4MDAsMHg0NCwweDQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDI4LDB4MDAsMHgwMCwweDAwLAorCTB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHg2MCwweDAzLDB4MDAsMHgwMCwweGUwLDB4MDEsMHgwMCwweDAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdmNuX2RlY19kZWNvZGVfbXNnW10gPSB7CisJMHgyOCwweDAwLDB4MDAsMHgwMCwweDkwLDB4MDYsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKKwkweDAzLDB4MDAsMHg0NCwweDQwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDM4LDB4MDAsMHgwMCwweDAwLAorCTB4YjQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA2LDB4MDAsMHgwMCwweDAwLDB4ZWMsMHgwMCwweDAwLDB4MDAsCisJMHg1YywweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwKKwkweDYwLDB4MDMsMHgwMCwweDAwLDB4ZTAsMHgwMSwweDAwLDB4MDAsMHg4MCwweDA1LDB4MDAsMHgwMCwweDAwLDB4OTQsMHg2YiwweDAwLAorCTB4OTYsMHg0ZSwweDBiLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhZiwweDUwLDB4MDAsCisJMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwKKwkweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4YzAsMHgwMywweDAwLDB4MDAsMHg4MCwweDA3LDB4MDAsMHgwMCwweDYwLDB4MDksMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdmNuX2RlY19kZXN0cm95X21zZ1tdID0geworCTB4MjgsMHgwMCwweDAwLDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsCisJMHgwMywweDAwLDB4NDQsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLAorfTsKKworI2VuZGlmIC8qIF9ERUNPREVfTUVTU0FHRVNfSF8gKi8KZGlmZiAtLWdpdCBhL3Rlc3RzL2FtZGdwdS9mcmFtZS5oIGIvdGVzdHMvYW1kZ3B1L2ZyYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM1NDAxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FtZGdwdS9mcmFtZS5oCkBAIC0wLDAgKzEsMTk0OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisqLworCisjaWZuZGVmIF9mcmFtZV9oXworI2RlZmluZSBfZnJhbWVfaF8KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZnJhbWVbXSA9IHsKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwKKwkweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwKKwkweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLAorCTB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCTB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLCAweDUxLAorCTB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsCisJMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsIDB4NTEsCisJMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHg1MSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDZhLCAweDZhLCAweDZhLAorCTB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwgMHgyOSwKKwkweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDI5LCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4NmEsIDB4NmEsIDB4NmEsCisJMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkweDZhLCAweDZhLCAweDZhLCAweDZhLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkweGFhLCAweGFhLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCTB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MTAsIDB4Y2QsIDB4MTMsIDB4NjcsIDB4YTIsIDB4MmIsIDB4YTUsIDB4MjksCisJMHg1ZCwgMHhjYiwgMHhkNSwgMHhhNCwgMHgyNywgMHgyYSwgMHg2MiwgMHgyMCwgMHg3MCwgMHg3OCwgMHg2ZCwgMHhlOSwgMHgxZSwgMHhlYiwgMHgyNSwgMHhhNiwKKwkweDYyLCAweDI5LCAweDEzLCAweGE0LCAweGFiLCAweDI5LCAweDEyLCAweDM1LCAweDRjLCAweDc3LCAweDczLCAweDQyLCAweGUwLCAweGQwLCAweDYyLCAweGE1LAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHhhZCwgMHgxNywgMHg1YywgMHhjMywgMHhkYywgMHg0MSwgMHgxZSwgMHhiZSwKKwkweDRlLCAweDkwLCAweGFiLCAweGJmLCAweDg2LCAweDMzLCAweDFmLCAweGViLCAweDE1LCAweGFjLCAweDY0LCAweDM4LCAweGQwLCAweDQ0LCAweGU2LCAweDNlLAorCTB4ZTksIDB4NTAsIDB4OGYsIDB4MzIsIDB4YmQsIDB4MTgsIDB4N2EsIDB4NGEsIDB4YWEsIDB4MTIsIDB4NjEsIDB4OTEsIDB4NjIsIDB4YWEsIDB4ZDksIDB4NmUsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweGE0LCAweGM2LCAweDM3LCAweDdmLCAweDZlLCAweDZhLCAweGE2LCAweGQwLAorCTB4ZDYsIDB4ODQsIDB4NTEsIDB4OTYsIDB4MTMsIDB4ZDYsIDB4YzQsIDB4M2UsIDB4NjAsIDB4MzYsIDB4NjIsIDB4YmQsIDB4ZDksIDB4ZTIsIDB4NzgsIDB4ZTMsCisJMHg4MywgMHg5OSwgMHhkYSwgMHg4ZSwgMHgzMSwgMHhkNCwgMHg2NCwgMHgxZiwgMHhjNywgMHgxYiwgMHhiZSwgMHhhYSwgMHg3NiwgMHgyMiwgMHg2YiwgMHg2YiwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCTB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4NDIsIDB4NjksIDB4YjAsIDB4OGEsIDB4Y2MsIDB4NzQsIDB4MTcsIDB4NGMsCisJMHg5OCwgMHhlMSwgMHhjMSwgMHhhYSwgMHgxOSwgMHhlNSwgMHhjMywgMHhjZSwgMHg2OSwgMHhiMSwgMHhlNSwgMHg2MiwgMHhlNywgMHgyZiwgMHhlMCwgMHhjNCwKKwkweGU4LCAweDI1LCAweDg0LCAweGU4LCAweDVmLCAweDg0LCAweGIwLCAweGFiLCAweDQwLCAweDNiLCAweDllLCAweDk1LCAweDI3LCAweDQ0LCAweDFlLCAweDdhLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHhlNCwgMHg3NywgMHhjOCwgMHg3ZCwgMHhkMiwgMHg2ZSwgMHhlNSwgMHgxZiwKKwkweDhkLCAweDMzLCAweDdjLCAweDhlLCAweDkwLCAweGJlLCAweDFmLCAweGI5LCAweDViLCAweGMxLCAweDVkLCAweGRmLCAweGM2LCAweDIzLCAweDI1LCAweGM5LAorCTB4MjUsIDB4YjEsIDB4MTMsIDB4NWUsIDB4N2MsIDB4OTMsIDB4NjcsIDB4ZGYsIDB4OWIsIDB4OGYsIDB4NzEsIDB4YjgsIDB4MzQsIDB4YTQsIDB4NmIsIDB4YTEsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDQwLCAweGI4LCAweDc0LCAweGJiLCAweGE1LCAweDNiLCAweDQwLCAweDEyLAorCTB4MmIsIDB4MTQsIDB4NDMsIDB4MzYsIDB4OTMsIDB4MjYsIDB4ZTgsIDB4ZGEsIDB4MjIsIDB4Y2YsIDB4YzIsIDB4NjksIDB4YjAsIDB4ZDAsIDB4N2EsIDB4YjEsCisJMHhjOCwgMHgyYSwgMHg5MiwgMHgyNywgMHg5NCwgMHgxOSwgMHg5NywgMHhiMywgMHg5MiwgMHg2NSwgMHhjNSwgMHg4ZCwgMHhlOCwgMHhhNiwgMHhkMCwgMHg5YiwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCTB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4ODgsIDB4OTIsIDB4MmUsIDB4NGIsIDB4NjQsIDB4ZGEsIDB4Y2UsIDB4MTYsCisJMHg2NywgMHg3MCwgMHhlYiwgMHg1YywgMHg4NiwgMHg2YiwgMHhjMiwgMHhlNCwgMHhiZCwgMHhkYywgMHg0NiwgMHgyOCwgMHhkOCwgMHhkNCwgMHgxOSwgMHg2OSwKKwkweGQ1LCAweGNmLCAweDhlLCAweDg5LCAweDQwLCAweDk2LCAweDdiLCAweGIyLCAweGM5LCAweDVlLCAweDE4LCAweGM2LCAweGQ2LCAweGQyLCAweDNjLCAweDRhLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHg0NiwgMHg1MCwgMHg4OCwgMHhiOCwgMHg5YSwgMHg4YywgMHhjOCwgMHhhZSwKKwkweGFlLCAweGNkLCAweDYzLCAweDYyLCAweGMzLCAweDhhLCAweDMyLCAweGIzLCAweDVjLCAweDFjLCAweGEyLCAweDU1LCAweDI3LCAweDU1LCAweDg3LCAweDZiLAorCTB4M2UsIDB4MzMsIDB4ZDYsIDB4NzAsIDB4ZDAsIDB4NTksIDB4NzYsIDB4YjAsIDB4Y2QsIDB4NGEsIDB4NmUsIDB4NGEsIDB4YjEsIDB4YTEsIDB4MTcsIDB4MjQsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweGM4LCAweGI1LCAweGUzLCAweDdhLCAweDE3LCAweDYzLCAweDcwLCAweGNhLAorCTB4MzcsIDB4YmQsIDB4MWYsIDB4NzIsIDB4NWUsIDB4MmYsIDB4N2MsIDB4YjcsIDB4ZDIsIDB4Y2IsIDB4YTgsIDB4YTksIDB4MTMsIDB4OTgsIDB4MmIsIDB4N2UsCisJMHg3NCwgMHgzZiwgMHg5NCwgMHg2ZiwgMHg4YywgMHgxYSwgMHhjZSwgMHgzOCwgMHg2MSwgMHg3MiwgMHhlMiwgMHgxOCwgMHg0ZSwgMHhhYywgMHg1YywgMHhjMywKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCTB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4OTIsIDB4ZDgsIDB4YjcsIDB4ODgsIDB4YTgsIDB4NmUsIDB4YzUsIDB4Y2UsCisJMHgxZiwgMHg0YSwgMHg2NCwgMHgzYiwgMHgxYSwgMHgyMSwgMHg5ZiwgMHhhNiwgMHg0NiwgMHhlNywgMHgxYSwgMHhjZiwgMHhjOCwgMHgyMCwgMHhjMSwgMHgyMCwKKwkweDgzLCAweGJlLCAweDViLCAweDk5LCAweDRkLCAweGQ0LCAweDVlLCAweGIzLCAweGMzLCAweDRiLCAweGFiLCAweDNlLCAweGM3LCAweDg1LCAweGVhLCAweGM0LAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgxMCwgMHg0OCwgMHhlMCwgMHg4NCwgMHhhOCwgMHgxZCwgMHg4MSwgMHg2MiwKKwkweDc0LCAweDY3LCAweGIwLCAweDMyLCAweDRjLCAweDIzLCAweDU2LCAweGQwLCAweDg1LCAweDliLCAweDIwLCAweGNhLCAweGI0LCAweDQ5LCAweGRkLCAweGFkLAorCTB4MWYsIDB4YWIsIDB4Y2YsIDB4MTYsIDB4N2QsIDB4YmQsIDB4NzgsIDB4YjAsIDB4ZDMsIDB4YTAsIDB4NWMsIDB4NTAsIDB4YTEsIDB4ZDcsIDB4MzcsIDB4YTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDUyLCAweDU1LCAweDk3LCAweGQ2LCAweDkzLCAweDZjLCAweGQyLCAweGExLAorCTB4OTQsIDB4YzIsIDB4MmMsIDB4NTEsIDB4NjgsIDB4MzQsIDB4ODgsIDB4YzcsIDB4OGMsIDB4MWYsIDB4M2YsIDB4OTMsIDB4NjgsIDB4ODYsIDB4YjEsIDB4YTUsCisJMHhlMSwgMHg1NiwgMHg4OSwgMHgyMCwgMHhhNSwgMHhlMiwgMHgyOCwgMHg5YSwgMHgxMSwgMHg4ZiwgMHhhNCwgMHhhNywgMHg4MSwgMHg2ZCwgMHhlMiwgMHg4NywKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCTB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4ZTIsIDB4MzQsIDB4NzksIDB4OGQsIDB4ZTIsIDB4ZTEsIDB4YTMsIDB4MzgsCisJMHg4MywgMHgzYiwgMHhiMCwgMHg3ZiwgMHg0YiwgMHgyYiwgMHg0NCwgMHhiNywgMHg2OCwgMHgyMSwgMHg4NSwgMHg3OSwgMHg3NCwgMHg4YywgMHhiYywgMHg2NSwKKwkweGJiLCAweDE2LCAweGQwLCAweDJhLCAweGI3LCAweDcwLCAweDEzLCAweDk0LCAweGMzLCAweDg3LCAweDIzLCAweDQ2LCAweDJmLCAweGUzLCAweGI3LCAweGNmLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgzNSwgMHhkZCwgMHg2MCwgMHg1ZCwgMHhjMywgMHhkNiwgMHg3NSwgMHgyMCwKKwkweDc4LCAweGJkLCAweDQ5LCAweDIzLCAweGFmLCAweDFlLCAweGEyLCAweDE0LCAweGNhLCAweDgxLCAweDM5LCAweGJiLCAweDE5LCAweGMyLCAweDgyLCAweGRlLAorCTB4NjgsIDB4YmUsIDB4ZGIsIDB4ZGQsIDB4YTQsIDB4ODYsIDB4NTEsIDB4ZTcsIDB4YWQsIDB4MmIsIDB4MjUsIDB4YjAsIDB4YjcsIDB4M2QsIDB4ZDAsIDB4YWMsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDYyLCAweDUwLCAweGE5LCAweDdlLCAweDNiLCAweGMwLCAweDQxLCAweDlhLAorCTB4NmUsIDB4ZDAsIDB4OGYsIDB4NGEsIDB4MjEsIDB4ZDEsIDB4ZTEsIDB4OWYsIDB4ZGIsIDB4YjYsIDB4ZTIsIDB4NDEsIDB4NGEsIDB4MTUsIDB4YjUsIDB4OTUsCisJMHg2NCwgMHg5NywgMHhkMywgMHg0MiwgMHhjNSwgMHg2MywgMHhkZCwgMHhiNywgMHg1NywgMHg2YywgMHhjMywgMHg1NCwgMHg5MSwgMHgyYiwgMHhkYywgMHg1MiwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCTB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4YjIsIDB4ZTEsIDB4MTQsIDB4MzcsIDB4OTIsIDB4ZWEsIDB4YjgsIDB4YzMsCisJMHg5NSwgMHg0YiwgMHgzMSwgMHhhYiwgMHg5YiwgMHhiOCwgMHg4ZiwgMHhjYSwgMHg2NiwgMHg0NSwgMHhhZSwgMHg3MSwgMHhhZiwgMHhiOCwgMHgyYiwgMHg1NywKKwkweDg3LCAweDE3LCAweDkwLCAweDI4LCAweDk4LCAweDYyLCAweDQ3LCAweDJjLCAweGViLCAweDkyLCAweDc5LCAweDI2LCAweDUyLCAweDdkLCAweDcwLCAweDg4LAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHhhMywgMHgzOCwgMHg3YSwgMHhlNywgMHg3ZSwgMHgyNywgMHg0OSwgMHhiZCwKKwkweGUyLCAweGNjLCAweDg4LCAweGU2LCAweDM2LCAweGFlLCAweGQ2LCAweDdjLCAweDQ4LCAweGUzLCAweGU2LCAweDdkLCAweDExLCAweGQ0LCAweGEwLCAweDNlLAorCTB4NmUsIDB4OWQsIDB4ZGIsIDB4OWIsIDB4ZGMsIDB4YjAsIDB4NzAsIDB4ZGMsIDB4NTgsIDB4NWIsIDB4ZGEsIDB4OTksIDB4OTIsIDB4NjUsIDB4NDgsIDB4ODYsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDUyLCAweDUyLCAweDVjLCAweDY5LCAweGQ2LCAweDhkLCAweGIxLCAweDVmLAorCTB4YTMsIDB4MWMsIDB4ZTEsIDB4MWUsIDB4NzgsIDB4MTUsIDB4OTcsIDB4OWUsIDB4NDQsIDB4ZGYsIDB4NTYsIDB4NjAsIDB4MzgsIDB4MTgsIDB4NDMsIDB4MWIsCisJMHhjMSwgMHg5MSwgMHg2ZSwgMHg0OCwgMHg5OCwgMHhlMiwgMHgxOSwgMHgzNiwgMHg5ZCwgMHg2YywgMHgyMywgMHg1YSwgMHg5NywgMHhhNCwgMHgyNiwgMHgxMywKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCTB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MTIsIDB4MzMsIDB4N2EsIDB4NjgsIDB4YjIsIDB4MjksIDB4OTIsIDB4ODEsCisJMHhhMCwgMHg1YSwgMHg5ZSwgMHhkNSwgMHhiZCwgMHhiNywgMHg0ZiwgMHgxMywgMHg1NSwgMHhiNywgMHhlNywgMHg3MywgMHg1MiwgMHgzMiwgMHgyMSwgMHhiZiwKKwkweDNhLCAweDFiLCAweGIxLCAweDYwLCAweDE5LCAweDVmLCAweDc3LCAweDhiLCAweDdjLCAweDJhLCAweDg3LCAweDI2LCAweDgyLCAweDdmLCAweDFkLCAweGRhLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHhkNiwgMHhhMywgMHhjZCwgMHhjMywgMHg3NiwgMHg0OCwgMHgyMSwgMHhkOCwKKwkweDIxLCAweGFiLCAweDg2LCAweGMyLCAweDVmLCAweDU3LCAweGNhLCAweDdmLCAweDM4LCAweDE5LCAweDRhLCAweDIwLCAweGQ2LCAweGU4LCAweDUxLCAweDIyLAorCTB4NWIsIDB4YjksIDB4MjQsIDB4YjgsIDB4ODUsIDB4ODcsIDB4N2IsIDB4ZTEsIDB4MzgsIDB4YmMsIDB4ZGQsIDB4YWQsIDB4ZGQsIDB4Y2EsIDB4MWYsIDB4YzcsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDU1LCAweDRjLCAweDFmLCAweGRiLCAweDgwLCAweGMzLCAweGMwLCAweDY0LAorCTB4YzMsIDB4NDQsIDB4OWEsIDB4MWUsIDB4ZDcsIDB4ZDMsIDB4MWYsIDB4YTUsIDB4YmEsIDB4ZTMsIDB4MjYsIDB4ZTgsIDB4N2UsIDB4OGQsIDB4NWMsIDB4YWEsCisJMHhiMSwgMHg4MiwgMHhjOSwgMHgzYSwgMHhkNywgMHhkNSwgMHhiMCwgMHhkMCwgMHg0NSwgMHg1MywgMHg4YSwgMHg2NSwgMHg3OCwgMHhlNCwgMHg2YywgMHg4NiwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCTB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4NTgsIDB4N2EsIDB4YzMsIDB4ZGMsIDB4YmIsIDB4NmIsIDB4NDQsIDB4NzAsCisJMHgxMCwgMHg4NiwgMHg4OCwgMHg1YywgMHgyZSwgMHhkYywgMHgyNSwgMHg0YiwgMHhiNywgMHhiMSwgMHg4OCwgMHhjYSwgMHgyNywgMHhiMSwgMHg4MywgMHgyYywKKwkweDIxLCAweDljLCAweGUyLCAweGJmLCAweGU0LCAweDJhLCAweDM1LCAweDE5LCAweGRjLCAweDk5LCAweGJjLCAweDRhLCAweDQ0LCAweGQ2LCAweDRkLCAweDc1LAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHg0NywgMHg1YiwgMHg2NywgMHg3MywgMHgzNSwgMHhlMywgMHgzZSwgMHhiNCwKKwkweDdhLCAweDQ4LCAweDEzLCAweDQ5LCAweDQ3LCAweGFjLCAweGRjLCAweGE4LCAweDFhLCAweDJiLCAweDQ0LCAweGI0LCAweGFjLCAweDk5LCAweDgyLCAweDEzLAorCTB4YzgsIDB4N2IsIDB4N2UsIDB4OWYsIDB4ZWIsIDB4YWIsIDB4YTIsIDB4YzgsIDB4YjIsIDB4M2UsIDB4OTYsIDB4ZDMsIDB4NTMsIDB4MTMsIDB4MzMsIDB4NDIsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDJjLCAweGRkLCAweDQyLCAweDE2LCAweDFlLCAweDM1LCAweDZhLCAweGEwLAorCTB4NWYsIDB4OTMsIDB4NjIsIDB4YzUsIDB4NmQsIDB4YzMsIDB4ZGUsIDB4ODQsIDB4NGIsIDB4ZGYsIDB4ZGUsIDB4YWIsIDB4YmMsIDB4MzEsIDB4Y2QsIDB4YTEsCisJMHhhNiwgMHgxMCwgMHgzMywgMHg0OCwgMHg0YywgMHg2ZiwgMHg2YSwgMHhjMCwgMHhkOCwgMHg5NywgMHgyZSwgMHhiNSwgMHg0OCwgMHg3NCwgMHg3MCwgMHgyOSwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCTB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4NDQsIDB4ZDgsIDB4NWEsIDB4OWEsIDB4YzQsIDB4MWEsIDB4ZDQsIDB4YTcsCisJMHg3MywgMHhjMywgMHgxZiwgMHgxMCwgMHg1NCwgMHg5NSwgMHg1OSwgMHgxNiwgMHg1MywgMHg4OCwgMHgxNCwgMHgzMCwgMHhiZCwgMHg4YywgMHg2ZiwgMHg4ZCwKKwkweDE5LCAweDJmLCAweGFmLCAweDE0LCAweDg4LCAweGQ2LCAweDc5LCAweDMzLCAweGQ2LCAweGQ2LCAweDIyLCAweGI2LCAweDlhLCAweGEwLCAweGNiLCAweDkwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHg5MywgMHhlMSwgMHhjYywgMHgyZiwgMHg1MSwgMHg2NywgMHg4YSwgMHgxNywKKwkweGMzLCAweGFhLCAweDMxLCAweDMxLCAweDhjLCAweGIzLCAweGFhLCAweDk4LCAweGI2LCAweDVkLCAweGUyLCAweDZlLCAweGExLCAweGNmLCAweDEwLCAweGQ0LAorCTB4OGUsIDB4NmMsIDB4OTMsIDB4YmQsIDB4OGIsIDB4ZTksIDB4NGYsIDB4NTUsIDB4ZGMsIDB4M2MsIDB4NGEsIDB4YWQsIDB4NzYsIDB4Y2YsIDB4ZWEsIDB4YjcsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDcyLCAweDUwLCAweDg1LCAweGNmLCAweDU3LCAweDU2LCAweGEzLCAweDFhLAorCTB4NDksIDB4MjUsIDB4YmUsIDB4OGQsIDB4NTQsIDB4YTcsIDB4NzgsIDB4NjgsIDB4NzYsIDB4NTMsIDB4YzcsIDB4NTksIDB4NTksIDB4NjYsIDB4YTEsIDB4ZTQsCisJMHhhMCwgMHg2OCwgMHg0ZCwgMHg1NywgMHg4NSwgMHg2MiwgMHgyYSwgMHg1NiwgMHg2OCwgMHgzOCwgMHgyYiwgMHhkMywgMHhiZCwgMHg5YSwgMHhjNCwgMHhlMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCTB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4YjksIDB4NDAsIDB4M2UsIDB4MTksIDB4NDAsIDB4YWIsIDB4NjAsIDB4YmEsCisJMHhiZiwgMHg2OCwgMHhiOCwgMHhlNywgMHhhMywgMHgzYywgMHg3MywgMHg5YiwgMHgxMiwgMHg2OCwgMHhjYSwgMHg4OSwgMHgzZiwgMHg0NSwgMHg2NywgMHhiZCwKKwkweGQ5LCAweDNjLCAweGQ0LCAweGMwLCAweGE1LCAweDE1LCAweDk4LCAweDZhLCAweDgxLCAweDhiLCAweDM4LCAweDZlLCAweDI3LCAweDRjLCAweDMwLCAweDI5LAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHhiZCwgMHg4YSwgMHg2MSwgMHg1NSwgMHg0ZiwgMHhiOCwgMHgyYiwgMHg2YiwKKwkweDNiLCAweDE5LCAweGUyLCAweDEwLCAweDQ0LCAweGM3LCAweDUxLCAweDRhLCAweDNhLCAweDNiLCAweGMzLCAweDNlLCAweGFiLCAweGNhLCAweDg0LCAweDg2LAorCTB4YWIsIDB4ZTQsIDB4YTMsIDB4NWEsIDB4YTcsIDB4YWYsIDB4NGUsIDB4ODAsIDB4YTAsIDB4OTUsIDB4OTQsIDB4ZGUsIDB4ZDYsIDB4NmUsIDB4MmYsIDB4NjgsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDcyLCAweDM2LCAweDhjLCAweDQ5LCAweDUzLCAweDdhLCAweDUwLCAweGNiLAorCTB4NzUsIDB4MTMsIDB4Y2IsIDB4YWIsIDB4OTIsIDB4NzAsIDB4MTQsIDB4NmEsIDB4OGQsIDB4NGMsIDB4OWMsIDB4NWMsIDB4YTUsIDB4NjksIDB4NDYsIDB4MWQsCisJMHg5OSwgMHg2OCwgMHg3MSwgMHg3MiwgMHg0NCwgMHg4NywgMHhlNywgMHhhOCwgMHhlNiwgMHg5OSwgMHg5ZCwgMHhkYiwgMHgzMSwgMHg4NiwgMHhjOSwgMHg5YywKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCTB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4ZGQsIDB4N2QsIDB4ZTgsIDB4ZDAsIDB4MWMsIDB4MzAsIDB4OGQsIDB4MmQsCisJMHg1NiwgMHg1YSwgMHgxZiwgMHgxZCwgMHhjMiwgMHhhMiwgMHg3ZiwgMHhjYiwgMHhkOCwgMHhiYywgMHhjYiwgMHg2ZSwgMHgxMiwgMHg2ZSwgMHgyNiwgMHg2MiwKKwkweGViLCAweDQ4LCAweDMyLCAweDkxLCAweDdiLCAweDU5LCAweDZkLCAweGFjLCAweGM3LCAweDdhLCAweDM0LCAweDU1LCAweGMzLCAweDU0LCAweDljLCAweGJmLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCTB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDEwLAorCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgzNSwgMHhlYSwgMHhkOSwgMHgxZiwgMHhiZCwgMHhjOSwgMHg4NCwgMHhlOCwKKwkweGIxLCAweDkyLCAweGMwLCAweDdhLCAweGRlLCAweDc0LCAweGU4LCAweDg3LCAweGIxLCAweGQ2LCAweDIyLCAweGM5LCAweDE5LCAweDQxLCAweDdlLCAweDM2LAorCTB4NjIsIDB4YzYsIDB4NjIsIDB4OTksIDB4OTMsIDB4NGQsIDB4YTksIDB4N2MsIDB4NWMsIDB4MjMsIDB4MzIsIDB4ZTUsIDB4NWEsIDB4NGQsIDB4YmMsIDB4ODcsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLAorCTB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4NWIsIDB4NTEsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLAorCTB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4ODAsIDB4ODAsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLAorCTB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4YTUsIDB4YWYsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsCisJMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHg1YiwgMHg1MSwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsCisJMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHg4MCwgMHg4MCwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsCisJMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHhhNSwgMHhhZiwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwKKwkweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDViLCAweDUxLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwKKwkweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDgwLCAweDgwLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwKKwkweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweGE1LCAweGFmLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLAorCTB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4NWIsIDB4NTEsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLAorCTB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4ODAsIDB4ODAsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLAorCTB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4YTUsIDB4YWYsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsCisJMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHg1YiwgMHg1MSwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsCisJMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHg4MCwgMHg4MCwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsCisJMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHhhNSwgMHhhZiwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwKKwkweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDViLCAweDUxLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwKKwkweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDgwLCAweDgwLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwKKwkweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweGE1LCAweGFmLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLAorCTB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4NWIsIDB4NTEsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLAorCTB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4ODAsIDB4ODAsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLAorCTB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4YTUsIDB4YWYsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsCisJMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHg1YiwgMHg1MSwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsCisJMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHg4MCwgMHg4MCwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsCisJMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHhhNSwgMHhhZiwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwKKwkweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDViLCAweDUxLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwKKwkweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDgwLCAweDgwLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwKKwkweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweGE1LCAweGFmLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLAorCTB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4NWIsIDB4NTEsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLAorCTB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4ODAsIDB4ODAsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLAorCTB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4YTUsIDB4YWYsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsCisJMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHg1YiwgMHg1MSwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsCisJMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHg4MCwgMHg4MCwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsCisJMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHhhNSwgMHhhZiwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwKKwkweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDViLCAweDUxLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwKKwkweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDgwLCAweDgwLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwKKwkweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweGE1LCAweGFmLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLAorCTB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4NWIsIDB4NTEsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLAorCTB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4ODAsIDB4ODAsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLAorCTB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4YTUsIDB4YWYsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsCisJMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHg1YiwgMHg1MSwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsCisJMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHg4MCwgMHg4MCwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsCisJMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHhhNSwgMHhhZiwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwKKwkweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDViLCAweDUxLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwKKwkweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDgwLCAweDgwLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwKKwkweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweGE1LCAweGFmLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLAorCTB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4NWIsIDB4NTEsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLAorCTB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4ODAsIDB4ODAsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLAorCTB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4YTUsIDB4YWYsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsCisJMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHg1YiwgMHg1MSwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsCisJMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHg4MCwgMHg4MCwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsCisJMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHhhNSwgMHhhZiwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwKKwkweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDViLCAweDUxLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwKKwkweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDgwLCAweDgwLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwKKwkweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweGE1LCAweGFmLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLAorCTB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4NWIsIDB4NTEsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLAorCTB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4ODAsIDB4ODAsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLAorCTB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4YTUsIDB4YWYsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsCisJMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHg1YiwgMHg1MSwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsCisJMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHg4MCwgMHg4MCwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsCisJMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHhhNSwgMHhhZiwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwKKwkweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDViLCAweDUxLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwKKwkweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDgwLCAweDgwLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwKKwkweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweGE1LCAweGFmLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLAorCTB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4NWIsIDB4NTEsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLAorCTB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4ODAsIDB4ODAsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLAorCTB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4YTUsIDB4YWYsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsCisJMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHg1YiwgMHg1MSwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsCisJMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHg4MCwgMHg4MCwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsCisJMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHhhNSwgMHhhZiwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwKKwkweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDViLCAweDUxLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwKKwkweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDgwLCAweDgwLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwKKwkweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweGE1LCAweGFmLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLAorCTB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4NWIsIDB4NTEsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLAorCTB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4ODAsIDB4ODAsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLAorCTB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4YTUsIDB4YWYsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsCisJMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHg1YiwgMHg1MSwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsCisJMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHg4MCwgMHg4MCwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsCisJMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHhhNSwgMHhhZiwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwKKwkweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDViLCAweDUxLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwKKwkweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDgwLCAweDgwLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwKKwkweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweGE1LCAweGFmLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLAorCTB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4NWIsIDB4NTEsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLAorCTB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4ODAsIDB4ODAsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLAorCTB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4YTUsIDB4YWYsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsCisJMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHg1YiwgMHg1MSwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsCisJMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHg4MCwgMHg4MCwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsCisJMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHhhNSwgMHhhZiwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwKKwkweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDViLCAweDUxLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwKKwkweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDgwLCAweDgwLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwKKwkweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweGE1LCAweGFmLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLAorCTB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4NWIsIDB4NTEsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLAorCTB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4ODAsIDB4ODAsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLAorCTB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4YTUsIDB4YWYsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsCisJMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHg1YiwgMHg1MSwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsCisJMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHg4MCwgMHg4MCwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsCisJMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHhhNSwgMHhhZiwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwKKwkweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDViLCAweDUxLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwKKwkweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDgwLCAweDgwLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwKKwkweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweGE1LCAweGFmLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLAorCTB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4NWIsIDB4NTEsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLAorCTB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4ODAsIDB4ODAsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLAorCTB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4YTUsIDB4YWYsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsCisJMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHg1YiwgMHg1MSwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsCisJMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHg4MCwgMHg4MCwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsCisJMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHhhNSwgMHhhZiwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwKKwkweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDViLCAweDUxLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwKKwkweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDgwLCAweDgwLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwKKwkweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweGE1LCAweGFmLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLAorCTB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4NWIsIDB4NTEsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLAorCTB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4ODAsIDB4ODAsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLAorCTB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4YTUsIDB4YWYsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsCisJMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHg1YiwgMHg1MSwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsCisJMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHg4MCwgMHg4MCwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsCisJMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHhhNSwgMHhhZiwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwKKwkweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDViLCAweDUxLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwKKwkweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDgwLCAweDgwLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwKKwkweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweGE1LCAweGFmLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLAorCTB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4NWIsIDB4NTEsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLAorCTB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4ODAsIDB4ODAsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLAorCTB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4YTUsIDB4YWYsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsIDB4MTAsIDB4OTIsCisJMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHg1YiwgMHg1MSwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsIDB4MzYsIDB4MjIsCisJMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHg4MCwgMHg4MCwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsIDB4NWEsIDB4ZjAsCisJMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHhhNSwgMHhhZiwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwgMHgxMCwgMHg5MiwKKwkweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDEwLCAweDkyLCAweDViLCAweDUxLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwgMHgzNiwgMHgyMiwKKwkweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDM2LCAweDIyLCAweDgwLCAweDgwLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwgMHg1YSwgMHhmMCwKKwkweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweDVhLCAweGYwLCAweGE1LCAweGFmLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4YTUsIDB4YWYsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweGNhLCAweGRlLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4OTMsIDB4NDgsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHhhNSwgMHhhZiwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg5MywgMHg0OCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweGE1LCAweGFmLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDkzLCAweDQ4LCAweGE2LCAweDEwLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwKKwkweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4YTUsIDB4YWYsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweGNhLCAweGRlLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4OTMsIDB4NDgsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLCAweGYwLCAweDZlLAorCTB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHhhNSwgMHhhZiwgMHhjYSwgMHhkZSwKKwkweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg5MywgMHg0OCwgMHhhNiwgMHgxMCwgMHhhNiwgMHgxMCwKKwkweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsIDB4ZjAsIDB4NmUsCisJMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHhmMCwgMHg2ZSwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweGE1LCAweGFmLCAweGNhLCAweGRlLAorCTB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsIDB4Y2EsIDB4ZGUsCisJMHhjYSwgMHhkZSwgMHhjYSwgMHhkZSwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDkzLCAweDQ4LCAweGE2LCAweDEwLCAweGE2LCAweDEwLAorCTB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsIDB4YTYsIDB4MTAsCisJMHhhNiwgMHgxMCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwKKwkweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHhiNiwgMHhhMywgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwKKwkweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LAorCTB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweGI2LCAweGEzLCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LAorCTB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsCisJMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4YjYsIDB4YTMsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsCisJMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwKKwkweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHhiNiwgMHhhMywgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwKKwkweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LAorCTB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweGI2LCAweGEzLCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LAorCTB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsCisJMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4YjYsIDB4YTMsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsCisJMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwKKwkweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHhiNiwgMHhhMywgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwKKwkweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LAorCTB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweGI2LCAweGEzLCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LAorCTB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsCisJMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4YjYsIDB4YTMsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsCisJMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwKKwkweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHhiNiwgMHhhMywgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwKKwkweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LAorCTB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweGI2LCAweGEzLCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LAorCTB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsCisJMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4YjYsIDB4YTMsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsCisJMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwKKwkweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHhiNiwgMHhhMywgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwKKwkweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LAorCTB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweGI2LCAweGEzLCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LAorCTB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsIDB4YzYsIDB4MTUsCisJMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4YjYsIDB4YTMsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsIDB4ZWIsIDB4YzYsCisJMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwgMHhjNiwgMHgxNSwKKwkweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweGM2LCAweDE1LCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHhiNiwgMHhhMywgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwgMHhlYiwgMHhjNiwKKwkweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LCAweGViLCAweGM2LAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorCTB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3RzL2FtZGdwdS91dmRfZW5jX3Rlc3RzLmMgYi90ZXN0cy9hbWRncHUvdXZkX2VuY190ZXN0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZGExMzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hbWRncHUvdXZkX2VuY190ZXN0cy5jCkBAIC0wLDAgKzEsNTE3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgIkNVbml0L0Jhc2ljLmgiCisKKyNpbmNsdWRlICJ1dGlsX21hdGguaCIKKworI2luY2x1ZGUgImFtZGdwdV90ZXN0LmgiCisjaW5jbHVkZSAiYW1kZ3B1X2RybS5oIgorI2luY2x1ZGUgImFtZGdwdV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAidXZlX2liLmgiCisKKyNkZWZpbmUgSUJfU0laRQkJNDA5NgorI2RlZmluZSBNQVhfUkVTT1VSQ0VTCTE2CisKK3N0cnVjdCBhbWRncHVfdXZkX2VuY19ibyB7CisJYW1kZ3B1X2JvX2hhbmRsZSBoYW5kbGU7CisJYW1kZ3B1X3ZhX2hhbmRsZSB2YV9oYW5kbGU7CisJdWludDY0X3QgYWRkcjsKKwl1aW50NjRfdCBzaXplOworCXVpbnQ4X3QgKnB0cjsKK307CisKK3N0cnVjdCBhbWRncHVfdXZkX2VuYyB7CisJdW5zaWduZWQgd2lkdGg7CisJdW5zaWduZWQgaGVpZ2h0OworCXN0cnVjdCBhbWRncHVfdXZkX2VuY19ibyBzZXNzaW9uOworCXN0cnVjdCBhbWRncHVfdXZkX2VuY19ibyB2YnVmOworCXN0cnVjdCBhbWRncHVfdXZkX2VuY19ibyBiczsKKwlzdHJ1Y3QgYW1kZ3B1X3V2ZF9lbmNfYm8gZmI7CisJc3RydWN0IGFtZGdwdV91dmRfZW5jX2JvIGNwYjsKK307CisKK3N0YXRpYyBhbWRncHVfZGV2aWNlX2hhbmRsZSBkZXZpY2VfaGFuZGxlOworc3RhdGljIHVpbnQzMl90IG1ham9yX3ZlcnNpb247CitzdGF0aWMgdWludDMyX3QgbWlub3JfdmVyc2lvbjsKK3N0YXRpYyB1aW50MzJfdCBmYW1pbHlfaWQ7CisKK3N0YXRpYyBhbWRncHVfY29udGV4dF9oYW5kbGUgY29udGV4dF9oYW5kbGU7CitzdGF0aWMgYW1kZ3B1X2JvX2hhbmRsZSBpYl9oYW5kbGU7CitzdGF0aWMgYW1kZ3B1X3ZhX2hhbmRsZSBpYl92YV9oYW5kbGU7CitzdGF0aWMgdWludDY0X3QgaWJfbWNfYWRkcmVzczsKK3N0YXRpYyB1aW50MzJfdCAqaWJfY3B1OworCitzdGF0aWMgc3RydWN0IGFtZGdwdV91dmRfZW5jIGVuYzsKK3N0YXRpYyBhbWRncHVfYm9faGFuZGxlIHJlc291cmNlc1tNQVhfUkVTT1VSQ0VTXTsKK3N0YXRpYyB1bnNpZ25lZCBudW1fcmVzb3VyY2VzOworCitzdGF0aWMgdm9pZCBhbWRncHVfY3NfdXZkX2VuY19jcmVhdGUodm9pZCk7CitzdGF0aWMgdm9pZCBhbWRncHVfY3NfdXZkX2VuY19zZXNzaW9uX2luaXQodm9pZCk7CitzdGF0aWMgdm9pZCBhbWRncHVfY3NfdXZkX2VuY19lbmNvZGUodm9pZCk7CitzdGF0aWMgdm9pZCBhbWRncHVfY3NfdXZkX2VuY19kZXN0cm95KHZvaWQpOworCitzdGF0aWMgYm9vbCB1dmRfZW5jX3N1cHBvcnQodm9pZCk7CisKK0NVX1Rlc3RJbmZvIHV2ZF9lbmNfdGVzdHNbXSA9IHsKKwl7ICJVVkQgRU5DIGNyZWF0ZSIsICBhbWRncHVfY3NfdXZkX2VuY19jcmVhdGUgfSwKKwl7ICJVVkQgRU5DIHNlc3Npb24gaW5pdCIsICBhbWRncHVfY3NfdXZkX2VuY19zZXNzaW9uX2luaXQgfSwKKwl7ICJVVkQgRU5DIGVuY29kZSIsICBhbWRncHVfY3NfdXZkX2VuY19lbmNvZGUgfSwKKwl7ICJVVkQgRU5DIGRlc3Ryb3kiLCAgYW1kZ3B1X2NzX3V2ZF9lbmNfZGVzdHJveSB9LAorCUNVX1RFU1RfSU5GT19OVUxMLAorfTsKKworaW50IHN1aXRlX3V2ZF9lbmNfdGVzdHNfaW5pdCh2b2lkKQoreworCWludCByOworCisJciA9IGFtZGdwdV9kZXZpY2VfaW5pdGlhbGl6ZShkcm1fYW1kZ3B1WzBdLCAmbWFqb3JfdmVyc2lvbiwKKwkJCQkgICAgICZtaW5vcl92ZXJzaW9uLCAmZGV2aWNlX2hhbmRsZSk7CisJaWYgKHIpCisJCXJldHVybiBDVUVfU0lOSVRfRkFJTEVEOworCisJZmFtaWx5X2lkID0gZGV2aWNlX2hhbmRsZS0+aW5mby5mYW1pbHlfaWQ7CisKKwlpZiAoIXV2ZF9lbmNfc3VwcG9ydCgpKSB7CisJCXByaW50ZigiXG5cblRoZSBBU0lDIE5PVCBzdXBwb3J0IFVWRCBFTkMsIGFsbCBzdWItdGVzdHMgd2lsbCBwYXNzXG4iKTsKKwkJcmV0dXJuIENVRV9TVUNDRVNTOworCX0KKworCXIgPSBhbWRncHVfY3NfY3R4X2NyZWF0ZShkZXZpY2VfaGFuZGxlLCAmY29udGV4dF9oYW5kbGUpOworCWlmIChyKQorCQlyZXR1cm4gQ1VFX1NJTklUX0ZBSUxFRDsKKworCXIgPSBhbWRncHVfYm9fYWxsb2NfYW5kX21hcChkZXZpY2VfaGFuZGxlLCBJQl9TSVpFLCA0MDk2LAorCQkJCSAgICBBTURHUFVfR0VNX0RPTUFJTl9HVFQsIDAsCisJCQkJICAgICZpYl9oYW5kbGUsICh2b2lkKiopJmliX2NwdSwKKwkJCQkgICAgJmliX21jX2FkZHJlc3MsICZpYl92YV9oYW5kbGUpOworCWlmIChyKQorCQlyZXR1cm4gQ1VFX1NJTklUX0ZBSUxFRDsKKworCXJldHVybiBDVUVfU1VDQ0VTUzsKK30KKworaW50IHN1aXRlX3V2ZF9lbmNfdGVzdHNfY2xlYW4odm9pZCkKK3sKKwlpbnQgcjsKKworCWlmICghdXZkX2VuY19zdXBwb3J0KCkpIHsKKworCQlyID0gYW1kZ3B1X2RldmljZV9kZWluaXRpYWxpemUoZGV2aWNlX2hhbmRsZSk7CisJCWlmIChyKQorCQkJcmV0dXJuIENVRV9TQ0xFQU5fRkFJTEVEOworCisJCXJldHVybiBDVUVfU1VDQ0VTUzsKKwl9IGVsc2UgeworCisJCXIgPSBhbWRncHVfYm9fdW5tYXBfYW5kX2ZyZWUoaWJfaGFuZGxlLCBpYl92YV9oYW5kbGUsCisJCQkJCSAgICAgaWJfbWNfYWRkcmVzcywgSUJfU0laRSk7CisJCWlmIChyKQorCQkJcmV0dXJuIENVRV9TQ0xFQU5fRkFJTEVEOworCisJCXIgPSBhbWRncHVfY3NfY3R4X2ZyZWUoY29udGV4dF9oYW5kbGUpOworCQlpZiAocikKKwkJCXJldHVybiBDVUVfU0NMRUFOX0ZBSUxFRDsKKworCQlyID0gYW1kZ3B1X2RldmljZV9kZWluaXRpYWxpemUoZGV2aWNlX2hhbmRsZSk7CisJCWlmIChyKQorCQkJcmV0dXJuIENVRV9TQ0xFQU5fRkFJTEVEOworCX0KKworCXJldHVybiBDVUVfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzdWJtaXQodW5zaWduZWQgbmR3LCB1bnNpZ25lZCBpcCkKK3sKKwlzdHJ1Y3QgYW1kZ3B1X2NzX3JlcXVlc3QgaWJzX3JlcXVlc3QgPSB7MH07CisJc3RydWN0IGFtZGdwdV9jc19pYl9pbmZvIGliX2luZm8gPSB7MH07CisJc3RydWN0IGFtZGdwdV9jc19mZW5jZSBmZW5jZV9zdGF0dXMgPSB7MH07CisJdWludDMyX3QgZXhwaXJlZDsKKwlpbnQgcjsKKworCWliX2luZm8uaWJfbWNfYWRkcmVzcyA9IGliX21jX2FkZHJlc3M7CisJaWJfaW5mby5zaXplID0gbmR3OworCisJaWJzX3JlcXVlc3QuaXBfdHlwZSA9IGlwOworCisJciA9IGFtZGdwdV9ib19saXN0X2NyZWF0ZShkZXZpY2VfaGFuZGxlLCBudW1fcmVzb3VyY2VzLCByZXNvdXJjZXMsCisJCQkJICBOVUxMLCAmaWJzX3JlcXVlc3QucmVzb3VyY2VzKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpYnNfcmVxdWVzdC5udW1iZXJfb2ZfaWJzID0gMTsKKwlpYnNfcmVxdWVzdC5pYnMgPSAmaWJfaW5mbzsKKwlpYnNfcmVxdWVzdC5mZW5jZV9pbmZvLmhhbmRsZSA9IE5VTEw7CisKKwlyID0gYW1kZ3B1X2NzX3N1Ym1pdChjb250ZXh0X2hhbmRsZSwgMCwgJmlic19yZXF1ZXN0LCAxKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gYW1kZ3B1X2JvX2xpc3RfZGVzdHJveShpYnNfcmVxdWVzdC5yZXNvdXJjZXMpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWZlbmNlX3N0YXR1cy5jb250ZXh0ID0gY29udGV4dF9oYW5kbGU7CisJZmVuY2Vfc3RhdHVzLmlwX3R5cGUgPSBpcDsKKwlmZW5jZV9zdGF0dXMuZmVuY2UgPSBpYnNfcmVxdWVzdC5zZXFfbm87CisKKwlyID0gYW1kZ3B1X2NzX3F1ZXJ5X2ZlbmNlX3N0YXR1cygmZmVuY2Vfc3RhdHVzLAorCQkJCQkgQU1ER1BVX1RJTUVPVVRfSU5GSU5JVEUsCisJCQkJCSAwLCAmZXhwaXJlZCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFsbG9jX3Jlc291cmNlKHN0cnVjdCBhbWRncHVfdXZkX2VuY19ibyAqdXZkX2VuY19ibywKKwkJCXVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIGRvbWFpbikKK3sKKwlzdHJ1Y3QgYW1kZ3B1X2JvX2FsbG9jX3JlcXVlc3QgcmVxID0gezB9OworCWFtZGdwdV9ib19oYW5kbGUgYnVmX2hhbmRsZTsKKwlhbWRncHVfdmFfaGFuZGxlIHZhX2hhbmRsZTsKKwl1aW50NjRfdCB2YSA9IDA7CisJaW50IHI7CisKKwlyZXEuYWxsb2Nfc2l6ZSA9IEFMSUdOKHNpemUsIDQwOTYpOworCXJlcS5wcmVmZXJyZWRfaGVhcCA9IGRvbWFpbjsKKwlyID0gYW1kZ3B1X2JvX2FsbG9jKGRldmljZV9oYW5kbGUsICZyZXEsICZidWZfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisJciA9IGFtZGdwdV92YV9yYW5nZV9hbGxvYyhkZXZpY2VfaGFuZGxlLAorCQkJCSAgYW1kZ3B1X2dwdV92YV9yYW5nZV9nZW5lcmFsLAorCQkJCSAgcmVxLmFsbG9jX3NpemUsIDEsIDAsICZ2YSwKKwkJCQkgICZ2YV9oYW5kbGUsIDApOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKwlyID0gYW1kZ3B1X2JvX3ZhX29wKGJ1Zl9oYW5kbGUsIDAsIHJlcS5hbGxvY19zaXplLCB2YSwgMCwKKwkJCSAgICBBTURHUFVfVkFfT1BfTUFQKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisJdXZkX2VuY19iby0+YWRkciA9IHZhOworCXV2ZF9lbmNfYm8tPmhhbmRsZSA9IGJ1Zl9oYW5kbGU7CisJdXZkX2VuY19iby0+c2l6ZSA9IHJlcS5hbGxvY19zaXplOworCXV2ZF9lbmNfYm8tPnZhX2hhbmRsZSA9IHZhX2hhbmRsZTsKKwlyID0gYW1kZ3B1X2JvX2NwdV9tYXAodXZkX2VuY19iby0+aGFuZGxlLCAodm9pZCAqKikmdXZkX2VuY19iby0+cHRyKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisJbWVtc2V0KHV2ZF9lbmNfYm8tPnB0ciwgMCwgc2l6ZSk7CisJciA9IGFtZGdwdV9ib19jcHVfdW5tYXAodXZkX2VuY19iby0+aGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcmVzb3VyY2Uoc3RydWN0IGFtZGdwdV91dmRfZW5jX2JvICp1dmRfZW5jX2JvKQoreworCWludCByOworCisJciA9IGFtZGdwdV9ib192YV9vcCh1dmRfZW5jX2JvLT5oYW5kbGUsIDAsIHV2ZF9lbmNfYm8tPnNpemUsCisJCQkgICAgdXZkX2VuY19iby0+YWRkciwgMCwgQU1ER1BVX1ZBX09QX1VOTUFQKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X3ZhX3JhbmdlX2ZyZWUodXZkX2VuY19iby0+dmFfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X2JvX2ZyZWUodXZkX2VuY19iby0+aGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisJbWVtc2V0KHV2ZF9lbmNfYm8sIDAsIHNpemVvZigqdXZkX2VuY19ibykpOworfQorCitzdGF0aWMgYm9vbCB1dmRfZW5jX3N1cHBvcnQodm9pZCkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgZHJtX2FtZGdwdV9pbmZvX2h3X2lwIGluZm87CisKKwlyID0gYW1kZ3B1X3F1ZXJ5X2h3X2lwX2luZm8oZGV2aWNlX2hhbmRsZSwgQU1ER1BVX0hXX0lQX1VWRF9FTkMsIDAsICZpbmZvKTsKKworCWlmIChyKQorCQlyZXR1cm4gZmFsc2U7CisJZWxzZQorCQlyZXR1cm4gKGluZm8uYXZhaWxhYmxlX3JpbmdzP3RydWU6ZmFsc2UpOworfQorCitzdGF0aWMgdm9pZCBhbWRncHVfY3NfdXZkX2VuY19jcmVhdGUodm9pZCkKK3sKKwlpbnQgbGVuLCByOworCisJaWYgKCF1dmRfZW5jX3N1cHBvcnQoKSkKKwkJcmV0dXJuOworCisJZW5jLndpZHRoID0gMTYwOworCWVuYy5oZWlnaHQgPSAxMjg7CisKKwludW1fcmVzb3VyY2VzICA9IDA7CisJYWxsb2NfcmVzb3VyY2UoJmVuYy5zZXNzaW9uLCAxMjggKiAxMDI0LCBBTURHUFVfR0VNX0RPTUFJTl9HVFQpOworCXJlc291cmNlc1tudW1fcmVzb3VyY2VzKytdID0gZW5jLnNlc3Npb24uaGFuZGxlOworCXJlc291cmNlc1tudW1fcmVzb3VyY2VzKytdID0gaWJfaGFuZGxlOworfQorCitzdGF0aWMgdm9pZCBjaGVja19yZXN1bHQoc3RydWN0IGFtZGdwdV91dmRfZW5jICplbmMpCit7CisJdWludDY0X3Qgc3VtOworCXVpbnQzMl90IHMgPSAxNzU2MDI7CisJdWludDMyX3QgKnB0ciwgc2l6ZTsKKwlpbnQgaSwgaiwgcjsKKworCXIgPSBhbWRncHVfYm9fY3B1X21hcChlbmMtPmZiLmhhbmRsZSwgKHZvaWQgKiopJmVuYy0+ZmIucHRyKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisJcHRyID0gKHVpbnQzMl90ICopZW5jLT5mYi5wdHI7CisJc2l6ZSA9IHB0cls2XTsKKwlyID0gYW1kZ3B1X2JvX2NwdV91bm1hcChlbmMtPmZiLmhhbmRsZSk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCXIgPSBhbWRncHVfYm9fY3B1X21hcChlbmMtPmJzLmhhbmRsZSwgKHZvaWQgKiopJmVuYy0+YnMucHRyKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisJZm9yIChqID0gMCwgc3VtID0gMDsgaiA8IHNpemU7ICsraikKKwkJc3VtICs9IGVuYy0+YnMucHRyW2pdOworCUNVX0FTU0VSVF9FUVVBTChzdW0sIHMpOworCXIgPSBhbWRncHVfYm9fY3B1X3VubWFwKGVuYy0+YnMuaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKK30KKworc3RhdGljIHZvaWQgYW1kZ3B1X2NzX3V2ZF9lbmNfc2Vzc2lvbl9pbml0KHZvaWQpCit7CisJaW50IGxlbiwgcjsKKworCWlmICghdXZkX2VuY19zdXBwb3J0KCkpCisJCXJldHVybjsKKworCWxlbiA9IDA7CisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfc2Vzc2lvbl9pbmZvLCBzaXplb2YodXZlX3Nlc3Npb25faW5mbykpOworCWxlbiArPSBzaXplb2YodXZlX3Nlc3Npb25faW5mbykgLyA0OworCWliX2NwdVtsZW4rK10gPSBlbmMuc2Vzc2lvbi5hZGRyID4+IDMyOworCWliX2NwdVtsZW4rK10gPSBlbmMuc2Vzc2lvbi5hZGRyOworCisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfdGFza19pbmZvLCBzaXplb2YodXZlX3Rhc2tfaW5mbykpOworCWxlbiArPSBzaXplb2YodXZlX3Rhc2tfaW5mbykgLyA0OworCWliX2NwdVtsZW4rK10gPSAweDAwMDAwMGQ4OworCWliX2NwdVtsZW4rK10gPSAweDAwMDAwMDAwOworCWliX2NwdVtsZW4rK10gPSAweDAwMDAwMDAwOworCisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfb3BfaW5pdCwgc2l6ZW9mKHV2ZV9vcF9pbml0KSk7CisJbGVuICs9IHNpemVvZih1dmVfb3BfaW5pdCkgLyA0OworCisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfc2Vzc2lvbl9pbml0LCBzaXplb2YodXZlX3Nlc3Npb25faW5pdCkpOworCWxlbiArPSBzaXplb2YodXZlX3Nlc3Npb25faW5pdCkgLyA0OworCisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfbGF5ZXJfY3RybCwgc2l6ZW9mKHV2ZV9sYXllcl9jdHJsKSk7CisJbGVuICs9IHNpemVvZih1dmVfbGF5ZXJfY3RybCkgLyA0OworCisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfc2xpY2VfY3RybCwgc2l6ZW9mKHV2ZV9zbGljZV9jdHJsKSk7CisJbGVuICs9IHNpemVvZih1dmVfc2xpY2VfY3RybCkgLyA0OworCisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfc3BlY19taXNjLCBzaXplb2YodXZlX3NwZWNfbWlzYykpOworCWxlbiArPSBzaXplb2YodXZlX3NwZWNfbWlzYykgLyA0OworCisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfcmNfc2Vzc2lvbl9pbml0LCBzaXplb2YodXZlX3JjX3Nlc3Npb25faW5pdCkpOworCWxlbiArPSBzaXplb2YodXZlX3JjX3Nlc3Npb25faW5pdCkgLyA0OworCisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfZGVibG9ja2luZ19maWx0ZXIsIHNpemVvZih1dmVfZGVibG9ja2luZ19maWx0ZXIpKTsKKwlsZW4gKz0gc2l6ZW9mKHV2ZV9kZWJsb2NraW5nX2ZpbHRlcikgLyA0OworCisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfcXVhbGl0eV9wYXJhbXMsIHNpemVvZih1dmVfcXVhbGl0eV9wYXJhbXMpKTsKKwlsZW4gKz0gc2l6ZW9mKHV2ZV9xdWFsaXR5X3BhcmFtcykgLyA0OworCisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfb3BfaW5pdF9yYywgc2l6ZW9mKHV2ZV9vcF9pbml0X3JjKSk7CisJbGVuICs9IHNpemVvZih1dmVfb3BfaW5pdF9yYykgLyA0OworCisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfb3BfaW5pdF9yY192YnZfbGV2ZWwsIHNpemVvZih1dmVfb3BfaW5pdF9yY192YnZfbGV2ZWwpKTsKKwlsZW4gKz0gc2l6ZW9mKHV2ZV9vcF9pbml0X3JjX3Zidl9sZXZlbCkgLyA0OworCisJciA9IHN1Ym1pdChsZW4sIEFNREdQVV9IV19JUF9VVkRfRU5DKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9jc191dmRfZW5jX2VuY29kZSh2b2lkKQoreworCWludCBsZW4sIHIsIGk7CisJdWludDY0X3QgbHVtYV9vZmZzZXQsIGNocm9tYV9vZmZzZXQ7CisJdWludDMyX3QgdmJ1Zl9zaXplLCBic19zaXplID0gMHgwMDNmNDgwMCwgY3BiX3NpemU7CisJdW5zaWduZWQgYWxpZ24gPSAoZmFtaWx5X2lkID49IEFNREdQVV9GQU1JTFlfQUkpID8gMjU2IDogMTY7CisJdmJ1Zl9zaXplID0gQUxJR04oZW5jLndpZHRoLCBhbGlnbikgKiBBTElHTihlbmMuaGVpZ2h0LCAxNikgKiAxLjU7CisJY3BiX3NpemUgPSB2YnVmX3NpemUgKiAxMDsKKworCWlmICghdXZkX2VuY19zdXBwb3J0KCkpCisJCXJldHVybjsKKworCW51bV9yZXNvdXJjZXMgID0gMDsKKwlhbGxvY19yZXNvdXJjZSgmZW5jLmZiLCA0MDk2LCBBTURHUFVfR0VNX0RPTUFJTl9WUkFNKTsKKwlyZXNvdXJjZXNbbnVtX3Jlc291cmNlcysrXSA9IGVuYy5mYi5oYW5kbGU7CisJYWxsb2NfcmVzb3VyY2UoJmVuYy5icywgYnNfc2l6ZSwgQU1ER1BVX0dFTV9ET01BSU5fVlJBTSk7CisJcmVzb3VyY2VzW251bV9yZXNvdXJjZXMrK10gPSBlbmMuYnMuaGFuZGxlOworCWFsbG9jX3Jlc291cmNlKCZlbmMudmJ1ZiwgdmJ1Zl9zaXplLCBBTURHUFVfR0VNX0RPTUFJTl9WUkFNKTsKKwlyZXNvdXJjZXNbbnVtX3Jlc291cmNlcysrXSA9IGVuYy52YnVmLmhhbmRsZTsKKwlhbGxvY19yZXNvdXJjZSgmZW5jLmNwYiwgY3BiX3NpemUsIEFNREdQVV9HRU1fRE9NQUlOX1ZSQU0pOworCXJlc291cmNlc1tudW1fcmVzb3VyY2VzKytdID0gZW5jLmNwYi5oYW5kbGU7CisJcmVzb3VyY2VzW251bV9yZXNvdXJjZXMrK10gPSBpYl9oYW5kbGU7CisKKwlyID0gYW1kZ3B1X2JvX2NwdV9tYXAoZW5jLnZidWYuaGFuZGxlLCAodm9pZCAqKikmZW5jLnZidWYucHRyKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwltZW1zZXQoZW5jLnZidWYucHRyLCAwLCB2YnVmX3NpemUpOworCWZvciAoaSA9IDA7IGkgPCBlbmMuaGVpZ2h0OyArK2kpIHsKKwkJbWVtY3B5KGVuYy52YnVmLnB0ciwgKGZyYW1lICsgaSAqIGVuYy53aWR0aCksIGVuYy53aWR0aCk7CisJCWVuYy52YnVmLnB0ciArPSBBTElHTihlbmMud2lkdGgsIGFsaWduKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGVuYy5oZWlnaHQgLyAyOyArK2kpIHsKKwkJbWVtY3B5KGVuYy52YnVmLnB0ciwgKChmcmFtZSArIGVuYy5oZWlnaHQgKiBlbmMud2lkdGgpICsgaSAqIGVuYy53aWR0aCksIGVuYy53aWR0aCk7CisJCWVuYy52YnVmLnB0ciArPSBBTElHTihlbmMud2lkdGgsIGFsaWduKTsKKwl9CisKKwlyID0gYW1kZ3B1X2JvX2NwdV91bm1hcChlbmMudmJ1Zi5oYW5kbGUpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCWxlbiA9IDA7CisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfc2Vzc2lvbl9pbmZvLCBzaXplb2YodXZlX3Nlc3Npb25faW5mbykpOworCWxlbiArPSBzaXplb2YodXZlX3Nlc3Npb25faW5mbykgLyA0OworCWliX2NwdVtsZW4rK10gPSBlbmMuc2Vzc2lvbi5hZGRyID4+IDMyOworCWliX2NwdVtsZW4rK10gPSBlbmMuc2Vzc2lvbi5hZGRyOworCisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfdGFza19pbmZvLCBzaXplb2YodXZlX3Rhc2tfaW5mbykpOworCWxlbiArPSBzaXplb2YodXZlX3Rhc2tfaW5mbykgLyA0OworCWliX2NwdVtsZW4rK10gPSAweDAwMDAwNWUwOworCWliX2NwdVtsZW4rK10gPSAweDAwMDAwMDAxOworCWliX2NwdVtsZW4rK10gPSAweDAwMDAwMDAxOworCisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfbmFsdV9idWZmZXJfMSwgc2l6ZW9mKHV2ZV9uYWx1X2J1ZmZlcl8xKSk7CisJbGVuICs9IHNpemVvZih1dmVfbmFsdV9idWZmZXJfMSkgLyA0OworCisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfbmFsdV9idWZmZXJfMiwgc2l6ZW9mKHV2ZV9uYWx1X2J1ZmZlcl8yKSk7CisJbGVuICs9IHNpemVvZih1dmVfbmFsdV9idWZmZXJfMikgLyA0OworCisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfbmFsdV9idWZmZXJfMywgc2l6ZW9mKHV2ZV9uYWx1X2J1ZmZlcl8zKSk7CisJbGVuICs9IHNpemVvZih1dmVfbmFsdV9idWZmZXJfMykgLyA0OworCisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfbmFsdV9idWZmZXJfNCwgc2l6ZW9mKHV2ZV9uYWx1X2J1ZmZlcl80KSk7CisJbGVuICs9IHNpemVvZih1dmVfbmFsdV9idWZmZXJfNCkgLyA0OworCisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfc2xpY2VfaGVhZGVyLCBzaXplb2YodXZlX3NsaWNlX2hlYWRlcikpOworCWxlbiArPSBzaXplb2YodXZlX3NsaWNlX2hlYWRlcikgLyA0OworCisJaWJfY3B1W2xlbisrXSA9IDB4MDAwMDAyNTQ7CisJaWJfY3B1W2xlbisrXSA9IDB4MDAwMDAwMTA7CisJaWJfY3B1W2xlbisrXSA9IGVuYy5jcGIuYWRkciA+PiAzMjsKKwlpYl9jcHVbbGVuKytdID0gZW5jLmNwYi5hZGRyOworCW1lbWNweSgoaWJfY3B1ICsgbGVuKSwgdXZlX2N0eF9idWZmZXIsIHNpemVvZih1dmVfY3R4X2J1ZmZlcikpOworCWxlbiArPSBzaXplb2YodXZlX2N0eF9idWZmZXIpIC8gNDsKKworCW1lbWNweSgoaWJfY3B1ICsgbGVuKSwgdXZlX2JpdHN0cmVhbV9idWZmZXIsIHNpemVvZih1dmVfYml0c3RyZWFtX2J1ZmZlcikpOworCWxlbiArPSBzaXplb2YodXZlX2JpdHN0cmVhbV9idWZmZXIpIC8gNDsKKwlpYl9jcHVbbGVuKytdID0gMHgwMDAwMDAwMDsKKwlpYl9jcHVbbGVuKytdID0gZW5jLmJzLmFkZHIgPj4gMzI7CisJaWJfY3B1W2xlbisrXSA9IGVuYy5icy5hZGRyOworCWliX2NwdVtsZW4rK10gPSAweDAwM2Y0ODAwOworCWliX2NwdVtsZW4rK10gPSAweDAwMDAwMDAwOworCisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfZmVlZGJhY2tfYnVmZmVyLCBzaXplb2YodXZlX2ZlZWRiYWNrX2J1ZmZlcikpOworCWxlbiArPSBzaXplb2YodXZlX2ZlZWRiYWNrX2J1ZmZlcikgLyA0OworCWliX2NwdVtsZW4rK10gPSBlbmMuZmIuYWRkciA+PiAzMjsKKwlpYl9jcHVbbGVuKytdID0gZW5jLmZiLmFkZHI7CisJaWJfY3B1W2xlbisrXSA9IDB4MDAwMDAwMTA7CisJaWJfY3B1W2xlbisrXSA9IDB4MDAwMDAwMjg7CisKKwltZW1jcHkoKGliX2NwdSArIGxlbiksIHV2ZV9mZWVkYmFja19idWZmZXJfYWRkaXRpb25hbCwgc2l6ZW9mKHV2ZV9mZWVkYmFja19idWZmZXJfYWRkaXRpb25hbCkpOworCWxlbiArPSBzaXplb2YodXZlX2ZlZWRiYWNrX2J1ZmZlcl9hZGRpdGlvbmFsKSAvIDQ7CisKKwltZW1jcHkoKGliX2NwdSArIGxlbiksIHV2ZV9pbnRyYV9yZWZyZXNoLCBzaXplb2YodXZlX2ludHJhX3JlZnJlc2gpKTsKKwlsZW4gKz0gc2l6ZW9mKHV2ZV9pbnRyYV9yZWZyZXNoKSAvIDQ7CisKKwltZW1jcHkoKGliX2NwdSArIGxlbiksIHV2ZV9sYXllcl9zZWxlY3QsIHNpemVvZih1dmVfbGF5ZXJfc2VsZWN0KSk7CisJbGVuICs9IHNpemVvZih1dmVfbGF5ZXJfc2VsZWN0KSAvIDQ7CisKKwltZW1jcHkoKGliX2NwdSArIGxlbiksIHV2ZV9yY19sYXllcl9pbml0LCBzaXplb2YodXZlX3JjX2xheWVyX2luaXQpKTsKKwlsZW4gKz0gc2l6ZW9mKHV2ZV9yY19sYXllcl9pbml0KSAvIDQ7CisKKwltZW1jcHkoKGliX2NwdSArIGxlbiksIHV2ZV9sYXllcl9zZWxlY3QsIHNpemVvZih1dmVfbGF5ZXJfc2VsZWN0KSk7CisJbGVuICs9IHNpemVvZih1dmVfbGF5ZXJfc2VsZWN0KSAvIDQ7CisKKwltZW1jcHkoKGliX2NwdSArIGxlbiksIHV2ZV9yY19wZXJfcGljLCBzaXplb2YodXZlX3JjX3Blcl9waWMpKTsKKwlsZW4gKz0gc2l6ZW9mKHV2ZV9yY19wZXJfcGljKSAvIDQ7CisKKwl1bnNpZ25lZCBsdW1hX3NpemUgPSBBTElHTihlbmMud2lkdGgsIGFsaWduKSAqIEFMSUdOKGVuYy5oZWlnaHQsIDE2KTsKKwlsdW1hX29mZnNldCA9IGVuYy52YnVmLmFkZHI7CisJY2hyb21hX29mZnNldCA9IGx1bWFfb2Zmc2V0ICsgbHVtYV9zaXplOworCWliX2NwdVtsZW4rK10gPSAweDAwMDAwMDU0OworCWliX2NwdVtsZW4rK10gPSAweDAwMDAwMDBjOworCWliX2NwdVtsZW4rK10gPSAweDAwMDAwMDAyOworCWliX2NwdVtsZW4rK10gPSAweDAwM2Y0ODAwOworCWliX2NwdVtsZW4rK10gPSBsdW1hX29mZnNldCA+PiAzMjsKKwlpYl9jcHVbbGVuKytdID0gbHVtYV9vZmZzZXQ7CisJaWJfY3B1W2xlbisrXSA9IGNocm9tYV9vZmZzZXQgPj4gMzI7CisJaWJfY3B1W2xlbisrXSA9IGNocm9tYV9vZmZzZXQ7CisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB1dmVfZW5jb2RlX3BhcmFtLCBzaXplb2YodXZlX2VuY29kZV9wYXJhbSkpOworCWliX2NwdVtsZW5dID0gQUxJR04oZW5jLndpZHRoLCBhbGlnbik7CisJaWJfY3B1W2xlbiArIDFdID0gQUxJR04oZW5jLndpZHRoLCBhbGlnbik7CisJbGVuICs9IHNpemVvZih1dmVfZW5jb2RlX3BhcmFtKSAvIDQ7CisKKwltZW1jcHkoKGliX2NwdSArIGxlbiksIHV2ZV9vcF9zcGVlZF9lbmNfbW9kZSwgc2l6ZW9mKHV2ZV9vcF9zcGVlZF9lbmNfbW9kZSkpOworCWxlbiArPSBzaXplb2YodXZlX29wX3NwZWVkX2VuY19tb2RlKSAvIDQ7CisKKwltZW1jcHkoKGliX2NwdSArIGxlbiksIHV2ZV9vcF9lbmNvZGUsIHNpemVvZih1dmVfb3BfZW5jb2RlKSk7CisJbGVuICs9IHNpemVvZih1dmVfb3BfZW5jb2RlKSAvIDQ7CisKKwlyID0gc3VibWl0KGxlbiwgQU1ER1BVX0hXX0lQX1VWRF9FTkMpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCWNoZWNrX3Jlc3VsdCgmZW5jKTsKKworCWZyZWVfcmVzb3VyY2UoJmVuYy5mYik7CisJZnJlZV9yZXNvdXJjZSgmZW5jLmJzKTsKKwlmcmVlX3Jlc291cmNlKCZlbmMudmJ1Zik7CisJZnJlZV9yZXNvdXJjZSgmZW5jLmNwYik7Cit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9jc191dmRfZW5jX2Rlc3Ryb3kodm9pZCkKK3sKKwlzdHJ1Y3QgYW1kZ3B1X3V2ZF9lbmNfYm8gc3dfY3R4OworCWludCBsZW4sIHI7CisKKwlpZiAoIXV2ZF9lbmNfc3VwcG9ydCgpKQorCQlyZXR1cm47CisKKwludW1fcmVzb3VyY2VzICA9IDA7CisJcmVzb3VyY2VzW251bV9yZXNvdXJjZXMrK10gPSBpYl9oYW5kbGU7CisKKwlsZW4gPSAwOworCW1lbWNweSgoaWJfY3B1ICsgbGVuKSwgdXZlX3Nlc3Npb25faW5mbywgc2l6ZW9mKHV2ZV9zZXNzaW9uX2luZm8pKTsKKwlsZW4gKz0gc2l6ZW9mKHV2ZV9zZXNzaW9uX2luZm8pIC8gNDsKKwlpYl9jcHVbbGVuKytdID0gZW5jLnNlc3Npb24uYWRkciA+PiAzMjsKKwlpYl9jcHVbbGVuKytdID0gZW5jLnNlc3Npb24uYWRkcjsKKworCW1lbWNweSgoaWJfY3B1ICsgbGVuKSwgdXZlX3Rhc2tfaW5mbywgc2l6ZW9mKHV2ZV90YXNrX2luZm8pKTsKKwlsZW4gKz0gc2l6ZW9mKHV2ZV90YXNrX2luZm8pIC8gNDsKKwlpYl9jcHVbbGVuKytdID0gMHhmZmZmZmZmZjsKKwlpYl9jcHVbbGVuKytdID0gMHgwMDAwMDAwMjsKKwlpYl9jcHVbbGVuKytdID0gMHgwMDAwMDAwMDsKKworCW1lbWNweSgoaWJfY3B1ICsgbGVuKSwgdXZlX29wX2Nsb3NlLCBzaXplb2YodXZlX29wX2Nsb3NlKSk7CisJbGVuICs9IHNpemVvZih1dmVfb3BfY2xvc2UpIC8gNDsKKworCXIgPSBzdWJtaXQobGVuLCBBTURHUFVfSFdfSVBfVVZEX0VOQyk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJZnJlZV9yZXNvdXJjZSgmZW5jLnNlc3Npb24pOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYW1kZ3B1L3V2ZV9pYi5oIGIvdGVzdHMvYW1kZ3B1L3V2ZV9pYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNzJiZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hbWRncHUvdXZlX2liLmgKQEAgLTAsMCArMSw1MjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorKi8KKworI2lmbmRlZiBfdXZlX2liX2hfCisjZGVmaW5lIF91dmVfaWJfaF8KKworc3RhdGljIGNvbnN0IHVpbnQzMl90IHV2ZV9zZXNzaW9uX2luZm9bXSA9IHsKKwkweDAwMDAwMDE4LAorCTB4MDAwMDAwMDEsCisJMHgwMDAwMDAwMCwKKwkweDAwMDEwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IHV2ZV90YXNrX2luZm9bXSA9IHsKKwkweDAwMDAwMDE0LAorCTB4MDAwMDAwMDIsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgdXZlX3Nlc3Npb25faW5pdFtdID0geworCTB4MDAwMDAwMjAsCisJMHgwMDAwMDAwMywKKwkweDAwMDAwMGMwLAorCTB4MDAwMDAwODAsCisJMHgwMDAwMDAyMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCB1dmVfbGF5ZXJfY3RybFtdID0geworCTB4MDAwMDAwMTAsCisJMHgwMDAwMDAwNCwKKwkweDAwMDAwMDAxLAorCTB4MDAwMDAwMDEsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgdXZlX2xheWVyX3NlbGVjdFtdID0geworCTB4MDAwMDAwMGMsCisJMHgwMDAwMDAwNSwKKwkweDAwMDAwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IHV2ZV9zbGljZV9jdHJsW10gPSB7CisJMHgwMDAwMDAxNCwKKwkweDAwMDAwMDA2LAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwNiwKKwkweDAwMDAwMDA2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IHV2ZV9zcGVjX21pc2NbXSA9IHsKKwkweDAwMDAwMDI0LAorCTB4MDAwMDAwMDcsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDEsCisJMHgwMDAwMDAwMSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCB1dmVfcmNfc2Vzc2lvbl9pbml0W10gPSB7CisJMHgwMDAwMDAxMCwKKwkweDAwMDAwMDA4LAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDA0MCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCB1dmVfcmNfbGF5ZXJfaW5pdFtdID0geworCTB4MDAwMDAwMjgsCisJMHgwMDAwMDAwOSwKKwkweDAwMWU4NDgwLAorCTB4MDAxZTg0ODAsCisJMHgwMDAwMDAxZSwKKwkweDAwMDAwMDAxLAorCTB4MDAwMTA0NmEsCisJMHgwMDAxMDQ2YSwKKwkweDAwMDEwNDZhLAorCTB4YWFhYWFhYWEsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgdXZlX2RlYmxvY2tpbmdfZmlsdGVyW10gPSB7CisJMHgwMDAwMDAyMCwKKwkweDAwMDAwMDBlLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IHV2ZV9xdWFsaXR5X3BhcmFtc1tdID0geworCTB4MDAwMDAwMTQsCisJMHgwMDAwMDAwZCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCB1dmVfZmVlZGJhY2tfYnVmZmVyW10gPSB7CisJMHgwMDAwMDAxYywKKwkweDAwMDAwMDEyLAorCTB4MDAwMDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgdXZlX2ZlZWRiYWNrX2J1ZmZlcl9hZGRpdGlvbmFsW10gPSB7CisJMHgwMDAwMDEwOCwKKwkweDAwMDAwMDE0LAorCTB4MDAwMDAwMDEsCisJMHgwMDAwMDAxMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgdXZlX25hbHVfYnVmZmVyXzFbXSA9IHsKKwkweDAwMDAwMDE4LAorCTB4MDAwMDAwMTMsCisJMHgwMDAwMDAwMSwKKwkweDAwMDAwMDA3LAorCTB4MDAwMDAwMDEsCisJMHg0NjAxMTAwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCB1dmVfbmFsdV9idWZmZXJfMltdID0geworCTB4MDAwMDAwMmMsCisJMHgwMDAwMDAxMywKKwkweDAwMDAwMDAyLAorCTB4MDAwMDAwMWIsCisJMHgwMDAwMDAwMSwKKwkweDQwMDEwYzAxLAorCTB4ZmZmZjAxNjAsCisJMHgwMDAwMDMwMCwKKwkweGIwMDAwMDAzLAorCTB4MDAwMDAzMDAsCisJMHg5NjJjMDkwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCB1dmVfbmFsdV9idWZmZXJfM1tdID0geworCTB4MDAwMDAwMzQsCisJMHgwMDAwMDAxMywKKwkweDAwMDAwMDAzLAorCTB4MDAwMDAwMjMsCisJMHgwMDAwMDAwMSwKKwkweDQyMDEwMTAxLAorCTB4NjAwMDAwMDMsCisJMHgwMGIwMDAwMCwKKwkweDAzMDAwMDAzLAorCTB4MDA5NmEwMTgsCisJMHgyMDIwNzA4ZiwKKwkweGNiOTI0Mjk1LAorCTB4MTJlMDgwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgdXZlX25hbHVfYnVmZmVyXzRbXSA9IHsKKwkweDAwMDAwMDFjLAorCTB4MDAwMDAwMTMsCisJMHgwMDAwMDAwNCwKKwkweDAwMDAwMDBiLAorCTB4MDAwMDAwMDEsCisJMHg0NDAxZTBmMSwKKwkweDgwOTkyMDAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IHV2ZV9zbGljZV9oZWFkZXJbXSA9IHsKKwkweDAwMDAwMGM4LAorCTB4MDAwMDAwMGIsCisJMHgyODAxMDAwMCwKKwkweDQwMDAwMDAwLAorCTB4NjAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAyLAorCTB4MDAwMDAwMTAsCisJMHgwMDAwMDAwMywKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDIsCisJMHgwMDAwMDAwMiwKKwkweDAwMDAwMDA0LAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMSwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDIsCisJMHgwMDAwMDAwMywKKwkweDAwMDAwMDA1LAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMiwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgdXZlX2VuY29kZV9wYXJhbVtdID0geworCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHhmZmZmZmZmZiwKKwkweDAwMDAwMDAxLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgdXZlX2ludHJhX3JlZnJlc2hbXSA9IHsKKwkweDAwMDAwMDE0LAorCTB4MDAwMDAwMGYsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDEsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgdXZlX2N0eF9idWZmZXJbXSA9IHsKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDBhMCwKKwkweDAwMDAwMGEwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IHV2ZV9iaXRzdHJlYW1fYnVmZmVyW10gPSB7CisJMHgwMDAwMDAxYywKKwkweDAwMDAwMDExLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IHV2ZV9yY19wZXJfcGljW10gPSB7CisJMHgwMDAwMDAyNCwKKwkweDAwMDAwMDBhLAorCTB4MDAwMDAwMWEsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDMzLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDEsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgdXZlX29wX2luaXRbXSA9IHsKKwkweDAwMDAwMDA4LAorCTB4MDgwMDAwMDEsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgdXZlX29wX2Nsb3NlW10gPSB7CisJMHgwMDAwMDAwOCwKKwkweDA4MDAwMDAyLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IHV2ZV9vcF9lbmNvZGVbXSA9IHsKKwkweDAwMDAwMDA4LAorCTB4MDgwMDAwMDMsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgdXZlX29wX2luaXRfcmNbXSA9IHsKKwkweDAwMDAwMDA4LAorCTB4MDgwMDAwMDQsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgdXZlX29wX2luaXRfcmNfdmJ2X2xldmVsW10gPSB7CisJMHgwMDAwMDAwOCwKKwkweDA4MDAwMDA1LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IHV2ZV9vcF9zcGVlZF9lbmNfbW9kZVtdID0geworCTB4MDAwMDAwMDgsCisJMHgwODAwMDAwNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCB1dmVfb3BfYmFsYW5jZV9lbmNfbW9kZVtdID0geworCTB4MDAwMDAwMDgsCisJMHgwODAwMDAwNywKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCB1dmVfb3BfcXVhbGl0eV9lbmNfbW9kZVtdID0geworCTB4MDAwMDAwMDgsCisJMHgwODAwMDAwOCwKK307CisjZW5kaWYgLypfdXZlX2liX2gqLwpkaWZmIC0tZ2l0IGEvdGVzdHMvYW1kZ3B1L3ZjZV9pYi5oIGIvdGVzdHMvYW1kZ3B1L3ZjZV9pYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYWIxNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hbWRncHUvdmNlX2liLmgKQEAgLTAsMCArMSwzMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorKi8KKworI2lmbmRlZiBfdmNlX2liX2hfCisjZGVmaW5lIF92Y2VfaWJfaF8KKworc3RhdGljIGNvbnN0IHVpbnQzMl90IHZjZV9zZXNzaW9uW10gPSB7CisJMHgwMDAwMDAwYywKKwkweDAwMDAwMDAxLAorCTB4NDAwYzAwMDEsCit9OworCitzdGF0aWMgdWludDMyX3QgdmNlX3Rhc2tpbmZvWzhdID0geworCTB4MDAwMDAwMjAsCisJMHgwMDAwMDAwMiwKKwkweGZmZmZmZmZmLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCB2Y2VfY3JlYXRlW10gPSB7CisJMHgwMDAwMDAzMCwKKwkweDAxMDAwMDAxLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDA0MiwKKwkweDAwMDAwMDJhLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDBhMCwKKwkweDAwMDAwMDgwLAorCTB4MDAwMDAwYTAsCisJMHgwMDAwMDBhMCwKKwkweDAwMDAwMDEwLAorCTB4MDAwMDAyMDEsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgdmNlX3JhdGVfY3RybFtdID0geworCTB4MDAwMDAwNzAsCisJMHgwNDAwMDAwNSwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAxYywKKwkweDAwMDAwMDFjLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAzMywKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgdmNlX2NvbmZpZ19leHRbXSA9IHsKKwkweDAwMDAwMDBjLAorCTB4MDQwMDAwMDEsCisJMHgwMDAwMDAwMywKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCB2Y2VfbW90aW9uX2VzdFtdID0geworCTB4MDAwMDAwNjgsCisJMHgwNDAwMDAwNywKKwkweDAwMDAwMDAxLAorCTB4MDAwMDAwMDEsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDEwLAorCTB4MDAwMDAwMTAsCisJMHgwMDAwMDAxMCwKKwkweDAwMDAwMDEwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwZmUsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAxLAorCTB4MDAwMDAwMDEsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCB2Y2VfcmRvW10gPSB7CisJMHgwMDAwMDA0YywKKwkweDA0MDAwMDA4LAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCB2Y2VfcGljX2N0cmxbXSA9IHsKKwkweDAwMDAwMDc0LAorCTB4MDQwMDAwMDIsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwYWEwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDA0MCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMSwKKwkweDAwMDAwMDAyLAorCTB4MDAwMDAwMDEsCisJMHgwMDAwMDAwMSwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgdmNlX2ZlZWRiYWNrW10gPSB7CisJMHgwMDAwMDAxNCwKKwkweDA1MDAwMDA1LAorCTB4MDAwMDAwMDAsCisJMHhmZmZmZmZmZiwKKwkweDAwMDAwMDAxLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IHZjZV9jb250ZXh0X2J1ZmZlcltdID0geworCTB4MDAwMDAwMTAsCisJMHgwNTAwMDAwMSwKKwkweDAwMDAwMDAwLAorCTB4ZmZmZmZmZmYsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgdmNlX2JzX2J1ZmZlcltdID0geworCTB4MDAwMDAwMTQsCisJMHgwNTAwMDAwNCwKKwkweDAwMDAwMDAwLAorCTB4ZmZmZmZmZmYsCisJMHgwMDE1NDAwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCB2Y2VfYXV4X2J1ZmZlcltdID0geworCTB4MDAwMDAwNDgsCisJMHgwNTAwMDAwMiwKKwkweDAwMDBmMDAwLAorCTB4MDAwMTY4MDAsCisJMHgwMDAxZTAwMCwKKwkweDAwMDI1ODAwLAorCTB4MDAwMmQwMDAsCisJMHgwMDAzNDgwMCwKKwkweDAwMDNjMDAwLAorCTB4MDAwNDM4MDAsCisJMHgwMDAwNzgwMCwKKwkweDAwMDA3ODAwLAorCTB4MDAwMDc4MDAsCisJMHgwMDAwNzgwMCwKKwkweDAwMDA3ODAwLAorCTB4MDAwMDc4MDAsCisJMHgwMDAwNzgwMCwKKwkweDAwMDA3ODAwLAorfTsKKworc3RhdGljIHVpbnQzMl90IHZjZV9lbmNvZGVbODhdID0geworCTB4MDAwMDAxNjAsCisJMHgwMzAwMDAwMSwKKwkweDAwMDAwMDExLAorCTB4MDAwMDAwMDAsCisJMHgwMDE1NDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHhmZmZmZmZmZiwKKwkweDAwMDAwMDAwLAorCTB4ZmZmZmZmZmYsCisJMHgwMDAwMDA4MCwKKwkweDAwMDAwMGEwLAorCTB4MDAwMDAwYTAsCisJMHgwMDAxMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDMsCisJMHgwMDAwMDAwMSwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMSwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweGZmZmZmZmZmLAorCTB4ZmZmZmZmZmYsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweGZmZmZmZmZmLAorCTB4ZmZmZmZmZmYsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweGZmZmZmZmZmLAorCTB4ZmZmZmZmZmYsCisJMHhmZmZmZmZmZiwKKwkweGZmZmZmZmZmLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgdmNlX2Rlc3Ryb3lbXSA9IHsKKwkweDAwMDAwMDA4LAorCTB4MDIwMDAwMDEsCit9OworI2VuZGlmIC8qX3ZjZV9pYl9oKi8KZGlmZiAtLWdpdCBhL3Rlc3RzL2FtZGdwdS92Y2VfdGVzdHMuYyBiL3Rlc3RzL2FtZGdwdS92Y2VfdGVzdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjQ0YzEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYW1kZ3B1L3ZjZV90ZXN0cy5jCkBAIC0wLDAgKzEsNTUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgIkNVbml0L0Jhc2ljLmgiCisKKyNpbmNsdWRlICJ1dGlsX21hdGguaCIKKworI2luY2x1ZGUgImFtZGdwdV90ZXN0LmgiCisjaW5jbHVkZSAiYW1kZ3B1X2RybS5oIgorI2luY2x1ZGUgImFtZGdwdV9pbnRlcm5hbC5oIgorCisjaW5jbHVkZSAidmNlX2liLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKworI2RlZmluZSBJQl9TSVpFCQk0MDk2CisjZGVmaW5lIE1BWF9SRVNPVVJDRVMJMTYKKworc3RydWN0IGFtZGdwdV92Y2VfYm8geworCWFtZGdwdV9ib19oYW5kbGUgaGFuZGxlOworCWFtZGdwdV92YV9oYW5kbGUgdmFfaGFuZGxlOworCXVpbnQ2NF90IGFkZHI7CisJdWludDY0X3Qgc2l6ZTsKKwl1aW50OF90ICpwdHI7Cit9OworCitzdHJ1Y3QgYW1kZ3B1X3ZjZV9lbmNvZGUgeworCXVuc2lnbmVkIHdpZHRoOworCXVuc2lnbmVkIGhlaWdodDsKKwlzdHJ1Y3QgYW1kZ3B1X3ZjZV9ibyB2YnVmOworCXN0cnVjdCBhbWRncHVfdmNlX2JvIGJzWzJdOworCXN0cnVjdCBhbWRncHVfdmNlX2JvIGZiWzJdOworCXN0cnVjdCBhbWRncHVfdmNlX2JvIGNwYjsKKwl1bnNpZ25lZCBpYl9sZW47CisJYm9vbCB0d29faW5zdGFuY2U7Cit9OworCitzdGF0aWMgYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2aWNlX2hhbmRsZTsKK3N0YXRpYyB1aW50MzJfdCBtYWpvcl92ZXJzaW9uOworc3RhdGljIHVpbnQzMl90IG1pbm9yX3ZlcnNpb247CitzdGF0aWMgdWludDMyX3QgZmFtaWx5X2lkOworc3RhdGljIHVpbnQzMl90IHZjZV9oYXJ2ZXN0X2NvbmZpZzsKKworc3RhdGljIGFtZGdwdV9jb250ZXh0X2hhbmRsZSBjb250ZXh0X2hhbmRsZTsKK3N0YXRpYyBhbWRncHVfYm9faGFuZGxlIGliX2hhbmRsZTsKK3N0YXRpYyBhbWRncHVfdmFfaGFuZGxlIGliX3ZhX2hhbmRsZTsKK3N0YXRpYyB1aW50NjRfdCBpYl9tY19hZGRyZXNzOworc3RhdGljIHVpbnQzMl90ICppYl9jcHU7CisKK3N0YXRpYyBzdHJ1Y3QgYW1kZ3B1X3ZjZV9lbmNvZGUgZW5jOworc3RhdGljIGFtZGdwdV9ib19oYW5kbGUgcmVzb3VyY2VzW01BWF9SRVNPVVJDRVNdOworc3RhdGljIHVuc2lnbmVkIG51bV9yZXNvdXJjZXM7CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9jc192Y2VfY3JlYXRlKHZvaWQpOworc3RhdGljIHZvaWQgYW1kZ3B1X2NzX3ZjZV9lbmNvZGUodm9pZCk7CitzdGF0aWMgdm9pZCBhbWRncHVfY3NfdmNlX2Rlc3Ryb3kodm9pZCk7CisKK0NVX1Rlc3RJbmZvIHZjZV90ZXN0c1tdID0geworCXsgIlZDRSBjcmVhdGUiLCAgYW1kZ3B1X2NzX3ZjZV9jcmVhdGUgfSwKKwl7ICJWQ0UgZW5jb2RlIiwgIGFtZGdwdV9jc192Y2VfZW5jb2RlIH0sCisJeyAiVkNFIGRlc3Ryb3kiLCAgYW1kZ3B1X2NzX3ZjZV9kZXN0cm95IH0sCisJQ1VfVEVTVF9JTkZPX05VTEwsCit9OworCitpbnQgc3VpdGVfdmNlX3Rlc3RzX2luaXQodm9pZCkKK3sKKwlpbnQgcjsKKworCXIgPSBhbWRncHVfZGV2aWNlX2luaXRpYWxpemUoZHJtX2FtZGdwdVswXSwgJm1ham9yX3ZlcnNpb24sCisJCQkJICAgICAmbWlub3JfdmVyc2lvbiwgJmRldmljZV9oYW5kbGUpOworCWlmIChyKSB7CisJCWlmICgociA9PSAtRUFDQ0VTKSAmJiAoZXJybm8gPT0gRUFDQ0VTKSkKKwkJCXByaW50ZigiXG5cbkVycm9yOiVzLiAiCisJCQkJIkhpbnQ6VHJ5IHRvIHJ1biB0aGlzIHRlc3QgcHJvZ3JhbSBhcyByb290LiIsCisJCQkJc3RyZXJyb3IoZXJybm8pKTsKKworCQlyZXR1cm4gQ1VFX1NJTklUX0ZBSUxFRDsKKwl9CisKKwlmYW1pbHlfaWQgPSBkZXZpY2VfaGFuZGxlLT5pbmZvLmZhbWlseV9pZDsKKwl2Y2VfaGFydmVzdF9jb25maWcgPSBkZXZpY2VfaGFuZGxlLT5pbmZvLnZjZV9oYXJ2ZXN0X2NvbmZpZzsKKworCWlmIChmYW1pbHlfaWQgPj0gQU1ER1BVX0ZBTUlMWV9SViB8fCBmYW1pbHlfaWQgPT0gQU1ER1BVX0ZBTUlMWV9TSSkgeworCQlwcmludGYoIlxuXG5UaGUgQVNJQyBOT1Qgc3VwcG9ydCBWQ0UsIGFsbCBzdWItdGVzdHMgd2lsbCBwYXNzXG4iKTsKKwkJcmV0dXJuIENVRV9TVUNDRVNTOworCX0KKworCXIgPSBhbWRncHVfY3NfY3R4X2NyZWF0ZShkZXZpY2VfaGFuZGxlLCAmY29udGV4dF9oYW5kbGUpOworCWlmIChyKQorCQlyZXR1cm4gQ1VFX1NJTklUX0ZBSUxFRDsKKworCXIgPSBhbWRncHVfYm9fYWxsb2NfYW5kX21hcChkZXZpY2VfaGFuZGxlLCBJQl9TSVpFLCA0MDk2LAorCQkJCSAgICBBTURHUFVfR0VNX0RPTUFJTl9HVFQsIDAsCisJCQkJICAgICZpYl9oYW5kbGUsICh2b2lkKiopJmliX2NwdSwKKwkJCQkgICAgJmliX21jX2FkZHJlc3MsICZpYl92YV9oYW5kbGUpOworCWlmIChyKQorCQlyZXR1cm4gQ1VFX1NJTklUX0ZBSUxFRDsKKworCW1lbXNldCgmZW5jLCAwLCBzaXplb2Yoc3RydWN0IGFtZGdwdV92Y2VfZW5jb2RlKSk7CisKKwlyZXR1cm4gQ1VFX1NVQ0NFU1M7Cit9CisKK2ludCBzdWl0ZV92Y2VfdGVzdHNfY2xlYW4odm9pZCkKK3sKKwlpbnQgcjsKKworCWlmIChmYW1pbHlfaWQgPj0gQU1ER1BVX0ZBTUlMWV9SViB8fCBmYW1pbHlfaWQgPT0gQU1ER1BVX0ZBTUlMWV9TSSkgeworCQlyID0gYW1kZ3B1X2RldmljZV9kZWluaXRpYWxpemUoZGV2aWNlX2hhbmRsZSk7CisJCWlmIChyKQorCQkJcmV0dXJuIENVRV9TQ0xFQU5fRkFJTEVEOworCX0gZWxzZSB7CisJCXIgPSBhbWRncHVfYm9fdW5tYXBfYW5kX2ZyZWUoaWJfaGFuZGxlLCBpYl92YV9oYW5kbGUsCisJCQkJCSAgICAgaWJfbWNfYWRkcmVzcywgSUJfU0laRSk7CisJCWlmIChyKQorCQkJcmV0dXJuIENVRV9TQ0xFQU5fRkFJTEVEOworCisJCXIgPSBhbWRncHVfY3NfY3R4X2ZyZWUoY29udGV4dF9oYW5kbGUpOworCQlpZiAocikKKwkJCXJldHVybiBDVUVfU0NMRUFOX0ZBSUxFRDsKKworCQlyID0gYW1kZ3B1X2RldmljZV9kZWluaXRpYWxpemUoZGV2aWNlX2hhbmRsZSk7CisJCWlmIChyKQorCQkJcmV0dXJuIENVRV9TQ0xFQU5fRkFJTEVEOworCX0KKworCXJldHVybiBDVUVfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzdWJtaXQodW5zaWduZWQgbmR3LCB1bnNpZ25lZCBpcCkKK3sKKwlzdHJ1Y3QgYW1kZ3B1X2NzX3JlcXVlc3QgaWJzX3JlcXVlc3QgPSB7MH07CisJc3RydWN0IGFtZGdwdV9jc19pYl9pbmZvIGliX2luZm8gPSB7MH07CisJc3RydWN0IGFtZGdwdV9jc19mZW5jZSBmZW5jZV9zdGF0dXMgPSB7MH07CisJdWludDMyX3QgZXhwaXJlZDsKKwlpbnQgcjsKKworCWliX2luZm8uaWJfbWNfYWRkcmVzcyA9IGliX21jX2FkZHJlc3M7CisJaWJfaW5mby5zaXplID0gbmR3OworCisJaWJzX3JlcXVlc3QuaXBfdHlwZSA9IGlwOworCisJciA9IGFtZGdwdV9ib19saXN0X2NyZWF0ZShkZXZpY2VfaGFuZGxlLCBudW1fcmVzb3VyY2VzLCByZXNvdXJjZXMsCisJCQkJICBOVUxMLCAmaWJzX3JlcXVlc3QucmVzb3VyY2VzKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpYnNfcmVxdWVzdC5udW1iZXJfb2ZfaWJzID0gMTsKKwlpYnNfcmVxdWVzdC5pYnMgPSAmaWJfaW5mbzsKKwlpYnNfcmVxdWVzdC5mZW5jZV9pbmZvLmhhbmRsZSA9IE5VTEw7CisKKwlyID0gYW1kZ3B1X2NzX3N1Ym1pdChjb250ZXh0X2hhbmRsZSwgMCwgJmlic19yZXF1ZXN0LCAxKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gYW1kZ3B1X2JvX2xpc3RfZGVzdHJveShpYnNfcmVxdWVzdC5yZXNvdXJjZXMpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWZlbmNlX3N0YXR1cy5jb250ZXh0ID0gY29udGV4dF9oYW5kbGU7CisJZmVuY2Vfc3RhdHVzLmlwX3R5cGUgPSBpcDsKKwlmZW5jZV9zdGF0dXMuZmVuY2UgPSBpYnNfcmVxdWVzdC5zZXFfbm87CisKKwlyID0gYW1kZ3B1X2NzX3F1ZXJ5X2ZlbmNlX3N0YXR1cygmZmVuY2Vfc3RhdHVzLAorCQkJCQkgQU1ER1BVX1RJTUVPVVRfSU5GSU5JVEUsCisJCQkJCSAwLCAmZXhwaXJlZCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFsbG9jX3Jlc291cmNlKHN0cnVjdCBhbWRncHVfdmNlX2JvICp2Y2VfYm8sIHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIGRvbWFpbikKK3sKKwlzdHJ1Y3QgYW1kZ3B1X2JvX2FsbG9jX3JlcXVlc3QgcmVxID0gezB9OworCWFtZGdwdV9ib19oYW5kbGUgYnVmX2hhbmRsZTsKKwlhbWRncHVfdmFfaGFuZGxlIHZhX2hhbmRsZTsKKwl1aW50NjRfdCB2YSA9IDA7CisJaW50IHI7CisKKwlyZXEuYWxsb2Nfc2l6ZSA9IEFMSUdOKHNpemUsIDQwOTYpOworCXJlcS5wcmVmZXJyZWRfaGVhcCA9IGRvbWFpbjsKKwlyID0gYW1kZ3B1X2JvX2FsbG9jKGRldmljZV9oYW5kbGUsICZyZXEsICZidWZfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisJciA9IGFtZGdwdV92YV9yYW5nZV9hbGxvYyhkZXZpY2VfaGFuZGxlLAorCQkJCSAgYW1kZ3B1X2dwdV92YV9yYW5nZV9nZW5lcmFsLAorCQkJCSAgcmVxLmFsbG9jX3NpemUsIDEsIDAsICZ2YSwKKwkJCQkgICZ2YV9oYW5kbGUsIDApOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKwlyID0gYW1kZ3B1X2JvX3ZhX29wKGJ1Zl9oYW5kbGUsIDAsIHJlcS5hbGxvY19zaXplLCB2YSwgMCwKKwkJCSAgICBBTURHUFVfVkFfT1BfTUFQKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisJdmNlX2JvLT5hZGRyID0gdmE7CisJdmNlX2JvLT5oYW5kbGUgPSBidWZfaGFuZGxlOworCXZjZV9iby0+c2l6ZSA9IHJlcS5hbGxvY19zaXplOworCXZjZV9iby0+dmFfaGFuZGxlID0gdmFfaGFuZGxlOworCXIgPSBhbWRncHVfYm9fY3B1X21hcCh2Y2VfYm8tPmhhbmRsZSwgKHZvaWQgKiopJnZjZV9iby0+cHRyKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisJbWVtc2V0KHZjZV9iby0+cHRyLCAwLCBzaXplKTsKKwlyID0gYW1kZ3B1X2JvX2NwdV91bm1hcCh2Y2VfYm8tPmhhbmRsZSk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3Jlc291cmNlKHN0cnVjdCBhbWRncHVfdmNlX2JvICp2Y2VfYm8pCit7CisJaW50IHI7CisKKwlyID0gYW1kZ3B1X2JvX3ZhX29wKHZjZV9iby0+aGFuZGxlLCAwLCB2Y2VfYm8tPnNpemUsCisJCQkgICAgdmNlX2JvLT5hZGRyLCAwLCBBTURHUFVfVkFfT1BfVU5NQVApOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCXIgPSBhbWRncHVfdmFfcmFuZ2VfZnJlZSh2Y2VfYm8tPnZhX2hhbmRsZSk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJciA9IGFtZGdwdV9ib19mcmVlKHZjZV9iby0+aGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisJbWVtc2V0KHZjZV9ibywgMCwgc2l6ZW9mKCp2Y2VfYm8pKTsKK30KKworc3RhdGljIHZvaWQgYW1kZ3B1X2NzX3ZjZV9jcmVhdGUodm9pZCkKK3sKKwl1bnNpZ25lZCBhbGlnbiA9IChmYW1pbHlfaWQgPj0gQU1ER1BVX0ZBTUlMWV9BSSkgPyAyNTYgOiAxNjsKKwlpbnQgbGVuLCByOworCisJaWYgKGZhbWlseV9pZCA+PSBBTURHUFVfRkFNSUxZX1JWIHx8IGZhbWlseV9pZCA9PSBBTURHUFVfRkFNSUxZX1NJKQorCQlyZXR1cm47CisKKwllbmMud2lkdGggPSB2Y2VfY3JlYXRlWzZdOworCWVuYy5oZWlnaHQgPSB2Y2VfY3JlYXRlWzddOworCisJbnVtX3Jlc291cmNlcyAgPSAwOworCWFsbG9jX3Jlc291cmNlKCZlbmMuZmJbMF0sIDQwOTYsIEFNREdQVV9HRU1fRE9NQUlOX0dUVCk7CisJcmVzb3VyY2VzW251bV9yZXNvdXJjZXMrK10gPSBlbmMuZmJbMF0uaGFuZGxlOworCXJlc291cmNlc1tudW1fcmVzb3VyY2VzKytdID0gaWJfaGFuZGxlOworCisJbGVuID0gMDsKKwltZW1jcHkoaWJfY3B1LCB2Y2Vfc2Vzc2lvbiwgc2l6ZW9mKHZjZV9zZXNzaW9uKSk7CisJbGVuICs9IHNpemVvZih2Y2Vfc2Vzc2lvbikgLyA0OworCW1lbWNweSgoaWJfY3B1ICsgbGVuKSwgdmNlX3Rhc2tpbmZvLCBzaXplb2YodmNlX3Rhc2tpbmZvKSk7CisJbGVuICs9IHNpemVvZih2Y2VfdGFza2luZm8pIC8gNDsKKwltZW1jcHkoKGliX2NwdSArIGxlbiksIHZjZV9jcmVhdGUsIHNpemVvZih2Y2VfY3JlYXRlKSk7CisJaWJfY3B1W2xlbiArIDhdID0gQUxJR04oZW5jLndpZHRoLCBhbGlnbik7CisJaWJfY3B1W2xlbiArIDldID0gQUxJR04oZW5jLndpZHRoLCBhbGlnbik7CisJbGVuICs9IHNpemVvZih2Y2VfY3JlYXRlKSAvIDQ7CisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB2Y2VfZmVlZGJhY2ssIHNpemVvZih2Y2VfZmVlZGJhY2spKTsKKwlpYl9jcHVbbGVuICsgMl0gPSBlbmMuZmJbMF0uYWRkciA+PiAzMjsKKwlpYl9jcHVbbGVuICsgM10gPSBlbmMuZmJbMF0uYWRkcjsKKwlsZW4gKz0gc2l6ZW9mKHZjZV9mZWVkYmFjaykgLyA0OworCisJciA9IHN1Ym1pdChsZW4sIEFNREdQVV9IV19JUF9WQ0UpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCWZyZWVfcmVzb3VyY2UoJmVuYy5mYlswXSk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9jc192Y2VfY29uZmlnKHZvaWQpCit7CisJaW50IGxlbiA9IDAsIHI7CisKKwltZW1jcHkoKGliX2NwdSArIGxlbiksIHZjZV9zZXNzaW9uLCBzaXplb2YodmNlX3Nlc3Npb24pKTsKKwlsZW4gKz0gc2l6ZW9mKHZjZV9zZXNzaW9uKSAvIDQ7CisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB2Y2VfdGFza2luZm8sIHNpemVvZih2Y2VfdGFza2luZm8pKTsKKwlpYl9jcHVbbGVuICsgM10gPSAyOworCWliX2NwdVtsZW4gKyA2XSA9IDB4ZmZmZmZmZmY7CisJbGVuICs9IHNpemVvZih2Y2VfdGFza2luZm8pIC8gNDsKKwltZW1jcHkoKGliX2NwdSArIGxlbiksIHZjZV9yYXRlX2N0cmwsIHNpemVvZih2Y2VfcmF0ZV9jdHJsKSk7CisJbGVuICs9IHNpemVvZih2Y2VfcmF0ZV9jdHJsKSAvIDQ7CisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB2Y2VfY29uZmlnX2V4dCwgc2l6ZW9mKHZjZV9jb25maWdfZXh0KSk7CisJbGVuICs9IHNpemVvZih2Y2VfY29uZmlnX2V4dCkgLyA0OworCW1lbWNweSgoaWJfY3B1ICsgbGVuKSwgdmNlX21vdGlvbl9lc3QsIHNpemVvZih2Y2VfbW90aW9uX2VzdCkpOworCWxlbiArPSBzaXplb2YodmNlX21vdGlvbl9lc3QpIC8gNDsKKwltZW1jcHkoKGliX2NwdSArIGxlbiksIHZjZV9yZG8sIHNpemVvZih2Y2VfcmRvKSk7CisJbGVuICs9IHNpemVvZih2Y2VfcmRvKSAvIDQ7CisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB2Y2VfcGljX2N0cmwsIHNpemVvZih2Y2VfcGljX2N0cmwpKTsKKwlsZW4gKz0gc2l6ZW9mKHZjZV9waWNfY3RybCkgLyA0OworCisJciA9IHN1Ym1pdChsZW4sIEFNREdQVV9IV19JUF9WQ0UpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKK30KKworc3RhdGljICB2b2lkIGFtZGdwdV9jc192Y2VfZW5jb2RlX2lkcihzdHJ1Y3QgYW1kZ3B1X3ZjZV9lbmNvZGUgKmVuYykKK3sKKworCXVpbnQ2NF90IGx1bWFfb2Zmc2V0LCBjaHJvbWFfb2Zmc2V0OworCXVuc2lnbmVkIGFsaWduID0gKGZhbWlseV9pZCA+PSBBTURHUFVfRkFNSUxZX0FJKSA/IDI1NiA6IDE2OworCXVuc2lnbmVkIGx1bWFfc2l6ZSA9IEFMSUdOKGVuYy0+d2lkdGgsIGFsaWduKSAqIEFMSUdOKGVuYy0+aGVpZ2h0LCAxNik7CisJaW50IGxlbiA9IDAsIGksIHI7CisKKwlsdW1hX29mZnNldCA9IGVuYy0+dmJ1Zi5hZGRyOworCWNocm9tYV9vZmZzZXQgPSBsdW1hX29mZnNldCArIGx1bWFfc2l6ZTsKKworCW1lbWNweSgoaWJfY3B1ICsgbGVuKSwgdmNlX3Nlc3Npb24sIHNpemVvZih2Y2Vfc2Vzc2lvbikpOworCWxlbiArPSBzaXplb2YodmNlX3Nlc3Npb24pIC8gNDsKKwltZW1jcHkoKGliX2NwdSArIGxlbiksIHZjZV90YXNraW5mbywgc2l6ZW9mKHZjZV90YXNraW5mbykpOworCWxlbiArPSBzaXplb2YodmNlX3Rhc2tpbmZvKSAvIDQ7CisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB2Y2VfYnNfYnVmZmVyLCBzaXplb2YodmNlX2JzX2J1ZmZlcikpOworCWliX2NwdVtsZW4gKyAyXSA9IGVuYy0+YnNbMF0uYWRkciA+PiAzMjsKKwlpYl9jcHVbbGVuICsgM10gPSBlbmMtPmJzWzBdLmFkZHI7CisJbGVuICs9IHNpemVvZih2Y2VfYnNfYnVmZmVyKSAvIDQ7CisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB2Y2VfY29udGV4dF9idWZmZXIsIHNpemVvZih2Y2VfY29udGV4dF9idWZmZXIpKTsKKwlpYl9jcHVbbGVuICsgMl0gPSBlbmMtPmNwYi5hZGRyID4+IDMyOworCWliX2NwdVtsZW4gKyAzXSA9IGVuYy0+Y3BiLmFkZHI7CisJbGVuICs9IHNpemVvZih2Y2VfY29udGV4dF9idWZmZXIpIC8gNDsKKwltZW1jcHkoKGliX2NwdSArIGxlbiksIHZjZV9hdXhfYnVmZmVyLCBzaXplb2YodmNlX2F1eF9idWZmZXIpKTsKKwlmb3IgKGkgPSAwOyBpIDwgIDg7ICsraSkKKwkJaWJfY3B1W2xlbiArIDIgKyBpXSA9IGx1bWFfc2l6ZSAqIDEuNSAqIChpICsgMik7CisJZm9yIChpID0gMDsgaSA8ICA4OyArK2kpCisJCWliX2NwdVtsZW4gKyAxMCArIGldID0gbHVtYV9zaXplICogMS41OworCWxlbiArPSBzaXplb2YodmNlX2F1eF9idWZmZXIpIC8gNDsKKwltZW1jcHkoKGliX2NwdSArIGxlbiksIHZjZV9mZWVkYmFjaywgc2l6ZW9mKHZjZV9mZWVkYmFjaykpOworCWliX2NwdVtsZW4gKyAyXSA9IGVuYy0+ZmJbMF0uYWRkciA+PiAzMjsKKwlpYl9jcHVbbGVuICsgM10gPSBlbmMtPmZiWzBdLmFkZHI7CisJbGVuICs9IHNpemVvZih2Y2VfZmVlZGJhY2spIC8gNDsKKwltZW1jcHkoKGliX2NwdSArIGxlbiksIHZjZV9lbmNvZGUsIHNpemVvZih2Y2VfZW5jb2RlKSk7CisJaWJfY3B1W2xlbiArIDldID0gbHVtYV9vZmZzZXQgPj4gMzI7CisJaWJfY3B1W2xlbiArIDEwXSA9IGx1bWFfb2Zmc2V0OworCWliX2NwdVtsZW4gKyAxMV0gPSBjaHJvbWFfb2Zmc2V0ID4+IDMyOworCWliX2NwdVtsZW4gKyAxMl0gPSBjaHJvbWFfb2Zmc2V0OworCWliX2NwdVtsZW4gKyAxNF0gPSBBTElHTihlbmMtPndpZHRoLCBhbGlnbik7CisJaWJfY3B1W2xlbiArIDE1XSA9IEFMSUdOKGVuYy0+d2lkdGgsIGFsaWduKTsKKwlpYl9jcHVbbGVuICsgNzNdID0gbHVtYV9zaXplICogMS41OworCWliX2NwdVtsZW4gKyA3NF0gPSBsdW1hX3NpemUgKiAyLjU7CisJbGVuICs9IHNpemVvZih2Y2VfZW5jb2RlKSAvIDQ7CisJZW5jLT5pYl9sZW4gPSBsZW47CisJaWYgKCFlbmMtPnR3b19pbnN0YW5jZSkgeworCQlyID0gc3VibWl0KGxlbiwgQU1ER1BVX0hXX0lQX1ZDRSk7CisJCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9jc192Y2VfZW5jb2RlX3Aoc3RydWN0IGFtZGdwdV92Y2VfZW5jb2RlICplbmMpCit7CisJdWludDY0X3QgbHVtYV9vZmZzZXQsIGNocm9tYV9vZmZzZXQ7CisJaW50IGxlbiwgaSwgcjsKKwl1bnNpZ25lZCBhbGlnbiA9IChmYW1pbHlfaWQgPj0gQU1ER1BVX0ZBTUlMWV9BSSkgPyAyNTYgOiAxNjsKKwl1bnNpZ25lZCBsdW1hX3NpemUgPSBBTElHTihlbmMtPndpZHRoLCBhbGlnbikgKiBBTElHTihlbmMtPmhlaWdodCwgMTYpOworCisJbGVuID0gKGVuYy0+dHdvX2luc3RhbmNlKSA/IGVuYy0+aWJfbGVuIDogMDsKKwlsdW1hX29mZnNldCA9IGVuYy0+dmJ1Zi5hZGRyOworCWNocm9tYV9vZmZzZXQgPSBsdW1hX29mZnNldCArIGx1bWFfc2l6ZTsKKworCWlmICghZW5jLT50d29faW5zdGFuY2UpIHsKKwkJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB2Y2Vfc2Vzc2lvbiwgc2l6ZW9mKHZjZV9zZXNzaW9uKSk7CisJCWxlbiArPSBzaXplb2YodmNlX3Nlc3Npb24pIC8gNDsKKwl9CisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB2Y2VfdGFza2luZm8sIHNpemVvZih2Y2VfdGFza2luZm8pKTsKKwlsZW4gKz0gc2l6ZW9mKHZjZV90YXNraW5mbykgLyA0OworCW1lbWNweSgoaWJfY3B1ICsgbGVuKSwgdmNlX2JzX2J1ZmZlciwgc2l6ZW9mKHZjZV9ic19idWZmZXIpKTsKKwlpYl9jcHVbbGVuICsgMl0gPSBlbmMtPmJzWzFdLmFkZHIgPj4gMzI7CisJaWJfY3B1W2xlbiArIDNdID0gZW5jLT5ic1sxXS5hZGRyOworCWxlbiArPSBzaXplb2YodmNlX2JzX2J1ZmZlcikgLyA0OworCW1lbWNweSgoaWJfY3B1ICsgbGVuKSwgdmNlX2NvbnRleHRfYnVmZmVyLCBzaXplb2YodmNlX2NvbnRleHRfYnVmZmVyKSk7CisJaWJfY3B1W2xlbiArIDJdID0gZW5jLT5jcGIuYWRkciA+PiAzMjsKKwlpYl9jcHVbbGVuICsgM10gPSBlbmMtPmNwYi5hZGRyOworCWxlbiArPSBzaXplb2YodmNlX2NvbnRleHRfYnVmZmVyKSAvIDQ7CisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB2Y2VfYXV4X2J1ZmZlciwgc2l6ZW9mKHZjZV9hdXhfYnVmZmVyKSk7CisJZm9yIChpID0gMDsgaSA8ICA4OyArK2kpCisJCWliX2NwdVtsZW4gKyAyICsgaV0gPSBsdW1hX3NpemUgKiAxLjUgKiAoaSArIDIpOworCWZvciAoaSA9IDA7IGkgPCAgODsgKytpKQorCQlpYl9jcHVbbGVuICsgMTAgKyBpXSA9IGx1bWFfc2l6ZSAqIDEuNTsKKwlsZW4gKz0gc2l6ZW9mKHZjZV9hdXhfYnVmZmVyKSAvIDQ7CisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB2Y2VfZmVlZGJhY2ssIHNpemVvZih2Y2VfZmVlZGJhY2spKTsKKwlpYl9jcHVbbGVuICsgMl0gPSBlbmMtPmZiWzFdLmFkZHIgPj4gMzI7CisJaWJfY3B1W2xlbiArIDNdID0gZW5jLT5mYlsxXS5hZGRyOworCWxlbiArPSBzaXplb2YodmNlX2ZlZWRiYWNrKSAvIDQ7CisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB2Y2VfZW5jb2RlLCBzaXplb2YodmNlX2VuY29kZSkpOworCWliX2NwdVtsZW4gKyAyXSA9IDA7CisJaWJfY3B1W2xlbiArIDldID0gbHVtYV9vZmZzZXQgPj4gMzI7CisJaWJfY3B1W2xlbiArIDEwXSA9IGx1bWFfb2Zmc2V0OworCWliX2NwdVtsZW4gKyAxMV0gPSBjaHJvbWFfb2Zmc2V0ID4+IDMyOworCWliX2NwdVtsZW4gKyAxMl0gPSBjaHJvbWFfb2Zmc2V0OworCWliX2NwdVtsZW4gKyAxNF0gPSBBTElHTihlbmMtPndpZHRoLCBhbGlnbik7CisJaWJfY3B1W2xlbiArIDE1XSA9IEFMSUdOKGVuYy0+d2lkdGgsIGFsaWduKTsKKwlpYl9jcHVbbGVuICsgMThdID0gMDsKKwlpYl9jcHVbbGVuICsgMTldID0gMDsKKwlpYl9jcHVbbGVuICsgNTZdID0gMzsKKwlpYl9jcHVbbGVuICsgNTddID0gMDsKKwlpYl9jcHVbbGVuICsgNThdID0gMDsKKwlpYl9jcHVbbGVuICsgNTldID0gbHVtYV9zaXplICogMS41OworCWliX2NwdVtsZW4gKyA2MF0gPSBsdW1hX3NpemUgKiAyLjU7CisJaWJfY3B1W2xlbiArIDczXSA9IDA7CisJaWJfY3B1W2xlbiArIDc0XSA9IGx1bWFfc2l6ZTsKKwlpYl9jcHVbbGVuICsgODFdID0gMTsKKwlpYl9jcHVbbGVuICsgODJdID0gMTsKKwlsZW4gKz0gc2l6ZW9mKHZjZV9lbmNvZGUpIC8gNDsKKworCXIgPSBzdWJtaXQobGVuLCBBTURHUFVfSFdfSVBfVkNFKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3Jlc3VsdChzdHJ1Y3QgYW1kZ3B1X3ZjZV9lbmNvZGUgKmVuYykKK3sKKwl1aW50NjRfdCBzdW07CisJdWludDMyX3Qgc1syXSA9IHsxODAzMjUsIDE1OTQ2fTsKKwl1aW50MzJfdCAqcHRyLCBzaXplOworCWludCBpLCBqLCByOworCisJZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworCQlyID0gYW1kZ3B1X2JvX2NwdV9tYXAoZW5jLT5mYltpXS5oYW5kbGUsICh2b2lkICoqKSZlbmMtPmZiW2ldLnB0cik7CisJCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKwkJcHRyID0gKHVpbnQzMl90ICopZW5jLT5mYltpXS5wdHI7CisJCXNpemUgPSBwdHJbNF0gLSBwdHJbOV07CisJCXIgPSBhbWRncHVfYm9fY3B1X3VubWFwKGVuYy0+ZmJbaV0uaGFuZGxlKTsKKwkJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCQlyID0gYW1kZ3B1X2JvX2NwdV9tYXAoZW5jLT5ic1tpXS5oYW5kbGUsICh2b2lkICoqKSZlbmMtPmJzW2ldLnB0cik7CisJCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKwkJZm9yIChqID0gMCwgc3VtID0gMDsgaiA8IHNpemU7ICsraikKKwkJCXN1bSArPSBlbmMtPmJzW2ldLnB0cltqXTsKKwkJQ1VfQVNTRVJUX0VRVUFMKHN1bSwgc1tpXSk7CisJCXIgPSBhbWRncHVfYm9fY3B1X3VubWFwKGVuYy0+YnNbaV0uaGFuZGxlKTsKKwkJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCX0KK30KKworc3RhdGljIHZvaWQgYW1kZ3B1X2NzX3ZjZV9lbmNvZGUodm9pZCkKK3sKKwl1aW50MzJfdCB2YnVmX3NpemUsIGJzX3NpemUgPSAweDE1NDAwMCwgY3BiX3NpemU7CisJdW5zaWduZWQgYWxpZ24gPSAoZmFtaWx5X2lkID49IEFNREdQVV9GQU1JTFlfQUkpID8gMjU2IDogMTY7CisJaW50IGksIHI7CisKKwlpZiAoZmFtaWx5X2lkID49IEFNREdQVV9GQU1JTFlfUlYgfHwgZmFtaWx5X2lkID09IEFNREdQVV9GQU1JTFlfU0kpCisJCXJldHVybjsKKworCXZidWZfc2l6ZSA9IEFMSUdOKGVuYy53aWR0aCwgYWxpZ24pICogQUxJR04oZW5jLmhlaWdodCwgMTYpICogMS41OworCWNwYl9zaXplID0gdmJ1Zl9zaXplICogMTA7CisJbnVtX3Jlc291cmNlcyA9IDA7CisJYWxsb2NfcmVzb3VyY2UoJmVuYy5mYlswXSwgNDA5NiwgQU1ER1BVX0dFTV9ET01BSU5fR1RUKTsKKwlyZXNvdXJjZXNbbnVtX3Jlc291cmNlcysrXSA9IGVuYy5mYlswXS5oYW5kbGU7CisJYWxsb2NfcmVzb3VyY2UoJmVuYy5mYlsxXSwgNDA5NiwgQU1ER1BVX0dFTV9ET01BSU5fR1RUKTsKKwlyZXNvdXJjZXNbbnVtX3Jlc291cmNlcysrXSA9IGVuYy5mYlsxXS5oYW5kbGU7CisJYWxsb2NfcmVzb3VyY2UoJmVuYy5ic1swXSwgYnNfc2l6ZSwgQU1ER1BVX0dFTV9ET01BSU5fR1RUKTsKKwlyZXNvdXJjZXNbbnVtX3Jlc291cmNlcysrXSA9IGVuYy5ic1swXS5oYW5kbGU7CisJYWxsb2NfcmVzb3VyY2UoJmVuYy5ic1sxXSwgYnNfc2l6ZSwgQU1ER1BVX0dFTV9ET01BSU5fR1RUKTsKKwlyZXNvdXJjZXNbbnVtX3Jlc291cmNlcysrXSA9IGVuYy5ic1sxXS5oYW5kbGU7CisJYWxsb2NfcmVzb3VyY2UoJmVuYy52YnVmLCB2YnVmX3NpemUsIEFNREdQVV9HRU1fRE9NQUlOX1ZSQU0pOworCXJlc291cmNlc1tudW1fcmVzb3VyY2VzKytdID0gZW5jLnZidWYuaGFuZGxlOworCWFsbG9jX3Jlc291cmNlKCZlbmMuY3BiLCBjcGJfc2l6ZSwgQU1ER1BVX0dFTV9ET01BSU5fVlJBTSk7CisJcmVzb3VyY2VzW251bV9yZXNvdXJjZXMrK10gPSBlbmMuY3BiLmhhbmRsZTsKKwlyZXNvdXJjZXNbbnVtX3Jlc291cmNlcysrXSA9IGliX2hhbmRsZTsKKworCXIgPSBhbWRncHVfYm9fY3B1X21hcChlbmMudmJ1Zi5oYW5kbGUsICh2b2lkICoqKSZlbmMudmJ1Zi5wdHIpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCW1lbXNldChlbmMudmJ1Zi5wdHIsIDAsIHZidWZfc2l6ZSk7CisJZm9yIChpID0gMDsgaSA8IGVuYy5oZWlnaHQ7ICsraSkgeworCQltZW1jcHkoZW5jLnZidWYucHRyLCAoZnJhbWUgKyBpICogZW5jLndpZHRoKSwgZW5jLndpZHRoKTsKKwkJZW5jLnZidWYucHRyICs9IEFMSUdOKGVuYy53aWR0aCwgYWxpZ24pOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgZW5jLmhlaWdodCAvIDI7ICsraSkgeworCQltZW1jcHkoZW5jLnZidWYucHRyLCAoKGZyYW1lICsgZW5jLmhlaWdodCAqIGVuYy53aWR0aCkgKyBpICogZW5jLndpZHRoKSwgZW5jLndpZHRoKTsKKwkJZW5jLnZidWYucHRyICs9IEFMSUdOKGVuYy53aWR0aCwgYWxpZ24pOworCX0KKworCXIgPSBhbWRncHVfYm9fY3B1X3VubWFwKGVuYy52YnVmLmhhbmRsZSk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJYW1kZ3B1X2NzX3ZjZV9jb25maWcoKTsKKworCWlmIChmYW1pbHlfaWQgPj0gQU1ER1BVX0ZBTUlMWV9WSSkgeworCQl2Y2VfdGFza2luZm9bM10gPSAzOworCQlhbWRncHVfY3NfdmNlX2VuY29kZV9pZHIoJmVuYyk7CisJCWFtZGdwdV9jc192Y2VfZW5jb2RlX3AoJmVuYyk7CisJCWNoZWNrX3Jlc3VsdCgmZW5jKTsKKworCQkvKiB0d28gcGlwZXMgKi8KKwkJdmNlX2VuY29kZVsxNl0gPSAwOworCQlhbWRncHVfY3NfdmNlX2VuY29kZV9pZHIoJmVuYyk7CisJCWFtZGdwdV9jc192Y2VfZW5jb2RlX3AoJmVuYyk7CisJCWNoZWNrX3Jlc3VsdCgmZW5jKTsKKworCQkvKiB0d28gaW5zdGFuY2VzICovCisJCWlmICh2Y2VfaGFydmVzdF9jb25maWcgPT0gMCkgeworCQkJZW5jLnR3b19pbnN0YW5jZSA9IHRydWU7CisJCQl2Y2VfdGFza2luZm9bMl0gPSAweDgzOworCQkJdmNlX3Rhc2tpbmZvWzRdID0gMTsKKwkJCWFtZGdwdV9jc192Y2VfZW5jb2RlX2lkcigmZW5jKTsKKwkJCXZjZV90YXNraW5mb1syXSA9IDB4ZmZmZmZmZmY7CisJCQl2Y2VfdGFza2luZm9bNF0gPSAyOworCQkJYW1kZ3B1X2NzX3ZjZV9lbmNvZGVfcCgmZW5jKTsKKwkJCWNoZWNrX3Jlc3VsdCgmZW5jKTsKKwkJfQorCX0gZWxzZSB7CisJCXZjZV90YXNraW5mb1szXSA9IDM7CisJCXZjZV9lbmNvZGVbMTZdID0gMDsKKwkJYW1kZ3B1X2NzX3ZjZV9lbmNvZGVfaWRyKCZlbmMpOworCQlhbWRncHVfY3NfdmNlX2VuY29kZV9wKCZlbmMpOworCQljaGVja19yZXN1bHQoJmVuYyk7CisJfQorCisJZnJlZV9yZXNvdXJjZSgmZW5jLmZiWzBdKTsKKwlmcmVlX3Jlc291cmNlKCZlbmMuZmJbMV0pOworCWZyZWVfcmVzb3VyY2UoJmVuYy5ic1swXSk7CisJZnJlZV9yZXNvdXJjZSgmZW5jLmJzWzFdKTsKKwlmcmVlX3Jlc291cmNlKCZlbmMudmJ1Zik7CisJZnJlZV9yZXNvdXJjZSgmZW5jLmNwYik7Cit9CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9jc192Y2VfZGVzdHJveSh2b2lkKQoreworCWludCBsZW4sIHI7CisKKwlpZiAoZmFtaWx5X2lkID49IEFNREdQVV9GQU1JTFlfUlYgfHwgZmFtaWx5X2lkID09IEFNREdQVV9GQU1JTFlfU0kpCisJCXJldHVybjsKKworCW51bV9yZXNvdXJjZXMgID0gMDsKKwlhbGxvY19yZXNvdXJjZSgmZW5jLmZiWzBdLCA0MDk2LCBBTURHUFVfR0VNX0RPTUFJTl9HVFQpOworCXJlc291cmNlc1tudW1fcmVzb3VyY2VzKytdID0gZW5jLmZiWzBdLmhhbmRsZTsKKwlyZXNvdXJjZXNbbnVtX3Jlc291cmNlcysrXSA9IGliX2hhbmRsZTsKKworCWxlbiA9IDA7CisJbWVtY3B5KGliX2NwdSwgdmNlX3Nlc3Npb24sIHNpemVvZih2Y2Vfc2Vzc2lvbikpOworCWxlbiArPSBzaXplb2YodmNlX3Nlc3Npb24pIC8gNDsKKwltZW1jcHkoKGliX2NwdSArIGxlbiksIHZjZV90YXNraW5mbywgc2l6ZW9mKHZjZV90YXNraW5mbykpOworCWliX2NwdVtsZW4gKyAzXSA9IDE7CisJbGVuICs9IHNpemVvZih2Y2VfdGFza2luZm8pIC8gNDsKKwltZW1jcHkoKGliX2NwdSArIGxlbiksIHZjZV9mZWVkYmFjaywgc2l6ZW9mKHZjZV9mZWVkYmFjaykpOworCWliX2NwdVtsZW4gKyAyXSA9IGVuYy5mYlswXS5hZGRyID4+IDMyOworCWliX2NwdVtsZW4gKyAzXSA9IGVuYy5mYlswXS5hZGRyOworCWxlbiArPSBzaXplb2YodmNlX2ZlZWRiYWNrKSAvIDQ7CisJbWVtY3B5KChpYl9jcHUgKyBsZW4pLCB2Y2VfZGVzdHJveSwgc2l6ZW9mKHZjZV9kZXN0cm95KSk7CisJbGVuICs9IHNpemVvZih2Y2VfZGVzdHJveSkgLyA0OworCisJciA9IHN1Ym1pdChsZW4sIEFNREdQVV9IV19JUF9WQ0UpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCWZyZWVfcmVzb3VyY2UoJmVuYy5mYlswXSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hbWRncHUvdmNuX3Rlc3RzLmMgYi90ZXN0cy9hbWRncHUvdmNuX3Rlc3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIxNjk2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FtZGdwdS92Y25fdGVzdHMuYwpAQCAtMCwwICsxLDQxMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJDVW5pdC9CYXNpYy5oIgorCisjaW5jbHVkZSAidXRpbF9tYXRoLmgiCisKKyNpbmNsdWRlICJhbWRncHVfdGVzdC5oIgorI2luY2x1ZGUgImFtZGdwdV9kcm0uaCIKKyNpbmNsdWRlICJhbWRncHVfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkZWNvZGVfbWVzc2FnZXMuaCIKKworI2RlZmluZSBJQl9TSVpFCQk0MDk2CisjZGVmaW5lIE1BWF9SRVNPVVJDRVMJMTYKKworc3RydWN0IGFtZGdwdV92Y25fYm8geworCWFtZGdwdV9ib19oYW5kbGUgaGFuZGxlOworCWFtZGdwdV92YV9oYW5kbGUgdmFfaGFuZGxlOworCXVpbnQ2NF90IGFkZHI7CisJdWludDY0X3Qgc2l6ZTsKKwl1aW50OF90ICpwdHI7Cit9OworCitzdGF0aWMgYW1kZ3B1X2RldmljZV9oYW5kbGUgZGV2aWNlX2hhbmRsZTsKK3N0YXRpYyB1aW50MzJfdCBtYWpvcl92ZXJzaW9uOworc3RhdGljIHVpbnQzMl90IG1pbm9yX3ZlcnNpb247CitzdGF0aWMgdWludDMyX3QgZmFtaWx5X2lkOworCitzdGF0aWMgYW1kZ3B1X2NvbnRleHRfaGFuZGxlIGNvbnRleHRfaGFuZGxlOworc3RhdGljIGFtZGdwdV9ib19oYW5kbGUgaWJfaGFuZGxlOworc3RhdGljIGFtZGdwdV92YV9oYW5kbGUgaWJfdmFfaGFuZGxlOworc3RhdGljIHVpbnQ2NF90IGliX21jX2FkZHJlc3M7CitzdGF0aWMgdWludDMyX3QgKmliX2NwdTsKKworc3RhdGljIGFtZGdwdV9ib19oYW5kbGUgcmVzb3VyY2VzW01BWF9SRVNPVVJDRVNdOworc3RhdGljIHVuc2lnbmVkIG51bV9yZXNvdXJjZXM7CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9jc192Y25fZGVjX2NyZWF0ZSh2b2lkKTsKK3N0YXRpYyB2b2lkIGFtZGdwdV9jc192Y25fZGVjX2RlY29kZSh2b2lkKTsKK3N0YXRpYyB2b2lkIGFtZGdwdV9jc192Y25fZGVjX2Rlc3Ryb3kodm9pZCk7CisKK3N0YXRpYyB2b2lkIGFtZGdwdV9jc192Y25fZW5jX2NyZWF0ZSh2b2lkKTsKK3N0YXRpYyB2b2lkIGFtZGdwdV9jc192Y25fZW5jX2VuY29kZSh2b2lkKTsKK3N0YXRpYyB2b2lkIGFtZGdwdV9jc192Y25fZW5jX2Rlc3Ryb3kodm9pZCk7CisKK0NVX1Rlc3RJbmZvIHZjbl90ZXN0c1tdID0geworCisJeyAiVkNOIERFQyBjcmVhdGUiLCAgYW1kZ3B1X2NzX3Zjbl9kZWNfY3JlYXRlIH0sCisJeyAiVkNOIERFQyBkZWNvZGUiLCAgYW1kZ3B1X2NzX3Zjbl9kZWNfZGVjb2RlIH0sCisJeyAiVkNOIERFQyBkZXN0cm95IiwgIGFtZGdwdV9jc192Y25fZGVjX2Rlc3Ryb3kgfSwKKworCXsgIlZDTiBFTkMgY3JlYXRlIiwgIGFtZGdwdV9jc192Y25fZW5jX2NyZWF0ZSB9LAorCXsgIlZDTiBFTkMgZGVjb2RlIiwgIGFtZGdwdV9jc192Y25fZW5jX2VuY29kZSB9LAorCXsgIlZDTiBFTkMgZGVzdHJveSIsICBhbWRncHVfY3NfdmNuX2VuY19kZXN0cm95IH0sCisJQ1VfVEVTVF9JTkZPX05VTEwsCit9OworCitpbnQgc3VpdGVfdmNuX3Rlc3RzX2luaXQodm9pZCkKK3sKKwlpbnQgcjsKKworCXIgPSBhbWRncHVfZGV2aWNlX2luaXRpYWxpemUoZHJtX2FtZGdwdVswXSwgJm1ham9yX3ZlcnNpb24sCisJCQkJICAgICAmbWlub3JfdmVyc2lvbiwgJmRldmljZV9oYW5kbGUpOworCWlmIChyKQorCQlyZXR1cm4gQ1VFX1NJTklUX0ZBSUxFRDsKKworCWZhbWlseV9pZCA9IGRldmljZV9oYW5kbGUtPmluZm8uZmFtaWx5X2lkOworCisJaWYgKGZhbWlseV9pZCA8IEFNREdQVV9GQU1JTFlfUlYpIHsKKwkJcHJpbnRmKCJcblxuVGhlIEFTSUMgTk9UIHN1cHBvcnQgVkNOLCBhbGwgc3ViLXRlc3RzIHdpbGwgcGFzc1xuIik7CisJCXJldHVybiBDVUVfU1VDQ0VTUzsKKwl9CisKKwlyID0gYW1kZ3B1X2NzX2N0eF9jcmVhdGUoZGV2aWNlX2hhbmRsZSwgJmNvbnRleHRfaGFuZGxlKTsKKwlpZiAocikKKwkJcmV0dXJuIENVRV9TSU5JVF9GQUlMRUQ7CisKKwlyID0gYW1kZ3B1X2JvX2FsbG9jX2FuZF9tYXAoZGV2aWNlX2hhbmRsZSwgSUJfU0laRSwgNDA5NiwKKwkJCQkgICAgQU1ER1BVX0dFTV9ET01BSU5fR1RULCAwLAorCQkJCSAgICAmaWJfaGFuZGxlLCAodm9pZCoqKSZpYl9jcHUsCisJCQkJICAgICZpYl9tY19hZGRyZXNzLCAmaWJfdmFfaGFuZGxlKTsKKwlpZiAocikKKwkJcmV0dXJuIENVRV9TSU5JVF9GQUlMRUQ7CisKKwlyZXR1cm4gQ1VFX1NVQ0NFU1M7Cit9CisKK2ludCBzdWl0ZV92Y25fdGVzdHNfY2xlYW4odm9pZCkKK3sKKwlpbnQgcjsKKworCWlmIChmYW1pbHlfaWQgPCBBTURHUFVfRkFNSUxZX1JWKSB7CisJCXIgPSBhbWRncHVfZGV2aWNlX2RlaW5pdGlhbGl6ZShkZXZpY2VfaGFuZGxlKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gQ1VFX1NDTEVBTl9GQUlMRUQ7CisJfSBlbHNlIHsKKwkJciA9IGFtZGdwdV9ib191bm1hcF9hbmRfZnJlZShpYl9oYW5kbGUsIGliX3ZhX2hhbmRsZSwKKwkJCQkgICAgIGliX21jX2FkZHJlc3MsIElCX1NJWkUpOworCQlpZiAocikKKwkJCXJldHVybiBDVUVfU0NMRUFOX0ZBSUxFRDsKKworCQlyID0gYW1kZ3B1X2NzX2N0eF9mcmVlKGNvbnRleHRfaGFuZGxlKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gQ1VFX1NDTEVBTl9GQUlMRUQ7CisKKwkJciA9IGFtZGdwdV9kZXZpY2VfZGVpbml0aWFsaXplKGRldmljZV9oYW5kbGUpOworCQlpZiAocikKKwkJCXJldHVybiBDVUVfU0NMRUFOX0ZBSUxFRDsKKwl9CisKKwlyZXR1cm4gQ1VFX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgc3VibWl0KHVuc2lnbmVkIG5kdywgdW5zaWduZWQgaXApCit7CisJc3RydWN0IGFtZGdwdV9jc19yZXF1ZXN0IGlic19yZXF1ZXN0ID0gezB9OworCXN0cnVjdCBhbWRncHVfY3NfaWJfaW5mbyBpYl9pbmZvID0gezB9OworCXN0cnVjdCBhbWRncHVfY3NfZmVuY2UgZmVuY2Vfc3RhdHVzID0gezB9OworCXVpbnQzMl90IGV4cGlyZWQ7CisJaW50IHI7CisKKwlpYl9pbmZvLmliX21jX2FkZHJlc3MgPSBpYl9tY19hZGRyZXNzOworCWliX2luZm8uc2l6ZSA9IG5kdzsKKworCWlic19yZXF1ZXN0LmlwX3R5cGUgPSBpcDsKKworCXIgPSBhbWRncHVfYm9fbGlzdF9jcmVhdGUoZGV2aWNlX2hhbmRsZSwgbnVtX3Jlc291cmNlcywgcmVzb3VyY2VzLAorCQkJCSAgTlVMTCwgJmlic19yZXF1ZXN0LnJlc291cmNlcyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJaWJzX3JlcXVlc3QubnVtYmVyX29mX2licyA9IDE7CisJaWJzX3JlcXVlc3QuaWJzID0gJmliX2luZm87CisJaWJzX3JlcXVlc3QuZmVuY2VfaW5mby5oYW5kbGUgPSBOVUxMOworCisJciA9IGFtZGdwdV9jc19zdWJtaXQoY29udGV4dF9oYW5kbGUsIDAsICZpYnNfcmVxdWVzdCwgMSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IGFtZGdwdV9ib19saXN0X2Rlc3Ryb3koaWJzX3JlcXVlc3QucmVzb3VyY2VzKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlmZW5jZV9zdGF0dXMuY29udGV4dCA9IGNvbnRleHRfaGFuZGxlOworCWZlbmNlX3N0YXR1cy5pcF90eXBlID0gaXA7CisJZmVuY2Vfc3RhdHVzLmZlbmNlID0gaWJzX3JlcXVlc3Quc2VxX25vOworCisJciA9IGFtZGdwdV9jc19xdWVyeV9mZW5jZV9zdGF0dXMoJmZlbmNlX3N0YXR1cywKKwkJCQkJIEFNREdQVV9USU1FT1VUX0lORklOSVRFLAorCQkJCQkgMCwgJmV4cGlyZWQpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbGxvY19yZXNvdXJjZShzdHJ1Y3QgYW1kZ3B1X3Zjbl9ibyAqdmNuX2JvLAorCQkJdW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgZG9tYWluKQoreworCXN0cnVjdCBhbWRncHVfYm9fYWxsb2NfcmVxdWVzdCByZXEgPSB7MH07CisJYW1kZ3B1X2JvX2hhbmRsZSBidWZfaGFuZGxlOworCWFtZGdwdV92YV9oYW5kbGUgdmFfaGFuZGxlOworCXVpbnQ2NF90IHZhID0gMDsKKwlpbnQgcjsKKworCXJlcS5hbGxvY19zaXplID0gQUxJR04oc2l6ZSwgNDA5Nik7CisJcmVxLnByZWZlcnJlZF9oZWFwID0gZG9tYWluOworCXIgPSBhbWRncHVfYm9fYWxsb2MoZGV2aWNlX2hhbmRsZSwgJnJlcSwgJmJ1Zl9oYW5kbGUpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKwlyID0gYW1kZ3B1X3ZhX3JhbmdlX2FsbG9jKGRldmljZV9oYW5kbGUsCisJCQkJICBhbWRncHVfZ3B1X3ZhX3JhbmdlX2dlbmVyYWwsCisJCQkJICByZXEuYWxsb2Nfc2l6ZSwgMSwgMCwgJnZhLAorCQkJCSAgJnZhX2hhbmRsZSwgMCk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCXIgPSBhbWRncHVfYm9fdmFfb3AoYnVmX2hhbmRsZSwgMCwgcmVxLmFsbG9jX3NpemUsIHZhLCAwLAorCQkJICAgIEFNREdQVV9WQV9PUF9NQVApOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKwl2Y25fYm8tPmFkZHIgPSB2YTsKKwl2Y25fYm8tPmhhbmRsZSA9IGJ1Zl9oYW5kbGU7CisJdmNuX2JvLT5zaXplID0gcmVxLmFsbG9jX3NpemU7CisJdmNuX2JvLT52YV9oYW5kbGUgPSB2YV9oYW5kbGU7CisJciA9IGFtZGdwdV9ib19jcHVfbWFwKHZjbl9iby0+aGFuZGxlLCAodm9pZCAqKikmdmNuX2JvLT5wdHIpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKwltZW1zZXQodmNuX2JvLT5wdHIsIDAsIHNpemUpOworCXIgPSBhbWRncHVfYm9fY3B1X3VubWFwKHZjbl9iby0+aGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcmVzb3VyY2Uoc3RydWN0IGFtZGdwdV92Y25fYm8gKnZjbl9ibykKK3sKKwlpbnQgcjsKKworCXIgPSBhbWRncHVfYm9fdmFfb3AodmNuX2JvLT5oYW5kbGUsIDAsIHZjbl9iby0+c2l6ZSwKKwkJCSAgICB2Y25fYm8tPmFkZHIsIDAsIEFNREdQVV9WQV9PUF9VTk1BUCk7CisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCisJciA9IGFtZGdwdV92YV9yYW5nZV9mcmVlKHZjbl9iby0+dmFfaGFuZGxlKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlyID0gYW1kZ3B1X2JvX2ZyZWUodmNuX2JvLT5oYW5kbGUpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKwltZW1zZXQodmNuX2JvLCAwLCBzaXplb2YoKnZjbl9ibykpOworfQorCitzdGF0aWMgdm9pZCB2Y25fZGVjX2NtZCh1aW50NjRfdCBhZGRyLCB1bnNpZ25lZCBjbWQsIGludCAqaWR4KQoreworCWliX2NwdVsoKmlkeCkrK10gPSAweDgxQzQ7CisJaWJfY3B1WygqaWR4KSsrXSA9IGFkZHI7CisJaWJfY3B1WygqaWR4KSsrXSA9IDB4ODFDNTsKKwlpYl9jcHVbKCppZHgpKytdID0gYWRkciA+PiAzMjsKKwlpYl9jcHVbKCppZHgpKytdID0gMHg4MUMzOworCWliX2NwdVsoKmlkeCkrK10gPSBjbWQgPDwgMTsKK30KKworc3RhdGljIHZvaWQgYW1kZ3B1X2NzX3Zjbl9kZWNfY3JlYXRlKHZvaWQpCit7CisJc3RydWN0IGFtZGdwdV92Y25fYm8gbXNnX2J1ZjsKKwlpbnQgbGVuLCByOworCisJaWYgKGZhbWlseV9pZCA8IEFNREdQVV9GQU1JTFlfUlYpCisJCXJldHVybjsKKworCW51bV9yZXNvdXJjZXMgID0gMDsKKwlhbGxvY19yZXNvdXJjZSgmbXNnX2J1ZiwgNDA5NiwgQU1ER1BVX0dFTV9ET01BSU5fR1RUKTsKKwlyZXNvdXJjZXNbbnVtX3Jlc291cmNlcysrXSA9IG1zZ19idWYuaGFuZGxlOworCXJlc291cmNlc1tudW1fcmVzb3VyY2VzKytdID0gaWJfaGFuZGxlOworCisJciA9IGFtZGdwdV9ib19jcHVfbWFwKG1zZ19idWYuaGFuZGxlLCAodm9pZCAqKikmbXNnX2J1Zi5wdHIpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCW1lbXNldChtc2dfYnVmLnB0ciwgMCwgNDA5Nik7CisJbWVtY3B5KG1zZ19idWYucHRyLCB2Y25fZGVjX2NyZWF0ZV9tc2csIHNpemVvZih2Y25fZGVjX2NyZWF0ZV9tc2cpKTsKKworCWxlbiA9IDA7CisJaWJfY3B1W2xlbisrXSA9IDB4ODFDNDsKKwlpYl9jcHVbbGVuKytdID0gbXNnX2J1Zi5hZGRyOworCWliX2NwdVtsZW4rK10gPSAweDgxQzU7CisJaWJfY3B1W2xlbisrXSA9IG1zZ19idWYuYWRkciA+PiAzMjsKKwlpYl9jcHVbbGVuKytdID0gMHg4MUMzOworCWliX2NwdVtsZW4rK10gPSAwOworCWZvciAoOyBsZW4gJSAxNjsgKytsZW4pCisJCWliX2NwdVtsZW5dID0gMHg4MWZmOworCisJciA9IHN1Ym1pdChsZW4sIEFNREdQVV9IV19JUF9WQ05fREVDKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlmcmVlX3Jlc291cmNlKCZtc2dfYnVmKTsKK30KKworc3RhdGljIHZvaWQgYW1kZ3B1X2NzX3Zjbl9kZWNfZGVjb2RlKHZvaWQpCit7CisJY29uc3QgdW5zaWduZWQgZHBiX3NpemUgPSAxNTkyMzU4NCwgY3R4X3NpemUgPSA1Mjg3NjgwLCBkdF9zaXplID0gNzM3MjgwOworCXVpbnQ2NF90IG1zZ19hZGRyLCBmYl9hZGRyLCBic19hZGRyLCBkcGJfYWRkciwgY3R4X2FkZHIsIGR0X2FkZHIsIGl0X2FkZHIsIHN1bTsKKwlzdHJ1Y3QgYW1kZ3B1X3Zjbl9ibyBkZWNfYnVmOworCWludCBzaXplLCBsZW4sIGksIHI7CisJdWludDhfdCAqZGVjOworCisJaWYgKGZhbWlseV9pZCA8IEFNREdQVV9GQU1JTFlfUlYpCisJCXJldHVybjsKKworCXNpemUgPSA0KjEwMjQ7IC8qIG1zZyAqLworCXNpemUgKz0gNCoxMDI0OyAvKiBmYiAqLworCXNpemUgKz0gNDA5NjsgLyppdF9zY2FsaW5nX3RhYmxlKi8KKwlzaXplICs9IEFMSUdOKHNpemVvZih1dmRfYml0c3RyZWFtKSwgNCoxMDI0KTsKKwlzaXplICs9IEFMSUdOKGRwYl9zaXplLCA0KjEwMjQpOworCXNpemUgKz0gQUxJR04oZHRfc2l6ZSwgNCoxMDI0KTsKKworCW51bV9yZXNvdXJjZXMgID0gMDsKKwlhbGxvY19yZXNvdXJjZSgmZGVjX2J1Ziwgc2l6ZSwgQU1ER1BVX0dFTV9ET01BSU5fR1RUKTsKKwlyZXNvdXJjZXNbbnVtX3Jlc291cmNlcysrXSA9IGRlY19idWYuaGFuZGxlOworCXJlc291cmNlc1tudW1fcmVzb3VyY2VzKytdID0gaWJfaGFuZGxlOworCisJciA9IGFtZGdwdV9ib19jcHVfbWFwKGRlY19idWYuaGFuZGxlLCAodm9pZCAqKikmZGVjX2J1Zi5wdHIpOworCWRlYyA9IGRlY19idWYucHRyOworCisJQ1VfQVNTRVJUX0VRVUFMKHIsIDApOworCW1lbXNldChkZWNfYnVmLnB0ciwgMCwgc2l6ZSk7CisJbWVtY3B5KGRlY19idWYucHRyLCB2Y25fZGVjX2RlY29kZV9tc2csIHNpemVvZih2Y25fZGVjX2RlY29kZV9tc2cpKTsKKwltZW1jcHkoZGVjX2J1Zi5wdHIgKyBzaXplb2YodmNuX2RlY19kZWNvZGVfbXNnKSwKKwkJCWF2Y19kZWNvZGVfbXNnLCBzaXplb2YoYXZjX2RlY29kZV9tc2cpKTsKKworCWRlYyArPSA0KjEwMjQ7CisJZGVjICs9IDQqMTAyNDsKKwltZW1jcHkoZGVjLCB1dmRfaXRfc2NhbGluZ190YWJsZSwgc2l6ZW9mKHV2ZF9pdF9zY2FsaW5nX3RhYmxlKSk7CisKKwlkZWMgKz0gNCoxMDI0OworCW1lbWNweShkZWMsIHV2ZF9iaXRzdHJlYW0sIHNpemVvZih1dmRfYml0c3RyZWFtKSk7CisKKwlkZWMgKz0gQUxJR04oc2l6ZW9mKHV2ZF9iaXRzdHJlYW0pLCA0KjEwMjQpOworCisJZGVjICs9IEFMSUdOKGRwYl9zaXplLCA0KjEwMjQpOworCisJbXNnX2FkZHIgPSBkZWNfYnVmLmFkZHI7CisJZmJfYWRkciA9IG1zZ19hZGRyICsgNCoxMDI0OworCWl0X2FkZHIgPSBmYl9hZGRyICsgNCoxMDI0OworCWJzX2FkZHIgPSBpdF9hZGRyICsgNCoxMDI0OworCWRwYl9hZGRyID0gQUxJR04oYnNfYWRkciArIHNpemVvZih1dmRfYml0c3RyZWFtKSwgNCoxMDI0KTsKKwljdHhfYWRkciA9IEFMSUdOKGRwYl9hZGRyICsgMHgwMDZCOTQwMCwgNCoxMDI0KTsKKwlkdF9hZGRyID0gQUxJR04oZHBiX2FkZHIgKyBkcGJfc2l6ZSwgNCoxMDI0KTsKKworCWxlbiA9IDA7CisJdmNuX2RlY19jbWQobXNnX2FkZHIsIDB4MCwgJmxlbik7CisJdmNuX2RlY19jbWQoZHBiX2FkZHIsIDB4MSwgJmxlbik7CisJdmNuX2RlY19jbWQoZHRfYWRkciwgMHgyLCAmbGVuKTsKKwl2Y25fZGVjX2NtZChmYl9hZGRyLCAweDMsICZsZW4pOworCXZjbl9kZWNfY21kKGJzX2FkZHIsIDB4MTAwLCAmbGVuKTsKKwl2Y25fZGVjX2NtZChpdF9hZGRyLCAweDIwNCwgJmxlbik7CisJdmNuX2RlY19jbWQoY3R4X2FkZHIsIDB4MjA2LCAmbGVuKTsKKworCWliX2NwdVtsZW4rK10gPSAweDgxQzY7CisJaWJfY3B1W2xlbisrXSA9IDB4MTsKKwlmb3IgKDsgbGVuICUgMTY7ICsrbGVuKQorCQlpYl9jcHVbbGVuXSA9IDB4ODAwMDAwMDA7CisKKwlyID0gc3VibWl0KGxlbiwgQU1ER1BVX0hXX0lQX1ZDTl9ERUMpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCWZvciAoaSA9IDAsIHN1bSA9IDA7IGkgPCBkdF9zaXplOyArK2kpCisJCXN1bSArPSBkZWNbaV07CisKKwlDVV9BU1NFUlRfRVFVQUwoc3VtLCBTVU1fREVDT0RFKTsKKworCWZyZWVfcmVzb3VyY2UoJmRlY19idWYpOworfQorCitzdGF0aWMgdm9pZCBhbWRncHVfY3NfdmNuX2RlY19kZXN0cm95KHZvaWQpCit7CisJc3RydWN0IGFtZGdwdV92Y25fYm8gbXNnX2J1ZjsKKwlpbnQgbGVuLCByOworCisJaWYgKGZhbWlseV9pZCA8IEFNREdQVV9GQU1JTFlfUlYpCisJCXJldHVybjsKKworCW51bV9yZXNvdXJjZXMgID0gMDsKKwlhbGxvY19yZXNvdXJjZSgmbXNnX2J1ZiwgMTAyNCwgQU1ER1BVX0dFTV9ET01BSU5fR1RUKTsKKwlyZXNvdXJjZXNbbnVtX3Jlc291cmNlcysrXSA9IG1zZ19idWYuaGFuZGxlOworCXJlc291cmNlc1tudW1fcmVzb3VyY2VzKytdID0gaWJfaGFuZGxlOworCisJciA9IGFtZGdwdV9ib19jcHVfbWFwKG1zZ19idWYuaGFuZGxlLCAodm9pZCAqKikmbXNnX2J1Zi5wdHIpOworCUNVX0FTU0VSVF9FUVVBTChyLCAwKTsKKworCW1lbXNldChtc2dfYnVmLnB0ciwgMCwgMTAyNCk7CisJbWVtY3B5KG1zZ19idWYucHRyLCB2Y25fZGVjX2Rlc3Ryb3lfbXNnLCBzaXplb2YodmNuX2RlY19kZXN0cm95X21zZykpOworCisJbGVuID0gMDsKKwlpYl9jcHVbbGVuKytdID0gMHg4MUM0OworCWliX2NwdVtsZW4rK10gPSBtc2dfYnVmLmFkZHI7CisJaWJfY3B1W2xlbisrXSA9IDB4ODFDNTsKKwlpYl9jcHVbbGVuKytdID0gbXNnX2J1Zi5hZGRyID4+IDMyOworCWliX2NwdVtsZW4rK10gPSAweDgxQzM7CisJaWJfY3B1W2xlbisrXSA9IDA7CisJZm9yICg7IGxlbiAlIDE2OyArK2xlbikKKwkJaWJfY3B1W2xlbl0gPSAweDgwMDAwMDAwOworCisJciA9IHN1Ym1pdChsZW4sIEFNREdQVV9IV19JUF9WQ05fREVDKTsKKwlDVV9BU1NFUlRfRVFVQUwociwgMCk7CisKKwlmcmVlX3Jlc291cmNlKCZtc2dfYnVmKTsKK30KKworc3RhdGljIHZvaWQgYW1kZ3B1X2NzX3Zjbl9lbmNfY3JlYXRlKHZvaWQpCit7CisJaWYgKGZhbWlseV9pZCA8IEFNREdQVV9GQU1JTFlfUlYpCisJCXJldHVybjsKKworCS8qIFRPRE8gKi8KK30KKworc3RhdGljIHZvaWQgYW1kZ3B1X2NzX3Zjbl9lbmNfZW5jb2RlKHZvaWQpCit7CisJaWYgKGZhbWlseV9pZCA8IEFNREdQVV9GQU1JTFlfUlYpCisJCXJldHVybjsKKworCS8qIFRPRE8gKi8KK30KKworc3RhdGljIHZvaWQgYW1kZ3B1X2NzX3Zjbl9lbmNfZGVzdHJveSh2b2lkKQoreworCWlmIChmYW1pbHlfaWQgPCBBTURHUFVfRkFNSUxZX1JWKQorCQlyZXR1cm47CisKKwkvKiBUT0RPICovCit9CmRpZmYgLS1naXQgYS90ZXN0cy9kcm1kZXZpY2UuYyBiL3Rlc3RzL2RybWRldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZDUwOTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kcm1kZXZpY2UuYwpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBFbWlsIFZlbGlrb3YgPGVtaWwubC52ZWxpa292QGdtYWlsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx4Zjg2ZHJtLmg+CisKKworc3RhdGljIHZvaWQKK3ByaW50X2RldmljZV9pbmZvKGRybURldmljZVB0ciBkZXZpY2UsIGludCBpLCBib29sIHByaW50X3JldmlzaW9uKQoreworICAgIHByaW50ZigiZGV2aWNlWyVpXVxuIiwgaSk7CisgICAgcHJpbnRmKCJcdGF2YWlsYWJsZV9ub2RlcyAlMDR4XG4iLCBkZXZpY2UtPmF2YWlsYWJsZV9ub2Rlcyk7CisgICAgcHJpbnRmKCJcdG5vZGVzXG4iKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IERSTV9OT0RFX01BWDsgaisrKQorICAgICAgICBpZiAoZGV2aWNlLT5hdmFpbGFibGVfbm9kZXMgJiAxIDw8IGopCisgICAgICAgICAgICBwcmludGYoIlx0XHRub2Rlc1slZF0gJXNcbiIsIGosIGRldmljZS0+bm9kZXNbal0pOworCisgICAgcHJpbnRmKCJcdGJ1c3R5cGUgJTA0eFxuIiwgZGV2aWNlLT5idXN0eXBlKTsKKyAgICBwcmludGYoIlx0YnVzaW5mb1xuIik7CisgICAgaWYgKGRldmljZS0+YnVzdHlwZSA9PSBEUk1fQlVTX1BDSSkgeworICAgICAgICBwcmludGYoIlx0XHRwY2lcbiIpOworICAgICAgICBwcmludGYoIlx0XHRcdGRvbWFpblx0JTA0eFxuIixkZXZpY2UtPmJ1c2luZm8ucGNpLT5kb21haW4pOworICAgICAgICBwcmludGYoIlx0XHRcdGJ1c1x0JTAyeFxuIiwgZGV2aWNlLT5idXNpbmZvLnBjaS0+YnVzKTsKKyAgICAgICAgcHJpbnRmKCJcdFx0XHRkZXZcdCUwMnhcbiIsIGRldmljZS0+YnVzaW5mby5wY2ktPmRldik7CisgICAgICAgIHByaW50ZigiXHRcdFx0ZnVuY1x0JTF1XG4iLCBkZXZpY2UtPmJ1c2luZm8ucGNpLT5mdW5jKTsKKworICAgICAgICBwcmludGYoIlx0ZGV2aWNlaW5mb1xuIik7CisgICAgICAgIHByaW50ZigiXHRcdHBjaVxuIik7CisgICAgICAgIHByaW50ZigiXHRcdFx0dmVuZG9yX2lkXHQlMDR4XG4iLCBkZXZpY2UtPmRldmljZWluZm8ucGNpLT52ZW5kb3JfaWQpOworICAgICAgICBwcmludGYoIlx0XHRcdGRldmljZV9pZFx0JTA0eFxuIiwgZGV2aWNlLT5kZXZpY2VpbmZvLnBjaS0+ZGV2aWNlX2lkKTsKKyAgICAgICAgcHJpbnRmKCJcdFx0XHRzdWJ2ZW5kb3JfaWRcdCUwNHhcbiIsIGRldmljZS0+ZGV2aWNlaW5mby5wY2ktPnN1YnZlbmRvcl9pZCk7CisgICAgICAgIHByaW50ZigiXHRcdFx0c3ViZGV2aWNlX2lkXHQlMDR4XG4iLCBkZXZpY2UtPmRldmljZWluZm8ucGNpLT5zdWJkZXZpY2VfaWQpOworICAgICAgICBpZiAocHJpbnRfcmV2aXNpb24pCisgICAgICAgICAgICBwcmludGYoIlx0XHRcdHJldmlzaW9uX2lkXHQlMDJ4XG4iLCBkZXZpY2UtPmRldmljZWluZm8ucGNpLT5yZXZpc2lvbl9pZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiXHRcdFx0cmV2aXNpb25faWRcdElHTk9SRURcbiIpOworCisgICAgfSBlbHNlIGlmIChkZXZpY2UtPmJ1c3R5cGUgPT0gRFJNX0JVU19VU0IpIHsKKyAgICAgICAgcHJpbnRmKCJcdFx0dXNiXG4iKTsKKyAgICAgICAgcHJpbnRmKCJcdFx0XHRidXNcdCUwM3VcbiIsIGRldmljZS0+YnVzaW5mby51c2ItPmJ1cyk7CisgICAgICAgIHByaW50ZigiXHRcdFx0ZGV2XHQlMDN1XG4iLCBkZXZpY2UtPmJ1c2luZm8udXNiLT5kZXYpOworCisgICAgICAgIHByaW50ZigiXHRkZXZpY2VpbmZvXG4iKTsKKyAgICAgICAgcHJpbnRmKCJcdFx0dXNiXG4iKTsKKyAgICAgICAgcHJpbnRmKCJcdFx0XHR2ZW5kb3JcdCUwNHhcbiIsIGRldmljZS0+ZGV2aWNlaW5mby51c2ItPnZlbmRvcik7CisgICAgICAgIHByaW50ZigiXHRcdFx0cHJvZHVjdFx0JTA0eFxuIiwgZGV2aWNlLT5kZXZpY2VpbmZvLnVzYi0+cHJvZHVjdCk7CisgICAgfSBlbHNlIGlmIChkZXZpY2UtPmJ1c3R5cGUgPT0gRFJNX0JVU19QTEFURk9STSkgeworICAgICAgICBjaGFyICoqY29tcGF0aWJsZSA9IGRldmljZS0+ZGV2aWNlaW5mby5wbGF0Zm9ybS0+Y29tcGF0aWJsZTsKKworICAgICAgICBwcmludGYoIlx0XHRwbGF0Zm9ybVxuIik7CisgICAgICAgIHByaW50ZigiXHRcdFx0ZnVsbG5hbWVcdCVzXG4iLCBkZXZpY2UtPmJ1c2luZm8ucGxhdGZvcm0tPmZ1bGxuYW1lKTsKKworICAgICAgICBwcmludGYoIlx0ZGV2aWNlaW5mb1xuIik7CisgICAgICAgIHByaW50ZigiXHRcdHBsYXRmb3JtXG4iKTsKKyAgICAgICAgcHJpbnRmKCJcdFx0XHRjb21wYXRpYmxlXG4iKTsKKworICAgICAgICB3aGlsZSAoKmNvbXBhdGlibGUpIHsKKyAgICAgICAgICAgIHByaW50ZigiXHRcdFx0XHQlc1xuIiwgKmNvbXBhdGlibGUpOworICAgICAgICAgICAgY29tcGF0aWJsZSsrOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChkZXZpY2UtPmJ1c3R5cGUgPT0gRFJNX0JVU19IT1NUMVgpIHsKKyAgICAgICAgY2hhciAqKmNvbXBhdGlibGUgPSBkZXZpY2UtPmRldmljZWluZm8ucGxhdGZvcm0tPmNvbXBhdGlibGU7CisKKyAgICAgICAgcHJpbnRmKCJcdFx0aG9zdDF4XG4iKTsKKyAgICAgICAgcHJpbnRmKCJcdFx0XHRmdWxsbmFtZVx0JXNcbiIsIGRldmljZS0+YnVzaW5mby5ob3N0MXgtPmZ1bGxuYW1lKTsKKworICAgICAgICBwcmludGYoIlx0ZGV2aWNlaW5mb1xuIik7CisgICAgICAgIHByaW50ZigiXHRcdHBsYXRmb3JtXG4iKTsKKyAgICAgICAgcHJpbnRmKCJcdFx0XHRjb21wYXRpYmxlXG4iKTsKKworICAgICAgICB3aGlsZSAoKmNvbXBhdGlibGUpIHsKKyAgICAgICAgICAgIHByaW50ZigiXHRcdFx0XHQlc1xuIiwgKmNvbXBhdGlibGUpOworICAgICAgICAgICAgY29tcGF0aWJsZSsrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJVbmtub3duL3VuaGFuZGxlZCBidXN0eXBlXG4iKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworfQorCitpbnQKK21haW4odm9pZCkKK3sKKyAgICBkcm1EZXZpY2VQdHIgKmRldmljZXM7CisgICAgZHJtRGV2aWNlUHRyIGRldmljZTsKKyAgICBpbnQgZmQsIHJldCwgbWF4X2RldmljZXM7CisKKyAgICBtYXhfZGV2aWNlcyA9IGRybUdldERldmljZXMyKDAsIE5VTEwsIDApOworCisgICAgaWYgKG1heF9kZXZpY2VzIDw9IDApIHsKKyAgICAgICAgcHJpbnRmKCJkcm1HZXREZXZpY2VzMigpIGhhcyByZXR1cm5lZCAlZFxuIiwgbWF4X2RldmljZXMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZGV2aWNlcyA9IGNhbGxvYyhtYXhfZGV2aWNlcywgc2l6ZW9mKGRybURldmljZVB0cikpOworICAgIGlmIChkZXZpY2VzID09IE5VTEwpIHsKKyAgICAgICAgcHJpbnRmKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZHJtRGV2aWNlUHRyIGFycmF5XG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldCA9IGRybUdldERldmljZXMyKDAsIGRldmljZXMsIG1heF9kZXZpY2VzKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBwcmludGYoImRybUdldERldmljZXMyKCkgcmV0dXJuZWQgYW4gZXJyb3IgJWRcbiIsIHJldCk7CisgICAgICAgIGZyZWUoZGV2aWNlcyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJldDsgaSsrKSB7CisgICAgICAgIHByaW50X2RldmljZV9pbmZvKGRldmljZXNbaV0sIGksIGZhbHNlKTsKKworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IERSTV9OT0RFX01BWDsgaisrKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlc1tpXS0+YXZhaWxhYmxlX25vZGVzICYgMSA8PCBqKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJPcGVuaW5nIGRldmljZSAlZCBub2RlICVzXG4iLCBpLCBkZXZpY2VzW2ldLT5ub2Rlc1tqXSk7CisgICAgICAgICAgICAgICAgZmQgPSBvcGVuKGRldmljZXNbaV0tPm5vZGVzW2pdLCBPX1JET05MWSB8IE9fQ0xPRVhFQywgMCk7CisgICAgICAgICAgICAgICAgaWYgKGZkIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIkZhaWxlZCAtICVzICglZClcbiIsIHN0cmVycm9yKGVycm5vKSwgZXJybm8pOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZHJtR2V0RGV2aWNlMihmZCwgRFJNX0RFVklDRV9HRVRfUENJX1JFVklTSU9OLCAmZGV2aWNlKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50X2RldmljZV9pbmZvKGRldmljZSwgaSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGRybUZyZWVEZXZpY2UoJmRldmljZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGRybUZyZWVEZXZpY2VzKGRldmljZXMsIHJldCk7CisgICAgZnJlZShkZXZpY2VzKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2RybXNsLmMgYi90ZXN0cy9kcm1zbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYjU5YTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kcm1zbC5jCkBAIC0wLDAgKzEsMTg0IEBACisvKiBkcm1zbC5jIC0tIFNraXAgbGlzdCB0ZXN0CisgKiBDcmVhdGVkOiBNb24gTWF5IDEwIDA5OjI4OjEzIDE5OTkgYnkgZmFpdGhAcHJlY2lzaW9uaW5zaWdodC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqCisgKiBERVNDUklQVElPTgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhIHN0cmFpZ2h0Zm9yd2FyZCBza2lwIGxpc3QgaW1wbGVtZW50YXRpb24ubgorICoKKyAqIEZVVFVSRSBFTkhBTkNFTUVOVFMKKyAqCisgKiBSRUZFUkVOQ0VTCisgKgorICogW1B1Z2g5MF0gV2lsbGlhbSBQdWdoLiAgU2tpcCBMaXN0czogQSBQcm9iYWJpbGlzdGljIEFsdGVybmF0aXZlIHRvCisgKiBCYWxhbmNlZCBUcmVlcy4gQ0FDTSAzMyg2KSwgSnVuZSAxOTkwLCBwcC4gNjY4LTY3Ni4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgInhmODZkcm0uaCIKKworc3RhdGljIHZvaWQgcHJpbnQodm9pZCogbGlzdCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGtleTsKKyAgICB2b2lkICAgICAgICAgICp2YWx1ZTsKKworICAgIGlmIChkcm1TTEZpcnN0KGxpc3QsICZrZXksICZ2YWx1ZSkpIHsKKwlkbyB7CisJICAgIHByaW50Zigia2V5ID0gJTVsdSwgdmFsdWUgPSAlcFxuIiwga2V5LCB2YWx1ZSk7CisJfSB3aGlsZSAoZHJtU0xOZXh0KGxpc3QsICZrZXksICZ2YWx1ZSkpOworICAgIH0KK30KKworc3RhdGljIGRvdWJsZSBkb190aW1lKGludCBzaXplLCBpbnQgaXRlcikKK3sKKyAgICB2b2lkICAgICAgICAgICAqbGlzdDsKKyAgICBpbnQgICAgICAgICAgICBpLCBqOworICAgIHVuc2lnbmVkIGxvbmcgIGtleXNbMTAwMDAwMF07CisgICAgdW5zaWduZWQgbG9uZyAgcHJldmlvdXM7CisgICAgdW5zaWduZWQgbG9uZyAga2V5OworICAgIHZvaWQgICAgICAgICAgICp2YWx1ZTsKKyAgICBzdHJ1Y3QgdGltZXZhbCBzdGFydCwgc3RvcDsKKyAgICBkb3VibGUgICAgICAgICB1c2VjOworICAgIHZvaWQgICAgICAgICAgICpyYW5zdGF0ZTsKKworICAgIGxpc3QgPSBkcm1TTENyZWF0ZSgpOworICAgIHJhbnN0YXRlID0gZHJtUmFuZG9tQ3JlYXRlKDEyMzQ1KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwlrZXlzW2ldID0gZHJtUmFuZG9tKHJhbnN0YXRlKTsKKwlkcm1TTEluc2VydChsaXN0LCBrZXlzW2ldLCBOVUxMKTsKKyAgICB9CisKKyAgICBwcmV2aW91cyA9IDA7CisgICAgaWYgKGRybVNMRmlyc3QobGlzdCwgJmtleSwgJnZhbHVlKSkgeworCWRvIHsKKwkgICAgaWYgKGtleSA8PSBwcmV2aW91cykgeworCQlwcmludGYoICIlbHUgITwgJWx1XG4iLCBwcmV2aW91cywga2V5KTsKKwkgICAgfQorCSAgICBwcmV2aW91cyA9IGtleTsKKwl9IHdoaWxlIChkcm1TTE5leHQobGlzdCwgJmtleSwgJnZhbHVlKSk7CisgICAgfQorCisgICAgZ2V0dGltZW9mZGF5KCZzdGFydCwgTlVMTCk7CisgICAgZm9yIChqID0gMDsgaiA8IGl0ZXI7IGorKykgeworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkgICAgaWYgKGRybVNMTG9va3VwKGxpc3QsIGtleXNbaV0sICZ2YWx1ZSkpCisJCXByaW50ZigiRXJyb3IgJWx1ICVkXG4iLCBrZXlzW2ldLCBpKTsKKwl9CisgICAgfQorICAgIGdldHRpbWVvZmRheSgmc3RvcCwgTlVMTCk7CisKKyAgICB1c2VjID0gKGRvdWJsZSkoc3RvcC50dl9zZWMgKiAxMDAwMDAwICsgc3RvcC50dl91c2VjCisJCSAgICAtIHN0YXJ0LnR2X3NlYyAqIDEwMDAwMDAgLSBzdGFydC50dl91c2VjKSAvIChzaXplICogaXRlcik7CisKKyAgICBwcmludGYoIiUwLjJmIG1pY3Jvc2Vjb25kcyBmb3IgbGlzdCBsZW5ndGggJWRcbiIsIHVzZWMsIHNpemUpOworCisgICAgZHJtUmFuZG9tRG91YmxlKHJhbnN0YXRlKTsKKyAgICBkcm1TTERlc3Ryb3kobGlzdCk7CisKKyAgICByZXR1cm4gdXNlYzsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbmVpZ2hib3JzKHZvaWQgKmxpc3QsIHVuc2lnbmVkIGxvbmcga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZXhwZWN0ZWRfcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGV4cGVjdGVkX25leHQpCit7CisgICAgdW5zaWduZWQgbG9uZyBwcmV2X2tleSA9IDA7CisgICAgdW5zaWduZWQgbG9uZyBuZXh0X2tleSA9IDA7CisgICAgdm9pZCAgICAgICAgICAqcHJldl92YWx1ZTsKKyAgICB2b2lkICAgICAgICAgICpuZXh0X3ZhbHVlOworICAgIGludCAgICAgICAgICAgcmV0dmFsOworCisgICAgcmV0dmFsID0gZHJtU0xMb29rdXBOZWlnaGJvcnMobGlzdCwga2V5LAorCQkJCSAgJnByZXZfa2V5LCAmcHJldl92YWx1ZSwKKwkJCQkgICZuZXh0X2tleSwgJm5leHRfdmFsdWUpOworICAgIHByaW50ZigiTmVpZ2hib3JzIG9mICU1bHU6ICVkICU1bHUgJTVsdVxuIiwKKwkgICBrZXksIHJldHZhbCwgcHJldl9rZXksIG5leHRfa2V5KTsKKyAgICBpZiAocHJldl9rZXkgIT0gZXhwZWN0ZWRfcHJldikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuZXhwZWN0ZWQgbmVpZ2hib3I6ICU1bHUuIEV4cGVjdGVkOiAlNWx1XG4iLAorICAgICAgICAgICAgICAgIHByZXZfa2V5LCBleHBlY3RlZF9wcmV2KTsKKwlleGl0KDEpOworICAgIH0KKyAgICBpZiAobmV4dF9rZXkgIT0gZXhwZWN0ZWRfbmV4dCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuZXhwZWN0ZWQgbmVpZ2hib3I6ICU1bHUuIEV4cGVjdGVkOiAlNWx1XG4iLAorICAgICAgICAgICAgICAgIG5leHRfa2V5LCBleHBlY3RlZF9uZXh0KTsKKwlleGl0KDEpOworICAgIH0KK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICB2b2lkKiAgICBsaXN0OworICAgIGRvdWJsZSAgIHVzZWMsIHVzZWMyLCB1c2VjMywgdXNlYzQ7CisKKyAgICBsaXN0ID0gZHJtU0xDcmVhdGUoKTsKKyAgICBwcmludGYoICJsaXN0IGF0ICVwXG4iLCBsaXN0KTsKKworICAgIHByaW50KGxpc3QpOworICAgIHByaW50ZigiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuIik7CisKKyAgICBkcm1TTEluc2VydChsaXN0LCAxMjMsIE5VTEwpOworICAgIGRybVNMSW5zZXJ0KGxpc3QsIDIxMywgTlVMTCk7CisgICAgZHJtU0xJbnNlcnQobGlzdCwgNTAsIE5VTEwpOworICAgIHByaW50KGxpc3QpOworICAgIHByaW50ZigiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuIik7CisKKyAgICBwcmludF9uZWlnaGJvcnMobGlzdCwgMCwgMCwgNTApOworICAgIHByaW50X25laWdoYm9ycyhsaXN0LCA1MCwgMCwgNTApOworICAgIHByaW50X25laWdoYm9ycyhsaXN0LCA1MSwgNTAsIDEyMyk7CisgICAgcHJpbnRfbmVpZ2hib3JzKGxpc3QsIDEyMywgNTAsIDEyMyk7CisgICAgcHJpbnRfbmVpZ2hib3JzKGxpc3QsIDIwMCwgMTIzLCAyMTMpOworICAgIHByaW50X25laWdoYm9ycyhsaXN0LCAyMTMsIDEyMywgMjEzKTsKKyAgICBwcmludF9uZWlnaGJvcnMobGlzdCwgMjU2LCAyMTMsIDI1Nik7CisgICAgcHJpbnRmKCJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4iKTsKKworICAgIGRybVNMRGVsZXRlKGxpc3QsIDUwKTsKKyAgICBwcmludChsaXN0KTsKKyAgICBwcmludGYoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiIpOworCisgICAgZHJtU0xEdW1wKGxpc3QpOworICAgIGRybVNMRGVzdHJveShsaXN0KTsKKyAgICBwcmludGYoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiIpOworCisgICAgdXNlYyAgPSBkb190aW1lKDEwMCwgMTAwMDApOworICAgIHVzZWMyID0gZG9fdGltZSgxMDAwLCA1MDApOworICAgIHByaW50ZigiVGFibGUgc2l6ZSBpbmNyZWFzZWQgYnkgJTAuMmYsIHNlYXJjaCB0aW1lIGluY3JlYXNlZCBieSAlMC4yZlxuIiwKKwkgICAxMDAwLjAvMTAwLjAsIHVzZWMyIC8gdXNlYyk7CisKKyAgICB1c2VjMyA9IGRvX3RpbWUoMTAwMDAsIDUwKTsKKyAgICBwcmludGYoIlRhYmxlIHNpemUgaW5jcmVhc2VkIGJ5ICUwLjJmLCBzZWFyY2ggdGltZSBpbmNyZWFzZWQgYnkgJTAuMmZcbiIsCisJICAgMTAwMDAuMC8xMDAuMCwgdXNlYzMgLyB1c2VjKTsKKworICAgIHVzZWM0ID0gZG9fdGltZSgxMDAwMDAsIDQpOworICAgIHByaW50ZigiVGFibGUgc2l6ZSBpbmNyZWFzZWQgYnkgJTAuMmYsIHNlYXJjaCB0aW1lIGluY3JlYXNlZCBieSAlMC4yZlxuIiwKKwkgICAxMDAwMDAuMC8xMDAuMCwgdXNlYzQgLyB1c2VjKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXRuYXZpdi9NYWtlZmlsZS5hbSBiL3Rlc3RzL2V0bmF2aXYvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI2YmFlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V0bmF2aXYvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0MiBAQAorQU1fQ0ZMQUdTID0gXAorCS1JICQodG9wX3NyY2RpcikvaW5jbHVkZS9kcm0gXAorCS1JICQodG9wX3NyY2RpcikvZXRuYXZpdiBcCisJLUkgJCh0b3Bfc3JjZGlyKQorCitpZiBIQVZFX0lOU1RBTExfVEVTVFMKK2Jpbl9QUk9HUkFNUyA9IFwKKwlldG5hdml2XzJkX3Rlc3QgXAorCWV0bmF2aXZfY21kX3N0cmVhbV90ZXN0IFwKKwlldG5hdml2X2JvX2NhY2hlX3Rlc3QKK2Vsc2UKK25vaW5zdF9QUk9HUkFNUyA9IFwKKwlldG5hdml2XzJkX3Rlc3QgXAorCWV0bmF2aXZfY21kX3N0cmVhbV90ZXN0IFwKKwlldG5hdml2X2JvX2NhY2hlX3Rlc3QKK2VuZGlmCisKK2V0bmF2aXZfMmRfdGVzdF9MREFERCA9IFwKKwkkKHRvcF9idWlsZGRpcikvbGliZHJtLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvZXRuYXZpdi9saWJkcm1fZXRuYXZpdi5sYQorCitldG5hdml2XzJkX3Rlc3RfU09VUkNFUyA9IFwKKwljbWRzdHJlYW0ueG1sLmggXAorCWV0bmF2aXZfMmRfdGVzdC5jIFwKKwlzdGF0ZS54bWwuaCBcCisJc3RhdGVfMmQueG1sLmggXAorCXdyaXRlX2JtcC5jIFwKKwl3cml0ZV9ibXAuaAorCitldG5hdml2X2NtZF9zdHJlYW1fdGVzdF9MREFERCA9IFwKKwkkKHRvcF9idWlsZGRpcikvbGliZHJtLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvZXRuYXZpdi9saWJkcm1fZXRuYXZpdi5sYQorCitldG5hdml2X2NtZF9zdHJlYW1fdGVzdF9TT1VSQ0VTID0gXAorCWV0bmF2aXZfY21kX3N0cmVhbV90ZXN0LmMKKworZXRuYXZpdl9ib19jYWNoZV90ZXN0X0xEQUREID0gXAorCSQodG9wX2J1aWxkZGlyKS9saWJkcm0ubGEgXAorCSQodG9wX2J1aWxkZGlyKS9ldG5hdml2L2xpYmRybV9ldG5hdml2LmxhCisKK2V0bmF2aXZfYm9fY2FjaGVfdGVzdF9TT1VSQ0VTID0gXAorCWV0bmF2aXZfYm9fY2FjaGVfdGVzdC5jCmRpZmYgLS1naXQgYS90ZXN0cy9ldG5hdml2L2NtZHN0cmVhbS54bWwuaCBiL3Rlc3RzL2V0bmF2aXYvY21kc3RyZWFtLnhtbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwOTI4NWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9ldG5hdml2L2NtZHN0cmVhbS54bWwuaApAQCAtMCwwICsxLDI0MiBAQAorI2lmbmRlZiBDTURTVFJFQU1fWE1MCisjZGVmaW5lIENNRFNUUkVBTV9YTUwKKworLyogQXV0b2dlbmVyYXRlZCBmaWxlLCBETyBOT1QgRURJVCBtYW51YWxseSEKKworVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIHJ1bGVzLW5nLW5nIGhlYWRlcmdlbiB0b29sIGluIHRoaXMgZ2l0IHJlcG9zaXRvcnk6CitodHRwOi8vMHgwNC5uZXQvY2dpdC9pbmRleC5jZ2kvcnVsZXMtbmctbmcKK2dpdCBjbG9uZSBnaXQ6Ly8weDA0Lm5ldC9ydWxlcy1uZy1uZworCitUaGUgcnVsZXMtbmctbmcgc291cmNlIGZpbGVzIHRoaXMgaGVhZGVyIHdhcyBnZW5lcmF0ZWQgZnJvbSBhcmU6CistIGNtZHN0cmVhbS54bWwgKCAgMTI2MjEgYnl0ZXMsIGZyb20gMjAxNi0wOS0wNiAxNDo0NDoxNikKKy0gY29weXJpZ2h0LnhtbCAoICAgMTU5NyBieXRlcywgZnJvbSAyMDE2LTA5LTA2IDE0OjQ0OjE2KQorLSBjb21tb24ueG1sICAgICggIDIwNTgzIGJ5dGVzLCBmcm9tIDIwMTYtMDktMDYgMTQ6MTQ6MTIpCisKK0NvcHlyaWdodCAoQykgMjAxMi0yMDE2IGJ5IHRoZSBmb2xsb3dpbmcgYXV0aG9yczoKKy0gV2xhZGltaXIgSi4gdmFuIGRlciBMYWFuIDxsYWFud2pAZ21haWwuY29tPgorLSBDaHJpc3RpYW4gR21laW5lciA8Y2hyaXN0aWFuLmdtZWluZXJAZ21haWwuY29tPgorLSBMdWNhcyBTdGFjaCA8bC5zdGFjaEBwZW5ndXRyb25peC5kZT4KKy0gUnVzc2VsbCBLaW5nIDxybWtAYXJtLmxpbnV4Lm9yZy51az4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKK2NvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCit0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCit0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCithbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKK1NvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCituZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKK1RIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKi8KKworCisjZGVmaW5lIEZFX09QQ09ERV9MT0FEX1NUQVRFCQkJCQkweDAwMDAwMDAxCisjZGVmaW5lIEZFX09QQ09ERV9FTkQJCQkJCQkweDAwMDAwMDAyCisjZGVmaW5lIEZFX09QQ09ERV9OT1AJCQkJCQkweDAwMDAwMDAzCisjZGVmaW5lIEZFX09QQ09ERV9EUkFXXzJECQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIEZFX09QQ09ERV9EUkFXX1BSSU1JVElWRVMJCQkJMHgwMDAwMDAwNQorI2RlZmluZSBGRV9PUENPREVfRFJBV19JTkRFWEVEX1BSSU1JVElWRVMJCQkweDAwMDAwMDA2CisjZGVmaW5lIEZFX09QQ09ERV9XQUlUCQkJCQkJMHgwMDAwMDAwNworI2RlZmluZSBGRV9PUENPREVfTElOSwkJCQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgRkVfT1BDT0RFX1NUQUxMCQkJCQkJMHgwMDAwMDAwOQorI2RlZmluZSBGRV9PUENPREVfQ0FMTAkJCQkJCTB4MDAwMDAwMGEKKyNkZWZpbmUgRkVfT1BDT0RFX1JFVFVSTgkJCQkJMHgwMDAwMDAwYgorI2RlZmluZSBGRV9PUENPREVfQ0hJUF9TRUxFQ1QJCQkJCTB4MDAwMDAwMGQKKyNkZWZpbmUgUFJJTUlUSVZFX1RZUEVfUE9JTlRTCQkJCQkweDAwMDAwMDAxCisjZGVmaW5lIFBSSU1JVElWRV9UWVBFX0xJTkVTCQkJCQkweDAwMDAwMDAyCisjZGVmaW5lIFBSSU1JVElWRV9UWVBFX0xJTkVfU1RSSVAJCQkJMHgwMDAwMDAwMworI2RlZmluZSBQUklNSVRJVkVfVFlQRV9UUklBTkdMRVMJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBQUklNSVRJVkVfVFlQRV9UUklBTkdMRV9TVFJJUAkJCQkweDAwMDAwMDA1CisjZGVmaW5lIFBSSU1JVElWRV9UWVBFX1RSSUFOR0xFX0ZBTgkJCQkweDAwMDAwMDA2CisjZGVmaW5lIFBSSU1JVElWRV9UWVBFX0xJTkVfTE9PUAkJCQkweDAwMDAwMDA3CisjZGVmaW5lIFBSSU1JVElWRV9UWVBFX1FVQURTCQkJCQkweDAwMDAwMDA4CisjZGVmaW5lIFZJVl9GRV9MT0FEX1NUQVRFCQkJCQkweDAwMDAwMDAwCisKKyNkZWZpbmUgVklWX0ZFX0xPQURfU1RBVEVfSEVBREVSCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWX0ZFX0xPQURfU1RBVEVfSEVBREVSX09QX19NQVNLCQkJMHhmODAwMDAwMAorI2RlZmluZSBWSVZfRkVfTE9BRF9TVEFURV9IRUFERVJfT1BfX1NISUZUCQkJMjcKKyNkZWZpbmUgVklWX0ZFX0xPQURfU1RBVEVfSEVBREVSX09QX0xPQURfU1RBVEUJCQkweDA4MDAwMDAwCisjZGVmaW5lIFZJVl9GRV9MT0FEX1NUQVRFX0hFQURFUl9GSVhQCQkJCTB4MDQwMDAwMDAKKyNkZWZpbmUgVklWX0ZFX0xPQURfU1RBVEVfSEVBREVSX0NPVU5UX19NQVNLCQkJMHgwM2ZmMDAwMAorI2RlZmluZSBWSVZfRkVfTE9BRF9TVEFURV9IRUFERVJfQ09VTlRfX1NISUZUCQkJMTYKKyNkZWZpbmUgVklWX0ZFX0xPQURfU1RBVEVfSEVBREVSX0NPVU5UKHgpCQkJKCgoeCkgPDwgVklWX0ZFX0xPQURfU1RBVEVfSEVBREVSX0NPVU5UX19TSElGVCkgJiBWSVZfRkVfTE9BRF9TVEFURV9IRUFERVJfQ09VTlRfX01BU0spCisjZGVmaW5lIFZJVl9GRV9MT0FEX1NUQVRFX0hFQURFUl9PRkZTRVRfX01BU0sJCQkweDAwMDBmZmZmCisjZGVmaW5lIFZJVl9GRV9MT0FEX1NUQVRFX0hFQURFUl9PRkZTRVRfX1NISUZUCQkJMAorI2RlZmluZSBWSVZfRkVfTE9BRF9TVEFURV9IRUFERVJfT0ZGU0VUKHgpCQkJKCgoeCkgPDwgVklWX0ZFX0xPQURfU1RBVEVfSEVBREVSX09GRlNFVF9fU0hJRlQpICYgVklWX0ZFX0xPQURfU1RBVEVfSEVBREVSX09GRlNFVF9fTUFTSykKKyNkZWZpbmUgVklWX0ZFX0xPQURfU1RBVEVfSEVBREVSX09GRlNFVF9fU0hSCQkJMgorCisjZGVmaW5lIFZJVl9GRV9FTkQJCQkJCQkweDAwMDAwMDAwCisKKyNkZWZpbmUgVklWX0ZFX0VORF9IRUFERVIJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWX0ZFX0VORF9IRUFERVJfRVZFTlRfSURfX01BU0sJCQkweDAwMDAwMDFmCisjZGVmaW5lIFZJVl9GRV9FTkRfSEVBREVSX0VWRU5UX0lEX19TSElGVAkJCTAKKyNkZWZpbmUgVklWX0ZFX0VORF9IRUFERVJfRVZFTlRfSUQoeCkJCQkJKCgoeCkgPDwgVklWX0ZFX0VORF9IRUFERVJfRVZFTlRfSURfX1NISUZUKSAmIFZJVl9GRV9FTkRfSEVBREVSX0VWRU5UX0lEX19NQVNLKQorI2RlZmluZSBWSVZfRkVfRU5EX0hFQURFUl9FVkVOVF9FTkFCTEUJCQkJMHgwMDAwMDEwMAorI2RlZmluZSBWSVZfRkVfRU5EX0hFQURFUl9PUF9fTUFTSwkJCQkweGY4MDAwMDAwCisjZGVmaW5lIFZJVl9GRV9FTkRfSEVBREVSX09QX19TSElGVAkJCQkyNworI2RlZmluZSBWSVZfRkVfRU5EX0hFQURFUl9PUF9FTkQJCQkJMHgxMDAwMDAwMAorCisjZGVmaW5lIFZJVl9GRV9OT1AJCQkJCQkweDAwMDAwMDAwCisKKyNkZWZpbmUgVklWX0ZFX05PUF9IRUFERVIJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWX0ZFX05PUF9IRUFERVJfT1BfX01BU0sJCQkJMHhmODAwMDAwMAorI2RlZmluZSBWSVZfRkVfTk9QX0hFQURFUl9PUF9fU0hJRlQJCQkJMjcKKyNkZWZpbmUgVklWX0ZFX05PUF9IRUFERVJfT1BfTk9QCQkJCTB4MTgwMDAwMDAKKworI2RlZmluZSBWSVZfRkVfRFJBV18yRAkJCQkJCTB4MDAwMDAwMDAKKworI2RlZmluZSBWSVZfRkVfRFJBV18yRF9IRUFERVIJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWX0ZFX0RSQVdfMkRfSEVBREVSX0NPVU5UX19NQVNLCQkJMHgwMDAwZmYwMAorI2RlZmluZSBWSVZfRkVfRFJBV18yRF9IRUFERVJfQ09VTlRfX1NISUZUCQkJOAorI2RlZmluZSBWSVZfRkVfRFJBV18yRF9IRUFERVJfQ09VTlQoeCkJCQkJKCgoeCkgPDwgVklWX0ZFX0RSQVdfMkRfSEVBREVSX0NPVU5UX19TSElGVCkgJiBWSVZfRkVfRFJBV18yRF9IRUFERVJfQ09VTlRfX01BU0spCisjZGVmaW5lIFZJVl9GRV9EUkFXXzJEX0hFQURFUl9EQVRBX0NPVU5UX19NQVNLCQkJMHgwN2ZmMDAwMAorI2RlZmluZSBWSVZfRkVfRFJBV18yRF9IRUFERVJfREFUQV9DT1VOVF9fU0hJRlQJCQkxNgorI2RlZmluZSBWSVZfRkVfRFJBV18yRF9IRUFERVJfREFUQV9DT1VOVCh4KQkJCSgoKHgpIDw8IFZJVl9GRV9EUkFXXzJEX0hFQURFUl9EQVRBX0NPVU5UX19TSElGVCkgJiBWSVZfRkVfRFJBV18yRF9IRUFERVJfREFUQV9DT1VOVF9fTUFTSykKKyNkZWZpbmUgVklWX0ZFX0RSQVdfMkRfSEVBREVSX09QX19NQVNLCQkJCTB4ZjgwMDAwMDAKKyNkZWZpbmUgVklWX0ZFX0RSQVdfMkRfSEVBREVSX09QX19TSElGVAkJCQkyNworI2RlZmluZSBWSVZfRkVfRFJBV18yRF9IRUFERVJfT1BfRFJBV18yRAkJCTB4MjAwMDAwMDAKKworI2RlZmluZSBWSVZfRkVfRFJBV18yRF9UT1BfTEVGVAkJCQkJMHgwMDAwMDAwOAorI2RlZmluZSBWSVZfRkVfRFJBV18yRF9UT1BfTEVGVF9YX19NQVNLCQkJCTB4MDAwMGZmZmYKKyNkZWZpbmUgVklWX0ZFX0RSQVdfMkRfVE9QX0xFRlRfWF9fU0hJRlQJCQkwCisjZGVmaW5lIFZJVl9GRV9EUkFXXzJEX1RPUF9MRUZUX1goeCkJCQkJKCgoeCkgPDwgVklWX0ZFX0RSQVdfMkRfVE9QX0xFRlRfWF9fU0hJRlQpICYgVklWX0ZFX0RSQVdfMkRfVE9QX0xFRlRfWF9fTUFTSykKKyNkZWZpbmUgVklWX0ZFX0RSQVdfMkRfVE9QX0xFRlRfWV9fTUFTSwkJCQkweGZmZmYwMDAwCisjZGVmaW5lIFZJVl9GRV9EUkFXXzJEX1RPUF9MRUZUX1lfX1NISUZUCQkJMTYKKyNkZWZpbmUgVklWX0ZFX0RSQVdfMkRfVE9QX0xFRlRfWSh4KQkJCQkoKCh4KSA8PCBWSVZfRkVfRFJBV18yRF9UT1BfTEVGVF9ZX19TSElGVCkgJiBWSVZfRkVfRFJBV18yRF9UT1BfTEVGVF9ZX19NQVNLKQorCisjZGVmaW5lIFZJVl9GRV9EUkFXXzJEX0JPVFRPTV9SSUdIVAkJCQkweDAwMDAwMDBjCisjZGVmaW5lIFZJVl9GRV9EUkFXXzJEX0JPVFRPTV9SSUdIVF9YX19NQVNLCQkJMHgwMDAwZmZmZgorI2RlZmluZSBWSVZfRkVfRFJBV18yRF9CT1RUT01fUklHSFRfWF9fU0hJRlQJCQkwCisjZGVmaW5lIFZJVl9GRV9EUkFXXzJEX0JPVFRPTV9SSUdIVF9YKHgpCQkJKCgoeCkgPDwgVklWX0ZFX0RSQVdfMkRfQk9UVE9NX1JJR0hUX1hfX1NISUZUKSAmIFZJVl9GRV9EUkFXXzJEX0JPVFRPTV9SSUdIVF9YX19NQVNLKQorI2RlZmluZSBWSVZfRkVfRFJBV18yRF9CT1RUT01fUklHSFRfWV9fTUFTSwkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgVklWX0ZFX0RSQVdfMkRfQk9UVE9NX1JJR0hUX1lfX1NISUZUCQkJMTYKKyNkZWZpbmUgVklWX0ZFX0RSQVdfMkRfQk9UVE9NX1JJR0hUX1koeCkJCQkoKCh4KSA8PCBWSVZfRkVfRFJBV18yRF9CT1RUT01fUklHSFRfWV9fU0hJRlQpICYgVklWX0ZFX0RSQVdfMkRfQk9UVE9NX1JJR0hUX1lfX01BU0spCisKKyNkZWZpbmUgVklWX0ZFX0RSQVdfUFJJTUlUSVZFUwkJCQkJMHgwMDAwMDAwMAorCisjZGVmaW5lIFZJVl9GRV9EUkFXX1BSSU1JVElWRVNfSEVBREVSCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWX0ZFX0RSQVdfUFJJTUlUSVZFU19IRUFERVJfT1BfX01BU0sJCQkweGY4MDAwMDAwCisjZGVmaW5lIFZJVl9GRV9EUkFXX1BSSU1JVElWRVNfSEVBREVSX09QX19TSElGVAkJCTI3CisjZGVmaW5lIFZJVl9GRV9EUkFXX1BSSU1JVElWRVNfSEVBREVSX09QX0RSQVdfUFJJTUlUSVZFUwkweDI4MDAwMDAwCisKKyNkZWZpbmUgVklWX0ZFX0RSQVdfUFJJTUlUSVZFU19DT01NQU5ECQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWX0ZFX0RSQVdfUFJJTUlUSVZFU19DT01NQU5EX1RZUEVfX01BU0sJCTB4MDAwMDAwZmYKKyNkZWZpbmUgVklWX0ZFX0RSQVdfUFJJTUlUSVZFU19DT01NQU5EX1RZUEVfX1NISUZUCQkwCisjZGVmaW5lIFZJVl9GRV9EUkFXX1BSSU1JVElWRVNfQ09NTUFORF9UWVBFKHgpCQkJKCgoeCkgPDwgVklWX0ZFX0RSQVdfUFJJTUlUSVZFU19DT01NQU5EX1RZUEVfX1NISUZUKSAmIFZJVl9GRV9EUkFXX1BSSU1JVElWRVNfQ09NTUFORF9UWVBFX19NQVNLKQorCisjZGVmaW5lIFZJVl9GRV9EUkFXX1BSSU1JVElWRVNfU1RBUlQJCQkJMHgwMDAwMDAwOAorCisjZGVmaW5lIFZJVl9GRV9EUkFXX1BSSU1JVElWRVNfQ09VTlQJCQkJMHgwMDAwMDAwYworCisjZGVmaW5lIFZJVl9GRV9EUkFXX0lOREVYRURfUFJJTUlUSVZFUwkJCQkweDAwMDAwMDAwCisKKyNkZWZpbmUgVklWX0ZFX0RSQVdfSU5ERVhFRF9QUklNSVRJVkVTX0hFQURFUgkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWX0ZFX0RSQVdfSU5ERVhFRF9QUklNSVRJVkVTX0hFQURFUl9PUF9fTUFTSwkJMHhmODAwMDAwMAorI2RlZmluZSBWSVZfRkVfRFJBV19JTkRFWEVEX1BSSU1JVElWRVNfSEVBREVSX09QX19TSElGVAkJMjcKKyNkZWZpbmUgVklWX0ZFX0RSQVdfSU5ERVhFRF9QUklNSVRJVkVTX0hFQURFUl9PUF9EUkFXX0lOREVYRURfUFJJTUlUSVZFUwkweDMwMDAwMDAwCisKKyNkZWZpbmUgVklWX0ZFX0RSQVdfSU5ERVhFRF9QUklNSVRJVkVTX0NPTU1BTkQJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVl9GRV9EUkFXX0lOREVYRURfUFJJTUlUSVZFU19DT01NQU5EX1RZUEVfX01BU0sJMHgwMDAwMDBmZgorI2RlZmluZSBWSVZfRkVfRFJBV19JTkRFWEVEX1BSSU1JVElWRVNfQ09NTUFORF9UWVBFX19TSElGVAkwCisjZGVmaW5lIFZJVl9GRV9EUkFXX0lOREVYRURfUFJJTUlUSVZFU19DT01NQU5EX1RZUEUoeCkJCSgoKHgpIDw8IFZJVl9GRV9EUkFXX0lOREVYRURfUFJJTUlUSVZFU19DT01NQU5EX1RZUEVfX1NISUZUKSAmIFZJVl9GRV9EUkFXX0lOREVYRURfUFJJTUlUSVZFU19DT01NQU5EX1RZUEVfX01BU0spCisKKyNkZWZpbmUgVklWX0ZFX0RSQVdfSU5ERVhFRF9QUklNSVRJVkVTX1NUQVJUCQkJMHgwMDAwMDAwOAorCisjZGVmaW5lIFZJVl9GRV9EUkFXX0lOREVYRURfUFJJTUlUSVZFU19DT1VOVAkJCTB4MDAwMDAwMGMKKworI2RlZmluZSBWSVZfRkVfRFJBV19JTkRFWEVEX1BSSU1JVElWRVNfT0ZGU0VUCQkJMHgwMDAwMDAxMAorCisjZGVmaW5lIFZJVl9GRV9XQUlUCQkJCQkJMHgwMDAwMDAwMAorCisjZGVmaW5lIFZJVl9GRV9XQUlUX0hFQURFUgkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZfRkVfV0FJVF9IRUFERVJfREVMQVlfX01BU0sJCQkJMHgwMDAwZmZmZgorI2RlZmluZSBWSVZfRkVfV0FJVF9IRUFERVJfREVMQVlfX1NISUZUCQkJCTAKKyNkZWZpbmUgVklWX0ZFX1dBSVRfSEVBREVSX0RFTEFZKHgpCQkJCSgoKHgpIDw8IFZJVl9GRV9XQUlUX0hFQURFUl9ERUxBWV9fU0hJRlQpICYgVklWX0ZFX1dBSVRfSEVBREVSX0RFTEFZX19NQVNLKQorI2RlZmluZSBWSVZfRkVfV0FJVF9IRUFERVJfT1BfX01BU0sJCQkJMHhmODAwMDAwMAorI2RlZmluZSBWSVZfRkVfV0FJVF9IRUFERVJfT1BfX1NISUZUCQkJCTI3CisjZGVmaW5lIFZJVl9GRV9XQUlUX0hFQURFUl9PUF9XQUlUCQkJCTB4MzgwMDAwMDAKKworI2RlZmluZSBWSVZfRkVfTElOSwkJCQkJCTB4MDAwMDAwMDAKKworI2RlZmluZSBWSVZfRkVfTElOS19IRUFERVIJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWX0ZFX0xJTktfSEVBREVSX1BSRUZFVENIX19NQVNLCQkJMHgwMDAwZmZmZgorI2RlZmluZSBWSVZfRkVfTElOS19IRUFERVJfUFJFRkVUQ0hfX1NISUZUCQkJMAorI2RlZmluZSBWSVZfRkVfTElOS19IRUFERVJfUFJFRkVUQ0goeCkJCQkJKCgoeCkgPDwgVklWX0ZFX0xJTktfSEVBREVSX1BSRUZFVENIX19TSElGVCkgJiBWSVZfRkVfTElOS19IRUFERVJfUFJFRkVUQ0hfX01BU0spCisjZGVmaW5lIFZJVl9GRV9MSU5LX0hFQURFUl9PUF9fTUFTSwkJCQkweGY4MDAwMDAwCisjZGVmaW5lIFZJVl9GRV9MSU5LX0hFQURFUl9PUF9fU0hJRlQJCQkJMjcKKyNkZWZpbmUgVklWX0ZFX0xJTktfSEVBREVSX09QX0xJTksJCQkJMHg0MDAwMDAwMAorCisjZGVmaW5lIFZJVl9GRV9MSU5LX0FERFJFU1MJCQkJCTB4MDAwMDAwMDQKKworI2RlZmluZSBWSVZfRkVfU1RBTEwJCQkJCQkweDAwMDAwMDAwCisKKyNkZWZpbmUgVklWX0ZFX1NUQUxMX0hFQURFUgkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZfRkVfU1RBTExfSEVBREVSX09QX19NQVNLCQkJCTB4ZjgwMDAwMDAKKyNkZWZpbmUgVklWX0ZFX1NUQUxMX0hFQURFUl9PUF9fU0hJRlQJCQkJMjcKKyNkZWZpbmUgVklWX0ZFX1NUQUxMX0hFQURFUl9PUF9TVEFMTAkJCQkweDQ4MDAwMDAwCisKKyNkZWZpbmUgVklWX0ZFX1NUQUxMX1RPS0VOCQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVl9GRV9TVEFMTF9UT0tFTl9GUk9NX19NQVNLCQkJCTB4MDAwMDAwMWYKKyNkZWZpbmUgVklWX0ZFX1NUQUxMX1RPS0VOX0ZST01fX1NISUZUCQkJCTAKKyNkZWZpbmUgVklWX0ZFX1NUQUxMX1RPS0VOX0ZST00oeCkJCQkJKCgoeCkgPDwgVklWX0ZFX1NUQUxMX1RPS0VOX0ZST01fX1NISUZUKSAmIFZJVl9GRV9TVEFMTF9UT0tFTl9GUk9NX19NQVNLKQorI2RlZmluZSBWSVZfRkVfU1RBTExfVE9LRU5fVE9fX01BU0sJCQkJMHgwMDAwMWYwMAorI2RlZmluZSBWSVZfRkVfU1RBTExfVE9LRU5fVE9fX1NISUZUCQkJCTgKKyNkZWZpbmUgVklWX0ZFX1NUQUxMX1RPS0VOX1RPKHgpCQkJCSgoKHgpIDw8IFZJVl9GRV9TVEFMTF9UT0tFTl9UT19fU0hJRlQpICYgVklWX0ZFX1NUQUxMX1RPS0VOX1RPX19NQVNLKQorCisjZGVmaW5lIFZJVl9GRV9DQUxMCQkJCQkJMHgwMDAwMDAwMAorCisjZGVmaW5lIFZJVl9GRV9DQUxMX0hFQURFUgkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZfRkVfQ0FMTF9IRUFERVJfUFJFRkVUQ0hfX01BU0sJCQkweDAwMDBmZmZmCisjZGVmaW5lIFZJVl9GRV9DQUxMX0hFQURFUl9QUkVGRVRDSF9fU0hJRlQJCQkwCisjZGVmaW5lIFZJVl9GRV9DQUxMX0hFQURFUl9QUkVGRVRDSCh4KQkJCQkoKCh4KSA8PCBWSVZfRkVfQ0FMTF9IRUFERVJfUFJFRkVUQ0hfX1NISUZUKSAmIFZJVl9GRV9DQUxMX0hFQURFUl9QUkVGRVRDSF9fTUFTSykKKyNkZWZpbmUgVklWX0ZFX0NBTExfSEVBREVSX09QX19NQVNLCQkJCTB4ZjgwMDAwMDAKKyNkZWZpbmUgVklWX0ZFX0NBTExfSEVBREVSX09QX19TSElGVAkJCQkyNworI2RlZmluZSBWSVZfRkVfQ0FMTF9IRUFERVJfT1BfQ0FMTAkJCQkweDUwMDAwMDAwCisKKyNkZWZpbmUgVklWX0ZFX0NBTExfQUREUkVTUwkJCQkJMHgwMDAwMDAwNAorCisjZGVmaW5lIFZJVl9GRV9DQUxMX1JFVFVSTl9QUkVGRVRDSAkJCQkweDAwMDAwMDA4CisKKyNkZWZpbmUgVklWX0ZFX0NBTExfUkVUVVJOX0FERFJFU1MJCQkJMHgwMDAwMDAwYworCisjZGVmaW5lIFZJVl9GRV9SRVRVUk4JCQkJCQkweDAwMDAwMDAwCisKKyNkZWZpbmUgVklWX0ZFX1JFVFVSTl9IRUFERVIJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWX0ZFX1JFVFVSTl9IRUFERVJfT1BfX01BU0sJCQkJMHhmODAwMDAwMAorI2RlZmluZSBWSVZfRkVfUkVUVVJOX0hFQURFUl9PUF9fU0hJRlQJCQkJMjcKKyNkZWZpbmUgVklWX0ZFX1JFVFVSTl9IRUFERVJfT1BfUkVUVVJOCQkJCTB4NTgwMDAwMDAKKworI2RlZmluZSBWSVZfRkVfQ0hJUF9TRUxFQ1QJCQkJCTB4MDAwMDAwMDAKKworI2RlZmluZSBWSVZfRkVfQ0hJUF9TRUxFQ1RfSEVBREVSCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWX0ZFX0NISVBfU0VMRUNUX0hFQURFUl9PUF9fTUFTSwkJCTB4ZjgwMDAwMDAKKyNkZWZpbmUgVklWX0ZFX0NISVBfU0VMRUNUX0hFQURFUl9PUF9fU0hJRlQJCQkyNworI2RlZmluZSBWSVZfRkVfQ0hJUF9TRUxFQ1RfSEVBREVSX09QX0NISVBfU0VMRUNUCQkweDY4MDAwMDAwCisjZGVmaW5lIFZJVl9GRV9DSElQX1NFTEVDVF9IRUFERVJfRU5BQkxFX0NISVAxNQkJCTB4MDAwMDgwMDAKKyNkZWZpbmUgVklWX0ZFX0NISVBfU0VMRUNUX0hFQURFUl9FTkFCTEVfQ0hJUDE0CQkJMHgwMDAwNDAwMAorI2RlZmluZSBWSVZfRkVfQ0hJUF9TRUxFQ1RfSEVBREVSX0VOQUJMRV9DSElQMTMJCQkweDAwMDAyMDAwCisjZGVmaW5lIFZJVl9GRV9DSElQX1NFTEVDVF9IRUFERVJfRU5BQkxFX0NISVAxMgkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgVklWX0ZFX0NISVBfU0VMRUNUX0hFQURFUl9FTkFCTEVfQ0hJUDExCQkJMHgwMDAwMDgwMAorI2RlZmluZSBWSVZfRkVfQ0hJUF9TRUxFQ1RfSEVBREVSX0VOQUJMRV9DSElQMTAJCQkweDAwMDAwNDAwCisjZGVmaW5lIFZJVl9GRV9DSElQX1NFTEVDVF9IRUFERVJfRU5BQkxFX0NISVA5CQkJMHgwMDAwMDIwMAorI2RlZmluZSBWSVZfRkVfQ0hJUF9TRUxFQ1RfSEVBREVSX0VOQUJMRV9DSElQOAkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgVklWX0ZFX0NISVBfU0VMRUNUX0hFQURFUl9FTkFCTEVfQ0hJUDcJCQkweDAwMDAwMDgwCisjZGVmaW5lIFZJVl9GRV9DSElQX1NFTEVDVF9IRUFERVJfRU5BQkxFX0NISVA2CQkJMHgwMDAwMDA0MAorI2RlZmluZSBWSVZfRkVfQ0hJUF9TRUxFQ1RfSEVBREVSX0VOQUJMRV9DSElQNQkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgVklWX0ZFX0NISVBfU0VMRUNUX0hFQURFUl9FTkFCTEVfQ0hJUDQJCQkweDAwMDAwMDEwCisjZGVmaW5lIFZJVl9GRV9DSElQX1NFTEVDVF9IRUFERVJfRU5BQkxFX0NISVAzCQkJMHgwMDAwMDAwOAorI2RlZmluZSBWSVZfRkVfQ0hJUF9TRUxFQ1RfSEVBREVSX0VOQUJMRV9DSElQMgkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWX0ZFX0NISVBfU0VMRUNUX0hFQURFUl9FTkFCTEVfQ0hJUDEJCQkweDAwMDAwMDAyCisjZGVmaW5lIFZJVl9GRV9DSElQX1NFTEVDVF9IRUFERVJfRU5BQkxFX0NISVAwCQkJMHgwMDAwMDAwMQorCisKKyNlbmRpZiAvKiBDTURTVFJFQU1fWE1MICovCmRpZmYgLS1naXQgYS90ZXN0cy9ldG5hdml2L2V0bmF2aXZfMmRfdGVzdC5jIGIvdGVzdHMvZXRuYXZpdi9ldG5hdml2XzJkX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDc1MWM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXRuYXZpdi9ldG5hdml2XzJkX3Rlc3QuYwpAQCAtMCwwICsxLDI0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IEV0bmF2aXYgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgQ2hyaXN0aWFuIEdtZWluZXIgPGNocmlzdGlhbi5nbWVpbmVyQGdtYWlsLmNvbT4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgInhmODZkcm0uaCIKKyNpbmNsdWRlICJldG5hdml2X2RybWlmLmgiCisjaW5jbHVkZSAiZXRuYXZpdl9kcm0uaCIKKworI2luY2x1ZGUgInN0YXRlLnhtbC5oIgorI2luY2x1ZGUgInN0YXRlXzJkLnhtbC5oIgorI2luY2x1ZGUgImNtZHN0cmVhbS54bWwuaCIKKworI2luY2x1ZGUgIndyaXRlX2JtcC5oIgorCitzdGF0aWMgaW5saW5lIHZvaWQgZXRuYV9lbWl0X2xvYWRfc3RhdGUoc3RydWN0IGV0bmFfY21kX3N0cmVhbSAqc3RyZWFtLAorCQljb25zdCB1aW50MTZfdCBvZmZzZXQsIGNvbnN0IHVpbnQxNl90IGNvdW50KQoreworCXVpbnQzMl90IHY7CisKKwl2ID0gCShWSVZfRkVfTE9BRF9TVEFURV9IRUFERVJfT1BfTE9BRF9TVEFURSB8IFZJVl9GRV9MT0FEX1NUQVRFX0hFQURFUl9PRkZTRVQob2Zmc2V0KSB8CisJCQkoVklWX0ZFX0xPQURfU1RBVEVfSEVBREVSX0NPVU5UKGNvdW50KSAmIFZJVl9GRV9MT0FEX1NUQVRFX0hFQURFUl9DT1VOVF9fTUFTSykpOworCisJZXRuYV9jbWRfc3RyZWFtX2VtaXQoc3RyZWFtLCB2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV0bmFfc2V0X3N0YXRlKHN0cnVjdCBldG5hX2NtZF9zdHJlYW0gKnN0cmVhbSwgdWludDMyX3QgYWRkcmVzcywgdWludDMyX3QgdmFsdWUpCit7CisJZXRuYV9jbWRfc3RyZWFtX3Jlc2VydmUoc3RyZWFtLCAyKTsKKwlldG5hX2VtaXRfbG9hZF9zdGF0ZShzdHJlYW0sIGFkZHJlc3MgPj4gMiwgMSk7CisJZXRuYV9jbWRfc3RyZWFtX2VtaXQoc3RyZWFtLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBldG5hX3NldF9zdGF0ZV9mcm9tX2JvKHN0cnVjdCBldG5hX2NtZF9zdHJlYW0gKnN0cmVhbSwKKwkJdWludDMyX3QgYWRkcmVzcywgc3RydWN0IGV0bmFfYm8gKmJvKQoreworCWV0bmFfY21kX3N0cmVhbV9yZXNlcnZlKHN0cmVhbSwgMik7CisJZXRuYV9lbWl0X2xvYWRfc3RhdGUoc3RyZWFtLCBhZGRyZXNzID4+IDIsIDEpOworCisJZXRuYV9jbWRfc3RyZWFtX3JlbG9jKHN0cmVhbSwgJihzdHJ1Y3QgZXRuYV9yZWxvYyl7CisJCS5ibyA9IGJvLAorCQkuZmxhZ3MgPSBFVE5BX1JFTE9DX1JFQUQsCisJCS5vZmZzZXQgPSAwLAorCX0pOworfQorCitzdGF0aWMgdm9pZCBnZW5fY21kX3N0cmVhbShzdHJ1Y3QgZXRuYV9jbWRfc3RyZWFtICpzdHJlYW0sIHN0cnVjdCBldG5hX2JvICpibXAsIGNvbnN0IGludCB3aWR0aCwgY29uc3QgaW50IGhlaWdodCkKK3sKKwlpbnQgcmVjOworCXN0YXRpYyBpbnQgbnVtX3JlY3RzID0gMjU2OworCisJZXRuYV9zZXRfc3RhdGUoc3RyZWFtLCBWSVZTX0RFX1NSQ19TVFJJREUsIDApOworCWV0bmFfc2V0X3N0YXRlKHN0cmVhbSwgVklWU19ERV9TUkNfUk9UQVRJT05fQ09ORklHLCAwKTsKKwlldG5hX3NldF9zdGF0ZShzdHJlYW0sIFZJVlNfREVfU1JDX0NPTkZJRywgMCk7CisJZXRuYV9zZXRfc3RhdGUoc3RyZWFtLCBWSVZTX0RFX1NSQ19PUklHSU4sIDApOworCWV0bmFfc2V0X3N0YXRlKHN0cmVhbSwgVklWU19ERV9TUkNfU0laRSwgMCk7CisJZXRuYV9zZXRfc3RhdGUoc3RyZWFtLCBWSVZTX0RFX1NSQ19DT0xPUl9CRywgMCk7CisJZXRuYV9zZXRfc3RhdGUoc3RyZWFtLCBWSVZTX0RFX1NSQ19DT0xPUl9GRywgMCk7CisJZXRuYV9zZXRfc3RhdGUoc3RyZWFtLCBWSVZTX0RFX1NUUkVUQ0hfRkFDVE9SX0xPVywgMCk7CisJZXRuYV9zZXRfc3RhdGUoc3RyZWFtLCBWSVZTX0RFX1NUUkVUQ0hfRkFDVE9SX0hJR0gsIDApOworCWV0bmFfc2V0X3N0YXRlX2Zyb21fYm8oc3RyZWFtLCBWSVZTX0RFX0RFU1RfQUREUkVTUywgYm1wKTsKKwlldG5hX3NldF9zdGF0ZShzdHJlYW0sIFZJVlNfREVfREVTVF9TVFJJREUsIHdpZHRoKjQpOworCWV0bmFfc2V0X3N0YXRlKHN0cmVhbSwgVklWU19ERV9ERVNUX1JPVEFUSU9OX0NPTkZJRywgMCk7CisJZXRuYV9zZXRfc3RhdGUoc3RyZWFtLCBWSVZTX0RFX0RFU1RfQ09ORklHLAorCQkJVklWU19ERV9ERVNUX0NPTkZJR19GT1JNQVQoREVfRk9STUFUX0E4UjhHOEI4KSB8CisJCQlWSVZTX0RFX0RFU1RfQ09ORklHX0NPTU1BTkRfQ0xFQVIgfAorCQkJVklWU19ERV9ERVNUX0NPTkZJR19TV0laWkxFKERFX1NXSVpaTEVfQVJHQikgfAorCQkJVklWU19ERV9ERVNUX0NPTkZJR19USUxFRF9ESVNBQkxFIHwKKwkJCVZJVlNfREVfREVTVF9DT05GSUdfTUlOT1JfVElMRURfRElTQUJMRQorCQkJKTsKKwlldG5hX3NldF9zdGF0ZShzdHJlYW0sIFZJVlNfREVfUk9QLAorCQkJVklWU19ERV9ST1BfUk9QX0ZHKDB4Y2MpIHwgVklWU19ERV9ST1BfUk9QX0JHKDB4Y2MpIHwgVklWU19ERV9ST1BfVFlQRV9ST1A0KTsKKwlldG5hX3NldF9zdGF0ZShzdHJlYW0sIFZJVlNfREVfQ0xJUF9UT1BfTEVGVCwKKwkJCVZJVlNfREVfQ0xJUF9UT1BfTEVGVF9YKDApIHwKKwkJCVZJVlNfREVfQ0xJUF9UT1BfTEVGVF9ZKDApCisJCQkpOworCWV0bmFfc2V0X3N0YXRlKHN0cmVhbSwgVklWU19ERV9DTElQX0JPVFRPTV9SSUdIVCwKKwkJCVZJVlNfREVfQ0xJUF9CT1RUT01fUklHSFRfWCh3aWR0aCkgfAorCQkJVklWU19ERV9DTElQX0JPVFRPTV9SSUdIVF9ZKGhlaWdodCkKKwkJCSk7CisJZXRuYV9zZXRfc3RhdGUoc3RyZWFtLCBWSVZTX0RFX0NPTkZJRywgMCk7IC8qIFRPRE8gKi8KKwlldG5hX3NldF9zdGF0ZShzdHJlYW0sIFZJVlNfREVfU1JDX09SSUdJTl9GUkFDVElPTiwgMCk7CisJZXRuYV9zZXRfc3RhdGUoc3RyZWFtLCBWSVZTX0RFX0FMUEhBX0NPTlRST0wsIDApOworCWV0bmFfc2V0X3N0YXRlKHN0cmVhbSwgVklWU19ERV9BTFBIQV9NT0RFUywgMCk7CisJZXRuYV9zZXRfc3RhdGUoc3RyZWFtLCBWSVZTX0RFX0RFU1RfUk9UQVRJT05fSEVJR0hULCAwKTsKKwlldG5hX3NldF9zdGF0ZShzdHJlYW0sIFZJVlNfREVfU1JDX1JPVEFUSU9OX0hFSUdIVCwgMCk7CisJZXRuYV9zZXRfc3RhdGUoc3RyZWFtLCBWSVZTX0RFX1JPVF9BTkdMRSwgMCk7CisKKwkvKiBDbGVhciBjb2xvciBQRTIwICovCisJZXRuYV9zZXRfc3RhdGUoc3RyZWFtLCBWSVZTX0RFX0NMRUFSX1BJWEVMX1ZBTFVFMzIsIDB4ZmY0MGZmNDApOworCS8qIENsZWFyIGNvbG9yIFBFMTAgKi8KKwlldG5hX3NldF9zdGF0ZShzdHJlYW0sIFZJVlNfREVfQ0xFQVJfQllURV9NQVNLLCAweGZmKTsKKwlldG5hX3NldF9zdGF0ZShzdHJlYW0sIFZJVlNfREVfQ0xFQVJfUElYRUxfVkFMVUVfTE9XLCAweGZmNDBmZjQwKTsKKwlldG5hX3NldF9zdGF0ZShzdHJlYW0sIFZJVlNfREVfQ0xFQVJfUElYRUxfVkFMVUVfSElHSCwgMHhmZjQwZmY0MCk7CisKKwlldG5hX3NldF9zdGF0ZShzdHJlYW0sIFZJVlNfREVfREVTVF9DT0xPUl9LRVksIDApOworCWV0bmFfc2V0X3N0YXRlKHN0cmVhbSwgVklWU19ERV9HTE9CQUxfU1JDX0NPTE9SLCAwKTsKKwlldG5hX3NldF9zdGF0ZShzdHJlYW0sIFZJVlNfREVfR0xPQkFMX0RFU1RfQ09MT1IsIDApOworCWV0bmFfc2V0X3N0YXRlKHN0cmVhbSwgVklWU19ERV9DT0xPUl9NVUxUSVBMWV9NT0RFUywgMCk7CisJZXRuYV9zZXRfc3RhdGUoc3RyZWFtLCBWSVZTX0RFX1BFX1RSQU5TUEFSRU5DWSwgMCk7CisJZXRuYV9zZXRfc3RhdGUoc3RyZWFtLCBWSVZTX0RFX1BFX0NPTlRST0wsIDApOworCWV0bmFfc2V0X3N0YXRlKHN0cmVhbSwgVklWU19ERV9QRV9ESVRIRVJfTE9XLCAweGZmZmZmZmZmKTsKKwlldG5hX3NldF9zdGF0ZShzdHJlYW0sIFZJVlNfREVfUEVfRElUSEVSX0hJR0gsIDB4ZmZmZmZmZmYpOworCisJLyogUXVldWUgREUgY29tbWFuZCAqLworCWV0bmFfY21kX3N0cmVhbV9lbWl0KHN0cmVhbSwKKwkJCVZJVl9GRV9EUkFXXzJEX0hFQURFUl9PUF9EUkFXXzJEIHwgVklWX0ZFX0RSQVdfMkRfSEVBREVSX0NPVU5UKG51bV9yZWN0cykgLyogcmVuZGVyIG9uZSByZWN0YW5nbGUgKi8KKwkJKTsKKwlldG5hX2NtZF9zdHJlYW1fZW1pdChzdHJlYW0sIDB4MCk7IC8qIHJlY3RhbmdsZXMgc3RhcnQgYWxpZ25lZCAqLworCisJZm9yKHJlYz0wOyByZWMgPCBudW1fcmVjdHM7ICsrcmVjKSB7CisJCWludCB4ID0gcmVjJTE2OworCQlpbnQgeSA9IHJlYy8xNjsKKwkJZXRuYV9jbWRfc3RyZWFtX2VtaXQoc3RyZWFtLCBWSVZfRkVfRFJBV18yRF9UT1BfTEVGVF9YKHgqOCkgfCBWSVZfRkVfRFJBV18yRF9UT1BfTEVGVF9ZKHkqOCkpOworCQlldG5hX2NtZF9zdHJlYW1fZW1pdChzdHJlYW0sIFZJVl9GRV9EUkFXXzJEX0JPVFRPTV9SSUdIVF9YKHgqOCs0KSB8IFZJVl9GRV9EUkFXXzJEX0JPVFRPTV9SSUdIVF9ZKHkqOCs0KSk7CisJfQorCWV0bmFfc2V0X3N0YXRlKHN0cmVhbSwgMSwgMCk7CisJZXRuYV9zZXRfc3RhdGUoc3RyZWFtLCAxLCAwKTsKKwlldG5hX3NldF9zdGF0ZShzdHJlYW0sIDEsIDApOworCisJZXRuYV9zZXRfc3RhdGUoc3RyZWFtLCBWSVZTX0dMX0ZMVVNIX0NBQ0hFLCBWSVZTX0dMX0ZMVVNIX0NBQ0hFX1BFMkQpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNvbnN0IGludCB3aWR0aCA9IDI1NjsKKwljb25zdCBpbnQgaGVpZ2h0ID0gMjU2OworCWNvbnN0IHNpemVfdCBibXBfc2l6ZSA9IHdpZHRoICogaGVpZ2h0ICogNDsKKworCXN0cnVjdCBldG5hX2RldmljZSAqZGV2OworCXN0cnVjdCBldG5hX2dwdSAqZ3B1OworCXN0cnVjdCBldG5hX3BpcGUgKnBpcGU7CisJc3RydWN0IGV0bmFfYm8gKmJtcDsKKwlzdHJ1Y3QgZXRuYV9jbWRfc3RyZWFtICpzdHJlYW07CisKKwlkcm1WZXJzaW9uUHRyIHZlcnNpb247CisJaW50IGZkLCByZXQgPSAwOworCisJZmQgPSBvcGVuKGFyZ3ZbMV0sIE9fUkRXUik7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIDE7CisKKwl2ZXJzaW9uID0gZHJtR2V0VmVyc2lvbihmZCk7CisJaWYgKHZlcnNpb24pIHsKKwkJcHJpbnRmKCJWZXJzaW9uOiAlZC4lZC4lZFxuIiwgdmVyc2lvbi0+dmVyc2lvbl9tYWpvciwKKwkJICAgICAgIHZlcnNpb24tPnZlcnNpb25fbWlub3IsIHZlcnNpb24tPnZlcnNpb25fcGF0Y2hsZXZlbCk7CisJCXByaW50ZigiICBOYW1lOiAlc1xuIiwgdmVyc2lvbi0+bmFtZSk7CisJCXByaW50ZigiICBEYXRlOiAlc1xuIiwgdmVyc2lvbi0+ZGF0ZSk7CisJCXByaW50ZigiICBEZXNjcmlwdGlvbjogJXNcbiIsIHZlcnNpb24tPmRlc2MpOworCQlkcm1GcmVlVmVyc2lvbih2ZXJzaW9uKTsKKwl9CisKKwlkZXYgPSBldG5hX2RldmljZV9uZXcoZmQpOworCWlmICghZGV2KSB7CisJCXJldCA9IDI7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFRPRE86IHdlIGFzc3VtZSB0aGF0IGNvcmUgMCBpcyBhIDJEIGNhcGFibGUgb25lICovCisJZ3B1ID0gZXRuYV9ncHVfbmV3KGRldiwgMCk7CisJaWYgKCFncHUpIHsKKwkJcmV0ID0gMzsKKwkJZ290byBvdXRfZGV2aWNlOworCX0KKworCXBpcGUgPSBldG5hX3BpcGVfbmV3KGdwdSwgRVROQV9QSVBFXzJEKTsKKwlpZiAoIXBpcGUpIHsKKwkJcmV0ID0gNDsKKwkJZ290byBvdXRfZ3B1OworCX0KKworCWJtcCA9IGV0bmFfYm9fbmV3KGRldiwgYm1wX3NpemUsIEVUTkFfQk9fVU5DQUNIRUQpOworCWlmICghYm1wKSB7CisJCXJldCA9IDU7CisJCWdvdG8gb3V0X3BpcGU7CisJfQorCW1lbXNldChldG5hX2JvX21hcChibXApLCAwLCBibXBfc2l6ZSk7CisKKwlzdHJlYW0gPSBldG5hX2NtZF9zdHJlYW1fbmV3KHBpcGUsIDB4MzAwLCBOVUxMLCBOVUxMKTsKKwlpZiAoIXN0cmVhbSkgeworCQlyZXQgPSA2OworCQlnb3RvIG91dF9ibzsKKwl9CisKKwkvKiBnZW5lcmF0ZSBjb21tYW5kIHNlcXVlbmNlICovCisJZ2VuX2NtZF9zdHJlYW0oc3RyZWFtLCBibXAsIHdpZHRoLCBoZWlnaHQpOworCisJZXRuYV9jbWRfc3RyZWFtX2ZpbmlzaChzdHJlYW0pOworCisJYm1wX2R1bXAzMihldG5hX2JvX21hcChibXApLCB3aWR0aCwgaGVpZ2h0LCBmYWxzZSwgIi90bXAvZXRuYS5ibXAiKTsKKworCWV0bmFfY21kX3N0cmVhbV9kZWwoc3RyZWFtKTsKKworb3V0X2JvOgorICAgIGV0bmFfYm9fZGVsKGJtcCk7CisKK291dF9waXBlOgorCWV0bmFfcGlwZV9kZWwocGlwZSk7CisKK291dF9ncHU6CisJZXRuYV9ncHVfZGVsKGdwdSk7CisKK291dF9kZXZpY2U6CisJZXRuYV9kZXZpY2VfZGVsKGRldik7CisKK291dDoKKwljbG9zZShmZCk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXRuYXZpdi9ldG5hdml2X2JvX2NhY2hlX3Rlc3QuYyBiL3Rlc3RzL2V0bmF2aXYvZXRuYXZpdl9ib19jYWNoZV90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIwMWY4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V0bmF2aXYvZXRuYXZpdl9ib19jYWNoZV90ZXN0LmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgRXRuYXZpdiBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBDaHJpc3RpYW4gR21laW5lciA8Y2hyaXN0aWFuLmdtZWluZXJAZ21haWwuY29tPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjdW5kZWYgTkRFQlVHCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJ4Zjg2ZHJtLmgiCisjaW5jbHVkZSAiZXRuYXZpdl9kcm1pZi5oIgorI2luY2x1ZGUgImV0bmF2aXZfZHJtLmgiCisKK3N0YXRpYyB2b2lkIHRlc3RfY2FjaGUoc3RydWN0IGV0bmFfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV0bmFfYm8gKmJvLCAqdG1wOworCisJLyogYWxsb2NhdGUgYW5kIGZyZWUgc29tZSBibydzIHdpdGggc2FtZSBzaXplIC0gd2UgbXVzdAorCSAqIGdldCB0aGUgc2FtZSBibyBvdmVyIGFuZCBvdmVyLiAqLworCXByaW50ZigidGVzdGluZyBibyBjYWNoZSAuLi4gIik7CisKKwlibyA9IHRtcCA9IGV0bmFfYm9fbmV3KGRldiwgMHgxMDAsIEVUTkFfQk9fVU5DQUNIRUQpOworCWFzc2VydChibyk7CisJZXRuYV9ib19kZWwoYm8pOworCisJZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCXRtcCA9IGV0bmFfYm9fbmV3KGRldiwgMHgxMDAsIEVUTkFfQk9fVU5DQUNIRUQpOworCQlldG5hX2JvX2RlbCh0bXApOworCQlhc3NlcnQodG1wID09IGJvKTsKKwl9CisKKwlwcmludGYoIm9rXG4iKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9zaXplX3JvdW5kaW5nKHN0cnVjdCBldG5hX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBldG5hX2JvICpibzsKKworCXByaW50ZigidGVzdGluZyBzaXplIHJvdW5kaW5nIC4uLiAiKTsKKworCWJvID0gZXRuYV9ib19uZXcoZGV2LCAxNSwgRVROQV9CT19VTkNBQ0hFRCk7CisJYXNzZXJ0KGV0bmFfYm9fc2l6ZShibykgPT0gNDA5Nik7CisJZXRuYV9ib19kZWwoYm8pOworCisJYm8gPSBldG5hX2JvX25ldyhkZXYsIDQwOTYsIEVUTkFfQk9fVU5DQUNIRUQpOworCWFzc2VydChldG5hX2JvX3NpemUoYm8pID09IDQwOTYpOworCWV0bmFfYm9fZGVsKGJvKTsKKworCWJvID0gZXRuYV9ib19uZXcoZGV2LCA0MTAwLCBFVE5BX0JPX1VOQ0FDSEVEKTsKKwlhc3NlcnQoZXRuYV9ib19zaXplKGJvKSA9PSA4MTkyKTsKKwlldG5hX2JvX2RlbChibyk7CisKKwlwcmludGYoIm9rXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlzdHJ1Y3QgZXRuYV9kZXZpY2UgKmRldjsKKworCWRybVZlcnNpb25QdHIgdmVyc2lvbjsKKwlpbnQgZmQsIHJldCA9IDA7CisKKwlmZCA9IG9wZW4oYXJndlsxXSwgT19SRFdSKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gMTsKKworCXZlcnNpb24gPSBkcm1HZXRWZXJzaW9uKGZkKTsKKwlpZiAodmVyc2lvbikgeworCQlwcmludGYoIlZlcnNpb246ICVkLiVkLiVkXG4iLCB2ZXJzaW9uLT52ZXJzaW9uX21ham9yLAorCQkgICAgICAgdmVyc2lvbi0+dmVyc2lvbl9taW5vciwgdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsKTsKKwkJcHJpbnRmKCIgIE5hbWU6ICVzXG4iLCB2ZXJzaW9uLT5uYW1lKTsKKwkJcHJpbnRmKCIgIERhdGU6ICVzXG4iLCB2ZXJzaW9uLT5kYXRlKTsKKwkJcHJpbnRmKCIgIERlc2NyaXB0aW9uOiAlc1xuIiwgdmVyc2lvbi0+ZGVzYyk7CisJCWRybUZyZWVWZXJzaW9uKHZlcnNpb24pOworCX0KKworCWRldiA9IGV0bmFfZGV2aWNlX25ldyhmZCk7CisJaWYgKCFkZXYpIHsKKwkJcmV0ID0gMjsKKwkJZ290byBvdXQ7CisJfQorCisJdGVzdF9jYWNoZShkZXYpOworCXRlc3Rfc2l6ZV9yb3VuZGluZyhkZXYpOworCisJZXRuYV9kZXZpY2VfZGVsKGRldik7CisKK291dDoKKwljbG9zZShmZCk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXRuYXZpdi9ldG5hdml2X2NtZF9zdHJlYW1fdGVzdC5jIGIvdGVzdHMvZXRuYXZpdi9ldG5hdml2X2NtZF9zdHJlYW1fdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NTBhYWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9ldG5hdml2L2V0bmF2aXZfY21kX3N0cmVhbV90ZXN0LmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgRXRuYXZpdiBQcm9qZWN0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBDaHJpc3RpYW4gR21laW5lciA8Y2hyaXN0aWFuLmdtZWluZXJAZ21haWwuY29tPgorICovCisKKyN1bmRlZiBOREVCVUcKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZXRuYXZpdl9kcm1pZi5oIgorCitzdGF0aWMgdm9pZCB0ZXN0X2F2YWlsKCkKK3sKKwlzdHJ1Y3QgZXRuYV9jbWRfc3RyZWFtICpzdHJlYW07CisKKwlwcmludGYoInRlc3RpbmcgZXRuYV9jbWRfc3RyZWFtX2F2YWlsIC4uLiAiKTsKKworCS8qIGludmFsaWQgc2l6ZSAqLworCXN0cmVhbSA9IGV0bmFfY21kX3N0cmVhbV9uZXcoTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisJYXNzZXJ0KHN0cmVhbSA9PSBOVUxMKTsKKworCXN0cmVhbSA9IGV0bmFfY21kX3N0cmVhbV9uZXcoTlVMTCwgNCwgTlVMTCwgTlVMTCk7CisJYXNzZXJ0KHN0cmVhbSk7CisJYXNzZXJ0KGV0bmFfY21kX3N0cmVhbV9hdmFpbChzdHJlYW0pID09IDIpOworCWV0bmFfY21kX3N0cmVhbV9kZWwoc3RyZWFtKTsKKworCXN0cmVhbSA9IGV0bmFfY21kX3N0cmVhbV9uZXcoTlVMTCwgMjAsIE5VTEwsIE5VTEwpOworCWFzc2VydChzdHJlYW0pOworCWFzc2VydChldG5hX2NtZF9zdHJlYW1fYXZhaWwoc3RyZWFtKSA9PSAxOCk7CisJZXRuYV9jbWRfc3RyZWFtX2RlbChzdHJlYW0pOworCisJLyogb2RkIG51bWJlciBvZiAzMiBiaXQgd29yZHMgKi8KKwlzdHJlYW0gPSBldG5hX2NtZF9zdHJlYW1fbmV3KE5VTEwsIDEsIE5VTEwsIE5VTEwpOworCWFzc2VydChzdHJlYW0pOworCWFzc2VydChldG5hX2NtZF9zdHJlYW1fYXZhaWwoc3RyZWFtKSA9PSAwKTsKKwlldG5hX2NtZF9zdHJlYW1fZGVsKHN0cmVhbSk7CisKKwlzdHJlYW0gPSBldG5hX2NtZF9zdHJlYW1fbmV3KE5VTEwsIDIzLCBOVUxMLCBOVUxMKTsKKwlhc3NlcnQoc3RyZWFtKTsKKwlhc3NlcnQoZXRuYV9jbWRfc3RyZWFtX2F2YWlsKHN0cmVhbSkgPT0gMjIpOworCWV0bmFfY21kX3N0cmVhbV9kZWwoc3RyZWFtKTsKKworCXByaW50Zigib2tcbiIpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2VtaXQoKQoreworCXN0cnVjdCBldG5hX2NtZF9zdHJlYW0gKnN0cmVhbTsKKworCXByaW50ZigidGVzdGluZyBldG5hX2NtZF9zdHJlYW1fZW1pdCAuLi4gIik7CisKKwlzdHJlYW0gPSBldG5hX2NtZF9zdHJlYW1fbmV3KE5VTEwsIDYsIE5VTEwsIE5VTEwpOworCWFzc2VydChzdHJlYW0pOworCWFzc2VydChldG5hX2NtZF9zdHJlYW1fYXZhaWwoc3RyZWFtKSA9PSA0KTsKKworCWV0bmFfY21kX3N0cmVhbV9lbWl0KHN0cmVhbSwgMHgxKTsKKwlhc3NlcnQoZXRuYV9jbWRfc3RyZWFtX2F2YWlsKHN0cmVhbSkgPT0gMyk7CisKKwlldG5hX2NtZF9zdHJlYW1fZW1pdChzdHJlYW0sIDB4Mik7CisJYXNzZXJ0KGV0bmFfY21kX3N0cmVhbV9hdmFpbChzdHJlYW0pID09IDIpOworCisJZXRuYV9jbWRfc3RyZWFtX2VtaXQoc3RyZWFtLCAweDMpOworCWFzc2VydChldG5hX2NtZF9zdHJlYW1fYXZhaWwoc3RyZWFtKSA9PSAxKTsKKworCWV0bmFfY21kX3N0cmVhbV9kZWwoc3RyZWFtKTsKKworCXByaW50Zigib2tcbiIpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X29mZnNldCgpCit7CisJc3RydWN0IGV0bmFfY21kX3N0cmVhbSAqc3RyZWFtOworCisJcHJpbnRmKCJ0ZXN0aW5nIGV0bmFfY21kX3N0cmVhbV9vZmZzZXQgLi4uICIpOworCisJc3RyZWFtID0gZXRuYV9jbWRfc3RyZWFtX25ldyhOVUxMLCA2LCBOVUxMLCBOVUxMKTsKKwlhc3NlcnQoZXRuYV9jbWRfc3RyZWFtX29mZnNldChzdHJlYW0pID09IDApOworCisJZXRuYV9jbWRfc3RyZWFtX2VtaXQoc3RyZWFtLCAweDEpOworCWFzc2VydChldG5hX2NtZF9zdHJlYW1fb2Zmc2V0KHN0cmVhbSkgPT0gMSk7CisKKwlldG5hX2NtZF9zdHJlYW1fZW1pdChzdHJlYW0sIDB4Mik7CisJYXNzZXJ0KGV0bmFfY21kX3N0cmVhbV9vZmZzZXQoc3RyZWFtKSA9PSAyKTsKKworCWV0bmFfY21kX3N0cmVhbV9lbWl0KHN0cmVhbSwgMHgzKTsKKwlldG5hX2NtZF9zdHJlYW1fZW1pdChzdHJlYW0sIDB4NCk7CisJYXNzZXJ0KGV0bmFfY21kX3N0cmVhbV9vZmZzZXQoc3RyZWFtKSA9PSA0KTsKKworCWV0bmFfY21kX3N0cmVhbV9kZWwoc3RyZWFtKTsKKworCXByaW50Zigib2tcbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXRlc3RfYXZhaWwoKTsKKwl0ZXN0X2VtaXQoKTsKKwl0ZXN0X29mZnNldCgpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9ldG5hdml2L3N0YXRlLnhtbC5oIGIvdGVzdHMvZXRuYXZpdi9zdGF0ZS54bWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWVjYmYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXRuYXZpdi9zdGF0ZS54bWwuaApAQCAtMCwwICsxLDM3NSBAQAorI2lmbmRlZiBTVEFURV9YTUwKKyNkZWZpbmUgU1RBVEVfWE1MCisKKy8qIEF1dG9nZW5lcmF0ZWQgZmlsZSwgRE8gTk9UIEVESVQgbWFudWFsbHkhCisKK1RoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBydWxlcy1uZy1uZyBoZWFkZXJnZW4gdG9vbCBpbiB0aGlzIGdpdCByZXBvc2l0b3J5OgoraHR0cDovLzB4MDQubmV0L2NnaXQvaW5kZXguY2dpL3J1bGVzLW5nLW5nCitnaXQgY2xvbmUgZ2l0Oi8vMHgwNC5uZXQvcnVsZXMtbmctbmcKKworVGhlIHJ1bGVzLW5nLW5nIHNvdXJjZSBmaWxlcyB0aGlzIGhlYWRlciB3YXMgZ2VuZXJhdGVkIGZyb20gYXJlOgorLSBzdGF0ZS54bWwgICAgICggIDE4OTQwIGJ5dGVzLCBmcm9tIDIwMTYtMDktMDYgMTQ6MTQ6MTIpCistIGNvbW1vbi54bWwgICAgKCAgMjA1ODMgYnl0ZXMsIGZyb20gMjAxNi0wOS0wNiAxNDoxNDoxMikKKy0gc3RhdGVfaGkueG1sICAoICAyNTY1MyBieXRlcywgZnJvbSAyMDE2LTA5LTA2IDE0OjQ1OjE3KQorLSBjb3B5cmlnaHQueG1sICggICAxNTk3IGJ5dGVzLCBmcm9tIDIwMTYtMDktMDYgMTQ6NDQ6MTYpCistIHN0YXRlXzJkLnhtbCAgKCAgNTE1NTIgYnl0ZXMsIGZyb20gMjAxNi0wOS0wNiAxNDo0NDoxNikKKy0gc3RhdGVfM2QueG1sICAoICA1NDYwMyBieXRlcywgZnJvbSAyMDE2LTA5LTA2IDE0OjQ0OjE2KQorLSBzdGF0ZV92Zy54bWwgICggICA1OTc1IGJ5dGVzLCBmcm9tIDIwMTYtMDktMDYgMTQ6NDQ6MTYpCisKK0NvcHlyaWdodCAoQykgMjAxMi0yMDE2IGJ5IHRoZSBmb2xsb3dpbmcgYXV0aG9yczoKKy0gV2xhZGltaXIgSi4gdmFuIGRlciBMYWFuIDxsYWFud2pAZ21haWwuY29tPgorLSBDaHJpc3RpYW4gR21laW5lciA8Y2hyaXN0aWFuLmdtZWluZXJAZ21haWwuY29tPgorLSBMdWNhcyBTdGFjaCA8bC5zdGFjaEBwZW5ndXRyb25peC5kZT4KKy0gUnVzc2VsbCBLaW5nIDxybWtAYXJtLmxpbnV4Lm9yZy51az4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKK2NvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCit0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCit0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCithbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKK1NvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCituZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKK1RIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKi8KKworCisjZGVmaW5lIFZBUllJTkdfQ09NUE9ORU5UX1VTRV9VTlVTRUQJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBWQVJZSU5HX0NPTVBPTkVOVF9VU0VfVVNFRAkJCQkweDAwMDAwMDAxCisjZGVmaW5lIFZBUllJTkdfQ09NUE9ORU5UX1VTRV9QT0lOVENPT1JEX1gJCQkweDAwMDAwMDAyCisjZGVmaW5lIFZBUllJTkdfQ09NUE9ORU5UX1VTRV9QT0lOVENPT1JEX1kJCQkweDAwMDAwMDAzCisjZGVmaW5lIEZFX1ZFUlRFWF9TVFJFQU1fQ09OVFJPTF9WRVJURVhfU1RSSURFX19NQVNLCQkweDAwMDAwMGZmCisjZGVmaW5lIEZFX1ZFUlRFWF9TVFJFQU1fQ09OVFJPTF9WRVJURVhfU1RSSURFX19TSElGVAkJMAorI2RlZmluZSBGRV9WRVJURVhfU1RSRUFNX0NPTlRST0xfVkVSVEVYX1NUUklERSh4KQkJKCgoeCkgPDwgRkVfVkVSVEVYX1NUUkVBTV9DT05UUk9MX1ZFUlRFWF9TVFJJREVfX1NISUZUKSAmIEZFX1ZFUlRFWF9TVFJFQU1fQ09OVFJPTF9WRVJURVhfU1RSSURFX19NQVNLKQorI2RlZmluZSBWSVZTX0ZFCQkJCQkJCTB4MDAwMDAwMDAKKworI2RlZmluZSBWSVZTX0ZFX1ZFUlRFWF9FTEVNRU5UX0NPTkZJRyhpMCkJCSAgICAgICAoMHgwMDAwMDYwMCArIDB4NCooaTApKQorI2RlZmluZSBWSVZTX0ZFX1ZFUlRFWF9FTEVNRU5UX0NPTkZJR19fRVNJWkUJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfRkVfVkVSVEVYX0VMRU1FTlRfQ09ORklHX19MRU4JCQkweDAwMDAwMDEwCisjZGVmaW5lIFZJVlNfRkVfVkVSVEVYX0VMRU1FTlRfQ09ORklHX1RZUEVfX01BU0sJCTB4MDAwMDAwMGYKKyNkZWZpbmUgVklWU19GRV9WRVJURVhfRUxFTUVOVF9DT05GSUdfVFlQRV9fU0hJRlQJCTAKKyNkZWZpbmUgVklWU19GRV9WRVJURVhfRUxFTUVOVF9DT05GSUdfVFlQRV9CWVRFCQkJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0ZFX1ZFUlRFWF9FTEVNRU5UX0NPTkZJR19UWVBFX1VOU0lHTkVEX0JZVEUJMHgwMDAwMDAwMQorI2RlZmluZSBWSVZTX0ZFX1ZFUlRFWF9FTEVNRU5UX0NPTkZJR19UWVBFX1NIT1JUCQkweDAwMDAwMDAyCisjZGVmaW5lIFZJVlNfRkVfVkVSVEVYX0VMRU1FTlRfQ09ORklHX1RZUEVfVU5TSUdORURfU0hPUlQJMHgwMDAwMDAwMworI2RlZmluZSBWSVZTX0ZFX1ZFUlRFWF9FTEVNRU5UX0NPTkZJR19UWVBFX0lOVAkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19GRV9WRVJURVhfRUxFTUVOVF9DT05GSUdfVFlQRV9VTlNJR05FRF9JTlQJCTB4MDAwMDAwMDUKKyNkZWZpbmUgVklWU19GRV9WRVJURVhfRUxFTUVOVF9DT05GSUdfVFlQRV9GTE9BVAkJMHgwMDAwMDAwOAorI2RlZmluZSBWSVZTX0ZFX1ZFUlRFWF9FTEVNRU5UX0NPTkZJR19UWVBFX0hBTEZfRkxPQVQJCTB4MDAwMDAwMDkKKyNkZWZpbmUgVklWU19GRV9WRVJURVhfRUxFTUVOVF9DT05GSUdfVFlQRV9GSVhFRAkJMHgwMDAwMDAwYgorI2RlZmluZSBWSVZTX0ZFX1ZFUlRFWF9FTEVNRU5UX0NPTkZJR19UWVBFX0lOVF8xMF8xMF8xMF8yCTB4MDAwMDAwMGMKKyNkZWZpbmUgVklWU19GRV9WRVJURVhfRUxFTUVOVF9DT05GSUdfVFlQRV9VTlNJR05FRF9JTlRfMTBfMTBfMTBfMgkweDAwMDAwMDBkCisjZGVmaW5lIFZJVlNfRkVfVkVSVEVYX0VMRU1FTlRfQ09ORklHX0VORElBTl9fTUFTSwkJMHgwMDAwMDAzMAorI2RlZmluZSBWSVZTX0ZFX1ZFUlRFWF9FTEVNRU5UX0NPTkZJR19FTkRJQU5fX1NISUZUCQk0CisjZGVmaW5lIFZJVlNfRkVfVkVSVEVYX0VMRU1FTlRfQ09ORklHX0VORElBTih4KQkJCSgoKHgpIDw8IFZJVlNfRkVfVkVSVEVYX0VMRU1FTlRfQ09ORklHX0VORElBTl9fU0hJRlQpICYgVklWU19GRV9WRVJURVhfRUxFTUVOVF9DT05GSUdfRU5ESUFOX19NQVNLKQorI2RlZmluZSBWSVZTX0ZFX1ZFUlRFWF9FTEVNRU5UX0NPTkZJR19OT05DT05TRUNVVElWRQkJMHgwMDAwMDA4MAorI2RlZmluZSBWSVZTX0ZFX1ZFUlRFWF9FTEVNRU5UX0NPTkZJR19TVFJFQU1fX01BU0sJCTB4MDAwMDA3MDAKKyNkZWZpbmUgVklWU19GRV9WRVJURVhfRUxFTUVOVF9DT05GSUdfU1RSRUFNX19TSElGVAkJOAorI2RlZmluZSBWSVZTX0ZFX1ZFUlRFWF9FTEVNRU5UX0NPTkZJR19TVFJFQU0oeCkJCQkoKCh4KSA8PCBWSVZTX0ZFX1ZFUlRFWF9FTEVNRU5UX0NPTkZJR19TVFJFQU1fX1NISUZUKSAmIFZJVlNfRkVfVkVSVEVYX0VMRU1FTlRfQ09ORklHX1NUUkVBTV9fTUFTSykKKyNkZWZpbmUgVklWU19GRV9WRVJURVhfRUxFTUVOVF9DT05GSUdfTlVNX19NQVNLCQkJMHgwMDAwMzAwMAorI2RlZmluZSBWSVZTX0ZFX1ZFUlRFWF9FTEVNRU5UX0NPTkZJR19OVU1fX1NISUZUCQkxMgorI2RlZmluZSBWSVZTX0ZFX1ZFUlRFWF9FTEVNRU5UX0NPTkZJR19OVU0oeCkJCQkoKCh4KSA8PCBWSVZTX0ZFX1ZFUlRFWF9FTEVNRU5UX0NPTkZJR19OVU1fX1NISUZUKSAmIFZJVlNfRkVfVkVSVEVYX0VMRU1FTlRfQ09ORklHX05VTV9fTUFTSykKKyNkZWZpbmUgVklWU19GRV9WRVJURVhfRUxFTUVOVF9DT05GSUdfTk9STUFMSVpFX19NQVNLCQkweDAwMDBjMDAwCisjZGVmaW5lIFZJVlNfRkVfVkVSVEVYX0VMRU1FTlRfQ09ORklHX05PUk1BTElaRV9fU0hJRlQJCTE0CisjZGVmaW5lIFZJVlNfRkVfVkVSVEVYX0VMRU1FTlRfQ09ORklHX05PUk1BTElaRV9PRkYJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19GRV9WRVJURVhfRUxFTUVOVF9DT05GSUdfTk9STUFMSVpFX09OCQkweDAwMDA4MDAwCisjZGVmaW5lIFZJVlNfRkVfVkVSVEVYX0VMRU1FTlRfQ09ORklHX1NUQVJUX19NQVNLCQkweDAwZmYwMDAwCisjZGVmaW5lIFZJVlNfRkVfVkVSVEVYX0VMRU1FTlRfQ09ORklHX1NUQVJUX19TSElGVAkJMTYKKyNkZWZpbmUgVklWU19GRV9WRVJURVhfRUxFTUVOVF9DT05GSUdfU1RBUlQoeCkJCQkoKCh4KSA8PCBWSVZTX0ZFX1ZFUlRFWF9FTEVNRU5UX0NPTkZJR19TVEFSVF9fU0hJRlQpICYgVklWU19GRV9WRVJURVhfRUxFTUVOVF9DT05GSUdfU1RBUlRfX01BU0spCisjZGVmaW5lIFZJVlNfRkVfVkVSVEVYX0VMRU1FTlRfQ09ORklHX0VORF9fTUFTSwkJCTB4ZmYwMDAwMDAKKyNkZWZpbmUgVklWU19GRV9WRVJURVhfRUxFTUVOVF9DT05GSUdfRU5EX19TSElGVAkJMjQKKyNkZWZpbmUgVklWU19GRV9WRVJURVhfRUxFTUVOVF9DT05GSUdfRU5EKHgpCQkJKCgoeCkgPDwgVklWU19GRV9WRVJURVhfRUxFTUVOVF9DT05GSUdfRU5EX19TSElGVCkgJiBWSVZTX0ZFX1ZFUlRFWF9FTEVNRU5UX0NPTkZJR19FTkRfX01BU0spCisKKyNkZWZpbmUgVklWU19GRV9DTURfU1RSRUFNX0JBU0VfQUREUgkJCQkweDAwMDAwNjQwCisKKyNkZWZpbmUgVklWU19GRV9JTkRFWF9TVFJFQU1fQkFTRV9BRERSCQkJCTB4MDAwMDA2NDQKKworI2RlZmluZSBWSVZTX0ZFX0lOREVYX1NUUkVBTV9DT05UUk9MCQkJCTB4MDAwMDA2NDgKKyNkZWZpbmUgVklWU19GRV9JTkRFWF9TVFJFQU1fQ09OVFJPTF9UWVBFX19NQVNLCQkJMHgwMDAwMDAwMworI2RlZmluZSBWSVZTX0ZFX0lOREVYX1NUUkVBTV9DT05UUk9MX1RZUEVfX1NISUZUCQkwCisjZGVmaW5lIFZJVlNfRkVfSU5ERVhfU1RSRUFNX0NPTlRST0xfVFlQRV9VTlNJR05FRF9DSEFSCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfRkVfSU5ERVhfU1RSRUFNX0NPTlRST0xfVFlQRV9VTlNJR05FRF9TSE9SVAkweDAwMDAwMDAxCisjZGVmaW5lIFZJVlNfRkVfSU5ERVhfU1RSRUFNX0NPTlRST0xfVFlQRV9VTlNJR05FRF9JTlQJCTB4MDAwMDAwMDIKKworI2RlZmluZSBWSVZTX0ZFX1ZFUlRFWF9TVFJFQU1fQkFTRV9BRERSCQkJCTB4MDAwMDA2NGMKKworI2RlZmluZSBWSVZTX0ZFX1ZFUlRFWF9TVFJFQU1fQ09OVFJPTAkJCQkweDAwMDAwNjUwCisKKyNkZWZpbmUgVklWU19GRV9DT01NQU5EX0FERFJFU1MJCQkJCTB4MDAwMDA2NTQKKworI2RlZmluZSBWSVZTX0ZFX0NPTU1BTkRfQ09OVFJPTAkJCQkJMHgwMDAwMDY1OAorI2RlZmluZSBWSVZTX0ZFX0NPTU1BTkRfQ09OVFJPTF9QUkVGRVRDSF9fTUFTSwkJCTB4MDAwMGZmZmYKKyNkZWZpbmUgVklWU19GRV9DT01NQU5EX0NPTlRST0xfUFJFRkVUQ0hfX1NISUZUCQkJMAorI2RlZmluZSBWSVZTX0ZFX0NPTU1BTkRfQ09OVFJPTF9QUkVGRVRDSCh4KQkJCSgoKHgpIDw8IFZJVlNfRkVfQ09NTUFORF9DT05UUk9MX1BSRUZFVENIX19TSElGVCkgJiBWSVZTX0ZFX0NPTU1BTkRfQ09OVFJPTF9QUkVGRVRDSF9fTUFTSykKKyNkZWZpbmUgVklWU19GRV9DT01NQU5EX0NPTlRST0xfRU5BQkxFCQkJCTB4MDAwMTAwMDAKKworI2RlZmluZSBWSVZTX0ZFX0RNQV9TVEFUVVMJCQkJCTB4MDAwMDA2NWMKKworI2RlZmluZSBWSVZTX0ZFX0RNQV9ERUJVR19TVEFURQkJCQkJMHgwMDAwMDY2MAorI2RlZmluZSBWSVZTX0ZFX0RNQV9ERUJVR19TVEFURV9DTURfU1RBVEVfX01BU0sJCQkweDAwMDAwMDFmCisjZGVmaW5lIFZJVlNfRkVfRE1BX0RFQlVHX1NUQVRFX0NNRF9TVEFURV9fU0hJRlQJCTAKKyNkZWZpbmUgVklWU19GRV9ETUFfREVCVUdfU1RBVEVfQ01EX1NUQVRFX0lETEUJCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfRkVfRE1BX0RFQlVHX1NUQVRFX0NNRF9TVEFURV9ERUMJCQkweDAwMDAwMDAxCisjZGVmaW5lIFZJVlNfRkVfRE1BX0RFQlVHX1NUQVRFX0NNRF9TVEFURV9BRFIwCQkJMHgwMDAwMDAwMgorI2RlZmluZSBWSVZTX0ZFX0RNQV9ERUJVR19TVEFURV9DTURfU1RBVEVfTE9BRDAJCQkweDAwMDAwMDAzCisjZGVmaW5lIFZJVlNfRkVfRE1BX0RFQlVHX1NUQVRFX0NNRF9TVEFURV9BRFIxCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0ZFX0RNQV9ERUJVR19TVEFURV9DTURfU1RBVEVfTE9BRDEJCQkweDAwMDAwMDA1CisjZGVmaW5lIFZJVlNfRkVfRE1BX0RFQlVHX1NUQVRFX0NNRF9TVEFURV8zREFEUgkJCTB4MDAwMDAwMDYKKyNkZWZpbmUgVklWU19GRV9ETUFfREVCVUdfU1RBVEVfQ01EX1NUQVRFXzNEQ01ECQkJMHgwMDAwMDAwNworI2RlZmluZSBWSVZTX0ZFX0RNQV9ERUJVR19TVEFURV9DTURfU1RBVEVfM0RDTlRMCQkweDAwMDAwMDA4CisjZGVmaW5lIFZJVlNfRkVfRE1BX0RFQlVHX1NUQVRFX0NNRF9TVEFURV8zRElEWENOVEwJCTB4MDAwMDAwMDkKKyNkZWZpbmUgVklWU19GRV9ETUFfREVCVUdfU1RBVEVfQ01EX1NUQVRFX0lOSVRSRVFETUEJCTB4MDAwMDAwMGEKKyNkZWZpbmUgVklWU19GRV9ETUFfREVCVUdfU1RBVEVfQ01EX1NUQVRFX0RSQVdJRFgJCTB4MDAwMDAwMGIKKyNkZWZpbmUgVklWU19GRV9ETUFfREVCVUdfU1RBVEVfQ01EX1NUQVRFX0RSQVcJCQkweDAwMDAwMDBjCisjZGVmaW5lIFZJVlNfRkVfRE1BX0RFQlVHX1NUQVRFX0NNRF9TVEFURV8yRFJFQ1QwCQkweDAwMDAwMDBkCisjZGVmaW5lIFZJVlNfRkVfRE1BX0RFQlVHX1NUQVRFX0NNRF9TVEFURV8yRFJFQ1QxCQkweDAwMDAwMDBlCisjZGVmaW5lIFZJVlNfRkVfRE1BX0RFQlVHX1NUQVRFX0NNRF9TVEFURV8yRERBVEEwCQkweDAwMDAwMDBmCisjZGVmaW5lIFZJVlNfRkVfRE1BX0RFQlVHX1NUQVRFX0NNRF9TVEFURV8yRERBVEExCQkweDAwMDAwMDEwCisjZGVmaW5lIFZJVlNfRkVfRE1BX0RFQlVHX1NUQVRFX0NNRF9TVEFURV9XQUlURklGTwkJMHgwMDAwMDAxMQorI2RlZmluZSBWSVZTX0ZFX0RNQV9ERUJVR19TVEFURV9DTURfU1RBVEVfV0FJVAkJCTB4MDAwMDAwMTIKKyNkZWZpbmUgVklWU19GRV9ETUFfREVCVUdfU1RBVEVfQ01EX1NUQVRFX0xJTksJCQkweDAwMDAwMDEzCisjZGVmaW5lIFZJVlNfRkVfRE1BX0RFQlVHX1NUQVRFX0NNRF9TVEFURV9FTkQJCQkweDAwMDAwMDE0CisjZGVmaW5lIFZJVlNfRkVfRE1BX0RFQlVHX1NUQVRFX0NNRF9TVEFURV9TVEFMTAkJCTB4MDAwMDAwMTUKKyNkZWZpbmUgVklWU19GRV9ETUFfREVCVUdfU1RBVEVfQ01EX0RNQV9TVEFURV9fTUFTSwkJMHgwMDAwMDMwMAorI2RlZmluZSBWSVZTX0ZFX0RNQV9ERUJVR19TVEFURV9DTURfRE1BX1NUQVRFX19TSElGVAkJOAorI2RlZmluZSBWSVZTX0ZFX0RNQV9ERUJVR19TVEFURV9DTURfRE1BX1NUQVRFX0lETEUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19GRV9ETUFfREVCVUdfU1RBVEVfQ01EX0RNQV9TVEFURV9TVEFSVAkJMHgwMDAwMDEwMAorI2RlZmluZSBWSVZTX0ZFX0RNQV9ERUJVR19TVEFURV9DTURfRE1BX1NUQVRFX1JFUQkJMHgwMDAwMDIwMAorI2RlZmluZSBWSVZTX0ZFX0RNQV9ERUJVR19TVEFURV9DTURfRE1BX1NUQVRFX0VORAkJMHgwMDAwMDMwMAorI2RlZmluZSBWSVZTX0ZFX0RNQV9ERUJVR19TVEFURV9DTURfRkVUQ0hfU1RBVEVfX01BU0sJCTB4MDAwMDBjMDAKKyNkZWZpbmUgVklWU19GRV9ETUFfREVCVUdfU1RBVEVfQ01EX0ZFVENIX1NUQVRFX19TSElGVAkJMTAKKyNkZWZpbmUgVklWU19GRV9ETUFfREVCVUdfU1RBVEVfQ01EX0ZFVENIX1NUQVRFX0lETEUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19GRV9ETUFfREVCVUdfU1RBVEVfQ01EX0ZFVENIX1NUQVRFX1JBTVZBTElECTB4MDAwMDA0MDAKKyNkZWZpbmUgVklWU19GRV9ETUFfREVCVUdfU1RBVEVfQ01EX0ZFVENIX1NUQVRFX1ZBTElECQkweDAwMDAwODAwCisjZGVmaW5lIFZJVlNfRkVfRE1BX0RFQlVHX1NUQVRFX1JFUV9ETUFfU1RBVEVfX01BU0sJCTB4MDAwMDMwMDAKKyNkZWZpbmUgVklWU19GRV9ETUFfREVCVUdfU1RBVEVfUkVRX0RNQV9TVEFURV9fU0hJRlQJCTEyCisjZGVmaW5lIFZJVlNfRkVfRE1BX0RFQlVHX1NUQVRFX1JFUV9ETUFfU1RBVEVfSURMRQkJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0ZFX0RNQV9ERUJVR19TVEFURV9SRVFfRE1BX1NUQVRFX1dBSVRJRFgJCTB4MDAwMDEwMDAKKyNkZWZpbmUgVklWU19GRV9ETUFfREVCVUdfU1RBVEVfUkVRX0RNQV9TVEFURV9DQUwJCTB4MDAwMDIwMDAKKyNkZWZpbmUgVklWU19GRV9ETUFfREVCVUdfU1RBVEVfQ0FMX1NUQVRFX19NQVNLCQkJMHgwMDAwYzAwMAorI2RlZmluZSBWSVZTX0ZFX0RNQV9ERUJVR19TVEFURV9DQUxfU1RBVEVfX1NISUZUCQkxNAorI2RlZmluZSBWSVZTX0ZFX0RNQV9ERUJVR19TVEFURV9DQUxfU1RBVEVfSURMRQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19GRV9ETUFfREVCVUdfU1RBVEVfQ0FMX1NUQVRFX0xEQURSCQkJMHgwMDAwNDAwMAorI2RlZmluZSBWSVZTX0ZFX0RNQV9ERUJVR19TVEFURV9DQUxfU1RBVEVfSURYQ0FMQwkJMHgwMDAwODAwMAorI2RlZmluZSBWSVZTX0ZFX0RNQV9ERUJVR19TVEFURV9WRV9SRVFfU1RBVEVfX01BU0sJCTB4MDAwMzAwMDAKKyNkZWZpbmUgVklWU19GRV9ETUFfREVCVUdfU1RBVEVfVkVfUkVRX1NUQVRFX19TSElGVAkJMTYKKyNkZWZpbmUgVklWU19GRV9ETUFfREVCVUdfU1RBVEVfVkVfUkVRX1NUQVRFX0lETEUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19GRV9ETUFfREVCVUdfU1RBVEVfVkVfUkVRX1NUQVRFX0NLQ0FDSEUJCTB4MDAwMTAwMDAKKyNkZWZpbmUgVklWU19GRV9ETUFfREVCVUdfU1RBVEVfVkVfUkVRX1NUQVRFX01JU1MJCTB4MDAwMjAwMDAKKworI2RlZmluZSBWSVZTX0ZFX0RNQV9BRERSRVNTCQkJCQkweDAwMDAwNjY0CisKKyNkZWZpbmUgVklWU19GRV9ETUFfTE9XCQkJCQkJMHgwMDAwMDY2OAorCisjZGVmaW5lIFZJVlNfRkVfRE1BX0hJR0gJCQkJCTB4MDAwMDA2NmMKKworI2RlZmluZSBWSVZTX0ZFX0FVVE9fRkxVU0gJCQkJCTB4MDAwMDA2NzAKKworI2RlZmluZSBWSVZTX0ZFX1VOSzAwNjc4CQkJCQkweDAwMDAwNjc4CisKKyNkZWZpbmUgVklWU19GRV9VTkswMDY3QwkJCQkJMHgwMDAwMDY3YworCisjZGVmaW5lIFZJVlNfRkVfVkVSVEVYX1NUUkVBTVMoaTApCQkJICAgICAgICgweDAwMDAwMDAwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfRkVfVkVSVEVYX1NUUkVBTVNfX0VTSVpFCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19GRV9WRVJURVhfU1RSRUFNU19fTEVOCQkJCTB4MDAwMDAwMDgKKworI2RlZmluZSBWSVZTX0ZFX1ZFUlRFWF9TVFJFQU1TX0JBU0VfQUREUihpMCkJCSAgICAgICAoMHgwMDAwMDY4MCArIDB4NCooaTApKQorCisjZGVmaW5lIFZJVlNfRkVfVkVSVEVYX1NUUkVBTVNfQ09OVFJPTChpMCkJCSAgICAgICAoMHgwMDAwMDZhMCArIDB4NCooaTApKQorCisjZGVmaW5lIFZJVlNfRkVfVU5LMDA3MDAoaTApCQkJCSAgICAgICAoMHgwMDAwMDcwMCArIDB4NCooaTApKQorI2RlZmluZSBWSVZTX0ZFX1VOSzAwNzAwX19FU0laRQkJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0ZFX1VOSzAwNzAwX19MRU4JCQkJCTB4MDAwMDAwMTAKKworI2RlZmluZSBWSVZTX0ZFX1VOSzAwNzQwKGkwKQkJCQkgICAgICAgKDB4MDAwMDA3NDAgKyAweDQqKGkwKSkKKyNkZWZpbmUgVklWU19GRV9VTkswMDc0MF9fRVNJWkUJCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19GRV9VTkswMDc0MF9fTEVOCQkJCQkweDAwMDAwMDEwCisKKyNkZWZpbmUgVklWU19GRV9VTkswMDc4MChpMCkJCQkJICAgICAgICgweDAwMDAwNzgwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfRkVfVU5LMDA3ODBfX0VTSVpFCQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfRkVfVU5LMDA3ODBfX0xFTgkJCQkJMHgwMDAwMDAxMAorCisjZGVmaW5lIFZJVlNfR0wJCQkJCQkJMHgwMDAwMDAwMAorCisjZGVmaW5lIFZJVlNfR0xfUElQRV9TRUxFQ1QJCQkJCTB4MDAwMDM4MDAKKyNkZWZpbmUgVklWU19HTF9QSVBFX1NFTEVDVF9QSVBFX19NQVNLCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgVklWU19HTF9QSVBFX1NFTEVDVF9QSVBFX19TSElGVAkJCQkwCisjZGVmaW5lIFZJVlNfR0xfUElQRV9TRUxFQ1RfUElQRSh4KQkJCQkoKCh4KSA8PCBWSVZTX0dMX1BJUEVfU0VMRUNUX1BJUEVfX1NISUZUKSAmIFZJVlNfR0xfUElQRV9TRUxFQ1RfUElQRV9fTUFTSykKKworI2RlZmluZSBWSVZTX0dMX0VWRU5UCQkJCQkJMHgwMDAwMzgwNAorI2RlZmluZSBWSVZTX0dMX0VWRU5UX0VWRU5UX0lEX19NQVNLCQkJCTB4MDAwMDAwMWYKKyNkZWZpbmUgVklWU19HTF9FVkVOVF9FVkVOVF9JRF9fU0hJRlQJCQkJMAorI2RlZmluZSBWSVZTX0dMX0VWRU5UX0VWRU5UX0lEKHgpCQkJCSgoKHgpIDw8IFZJVlNfR0xfRVZFTlRfRVZFTlRfSURfX1NISUZUKSAmIFZJVlNfR0xfRVZFTlRfRVZFTlRfSURfX01BU0spCisjZGVmaW5lIFZJVlNfR0xfRVZFTlRfRlJPTV9GRQkJCQkJMHgwMDAwMDAyMAorI2RlZmluZSBWSVZTX0dMX0VWRU5UX0ZST01fUEUJCQkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgVklWU19HTF9FVkVOVF9TT1VSQ0VfX01BU0sJCQkJMHgwMDAwMWYwMAorI2RlZmluZSBWSVZTX0dMX0VWRU5UX1NPVVJDRV9fU0hJRlQJCQkJOAorI2RlZmluZSBWSVZTX0dMX0VWRU5UX1NPVVJDRSh4KQkJCQkJKCgoeCkgPDwgVklWU19HTF9FVkVOVF9TT1VSQ0VfX1NISUZUKSAmIFZJVlNfR0xfRVZFTlRfU09VUkNFX19NQVNLKQorCisjZGVmaW5lIFZJVlNfR0xfU0VNQVBIT1JFX1RPS0VOCQkJCQkweDAwMDAzODA4CisjZGVmaW5lIFZJVlNfR0xfU0VNQVBIT1JFX1RPS0VOX0ZST01fX01BU0sJCQkweDAwMDAwMDFmCisjZGVmaW5lIFZJVlNfR0xfU0VNQVBIT1JFX1RPS0VOX0ZST01fX1NISUZUCQkJMAorI2RlZmluZSBWSVZTX0dMX1NFTUFQSE9SRV9UT0tFTl9GUk9NKHgpCQkJCSgoKHgpIDw8IFZJVlNfR0xfU0VNQVBIT1JFX1RPS0VOX0ZST01fX1NISUZUKSAmIFZJVlNfR0xfU0VNQVBIT1JFX1RPS0VOX0ZST01fX01BU0spCisjZGVmaW5lIFZJVlNfR0xfU0VNQVBIT1JFX1RPS0VOX1RPX19NQVNLCQkJMHgwMDAwMWYwMAorI2RlZmluZSBWSVZTX0dMX1NFTUFQSE9SRV9UT0tFTl9UT19fU0hJRlQJCQk4CisjZGVmaW5lIFZJVlNfR0xfU0VNQVBIT1JFX1RPS0VOX1RPKHgpCQkJCSgoKHgpIDw8IFZJVlNfR0xfU0VNQVBIT1JFX1RPS0VOX1RPX19TSElGVCkgJiBWSVZTX0dMX1NFTUFQSE9SRV9UT0tFTl9UT19fTUFTSykKKworI2RlZmluZSBWSVZTX0dMX0ZMVVNIX0NBQ0hFCQkJCQkweDAwMDAzODBjCisjZGVmaW5lIFZJVlNfR0xfRkxVU0hfQ0FDSEVfREVQVEgJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBWSVZTX0dMX0ZMVVNIX0NBQ0hFX0NPTE9SCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgVklWU19HTF9GTFVTSF9DQUNIRV9URVhUVVJFCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19HTF9GTFVTSF9DQUNIRV9QRTJECQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgVklWU19HTF9GTFVTSF9DQUNIRV9URVhUVVJFVlMJCQkJMHgwMDAwMDAxMAorI2RlZmluZSBWSVZTX0dMX0ZMVVNIX0NBQ0hFX1NIQURFUl9MMQkJCQkweDAwMDAwMDIwCisjZGVmaW5lIFZJVlNfR0xfRkxVU0hfQ0FDSEVfU0hBREVSX0wyCQkJCTB4MDAwMDAwNDAKKworI2RlZmluZSBWSVZTX0dMX0ZMVVNIX01NVQkJCQkJMHgwMDAwMzgxMAorI2RlZmluZSBWSVZTX0dMX0ZMVVNIX01NVV9GTFVTSF9GRU1NVQkJCQkweDAwMDAwMDAxCisjZGVmaW5lIFZJVlNfR0xfRkxVU0hfTU1VX0ZMVVNIX1VOSzEJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBWSVZTX0dMX0ZMVVNIX01NVV9GTFVTSF9VTksyCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19HTF9GTFVTSF9NTVVfRkxVU0hfUEVNTVUJCQkJMHgwMDAwMDAwOAorI2RlZmluZSBWSVZTX0dMX0ZMVVNIX01NVV9GTFVTSF9VTks0CQkJCTB4MDAwMDAwMTAKKworI2RlZmluZSBWSVZTX0dMX1ZFUlRFWF9FTEVNRU5UX0NPTkZJRwkJCQkweDAwMDAzODE0CisKKyNkZWZpbmUgVklWU19HTF9NVUxUSV9TQU1QTEVfQ09ORklHCQkJCTB4MDAwMDM4MTgKKyNkZWZpbmUgVklWU19HTF9NVUxUSV9TQU1QTEVfQ09ORklHX01TQUFfU0FNUExFU19fTUFTSwkJMHgwMDAwMDAwMworI2RlZmluZSBWSVZTX0dMX01VTFRJX1NBTVBMRV9DT05GSUdfTVNBQV9TQU1QTEVTX19TSElGVAkJMAorI2RlZmluZSBWSVZTX0dMX01VTFRJX1NBTVBMRV9DT05GSUdfTVNBQV9TQU1QTEVTX05PTkUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19HTF9NVUxUSV9TQU1QTEVfQ09ORklHX01TQUFfU0FNUExFU18yWAkJMHgwMDAwMDAwMQorI2RlZmluZSBWSVZTX0dMX01VTFRJX1NBTVBMRV9DT05GSUdfTVNBQV9TQU1QTEVTXzRYCQkweDAwMDAwMDAyCisjZGVmaW5lIFZJVlNfR0xfTVVMVElfU0FNUExFX0NPTkZJR19NU0FBX1NBTVBMRVNfTUFTSwkJMHgwMDAwMDAwOAorI2RlZmluZSBWSVZTX0dMX01VTFRJX1NBTVBMRV9DT05GSUdfTVNBQV9FTkFCTEVTX19NQVNLCQkweDAwMDAwMGYwCisjZGVmaW5lIFZJVlNfR0xfTVVMVElfU0FNUExFX0NPTkZJR19NU0FBX0VOQUJMRVNfX1NISUZUCQk0CisjZGVmaW5lIFZJVlNfR0xfTVVMVElfU0FNUExFX0NPTkZJR19NU0FBX0VOQUJMRVMoeCkJCSgoKHgpIDw8IFZJVlNfR0xfTVVMVElfU0FNUExFX0NPTkZJR19NU0FBX0VOQUJMRVNfX1NISUZUKSAmIFZJVlNfR0xfTVVMVElfU0FNUExFX0NPTkZJR19NU0FBX0VOQUJMRVNfX01BU0spCisjZGVmaW5lIFZJVlNfR0xfTVVMVElfU0FNUExFX0NPTkZJR19NU0FBX0VOQUJMRVNfTUFTSwkJMHgwMDAwMDEwMAorI2RlZmluZSBWSVZTX0dMX01VTFRJX1NBTVBMRV9DT05GSUdfVU5LMTJfX01BU0sJCQkweDAwMDA3MDAwCisjZGVmaW5lIFZJVlNfR0xfTVVMVElfU0FNUExFX0NPTkZJR19VTksxMl9fU0hJRlQJCTEyCisjZGVmaW5lIFZJVlNfR0xfTVVMVElfU0FNUExFX0NPTkZJR19VTksxMih4KQkJCSgoKHgpIDw8IFZJVlNfR0xfTVVMVElfU0FNUExFX0NPTkZJR19VTksxMl9fU0hJRlQpICYgVklWU19HTF9NVUxUSV9TQU1QTEVfQ09ORklHX1VOSzEyX19NQVNLKQorI2RlZmluZSBWSVZTX0dMX01VTFRJX1NBTVBMRV9DT05GSUdfVU5LMTJfTUFTSwkJCTB4MDAwMDgwMDAKKyNkZWZpbmUgVklWU19HTF9NVUxUSV9TQU1QTEVfQ09ORklHX1VOSzE2X19NQVNLCQkJMHgwMDAzMDAwMAorI2RlZmluZSBWSVZTX0dMX01VTFRJX1NBTVBMRV9DT05GSUdfVU5LMTZfX1NISUZUCQkxNgorI2RlZmluZSBWSVZTX0dMX01VTFRJX1NBTVBMRV9DT05GSUdfVU5LMTYoeCkJCQkoKCh4KSA8PCBWSVZTX0dMX01VTFRJX1NBTVBMRV9DT05GSUdfVU5LMTZfX1NISUZUKSAmIFZJVlNfR0xfTVVMVElfU0FNUExFX0NPTkZJR19VTksxNl9fTUFTSykKKyNkZWZpbmUgVklWU19HTF9NVUxUSV9TQU1QTEVfQ09ORklHX1VOSzE2X01BU0sJCQkweDAwMDgwMDAwCisKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX1RPVEFMX0NPTVBPTkVOVFMJCQkweDAwMDAzODFjCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19UT1RBTF9DT01QT05FTlRTX05VTV9fTUFTSwkJMHgwMDAwMDBmZgorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfVE9UQUxfQ09NUE9ORU5UU19OVU1fX1NISUZUCQkwCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19UT1RBTF9DT01QT05FTlRTX05VTSh4KQkJCSgoKHgpIDw8IFZJVlNfR0xfVkFSWUlOR19UT1RBTF9DT01QT05FTlRTX05VTV9fU0hJRlQpICYgVklWU19HTF9WQVJZSU5HX1RPVEFMX0NPTVBPTkVOVFNfTlVNX19NQVNLKQorCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19OVU1fQ09NUE9ORU5UUwkJCQkweDAwMDAzODIwCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19OVU1fQ09NUE9ORU5UU19WQVIwX19NQVNLCQkweDAwMDAwMDA3CisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19OVU1fQ09NUE9ORU5UU19WQVIwX19TSElGVAkJMAorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfTlVNX0NPTVBPTkVOVFNfVkFSMCh4KQkJCSgoKHgpIDw8IFZJVlNfR0xfVkFSWUlOR19OVU1fQ09NUE9ORU5UU19WQVIwX19TSElGVCkgJiBWSVZTX0dMX1ZBUllJTkdfTlVNX0NPTVBPTkVOVFNfVkFSMF9fTUFTSykKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX05VTV9DT01QT05FTlRTX1ZBUjFfX01BU0sJCTB4MDAwMDAwNzAKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX05VTV9DT01QT05FTlRTX1ZBUjFfX1NISUZUCQk0CisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19OVU1fQ09NUE9ORU5UU19WQVIxKHgpCQkJKCgoeCkgPDwgVklWU19HTF9WQVJZSU5HX05VTV9DT01QT05FTlRTX1ZBUjFfX1NISUZUKSAmIFZJVlNfR0xfVkFSWUlOR19OVU1fQ09NUE9ORU5UU19WQVIxX19NQVNLKQorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfTlVNX0NPTVBPTkVOVFNfVkFSMl9fTUFTSwkJMHgwMDAwMDcwMAorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfTlVNX0NPTVBPTkVOVFNfVkFSMl9fU0hJRlQJCTgKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX05VTV9DT01QT05FTlRTX1ZBUjIoeCkJCQkoKCh4KSA8PCBWSVZTX0dMX1ZBUllJTkdfTlVNX0NPTVBPTkVOVFNfVkFSMl9fU0hJRlQpICYgVklWU19HTF9WQVJZSU5HX05VTV9DT01QT05FTlRTX1ZBUjJfX01BU0spCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19OVU1fQ09NUE9ORU5UU19WQVIzX19NQVNLCQkweDAwMDA3MDAwCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19OVU1fQ09NUE9ORU5UU19WQVIzX19TSElGVAkJMTIKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX05VTV9DT01QT05FTlRTX1ZBUjMoeCkJCQkoKCh4KSA8PCBWSVZTX0dMX1ZBUllJTkdfTlVNX0NPTVBPTkVOVFNfVkFSM19fU0hJRlQpICYgVklWU19HTF9WQVJZSU5HX05VTV9DT01QT05FTlRTX1ZBUjNfX01BU0spCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19OVU1fQ09NUE9ORU5UU19WQVI0X19NQVNLCQkweDAwMDcwMDAwCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19OVU1fQ09NUE9ORU5UU19WQVI0X19TSElGVAkJMTYKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX05VTV9DT01QT05FTlRTX1ZBUjQoeCkJCQkoKCh4KSA8PCBWSVZTX0dMX1ZBUllJTkdfTlVNX0NPTVBPTkVOVFNfVkFSNF9fU0hJRlQpICYgVklWU19HTF9WQVJZSU5HX05VTV9DT01QT05FTlRTX1ZBUjRfX01BU0spCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19OVU1fQ09NUE9ORU5UU19WQVI1X19NQVNLCQkweDAwNzAwMDAwCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19OVU1fQ09NUE9ORU5UU19WQVI1X19TSElGVAkJMjAKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX05VTV9DT01QT05FTlRTX1ZBUjUoeCkJCQkoKCh4KSA8PCBWSVZTX0dMX1ZBUllJTkdfTlVNX0NPTVBPTkVOVFNfVkFSNV9fU0hJRlQpICYgVklWU19HTF9WQVJZSU5HX05VTV9DT01QT05FTlRTX1ZBUjVfX01BU0spCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19OVU1fQ09NUE9ORU5UU19WQVI2X19NQVNLCQkweDA3MDAwMDAwCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19OVU1fQ09NUE9ORU5UU19WQVI2X19TSElGVAkJMjQKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX05VTV9DT01QT05FTlRTX1ZBUjYoeCkJCQkoKCh4KSA8PCBWSVZTX0dMX1ZBUllJTkdfTlVNX0NPTVBPTkVOVFNfVkFSNl9fU0hJRlQpICYgVklWU19HTF9WQVJZSU5HX05VTV9DT01QT05FTlRTX1ZBUjZfX01BU0spCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19OVU1fQ09NUE9ORU5UU19WQVI3X19NQVNLCQkweDcwMDAwMDAwCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19OVU1fQ09NUE9ORU5UU19WQVI3X19TSElGVAkJMjgKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX05VTV9DT01QT05FTlRTX1ZBUjcoeCkJCQkoKCh4KSA8PCBWSVZTX0dMX1ZBUllJTkdfTlVNX0NPTVBPTkVOVFNfVkFSN19fU0hJRlQpICYgVklWU19HTF9WQVJZSU5HX05VTV9DT01QT05FTlRTX1ZBUjdfX01BU0spCisKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0UoaTApCQkgICAgICAgKDB4MDAwMDM4MjggKyAweDQqKGkwKSkKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfX0VTSVpFCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9fTEVOCQkJMHgwMDAwMDAwMgorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QMF9fTUFTSwkJMHgwMDAwMDAwMworI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QMF9fU0hJRlQJCTAKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDAoeCkJCQkoKCh4KSA8PCBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QMF9fU0hJRlQpICYgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDBfX01BU0spCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVAxX19NQVNLCQkweDAwMDAwMDBjCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVAxX19TSElGVAkJMgorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QMSh4KQkJCSgoKHgpIDw8IFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVAxX19TSElGVCkgJiBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QMV9fTUFTSykKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDJfX01BU0sJCTB4MDAwMDAwMzAKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDJfX1NISUZUCQk0CisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVAyKHgpCQkJKCgoeCkgPDwgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDJfX1NISUZUKSAmIFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVAyX19NQVNLKQorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QM19fTUFTSwkJMHgwMDAwMDBjMAorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QM19fU0hJRlQJCTYKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDMoeCkJCQkoKCh4KSA8PCBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QM19fU0hJRlQpICYgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDNfX01BU0spCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVA0X19NQVNLCQkweDAwMDAwMzAwCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVA0X19TSElGVAkJOAorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QNCh4KQkJCSgoKHgpIDw8IFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVA0X19TSElGVCkgJiBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QNF9fTUFTSykKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDVfX01BU0sJCTB4MDAwMDBjMDAKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDVfX1NISUZUCQkxMAorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QNSh4KQkJCSgoKHgpIDw8IFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVA1X19TSElGVCkgJiBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QNV9fTUFTSykKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDZfX01BU0sJCTB4MDAwMDMwMDAKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDZfX1NISUZUCQkxMgorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QNih4KQkJCSgoKHgpIDw8IFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVA2X19TSElGVCkgJiBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QNl9fTUFTSykKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDdfX01BU0sJCTB4MDAwMGMwMDAKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDdfX1NISUZUCQkxNAorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QNyh4KQkJCSgoKHgpIDw8IFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVA3X19TSElGVCkgJiBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QN19fTUFTSykKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDhfX01BU0sJCTB4MDAwMzAwMDAKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDhfX1NISUZUCQkxNgorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QOCh4KQkJCSgoKHgpIDw8IFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVA4X19TSElGVCkgJiBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QOF9fTUFTSykKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDlfX01BU0sJCTB4MDAwYzAwMDAKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDlfX1NISUZUCQkxOAorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QOSh4KQkJCSgoKHgpIDw8IFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVA5X19TSElGVCkgJiBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QOV9fTUFTSykKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDEwX19NQVNLCQkweDAwMzAwMDAwCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVAxMF9fU0hJRlQJCTIwCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVAxMCh4KQkJCSgoKHgpIDw8IFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVAxMF9fU0hJRlQpICYgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDEwX19NQVNLKQorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QMTFfX01BU0sJCTB4MDBjMDAwMDAKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDExX19TSElGVAkJMjIKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDExKHgpCQkJKCgoeCkgPDwgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDExX19TSElGVCkgJiBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QMTFfX01BU0spCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVAxMl9fTUFTSwkJMHgwMzAwMDAwMAorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QMTJfX1NISUZUCQkyNAorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QMTIoeCkJCQkoKCh4KSA8PCBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QMTJfX1NISUZUKSAmIFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVAxMl9fTUFTSykKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDEzX19NQVNLCQkweDBjMDAwMDAwCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVAxM19fU0hJRlQJCTI2CisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVAxMyh4KQkJCSgoKHgpIDw8IFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVAxM19fU0hJRlQpICYgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDEzX19NQVNLKQorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QMTRfX01BU0sJCTB4MzAwMDAwMDAKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDE0X19TSElGVAkJMjgKKyNkZWZpbmUgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDE0KHgpCQkJKCgoeCkgPDwgVklWU19HTF9WQVJZSU5HX0NPTVBPTkVOVF9VU0VfQ09NUDE0X19TSElGVCkgJiBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QMTRfX01BU0spCisjZGVmaW5lIFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVAxNV9fTUFTSwkJMHhjMDAwMDAwMAorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QMTVfX1NISUZUCQkzMAorI2RlZmluZSBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QMTUoeCkJCQkoKCh4KSA8PCBWSVZTX0dMX1ZBUllJTkdfQ09NUE9ORU5UX1VTRV9DT01QMTVfX1NISUZUKSAmIFZJVlNfR0xfVkFSWUlOR19DT01QT05FTlRfVVNFX0NPTVAxNV9fTUFTSykKKworI2RlZmluZSBWSVZTX0dMX1VOSzAzODM0CQkJCQkweDAwMDAzODM0CisKKyNkZWZpbmUgVklWU19HTF9VTkswMzgzOAkJCQkJMHgwMDAwMzgzOAorCisjZGVmaW5lIFZJVlNfR0xfQVBJX01PREUJCQkJCTB4MDAwMDM4NGMKKyNkZWZpbmUgVklWU19HTF9BUElfTU9ERV9PUEVOR0wJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19HTF9BUElfTU9ERV9PUEVOVkcJCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgVklWU19HTF9BUElfTU9ERV9PUEVOQ0wJCQkJCTB4MDAwMDAwMDIKKworI2RlZmluZSBWSVZTX0dMX0NPTlRFWFRfUE9JTlRFUgkJCQkJMHgwMDAwMzg1MAorCisjZGVmaW5lIFZJVlNfR0xfVU5LMDNBMDAJCQkJCTB4MDAwMDNhMDAKKworI2RlZmluZSBWSVZTX0dMX1NUQUxMX1RPS0VOCQkJCQkweDAwMDAzYzAwCisjZGVmaW5lIFZJVlNfR0xfU1RBTExfVE9LRU5fRlJPTV9fTUFTSwkJCQkweDAwMDAwMDFmCisjZGVmaW5lIFZJVlNfR0xfU1RBTExfVE9LRU5fRlJPTV9fU0hJRlQJCQkJMAorI2RlZmluZSBWSVZTX0dMX1NUQUxMX1RPS0VOX0ZST00oeCkJCQkJKCgoeCkgPDwgVklWU19HTF9TVEFMTF9UT0tFTl9GUk9NX19TSElGVCkgJiBWSVZTX0dMX1NUQUxMX1RPS0VOX0ZST01fX01BU0spCisjZGVmaW5lIFZJVlNfR0xfU1RBTExfVE9LRU5fVE9fX01BU0sJCQkJMHgwMDAwMWYwMAorI2RlZmluZSBWSVZTX0dMX1NUQUxMX1RPS0VOX1RPX19TSElGVAkJCQk4CisjZGVmaW5lIFZJVlNfR0xfU1RBTExfVE9LRU5fVE8oeCkJCQkJKCgoeCkgPDwgVklWU19HTF9TVEFMTF9UT0tFTl9UT19fU0hJRlQpICYgVklWU19HTF9TVEFMTF9UT0tFTl9UT19fTUFTSykKKyNkZWZpbmUgVklWU19HTF9TVEFMTF9UT0tFTl9GTElQMAkJCQkweDQwMDAwMDAwCisjZGVmaW5lIFZJVlNfR0xfU1RBTExfVE9LRU5fRkxJUDEJCQkJMHg4MDAwMDAwMAorCisjZGVmaW5lIFZJVlNfRFVNTVkJCQkJCQkweDAwMDAwMDAwCisKKyNkZWZpbmUgVklWU19EVU1NWV9EVU1NWQkJCQkJMHgwMDAzZmZmYworCisKKyNlbmRpZiAvKiBTVEFURV9YTUwgKi8KZGlmZiAtLWdpdCBhL3Rlc3RzL2V0bmF2aXYvc3RhdGVfMmQueG1sLmggYi90ZXN0cy9ldG5hdml2L3N0YXRlXzJkLnhtbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNWVlZDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9ldG5hdml2L3N0YXRlXzJkLnhtbC5oCkBAIC0wLDAgKzEsMTQ5NyBAQAorI2lmbmRlZiBTVEFURV8yRF9YTUwKKyNkZWZpbmUgU1RBVEVfMkRfWE1MCisKKy8qIEF1dG9nZW5lcmF0ZWQgZmlsZSwgRE8gTk9UIEVESVQgbWFudWFsbHkhCisKK1RoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBydWxlcy1uZy1uZyBoZWFkZXJnZW4gdG9vbCBpbiB0aGlzIGdpdCByZXBvc2l0b3J5OgoraHR0cDovLzB4MDQubmV0L2NnaXQvaW5kZXguY2dpL3J1bGVzLW5nLW5nCitnaXQgY2xvbmUgZ2l0Oi8vMHgwNC5uZXQvcnVsZXMtbmctbmcKKworVGhlIHJ1bGVzLW5nLW5nIHNvdXJjZSBmaWxlcyB0aGlzIGhlYWRlciB3YXMgZ2VuZXJhdGVkIGZyb20gYXJlOgorLSBzdGF0ZS54bWwgICAgICggIDE4OTQwIGJ5dGVzLCBmcm9tIDIwMTYtMDktMDYgMTQ6MTQ6MTIpCistIGNvbW1vbi54bWwgICAgKCAgMjA1ODMgYnl0ZXMsIGZyb20gMjAxNi0wOS0wNiAxNDoxNDoxMikKKy0gc3RhdGVfaGkueG1sICAoICAyNTY1MyBieXRlcywgZnJvbSAyMDE2LTA5LTA2IDE0OjQ1OjE3KQorLSBjb3B5cmlnaHQueG1sICggICAxNTk3IGJ5dGVzLCBmcm9tIDIwMTYtMDktMDYgMTQ6NDQ6MTYpCistIHN0YXRlXzJkLnhtbCAgKCAgNTE1NTIgYnl0ZXMsIGZyb20gMjAxNi0wOS0wNiAxNDo0NDoxNikKKy0gc3RhdGVfM2QueG1sICAoICA1NDYwMyBieXRlcywgZnJvbSAyMDE2LTA5LTA2IDE0OjQ0OjE2KQorLSBzdGF0ZV92Zy54bWwgICggICA1OTc1IGJ5dGVzLCBmcm9tIDIwMTYtMDktMDYgMTQ6NDQ6MTYpCisKK0NvcHlyaWdodCAoQykgMjAxMi0yMDE2IGJ5IHRoZSBmb2xsb3dpbmcgYXV0aG9yczoKKy0gV2xhZGltaXIgSi4gdmFuIGRlciBMYWFuIDxsYWFud2pAZ21haWwuY29tPgorLSBDaHJpc3RpYW4gR21laW5lciA8Y2hyaXN0aWFuLmdtZWluZXJAZ21haWwuY29tPgorLSBMdWNhcyBTdGFjaCA8bC5zdGFjaEBwZW5ndXRyb25peC5kZT4KKy0gUnVzc2VsbCBLaW5nIDxybWtAYXJtLmxpbnV4Lm9yZy51az4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKK2NvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCit0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCit0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCithbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKK1NvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCituZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKK1RIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKi8KKworCisjZGVmaW5lIERFX0ZPUk1BVF9YNFI0RzRCNAkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBERV9GT1JNQVRfQTRSNEc0QjQJCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgREVfRk9STUFUX1gxUjVHNUI1CQkJCQkweDAwMDAwMDAyCisjZGVmaW5lIERFX0ZPUk1BVF9BMVI1RzVCNQkJCQkJMHgwMDAwMDAwMworI2RlZmluZSBERV9GT1JNQVRfUjVHNkI1CQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIERFX0ZPUk1BVF9YOFI4RzhCOAkJCQkJMHgwMDAwMDAwNQorI2RlZmluZSBERV9GT1JNQVRfQThSOEc4QjgJCQkJCTB4MDAwMDAwMDYKKyNkZWZpbmUgREVfRk9STUFUX1lVWTIJCQkJCQkweDAwMDAwMDA3CisjZGVmaW5lIERFX0ZPUk1BVF9VWVZZCQkJCQkJMHgwMDAwMDAwOAorI2RlZmluZSBERV9GT1JNQVRfSU5ERVg4CQkJCQkweDAwMDAwMDA5CisjZGVmaW5lIERFX0ZPUk1BVF9NT05PQ0hST01FCQkJCQkweDAwMDAwMDBhCisjZGVmaW5lIERFX0ZPUk1BVF9ZVjEyCQkJCQkJMHgwMDAwMDAwZgorI2RlZmluZSBERV9GT1JNQVRfQTgJCQkJCQkweDAwMDAwMDEwCisjZGVmaW5lIERFX0ZPUk1BVF9OVjEyCQkJCQkJMHgwMDAwMDAxMQorI2RlZmluZSBERV9GT1JNQVRfTlYxNgkJCQkJCTB4MDAwMDAwMTIKKyNkZWZpbmUgREVfRk9STUFUX1JHMTYJCQkJCQkweDAwMDAwMDEzCisjZGVmaW5lIERFX1NXSVpaTEVfQVJHQgkJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgREVfU1dJWlpMRV9SR0JBCQkJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBERV9TV0laWkxFX0FCR1IJCQkJCQkweDAwMDAwMDAyCisjZGVmaW5lIERFX1NXSVpaTEVfQkdSQQkJCQkJCTB4MDAwMDAwMDMKKyNkZWZpbmUgREVfQkxFTkRNT0RFX1pFUk8JCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgREVfQkxFTkRNT0RFX09ORQkJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBERV9CTEVORE1PREVfTk9STUFMCQkJCQkweDAwMDAwMDAyCisjZGVmaW5lIERFX0JMRU5ETU9ERV9JTlZFUlNFRAkJCQkJMHgwMDAwMDAwMworI2RlZmluZSBERV9CTEVORE1PREVfQ09MT1IJCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgREVfQkxFTkRNT0RFX0NPTE9SX0lOVkVSU0VECQkJCTB4MDAwMDAwMDUKKyNkZWZpbmUgREVfQkxFTkRNT0RFX1NBVFVSQVRFRF9BTFBIQQkJCQkweDAwMDAwMDA2CisjZGVmaW5lIERFX0JMRU5ETU9ERV9TQVRVUkFURURfREVTVF9BTFBIQQkJCTB4MDAwMDAwMDcKKyNkZWZpbmUgREVfQ09NUE9ORU5UX0JMVUUJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgREVfQ09NUE9ORU5UX0dSRUVOCQkJCQkweDAwMDAwMDAxCisjZGVmaW5lIERFX0NPTVBPTkVOVF9SRUQJCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgREVfQ09NUE9ORU5UX0FMUEhBCQkJCQkweDAwMDAwMDAzCisjZGVmaW5lIERFX1JPVF9NT0RFX1JPVDAJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgREVfUk9UX01PREVfRkxJUF9YCQkJCQkweDAwMDAwMDAxCisjZGVmaW5lIERFX1JPVF9NT0RFX0ZMSVBfWQkJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBERV9ST1RfTU9ERV9ST1Q5MAkJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBERV9ST1RfTU9ERV9ST1QxODAJCQkJCTB4MDAwMDAwMDUKKyNkZWZpbmUgREVfUk9UX01PREVfUk9UMjcwCQkJCQkweDAwMDAwMDA2CisjZGVmaW5lIERFX01JUlJPUl9NT0RFX05PTkUJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgREVfTUlSUk9SX01PREVfTUlSUk9SX1gJCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgREVfTUlSUk9SX01PREVfTUlSUk9SX1kJCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgREVfTUlSUk9SX01PREVfTUlSUk9SX1hZCQkJCTB4MDAwMDAwMDMKKyNkZWZpbmUgREVfQ09MT1JfQkxVRV9fTUFTSwkJCQkJMHgwMDAwMDBmZgorI2RlZmluZSBERV9DT0xPUl9CTFVFX19TSElGVAkJCQkJMAorI2RlZmluZSBERV9DT0xPUl9CTFVFKHgpCQkJCQkoKCh4KSA8PCBERV9DT0xPUl9CTFVFX19TSElGVCkgJiBERV9DT0xPUl9CTFVFX19NQVNLKQorI2RlZmluZSBERV9DT0xPUl9HUkVFTl9fTUFTSwkJCQkJMHgwMDAwZmYwMAorI2RlZmluZSBERV9DT0xPUl9HUkVFTl9fU0hJRlQJCQkJCTgKKyNkZWZpbmUgREVfQ09MT1JfR1JFRU4oeCkJCQkJCSgoKHgpIDw8IERFX0NPTE9SX0dSRUVOX19TSElGVCkgJiBERV9DT0xPUl9HUkVFTl9fTUFTSykKKyNkZWZpbmUgREVfQ09MT1JfUkVEX19NQVNLCQkJCQkweDAwZmYwMDAwCisjZGVmaW5lIERFX0NPTE9SX1JFRF9fU0hJRlQJCQkJCTE2CisjZGVmaW5lIERFX0NPTE9SX1JFRCh4KQkJCQkJCSgoKHgpIDw8IERFX0NPTE9SX1JFRF9fU0hJRlQpICYgREVfQ09MT1JfUkVEX19NQVNLKQorI2RlZmluZSBERV9DT0xPUl9BTFBIQV9fTUFTSwkJCQkJMHhmZjAwMDAwMAorI2RlZmluZSBERV9DT0xPUl9BTFBIQV9fU0hJRlQJCQkJCTI0CisjZGVmaW5lIERFX0NPTE9SX0FMUEhBKHgpCQkJCQkoKCh4KSA8PCBERV9DT0xPUl9BTFBIQV9fU0hJRlQpICYgREVfQ09MT1JfQUxQSEFfX01BU0spCisjZGVmaW5lIFZJVlNfREUJCQkJCQkJMHgwMDAwMDAwMAorCisjZGVmaW5lIFZJVlNfREVfU1JDX0FERFJFU1MJCQkJCTB4MDAwMDEyMDAKKworI2RlZmluZSBWSVZTX0RFX1NSQ19TVFJJREUJCQkJCTB4MDAwMDEyMDQKKyNkZWZpbmUgVklWU19ERV9TUkNfU1RSSURFX1NUUklERV9fTUFTSwkJCQkweDAwMDNmZmZmCisjZGVmaW5lIFZJVlNfREVfU1JDX1NUUklERV9TVFJJREVfX1NISUZUCQkJMAorI2RlZmluZSBWSVZTX0RFX1NSQ19TVFJJREVfU1RSSURFKHgpCQkJCSgoKHgpIDw8IFZJVlNfREVfU1JDX1NUUklERV9TVFJJREVfX1NISUZUKSAmIFZJVlNfREVfU1JDX1NUUklERV9TVFJJREVfX01BU0spCisKKyNkZWZpbmUgVklWU19ERV9TUkNfUk9UQVRJT05fQ09ORklHCQkJCTB4MDAwMDEyMDgKKyNkZWZpbmUgVklWU19ERV9TUkNfUk9UQVRJT05fQ09ORklHX1dJRFRIX19NQVNLCQkJMHgwMDAwZmZmZgorI2RlZmluZSBWSVZTX0RFX1NSQ19ST1RBVElPTl9DT05GSUdfV0lEVEhfX1NISUZUCQkwCisjZGVmaW5lIFZJVlNfREVfU1JDX1JPVEFUSU9OX0NPTkZJR19XSURUSCh4KQkJCSgoKHgpIDw8IFZJVlNfREVfU1JDX1JPVEFUSU9OX0NPTkZJR19XSURUSF9fU0hJRlQpICYgVklWU19ERV9TUkNfUk9UQVRJT05fQ09ORklHX1dJRFRIX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX1NSQ19ST1RBVElPTl9DT05GSUdfUk9UQVRJT05fX01BU0sJCTB4MDAwMTAwMDAKKyNkZWZpbmUgVklWU19ERV9TUkNfUk9UQVRJT05fQ09ORklHX1JPVEFUSU9OX19TSElGVAkJMTYKKyNkZWZpbmUgVklWU19ERV9TUkNfUk9UQVRJT05fQ09ORklHX1JPVEFUSU9OX0RJU0FCTEUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9TUkNfUk9UQVRJT05fQ09ORklHX1JPVEFUSU9OX0VOQUJMRQkJMHgwMDAxMDAwMAorCisjZGVmaW5lIFZJVlNfREVfU1JDX0NPTkZJRwkJCQkJMHgwMDAwMTIwYworI2RlZmluZSBWSVZTX0RFX1NSQ19DT05GSUdfUEUxMF9TT1VSQ0VfRk9STUFUX19NQVNLCQkweDAwMDAwMDBmCisjZGVmaW5lIFZJVlNfREVfU1JDX0NPTkZJR19QRTEwX1NPVVJDRV9GT1JNQVRfX1NISUZUCQkwCisjZGVmaW5lIFZJVlNfREVfU1JDX0NPTkZJR19QRTEwX1NPVVJDRV9GT1JNQVQoeCkJCSgoKHgpIDw8IFZJVlNfREVfU1JDX0NPTkZJR19QRTEwX1NPVVJDRV9GT1JNQVRfX1NISUZUKSAmIFZJVlNfREVfU1JDX0NPTkZJR19QRTEwX1NPVVJDRV9GT1JNQVRfX01BU0spCisjZGVmaW5lIFZJVlNfREVfU1JDX0NPTkZJR19UUkFOU1BBUkVOQ1lfX01BU0sJCQkweDAwMDAwMDMwCisjZGVmaW5lIFZJVlNfREVfU1JDX0NPTkZJR19UUkFOU1BBUkVOQ1lfX1NISUZUCQkJNAorI2RlZmluZSBWSVZTX0RFX1NSQ19DT05GSUdfVFJBTlNQQVJFTkNZKHgpCQkJKCgoeCkgPDwgVklWU19ERV9TUkNfQ09ORklHX1RSQU5TUEFSRU5DWV9fU0hJRlQpICYgVklWU19ERV9TUkNfQ09ORklHX1RSQU5TUEFSRU5DWV9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9TUkNfQ09ORklHX1NSQ19SRUxBVElWRV9fTUFTSwkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgVklWU19ERV9TUkNfQ09ORklHX1NSQ19SRUxBVElWRV9fU0hJRlQJCQk2CisjZGVmaW5lIFZJVlNfREVfU1JDX0NPTkZJR19TUkNfUkVMQVRJVkVfQUJTT0xVVEUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9TUkNfQ09ORklHX1NSQ19SRUxBVElWRV9SRUxBVElWRQkJMHgwMDAwMDA0MAorI2RlZmluZSBWSVZTX0RFX1NSQ19DT05GSUdfVElMRURfX01BU0sJCQkJMHgwMDAwMDA4MAorI2RlZmluZSBWSVZTX0RFX1NSQ19DT05GSUdfVElMRURfX1NISUZUCQkJCTcKKyNkZWZpbmUgVklWU19ERV9TUkNfQ09ORklHX1RJTEVEX0RJU0FCTEUJCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfU1JDX0NPTkZJR19USUxFRF9FTkFCTEUJCQkJMHgwMDAwMDA4MAorI2RlZmluZSBWSVZTX0RFX1NSQ19DT05GSUdfTE9DQVRJT05fX01BU0sJCQkweDAwMDAwMTAwCisjZGVmaW5lIFZJVlNfREVfU1JDX0NPTkZJR19MT0NBVElPTl9fU0hJRlQJCQk4CisjZGVmaW5lIFZJVlNfREVfU1JDX0NPTkZJR19MT0NBVElPTl9NRU1PUlkJCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfU1JDX0NPTkZJR19MT0NBVElPTl9TVFJFQU0JCQkweDAwMDAwMTAwCisjZGVmaW5lIFZJVlNfREVfU1JDX0NPTkZJR19QQUNLX19NQVNLCQkJCTB4MDAwMDMwMDAKKyNkZWZpbmUgVklWU19ERV9TUkNfQ09ORklHX1BBQ0tfX1NISUZUCQkJCTEyCisjZGVmaW5lIFZJVlNfREVfU1JDX0NPTkZJR19QQUNLX1BBQ0tFRDgJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX1NSQ19DT05GSUdfUEFDS19QQUNLRUQxNgkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgVklWU19ERV9TUkNfQ09ORklHX1BBQ0tfUEFDS0VEMzIJCQkweDAwMDAyMDAwCisjZGVmaW5lIFZJVlNfREVfU1JDX0NPTkZJR19QQUNLX1VOUEFDS0VECQkJMHgwMDAwMzAwMAorI2RlZmluZSBWSVZTX0RFX1NSQ19DT05GSUdfTU9OT19UUkFOU1BBUkVOQ1lfX01BU0sJCTB4MDAwMDgwMDAKKyNkZWZpbmUgVklWU19ERV9TUkNfQ09ORklHX01PTk9fVFJBTlNQQVJFTkNZX19TSElGVAkJMTUKKyNkZWZpbmUgVklWU19ERV9TUkNfQ09ORklHX01PTk9fVFJBTlNQQVJFTkNZX0JBQ0tHUk9VTkQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9TUkNfQ09ORklHX01PTk9fVFJBTlNQQVJFTkNZX0ZPUkVHUk9VTkQJCTB4MDAwMDgwMDAKKyNkZWZpbmUgVklWU19ERV9TUkNfQ09ORklHX1VOSzE2CQkJCTB4MDAwMTAwMDAKKyNkZWZpbmUgVklWU19ERV9TUkNfQ09ORklHX1NXSVpaTEVfX01BU0sJCQkweDAwMzAwMDAwCisjZGVmaW5lIFZJVlNfREVfU1JDX0NPTkZJR19TV0laWkxFX19TSElGVAkJCTIwCisjZGVmaW5lIFZJVlNfREVfU1JDX0NPTkZJR19TV0laWkxFKHgpCQkJCSgoKHgpIDw8IFZJVlNfREVfU1JDX0NPTkZJR19TV0laWkxFX19TSElGVCkgJiBWSVZTX0RFX1NSQ19DT05GSUdfU1dJWlpMRV9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9TUkNfQ09ORklHX1NPVVJDRV9GT1JNQVRfX01BU0sJCQkweDFmMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfU1JDX0NPTkZJR19TT1VSQ0VfRk9STUFUX19TSElGVAkJCTI0CisjZGVmaW5lIFZJVlNfREVfU1JDX0NPTkZJR19TT1VSQ0VfRk9STUFUKHgpCQkJKCgoeCkgPDwgVklWU19ERV9TUkNfQ09ORklHX1NPVVJDRV9GT1JNQVRfX1NISUZUKSAmIFZJVlNfREVfU1JDX0NPTkZJR19TT1VSQ0VfRk9STUFUX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX1NSQ19DT05GSUdfRElTQUJMRTQyMF9MMl9DQUNIRQkJCTB4MjAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9TUkNfQ09ORklHX0VORElBTl9DT05UUk9MX19NQVNLCQkJMHhjMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX1NSQ19DT05GSUdfRU5ESUFOX0NPTlRST0xfX1NISUZUCQkzMAorI2RlZmluZSBWSVZTX0RFX1NSQ19DT05GSUdfRU5ESUFOX0NPTlRST0woeCkJCQkoKCh4KSA8PCBWSVZTX0RFX1NSQ19DT05GSUdfRU5ESUFOX0NPTlRST0xfX1NISUZUKSAmIFZJVlNfREVfU1JDX0NPTkZJR19FTkRJQU5fQ09OVFJPTF9fTUFTSykKKworI2RlZmluZSBWSVZTX0RFX1NSQ19PUklHSU4JCQkJCTB4MDAwMDEyMTAKKyNkZWZpbmUgVklWU19ERV9TUkNfT1JJR0lOX1hfX01BU0sJCQkJMHgwMDAwZmZmZgorI2RlZmluZSBWSVZTX0RFX1NSQ19PUklHSU5fWF9fU0hJRlQJCQkJMAorI2RlZmluZSBWSVZTX0RFX1NSQ19PUklHSU5fWCh4KQkJCQkJKCgoeCkgPDwgVklWU19ERV9TUkNfT1JJR0lOX1hfX1NISUZUKSAmIFZJVlNfREVfU1JDX09SSUdJTl9YX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX1NSQ19PUklHSU5fWV9fTUFTSwkJCQkweGZmZmYwMDAwCisjZGVmaW5lIFZJVlNfREVfU1JDX09SSUdJTl9ZX19TSElGVAkJCQkxNgorI2RlZmluZSBWSVZTX0RFX1NSQ19PUklHSU5fWSh4KQkJCQkJKCgoeCkgPDwgVklWU19ERV9TUkNfT1JJR0lOX1lfX1NISUZUKSAmIFZJVlNfREVfU1JDX09SSUdJTl9ZX19NQVNLKQorCisjZGVmaW5lIFZJVlNfREVfU1JDX1NJWkUJCQkJCTB4MDAwMDEyMTQKKyNkZWZpbmUgVklWU19ERV9TUkNfU0laRV9YX19NQVNLCQkJCTB4MDAwMGZmZmYKKyNkZWZpbmUgVklWU19ERV9TUkNfU0laRV9YX19TSElGVAkJCQkwCisjZGVmaW5lIFZJVlNfREVfU1JDX1NJWkVfWCh4KQkJCQkJKCgoeCkgPDwgVklWU19ERV9TUkNfU0laRV9YX19TSElGVCkgJiBWSVZTX0RFX1NSQ19TSVpFX1hfX01BU0spCisjZGVmaW5lIFZJVlNfREVfU1JDX1NJWkVfWV9fTUFTSwkJCQkweGZmZmYwMDAwCisjZGVmaW5lIFZJVlNfREVfU1JDX1NJWkVfWV9fU0hJRlQJCQkJMTYKKyNkZWZpbmUgVklWU19ERV9TUkNfU0laRV9ZKHgpCQkJCQkoKCh4KSA8PCBWSVZTX0RFX1NSQ19TSVpFX1lfX1NISUZUKSAmIFZJVlNfREVfU1JDX1NJWkVfWV9fTUFTSykKKworI2RlZmluZSBWSVZTX0RFX1NSQ19DT0xPUl9CRwkJCQkJMHgwMDAwMTIxOAorCisjZGVmaW5lIFZJVlNfREVfU1JDX0NPTE9SX0ZHCQkJCQkweDAwMDAxMjFjCisKKyNkZWZpbmUgVklWU19ERV9TVFJFVENIX0ZBQ1RPUl9MT1cJCQkJMHgwMDAwMTIyMAorI2RlZmluZSBWSVZTX0RFX1NUUkVUQ0hfRkFDVE9SX0xPV19YX19NQVNLCQkJMHg3ZmZmZmZmZgorI2RlZmluZSBWSVZTX0RFX1NUUkVUQ0hfRkFDVE9SX0xPV19YX19TSElGVAkJCTAKKyNkZWZpbmUgVklWU19ERV9TVFJFVENIX0ZBQ1RPUl9MT1dfWCh4KQkJCQkoKCh4KSA8PCBWSVZTX0RFX1NUUkVUQ0hfRkFDVE9SX0xPV19YX19TSElGVCkgJiBWSVZTX0RFX1NUUkVUQ0hfRkFDVE9SX0xPV19YX19NQVNLKQorCisjZGVmaW5lIFZJVlNfREVfU1RSRVRDSF9GQUNUT1JfSElHSAkJCQkweDAwMDAxMjI0CisjZGVmaW5lIFZJVlNfREVfU1RSRVRDSF9GQUNUT1JfSElHSF9ZX19NQVNLCQkJMHg3ZmZmZmZmZgorI2RlZmluZSBWSVZTX0RFX1NUUkVUQ0hfRkFDVE9SX0hJR0hfWV9fU0hJRlQJCQkwCisjZGVmaW5lIFZJVlNfREVfU1RSRVRDSF9GQUNUT1JfSElHSF9ZKHgpCQkJKCgoeCkgPDwgVklWU19ERV9TVFJFVENIX0ZBQ1RPUl9ISUdIX1lfX1NISUZUKSAmIFZJVlNfREVfU1RSRVRDSF9GQUNUT1JfSElHSF9ZX19NQVNLKQorCisjZGVmaW5lIFZJVlNfREVfREVTVF9BRERSRVNTCQkJCQkweDAwMDAxMjI4CisKKyNkZWZpbmUgVklWU19ERV9ERVNUX1NUUklERQkJCQkJMHgwMDAwMTIyYworI2RlZmluZSBWSVZTX0RFX0RFU1RfU1RSSURFX1NUUklERV9fTUFTSwkJCTB4MDAwM2ZmZmYKKyNkZWZpbmUgVklWU19ERV9ERVNUX1NUUklERV9TVFJJREVfX1NISUZUCQkJMAorI2RlZmluZSBWSVZTX0RFX0RFU1RfU1RSSURFX1NUUklERSh4KQkJCQkoKCh4KSA8PCBWSVZTX0RFX0RFU1RfU1RSSURFX1NUUklERV9fU0hJRlQpICYgVklWU19ERV9ERVNUX1NUUklERV9TVFJJREVfX01BU0spCisKKyNkZWZpbmUgVklWU19ERV9ERVNUX1JPVEFUSU9OX0NPTkZJRwkJCQkweDAwMDAxMjMwCisjZGVmaW5lIFZJVlNfREVfREVTVF9ST1RBVElPTl9DT05GSUdfV0lEVEhfX01BU0sJCTB4MDAwMGZmZmYKKyNkZWZpbmUgVklWU19ERV9ERVNUX1JPVEFUSU9OX0NPTkZJR19XSURUSF9fU0hJRlQJCTAKKyNkZWZpbmUgVklWU19ERV9ERVNUX1JPVEFUSU9OX0NPTkZJR19XSURUSCh4KQkJCSgoKHgpIDw8IFZJVlNfREVfREVTVF9ST1RBVElPTl9DT05GSUdfV0lEVEhfX1NISUZUKSAmIFZJVlNfREVfREVTVF9ST1RBVElPTl9DT05GSUdfV0lEVEhfX01BU0spCisjZGVmaW5lIFZJVlNfREVfREVTVF9ST1RBVElPTl9DT05GSUdfUk9UQVRJT05fX01BU0sJCTB4MDAwMTAwMDAKKyNkZWZpbmUgVklWU19ERV9ERVNUX1JPVEFUSU9OX0NPTkZJR19ST1RBVElPTl9fU0hJRlQJCTE2CisjZGVmaW5lIFZJVlNfREVfREVTVF9ST1RBVElPTl9DT05GSUdfUk9UQVRJT05fRElTQUJMRQkJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0RFU1RfUk9UQVRJT05fQ09ORklHX1JPVEFUSU9OX0VOQUJMRQkJMHgwMDAxMDAwMAorCisjZGVmaW5lIFZJVlNfREVfREVTVF9DT05GSUcJCQkJCTB4MDAwMDEyMzQKKyNkZWZpbmUgVklWU19ERV9ERVNUX0NPTkZJR19GT1JNQVRfX01BU0sJCQkweDAwMDAwMDFmCisjZGVmaW5lIFZJVlNfREVfREVTVF9DT05GSUdfRk9STUFUX19TSElGVAkJCTAKKyNkZWZpbmUgVklWU19ERV9ERVNUX0NPTkZJR19GT1JNQVQoeCkJCQkJKCgoeCkgPDwgVklWU19ERV9ERVNUX0NPTkZJR19GT1JNQVRfX1NISUZUKSAmIFZJVlNfREVfREVTVF9DT05GSUdfRk9STUFUX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0RFU1RfQ09ORklHX1RJTEVEX19NQVNLCQkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgVklWU19ERV9ERVNUX0NPTkZJR19USUxFRF9fU0hJRlQJCQk4CisjZGVmaW5lIFZJVlNfREVfREVTVF9DT05GSUdfVElMRURfRElTQUJMRQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9ERVNUX0NPTkZJR19USUxFRF9FTkFCTEUJCQkweDAwMDAwMTAwCisjZGVmaW5lIFZJVlNfREVfREVTVF9DT05GSUdfQ09NTUFORF9fTUFTSwkJCTB4MDAwMGYwMDAKKyNkZWZpbmUgVklWU19ERV9ERVNUX0NPTkZJR19DT01NQU5EX19TSElGVAkJCTEyCisjZGVmaW5lIFZJVlNfREVfREVTVF9DT05GSUdfQ09NTUFORF9DTEVBUgkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9ERVNUX0NPTkZJR19DT01NQU5EX0xJTkUJCQkweDAwMDAxMDAwCisjZGVmaW5lIFZJVlNfREVfREVTVF9DT05GSUdfQ09NTUFORF9CSVRfQkxUCQkJMHgwMDAwMjAwMAorI2RlZmluZSBWSVZTX0RFX0RFU1RfQ09ORklHX0NPTU1BTkRfQklUX0JMVF9SRVZFUlNFRAkJMHgwMDAwMzAwMAorI2RlZmluZSBWSVZTX0RFX0RFU1RfQ09ORklHX0NPTU1BTkRfU1RSRVRDSF9CTFQJCQkweDAwMDA0MDAwCisjZGVmaW5lIFZJVlNfREVfREVTVF9DT05GSUdfQ09NTUFORF9IT1JfRklMVEVSX0JMVAkJMHgwMDAwNTAwMAorI2RlZmluZSBWSVZTX0RFX0RFU1RfQ09ORklHX0NPTU1BTkRfVkVSX0ZJTFRFUl9CTFQJCTB4MDAwMDYwMDAKKyNkZWZpbmUgVklWU19ERV9ERVNUX0NPTkZJR19DT01NQU5EX09ORV9QQVNTX0ZJTFRFUl9CTFQJCTB4MDAwMDcwMDAKKyNkZWZpbmUgVklWU19ERV9ERVNUX0NPTkZJR19DT01NQU5EX01VTFRJX1NPVVJDRV9CTFQJCTB4MDAwMDgwMDAKKyNkZWZpbmUgVklWU19ERV9ERVNUX0NPTkZJR19TV0laWkxFX19NQVNLCQkJMHgwMDAzMDAwMAorI2RlZmluZSBWSVZTX0RFX0RFU1RfQ09ORklHX1NXSVpaTEVfX1NISUZUCQkJMTYKKyNkZWZpbmUgVklWU19ERV9ERVNUX0NPTkZJR19TV0laWkxFKHgpCQkJCSgoKHgpIDw8IFZJVlNfREVfREVTVF9DT05GSUdfU1dJWlpMRV9fU0hJRlQpICYgVklWU19ERV9ERVNUX0NPTkZJR19TV0laWkxFX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0RFU1RfQ09ORklHX0VORElBTl9DT05UUk9MX19NQVNLCQkweDAwMzAwMDAwCisjZGVmaW5lIFZJVlNfREVfREVTVF9DT05GSUdfRU5ESUFOX0NPTlRST0xfX1NISUZUCQkyMAorI2RlZmluZSBWSVZTX0RFX0RFU1RfQ09ORklHX0VORElBTl9DT05UUk9MKHgpCQkJKCgoeCkgPDwgVklWU19ERV9ERVNUX0NPTkZJR19FTkRJQU5fQ09OVFJPTF9fU0hJRlQpICYgVklWU19ERV9ERVNUX0NPTkZJR19FTkRJQU5fQ09OVFJPTF9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9ERVNUX0NPTkZJR19HRElfU1RSRV9fTUFTSwkJCTB4MDEwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9ERVNUX0NPTkZJR19HRElfU1RSRV9fU0hJRlQJCQkyNAorI2RlZmluZSBWSVZTX0RFX0RFU1RfQ09ORklHX0dESV9TVFJFX0RJU0FCTEUJCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfREVTVF9DT05GSUdfR0RJX1NUUkVfRU5BQkxFCQkJMHgwMTAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0RFU1RfQ09ORklHX0lOVEVSX1RJTEVfUEVSX0ZJWF9fTUFTSwkJMHgwMjAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0RFU1RfQ09ORklHX0lOVEVSX1RJTEVfUEVSX0ZJWF9fU0hJRlQJCTI1CisjZGVmaW5lIFZJVlNfREVfREVTVF9DT05GSUdfSU5URVJfVElMRV9QRVJfRklYX0RJU0FCTEVECQkweDAyMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfREVTVF9DT05GSUdfSU5URVJfVElMRV9QRVJfRklYX0VOQUJMRUQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9ERVNUX0NPTkZJR19NSU5PUl9USUxFRF9fTUFTSwkJCTB4MDQwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9ERVNUX0NPTkZJR19NSU5PUl9USUxFRF9fU0hJRlQJCQkyNgorI2RlZmluZSBWSVZTX0RFX0RFU1RfQ09ORklHX01JTk9SX1RJTEVEX0RJU0FCTEUJCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfREVTVF9DT05GSUdfTUlOT1JfVElMRURfRU5BQkxFCQkJMHgwNDAwMDAwMAorCisjZGVmaW5lIFZJVlNfREVfUEFUVEVSTl9BRERSRVNTCQkJCQkweDAwMDAxMjM4CisKKyNkZWZpbmUgVklWU19ERV9QQVRURVJOX0NPTkZJRwkJCQkJMHgwMDAwMTIzYworI2RlZmluZSBWSVZTX0RFX1BBVFRFUk5fQ09ORklHX0ZPUk1BVF9fTUFTSwkJCTB4MDAwMDAwMGYKKyNkZWZpbmUgVklWU19ERV9QQVRURVJOX0NPTkZJR19GT1JNQVRfX1NISUZUCQkJMAorI2RlZmluZSBWSVZTX0RFX1BBVFRFUk5fQ09ORklHX0ZPUk1BVCh4KQkJCSgoKHgpIDw8IFZJVlNfREVfUEFUVEVSTl9DT05GSUdfRk9STUFUX19TSElGVCkgJiBWSVZTX0RFX1BBVFRFUk5fQ09ORklHX0ZPUk1BVF9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9QQVRURVJOX0NPTkZJR19UWVBFX19NQVNLCQkJMHgwMDAwMDAxMAorI2RlZmluZSBWSVZTX0RFX1BBVFRFUk5fQ09ORklHX1RZUEVfX1NISUZUCQkJNAorI2RlZmluZSBWSVZTX0RFX1BBVFRFUk5fQ09ORklHX1RZUEVfU09MSURfQ09MT1IJCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfUEFUVEVSTl9DT05GSUdfVFlQRV9QQVRURVJOCQkJMHgwMDAwMDAxMAorI2RlZmluZSBWSVZTX0RFX1BBVFRFUk5fQ09ORklHX0NPTE9SX0NPTlZFUlRfX01BU0sJCTB4MDAwMDAwMjAKKyNkZWZpbmUgVklWU19ERV9QQVRURVJOX0NPTkZJR19DT0xPUl9DT05WRVJUX19TSElGVAkJNQorI2RlZmluZSBWSVZTX0RFX1BBVFRFUk5fQ09ORklHX0NPTE9SX0NPTlZFUlRfRElTQUJMRQkJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX1BBVFRFUk5fQ09ORklHX0NPTE9SX0NPTlZFUlRfRU5BQkxFCQkweDAwMDAwMDIwCisjZGVmaW5lIFZJVlNfREVfUEFUVEVSTl9DT05GSUdfSU5JVF9UUklHR0VSX19NQVNLCQkweDAwMDAwMGMwCisjZGVmaW5lIFZJVlNfREVfUEFUVEVSTl9DT05GSUdfSU5JVF9UUklHR0VSX19TSElGVAkJNgorI2RlZmluZSBWSVZTX0RFX1BBVFRFUk5fQ09ORklHX0lOSVRfVFJJR0dFUih4KQkJCSgoKHgpIDw8IFZJVlNfREVfUEFUVEVSTl9DT05GSUdfSU5JVF9UUklHR0VSX19TSElGVCkgJiBWSVZTX0RFX1BBVFRFUk5fQ09ORklHX0lOSVRfVFJJR0dFUl9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9QQVRURVJOX0NPTkZJR19PUklHSU5fWF9fTUFTSwkJCTB4MDAwNzAwMDAKKyNkZWZpbmUgVklWU19ERV9QQVRURVJOX0NPTkZJR19PUklHSU5fWF9fU0hJRlQJCQkxNgorI2RlZmluZSBWSVZTX0RFX1BBVFRFUk5fQ09ORklHX09SSUdJTl9YKHgpCQkJKCgoeCkgPDwgVklWU19ERV9QQVRURVJOX0NPTkZJR19PUklHSU5fWF9fU0hJRlQpICYgVklWU19ERV9QQVRURVJOX0NPTkZJR19PUklHSU5fWF9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9QQVRURVJOX0NPTkZJR19PUklHSU5fWV9fTUFTSwkJCTB4MDA3MDAwMDAKKyNkZWZpbmUgVklWU19ERV9QQVRURVJOX0NPTkZJR19PUklHSU5fWV9fU0hJRlQJCQkyMAorI2RlZmluZSBWSVZTX0RFX1BBVFRFUk5fQ09ORklHX09SSUdJTl9ZKHgpCQkJKCgoeCkgPDwgVklWU19ERV9QQVRURVJOX0NPTkZJR19PUklHSU5fWV9fU0hJRlQpICYgVklWU19ERV9QQVRURVJOX0NPTkZJR19PUklHSU5fWV9fTUFTSykKKworI2RlZmluZSBWSVZTX0RFX1BBVFRFUk5fTE9XCQkJCQkweDAwMDAxMjQwCisKKyNkZWZpbmUgVklWU19ERV9QQVRURVJOX0hJR0gJCQkJCTB4MDAwMDEyNDQKKworI2RlZmluZSBWSVZTX0RFX1BBVFRFUk5fTUFTS19MT1cJCQkJMHgwMDAwMTI0OAorCisjZGVmaW5lIFZJVlNfREVfUEFUVEVSTl9NQVNLX0hJR0gJCQkJMHgwMDAwMTI0YworCisjZGVmaW5lIFZJVlNfREVfUEFUVEVSTl9CR19DT0xPUgkJCQkweDAwMDAxMjUwCisKKyNkZWZpbmUgVklWU19ERV9QQVRURVJOX0ZHX0NPTE9SCQkJCTB4MDAwMDEyNTQKKworI2RlZmluZSBWSVZTX0RFX1JPUAkJCQkJCTB4MDAwMDEyNWMKKyNkZWZpbmUgVklWU19ERV9ST1BfUk9QX0ZHX19NQVNLCQkJCTB4MDAwMDAwZmYKKyNkZWZpbmUgVklWU19ERV9ST1BfUk9QX0ZHX19TSElGVAkJCQkwCisjZGVmaW5lIFZJVlNfREVfUk9QX1JPUF9GRyh4KQkJCQkJKCgoeCkgPDwgVklWU19ERV9ST1BfUk9QX0ZHX19TSElGVCkgJiBWSVZTX0RFX1JPUF9ST1BfRkdfX01BU0spCisjZGVmaW5lIFZJVlNfREVfUk9QX1JPUF9CR19fTUFTSwkJCQkweDAwMDBmZjAwCisjZGVmaW5lIFZJVlNfREVfUk9QX1JPUF9CR19fU0hJRlQJCQkJOAorI2RlZmluZSBWSVZTX0RFX1JPUF9ST1BfQkcoeCkJCQkJCSgoKHgpIDw8IFZJVlNfREVfUk9QX1JPUF9CR19fU0hJRlQpICYgVklWU19ERV9ST1BfUk9QX0JHX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX1JPUF9UWVBFX19NQVNLCQkJCQkweDAwMzAwMDAwCisjZGVmaW5lIFZJVlNfREVfUk9QX1RZUEVfX1NISUZUCQkJCQkyMAorI2RlZmluZSBWSVZTX0RFX1JPUF9UWVBFX1JPUDJfUEFUVEVSTgkJCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfUk9QX1RZUEVfUk9QMl9TT1VSQ0UJCQkJMHgwMDEwMDAwMAorI2RlZmluZSBWSVZTX0RFX1JPUF9UWVBFX1JPUDMJCQkJCTB4MDAyMDAwMDAKKyNkZWZpbmUgVklWU19ERV9ST1BfVFlQRV9ST1A0CQkJCQkweDAwMzAwMDAwCisKKyNkZWZpbmUgVklWU19ERV9DTElQX1RPUF9MRUZUCQkJCQkweDAwMDAxMjYwCisjZGVmaW5lIFZJVlNfREVfQ0xJUF9UT1BfTEVGVF9YX19NQVNLCQkJCTB4MDAwMDdmZmYKKyNkZWZpbmUgVklWU19ERV9DTElQX1RPUF9MRUZUX1hfX1NISUZUCQkJCTAKKyNkZWZpbmUgVklWU19ERV9DTElQX1RPUF9MRUZUX1goeCkJCQkJKCgoeCkgPDwgVklWU19ERV9DTElQX1RPUF9MRUZUX1hfX1NISUZUKSAmIFZJVlNfREVfQ0xJUF9UT1BfTEVGVF9YX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0NMSVBfVE9QX0xFRlRfWV9fTUFTSwkJCQkweDdmZmYwMDAwCisjZGVmaW5lIFZJVlNfREVfQ0xJUF9UT1BfTEVGVF9ZX19TSElGVAkJCQkxNgorI2RlZmluZSBWSVZTX0RFX0NMSVBfVE9QX0xFRlRfWSh4KQkJCQkoKCh4KSA8PCBWSVZTX0RFX0NMSVBfVE9QX0xFRlRfWV9fU0hJRlQpICYgVklWU19ERV9DTElQX1RPUF9MRUZUX1lfX01BU0spCisKKyNkZWZpbmUgVklWU19ERV9DTElQX0JPVFRPTV9SSUdIVAkJCQkweDAwMDAxMjY0CisjZGVmaW5lIFZJVlNfREVfQ0xJUF9CT1RUT01fUklHSFRfWF9fTUFTSwkJCTB4MDAwMDdmZmYKKyNkZWZpbmUgVklWU19ERV9DTElQX0JPVFRPTV9SSUdIVF9YX19TSElGVAkJCTAKKyNkZWZpbmUgVklWU19ERV9DTElQX0JPVFRPTV9SSUdIVF9YKHgpCQkJCSgoKHgpIDw8IFZJVlNfREVfQ0xJUF9CT1RUT01fUklHSFRfWF9fU0hJRlQpICYgVklWU19ERV9DTElQX0JPVFRPTV9SSUdIVF9YX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0NMSVBfQk9UVE9NX1JJR0hUX1lfX01BU0sJCQkweDdmZmYwMDAwCisjZGVmaW5lIFZJVlNfREVfQ0xJUF9CT1RUT01fUklHSFRfWV9fU0hJRlQJCQkxNgorI2RlZmluZSBWSVZTX0RFX0NMSVBfQk9UVE9NX1JJR0hUX1koeCkJCQkJKCgoeCkgPDwgVklWU19ERV9DTElQX0JPVFRPTV9SSUdIVF9ZX19TSElGVCkgJiBWSVZTX0RFX0NMSVBfQk9UVE9NX1JJR0hUX1lfX01BU0spCisKKyNkZWZpbmUgVklWU19ERV9DTEVBUl9CWVRFX01BU0sJCQkJCTB4MDAwMDEyNjgKKworI2RlZmluZSBWSVZTX0RFX0NPTkZJRwkJCQkJCTB4MDAwMDEyNmMKKyNkZWZpbmUgVklWU19ERV9DT05GSUdfTUlSUk9SX0JMVF9FTkFCTEVfX01BU0sJCQkweDAwMDAwMDAxCisjZGVmaW5lIFZJVlNfREVfQ09ORklHX01JUlJPUl9CTFRfRU5BQkxFX19TSElGVAkJCTAKKyNkZWZpbmUgVklWU19ERV9DT05GSUdfTUlSUk9SX0JMVF9FTkFCTEVfT0ZGCQkJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0NPTkZJR19NSVJST1JfQkxUX0VOQUJMRV9PTgkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgVklWU19ERV9DT05GSUdfTUlSUk9SX0JMVF9NT0RFX19NQVNLCQkJMHgwMDAwMDAzMAorI2RlZmluZSBWSVZTX0RFX0NPTkZJR19NSVJST1JfQkxUX01PREVfX1NISUZUCQkJNAorI2RlZmluZSBWSVZTX0RFX0NPTkZJR19NSVJST1JfQkxUX01PREVfTk9STUFMCQkJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0NPTkZJR19NSVJST1JfQkxUX01PREVfSE1JUlJPUgkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgVklWU19ERV9DT05GSUdfTUlSUk9SX0JMVF9NT0RFX1ZNSVJST1IJCQkweDAwMDAwMDIwCisjZGVmaW5lIFZJVlNfREVfQ09ORklHX01JUlJPUl9CTFRfTU9ERV9GVUxMX01JUlJPUgkJMHgwMDAwMDAzMAorI2RlZmluZSBWSVZTX0RFX0NPTkZJR19TT1VSQ0VfU0VMRUNUX19NQVNLCQkJMHgwMDA3MDAwMAorI2RlZmluZSBWSVZTX0RFX0NPTkZJR19TT1VSQ0VfU0VMRUNUX19TSElGVAkJCTE2CisjZGVmaW5lIFZJVlNfREVfQ09ORklHX1NPVVJDRV9TRUxFQ1QoeCkJCQkJKCgoeCkgPDwgVklWU19ERV9DT05GSUdfU09VUkNFX1NFTEVDVF9fU0hJRlQpICYgVklWU19ERV9DT05GSUdfU09VUkNFX1NFTEVDVF9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9DT05GSUdfREVTVElOQVRJT05fU0VMRUNUX19NQVNLCQkJMHgwMDMwMDAwMAorI2RlZmluZSBWSVZTX0RFX0NPTkZJR19ERVNUSU5BVElPTl9TRUxFQ1RfX1NISUZUCQkyMAorI2RlZmluZSBWSVZTX0RFX0NPTkZJR19ERVNUSU5BVElPTl9TRUxFQ1QoeCkJCQkoKCh4KSA8PCBWSVZTX0RFX0NPTkZJR19ERVNUSU5BVElPTl9TRUxFQ1RfX1NISUZUKSAmIFZJVlNfREVfQ09ORklHX0RFU1RJTkFUSU9OX1NFTEVDVF9fTUFTSykKKworI2RlZmluZSBWSVZTX0RFX0NMRUFSX1BJWEVMX1ZBTFVFX0xPVwkJCQkweDAwMDAxMjcwCisKKyNkZWZpbmUgVklWU19ERV9DTEVBUl9QSVhFTF9WQUxVRV9ISUdICQkJCTB4MDAwMDEyNzQKKworI2RlZmluZSBWSVZTX0RFX1NSQ19PUklHSU5fRlJBQ1RJT04JCQkJMHgwMDAwMTI3OAorI2RlZmluZSBWSVZTX0RFX1NSQ19PUklHSU5fRlJBQ1RJT05fWF9fTUFTSwkJCTB4MDAwMGZmZmYKKyNkZWZpbmUgVklWU19ERV9TUkNfT1JJR0lOX0ZSQUNUSU9OX1hfX1NISUZUCQkJMAorI2RlZmluZSBWSVZTX0RFX1NSQ19PUklHSU5fRlJBQ1RJT05fWCh4KQkJCSgoKHgpIDw8IFZJVlNfREVfU1JDX09SSUdJTl9GUkFDVElPTl9YX19TSElGVCkgJiBWSVZTX0RFX1NSQ19PUklHSU5fRlJBQ1RJT05fWF9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9TUkNfT1JJR0lOX0ZSQUNUSU9OX1lfX01BU0sJCQkweGZmZmYwMDAwCisjZGVmaW5lIFZJVlNfREVfU1JDX09SSUdJTl9GUkFDVElPTl9ZX19TSElGVAkJCTE2CisjZGVmaW5lIFZJVlNfREVfU1JDX09SSUdJTl9GUkFDVElPTl9ZKHgpCQkJKCgoeCkgPDwgVklWU19ERV9TUkNfT1JJR0lOX0ZSQUNUSU9OX1lfX1NISUZUKSAmIFZJVlNfREVfU1JDX09SSUdJTl9GUkFDVElPTl9ZX19NQVNLKQorCisjZGVmaW5lIFZJVlNfREVfQUxQSEFfQ09OVFJPTAkJCQkJMHgwMDAwMTI3YworI2RlZmluZSBWSVZTX0RFX0FMUEhBX0NPTlRST0xfRU5BQkxFX19NQVNLCQkJMHgwMDAwMDAwMQorI2RlZmluZSBWSVZTX0RFX0FMUEhBX0NPTlRST0xfRU5BQkxFX19TSElGVAkJCTAKKyNkZWZpbmUgVklWU19ERV9BTFBIQV9DT05UUk9MX0VOQUJMRV9PRkYJCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQUxQSEFfQ09OVFJPTF9FTkFCTEVfT04JCQkJMHgwMDAwMDAwMQorI2RlZmluZSBWSVZTX0RFX0FMUEhBX0NPTlRST0xfUEUxMF9HTE9CQUxfU1JDX0FMUEhBX19NQVNLCTB4MDBmZjAwMDAKKyNkZWZpbmUgVklWU19ERV9BTFBIQV9DT05UUk9MX1BFMTBfR0xPQkFMX1NSQ19BTFBIQV9fU0hJRlQJMTYKKyNkZWZpbmUgVklWU19ERV9BTFBIQV9DT05UUk9MX1BFMTBfR0xPQkFMX1NSQ19BTFBIQSh4KQkJKCgoeCkgPDwgVklWU19ERV9BTFBIQV9DT05UUk9MX1BFMTBfR0xPQkFMX1NSQ19BTFBIQV9fU0hJRlQpICYgVklWU19ERV9BTFBIQV9DT05UUk9MX1BFMTBfR0xPQkFMX1NSQ19BTFBIQV9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9BTFBIQV9DT05UUk9MX1BFMTBfR0xPQkFMX0RTVF9BTFBIQV9fTUFTSwkweGZmMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQUxQSEFfQ09OVFJPTF9QRTEwX0dMT0JBTF9EU1RfQUxQSEFfX1NISUZUCTI0CisjZGVmaW5lIFZJVlNfREVfQUxQSEFfQ09OVFJPTF9QRTEwX0dMT0JBTF9EU1RfQUxQSEEoeCkJCSgoKHgpIDw8IFZJVlNfREVfQUxQSEFfQ09OVFJPTF9QRTEwX0dMT0JBTF9EU1RfQUxQSEFfX1NISUZUKSAmIFZJVlNfREVfQUxQSEFfQ09OVFJPTF9QRTEwX0dMT0JBTF9EU1RfQUxQSEFfX01BU0spCisKKyNkZWZpbmUgVklWU19ERV9BTFBIQV9NT0RFUwkJCQkJMHgwMDAwMTI4MAorI2RlZmluZSBWSVZTX0RFX0FMUEhBX01PREVTX1NSQ19BTFBIQV9NT0RFX19NQVNLCQkweDAwMDAwMDAxCisjZGVmaW5lIFZJVlNfREVfQUxQSEFfTU9ERVNfU1JDX0FMUEhBX01PREVfX1NISUZUCQkwCisjZGVmaW5lIFZJVlNfREVfQUxQSEFfTU9ERVNfU1JDX0FMUEhBX01PREVfTk9STUFMCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQUxQSEFfTU9ERVNfU1JDX0FMUEhBX01PREVfSU5WRVJTRUQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgVklWU19ERV9BTFBIQV9NT0RFU19EU1RfQUxQSEFfTU9ERV9fTUFTSwkJMHgwMDAwMDAxMAorI2RlZmluZSBWSVZTX0RFX0FMUEhBX01PREVTX0RTVF9BTFBIQV9NT0RFX19TSElGVAkJNAorI2RlZmluZSBWSVZTX0RFX0FMUEhBX01PREVTX0RTVF9BTFBIQV9NT0RFX05PUk1BTAkJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0FMUEhBX01PREVTX0RTVF9BTFBIQV9NT0RFX0lOVkVSU0VECQkweDAwMDAwMDEwCisjZGVmaW5lIFZJVlNfREVfQUxQSEFfTU9ERVNfR0xPQkFMX1NSQ19BTFBIQV9NT0RFX19NQVNLCQkweDAwMDAwMzAwCisjZGVmaW5lIFZJVlNfREVfQUxQSEFfTU9ERVNfR0xPQkFMX1NSQ19BTFBIQV9NT0RFX19TSElGVAk4CisjZGVmaW5lIFZJVlNfREVfQUxQSEFfTU9ERVNfR0xPQkFMX1NSQ19BTFBIQV9NT0RFX05PUk1BTAkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQUxQSEFfTU9ERVNfR0xPQkFMX1NSQ19BTFBIQV9NT0RFX0dMT0JBTAkweDAwMDAwMTAwCisjZGVmaW5lIFZJVlNfREVfQUxQSEFfTU9ERVNfR0xPQkFMX1NSQ19BTFBIQV9NT0RFX1NDQUxFRAkweDAwMDAwMjAwCisjZGVmaW5lIFZJVlNfREVfQUxQSEFfTU9ERVNfR0xPQkFMX0RTVF9BTFBIQV9NT0RFX19NQVNLCQkweDAwMDAzMDAwCisjZGVmaW5lIFZJVlNfREVfQUxQSEFfTU9ERVNfR0xPQkFMX0RTVF9BTFBIQV9NT0RFX19TSElGVAkxMgorI2RlZmluZSBWSVZTX0RFX0FMUEhBX01PREVTX0dMT0JBTF9EU1RfQUxQSEFfTU9ERV9OT1JNQUwJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0FMUEhBX01PREVTX0dMT0JBTF9EU1RfQUxQSEFfTU9ERV9HTE9CQUwJMHgwMDAwMTAwMAorI2RlZmluZSBWSVZTX0RFX0FMUEhBX01PREVTX0dMT0JBTF9EU1RfQUxQSEFfTU9ERV9TQ0FMRUQJMHgwMDAwMjAwMAorI2RlZmluZSBWSVZTX0RFX0FMUEhBX01PREVTX1BFMTBfU1JDX0NPTE9SX01VTFRJUExZX19NQVNLCTB4MDAwMTAwMDAKKyNkZWZpbmUgVklWU19ERV9BTFBIQV9NT0RFU19QRTEwX1NSQ19DT0xPUl9NVUxUSVBMWV9fU0hJRlQJMTYKKyNkZWZpbmUgVklWU19ERV9BTFBIQV9NT0RFU19QRTEwX1NSQ19DT0xPUl9NVUxUSVBMWV9ESVNBQkxFCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9BTFBIQV9NT0RFU19QRTEwX1NSQ19DT0xPUl9NVUxUSVBMWV9FTkFCTEUJMHgwMDAxMDAwMAorI2RlZmluZSBWSVZTX0RFX0FMUEhBX01PREVTX1BFMTBfRFNUX0NPTE9SX01VTFRJUExZX19NQVNLCTB4MDAxMDAwMDAKKyNkZWZpbmUgVklWU19ERV9BTFBIQV9NT0RFU19QRTEwX0RTVF9DT0xPUl9NVUxUSVBMWV9fU0hJRlQJMjAKKyNkZWZpbmUgVklWU19ERV9BTFBIQV9NT0RFU19QRTEwX0RTVF9DT0xPUl9NVUxUSVBMWV9ESVNBQkxFCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9BTFBIQV9NT0RFU19QRTEwX0RTVF9DT0xPUl9NVUxUSVBMWV9FTkFCTEUJMHgwMDEwMDAwMAorI2RlZmluZSBWSVZTX0RFX0FMUEhBX01PREVTX1NSQ19CTEVORElOR19NT0RFX19NQVNLCQkweDA3MDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQUxQSEFfTU9ERVNfU1JDX0JMRU5ESU5HX01PREVfX1NISUZUCQkyNAorI2RlZmluZSBWSVZTX0RFX0FMUEhBX01PREVTX1NSQ19CTEVORElOR19NT0RFKHgpCQkoKCh4KSA8PCBWSVZTX0RFX0FMUEhBX01PREVTX1NSQ19CTEVORElOR19NT0RFX19TSElGVCkgJiBWSVZTX0RFX0FMUEhBX01PREVTX1NSQ19CTEVORElOR19NT0RFX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0FMUEhBX01PREVTX1NSQ19BTFBIQV9GQUNUT1JfX01BU0sJCTB4MDgwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9BTFBIQV9NT0RFU19TUkNfQUxQSEFfRkFDVE9SX19TSElGVAkJMjcKKyNkZWZpbmUgVklWU19ERV9BTFBIQV9NT0RFU19TUkNfQUxQSEFfRkFDVE9SX0RJU0FCTEUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9BTFBIQV9NT0RFU19TUkNfQUxQSEFfRkFDVE9SX0VOQUJMRQkJMHgwODAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0FMUEhBX01PREVTX0RTVF9CTEVORElOR19NT0RFX19NQVNLCQkweDcwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQUxQSEFfTU9ERVNfRFNUX0JMRU5ESU5HX01PREVfX1NISUZUCQkyOAorI2RlZmluZSBWSVZTX0RFX0FMUEhBX01PREVTX0RTVF9CTEVORElOR19NT0RFKHgpCQkoKCh4KSA8PCBWSVZTX0RFX0FMUEhBX01PREVTX0RTVF9CTEVORElOR19NT0RFX19TSElGVCkgJiBWSVZTX0RFX0FMUEhBX01PREVTX0RTVF9CTEVORElOR19NT0RFX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0FMUEhBX01PREVTX0RTVF9BTFBIQV9GQUNUT1JfX01BU0sJCTB4ODAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9BTFBIQV9NT0RFU19EU1RfQUxQSEFfRkFDVE9SX19TSElGVAkJMzEKKyNkZWZpbmUgVklWU19ERV9BTFBIQV9NT0RFU19EU1RfQUxQSEFfRkFDVE9SX0RJU0FCTEUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9BTFBIQV9NT0RFU19EU1RfQUxQSEFfRkFDVE9SX0VOQUJMRQkJMHg4MDAwMDAwMAorCisjZGVmaW5lIFZJVlNfREVfVVBMQU5FX0FERFJFU1MJCQkJCTB4MDAwMDEyODQKKworI2RlZmluZSBWSVZTX0RFX1VQTEFORV9TVFJJREUJCQkJCTB4MDAwMDEyODgKKyNkZWZpbmUgVklWU19ERV9VUExBTkVfU1RSSURFX1NUUklERV9fTUFTSwkJCTB4MDAwM2ZmZmYKKyNkZWZpbmUgVklWU19ERV9VUExBTkVfU1RSSURFX1NUUklERV9fU0hJRlQJCQkwCisjZGVmaW5lIFZJVlNfREVfVVBMQU5FX1NUUklERV9TVFJJREUoeCkJCQkJKCgoeCkgPDwgVklWU19ERV9VUExBTkVfU1RSSURFX1NUUklERV9fU0hJRlQpICYgVklWU19ERV9VUExBTkVfU1RSSURFX1NUUklERV9fTUFTSykKKworI2RlZmluZSBWSVZTX0RFX1ZQTEFORV9BRERSRVNTCQkJCQkweDAwMDAxMjhjCisKKyNkZWZpbmUgVklWU19ERV9WUExBTkVfU1RSSURFCQkJCQkweDAwMDAxMjkwCisjZGVmaW5lIFZJVlNfREVfVlBMQU5FX1NUUklERV9TVFJJREVfX01BU0sJCQkweDAwMDNmZmZmCisjZGVmaW5lIFZJVlNfREVfVlBMQU5FX1NUUklERV9TVFJJREVfX1NISUZUCQkJMAorI2RlZmluZSBWSVZTX0RFX1ZQTEFORV9TVFJJREVfU1RSSURFKHgpCQkJCSgoKHgpIDw8IFZJVlNfREVfVlBMQU5FX1NUUklERV9TVFJJREVfX1NISUZUKSAmIFZJVlNfREVfVlBMQU5FX1NUUklERV9TVFJJREVfX01BU0spCisKKyNkZWZpbmUgVklWU19ERV9WUl9DT05GSUcJCQkJCTB4MDAwMDEyOTQKKyNkZWZpbmUgVklWU19ERV9WUl9DT05GSUdfU1RBUlRfX01BU0sJCQkJMHgwMDAwMDAwMworI2RlZmluZSBWSVZTX0RFX1ZSX0NPTkZJR19TVEFSVF9fU0hJRlQJCQkJMAorI2RlZmluZSBWSVZTX0RFX1ZSX0NPTkZJR19TVEFSVF9IT1JJWk9OVEFMX0JMSVQJCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfVlJfQ09ORklHX1NUQVJUX1ZFUlRJQ0FMX0JMSVQJCQkweDAwMDAwMDAxCisjZGVmaW5lIFZJVlNfREVfVlJfQ09ORklHX1NUQVJUX09ORV9QQVNTX0JMSVQJCQkweDAwMDAwMDAyCisjZGVmaW5lIFZJVlNfREVfVlJfQ09ORklHX1NUQVJUX01BU0sJCQkJMHgwMDAwMDAwOAorCisjZGVmaW5lIFZJVlNfREVfVlJfU09VUkNFX0lNQUdFX0xPVwkJCQkweDAwMDAxMjk4CisjZGVmaW5lIFZJVlNfREVfVlJfU09VUkNFX0lNQUdFX0xPV19MRUZUX19NQVNLCQkJMHgwMDAwZmZmZgorI2RlZmluZSBWSVZTX0RFX1ZSX1NPVVJDRV9JTUFHRV9MT1dfTEVGVF9fU0hJRlQJCQkwCisjZGVmaW5lIFZJVlNfREVfVlJfU09VUkNFX0lNQUdFX0xPV19MRUZUKHgpCQkJKCgoeCkgPDwgVklWU19ERV9WUl9TT1VSQ0VfSU1BR0VfTE9XX0xFRlRfX1NISUZUKSAmIFZJVlNfREVfVlJfU09VUkNFX0lNQUdFX0xPV19MRUZUX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX1ZSX1NPVVJDRV9JTUFHRV9MT1dfVE9QX19NQVNLCQkJMHhmZmZmMDAwMAorI2RlZmluZSBWSVZTX0RFX1ZSX1NPVVJDRV9JTUFHRV9MT1dfVE9QX19TSElGVAkJCTE2CisjZGVmaW5lIFZJVlNfREVfVlJfU09VUkNFX0lNQUdFX0xPV19UT1AoeCkJCQkoKCh4KSA8PCBWSVZTX0RFX1ZSX1NPVVJDRV9JTUFHRV9MT1dfVE9QX19TSElGVCkgJiBWSVZTX0RFX1ZSX1NPVVJDRV9JTUFHRV9MT1dfVE9QX19NQVNLKQorCisjZGVmaW5lIFZJVlNfREVfVlJfU09VUkNFX0lNQUdFX0hJR0gJCQkJMHgwMDAwMTI5YworI2RlZmluZSBWSVZTX0RFX1ZSX1NPVVJDRV9JTUFHRV9ISUdIX1JJR0hUX19NQVNLCQkweDAwMDBmZmZmCisjZGVmaW5lIFZJVlNfREVfVlJfU09VUkNFX0lNQUdFX0hJR0hfUklHSFRfX1NISUZUCQkwCisjZGVmaW5lIFZJVlNfREVfVlJfU09VUkNFX0lNQUdFX0hJR0hfUklHSFQoeCkJCQkoKCh4KSA8PCBWSVZTX0RFX1ZSX1NPVVJDRV9JTUFHRV9ISUdIX1JJR0hUX19TSElGVCkgJiBWSVZTX0RFX1ZSX1NPVVJDRV9JTUFHRV9ISUdIX1JJR0hUX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX1ZSX1NPVVJDRV9JTUFHRV9ISUdIX0JPVFRPTV9fTUFTSwkJMHhmZmZmMDAwMAorI2RlZmluZSBWSVZTX0RFX1ZSX1NPVVJDRV9JTUFHRV9ISUdIX0JPVFRPTV9fU0hJRlQJCTE2CisjZGVmaW5lIFZJVlNfREVfVlJfU09VUkNFX0lNQUdFX0hJR0hfQk9UVE9NKHgpCQkJKCgoeCkgPDwgVklWU19ERV9WUl9TT1VSQ0VfSU1BR0VfSElHSF9CT1RUT01fX1NISUZUKSAmIFZJVlNfREVfVlJfU09VUkNFX0lNQUdFX0hJR0hfQk9UVE9NX19NQVNLKQorCisjZGVmaW5lIFZJVlNfREVfVlJfU09VUkNFX09SSUdJTl9MT1cJCQkJMHgwMDAwMTJhMAorI2RlZmluZSBWSVZTX0RFX1ZSX1NPVVJDRV9PUklHSU5fTE9XX1hfX01BU0sJCQkweGZmZmZmZmZmCisjZGVmaW5lIFZJVlNfREVfVlJfU09VUkNFX09SSUdJTl9MT1dfWF9fU0hJRlQJCQkwCisjZGVmaW5lIFZJVlNfREVfVlJfU09VUkNFX09SSUdJTl9MT1dfWCh4KQkJCSgoKHgpIDw8IFZJVlNfREVfVlJfU09VUkNFX09SSUdJTl9MT1dfWF9fU0hJRlQpICYgVklWU19ERV9WUl9TT1VSQ0VfT1JJR0lOX0xPV19YX19NQVNLKQorCisjZGVmaW5lIFZJVlNfREVfVlJfU09VUkNFX09SSUdJTl9ISUdICQkJCTB4MDAwMDEyYTQKKyNkZWZpbmUgVklWU19ERV9WUl9TT1VSQ0VfT1JJR0lOX0hJR0hfWV9fTUFTSwkJCTB4ZmZmZmZmZmYKKyNkZWZpbmUgVklWU19ERV9WUl9TT1VSQ0VfT1JJR0lOX0hJR0hfWV9fU0hJRlQJCQkwCisjZGVmaW5lIFZJVlNfREVfVlJfU09VUkNFX09SSUdJTl9ISUdIX1koeCkJCQkoKCh4KSA8PCBWSVZTX0RFX1ZSX1NPVVJDRV9PUklHSU5fSElHSF9ZX19TSElGVCkgJiBWSVZTX0RFX1ZSX1NPVVJDRV9PUklHSU5fSElHSF9ZX19NQVNLKQorCisjZGVmaW5lIFZJVlNfREVfVlJfVEFSR0VUX1dJTkRPV19MT1cJCQkJMHgwMDAwMTJhOAorI2RlZmluZSBWSVZTX0RFX1ZSX1RBUkdFVF9XSU5ET1dfTE9XX0xFRlRfX01BU0sJCQkweDAwMDBmZmZmCisjZGVmaW5lIFZJVlNfREVfVlJfVEFSR0VUX1dJTkRPV19MT1dfTEVGVF9fU0hJRlQJCTAKKyNkZWZpbmUgVklWU19ERV9WUl9UQVJHRVRfV0lORE9XX0xPV19MRUZUKHgpCQkJKCgoeCkgPDwgVklWU19ERV9WUl9UQVJHRVRfV0lORE9XX0xPV19MRUZUX19TSElGVCkgJiBWSVZTX0RFX1ZSX1RBUkdFVF9XSU5ET1dfTE9XX0xFRlRfX01BU0spCisjZGVmaW5lIFZJVlNfREVfVlJfVEFSR0VUX1dJTkRPV19MT1dfVE9QX19NQVNLCQkJMHhmZmZmMDAwMAorI2RlZmluZSBWSVZTX0RFX1ZSX1RBUkdFVF9XSU5ET1dfTE9XX1RPUF9fU0hJRlQJCQkxNgorI2RlZmluZSBWSVZTX0RFX1ZSX1RBUkdFVF9XSU5ET1dfTE9XX1RPUCh4KQkJCSgoKHgpIDw8IFZJVlNfREVfVlJfVEFSR0VUX1dJTkRPV19MT1dfVE9QX19TSElGVCkgJiBWSVZTX0RFX1ZSX1RBUkdFVF9XSU5ET1dfTE9XX1RPUF9fTUFTSykKKworI2RlZmluZSBWSVZTX0RFX1ZSX1RBUkdFVF9XSU5ET1dfSElHSAkJCQkweDAwMDAxMmFjCisjZGVmaW5lIFZJVlNfREVfVlJfVEFSR0VUX1dJTkRPV19ISUdIX1JJR0hUX19NQVNLCQkweDAwMDBmZmZmCisjZGVmaW5lIFZJVlNfREVfVlJfVEFSR0VUX1dJTkRPV19ISUdIX1JJR0hUX19TSElGVAkJMAorI2RlZmluZSBWSVZTX0RFX1ZSX1RBUkdFVF9XSU5ET1dfSElHSF9SSUdIVCh4KQkJCSgoKHgpIDw8IFZJVlNfREVfVlJfVEFSR0VUX1dJTkRPV19ISUdIX1JJR0hUX19TSElGVCkgJiBWSVZTX0RFX1ZSX1RBUkdFVF9XSU5ET1dfSElHSF9SSUdIVF9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9WUl9UQVJHRVRfV0lORE9XX0hJR0hfQk9UVE9NX19NQVNLCQkweGZmZmYwMDAwCisjZGVmaW5lIFZJVlNfREVfVlJfVEFSR0VUX1dJTkRPV19ISUdIX0JPVFRPTV9fU0hJRlQJCTE2CisjZGVmaW5lIFZJVlNfREVfVlJfVEFSR0VUX1dJTkRPV19ISUdIX0JPVFRPTSh4KQkJCSgoKHgpIDw8IFZJVlNfREVfVlJfVEFSR0VUX1dJTkRPV19ISUdIX0JPVFRPTV9fU0hJRlQpICYgVklWU19ERV9WUl9UQVJHRVRfV0lORE9XX0hJR0hfQk9UVE9NX19NQVNLKQorCisjZGVmaW5lIFZJVlNfREVfUEVfQ09ORklHCQkJCQkweDAwMDAxMmIwCisjZGVmaW5lIFZJVlNfREVfUEVfQ09ORklHX0RFU1RJTkFUSU9OX0ZFVENIX19NQVNLCQkweDAwMDAwMDAzCisjZGVmaW5lIFZJVlNfREVfUEVfQ09ORklHX0RFU1RJTkFUSU9OX0ZFVENIX19TSElGVAkJMAorI2RlZmluZSBWSVZTX0RFX1BFX0NPTkZJR19ERVNUSU5BVElPTl9GRVRDSF9ESVNBQkxFCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfUEVfQ09ORklHX0RFU1RJTkFUSU9OX0ZFVENIX0RFRkFVTFQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgVklWU19ERV9QRV9DT05GSUdfREVTVElOQVRJT05fRkVUQ0hfQUxXQVlTCQkweDAwMDAwMDAyCisjZGVmaW5lIFZJVlNfREVfUEVfQ09ORklHX0RFU1RJTkFUSU9OX0ZFVENIX01BU0sJCTB4MDAwMDAwMDgKKworI2RlZmluZSBWSVZTX0RFX0RFU1RfUk9UQVRJT05fSEVJR0hUCQkJCTB4MDAwMDEyYjQKKyNkZWZpbmUgVklWU19ERV9ERVNUX1JPVEFUSU9OX0hFSUdIVF9IRUlHSFRfX01BU0sJCTB4MDAwMGZmZmYKKyNkZWZpbmUgVklWU19ERV9ERVNUX1JPVEFUSU9OX0hFSUdIVF9IRUlHSFRfX1NISUZUCQkwCisjZGVmaW5lIFZJVlNfREVfREVTVF9ST1RBVElPTl9IRUlHSFRfSEVJR0hUKHgpCQkJKCgoeCkgPDwgVklWU19ERV9ERVNUX1JPVEFUSU9OX0hFSUdIVF9IRUlHSFRfX1NISUZUKSAmIFZJVlNfREVfREVTVF9ST1RBVElPTl9IRUlHSFRfSEVJR0hUX19NQVNLKQorCisjZGVmaW5lIFZJVlNfREVfU1JDX1JPVEFUSU9OX0hFSUdIVAkJCQkweDAwMDAxMmI4CisjZGVmaW5lIFZJVlNfREVfU1JDX1JPVEFUSU9OX0hFSUdIVF9IRUlHSFRfX01BU0sJCTB4MDAwMGZmZmYKKyNkZWZpbmUgVklWU19ERV9TUkNfUk9UQVRJT05fSEVJR0hUX0hFSUdIVF9fU0hJRlQJCTAKKyNkZWZpbmUgVklWU19ERV9TUkNfUk9UQVRJT05fSEVJR0hUX0hFSUdIVCh4KQkJCSgoKHgpIDw8IFZJVlNfREVfU1JDX1JPVEFUSU9OX0hFSUdIVF9IRUlHSFRfX1NISUZUKSAmIFZJVlNfREVfU1JDX1JPVEFUSU9OX0hFSUdIVF9IRUlHSFRfX01BU0spCisKKyNkZWZpbmUgVklWU19ERV9ST1RfQU5HTEUJCQkJCTB4MDAwMDEyYmMKKyNkZWZpbmUgVklWU19ERV9ST1RfQU5HTEVfU1JDX19NQVNLCQkJCTB4MDAwMDAwMDcKKyNkZWZpbmUgVklWU19ERV9ST1RfQU5HTEVfU1JDX19TSElGVAkJCQkwCisjZGVmaW5lIFZJVlNfREVfUk9UX0FOR0xFX1NSQyh4KQkJCQkoKCh4KSA8PCBWSVZTX0RFX1JPVF9BTkdMRV9TUkNfX1NISUZUKSAmIFZJVlNfREVfUk9UX0FOR0xFX1NSQ19fTUFTSykKKyNkZWZpbmUgVklWU19ERV9ST1RfQU5HTEVfRFNUX19NQVNLCQkJCTB4MDAwMDAwMzgKKyNkZWZpbmUgVklWU19ERV9ST1RfQU5HTEVfRFNUX19TSElGVAkJCQkzCisjZGVmaW5lIFZJVlNfREVfUk9UX0FOR0xFX0RTVCh4KQkJCQkoKCh4KSA8PCBWSVZTX0RFX1JPVF9BTkdMRV9EU1RfX1NISUZUKSAmIFZJVlNfREVfUk9UX0FOR0xFX0RTVF9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9ST1RfQU5HTEVfU1JDX01BU0sJCQkJMHgwMDAwMDEwMAorI2RlZmluZSBWSVZTX0RFX1JPVF9BTkdMRV9EU1RfTUFTSwkJCQkweDAwMDAwMjAwCisjZGVmaW5lIFZJVlNfREVfUk9UX0FOR0xFX1NSQ19NSVJST1JfX01BU0sJCQkweDAwMDAzMDAwCisjZGVmaW5lIFZJVlNfREVfUk9UX0FOR0xFX1NSQ19NSVJST1JfX1NISUZUCQkJMTIKKyNkZWZpbmUgVklWU19ERV9ST1RfQU5HTEVfU1JDX01JUlJPUih4KQkJCQkoKCh4KSA8PCBWSVZTX0RFX1JPVF9BTkdMRV9TUkNfTUlSUk9SX19TSElGVCkgJiBWSVZTX0RFX1JPVF9BTkdMRV9TUkNfTUlSUk9SX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX1JPVF9BTkdMRV9TUkNfTUlSUk9SX01BU0sJCQkweDAwMDA4MDAwCisjZGVmaW5lIFZJVlNfREVfUk9UX0FOR0xFX0RTVF9NSVJST1JfX01BU0sJCQkweDAwMDMwMDAwCisjZGVmaW5lIFZJVlNfREVfUk9UX0FOR0xFX0RTVF9NSVJST1JfX1NISUZUCQkJMTYKKyNkZWZpbmUgVklWU19ERV9ST1RfQU5HTEVfRFNUX01JUlJPUih4KQkJCQkoKCh4KSA8PCBWSVZTX0RFX1JPVF9BTkdMRV9EU1RfTUlSUk9SX19TSElGVCkgJiBWSVZTX0RFX1JPVF9BTkdMRV9EU1RfTUlSUk9SX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX1JPVF9BTkdMRV9EU1RfTUlSUk9SX01BU0sJCQkweDAwMDgwMDAwCisKKyNkZWZpbmUgVklWU19ERV9DTEVBUl9QSVhFTF9WQUxVRTMyCQkJCTB4MDAwMDEyYzAKKworI2RlZmluZSBWSVZTX0RFX0RFU1RfQ09MT1JfS0VZCQkJCQkweDAwMDAxMmM0CisKKyNkZWZpbmUgVklWU19ERV9HTE9CQUxfU1JDX0NPTE9SCQkJCTB4MDAwMDEyYzgKKworI2RlZmluZSBWSVZTX0RFX0dMT0JBTF9ERVNUX0NPTE9SCQkJCTB4MDAwMDEyY2MKKworI2RlZmluZSBWSVZTX0RFX0NPTE9SX01VTFRJUExZX01PREVTCQkJCTB4MDAwMDEyZDAKKyNkZWZpbmUgVklWU19ERV9DT0xPUl9NVUxUSVBMWV9NT0RFU19TUkNfUFJFTVVMVElQTFlfX01BU0sJMHgwMDAwMDAwMQorI2RlZmluZSBWSVZTX0RFX0NPTE9SX01VTFRJUExZX01PREVTX1NSQ19QUkVNVUxUSVBMWV9fU0hJRlQJMAorI2RlZmluZSBWSVZTX0RFX0NPTE9SX01VTFRJUExZX01PREVTX1NSQ19QUkVNVUxUSVBMWV9ESVNBQkxFCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9DT0xPUl9NVUxUSVBMWV9NT0RFU19TUkNfUFJFTVVMVElQTFlfRU5BQkxFCTB4MDAwMDAwMDEKKyNkZWZpbmUgVklWU19ERV9DT0xPUl9NVUxUSVBMWV9NT0RFU19EU1RfUFJFTVVMVElQTFlfX01BU0sJMHgwMDAwMDAxMAorI2RlZmluZSBWSVZTX0RFX0NPTE9SX01VTFRJUExZX01PREVTX0RTVF9QUkVNVUxUSVBMWV9fU0hJRlQJNAorI2RlZmluZSBWSVZTX0RFX0NPTE9SX01VTFRJUExZX01PREVTX0RTVF9QUkVNVUxUSVBMWV9ESVNBQkxFCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9DT0xPUl9NVUxUSVBMWV9NT0RFU19EU1RfUFJFTVVMVElQTFlfRU5BQkxFCTB4MDAwMDAwMTAKKyNkZWZpbmUgVklWU19ERV9DT0xPUl9NVUxUSVBMWV9NT0RFU19TUkNfR0xPQkFMX1BSRU1VTFRJUExZX19NQVNLCTB4MDAwMDAzMDAKKyNkZWZpbmUgVklWU19ERV9DT0xPUl9NVUxUSVBMWV9NT0RFU19TUkNfR0xPQkFMX1BSRU1VTFRJUExZX19TSElGVAk4CisjZGVmaW5lIFZJVlNfREVfQ09MT1JfTVVMVElQTFlfTU9ERVNfU1JDX0dMT0JBTF9QUkVNVUxUSVBMWV9ESVNBQkxFCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9DT0xPUl9NVUxUSVBMWV9NT0RFU19TUkNfR0xPQkFMX1BSRU1VTFRJUExZX0FMUEhBCTB4MDAwMDAxMDAKKyNkZWZpbmUgVklWU19ERV9DT0xPUl9NVUxUSVBMWV9NT0RFU19TUkNfR0xPQkFMX1BSRU1VTFRJUExZX0NPTE9SCTB4MDAwMDAyMDAKKyNkZWZpbmUgVklWU19ERV9DT0xPUl9NVUxUSVBMWV9NT0RFU19EU1RfREVNVUxUSVBMWV9fTUFTSwkweDAwMTAwMDAwCisjZGVmaW5lIFZJVlNfREVfQ09MT1JfTVVMVElQTFlfTU9ERVNfRFNUX0RFTVVMVElQTFlfX1NISUZUCTIwCisjZGVmaW5lIFZJVlNfREVfQ09MT1JfTVVMVElQTFlfTU9ERVNfRFNUX0RFTVVMVElQTFlfRElTQUJMRQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQ09MT1JfTVVMVElQTFlfTU9ERVNfRFNUX0RFTVVMVElQTFlfRU5BQkxFCTB4MDAxMDAwMDAKKworI2RlZmluZSBWSVZTX0RFX1BFX1RSQU5TUEFSRU5DWQkJCQkJMHgwMDAwMTJkNAorI2RlZmluZSBWSVZTX0RFX1BFX1RSQU5TUEFSRU5DWV9TT1VSQ0VfX01BU0sJCQkweDAwMDAwMDAzCisjZGVmaW5lIFZJVlNfREVfUEVfVFJBTlNQQVJFTkNZX1NPVVJDRV9fU0hJRlQJCQkwCisjZGVmaW5lIFZJVlNfREVfUEVfVFJBTlNQQVJFTkNZX1NPVVJDRV9PUEFRVUUJCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfUEVfVFJBTlNQQVJFTkNZX1NPVVJDRV9NQVNLCQkJMHgwMDAwMDAwMQorI2RlZmluZSBWSVZTX0RFX1BFX1RSQU5TUEFSRU5DWV9TT1VSQ0VfS0VZCQkJMHgwMDAwMDAwMgorI2RlZmluZSBWSVZTX0RFX1BFX1RSQU5TUEFSRU5DWV9QQVRURVJOX19NQVNLCQkJMHgwMDAwMDAzMAorI2RlZmluZSBWSVZTX0RFX1BFX1RSQU5TUEFSRU5DWV9QQVRURVJOX19TSElGVAkJCTQKKyNkZWZpbmUgVklWU19ERV9QRV9UUkFOU1BBUkVOQ1lfUEFUVEVSTl9PUEFRVUUJCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfUEVfVFJBTlNQQVJFTkNZX1BBVFRFUk5fTUFTSwkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgVklWU19ERV9QRV9UUkFOU1BBUkVOQ1lfUEFUVEVSTl9LRVkJCQkweDAwMDAwMDIwCisjZGVmaW5lIFZJVlNfREVfUEVfVFJBTlNQQVJFTkNZX0RFU1RJTkFUSU9OX19NQVNLCQkweDAwMDAwMzAwCisjZGVmaW5lIFZJVlNfREVfUEVfVFJBTlNQQVJFTkNZX0RFU1RJTkFUSU9OX19TSElGVAkJOAorI2RlZmluZSBWSVZTX0RFX1BFX1RSQU5TUEFSRU5DWV9ERVNUSU5BVElPTl9PUEFRVUUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9QRV9UUkFOU1BBUkVOQ1lfREVTVElOQVRJT05fTUFTSwkJMHgwMDAwMDEwMAorI2RlZmluZSBWSVZTX0RFX1BFX1RSQU5TUEFSRU5DWV9ERVNUSU5BVElPTl9LRVkJCQkweDAwMDAwMjAwCisjZGVmaW5lIFZJVlNfREVfUEVfVFJBTlNQQVJFTkNZX1RSQU5TUEFSRU5DWV9NQVNLCQkweDAwMDAxMDAwCisjZGVmaW5lIFZJVlNfREVfUEVfVFJBTlNQQVJFTkNZX1VTRV9TUkNfT1ZFUlJJREVfX01BU0sJCTB4MDAwMzAwMDAKKyNkZWZpbmUgVklWU19ERV9QRV9UUkFOU1BBUkVOQ1lfVVNFX1NSQ19PVkVSUklERV9fU0hJRlQJCTE2CisjZGVmaW5lIFZJVlNfREVfUEVfVFJBTlNQQVJFTkNZX1VTRV9TUkNfT1ZFUlJJREVfREVGQVVMVAkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfUEVfVFJBTlNQQVJFTkNZX1VTRV9TUkNfT1ZFUlJJREVfVVNFX0VOQUJMRQkweDAwMDEwMDAwCisjZGVmaW5lIFZJVlNfREVfUEVfVFJBTlNQQVJFTkNZX1VTRV9TUkNfT1ZFUlJJREVfVVNFX0RJU0FCTEUJMHgwMDAyMDAwMAorI2RlZmluZSBWSVZTX0RFX1BFX1RSQU5TUEFSRU5DWV9VU0VfUEFUX09WRVJSSURFX19NQVNLCQkweDAwMzAwMDAwCisjZGVmaW5lIFZJVlNfREVfUEVfVFJBTlNQQVJFTkNZX1VTRV9QQVRfT1ZFUlJJREVfX1NISUZUCQkyMAorI2RlZmluZSBWSVZTX0RFX1BFX1RSQU5TUEFSRU5DWV9VU0VfUEFUX09WRVJSSURFX0RFRkFVTFQJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX1BFX1RSQU5TUEFSRU5DWV9VU0VfUEFUX09WRVJSSURFX1VTRV9FTkFCTEUJMHgwMDEwMDAwMAorI2RlZmluZSBWSVZTX0RFX1BFX1RSQU5TUEFSRU5DWV9VU0VfUEFUX09WRVJSSURFX1VTRV9ESVNBQkxFCTB4MDAyMDAwMDAKKyNkZWZpbmUgVklWU19ERV9QRV9UUkFOU1BBUkVOQ1lfVVNFX0RTVF9PVkVSUklERV9fTUFTSwkJMHgwMzAwMDAwMAorI2RlZmluZSBWSVZTX0RFX1BFX1RSQU5TUEFSRU5DWV9VU0VfRFNUX09WRVJSSURFX19TSElGVAkJMjQKKyNkZWZpbmUgVklWU19ERV9QRV9UUkFOU1BBUkVOQ1lfVVNFX0RTVF9PVkVSUklERV9ERUZBVUxUCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9QRV9UUkFOU1BBUkVOQ1lfVVNFX0RTVF9PVkVSUklERV9VU0VfRU5BQkxFCTB4MDEwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9QRV9UUkFOU1BBUkVOQ1lfVVNFX0RTVF9PVkVSUklERV9VU0VfRElTQUJMRQkweDAyMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfUEVfVFJBTlNQQVJFTkNZX1JFU09VUkNFX09WRVJSSURFX01BU0sJCTB4MTAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9QRV9UUkFOU1BBUkVOQ1lfREZCX0NPTE9SX0tFWV9fTUFTSwkJMHgyMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX1BFX1RSQU5TUEFSRU5DWV9ERkJfQ09MT1JfS0VZX19TSElGVAkJMjkKKyNkZWZpbmUgVklWU19ERV9QRV9UUkFOU1BBUkVOQ1lfREZCX0NPTE9SX0tFWV9ESVNBQkxFCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfUEVfVFJBTlNQQVJFTkNZX0RGQl9DT0xPUl9LRVlfRU5BQkxFCQkweDIwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfUEVfVFJBTlNQQVJFTkNZX0RGQl9DT0xPUl9LRVlfTUFTSwkJMHg4MDAwMDAwMAorCisjZGVmaW5lIFZJVlNfREVfUEVfQ09OVFJPTAkJCQkJMHgwMDAwMTJkOAorI2RlZmluZSBWSVZTX0RFX1BFX0NPTlRST0xfWVVWX19NQVNLCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgVklWU19ERV9QRV9DT05UUk9MX1lVVl9fU0hJRlQJCQkJMAorI2RlZmluZSBWSVZTX0RFX1BFX0NPTlRST0xfWVVWXzYwMQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfUEVfQ09OVFJPTF9ZVVZfNzA5CQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgVklWU19ERV9QRV9DT05UUk9MX1lVVl9NQVNLCQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgVklWU19ERV9QRV9DT05UUk9MX1VWX1NXSVpaTEVfX01BU0sJCQkweDAwMDAwMDEwCisjZGVmaW5lIFZJVlNfREVfUEVfQ09OVFJPTF9VVl9TV0laWkxFX19TSElGVAkJCTQKKyNkZWZpbmUgVklWU19ERV9QRV9DT05UUk9MX1VWX1NXSVpaTEVfVVYJCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfUEVfQ09OVFJPTF9VVl9TV0laWkxFX1ZVCQkJMHgwMDAwMDAxMAorI2RlZmluZSBWSVZTX0RFX1BFX0NPTlRST0xfVVZfU1dJWlpMRV9NQVNLCQkJMHgwMDAwMDA4MAorI2RlZmluZSBWSVZTX0RFX1BFX0NPTlRST0xfWVVWUkdCX19NQVNLCQkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgVklWU19ERV9QRV9DT05UUk9MX1lVVlJHQl9fU0hJRlQJCQk4CisjZGVmaW5lIFZJVlNfREVfUEVfQ09OVFJPTF9ZVVZSR0JfRElTQUJMRQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9QRV9DT05UUk9MX1lVVlJHQl9FTkFCTEUJCQkweDAwMDAwMTAwCisjZGVmaW5lIFZJVlNfREVfUEVfQ09OVFJPTF9ZVVZSR0JfTUFTSwkJCQkweDAwMDAwODAwCisKKyNkZWZpbmUgVklWU19ERV9TUkNfQ09MT1JfS0VZX0hJR0gJCQkJMHgwMDAwMTJkYworCisjZGVmaW5lIFZJVlNfREVfREVTVF9DT0xPUl9LRVlfSElHSAkJCQkweDAwMDAxMmUwCisKKyNkZWZpbmUgVklWU19ERV9WUl9DT05GSUdfRVgJCQkJCTB4MDAwMDEyZTQKKyNkZWZpbmUgVklWU19ERV9WUl9DT05GSUdfRVhfVkVSVElDQUxfTElORV9XSURUSF9fTUFTSwkJMHgwMDAwMDAwMworI2RlZmluZSBWSVZTX0RFX1ZSX0NPTkZJR19FWF9WRVJUSUNBTF9MSU5FX1dJRFRIX19TSElGVAkJMAorI2RlZmluZSBWSVZTX0RFX1ZSX0NPTkZJR19FWF9WRVJUSUNBTF9MSU5FX1dJRFRIX0FVVE8JCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9WUl9DT05GSUdfRVhfVkVSVElDQUxfTElORV9XSURUSF9QSVhFTFMxNgkweDAwMDAwMDAxCisjZGVmaW5lIFZJVlNfREVfVlJfQ09ORklHX0VYX1ZFUlRJQ0FMX0xJTkVfV0lEVEhfUElYRUxTMzIJMHgwMDAwMDAwMgorI2RlZmluZSBWSVZTX0RFX1ZSX0NPTkZJR19FWF9WRVJUSUNBTF9MSU5FX1dJRFRIX01BU0sJCTB4MDAwMDAwMDgKKyNkZWZpbmUgVklWU19ERV9WUl9DT05GSUdfRVhfRklMVEVSX1RBUF9fTUFTSwkJCTB4MDAwMDAwZjAKKyNkZWZpbmUgVklWU19ERV9WUl9DT05GSUdfRVhfRklMVEVSX1RBUF9fU0hJRlQJCQk0CisjZGVmaW5lIFZJVlNfREVfVlJfQ09ORklHX0VYX0ZJTFRFUl9UQVAoeCkJCQkoKCh4KSA8PCBWSVZTX0RFX1ZSX0NPTkZJR19FWF9GSUxURVJfVEFQX19TSElGVCkgJiBWSVZTX0RFX1ZSX0NPTkZJR19FWF9GSUxURVJfVEFQX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX1ZSX0NPTkZJR19FWF9GSUxURVJfVEFQX01BU0sJCQkweDAwMDAwMTAwCisKKyNkZWZpbmUgVklWU19ERV9QRV9ESVRIRVJfTE9XCQkJCQkweDAwMDAxMmU4CisjZGVmaW5lIFZJVlNfREVfUEVfRElUSEVSX0xPV19QSVhFTF9YMF9ZMF9fTUFTSwkJCTB4MDAwMDAwMGYKKyNkZWZpbmUgVklWU19ERV9QRV9ESVRIRVJfTE9XX1BJWEVMX1gwX1kwX19TSElGVAkJMAorI2RlZmluZSBWSVZTX0RFX1BFX0RJVEhFUl9MT1dfUElYRUxfWDBfWTAoeCkJCQkoKCh4KSA8PCBWSVZTX0RFX1BFX0RJVEhFUl9MT1dfUElYRUxfWDBfWTBfX1NISUZUKSAmIFZJVlNfREVfUEVfRElUSEVSX0xPV19QSVhFTF9YMF9ZMF9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9QRV9ESVRIRVJfTE9XX1BJWEVMX1gxX1kwX19NQVNLCQkJMHgwMDAwMDBmMAorI2RlZmluZSBWSVZTX0RFX1BFX0RJVEhFUl9MT1dfUElYRUxfWDFfWTBfX1NISUZUCQk0CisjZGVmaW5lIFZJVlNfREVfUEVfRElUSEVSX0xPV19QSVhFTF9YMV9ZMCh4KQkJCSgoKHgpIDw8IFZJVlNfREVfUEVfRElUSEVSX0xPV19QSVhFTF9YMV9ZMF9fU0hJRlQpICYgVklWU19ERV9QRV9ESVRIRVJfTE9XX1BJWEVMX1gxX1kwX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX1BFX0RJVEhFUl9MT1dfUElYRUxfWDJfWTBfX01BU0sJCQkweDAwMDAwZjAwCisjZGVmaW5lIFZJVlNfREVfUEVfRElUSEVSX0xPV19QSVhFTF9YMl9ZMF9fU0hJRlQJCTgKKyNkZWZpbmUgVklWU19ERV9QRV9ESVRIRVJfTE9XX1BJWEVMX1gyX1kwKHgpCQkJKCgoeCkgPDwgVklWU19ERV9QRV9ESVRIRVJfTE9XX1BJWEVMX1gyX1kwX19TSElGVCkgJiBWSVZTX0RFX1BFX0RJVEhFUl9MT1dfUElYRUxfWDJfWTBfX01BU0spCisjZGVmaW5lIFZJVlNfREVfUEVfRElUSEVSX0xPV19QSVhFTF9YM19ZMF9fTUFTSwkJCTB4MDAwMGYwMDAKKyNkZWZpbmUgVklWU19ERV9QRV9ESVRIRVJfTE9XX1BJWEVMX1gzX1kwX19TSElGVAkJMTIKKyNkZWZpbmUgVklWU19ERV9QRV9ESVRIRVJfTE9XX1BJWEVMX1gzX1kwKHgpCQkJKCgoeCkgPDwgVklWU19ERV9QRV9ESVRIRVJfTE9XX1BJWEVMX1gzX1kwX19TSElGVCkgJiBWSVZTX0RFX1BFX0RJVEhFUl9MT1dfUElYRUxfWDNfWTBfX01BU0spCisjZGVmaW5lIFZJVlNfREVfUEVfRElUSEVSX0xPV19QSVhFTF9YMF9ZMV9fTUFTSwkJCTB4MDAwZjAwMDAKKyNkZWZpbmUgVklWU19ERV9QRV9ESVRIRVJfTE9XX1BJWEVMX1gwX1kxX19TSElGVAkJMTYKKyNkZWZpbmUgVklWU19ERV9QRV9ESVRIRVJfTE9XX1BJWEVMX1gwX1kxKHgpCQkJKCgoeCkgPDwgVklWU19ERV9QRV9ESVRIRVJfTE9XX1BJWEVMX1gwX1kxX19TSElGVCkgJiBWSVZTX0RFX1BFX0RJVEhFUl9MT1dfUElYRUxfWDBfWTFfX01BU0spCisjZGVmaW5lIFZJVlNfREVfUEVfRElUSEVSX0xPV19QSVhFTF9YMV9ZMV9fTUFTSwkJCTB4MDBmMDAwMDAKKyNkZWZpbmUgVklWU19ERV9QRV9ESVRIRVJfTE9XX1BJWEVMX1gxX1kxX19TSElGVAkJMjAKKyNkZWZpbmUgVklWU19ERV9QRV9ESVRIRVJfTE9XX1BJWEVMX1gxX1kxKHgpCQkJKCgoeCkgPDwgVklWU19ERV9QRV9ESVRIRVJfTE9XX1BJWEVMX1gxX1kxX19TSElGVCkgJiBWSVZTX0RFX1BFX0RJVEhFUl9MT1dfUElYRUxfWDFfWTFfX01BU0spCisjZGVmaW5lIFZJVlNfREVfUEVfRElUSEVSX0xPV19QSVhFTF9YMl9ZMV9fTUFTSwkJCTB4MGYwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9QRV9ESVRIRVJfTE9XX1BJWEVMX1gyX1kxX19TSElGVAkJMjQKKyNkZWZpbmUgVklWU19ERV9QRV9ESVRIRVJfTE9XX1BJWEVMX1gyX1kxKHgpCQkJKCgoeCkgPDwgVklWU19ERV9QRV9ESVRIRVJfTE9XX1BJWEVMX1gyX1kxX19TSElGVCkgJiBWSVZTX0RFX1BFX0RJVEhFUl9MT1dfUElYRUxfWDJfWTFfX01BU0spCisjZGVmaW5lIFZJVlNfREVfUEVfRElUSEVSX0xPV19QSVhFTF9YM19ZMV9fTUFTSwkJCTB4ZjAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9QRV9ESVRIRVJfTE9XX1BJWEVMX1gzX1kxX19TSElGVAkJMjgKKyNkZWZpbmUgVklWU19ERV9QRV9ESVRIRVJfTE9XX1BJWEVMX1gzX1kxKHgpCQkJKCgoeCkgPDwgVklWU19ERV9QRV9ESVRIRVJfTE9XX1BJWEVMX1gzX1kxX19TSElGVCkgJiBWSVZTX0RFX1BFX0RJVEhFUl9MT1dfUElYRUxfWDNfWTFfX01BU0spCisKKyNkZWZpbmUgVklWU19ERV9QRV9ESVRIRVJfSElHSAkJCQkJMHgwMDAwMTJlYworI2RlZmluZSBWSVZTX0RFX1BFX0RJVEhFUl9ISUdIX1BJWEVMX1gwX1kyX19NQVNLCQkweDAwMDAwMDBmCisjZGVmaW5lIFZJVlNfREVfUEVfRElUSEVSX0hJR0hfUElYRUxfWDBfWTJfX1NISUZUCQkwCisjZGVmaW5lIFZJVlNfREVfUEVfRElUSEVSX0hJR0hfUElYRUxfWDBfWTIoeCkJCQkoKCh4KSA8PCBWSVZTX0RFX1BFX0RJVEhFUl9ISUdIX1BJWEVMX1gwX1kyX19TSElGVCkgJiBWSVZTX0RFX1BFX0RJVEhFUl9ISUdIX1BJWEVMX1gwX1kyX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX1BFX0RJVEhFUl9ISUdIX1BJWEVMX1gxX1kyX19NQVNLCQkweDAwMDAwMGYwCisjZGVmaW5lIFZJVlNfREVfUEVfRElUSEVSX0hJR0hfUElYRUxfWDFfWTJfX1NISUZUCQk0CisjZGVmaW5lIFZJVlNfREVfUEVfRElUSEVSX0hJR0hfUElYRUxfWDFfWTIoeCkJCQkoKCh4KSA8PCBWSVZTX0RFX1BFX0RJVEhFUl9ISUdIX1BJWEVMX1gxX1kyX19TSElGVCkgJiBWSVZTX0RFX1BFX0RJVEhFUl9ISUdIX1BJWEVMX1gxX1kyX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX1BFX0RJVEhFUl9ISUdIX1BJWEVMX1gyX1kyX19NQVNLCQkweDAwMDAwZjAwCisjZGVmaW5lIFZJVlNfREVfUEVfRElUSEVSX0hJR0hfUElYRUxfWDJfWTJfX1NISUZUCQk4CisjZGVmaW5lIFZJVlNfREVfUEVfRElUSEVSX0hJR0hfUElYRUxfWDJfWTIoeCkJCQkoKCh4KSA8PCBWSVZTX0RFX1BFX0RJVEhFUl9ISUdIX1BJWEVMX1gyX1kyX19TSElGVCkgJiBWSVZTX0RFX1BFX0RJVEhFUl9ISUdIX1BJWEVMX1gyX1kyX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX1BFX0RJVEhFUl9ISUdIX1BJWEVMX1gzX1kyX19NQVNLCQkweDAwMDBmMDAwCisjZGVmaW5lIFZJVlNfREVfUEVfRElUSEVSX0hJR0hfUElYRUxfWDNfWTJfX1NISUZUCQkxMgorI2RlZmluZSBWSVZTX0RFX1BFX0RJVEhFUl9ISUdIX1BJWEVMX1gzX1kyKHgpCQkJKCgoeCkgPDwgVklWU19ERV9QRV9ESVRIRVJfSElHSF9QSVhFTF9YM19ZMl9fU0hJRlQpICYgVklWU19ERV9QRV9ESVRIRVJfSElHSF9QSVhFTF9YM19ZMl9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9QRV9ESVRIRVJfSElHSF9QSVhFTF9YMF9ZM19fTUFTSwkJMHgwMDBmMDAwMAorI2RlZmluZSBWSVZTX0RFX1BFX0RJVEhFUl9ISUdIX1BJWEVMX1gwX1kzX19TSElGVAkJMTYKKyNkZWZpbmUgVklWU19ERV9QRV9ESVRIRVJfSElHSF9QSVhFTF9YMF9ZMyh4KQkJCSgoKHgpIDw8IFZJVlNfREVfUEVfRElUSEVSX0hJR0hfUElYRUxfWDBfWTNfX1NISUZUKSAmIFZJVlNfREVfUEVfRElUSEVSX0hJR0hfUElYRUxfWDBfWTNfX01BU0spCisjZGVmaW5lIFZJVlNfREVfUEVfRElUSEVSX0hJR0hfUElYRUxfWDFfWTNfX01BU0sJCTB4MDBmMDAwMDAKKyNkZWZpbmUgVklWU19ERV9QRV9ESVRIRVJfSElHSF9QSVhFTF9YMV9ZM19fU0hJRlQJCTIwCisjZGVmaW5lIFZJVlNfREVfUEVfRElUSEVSX0hJR0hfUElYRUxfWDFfWTMoeCkJCQkoKCh4KSA8PCBWSVZTX0RFX1BFX0RJVEhFUl9ISUdIX1BJWEVMX1gxX1kzX19TSElGVCkgJiBWSVZTX0RFX1BFX0RJVEhFUl9ISUdIX1BJWEVMX1gxX1kzX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX1BFX0RJVEhFUl9ISUdIX1BJWEVMX1gyX1kzX19NQVNLCQkweDBmMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfUEVfRElUSEVSX0hJR0hfUElYRUxfWDJfWTNfX1NISUZUCQkyNAorI2RlZmluZSBWSVZTX0RFX1BFX0RJVEhFUl9ISUdIX1BJWEVMX1gyX1kzKHgpCQkJKCgoeCkgPDwgVklWU19ERV9QRV9ESVRIRVJfSElHSF9QSVhFTF9YMl9ZM19fU0hJRlQpICYgVklWU19ERV9QRV9ESVRIRVJfSElHSF9QSVhFTF9YMl9ZM19fTUFTSykKKyNkZWZpbmUgVklWU19ERV9QRV9ESVRIRVJfSElHSF9QSVhFTF9YM19ZM19fTUFTSwkJMHhmMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX1BFX0RJVEhFUl9ISUdIX1BJWEVMX1gzX1kzX19TSElGVAkJMjgKKyNkZWZpbmUgVklWU19ERV9QRV9ESVRIRVJfSElHSF9QSVhFTF9YM19ZMyh4KQkJCSgoKHgpIDw8IFZJVlNfREVfUEVfRElUSEVSX0hJR0hfUElYRUxfWDNfWTNfX1NISUZUKSAmIFZJVlNfREVfUEVfRElUSEVSX0hJR0hfUElYRUxfWDNfWTNfX01BU0spCisKKyNkZWZpbmUgVklWU19ERV9CV19DT05GSUcJCQkJCTB4MDAwMDEyZjAKKyNkZWZpbmUgVklWU19ERV9CV19DT05GSUdfQkxPQ0tfQ09ORklHX19NQVNLCQkJMHgwMDAwMDAwMQorI2RlZmluZSBWSVZTX0RFX0JXX0NPTkZJR19CTE9DS19DT05GSUdfX1NISUZUCQkJMAorI2RlZmluZSBWSVZTX0RFX0JXX0NPTkZJR19CTE9DS19DT05GSUdfQVVUTwkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CV19DT05GSUdfQkxPQ0tfQ09ORklHX0NVU1RPTUlaRQkJMHgwMDAwMDAwMQorI2RlZmluZSBWSVZTX0RFX0JXX0NPTkZJR19CTE9DS19DT05GSUdfTUFTSwkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgVklWU19ERV9CV19DT05GSUdfQkxPQ0tfV0FMS19ESVJFQ1RJT05fX01BU0sJCTB4MDAwMDAwMTAKKyNkZWZpbmUgVklWU19ERV9CV19DT05GSUdfQkxPQ0tfV0FMS19ESVJFQ1RJT05fX1NISUZUCQk0CisjZGVmaW5lIFZJVlNfREVfQldfQ09ORklHX0JMT0NLX1dBTEtfRElSRUNUSU9OX1JJR0hUX0JPVFRPTQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQldfQ09ORklHX0JMT0NLX1dBTEtfRElSRUNUSU9OX0JPVFRPTV9SSUdIVAkweDAwMDAwMDEwCisjZGVmaW5lIFZJVlNfREVfQldfQ09ORklHX0JMT0NLX1dBTEtfRElSRUNUSU9OX01BU0sJCTB4MDAwMDAwODAKKyNkZWZpbmUgVklWU19ERV9CV19DT05GSUdfVElMRV9XQUxLX0RJUkVDVElPTl9fTUFTSwkJMHgwMDAwMDEwMAorI2RlZmluZSBWSVZTX0RFX0JXX0NPTkZJR19USUxFX1dBTEtfRElSRUNUSU9OX19TSElGVAkJOAorI2RlZmluZSBWSVZTX0RFX0JXX0NPTkZJR19USUxFX1dBTEtfRElSRUNUSU9OX1JJR0hUX0JPVFRPTQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQldfQ09ORklHX1RJTEVfV0FMS19ESVJFQ1RJT05fQk9UVE9NX1JJR0hUCTB4MDAwMDAxMDAKKyNkZWZpbmUgVklWU19ERV9CV19DT05GSUdfVElMRV9XQUxLX0RJUkVDVElPTl9NQVNLCQkweDAwMDAwODAwCisjZGVmaW5lIFZJVlNfREVfQldfQ09ORklHX1BJWEVMX1dBTEtfRElSRUNUSU9OX19NQVNLCQkweDAwMDAxMDAwCisjZGVmaW5lIFZJVlNfREVfQldfQ09ORklHX1BJWEVMX1dBTEtfRElSRUNUSU9OX19TSElGVAkJMTIKKyNkZWZpbmUgVklWU19ERV9CV19DT05GSUdfUElYRUxfV0FMS19ESVJFQ1RJT05fUklHSFRfQk9UVE9NCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CV19DT05GSUdfUElYRUxfV0FMS19ESVJFQ1RJT05fQk9UVE9NX1JJR0hUCTB4MDAwMDEwMDAKKyNkZWZpbmUgVklWU19ERV9CV19DT05GSUdfUElYRUxfV0FMS19ESVJFQ1RJT05fTUFTSwkJMHgwMDAwODAwMAorCisjZGVmaW5lIFZJVlNfREVfQldfQkxPQ0tfU0laRQkJCQkJMHgwMDAwMTJmNAorI2RlZmluZSBWSVZTX0RFX0JXX0JMT0NLX1NJWkVfV0lEVEhfX01BU0sJCQkweDAwMDBmZmZmCisjZGVmaW5lIFZJVlNfREVfQldfQkxPQ0tfU0laRV9XSURUSF9fU0hJRlQJCQkwCisjZGVmaW5lIFZJVlNfREVfQldfQkxPQ0tfU0laRV9XSURUSCh4KQkJCQkoKCh4KSA8PCBWSVZTX0RFX0JXX0JMT0NLX1NJWkVfV0lEVEhfX1NISUZUKSAmIFZJVlNfREVfQldfQkxPQ0tfU0laRV9XSURUSF9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9CV19CTE9DS19TSVpFX0hFSUdIVF9fTUFTSwkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgVklWU19ERV9CV19CTE9DS19TSVpFX0hFSUdIVF9fU0hJRlQJCQkxNgorI2RlZmluZSBWSVZTX0RFX0JXX0JMT0NLX1NJWkVfSEVJR0hUKHgpCQkJCSgoKHgpIDw8IFZJVlNfREVfQldfQkxPQ0tfU0laRV9IRUlHSFRfX1NISUZUKSAmIFZJVlNfREVfQldfQkxPQ0tfU0laRV9IRUlHSFRfX01BU0spCisKKyNkZWZpbmUgVklWU19ERV9CV19USUxFX1NJWkUJCQkJCTB4MDAwMDEyZjgKKyNkZWZpbmUgVklWU19ERV9CV19USUxFX1NJWkVfV0lEVEhfX01BU0sJCQkweDAwMDBmZmZmCisjZGVmaW5lIFZJVlNfREVfQldfVElMRV9TSVpFX1dJRFRIX19TSElGVAkJCTAKKyNkZWZpbmUgVklWU19ERV9CV19USUxFX1NJWkVfV0lEVEgoeCkJCQkJKCgoeCkgPDwgVklWU19ERV9CV19USUxFX1NJWkVfV0lEVEhfX1NISUZUKSAmIFZJVlNfREVfQldfVElMRV9TSVpFX1dJRFRIX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0JXX1RJTEVfU0laRV9IRUlHSFRfX01BU0sJCQkweGZmZmYwMDAwCisjZGVmaW5lIFZJVlNfREVfQldfVElMRV9TSVpFX0hFSUdIVF9fU0hJRlQJCQkxNgorI2RlZmluZSBWSVZTX0RFX0JXX1RJTEVfU0laRV9IRUlHSFQoeCkJCQkJKCgoeCkgPDwgVklWU19ERV9CV19USUxFX1NJWkVfSEVJR0hUX19TSElGVCkgJiBWSVZTX0RFX0JXX1RJTEVfU0laRV9IRUlHSFRfX01BU0spCisKKyNkZWZpbmUgVklWU19ERV9CV19CTE9DS19NQVNLCQkJCQkweDAwMDAxMmZjCisjZGVmaW5lIFZJVlNfREVfQldfQkxPQ0tfTUFTS19IT1JJWk9OVEFMX19NQVNLCQkJMHgwMDAwZmZmZgorI2RlZmluZSBWSVZTX0RFX0JXX0JMT0NLX01BU0tfSE9SSVpPTlRBTF9fU0hJRlQJCQkwCisjZGVmaW5lIFZJVlNfREVfQldfQkxPQ0tfTUFTS19IT1JJWk9OVEFMKHgpCQkJKCgoeCkgPDwgVklWU19ERV9CV19CTE9DS19NQVNLX0hPUklaT05UQUxfX1NISUZUKSAmIFZJVlNfREVfQldfQkxPQ0tfTUFTS19IT1JJWk9OVEFMX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0JXX0JMT0NLX01BU0tfVkVSVElDQUxfX01BU0sJCQkweGZmZmYwMDAwCisjZGVmaW5lIFZJVlNfREVfQldfQkxPQ0tfTUFTS19WRVJUSUNBTF9fU0hJRlQJCQkxNgorI2RlZmluZSBWSVZTX0RFX0JXX0JMT0NLX01BU0tfVkVSVElDQUwoeCkJCQkoKCh4KSA8PCBWSVZTX0RFX0JXX0JMT0NLX01BU0tfVkVSVElDQUxfX1NISUZUKSAmIFZJVlNfREVfQldfQkxPQ0tfTUFTS19WRVJUSUNBTF9fTUFTSykKKworI2RlZmluZSBWSVZTX0RFX1NSQ19FWF9DT05GSUcJCQkJCTB4MDAwMDEzMDAKKyNkZWZpbmUgVklWU19ERV9TUkNfRVhfQ09ORklHX01VTFRJX1RJTEVEX19NQVNLCQkJMHgwMDAwMDAwMQorI2RlZmluZSBWSVZTX0RFX1NSQ19FWF9DT05GSUdfTVVMVElfVElMRURfX1NISUZUCQkwCisjZGVmaW5lIFZJVlNfREVfU1JDX0VYX0NPTkZJR19NVUxUSV9USUxFRF9ESVNBQkxFCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfU1JDX0VYX0NPTkZJR19NVUxUSV9USUxFRF9FTkFCTEUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgVklWU19ERV9TUkNfRVhfQ09ORklHX1NVUEVSX1RJTEVEX19NQVNLCQkJMHgwMDAwMDAwOAorI2RlZmluZSBWSVZTX0RFX1NSQ19FWF9DT05GSUdfU1VQRVJfVElMRURfX1NISUZUCQkzCisjZGVmaW5lIFZJVlNfREVfU1JDX0VYX0NPTkZJR19TVVBFUl9USUxFRF9ESVNBQkxFCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfU1JDX0VYX0NPTkZJR19TVVBFUl9USUxFRF9FTkFCTEUJCTB4MDAwMDAwMDgKKyNkZWZpbmUgVklWU19ERV9TUkNfRVhfQ09ORklHX01JTk9SX1RJTEVEX19NQVNLCQkJMHgwMDAwMDEwMAorI2RlZmluZSBWSVZTX0RFX1NSQ19FWF9DT05GSUdfTUlOT1JfVElMRURfX1NISUZUCQk4CisjZGVmaW5lIFZJVlNfREVfU1JDX0VYX0NPTkZJR19NSU5PUl9USUxFRF9ESVNBQkxFCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfU1JDX0VYX0NPTkZJR19NSU5PUl9USUxFRF9FTkFCTEUJCTB4MDAwMDAxMDAKKworI2RlZmluZSBWSVZTX0RFX1NSQ19FWF9BRERSRVNTCQkJCQkweDAwMDAxMzA0CisKKyNkZWZpbmUgVklWU19ERV9ERV9NVUxUSV9TT1VSQ0UJCQkJCTB4MDAwMDEzMDgKKyNkZWZpbmUgVklWU19ERV9ERV9NVUxUSV9TT1VSQ0VfTUFYX1NPVVJDRV9fTUFTSwkJMHgwMDAwMDAwNworI2RlZmluZSBWSVZTX0RFX0RFX01VTFRJX1NPVVJDRV9NQVhfU09VUkNFX19TSElGVAkJMAorI2RlZmluZSBWSVZTX0RFX0RFX01VTFRJX1NPVVJDRV9NQVhfU09VUkNFKHgpCQkJKCgoeCkgPDwgVklWU19ERV9ERV9NVUxUSV9TT1VSQ0VfTUFYX1NPVVJDRV9fU0hJRlQpICYgVklWU19ERV9ERV9NVUxUSV9TT1VSQ0VfTUFYX1NPVVJDRV9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9ERV9NVUxUSV9TT1VSQ0VfSE9SSVpPTlRBTF9CTE9DS19fTUFTSwkJMHgwMDAwMDcwMAorI2RlZmluZSBWSVZTX0RFX0RFX01VTFRJX1NPVVJDRV9IT1JJWk9OVEFMX0JMT0NLX19TSElGVAkJOAorI2RlZmluZSBWSVZTX0RFX0RFX01VTFRJX1NPVVJDRV9IT1JJWk9OVEFMX0JMT0NLX1BJWEVMMTYJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0RFX01VTFRJX1NPVVJDRV9IT1JJWk9OVEFMX0JMT0NLX1BJWEVMMzIJMHgwMDAwMDEwMAorI2RlZmluZSBWSVZTX0RFX0RFX01VTFRJX1NPVVJDRV9IT1JJWk9OVEFMX0JMT0NLX1BJWEVMNjQJMHgwMDAwMDIwMAorI2RlZmluZSBWSVZTX0RFX0RFX01VTFRJX1NPVVJDRV9IT1JJWk9OVEFMX0JMT0NLX1BJWEVMMTI4CTB4MDAwMDAzMDAKKyNkZWZpbmUgVklWU19ERV9ERV9NVUxUSV9TT1VSQ0VfSE9SSVpPTlRBTF9CTE9DS19QSVhFTDI1NgkweDAwMDAwNDAwCisjZGVmaW5lIFZJVlNfREVfREVfTVVMVElfU09VUkNFX0hPUklaT05UQUxfQkxPQ0tfUElYRUw1MTIJMHgwMDAwMDUwMAorI2RlZmluZSBWSVZTX0RFX0RFX01VTFRJX1NPVVJDRV9WRVJUSUNBTF9CTE9DS19fTUFTSwkJMHgwMDA3MDAwMAorI2RlZmluZSBWSVZTX0RFX0RFX01VTFRJX1NPVVJDRV9WRVJUSUNBTF9CTE9DS19fU0hJRlQJCTE2CisjZGVmaW5lIFZJVlNfREVfREVfTVVMVElfU09VUkNFX1ZFUlRJQ0FMX0JMT0NLX0xJTkUxCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfREVfTVVMVElfU09VUkNFX1ZFUlRJQ0FMX0JMT0NLX0xJTkUyCQkweDAwMDEwMDAwCisjZGVmaW5lIFZJVlNfREVfREVfTVVMVElfU09VUkNFX1ZFUlRJQ0FMX0JMT0NLX0xJTkU0CQkweDAwMDIwMDAwCisjZGVmaW5lIFZJVlNfREVfREVfTVVMVElfU09VUkNFX1ZFUlRJQ0FMX0JMT0NLX0xJTkU4CQkweDAwMDMwMDAwCisjZGVmaW5lIFZJVlNfREVfREVfTVVMVElfU09VUkNFX1ZFUlRJQ0FMX0JMT0NLX0xJTkUxNgkJMHgwMDA0MDAwMAorI2RlZmluZSBWSVZTX0RFX0RFX01VTFRJX1NPVVJDRV9WRVJUSUNBTF9CTE9DS19MSU5FMzIJCTB4MDAwNTAwMDAKKyNkZWZpbmUgVklWU19ERV9ERV9NVUxUSV9TT1VSQ0VfVkVSVElDQUxfQkxPQ0tfTElORTY0CQkweDAwMDYwMDAwCisjZGVmaW5lIFZJVlNfREVfREVfTVVMVElfU09VUkNFX1ZFUlRJQ0FMX0JMT0NLX0xJTkUxMjgJCTB4MDAwNzAwMDAKKworI2RlZmluZSBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT04JCQkJMHgwMDAwMTMwYworI2RlZmluZSBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fRU5BQkxFX19NQVNLCQkJMHgwMDAwMDAwMworI2RlZmluZSBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fRU5BQkxFX19TSElGVAkJCTAKKyNkZWZpbmUgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX0VOQUJMRV9PRkYJCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9FTkFCTEVfUExBTkUxCQkJMHgwMDAwMDAwMQorI2RlZmluZSBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fRU5BQkxFX1BMQU5FMgkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX0VOQUJMRV9QTEFORTMJCQkweDAwMDAwMDAzCisjZGVmaW5lIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTFfQ09VTlRfX01BU0sJCTB4MDAwMDAwMGMKKyNkZWZpbmUgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FMV9DT1VOVF9fU0hJRlQJCTIKKyNkZWZpbmUgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FMV9DT1VOVCh4KQkJKCgoeCkgPDwgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FMV9DT1VOVF9fU0hJRlQpICYgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FMV9DT1VOVF9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FMl9DT1VOVF9fTUFTSwkJMHgwMDAwMDAzMAorI2RlZmluZSBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUyX0NPVU5UX19TSElGVAkJNAorI2RlZmluZSBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUyX0NPVU5UKHgpCQkoKCh4KSA8PCBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUyX0NPVU5UX19TSElGVCkgJiBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUyX0NPVU5UX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUzX0NPVU5UX19NQVNLCQkweDAwMDAwMGMwCisjZGVmaW5lIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTNfQ09VTlRfX1NISUZUCQk2CisjZGVmaW5lIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTNfQ09VTlQoeCkJCSgoKHgpIDw8IFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTNfQ09VTlRfX1NISUZUKSAmIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTNfQ09VTlRfX01BU0spCisjZGVmaW5lIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTFfU1dJWlpMRV9CX19NQVNLCQkweDAwMDAwMzAwCisjZGVmaW5lIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTFfU1dJWlpMRV9CX19TSElGVAk4CisjZGVmaW5lIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTFfU1dJWlpMRV9CKHgpCQkoKCh4KSA8PCBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUxX1NXSVpaTEVfQl9fU0hJRlQpICYgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FMV9TV0laWkxFX0JfX01BU0spCisjZGVmaW5lIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTFfU1dJWlpMRV9HX19NQVNLCQkweDAwMDAwYzAwCisjZGVmaW5lIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTFfU1dJWlpMRV9HX19TSElGVAkxMAorI2RlZmluZSBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUxX1NXSVpaTEVfRyh4KQkJKCgoeCkgPDwgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FMV9TV0laWkxFX0dfX1NISUZUKSAmIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTFfU1dJWlpMRV9HX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUxX1NXSVpaTEVfUl9fTUFTSwkJMHgwMDAwMzAwMAorI2RlZmluZSBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUxX1NXSVpaTEVfUl9fU0hJRlQJMTIKKyNkZWZpbmUgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FMV9TV0laWkxFX1IoeCkJCSgoKHgpIDw8IFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTFfU1dJWlpMRV9SX19TSElGVCkgJiBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUxX1NXSVpaTEVfUl9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FMV9TV0laWkxFX0FfX01BU0sJCTB4MDAwMGMwMDAKKyNkZWZpbmUgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FMV9TV0laWkxFX0FfX1NISUZUCTE0CisjZGVmaW5lIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTFfU1dJWlpMRV9BKHgpCQkoKCh4KSA8PCBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUxX1NXSVpaTEVfQV9fU0hJRlQpICYgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FMV9TV0laWkxFX0FfX01BU0spCisjZGVmaW5lIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTJfU1dJWlpMRV9CX19NQVNLCQkweDAwMDMwMDAwCisjZGVmaW5lIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTJfU1dJWlpMRV9CX19TSElGVAkxNgorI2RlZmluZSBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUyX1NXSVpaTEVfQih4KQkJKCgoeCkgPDwgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FMl9TV0laWkxFX0JfX1NISUZUKSAmIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTJfU1dJWlpMRV9CX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUyX1NXSVpaTEVfR19fTUFTSwkJMHgwMDBjMDAwMAorI2RlZmluZSBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUyX1NXSVpaTEVfR19fU0hJRlQJMTgKKyNkZWZpbmUgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FMl9TV0laWkxFX0coeCkJCSgoKHgpIDw8IFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTJfU1dJWlpMRV9HX19TSElGVCkgJiBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUyX1NXSVpaTEVfR19fTUFTSykKKyNkZWZpbmUgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FMl9TV0laWkxFX1JfX01BU0sJCTB4MDAzMDAwMDAKKyNkZWZpbmUgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FMl9TV0laWkxFX1JfX1NISUZUCTIwCisjZGVmaW5lIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTJfU1dJWlpMRV9SKHgpCQkoKCh4KSA8PCBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUyX1NXSVpaTEVfUl9fU0hJRlQpICYgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FMl9TV0laWkxFX1JfX01BU0spCisjZGVmaW5lIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTJfU1dJWlpMRV9BX19NQVNLCQkweDAwYzAwMDAwCisjZGVmaW5lIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTJfU1dJWlpMRV9BX19TSElGVAkyMgorI2RlZmluZSBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUyX1NXSVpaTEVfQSh4KQkJKCgoeCkgPDwgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FMl9TV0laWkxFX0FfX1NISUZUKSAmIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTJfU1dJWlpMRV9BX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUzX1NXSVpaTEVfQl9fTUFTSwkJMHgwMzAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUzX1NXSVpaTEVfQl9fU0hJRlQJMjQKKyNkZWZpbmUgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FM19TV0laWkxFX0IoeCkJCSgoKHgpIDw8IFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTNfU1dJWlpMRV9CX19TSElGVCkgJiBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUzX1NXSVpaTEVfQl9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FM19TV0laWkxFX0dfX01BU0sJCTB4MGMwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FM19TV0laWkxFX0dfX1NISUZUCTI2CisjZGVmaW5lIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTNfU1dJWlpMRV9HKHgpCQkoKCh4KSA8PCBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUzX1NXSVpaTEVfR19fU0hJRlQpICYgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FM19TV0laWkxFX0dfX01BU0spCisjZGVmaW5lIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTNfU1dJWlpMRV9SX19NQVNLCQkweDMwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTNfU1dJWlpMRV9SX19TSElGVAkyOAorI2RlZmluZSBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUzX1NXSVpaTEVfUih4KQkJKCgoeCkgPDwgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FM19TV0laWkxFX1JfX1NISUZUKSAmIFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTNfU1dJWlpMRV9SX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUzX1NXSVpaTEVfQV9fTUFTSwkJMHhjMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUzX1NXSVpaTEVfQV9fU0hJRlQJMzAKKyNkZWZpbmUgVklWU19ERV9ERVlVVl9DT05WRVJTSU9OX1BMQU5FM19TV0laWkxFX0EoeCkJCSgoKHgpIDw8IFZJVlNfREVfREVZVVZfQ09OVkVSU0lPTl9QTEFORTNfU1dJWlpMRV9BX19TSElGVCkgJiBWSVZTX0RFX0RFWVVWX0NPTlZFUlNJT05fUExBTkUzX1NXSVpaTEVfQV9fTUFTSykKKworI2RlZmluZSBWSVZTX0RFX0RFX1BMQU5FMl9BRERSRVNTCQkJCTB4MDAwMDEzMTAKKworI2RlZmluZSBWSVZTX0RFX0RFX1BMQU5FMl9TVFJJREUJCQkJMHgwMDAwMTMxNAorI2RlZmluZSBWSVZTX0RFX0RFX1BMQU5FMl9TVFJJREVfU1RSSURFX19NQVNLCQkJMHgwMDAzZmZmZgorI2RlZmluZSBWSVZTX0RFX0RFX1BMQU5FMl9TVFJJREVfU1RSSURFX19TSElGVAkJCTAKKyNkZWZpbmUgVklWU19ERV9ERV9QTEFORTJfU1RSSURFX1NUUklERSh4KQkJCSgoKHgpIDw8IFZJVlNfREVfREVfUExBTkUyX1NUUklERV9TVFJJREVfX1NISUZUKSAmIFZJVlNfREVfREVfUExBTkUyX1NUUklERV9TVFJJREVfX01BU0spCisKKyNkZWZpbmUgVklWU19ERV9ERV9QTEFORTNfQUREUkVTUwkJCQkweDAwMDAxMzE4CisKKyNkZWZpbmUgVklWU19ERV9ERV9QTEFORTNfU1RSSURFCQkJCTB4MDAwMDEzMWMKKyNkZWZpbmUgVklWU19ERV9ERV9QTEFORTNfU1RSSURFX1NUUklERV9fTUFTSwkJCTB4MDAwM2ZmZmYKKyNkZWZpbmUgVklWU19ERV9ERV9QTEFORTNfU1RSSURFX1NUUklERV9fU0hJRlQJCQkwCisjZGVmaW5lIFZJVlNfREVfREVfUExBTkUzX1NUUklERV9TVFJJREUoeCkJCQkoKCh4KSA8PCBWSVZTX0RFX0RFX1BMQU5FM19TVFJJREVfU1RSSURFX19TSElGVCkgJiBWSVZTX0RFX0RFX1BMQU5FM19TVFJJREVfU1RSSURFX19NQVNLKQorCisjZGVmaW5lIFZJVlNfREVfREVfU1RBTExfREUJCQkJCTB4MDAwMDEzMjAKKyNkZWZpbmUgVklWU19ERV9ERV9TVEFMTF9ERV9FTkFCTEVfX01BU0sJCQkweDAwMDAwMDAxCisjZGVmaW5lIFZJVlNfREVfREVfU1RBTExfREVfRU5BQkxFX19TSElGVAkJCTAKKyNkZWZpbmUgVklWU19ERV9ERV9TVEFMTF9ERV9FTkFCTEVfRElTQUJMRQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9ERV9TVEFMTF9ERV9FTkFCTEVfRU5BQkxFCQkJMHgwMDAwMDAwMQorCisjZGVmaW5lIFZJVlNfREVfRklMVEVSX0tFUk5FTChpMCkJCQkgICAgICAgKDB4MDAwMDE4MDAgKyAweDQqKGkwKSkKKyNkZWZpbmUgVklWU19ERV9GSUxURVJfS0VSTkVMX19FU0laRQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfRklMVEVSX0tFUk5FTF9fTEVOCQkJCTB4MDAwMDAwODAKKyNkZWZpbmUgVklWU19ERV9GSUxURVJfS0VSTkVMX0NPRUZGSUNJRU5UMF9fTUFTSwkJMHgwMDAwZmZmZgorI2RlZmluZSBWSVZTX0RFX0ZJTFRFUl9LRVJORUxfQ09FRkZJQ0lFTlQwX19TSElGVAkJMAorI2RlZmluZSBWSVZTX0RFX0ZJTFRFUl9LRVJORUxfQ09FRkZJQ0lFTlQwKHgpCQkJKCgoeCkgPDwgVklWU19ERV9GSUxURVJfS0VSTkVMX0NPRUZGSUNJRU5UMF9fU0hJRlQpICYgVklWU19ERV9GSUxURVJfS0VSTkVMX0NPRUZGSUNJRU5UMF9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9GSUxURVJfS0VSTkVMX0NPRUZGSUNJRU5UMV9fTUFTSwkJMHhmZmZmMDAwMAorI2RlZmluZSBWSVZTX0RFX0ZJTFRFUl9LRVJORUxfQ09FRkZJQ0lFTlQxX19TSElGVAkJMTYKKyNkZWZpbmUgVklWU19ERV9GSUxURVJfS0VSTkVMX0NPRUZGSUNJRU5UMSh4KQkJCSgoKHgpIDw8IFZJVlNfREVfRklMVEVSX0tFUk5FTF9DT0VGRklDSUVOVDFfX1NISUZUKSAmIFZJVlNfREVfRklMVEVSX0tFUk5FTF9DT0VGRklDSUVOVDFfX01BU0spCisKKyNkZWZpbmUgVklWU19ERV9JTkRFWF9DT0xPUl9UQUJMRShpMCkJCQkgICAgICAgKDB4MDAwMDFjMDAgKyAweDQqKGkwKSkKKyNkZWZpbmUgVklWU19ERV9JTkRFWF9DT0xPUl9UQUJMRV9fRVNJWkUJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfSU5ERVhfQ09MT1JfVEFCTEVfX0xFTgkJCQkweDAwMDAwMTAwCisKKyNkZWZpbmUgVklWU19ERV9IT1JJX0ZJTFRFUl9LRVJORUwoaTApCQkJICAgICAgICgweDAwMDAyODAwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfSE9SSV9GSUxURVJfS0VSTkVMX19FU0laRQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19ERV9IT1JJX0ZJTFRFUl9LRVJORUxfX0xFTgkJCQkweDAwMDAwMDgwCisjZGVmaW5lIFZJVlNfREVfSE9SSV9GSUxURVJfS0VSTkVMX0NPRUZGSUNJRU5UMF9fTUFTSwkJMHgwMDAwZmZmZgorI2RlZmluZSBWSVZTX0RFX0hPUklfRklMVEVSX0tFUk5FTF9DT0VGRklDSUVOVDBfX1NISUZUCQkwCisjZGVmaW5lIFZJVlNfREVfSE9SSV9GSUxURVJfS0VSTkVMX0NPRUZGSUNJRU5UMCh4KQkJKCgoeCkgPDwgVklWU19ERV9IT1JJX0ZJTFRFUl9LRVJORUxfQ09FRkZJQ0lFTlQwX19TSElGVCkgJiBWSVZTX0RFX0hPUklfRklMVEVSX0tFUk5FTF9DT0VGRklDSUVOVDBfX01BU0spCisjZGVmaW5lIFZJVlNfREVfSE9SSV9GSUxURVJfS0VSTkVMX0NPRUZGSUNJRU5UMV9fTUFTSwkJMHhmZmZmMDAwMAorI2RlZmluZSBWSVZTX0RFX0hPUklfRklMVEVSX0tFUk5FTF9DT0VGRklDSUVOVDFfX1NISUZUCQkxNgorI2RlZmluZSBWSVZTX0RFX0hPUklfRklMVEVSX0tFUk5FTF9DT0VGRklDSUVOVDEoeCkJCSgoKHgpIDw8IFZJVlNfREVfSE9SSV9GSUxURVJfS0VSTkVMX0NPRUZGSUNJRU5UMV9fU0hJRlQpICYgVklWU19ERV9IT1JJX0ZJTFRFUl9LRVJORUxfQ09FRkZJQ0lFTlQxX19NQVNLKQorCisjZGVmaW5lIFZJVlNfREVfVkVSVElfRklMVEVSX0tFUk5FTChpMCkJCQkgICAgICAgKDB4MDAwMDJhMDAgKyAweDQqKGkwKSkKKyNkZWZpbmUgVklWU19ERV9WRVJUSV9GSUxURVJfS0VSTkVMX19FU0laRQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19ERV9WRVJUSV9GSUxURVJfS0VSTkVMX19MRU4JCQkweDAwMDAwMDgwCisjZGVmaW5lIFZJVlNfREVfVkVSVElfRklMVEVSX0tFUk5FTF9DT0VGRklDSUVOVDBfX01BU0sJCTB4MDAwMGZmZmYKKyNkZWZpbmUgVklWU19ERV9WRVJUSV9GSUxURVJfS0VSTkVMX0NPRUZGSUNJRU5UMF9fU0hJRlQJCTAKKyNkZWZpbmUgVklWU19ERV9WRVJUSV9GSUxURVJfS0VSTkVMX0NPRUZGSUNJRU5UMCh4KQkJKCgoeCkgPDwgVklWU19ERV9WRVJUSV9GSUxURVJfS0VSTkVMX0NPRUZGSUNJRU5UMF9fU0hJRlQpICYgVklWU19ERV9WRVJUSV9GSUxURVJfS0VSTkVMX0NPRUZGSUNJRU5UMF9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9WRVJUSV9GSUxURVJfS0VSTkVMX0NPRUZGSUNJRU5UMV9fTUFTSwkJMHhmZmZmMDAwMAorI2RlZmluZSBWSVZTX0RFX1ZFUlRJX0ZJTFRFUl9LRVJORUxfQ09FRkZJQ0lFTlQxX19TSElGVAkJMTYKKyNkZWZpbmUgVklWU19ERV9WRVJUSV9GSUxURVJfS0VSTkVMX0NPRUZGSUNJRU5UMSh4KQkJKCgoeCkgPDwgVklWU19ERV9WRVJUSV9GSUxURVJfS0VSTkVMX0NPRUZGSUNJRU5UMV9fU0hJRlQpICYgVklWU19ERV9WRVJUSV9GSUxURVJfS0VSTkVMX0NPRUZGSUNJRU5UMV9fTUFTSykKKworI2RlZmluZSBWSVZTX0RFX0lOREVYX0NPTE9SX1RBQkxFMzIoaTApCQkJICAgICAgICgweDAwMDAzNDAwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfSU5ERVhfQ09MT1JfVEFCTEUzMl9fRVNJWkUJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfSU5ERVhfQ09MT1JfVEFCTEUzMl9fTEVOCQkJMHgwMDAwMDEwMAorCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0CQkJCQkJMHgwMDAwMDAwMAorCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19BRERSRVNTKGkwKQkJCSAgICAgICAoMHgwMDAxMjgwMCArIDB4NCooaTApKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfQUREUkVTU19fRVNJWkUJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19BRERSRVNTX19MRU4JCQkJMHgwMDAwMDAwNAorCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19TVFJJREUoaTApCQkJICAgICAgICgweDAwMDEyODEwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19TVFJJREVfX0VTSVpFCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfU1RSSURFX19MRU4JCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfU1RSSURFX1NUUklERV9fTUFTSwkJCTB4MDAwM2ZmZmYKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX1NUUklERV9TVFJJREVfX1NISUZUCQkJMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfU1RSSURFX1NUUklERSh4KQkJCSgoKHgpIDw8IFZJVlNfREVfQkxPQ0s0X1NSQ19TVFJJREVfU1RSSURFX19TSElGVCkgJiBWSVZTX0RFX0JMT0NLNF9TUkNfU1RSSURFX1NUUklERV9fTUFTSykKKworI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfUk9UQVRJT05fQ09ORklHKGkwKQkJICAgICAgICgweDAwMDEyODIwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19ST1RBVElPTl9DT05GSUdfX0VTSVpFCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19ST1RBVElPTl9DT05GSUdfX0xFTgkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX1JPVEFUSU9OX0NPTkZJR19XSURUSF9fTUFTSwkJMHgwMDAwZmZmZgorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfUk9UQVRJT05fQ09ORklHX1dJRFRIX19TSElGVAkJMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfUk9UQVRJT05fQ09ORklHX1dJRFRIKHgpCQkoKCh4KSA8PCBWSVZTX0RFX0JMT0NLNF9TUkNfUk9UQVRJT05fQ09ORklHX1dJRFRIX19TSElGVCkgJiBWSVZTX0RFX0JMT0NLNF9TUkNfUk9UQVRJT05fQ09ORklHX1dJRFRIX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfUk9UQVRJT05fQ09ORklHX1JPVEFUSU9OX19NQVNLCTB4MDAwMTAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX1JPVEFUSU9OX0NPTkZJR19ST1RBVElPTl9fU0hJRlQJMTYKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX1JPVEFUSU9OX0NPTkZJR19ST1RBVElPTl9ESVNBQkxFCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX1JPVEFUSU9OX0NPTkZJR19ST1RBVElPTl9FTkFCTEUJMHgwMDAxMDAwMAorCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19DT05GSUcoaTApCQkJICAgICAgICgweDAwMDEyODMwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19DT05GSUdfX0VTSVpFCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfQ09ORklHX19MRU4JCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfQ09ORklHX1BFMTBfU09VUkNFX0ZPUk1BVF9fTUFTSwkweDAwMDAwMDBmCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19DT05GSUdfUEUxMF9TT1VSQ0VfRk9STUFUX19TSElGVAkwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19DT05GSUdfUEUxMF9TT1VSQ0VfRk9STUFUKHgpCQkoKCh4KSA8PCBWSVZTX0RFX0JMT0NLNF9TUkNfQ09ORklHX1BFMTBfU09VUkNFX0ZPUk1BVF9fU0hJRlQpICYgVklWU19ERV9CTE9DSzRfU1JDX0NPTkZJR19QRTEwX1NPVVJDRV9GT1JNQVRfX01BU0spCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19DT05GSUdfVFJBTlNQQVJFTkNZX19NQVNLCQkweDAwMDAwMDMwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19DT05GSUdfVFJBTlNQQVJFTkNZX19TSElGVAkJNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfQ09ORklHX1RSQU5TUEFSRU5DWSh4KQkJKCgoeCkgPDwgVklWU19ERV9CTE9DSzRfU1JDX0NPTkZJR19UUkFOU1BBUkVOQ1lfX1NISUZUKSAmIFZJVlNfREVfQkxPQ0s0X1NSQ19DT05GSUdfVFJBTlNQQVJFTkNZX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfQ09ORklHX1NSQ19SRUxBVElWRV9fTUFTSwkJMHgwMDAwMDA0MAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfQ09ORklHX1NSQ19SRUxBVElWRV9fU0hJRlQJCTYKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX0NPTkZJR19TUkNfUkVMQVRJVkVfQUJTT0xVVEUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX0NPTkZJR19TUkNfUkVMQVRJVkVfUkVMQVRJVkUJCTB4MDAwMDAwNDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX0NPTkZJR19USUxFRF9fTUFTSwkJCTB4MDAwMDAwODAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX0NPTkZJR19USUxFRF9fU0hJRlQJCQk3CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19DT05GSUdfVElMRURfRElTQUJMRQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX0NPTkZJR19USUxFRF9FTkFCTEUJCQkweDAwMDAwMDgwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19DT05GSUdfTE9DQVRJT05fX01BU0sJCTB4MDAwMDAxMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX0NPTkZJR19MT0NBVElPTl9fU0hJRlQJCTgKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX0NPTkZJR19MT0NBVElPTl9NRU1PUlkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX0NPTkZJR19MT0NBVElPTl9TVFJFQU0JCTB4MDAwMDAxMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX0NPTkZJR19QQUNLX19NQVNLCQkJMHgwMDAwMzAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfQ09ORklHX1BBQ0tfX1NISUZUCQkJMTIKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX0NPTkZJR19QQUNLX1BBQ0tFRDgJCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19DT05GSUdfUEFDS19QQUNLRUQxNgkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX0NPTkZJR19QQUNLX1BBQ0tFRDMyCQkJMHgwMDAwMjAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfQ09ORklHX1BBQ0tfVU5QQUNLRUQJCQkweDAwMDAzMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19DT05GSUdfTU9OT19UUkFOU1BBUkVOQ1lfX01BU0sJMHgwMDAwODAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfQ09ORklHX01PTk9fVFJBTlNQQVJFTkNZX19TSElGVAkxNQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfQ09ORklHX01PTk9fVFJBTlNQQVJFTkNZX0JBQ0tHUk9VTkQJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfQ09ORklHX01PTk9fVFJBTlNQQVJFTkNZX0ZPUkVHUk9VTkQJMHgwMDAwODAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfQ09ORklHX1VOSzE2CQkJCTB4MDAwMTAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX0NPTkZJR19TV0laWkxFX19NQVNLCQkJMHgwMDMwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfQ09ORklHX1NXSVpaTEVfX1NISUZUCQkyMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfQ09ORklHX1NXSVpaTEUoeCkJCQkoKCh4KSA8PCBWSVZTX0RFX0JMT0NLNF9TUkNfQ09ORklHX1NXSVpaTEVfX1NISUZUKSAmIFZJVlNfREVfQkxPQ0s0X1NSQ19DT05GSUdfU1dJWlpMRV9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX0NPTkZJR19TT1VSQ0VfRk9STUFUX19NQVNLCQkweDFmMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19DT05GSUdfU09VUkNFX0ZPUk1BVF9fU0hJRlQJCTI0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19DT05GSUdfU09VUkNFX0ZPUk1BVCh4KQkJKCgoeCkgPDwgVklWU19ERV9CTE9DSzRfU1JDX0NPTkZJR19TT1VSQ0VfRk9STUFUX19TSElGVCkgJiBWSVZTX0RFX0JMT0NLNF9TUkNfQ09ORklHX1NPVVJDRV9GT1JNQVRfX01BU0spCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19DT05GSUdfRElTQUJMRTQyMF9MMl9DQUNIRQkJMHgyMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfQ09ORklHX0VORElBTl9DT05UUk9MX19NQVNLCQkweGMwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19DT05GSUdfRU5ESUFOX0NPTlRST0xfX1NISUZUCQkzMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfQ09ORklHX0VORElBTl9DT05UUk9MKHgpCQkoKCh4KSA8PCBWSVZTX0RFX0JMT0NLNF9TUkNfQ09ORklHX0VORElBTl9DT05UUk9MX19TSElGVCkgJiBWSVZTX0RFX0JMT0NLNF9TUkNfQ09ORklHX0VORElBTl9DT05UUk9MX19NQVNLKQorCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19PUklHSU4oaTApCQkJICAgICAgICgweDAwMDEyODQwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19PUklHSU5fX0VTSVpFCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfT1JJR0lOX19MRU4JCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfT1JJR0lOX1hfX01BU0sJCQkweDAwMDBmZmZmCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19PUklHSU5fWF9fU0hJRlQJCQkwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19PUklHSU5fWCh4KQkJCQkoKCh4KSA8PCBWSVZTX0RFX0JMT0NLNF9TUkNfT1JJR0lOX1hfX1NISUZUKSAmIFZJVlNfREVfQkxPQ0s0X1NSQ19PUklHSU5fWF9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX09SSUdJTl9ZX19NQVNLCQkJMHhmZmZmMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfT1JJR0lOX1lfX1NISUZUCQkJMTYKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX09SSUdJTl9ZKHgpCQkJCSgoKHgpIDw8IFZJVlNfREVfQkxPQ0s0X1NSQ19PUklHSU5fWV9fU0hJRlQpICYgVklWU19ERV9CTE9DSzRfU1JDX09SSUdJTl9ZX19NQVNLKQorCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19TSVpFKGkwKQkJCSAgICAgICAoMHgwMDAxMjg1MCArIDB4NCooaTApKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfU0laRV9fRVNJWkUJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfU0laRV9fTEVOCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX1NJWkVfWF9fTUFTSwkJCQkweDAwMDBmZmZmCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19TSVpFX1hfX1NISUZUCQkJMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfU0laRV9YKHgpCQkJCSgoKHgpIDw8IFZJVlNfREVfQkxPQ0s0X1NSQ19TSVpFX1hfX1NISUZUKSAmIFZJVlNfREVfQkxPQ0s0X1NSQ19TSVpFX1hfX01BU0spCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19TSVpFX1lfX01BU0sJCQkJMHhmZmZmMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfU0laRV9ZX19TSElGVAkJCTE2CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19TSVpFX1koeCkJCQkJKCgoeCkgPDwgVklWU19ERV9CTE9DSzRfU1JDX1NJWkVfWV9fU0hJRlQpICYgVklWU19ERV9CTE9DSzRfU1JDX1NJWkVfWV9fTUFTSykKKworI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfQ09MT1JfQkcoaTApCQkJICAgICAgICgweDAwMDEyODYwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19DT0xPUl9CR19fRVNJWkUJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19DT0xPUl9CR19fTEVOCQkJMHgwMDAwMDAwNAorCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1JPUChpMCkJCQkJICAgICAgICgweDAwMDEyODcwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1JPUF9fRVNJWkUJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9ST1BfX0xFTgkJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9ST1BfUk9QX0ZHX19NQVNLCQkJCTB4MDAwMDAwZmYKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfUk9QX1JPUF9GR19fU0hJRlQJCQkwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1JPUF9ST1BfRkcoeCkJCQkJKCgoeCkgPDwgVklWU19ERV9CTE9DSzRfUk9QX1JPUF9GR19fU0hJRlQpICYgVklWU19ERV9CTE9DSzRfUk9QX1JPUF9GR19fTUFTSykKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfUk9QX1JPUF9CR19fTUFTSwkJCQkweDAwMDBmZjAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1JPUF9ST1BfQkdfX1NISUZUCQkJOAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9ST1BfUk9QX0JHKHgpCQkJCSgoKHgpIDw8IFZJVlNfREVfQkxPQ0s0X1JPUF9ST1BfQkdfX1NISUZUKSAmIFZJVlNfREVfQkxPQ0s0X1JPUF9ST1BfQkdfX01BU0spCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1JPUF9UWVBFX19NQVNLCQkJCTB4MDAzMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfUk9QX1RZUEVfX1NISUZUCQkJCTIwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1JPUF9UWVBFX1JPUDJfUEFUVEVSTgkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfUk9QX1RZUEVfUk9QMl9TT1VSQ0UJCQkweDAwMTAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1JPUF9UWVBFX1JPUDMJCQkJMHgwMDIwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9ST1BfVFlQRV9ST1A0CQkJCTB4MDAzMDAwMDAKKworI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BTFBIQV9DT05UUk9MKGkwKQkJICAgICAgICgweDAwMDEyODgwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FMUEhBX0NPTlRST0xfX0VTSVpFCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BTFBIQV9DT05UUk9MX19MRU4JCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FMUEhBX0NPTlRST0xfRU5BQkxFX19NQVNLCQkweDAwMDAwMDAxCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FMUEhBX0NPTlRST0xfRU5BQkxFX19TSElGVAkJMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BTFBIQV9DT05UUk9MX0VOQUJMRV9PRkYJCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FMUEhBX0NPTlRST0xfRU5BQkxFX09OCQkJMHgwMDAwMDAwMQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BTFBIQV9DT05UUk9MX1BFMTBfR0xPQkFMX1NSQ19BTFBIQV9fTUFTSwkweDAwZmYwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FMUEhBX0NPTlRST0xfUEUxMF9HTE9CQUxfU1JDX0FMUEhBX19TSElGVAkxNgorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BTFBIQV9DT05UUk9MX1BFMTBfR0xPQkFMX1NSQ19BTFBIQSh4KQkoKCh4KSA8PCBWSVZTX0RFX0JMT0NLNF9BTFBIQV9DT05UUk9MX1BFMTBfR0xPQkFMX1NSQ19BTFBIQV9fU0hJRlQpICYgVklWU19ERV9CTE9DSzRfQUxQSEFfQ09OVFJPTF9QRTEwX0dMT0JBTF9TUkNfQUxQSEFfX01BU0spCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FMUEhBX0NPTlRST0xfUEUxMF9HTE9CQUxfRFNUX0FMUEhBX19NQVNLCTB4ZmYwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQUxQSEFfQ09OVFJPTF9QRTEwX0dMT0JBTF9EU1RfQUxQSEFfX1NISUZUCTI0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FMUEhBX0NPTlRST0xfUEUxMF9HTE9CQUxfRFNUX0FMUEhBKHgpCSgoKHgpIDw8IFZJVlNfREVfQkxPQ0s0X0FMUEhBX0NPTlRST0xfUEUxMF9HTE9CQUxfRFNUX0FMUEhBX19TSElGVCkgJiBWSVZTX0RFX0JMT0NLNF9BTFBIQV9DT05UUk9MX1BFMTBfR0xPQkFMX0RTVF9BTFBIQV9fTUFTSykKKworI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BTFBIQV9NT0RFUyhpMCkJCQkgICAgICAgKDB4MDAwMTI4OTAgKyAweDQqKGkwKSkKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQUxQSEFfTU9ERVNfX0VTSVpFCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BTFBIQV9NT0RFU19fTEVOCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQUxQSEFfTU9ERVNfU1JDX0FMUEhBX01PREVfX01BU0sJCTB4MDAwMDAwMDEKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQUxQSEFfTU9ERVNfU1JDX0FMUEhBX01PREVfX1NISUZUCTAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQUxQSEFfTU9ERVNfU1JDX0FMUEhBX01PREVfTk9STUFMCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQUxQSEFfTU9ERVNfU1JDX0FMUEhBX01PREVfSU5WRVJTRUQJMHgwMDAwMDAwMQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BTFBIQV9NT0RFU19EU1RfQUxQSEFfTU9ERV9fTUFTSwkJMHgwMDAwMDAxMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BTFBIQV9NT0RFU19EU1RfQUxQSEFfTU9ERV9fU0hJRlQJNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BTFBIQV9NT0RFU19EU1RfQUxQSEFfTU9ERV9OT1JNQUwJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BTFBIQV9NT0RFU19EU1RfQUxQSEFfTU9ERV9JTlZFUlNFRAkweDAwMDAwMDEwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FMUEhBX01PREVTX0dMT0JBTF9TUkNfQUxQSEFfTU9ERV9fTUFTSwkweDAwMDAwMzAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FMUEhBX01PREVTX0dMT0JBTF9TUkNfQUxQSEFfTU9ERV9fU0hJRlQJOAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BTFBIQV9NT0RFU19HTE9CQUxfU1JDX0FMUEhBX01PREVfTk9STUFMCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQUxQSEFfTU9ERVNfR0xPQkFMX1NSQ19BTFBIQV9NT0RFX0dMT0JBTAkweDAwMDAwMTAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FMUEhBX01PREVTX0dMT0JBTF9TUkNfQUxQSEFfTU9ERV9TQ0FMRUQJMHgwMDAwMDIwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BTFBIQV9NT0RFU19HTE9CQUxfRFNUX0FMUEhBX01PREVfX01BU0sJMHgwMDAwMzAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BTFBIQV9NT0RFU19HTE9CQUxfRFNUX0FMUEhBX01PREVfX1NISUZUCTEyCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FMUEhBX01PREVTX0dMT0JBTF9EU1RfQUxQSEFfTU9ERV9OT1JNQUwJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BTFBIQV9NT0RFU19HTE9CQUxfRFNUX0FMUEhBX01PREVfR0xPQkFMCTB4MDAwMDEwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQUxQSEFfTU9ERVNfR0xPQkFMX0RTVF9BTFBIQV9NT0RFX1NDQUxFRAkweDAwMDAyMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FMUEhBX01PREVTX1BFMTBfU1JDX0NPTE9SX01VTFRJUExZX19NQVNLCTB4MDAwMTAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQUxQSEFfTU9ERVNfUEUxMF9TUkNfQ09MT1JfTVVMVElQTFlfX1NISUZUCTE2CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FMUEhBX01PREVTX1BFMTBfU1JDX0NPTE9SX01VTFRJUExZX0RJU0FCTEUJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BTFBIQV9NT0RFU19QRTEwX1NSQ19DT0xPUl9NVUxUSVBMWV9FTkFCTEUJMHgwMDAxMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BTFBIQV9NT0RFU19QRTEwX0RTVF9DT0xPUl9NVUxUSVBMWV9fTUFTSwkweDAwMTAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FMUEhBX01PREVTX1BFMTBfRFNUX0NPTE9SX01VTFRJUExZX19TSElGVAkyMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BTFBIQV9NT0RFU19QRTEwX0RTVF9DT0xPUl9NVUxUSVBMWV9ESVNBQkxFCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQUxQSEFfTU9ERVNfUEUxMF9EU1RfQ09MT1JfTVVMVElQTFlfRU5BQkxFCTB4MDAxMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQUxQSEFfTU9ERVNfU1JDX0JMRU5ESU5HX01PREVfX01BU0sJMHgwNzAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BTFBIQV9NT0RFU19TUkNfQkxFTkRJTkdfTU9ERV9fU0hJRlQJMjQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQUxQSEFfTU9ERVNfU1JDX0JMRU5ESU5HX01PREUoeCkJCSgoKHgpIDw8IFZJVlNfREVfQkxPQ0s0X0FMUEhBX01PREVTX1NSQ19CTEVORElOR19NT0RFX19TSElGVCkgJiBWSVZTX0RFX0JMT0NLNF9BTFBIQV9NT0RFU19TUkNfQkxFTkRJTkdfTU9ERV9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQUxQSEFfTU9ERVNfU1JDX0FMUEhBX0ZBQ1RPUl9fTUFTSwkweDA4MDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FMUEhBX01PREVTX1NSQ19BTFBIQV9GQUNUT1JfX1NISUZUCTI3CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FMUEhBX01PREVTX1NSQ19BTFBIQV9GQUNUT1JfRElTQUJMRQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FMUEhBX01PREVTX1NSQ19BTFBIQV9GQUNUT1JfRU5BQkxFCTB4MDgwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQUxQSEFfTU9ERVNfRFNUX0JMRU5ESU5HX01PREVfX01BU0sJMHg3MDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BTFBIQV9NT0RFU19EU1RfQkxFTkRJTkdfTU9ERV9fU0hJRlQJMjgKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQUxQSEFfTU9ERVNfRFNUX0JMRU5ESU5HX01PREUoeCkJCSgoKHgpIDw8IFZJVlNfREVfQkxPQ0s0X0FMUEhBX01PREVTX0RTVF9CTEVORElOR19NT0RFX19TSElGVCkgJiBWSVZTX0RFX0JMT0NLNF9BTFBIQV9NT0RFU19EU1RfQkxFTkRJTkdfTU9ERV9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQUxQSEFfTU9ERVNfRFNUX0FMUEhBX0ZBQ1RPUl9fTUFTSwkweDgwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FMUEhBX01PREVTX0RTVF9BTFBIQV9GQUNUT1JfX1NISUZUCTMxCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FMUEhBX01PREVTX0RTVF9BTFBIQV9GQUNUT1JfRElTQUJMRQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FMUEhBX01PREVTX0RTVF9BTFBIQV9GQUNUT1JfRU5BQkxFCTB4ODAwMDAwMDAKKworI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BRERSRVNTX1UoaTApCQkJICAgICAgICgweDAwMDEyOGEwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FERFJFU1NfVV9fRVNJWkUJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9BRERSRVNTX1VfX0xFTgkJCQkweDAwMDAwMDA0CisKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1RSSURFX1UoaTApCQkJICAgICAgICgweDAwMDEyOGIwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NUUklERV9VX19FU0laRQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NUUklERV9VX19MRU4JCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TVFJJREVfVV9TVFJJREVfX01BU0sJCQkweDAwMDNmZmZmCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NUUklERV9VX1NUUklERV9fU0hJRlQJCQkwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NUUklERV9VX1NUUklERSh4KQkJCSgoKHgpIDw8IFZJVlNfREVfQkxPQ0s0X1NUUklERV9VX1NUUklERV9fU0hJRlQpICYgVklWU19ERV9CTE9DSzRfU1RSSURFX1VfU1RSSURFX19NQVNLKQorCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FERFJFU1NfVihpMCkJCQkgICAgICAgKDB4MDAwMTI4YzAgKyAweDQqKGkwKSkKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQUREUkVTU19WX19FU0laRQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0FERFJFU1NfVl9fTEVOCQkJCTB4MDAwMDAwMDQKKworI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TVFJJREVfVihpMCkJCQkgICAgICAgKDB4MDAwMTI4ZDAgKyAweDQqKGkwKSkKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1RSSURFX1ZfX0VTSVpFCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1RSSURFX1ZfX0xFTgkJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NUUklERV9WX1NUUklERV9fTUFTSwkJCTB4MDAwM2ZmZmYKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1RSSURFX1ZfU1RSSURFX19TSElGVAkJCTAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1RSSURFX1ZfU1RSSURFKHgpCQkJKCgoeCkgPDwgVklWU19ERV9CTE9DSzRfU1RSSURFX1ZfU1RSSURFX19TSElGVCkgJiBWSVZTX0RFX0JMT0NLNF9TVFJJREVfVl9TVFJJREVfX01BU0spCisKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX1JPVEFUSU9OX0hFSUdIVChpMCkJCSAgICAgICAoMHgwMDAxMjhlMCArIDB4NCooaTApKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfUk9UQVRJT05fSEVJR0hUX19FU0laRQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfUk9UQVRJT05fSEVJR0hUX19MRU4JCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19ST1RBVElPTl9IRUlHSFRfSEVJR0hUX19NQVNLCQkweDAwMDBmZmZmCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19ST1RBVElPTl9IRUlHSFRfSEVJR0hUX19TSElGVAkwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19ST1RBVElPTl9IRUlHSFRfSEVJR0hUKHgpCQkoKCh4KSA8PCBWSVZTX0RFX0JMT0NLNF9TUkNfUk9UQVRJT05fSEVJR0hUX0hFSUdIVF9fU0hJRlQpICYgVklWU19ERV9CTE9DSzRfU1JDX1JPVEFUSU9OX0hFSUdIVF9IRUlHSFRfX01BU0spCisKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfUk9UX0FOR0xFKGkwKQkJCSAgICAgICAoMHgwMDAxMjhmMCArIDB4NCooaTApKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9ST1RfQU5HTEVfX0VTSVpFCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfUk9UX0FOR0xFX19MRU4JCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9ST1RfQU5HTEVfU1JDX19NQVNLCQkJMHgwMDAwMDAwNworI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9ST1RfQU5HTEVfU1JDX19TSElGVAkJCTAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfUk9UX0FOR0xFX1NSQyh4KQkJCQkoKCh4KSA8PCBWSVZTX0RFX0JMT0NLNF9ST1RfQU5HTEVfU1JDX19TSElGVCkgJiBWSVZTX0RFX0JMT0NLNF9ST1RfQU5HTEVfU1JDX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9ST1RfQU5HTEVfRFNUX19NQVNLCQkJMHgwMDAwMDAzOAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9ST1RfQU5HTEVfRFNUX19TSElGVAkJCTMKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfUk9UX0FOR0xFX0RTVCh4KQkJCQkoKCh4KSA8PCBWSVZTX0RFX0JMT0NLNF9ST1RfQU5HTEVfRFNUX19TSElGVCkgJiBWSVZTX0RFX0JMT0NLNF9ST1RfQU5HTEVfRFNUX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9ST1RfQU5HTEVfU1JDX01BU0sJCQkweDAwMDAwMTAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1JPVF9BTkdMRV9EU1RfTUFTSwkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfUk9UX0FOR0xFX1NSQ19NSVJST1JfX01BU0sJCTB4MDAwMDMwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfUk9UX0FOR0xFX1NSQ19NSVJST1JfX1NISUZUCQkxMgorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9ST1RfQU5HTEVfU1JDX01JUlJPUih4KQkJCSgoKHgpIDw8IFZJVlNfREVfQkxPQ0s0X1JPVF9BTkdMRV9TUkNfTUlSUk9SX19TSElGVCkgJiBWSVZTX0RFX0JMT0NLNF9ST1RfQU5HTEVfU1JDX01JUlJPUl9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfUk9UX0FOR0xFX1NSQ19NSVJST1JfTUFTSwkJMHgwMDAwODAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9ST1RfQU5HTEVfRFNUX01JUlJPUl9fTUFTSwkJMHgwMDAzMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9ST1RfQU5HTEVfRFNUX01JUlJPUl9fU0hJRlQJCTE2CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1JPVF9BTkdMRV9EU1RfTUlSUk9SKHgpCQkJKCgoeCkgPDwgVklWU19ERV9CTE9DSzRfUk9UX0FOR0xFX0RTVF9NSVJST1JfX1NISUZUKSAmIFZJVlNfREVfQkxPQ0s0X1JPVF9BTkdMRV9EU1RfTUlSUk9SX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9ST1RfQU5HTEVfRFNUX01JUlJPUl9NQVNLCQkweDAwMDgwMDAwCisKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfR0xPQkFMX1NSQ19DT0xPUihpMCkJCSAgICAgICAoMHgwMDAxMjkwMCArIDB4NCooaTApKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9HTE9CQUxfU1JDX0NPTE9SX19FU0laRQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfR0xPQkFMX1NSQ19DT0xPUl9fTEVOCQkJMHgwMDAwMDAwNAorCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0dMT0JBTF9ERVNUX0NPTE9SKGkwKQkJICAgICAgICgweDAwMDEyOTEwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0dMT0JBTF9ERVNUX0NPTE9SX19FU0laRQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfR0xPQkFMX0RFU1RfQ09MT1JfX0xFTgkJCTB4MDAwMDAwMDQKKworI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9DT0xPUl9NVUxUSVBMWV9NT0RFUyhpMCkJCSAgICAgICAoMHgwMDAxMjkyMCArIDB4NCooaTApKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9DT0xPUl9NVUxUSVBMWV9NT0RFU19fRVNJWkUJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQ09MT1JfTVVMVElQTFlfTU9ERVNfX0xFTgkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9DT0xPUl9NVUxUSVBMWV9NT0RFU19TUkNfUFJFTVVMVElQTFlfX01BU0sJMHgwMDAwMDAwMQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9DT0xPUl9NVUxUSVBMWV9NT0RFU19TUkNfUFJFTVVMVElQTFlfX1NISUZUCTAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQ09MT1JfTVVMVElQTFlfTU9ERVNfU1JDX1BSRU1VTFRJUExZX0RJU0FCTEUJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9DT0xPUl9NVUxUSVBMWV9NT0RFU19TUkNfUFJFTVVMVElQTFlfRU5BQkxFCTB4MDAwMDAwMDEKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQ09MT1JfTVVMVElQTFlfTU9ERVNfRFNUX1BSRU1VTFRJUExZX19NQVNLCTB4MDAwMDAwMTAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQ09MT1JfTVVMVElQTFlfTU9ERVNfRFNUX1BSRU1VTFRJUExZX19TSElGVAk0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0NPTE9SX01VTFRJUExZX01PREVTX0RTVF9QUkVNVUxUSVBMWV9ESVNBQkxFCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQ09MT1JfTVVMVElQTFlfTU9ERVNfRFNUX1BSRU1VTFRJUExZX0VOQUJMRQkweDAwMDAwMDEwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0NPTE9SX01VTFRJUExZX01PREVTX1NSQ19HTE9CQUxfUFJFTVVMVElQTFlfX01BU0sJMHgwMDAwMDMwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9DT0xPUl9NVUxUSVBMWV9NT0RFU19TUkNfR0xPQkFMX1BSRU1VTFRJUExZX19TSElGVAk4CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0NPTE9SX01VTFRJUExZX01PREVTX1NSQ19HTE9CQUxfUFJFTVVMVElQTFlfRElTQUJMRQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0NPTE9SX01VTFRJUExZX01PREVTX1NSQ19HTE9CQUxfUFJFTVVMVElQTFlfQUxQSEEJMHgwMDAwMDEwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9DT0xPUl9NVUxUSVBMWV9NT0RFU19TUkNfR0xPQkFMX1BSRU1VTFRJUExZX0NPTE9SCTB4MDAwMDAyMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQ09MT1JfTVVMVElQTFlfTU9ERVNfRFNUX0RFTVVMVElQTFlfX01BU0sJMHgwMDEwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9DT0xPUl9NVUxUSVBMWV9NT0RFU19EU1RfREVNVUxUSVBMWV9fU0hJRlQJMjAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQ09MT1JfTVVMVElQTFlfTU9ERVNfRFNUX0RFTVVMVElQTFlfRElTQUJMRQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0NPTE9SX01VTFRJUExZX01PREVTX0RTVF9ERU1VTFRJUExZX0VOQUJMRQkweDAwMTAwMDAwCisKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfVFJBTlNQQVJFTkNZKGkwKQkJCSAgICAgICAoMHgwMDAxMjkzMCArIDB4NCooaTApKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9UUkFOU1BBUkVOQ1lfX0VTSVpFCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9UUkFOU1BBUkVOQ1lfX0xFTgkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfVFJBTlNQQVJFTkNZX1NPVVJDRV9fTUFTSwkJMHgwMDAwMDAwMworI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9UUkFOU1BBUkVOQ1lfU09VUkNFX19TSElGVAkJMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9UUkFOU1BBUkVOQ1lfU09VUkNFX09QQVFVRQkJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9UUkFOU1BBUkVOQ1lfU09VUkNFX01BU0sJCQkweDAwMDAwMDAxCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1RSQU5TUEFSRU5DWV9TT1VSQ0VfS0VZCQkJMHgwMDAwMDAwMgorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9UUkFOU1BBUkVOQ1lfUEFUVEVSTl9fTUFTSwkJMHgwMDAwMDAzMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9UUkFOU1BBUkVOQ1lfUEFUVEVSTl9fU0hJRlQJCTQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfVFJBTlNQQVJFTkNZX1BBVFRFUk5fT1BBUVVFCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1RSQU5TUEFSRU5DWV9QQVRURVJOX01BU0sJCTB4MDAwMDAwMTAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfVFJBTlNQQVJFTkNZX1BBVFRFUk5fS0VZCQkJMHgwMDAwMDAyMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9UUkFOU1BBUkVOQ1lfREVTVElOQVRJT05fX01BU0sJCTB4MDAwMDAzMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfVFJBTlNQQVJFTkNZX0RFU1RJTkFUSU9OX19TSElGVAkJOAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9UUkFOU1BBUkVOQ1lfREVTVElOQVRJT05fT1BBUVVFCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1RSQU5TUEFSRU5DWV9ERVNUSU5BVElPTl9NQVNLCQkweDAwMDAwMTAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1RSQU5TUEFSRU5DWV9ERVNUSU5BVElPTl9LRVkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfVFJBTlNQQVJFTkNZX1RSQU5TUEFSRU5DWV9NQVNLCQkweDAwMDAxMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1RSQU5TUEFSRU5DWV9VU0VfU1JDX09WRVJSSURFX19NQVNLCTB4MDAwMzAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfVFJBTlNQQVJFTkNZX1VTRV9TUkNfT1ZFUlJJREVfX1NISUZUCTE2CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1RSQU5TUEFSRU5DWV9VU0VfU1JDX09WRVJSSURFX0RFRkFVTFQJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9UUkFOU1BBUkVOQ1lfVVNFX1NSQ19PVkVSUklERV9VU0VfRU5BQkxFCTB4MDAwMTAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfVFJBTlNQQVJFTkNZX1VTRV9TUkNfT1ZFUlJJREVfVVNFX0RJU0FCTEUJMHgwMDAyMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9UUkFOU1BBUkVOQ1lfVVNFX1BBVF9PVkVSUklERV9fTUFTSwkweDAwMzAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1RSQU5TUEFSRU5DWV9VU0VfUEFUX09WRVJSSURFX19TSElGVAkyMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9UUkFOU1BBUkVOQ1lfVVNFX1BBVF9PVkVSUklERV9ERUZBVUxUCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfVFJBTlNQQVJFTkNZX1VTRV9QQVRfT1ZFUlJJREVfVVNFX0VOQUJMRQkweDAwMTAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1RSQU5TUEFSRU5DWV9VU0VfUEFUX09WRVJSSURFX1VTRV9ESVNBQkxFCTB4MDAyMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfVFJBTlNQQVJFTkNZX1VTRV9EU1RfT1ZFUlJJREVfX01BU0sJMHgwMzAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9UUkFOU1BBUkVOQ1lfVVNFX0RTVF9PVkVSUklERV9fU0hJRlQJMjQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfVFJBTlNQQVJFTkNZX1VTRV9EU1RfT1ZFUlJJREVfREVGQVVMVAkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1RSQU5TUEFSRU5DWV9VU0VfRFNUX09WRVJSSURFX1VTRV9FTkFCTEUJMHgwMTAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9UUkFOU1BBUkVOQ1lfVVNFX0RTVF9PVkVSUklERV9VU0VfRElTQUJMRQkweDAyMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1RSQU5TUEFSRU5DWV9SRVNPVVJDRV9PVkVSUklERV9NQVNLCTB4MTAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfVFJBTlNQQVJFTkNZX0RGQl9DT0xPUl9LRVlfX01BU0sJCTB4MjAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfVFJBTlNQQVJFTkNZX0RGQl9DT0xPUl9LRVlfX1NISUZUCTI5CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1RSQU5TUEFSRU5DWV9ERkJfQ09MT1JfS0VZX0RJU0FCTEUJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9UUkFOU1BBUkVOQ1lfREZCX0NPTE9SX0tFWV9FTkFCTEUJMHgyMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9UUkFOU1BBUkVOQ1lfREZCX0NPTE9SX0tFWV9NQVNLCQkweDgwMDAwMDAwCisKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQ09OVFJPTChpMCkJCQkgICAgICAgKDB4MDAwMTI5NDAgKyAweDQqKGkwKSkKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQ09OVFJPTF9fRVNJWkUJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9DT05UUk9MX19MRU4JCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9DT05UUk9MX1lVVl9fTUFTSwkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQ09OVFJPTF9ZVVZfX1NISUZUCQkJMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9DT05UUk9MX1lVVl82MDEJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9DT05UUk9MX1lVVl83MDkJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9DT05UUk9MX1lVVl9NQVNLCQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQ09OVFJPTF9VVl9TV0laWkxFX19NQVNLCQkJMHgwMDAwMDAxMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9DT05UUk9MX1VWX1NXSVpaTEVfX1NISUZUCQk0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0NPTlRST0xfVVZfU1dJWlpMRV9VVgkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQ09OVFJPTF9VVl9TV0laWkxFX1ZVCQkJMHgwMDAwMDAxMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9DT05UUk9MX1VWX1NXSVpaTEVfTUFTSwkJCTB4MDAwMDAwODAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQ09OVFJPTF9ZVVZSR0JfX01BU0sJCQkweDAwMDAwMTAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X0NPTlRST0xfWVVWUkdCX19TSElGVAkJCTgKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQ09OVFJPTF9ZVVZSR0JfRElTQUJMRQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfQ09OVFJPTF9ZVVZSR0JfRU5BQkxFCQkJMHgwMDAwMDEwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9DT05UUk9MX1lVVlJHQl9NQVNLCQkJMHgwMDAwMDgwMAorCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19DT0xPUl9LRVlfSElHSChpMCkJCSAgICAgICAoMHgwMDAxMjk1MCArIDB4NCooaTApKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfQ09MT1JfS0VZX0hJR0hfX0VTSVpFCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19DT0xPUl9LRVlfSElHSF9fTEVOCQkJMHgwMDAwMDAwNAorCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19FWF9DT05GSUcoaTApCQkgICAgICAgKDB4MDAwMTI5NjAgKyAweDQqKGkwKSkKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX0VYX0NPTkZJR19fRVNJWkUJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19FWF9DT05GSUdfX0xFTgkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX0VYX0NPTkZJR19NVUxUSV9USUxFRF9fTUFTSwkJMHgwMDAwMDAwMQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfRVhfQ09ORklHX01VTFRJX1RJTEVEX19TSElGVAkJMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfRVhfQ09ORklHX01VTFRJX1RJTEVEX0RJU0FCTEUJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfRVhfQ09ORklHX01VTFRJX1RJTEVEX0VOQUJMRQkJMHgwMDAwMDAwMQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfRVhfQ09ORklHX1NVUEVSX1RJTEVEX19NQVNLCQkweDAwMDAwMDA4CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19FWF9DT05GSUdfU1VQRVJfVElMRURfX1NISUZUCQkzCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19FWF9DT05GSUdfU1VQRVJfVElMRURfRElTQUJMRQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19FWF9DT05GSUdfU1VQRVJfVElMRURfRU5BQkxFCQkweDAwMDAwMDA4CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19FWF9DT05GSUdfTUlOT1JfVElMRURfX01BU0sJCTB4MDAwMDAxMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX0VYX0NPTkZJR19NSU5PUl9USUxFRF9fU0hJRlQJCTgKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX0VYX0NPTkZJR19NSU5PUl9USUxFRF9ESVNBQkxFCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzRfU1JDX0VYX0NPTkZJR19NSU5PUl9USUxFRF9FTkFCTEUJCTB4MDAwMDAxMDAKKworI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfRVhfQUREUkVTUyhpMCkJCSAgICAgICAoMHgwMDAxMjk3MCArIDB4NCooaTApKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLNF9TUkNfRVhfQUREUkVTU19fRVNJWkUJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s0X1NSQ19FWF9BRERSRVNTX19MRU4JCQkweDAwMDAwMDA0CisKKyNkZWZpbmUgVklWU19ERV9CTE9DSzgJCQkJCQkweDAwMDAwMDAwCisKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0FERFJFU1MoaTApCQkJICAgICAgICgweDAwMDEyYTAwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19BRERSRVNTX19FU0laRQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0FERFJFU1NfX0xFTgkJCQkweDAwMDAwMDA4CisKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX1NUUklERShpMCkJCQkgICAgICAgKDB4MDAwMTJhMjAgKyAweDQqKGkwKSkKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX1NUUklERV9fRVNJWkUJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19TVFJJREVfX0xFTgkJCQkweDAwMDAwMDA4CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19TVFJJREVfU1RSSURFX19NQVNLCQkJMHgwMDAzZmZmZgorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfU1RSSURFX1NUUklERV9fU0hJRlQJCQkwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19TVFJJREVfU1RSSURFKHgpCQkJKCgoeCkgPDwgVklWU19ERV9CTE9DSzhfU1JDX1NUUklERV9TVFJJREVfX1NISUZUKSAmIFZJVlNfREVfQkxPQ0s4X1NSQ19TVFJJREVfU1RSSURFX19NQVNLKQorCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19ST1RBVElPTl9DT05GSUcoaTApCQkgICAgICAgKDB4MDAwMTJhNDAgKyAweDQqKGkwKSkKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX1JPVEFUSU9OX0NPTkZJR19fRVNJWkUJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX1JPVEFUSU9OX0NPTkZJR19fTEVOCQkJMHgwMDAwMDAwOAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfUk9UQVRJT05fQ09ORklHX1dJRFRIX19NQVNLCQkweDAwMDBmZmZmCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19ST1RBVElPTl9DT05GSUdfV0lEVEhfX1NISUZUCQkwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19ST1RBVElPTl9DT05GSUdfV0lEVEgoeCkJCSgoKHgpIDw8IFZJVlNfREVfQkxPQ0s4X1NSQ19ST1RBVElPTl9DT05GSUdfV0lEVEhfX1NISUZUKSAmIFZJVlNfREVfQkxPQ0s4X1NSQ19ST1RBVElPTl9DT05GSUdfV0lEVEhfX01BU0spCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19ST1RBVElPTl9DT05GSUdfUk9UQVRJT05fX01BU0sJMHgwMDAxMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfUk9UQVRJT05fQ09ORklHX1JPVEFUSU9OX19TSElGVAkxNgorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfUk9UQVRJT05fQ09ORklHX1JPVEFUSU9OX0RJU0FCTEUJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfUk9UQVRJT05fQ09ORklHX1JPVEFUSU9OX0VOQUJMRQkweDAwMDEwMDAwCisKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0NPTkZJRyhpMCkJCQkgICAgICAgKDB4MDAwMTJhNjAgKyAweDQqKGkwKSkKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0NPTkZJR19fRVNJWkUJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19DT05GSUdfX0xFTgkJCQkweDAwMDAwMDA4CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19DT05GSUdfUEUxMF9TT1VSQ0VfRk9STUFUX19NQVNLCTB4MDAwMDAwMGYKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0NPTkZJR19QRTEwX1NPVVJDRV9GT1JNQVRfX1NISUZUCTAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0NPTkZJR19QRTEwX1NPVVJDRV9GT1JNQVQoeCkJCSgoKHgpIDw8IFZJVlNfREVfQkxPQ0s4X1NSQ19DT05GSUdfUEUxMF9TT1VSQ0VfRk9STUFUX19TSElGVCkgJiBWSVZTX0RFX0JMT0NLOF9TUkNfQ09ORklHX1BFMTBfU09VUkNFX0ZPUk1BVF9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0NPTkZJR19UUkFOU1BBUkVOQ1lfX01BU0sJCTB4MDAwMDAwMzAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0NPTkZJR19UUkFOU1BBUkVOQ1lfX1NISUZUCQk0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19DT05GSUdfVFJBTlNQQVJFTkNZKHgpCQkoKCh4KSA8PCBWSVZTX0RFX0JMT0NLOF9TUkNfQ09ORklHX1RSQU5TUEFSRU5DWV9fU0hJRlQpICYgVklWU19ERV9CTE9DSzhfU1JDX0NPTkZJR19UUkFOU1BBUkVOQ1lfX01BU0spCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19DT05GSUdfU1JDX1JFTEFUSVZFX19NQVNLCQkweDAwMDAwMDQwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19DT05GSUdfU1JDX1JFTEFUSVZFX19TSElGVAkJNgorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfQ09ORklHX1NSQ19SRUxBVElWRV9BQlNPTFVURQkJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfQ09ORklHX1NSQ19SRUxBVElWRV9SRUxBVElWRQkJMHgwMDAwMDA0MAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfQ09ORklHX1RJTEVEX19NQVNLCQkJMHgwMDAwMDA4MAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfQ09ORklHX1RJTEVEX19TSElGVAkJCTcKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0NPTkZJR19USUxFRF9ESVNBQkxFCQkJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfQ09ORklHX1RJTEVEX0VOQUJMRQkJCTB4MDAwMDAwODAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0NPTkZJR19MT0NBVElPTl9fTUFTSwkJMHgwMDAwMDEwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfQ09ORklHX0xPQ0FUSU9OX19TSElGVAkJOAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfQ09ORklHX0xPQ0FUSU9OX01FTU9SWQkJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfQ09ORklHX0xPQ0FUSU9OX1NUUkVBTQkJMHgwMDAwMDEwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfQ09ORklHX1BBQ0tfX01BU0sJCQkweDAwMDAzMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19DT05GSUdfUEFDS19fU0hJRlQJCQkxMgorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfQ09ORklHX1BBQ0tfUEFDS0VEOAkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0NPTkZJR19QQUNLX1BBQ0tFRDE2CQkJMHgwMDAwMTAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfQ09ORklHX1BBQ0tfUEFDS0VEMzIJCQkweDAwMDAyMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19DT05GSUdfUEFDS19VTlBBQ0tFRAkJCTB4MDAwMDMwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0NPTkZJR19NT05PX1RSQU5TUEFSRU5DWV9fTUFTSwkweDAwMDA4MDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19DT05GSUdfTU9OT19UUkFOU1BBUkVOQ1lfX1NISUZUCTE1CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19DT05GSUdfTU9OT19UUkFOU1BBUkVOQ1lfQkFDS0dST1VORAkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19DT05GSUdfTU9OT19UUkFOU1BBUkVOQ1lfRk9SRUdST1VORAkweDAwMDA4MDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19DT05GSUdfVU5LMTYJCQkJMHgwMDAxMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfQ09ORklHX1NXSVpaTEVfX01BU0sJCQkweDAwMzAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19DT05GSUdfU1dJWlpMRV9fU0hJRlQJCTIwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19DT05GSUdfU1dJWlpMRSh4KQkJCSgoKHgpIDw8IFZJVlNfREVfQkxPQ0s4X1NSQ19DT05GSUdfU1dJWlpMRV9fU0hJRlQpICYgVklWU19ERV9CTE9DSzhfU1JDX0NPTkZJR19TV0laWkxFX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfQ09ORklHX1NPVVJDRV9GT1JNQVRfX01BU0sJCTB4MWYwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0NPTkZJR19TT1VSQ0VfRk9STUFUX19TSElGVAkJMjQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0NPTkZJR19TT1VSQ0VfRk9STUFUKHgpCQkoKCh4KSA8PCBWSVZTX0RFX0JMT0NLOF9TUkNfQ09ORklHX1NPVVJDRV9GT1JNQVRfX1NISUZUKSAmIFZJVlNfREVfQkxPQ0s4X1NSQ19DT05GSUdfU09VUkNFX0ZPUk1BVF9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0NPTkZJR19ESVNBQkxFNDIwX0wyX0NBQ0hFCQkweDIwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19DT05GSUdfRU5ESUFOX0NPTlRST0xfX01BU0sJCTB4YzAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0NPTkZJR19FTkRJQU5fQ09OVFJPTF9fU0hJRlQJCTMwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19DT05GSUdfRU5ESUFOX0NPTlRST0woeCkJCSgoKHgpIDw8IFZJVlNfREVfQkxPQ0s4X1NSQ19DT05GSUdfRU5ESUFOX0NPTlRST0xfX1NISUZUKSAmIFZJVlNfREVfQkxPQ0s4X1NSQ19DT05GSUdfRU5ESUFOX0NPTlRST0xfX01BU0spCisKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX09SSUdJTihpMCkJCQkgICAgICAgKDB4MDAwMTJhODAgKyAweDQqKGkwKSkKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX09SSUdJTl9fRVNJWkUJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19PUklHSU5fX0xFTgkJCQkweDAwMDAwMDA4CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19PUklHSU5fWF9fTUFTSwkJCTB4MDAwMGZmZmYKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX09SSUdJTl9YX19TSElGVAkJCTAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX09SSUdJTl9YKHgpCQkJCSgoKHgpIDw8IFZJVlNfREVfQkxPQ0s4X1NSQ19PUklHSU5fWF9fU0hJRlQpICYgVklWU19ERV9CTE9DSzhfU1JDX09SSUdJTl9YX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfT1JJR0lOX1lfX01BU0sJCQkweGZmZmYwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19PUklHSU5fWV9fU0hJRlQJCQkxNgorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfT1JJR0lOX1koeCkJCQkJKCgoeCkgPDwgVklWU19ERV9CTE9DSzhfU1JDX09SSUdJTl9ZX19TSElGVCkgJiBWSVZTX0RFX0JMT0NLOF9TUkNfT1JJR0lOX1lfX01BU0spCisKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX1NJWkUoaTApCQkJICAgICAgICgweDAwMDEyYWEwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19TSVpFX19FU0laRQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19TSVpFX19MRU4JCQkJMHgwMDAwMDAwOAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfU0laRV9YX19NQVNLCQkJCTB4MDAwMGZmZmYKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX1NJWkVfWF9fU0hJRlQJCQkwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19TSVpFX1goeCkJCQkJKCgoeCkgPDwgVklWU19ERV9CTE9DSzhfU1JDX1NJWkVfWF9fU0hJRlQpICYgVklWU19ERV9CTE9DSzhfU1JDX1NJWkVfWF9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX1NJWkVfWV9fTUFTSwkJCQkweGZmZmYwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19TSVpFX1lfX1NISUZUCQkJMTYKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX1NJWkVfWSh4KQkJCQkoKCh4KSA8PCBWSVZTX0RFX0JMT0NLOF9TUkNfU0laRV9ZX19TSElGVCkgJiBWSVZTX0RFX0JMT0NLOF9TUkNfU0laRV9ZX19NQVNLKQorCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19DT0xPUl9CRyhpMCkJCQkgICAgICAgKDB4MDAwMTJhYzAgKyAweDQqKGkwKSkKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0NPTE9SX0JHX19FU0laRQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0NPTE9SX0JHX19MRU4JCQkweDAwMDAwMDA4CisKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfUk9QKGkwKQkJCQkgICAgICAgKDB4MDAwMTJhZTAgKyAweDQqKGkwKSkKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfUk9QX19FU0laRQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1JPUF9fTEVOCQkJCQkweDAwMDAwMDA4CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1JPUF9ST1BfRkdfX01BU0sJCQkJMHgwMDAwMDBmZgorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9ST1BfUk9QX0ZHX19TSElGVAkJCTAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfUk9QX1JPUF9GRyh4KQkJCQkoKCh4KSA8PCBWSVZTX0RFX0JMT0NLOF9ST1BfUk9QX0ZHX19TSElGVCkgJiBWSVZTX0RFX0JMT0NLOF9ST1BfUk9QX0ZHX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9ST1BfUk9QX0JHX19NQVNLCQkJCTB4MDAwMGZmMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfUk9QX1JPUF9CR19fU0hJRlQJCQk4CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1JPUF9ST1BfQkcoeCkJCQkJKCgoeCkgPDwgVklWU19ERV9CTE9DSzhfUk9QX1JPUF9CR19fU0hJRlQpICYgVklWU19ERV9CTE9DSzhfUk9QX1JPUF9CR19fTUFTSykKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfUk9QX1RZUEVfX01BU0sJCQkJMHgwMDMwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9ST1BfVFlQRV9fU0hJRlQJCQkJMjAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfUk9QX1RZUEVfUk9QMl9QQVRURVJOCQkJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9ST1BfVFlQRV9ST1AyX1NPVVJDRQkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfUk9QX1RZUEVfUk9QMwkJCQkweDAwMjAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1JPUF9UWVBFX1JPUDQJCQkJMHgwMDMwMDAwMAorCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FMUEhBX0NPTlRST0woaTApCQkgICAgICAgKDB4MDAwMTJiMDAgKyAweDQqKGkwKSkKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUxQSEFfQ09OVFJPTF9fRVNJWkUJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FMUEhBX0NPTlRST0xfX0xFTgkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUxQSEFfQ09OVFJPTF9FTkFCTEVfX01BU0sJCTB4MDAwMDAwMDEKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUxQSEFfQ09OVFJPTF9FTkFCTEVfX1NISUZUCQkwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FMUEhBX0NPTlRST0xfRU5BQkxFX09GRgkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUxQSEFfQ09OVFJPTF9FTkFCTEVfT04JCQkweDAwMDAwMDAxCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FMUEhBX0NPTlRST0xfUEUxMF9HTE9CQUxfU1JDX0FMUEhBX19NQVNLCTB4MDBmZjAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUxQSEFfQ09OVFJPTF9QRTEwX0dMT0JBTF9TUkNfQUxQSEFfX1NISUZUCTE2CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FMUEhBX0NPTlRST0xfUEUxMF9HTE9CQUxfU1JDX0FMUEhBKHgpCSgoKHgpIDw8IFZJVlNfREVfQkxPQ0s4X0FMUEhBX0NPTlRST0xfUEUxMF9HTE9CQUxfU1JDX0FMUEhBX19TSElGVCkgJiBWSVZTX0RFX0JMT0NLOF9BTFBIQV9DT05UUk9MX1BFMTBfR0xPQkFMX1NSQ19BTFBIQV9fTUFTSykKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUxQSEFfQ09OVFJPTF9QRTEwX0dMT0JBTF9EU1RfQUxQSEFfX01BU0sJMHhmZjAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9BTFBIQV9DT05UUk9MX1BFMTBfR0xPQkFMX0RTVF9BTFBIQV9fU0hJRlQJMjQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUxQSEFfQ09OVFJPTF9QRTEwX0dMT0JBTF9EU1RfQUxQSEEoeCkJKCgoeCkgPDwgVklWU19ERV9CTE9DSzhfQUxQSEFfQ09OVFJPTF9QRTEwX0dMT0JBTF9EU1RfQUxQSEFfX1NISUZUKSAmIFZJVlNfREVfQkxPQ0s4X0FMUEhBX0NPTlRST0xfUEUxMF9HTE9CQUxfRFNUX0FMUEhBX19NQVNLKQorCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FMUEhBX01PREVTKGkwKQkJCSAgICAgICAoMHgwMDAxMmIyMCArIDB4NCooaTApKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9BTFBIQV9NT0RFU19fRVNJWkUJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FMUEhBX01PREVTX19MRU4JCQkJMHgwMDAwMDAwOAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9BTFBIQV9NT0RFU19TUkNfQUxQSEFfTU9ERV9fTUFTSwkJMHgwMDAwMDAwMQorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9BTFBIQV9NT0RFU19TUkNfQUxQSEFfTU9ERV9fU0hJRlQJMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9BTFBIQV9NT0RFU19TUkNfQUxQSEFfTU9ERV9OT1JNQUwJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9BTFBIQV9NT0RFU19TUkNfQUxQSEFfTU9ERV9JTlZFUlNFRAkweDAwMDAwMDAxCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FMUEhBX01PREVTX0RTVF9BTFBIQV9NT0RFX19NQVNLCQkweDAwMDAwMDEwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FMUEhBX01PREVTX0RTVF9BTFBIQV9NT0RFX19TSElGVAk0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FMUEhBX01PREVTX0RTVF9BTFBIQV9NT0RFX05PUk1BTAkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FMUEhBX01PREVTX0RTVF9BTFBIQV9NT0RFX0lOVkVSU0VECTB4MDAwMDAwMTAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUxQSEFfTU9ERVNfR0xPQkFMX1NSQ19BTFBIQV9NT0RFX19NQVNLCTB4MDAwMDAzMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUxQSEFfTU9ERVNfR0xPQkFMX1NSQ19BTFBIQV9NT0RFX19TSElGVAk4CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FMUEhBX01PREVTX0dMT0JBTF9TUkNfQUxQSEFfTU9ERV9OT1JNQUwJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9BTFBIQV9NT0RFU19HTE9CQUxfU1JDX0FMUEhBX01PREVfR0xPQkFMCTB4MDAwMDAxMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUxQSEFfTU9ERVNfR0xPQkFMX1NSQ19BTFBIQV9NT0RFX1NDQUxFRAkweDAwMDAwMjAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FMUEhBX01PREVTX0dMT0JBTF9EU1RfQUxQSEFfTU9ERV9fTUFTSwkweDAwMDAzMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FMUEhBX01PREVTX0dMT0JBTF9EU1RfQUxQSEFfTU9ERV9fU0hJRlQJMTIKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUxQSEFfTU9ERVNfR0xPQkFMX0RTVF9BTFBIQV9NT0RFX05PUk1BTAkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FMUEhBX01PREVTX0dMT0JBTF9EU1RfQUxQSEFfTU9ERV9HTE9CQUwJMHgwMDAwMTAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9BTFBIQV9NT0RFU19HTE9CQUxfRFNUX0FMUEhBX01PREVfU0NBTEVECTB4MDAwMDIwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUxQSEFfTU9ERVNfUEUxMF9TUkNfQ09MT1JfTVVMVElQTFlfX01BU0sJMHgwMDAxMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9BTFBIQV9NT0RFU19QRTEwX1NSQ19DT0xPUl9NVUxUSVBMWV9fU0hJRlQJMTYKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUxQSEFfTU9ERVNfUEUxMF9TUkNfQ09MT1JfTVVMVElQTFlfRElTQUJMRQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FMUEhBX01PREVTX1BFMTBfU1JDX0NPTE9SX01VTFRJUExZX0VOQUJMRQkweDAwMDEwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FMUEhBX01PREVTX1BFMTBfRFNUX0NPTE9SX01VTFRJUExZX19NQVNLCTB4MDAxMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUxQSEFfTU9ERVNfUEUxMF9EU1RfQ09MT1JfTVVMVElQTFlfX1NISUZUCTIwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FMUEhBX01PREVTX1BFMTBfRFNUX0NPTE9SX01VTFRJUExZX0RJU0FCTEUJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9BTFBIQV9NT0RFU19QRTEwX0RTVF9DT0xPUl9NVUxUSVBMWV9FTkFCTEUJMHgwMDEwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9BTFBIQV9NT0RFU19TUkNfQkxFTkRJTkdfTU9ERV9fTUFTSwkweDA3MDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FMUEhBX01PREVTX1NSQ19CTEVORElOR19NT0RFX19TSElGVAkyNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9BTFBIQV9NT0RFU19TUkNfQkxFTkRJTkdfTU9ERSh4KQkJKCgoeCkgPDwgVklWU19ERV9CTE9DSzhfQUxQSEFfTU9ERVNfU1JDX0JMRU5ESU5HX01PREVfX1NISUZUKSAmIFZJVlNfREVfQkxPQ0s4X0FMUEhBX01PREVTX1NSQ19CTEVORElOR19NT0RFX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9BTFBIQV9NT0RFU19TUkNfQUxQSEFfRkFDVE9SX19NQVNLCTB4MDgwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUxQSEFfTU9ERVNfU1JDX0FMUEhBX0ZBQ1RPUl9fU0hJRlQJMjcKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUxQSEFfTU9ERVNfU1JDX0FMUEhBX0ZBQ1RPUl9ESVNBQkxFCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUxQSEFfTU9ERVNfU1JDX0FMUEhBX0ZBQ1RPUl9FTkFCTEUJMHgwODAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9BTFBIQV9NT0RFU19EU1RfQkxFTkRJTkdfTU9ERV9fTUFTSwkweDcwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FMUEhBX01PREVTX0RTVF9CTEVORElOR19NT0RFX19TSElGVAkyOAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9BTFBIQV9NT0RFU19EU1RfQkxFTkRJTkdfTU9ERSh4KQkJKCgoeCkgPDwgVklWU19ERV9CTE9DSzhfQUxQSEFfTU9ERVNfRFNUX0JMRU5ESU5HX01PREVfX1NISUZUKSAmIFZJVlNfREVfQkxPQ0s4X0FMUEhBX01PREVTX0RTVF9CTEVORElOR19NT0RFX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9BTFBIQV9NT0RFU19EU1RfQUxQSEFfRkFDVE9SX19NQVNLCTB4ODAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUxQSEFfTU9ERVNfRFNUX0FMUEhBX0ZBQ1RPUl9fU0hJRlQJMzEKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUxQSEFfTU9ERVNfRFNUX0FMUEhBX0ZBQ1RPUl9ESVNBQkxFCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUxQSEFfTU9ERVNfRFNUX0FMUEhBX0ZBQ1RPUl9FTkFCTEUJMHg4MDAwMDAwMAorCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FERFJFU1NfVShpMCkJCQkgICAgICAgKDB4MDAwMTJiNDAgKyAweDQqKGkwKSkKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUREUkVTU19VX19FU0laRQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0FERFJFU1NfVV9fTEVOCQkJCTB4MDAwMDAwMDgKKworI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TVFJJREVfVShpMCkJCQkgICAgICAgKDB4MDAwMTJiNjAgKyAweDQqKGkwKSkKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1RSSURFX1VfX0VTSVpFCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1RSSURFX1VfX0xFTgkJCQkweDAwMDAwMDA4CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NUUklERV9VX1NUUklERV9fTUFTSwkJCTB4MDAwM2ZmZmYKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1RSSURFX1VfU1RSSURFX19TSElGVAkJCTAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1RSSURFX1VfU1RSSURFKHgpCQkJKCgoeCkgPDwgVklWU19ERV9CTE9DSzhfU1RSSURFX1VfU1RSSURFX19TSElGVCkgJiBWSVZTX0RFX0JMT0NLOF9TVFJJREVfVV9TVFJJREVfX01BU0spCisKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUREUkVTU19WKGkwKQkJCSAgICAgICAoMHgwMDAxMmI4MCArIDB4NCooaTApKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9BRERSRVNTX1ZfX0VTSVpFCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQUREUkVTU19WX19MRU4JCQkJMHgwMDAwMDAwOAorCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NUUklERV9WKGkwKQkJCSAgICAgICAoMHgwMDAxMmJhMCArIDB4NCooaTApKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TVFJJREVfVl9fRVNJWkUJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TVFJJREVfVl9fTEVOCQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1RSSURFX1ZfU1RSSURFX19NQVNLCQkJMHgwMDAzZmZmZgorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TVFJJREVfVl9TVFJJREVfX1NISUZUCQkJMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TVFJJREVfVl9TVFJJREUoeCkJCQkoKCh4KSA8PCBWSVZTX0RFX0JMT0NLOF9TVFJJREVfVl9TVFJJREVfX1NISUZUKSAmIFZJVlNfREVfQkxPQ0s4X1NUUklERV9WX1NUUklERV9fTUFTSykKKworI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfUk9UQVRJT05fSEVJR0hUKGkwKQkJICAgICAgICgweDAwMDEyYmMwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19ST1RBVElPTl9IRUlHSFRfX0VTSVpFCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19ST1RBVElPTl9IRUlHSFRfX0xFTgkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX1JPVEFUSU9OX0hFSUdIVF9IRUlHSFRfX01BU0sJCTB4MDAwMGZmZmYKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX1JPVEFUSU9OX0hFSUdIVF9IRUlHSFRfX1NISUZUCTAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX1JPVEFUSU9OX0hFSUdIVF9IRUlHSFQoeCkJCSgoKHgpIDw8IFZJVlNfREVfQkxPQ0s4X1NSQ19ST1RBVElPTl9IRUlHSFRfSEVJR0hUX19TSElGVCkgJiBWSVZTX0RFX0JMT0NLOF9TUkNfUk9UQVRJT05fSEVJR0hUX0hFSUdIVF9fTUFTSykKKworI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9ST1RfQU5HTEUoaTApCQkJICAgICAgICgweDAwMDEyYmUwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1JPVF9BTkdMRV9fRVNJWkUJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9ST1RfQU5HTEVfX0xFTgkJCQkweDAwMDAwMDA4CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1JPVF9BTkdMRV9TUkNfX01BU0sJCQkweDAwMDAwMDA3CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1JPVF9BTkdMRV9TUkNfX1NISUZUCQkJMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9ST1RfQU5HTEVfU1JDKHgpCQkJCSgoKHgpIDw8IFZJVlNfREVfQkxPQ0s4X1JPVF9BTkdMRV9TUkNfX1NISUZUKSAmIFZJVlNfREVfQkxPQ0s4X1JPVF9BTkdMRV9TUkNfX01BU0spCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1JPVF9BTkdMRV9EU1RfX01BU0sJCQkweDAwMDAwMDM4CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1JPVF9BTkdMRV9EU1RfX1NISUZUCQkJMworI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9ST1RfQU5HTEVfRFNUKHgpCQkJCSgoKHgpIDw8IFZJVlNfREVfQkxPQ0s4X1JPVF9BTkdMRV9EU1RfX1NISUZUKSAmIFZJVlNfREVfQkxPQ0s4X1JPVF9BTkdMRV9EU1RfX01BU0spCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1JPVF9BTkdMRV9TUkNfTUFTSwkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfUk9UX0FOR0xFX0RTVF9NQVNLCQkJMHgwMDAwMDIwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9ST1RfQU5HTEVfU1JDX01JUlJPUl9fTUFTSwkJMHgwMDAwMzAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9ST1RfQU5HTEVfU1JDX01JUlJPUl9fU0hJRlQJCTEyCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1JPVF9BTkdMRV9TUkNfTUlSUk9SKHgpCQkJKCgoeCkgPDwgVklWU19ERV9CTE9DSzhfUk9UX0FOR0xFX1NSQ19NSVJST1JfX1NISUZUKSAmIFZJVlNfREVfQkxPQ0s4X1JPVF9BTkdMRV9TUkNfTUlSUk9SX19NQVNLKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9ST1RfQU5HTEVfU1JDX01JUlJPUl9NQVNLCQkweDAwMDA4MDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1JPVF9BTkdMRV9EU1RfTUlSUk9SX19NQVNLCQkweDAwMDMwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1JPVF9BTkdMRV9EU1RfTUlSUk9SX19TSElGVAkJMTYKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfUk9UX0FOR0xFX0RTVF9NSVJST1IoeCkJCQkoKCh4KSA8PCBWSVZTX0RFX0JMT0NLOF9ST1RfQU5HTEVfRFNUX01JUlJPUl9fU0hJRlQpICYgVklWU19ERV9CTE9DSzhfUk9UX0FOR0xFX0RTVF9NSVJST1JfX01BU0spCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1JPVF9BTkdMRV9EU1RfTUlSUk9SX01BU0sJCTB4MDAwODAwMDAKKworI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9HTE9CQUxfU1JDX0NPTE9SKGkwKQkJICAgICAgICgweDAwMDEyYzAwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0dMT0JBTF9TUkNfQ09MT1JfX0VTSVpFCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9HTE9CQUxfU1JDX0NPTE9SX19MRU4JCQkweDAwMDAwMDA4CisKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfR0xPQkFMX0RFU1RfQ09MT1IoaTApCQkgICAgICAgKDB4MDAwMTJjMjAgKyAweDQqKGkwKSkKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfR0xPQkFMX0RFU1RfQ09MT1JfX0VTSVpFCQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9HTE9CQUxfREVTVF9DT0xPUl9fTEVOCQkJMHgwMDAwMDAwOAorCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0NPTE9SX01VTFRJUExZX01PREVTKGkwKQkJICAgICAgICgweDAwMDEyYzQwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0NPTE9SX01VTFRJUExZX01PREVTX19FU0laRQkJMHgwMDAwMDAwNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9DT0xPUl9NVUxUSVBMWV9NT0RFU19fTEVOCQkweDAwMDAwMDA4CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0NPTE9SX01VTFRJUExZX01PREVTX1NSQ19QUkVNVUxUSVBMWV9fTUFTSwkweDAwMDAwMDAxCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0NPTE9SX01VTFRJUExZX01PREVTX1NSQ19QUkVNVUxUSVBMWV9fU0hJRlQJMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9DT0xPUl9NVUxUSVBMWV9NT0RFU19TUkNfUFJFTVVMVElQTFlfRElTQUJMRQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0NPTE9SX01VTFRJUExZX01PREVTX1NSQ19QUkVNVUxUSVBMWV9FTkFCTEUJMHgwMDAwMDAwMQorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9DT0xPUl9NVUxUSVBMWV9NT0RFU19EU1RfUFJFTVVMVElQTFlfX01BU0sJMHgwMDAwMDAxMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9DT0xPUl9NVUxUSVBMWV9NT0RFU19EU1RfUFJFTVVMVElQTFlfX1NISUZUCTQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQ09MT1JfTVVMVElQTFlfTU9ERVNfRFNUX1BSRU1VTFRJUExZX0RJU0FCTEUJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9DT0xPUl9NVUxUSVBMWV9NT0RFU19EU1RfUFJFTVVMVElQTFlfRU5BQkxFCTB4MDAwMDAwMTAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQ09MT1JfTVVMVElQTFlfTU9ERVNfU1JDX0dMT0JBTF9QUkVNVUxUSVBMWV9fTUFTSwkweDAwMDAwMzAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0NPTE9SX01VTFRJUExZX01PREVTX1NSQ19HTE9CQUxfUFJFTVVMVElQTFlfX1NISUZUCTgKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQ09MT1JfTVVMVElQTFlfTU9ERVNfU1JDX0dMT0JBTF9QUkVNVUxUSVBMWV9ESVNBQkxFCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQ09MT1JfTVVMVElQTFlfTU9ERVNfU1JDX0dMT0JBTF9QUkVNVUxUSVBMWV9BTFBIQQkweDAwMDAwMTAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0NPTE9SX01VTFRJUExZX01PREVTX1NSQ19HTE9CQUxfUFJFTVVMVElQTFlfQ09MT1IJMHgwMDAwMDIwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9DT0xPUl9NVUxUSVBMWV9NT0RFU19EU1RfREVNVUxUSVBMWV9fTUFTSwkweDAwMTAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0NPTE9SX01VTFRJUExZX01PREVTX0RTVF9ERU1VTFRJUExZX19TSElGVAkyMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9DT0xPUl9NVUxUSVBMWV9NT0RFU19EU1RfREVNVUxUSVBMWV9ESVNBQkxFCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQ09MT1JfTVVMVElQTFlfTU9ERVNfRFNUX0RFTVVMVElQTFlfRU5BQkxFCTB4MDAxMDAwMDAKKworI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9UUkFOU1BBUkVOQ1koaTApCQkJICAgICAgICgweDAwMDEyYzYwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1RSQU5TUEFSRU5DWV9fRVNJWkUJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1RSQU5TUEFSRU5DWV9fTEVOCQkJMHgwMDAwMDAwOAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9UUkFOU1BBUkVOQ1lfU09VUkNFX19NQVNLCQkweDAwMDAwMDAzCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1RSQU5TUEFSRU5DWV9TT1VSQ0VfX1NISUZUCQkwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1RSQU5TUEFSRU5DWV9TT1VSQ0VfT1BBUVVFCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1RSQU5TUEFSRU5DWV9TT1VSQ0VfTUFTSwkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfVFJBTlNQQVJFTkNZX1NPVVJDRV9LRVkJCQkweDAwMDAwMDAyCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1RSQU5TUEFSRU5DWV9QQVRURVJOX19NQVNLCQkweDAwMDAwMDMwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1RSQU5TUEFSRU5DWV9QQVRURVJOX19TSElGVAkJNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9UUkFOU1BBUkVOQ1lfUEFUVEVSTl9PUEFRVUUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfVFJBTlNQQVJFTkNZX1BBVFRFUk5fTUFTSwkJMHgwMDAwMDAxMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9UUkFOU1BBUkVOQ1lfUEFUVEVSTl9LRVkJCQkweDAwMDAwMDIwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1RSQU5TUEFSRU5DWV9ERVNUSU5BVElPTl9fTUFTSwkJMHgwMDAwMDMwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9UUkFOU1BBUkVOQ1lfREVTVElOQVRJT05fX1NISUZUCQk4CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1RSQU5TUEFSRU5DWV9ERVNUSU5BVElPTl9PUEFRVUUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfVFJBTlNQQVJFTkNZX0RFU1RJTkFUSU9OX01BU0sJCTB4MDAwMDAxMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfVFJBTlNQQVJFTkNZX0RFU1RJTkFUSU9OX0tFWQkJMHgwMDAwMDIwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9UUkFOU1BBUkVOQ1lfVFJBTlNQQVJFTkNZX01BU0sJCTB4MDAwMDEwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfVFJBTlNQQVJFTkNZX1VTRV9TUkNfT1ZFUlJJREVfX01BU0sJMHgwMDAzMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9UUkFOU1BBUkVOQ1lfVVNFX1NSQ19PVkVSUklERV9fU0hJRlQJMTYKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfVFJBTlNQQVJFTkNZX1VTRV9TUkNfT1ZFUlJJREVfREVGQVVMVAkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1RSQU5TUEFSRU5DWV9VU0VfU1JDX09WRVJSSURFX1VTRV9FTkFCTEUJMHgwMDAxMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9UUkFOU1BBUkVOQ1lfVVNFX1NSQ19PVkVSUklERV9VU0VfRElTQUJMRQkweDAwMDIwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1RSQU5TUEFSRU5DWV9VU0VfUEFUX09WRVJSSURFX19NQVNLCTB4MDAzMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfVFJBTlNQQVJFTkNZX1VTRV9QQVRfT1ZFUlJJREVfX1NISUZUCTIwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1RSQU5TUEFSRU5DWV9VU0VfUEFUX09WRVJSSURFX0RFRkFVTFQJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9UUkFOU1BBUkVOQ1lfVVNFX1BBVF9PVkVSUklERV9VU0VfRU5BQkxFCTB4MDAxMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfVFJBTlNQQVJFTkNZX1VTRV9QQVRfT1ZFUlJJREVfVVNFX0RJU0FCTEUJMHgwMDIwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9UUkFOU1BBUkVOQ1lfVVNFX0RTVF9PVkVSUklERV9fTUFTSwkweDAzMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1RSQU5TUEFSRU5DWV9VU0VfRFNUX09WRVJSSURFX19TSElGVAkyNAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9UUkFOU1BBUkVOQ1lfVVNFX0RTVF9PVkVSUklERV9ERUZBVUxUCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfVFJBTlNQQVJFTkNZX1VTRV9EU1RfT1ZFUlJJREVfVVNFX0VOQUJMRQkweDAxMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1RSQU5TUEFSRU5DWV9VU0VfRFNUX09WRVJSSURFX1VTRV9ESVNBQkxFCTB4MDIwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfVFJBTlNQQVJFTkNZX1JFU09VUkNFX09WRVJSSURFX01BU0sJMHgxMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9UUkFOU1BBUkVOQ1lfREZCX0NPTE9SX0tFWV9fTUFTSwkJMHgyMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9UUkFOU1BBUkVOQ1lfREZCX0NPTE9SX0tFWV9fU0hJRlQJMjkKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfVFJBTlNQQVJFTkNZX0RGQl9DT0xPUl9LRVlfRElTQUJMRQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1RSQU5TUEFSRU5DWV9ERkJfQ09MT1JfS0VZX0VOQUJMRQkweDIwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1RSQU5TUEFSRU5DWV9ERkJfQ09MT1JfS0VZX01BU0sJCTB4ODAwMDAwMDAKKworI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9DT05UUk9MKGkwKQkJCSAgICAgICAoMHgwMDAxMmM4MCArIDB4NCooaTApKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9DT05UUk9MX19FU0laRQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0NPTlRST0xfX0xFTgkJCQkweDAwMDAwMDA4CisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0NPTlRST0xfWVVWX19NQVNLCQkJMHgwMDAwMDAwMQorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9DT05UUk9MX1lVVl9fU0hJRlQJCQkwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0NPTlRST0xfWVVWXzYwMQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0NPTlRST0xfWVVWXzcwOQkJCQkweDAwMDAwMDAxCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0NPTlRST0xfWVVWX01BU0sJCQkJMHgwMDAwMDAwOAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9DT05UUk9MX1VWX1NXSVpaTEVfX01BU0sJCQkweDAwMDAwMDEwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0NPTlRST0xfVVZfU1dJWlpMRV9fU0hJRlQJCTQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQ09OVFJPTF9VVl9TV0laWkxFX1VWCQkJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9DT05UUk9MX1VWX1NXSVpaTEVfVlUJCQkweDAwMDAwMDEwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0NPTlRST0xfVVZfU1dJWlpMRV9NQVNLCQkJMHgwMDAwMDA4MAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9DT05UUk9MX1lVVlJHQl9fTUFTSwkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfQ09OVFJPTF9ZVVZSR0JfX1NISUZUCQkJOAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9DT05UUk9MX1lVVlJHQl9ESVNBQkxFCQkJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9DT05UUk9MX1lVVlJHQl9FTkFCTEUJCQkweDAwMDAwMTAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X0NPTlRST0xfWVVWUkdCX01BU0sJCQkweDAwMDAwODAwCisKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0NPTE9SX0tFWV9ISUdIKGkwKQkJICAgICAgICgweDAwMDEyY2EwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19DT0xPUl9LRVlfSElHSF9fRVNJWkUJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0NPTE9SX0tFWV9ISUdIX19MRU4JCQkweDAwMDAwMDA4CisKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0VYX0NPTkZJRyhpMCkJCSAgICAgICAoMHgwMDAxMmNjMCArIDB4NCooaTApKQorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfRVhfQ09ORklHX19FU0laRQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0VYX0NPTkZJR19fTEVOCQkJMHgwMDAwMDAwOAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfRVhfQ09ORklHX01VTFRJX1RJTEVEX19NQVNLCQkweDAwMDAwMDAxCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19FWF9DT05GSUdfTVVMVElfVElMRURfX1NISUZUCQkwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19FWF9DT05GSUdfTVVMVElfVElMRURfRElTQUJMRQkweDAwMDAwMDAwCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19FWF9DT05GSUdfTVVMVElfVElMRURfRU5BQkxFCQkweDAwMDAwMDAxCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19FWF9DT05GSUdfU1VQRVJfVElMRURfX01BU0sJCTB4MDAwMDAwMDgKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0VYX0NPTkZJR19TVVBFUl9USUxFRF9fU0hJRlQJCTMKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0VYX0NPTkZJR19TVVBFUl9USUxFRF9ESVNBQkxFCTB4MDAwMDAwMDAKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0VYX0NPTkZJR19TVVBFUl9USUxFRF9FTkFCTEUJCTB4MDAwMDAwMDgKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0VYX0NPTkZJR19NSU5PUl9USUxFRF9fTUFTSwkJMHgwMDAwMDEwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfRVhfQ09ORklHX01JTk9SX1RJTEVEX19TSElGVAkJOAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfRVhfQ09ORklHX01JTk9SX1RJTEVEX0RJU0FCTEUJMHgwMDAwMDAwMAorI2RlZmluZSBWSVZTX0RFX0JMT0NLOF9TUkNfRVhfQ09ORklHX01JTk9SX1RJTEVEX0VOQUJMRQkJMHgwMDAwMDEwMAorCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19FWF9BRERSRVNTKGkwKQkJICAgICAgICgweDAwMDEyY2UwICsgMHg0KihpMCkpCisjZGVmaW5lIFZJVlNfREVfQkxPQ0s4X1NSQ19FWF9BRERSRVNTX19FU0laRQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVklWU19ERV9CTE9DSzhfU1JDX0VYX0FERFJFU1NfX0xFTgkJCTB4MDAwMDAwMDgKKworCisjZW5kaWYgLyogU1RBVEVfMkRfWE1MICovCmRpZmYgLS1naXQgYS90ZXN0cy9ldG5hdml2L3dyaXRlX2JtcC5jIGIvdGVzdHMvZXRuYXZpdi93cml0ZV9ibXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWUwNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXRuYXZpdi93cml0ZV9ibXAuYwpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExICAgICAgTHVjIFZlcmhhZWdlbiA8bGlidkBjb2RldGhpbmsuY28udWs+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKy8qCisgKiBRdWljayAnbiBEaXJ0eSBiaXRtYXAgZHVtcGVyLgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgIndyaXRlX2JtcC5oIgorCisjZGVmaW5lIEZJTEVOQU1FX1NJWkUgMTAyNAorCitzdHJ1Y3QgYm1wX2hlYWRlciB7CisJdW5zaWduZWQgc2hvcnQgbWFnaWM7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgaW50IHVudXNlZDsKKwl1bnNpZ25lZCBpbnQgc3RhcnQ7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworc3RydWN0IGRpYl9oZWFkZXIgeworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGludCB3aWR0aDsKKwl1bnNpZ25lZCBpbnQgaGVpZ2h0OworCXVuc2lnbmVkIHNob3J0IHBsYW5lczsKKwl1bnNpZ25lZCBzaG9ydCBicHA7CisJdW5zaWduZWQgaW50IGNvbXByZXNzaW9uOworCXVuc2lnbmVkIGludCBkYXRhX3NpemU7CisJdW5zaWduZWQgaW50IGhfcmVzOworCXVuc2lnbmVkIGludCB2X3JlczsKKwl1bnNpZ25lZCBpbnQgY29sb3VyczsKKwl1bnNpZ25lZCBpbnQgaW1wb3J0YW50X2NvbG91cnM7CisJdW5zaWduZWQgaW50IHJlZF9tYXNrOworCXVuc2lnbmVkIGludCBncmVlbl9tYXNrOworCXVuc2lnbmVkIGludCBibHVlX21hc2s7CisJdW5zaWduZWQgaW50IGFscGhhX21hc2s7CisJdW5zaWduZWQgaW50IGNvbG91cl9zcGFjZTsKKwl1bnNpZ25lZCBpbnQgdW51c2VkWzEyXTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCitzdGF0aWMgaW50CitibXBfaGVhZGVyX3dyaXRlKGludCBmZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYmdyYSwgaW50IG5vZmxpcCwgaW50IGFscGhhKQoreworCXN0cnVjdCBibXBfaGVhZGVyIGJtcF9oZWFkZXIgPSB7CisJCS5tYWdpYyA9IDB4NGQ0MiwKKwkJLnNpemUgPSAod2lkdGggKiBoZWlnaHQgKiA0KSArCisJCXNpemVvZihzdHJ1Y3QgYm1wX2hlYWRlcikgKyBzaXplb2Yoc3RydWN0IGRpYl9oZWFkZXIpLAorCQkuc3RhcnQgPSBzaXplb2Yoc3RydWN0IGJtcF9oZWFkZXIpICsgc2l6ZW9mKHN0cnVjdCBkaWJfaGVhZGVyKSwKKwl9OworCXN0cnVjdCBkaWJfaGVhZGVyIGRpYl9oZWFkZXIgPSB7CisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBkaWJfaGVhZGVyKSwKKwkJLndpZHRoID0gd2lkdGgsCisJCS5oZWlnaHQgPSBub2ZsaXAgPyAtaGVpZ2h0IDogaGVpZ2h0LAorCQkucGxhbmVzID0gMSwKKwkJLmJwcCA9IDMyLAorCQkuY29tcHJlc3Npb24gPSAzLAorCQkuZGF0YV9zaXplID0gNCAqIHdpZHRoICogaGVpZ2h0LAorCQkuaF9yZXMgPSAweEIxMywKKwkJLnZfcmVzID0gMHhCMTMsCisJCS5jb2xvdXJzID0gMCwKKwkJLmltcG9ydGFudF9jb2xvdXJzID0gMCwKKwkJLnJlZF9tYXNrID0gMHgwMDAwMDBGRiwKKwkJLmdyZWVuX21hc2sgPSAweDAwMDBGRjAwLAorCQkuYmx1ZV9tYXNrID0gMHgwMEZGMDAwMCwKKwkJLmFscGhhX21hc2sgPSBhbHBoYSA/IDB4RkYwMDAwMDAgOiAweDAwMDAwMDAwLAorCQkuY29sb3VyX3NwYWNlID0gMHg1NzY5NkUyMCwKKwl9OworCisJaWYgKGJncmEpIHsKKwkJZGliX2hlYWRlci5yZWRfbWFzayA9IDB4MDBGRjAwMDA7CisJCWRpYl9oZWFkZXIuYmx1ZV9tYXNrID0gMHgwMDAwMDBGRjsKKwl9CisKKwl3cml0ZShmZCwgJmJtcF9oZWFkZXIsIHNpemVvZihzdHJ1Y3QgYm1wX2hlYWRlcikpOworCXdyaXRlKGZkLCAmZGliX2hlYWRlciwgc2l6ZW9mKHN0cnVjdCBkaWJfaGVhZGVyKSk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorYm1wX2R1bXAzMihjaGFyICpidWZmZXIsIHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQsIGJvb2wgYmdyYSwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaW50IGZkOworCisJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1dST05MWXwgT19UUlVOQyB8IE9fQ1JFQVQsIDA2NjYpOworCWlmIChmZCA9PSAtMSkgeworCQlwcmludGYoIkZhaWxlZCB0byBvcGVuICVzOiAlc1xuIiwgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybjsKKwl9CisKKwlibXBfaGVhZGVyX3dyaXRlKGZkLCB3aWR0aCwgaGVpZ2h0LCBiZ3JhLCBmYWxzZSwgdHJ1ZSk7CisKKwl3cml0ZShmZCwgYnVmZmVyLCB3aWR0aCAqIGhlaWdodCAqIDQpOworfQorCit2b2lkCitibXBfZHVtcDMyX25vZmxpcChjaGFyICpidWZmZXIsIHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQsIGJvb2wgYmdyYSwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaW50IGZkOworCisJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1dST05MWXwgT19UUlVOQyB8IE9fQ1JFQVQsIDA2NjYpOworCWlmIChmZCA9PSAtMSkgeworCQlwcmludGYoIkZhaWxlZCB0byBvcGVuICVzOiAlc1xuIiwgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybjsKKwl9CisKKwlibXBfaGVhZGVyX3dyaXRlKGZkLCB3aWR0aCwgaGVpZ2h0LCBiZ3JhLCB0cnVlLCB0cnVlKTsKKworCXdyaXRlKGZkLCBidWZmZXIsIHdpZHRoICogaGVpZ2h0ICogNCk7Cit9CisKK3ZvaWQKK2JtcF9kdW1wMzJfZXgoY2hhciAqYnVmZmVyLCB1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgaGVpZ2h0LCBib29sIGZsaXAsIGJvb2wgYmdyYSwgYm9vbCBhbHBoYSwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaW50IGZkOworCisJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1dST05MWXwgT19UUlVOQyB8IE9fQ1JFQVQsIDA2NjYpOworCWlmIChmZCA9PSAtMSkgeworCQlwcmludGYoIkZhaWxlZCB0byBvcGVuICVzOiAlc1xuIiwgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybjsKKwl9CisKKwlibXBfaGVhZGVyX3dyaXRlKGZkLCB3aWR0aCwgaGVpZ2h0LCBiZ3JhLCBmbGlwLCBhbHBoYSk7CisKKwl3cml0ZShmZCwgYnVmZmVyLCB3aWR0aCAqIGhlaWdodCAqIDQpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXRuYXZpdi93cml0ZV9ibXAuaCBiL3Rlc3RzL2V0bmF2aXYvd3JpdGVfYm1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY3ZmE4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V0bmF2aXYvd3JpdGVfYm1wLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExICAgICAgTHVjIFZlcmhhZWdlbiA8bGlidkBjb2RldGhpbmsuY28udWs+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKyNpZm5kZWYgQk1QX0RVTVBfSAorI2RlZmluZSBCTVBfRFVNUF9IIDEKKyNpbmNsdWRlIDxzdGRib29sLmg+CisvKiB3cml0ZSAzMi1iaXQgaW1hZ2UgKHkgYXhpcyB1cHdhcmRzKSAqLwordm9pZCBibXBfZHVtcDMyKGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCwgYm9vbCBiZ3JhLCBjb25zdCBjaGFyICpmaWxlbmFtZSk7CisvKiB3cml0ZSAzMi1iaXQgaW1hZ2UgKHkgYXhpcyBkb3dud2FyZHMpICovCit2b2lkIGJtcF9kdW1wMzJfbm9mbGlwKGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCwgYm9vbCBiZ3JhLCBjb25zdCBjaGFyICpmaWxlbmFtZSk7CisvKiB3cml0ZSAzMi1iaXQgaW1hZ2UgKi8KK3ZvaWQgYm1wX2R1bXAzMl9leChjaGFyICpidWZmZXIsIHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQsIGJvb2wgZmxpcCwgYm9vbCBiZ3JhLCBib29sIGFscGhhLCBjb25zdCBjaGFyICpmaWxlbmFtZSk7CisKKyNlbmRpZiAvKiBCTVBfRFVNUF9IICovCmRpZmYgLS1naXQgYS90ZXN0cy9leHlub3MvTWFrZWZpbGUuYW0gYi90ZXN0cy9leHlub3MvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYzNjE3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4eW5vcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ3IEBACitBTV9DRkxBR1MgPSBcCisJLXB0aHJlYWQgXAorCSQoV0FSTl9DRkxBR1MpXAorCS1JICQodG9wX3NyY2RpcikvaW5jbHVkZS9kcm0gXAorCS1JICQodG9wX3NyY2RpcikvbGlia21zLyBcCisJLUkgJCh0b3Bfc3JjZGlyKS9leHlub3MgXAorCS1JICQodG9wX3NyY2RpcikKKworYmluX1BST0dSQU1TID0KK25vaW5zdF9QUk9HUkFNUyA9CisKK2lmIEhBVkVfTElCS01TCitpZiBIQVZFX0lOU1RBTExfVEVTVFMKK2Jpbl9QUk9HUkFNUyArPSBcCisJZXh5bm9zX2ZpbWcyZF90ZXN0CitlbHNlCitub2luc3RfUFJPR1JBTVMgKz0gXAorCWV4eW5vc19maW1nMmRfdGVzdAorZW5kaWYKK2VuZGlmCisKK2lmIEhBVkVfSU5TVEFMTF9URVNUUworYmluX1BST0dSQU1TICs9IFwKKwlleHlub3NfZmltZzJkX3BlcmYgXAorCWV4eW5vc19maW1nMmRfZXZlbnQKK2Vsc2UKK25vaW5zdF9QUk9HUkFNUyArPSBcCisJZXh5bm9zX2ZpbWcyZF9wZXJmIFwKKwlleHlub3NfZmltZzJkX2V2ZW50CitlbmRpZgorCitleHlub3NfZmltZzJkX3BlcmZfTERBREQgPSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYmRybS5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2V4eW5vcy9saWJkcm1fZXh5bm9zLmxhCisKK2V4eW5vc19maW1nMmRfZXZlbnRfTERBREQgPSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYmRybS5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2V4eW5vcy9saWJkcm1fZXh5bm9zLmxhCisKK2V4eW5vc19maW1nMmRfdGVzdF9MREFERCA9IFwKKwkkKHRvcF9idWlsZGRpcikvbGliZHJtLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGlia21zL2xpYmttcy5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2V4eW5vcy9saWJkcm1fZXh5bm9zLmxhCisKK2V4eW5vc19maW1nMmRfdGVzdF9TT1VSQ0VTID0gXAorCWV4eW5vc19maW1nMmRfdGVzdC5jCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4eW5vcy9leHlub3NfZmltZzJkX2V2ZW50LmMgYi90ZXN0cy9leHlub3MvZXh5bm9zX2ZpbWcyZF9ldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZDVhMzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leHlub3MvZXh5bm9zX2ZpbWcyZF9ldmVudC5jCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IC0gVG9iaWFzIEpha29iaQorICoKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsCisgKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEl0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggaXQuIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8cG9sbC5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlIDx4Zjg2ZHJtLmg+CisKKyNpbmNsdWRlICJleHlub3NfZHJtLmgiCisjaW5jbHVkZSAiZXh5bm9zX2RybWlmLmgiCisjaW5jbHVkZSAiZXh5bm9zX2ZpbWcyZC5oIgorCitzdHJ1Y3QgZzJkX2pvYiB7CisJdW5zaWduZWQgaW50IGlkOworCXVuc2lnbmVkIGludCBidXN5OworfTsKKworc3RydWN0IGV4eW5vc19ldmhhbmRsZXIgeworCXN0cnVjdCBwb2xsZmQgZmRzOworCXN0cnVjdCBleHlub3NfZXZlbnRfY29udGV4dCBldmN0eDsKK307CisKK3N0cnVjdCB0aHJlYWRkYXRhIHsKKwl1bnNpZ25lZCBpbnQgc3RvcDsKKwlzdHJ1Y3QgZXh5bm9zX2RldmljZSAqZGV2OworCXN0cnVjdCBleHlub3NfZXZoYW5kbGVyIGV2aGFuZGxlcjsKK307CisKK3N0YXRpYyB2b2lkIGcyZF9ldmVudF9oYW5kbGVyKGludCBmZCwgdW5zaWduZWQgaW50IGNtZGxpc3Rfbm8sIHVuc2lnbmVkIGludCB0dl9zZWMsCisJCQkJCQkJdW5zaWduZWQgaW50IHR2X3VzZWMsIHZvaWQgKnVzZXJfZGF0YSkKK3sKKwlzdHJ1Y3QgZzJkX2pvYiAqam9iID0gdXNlcl9kYXRhOworCisJZnByaW50ZihzdGRlcnIsICJpbmZvOiBnMmQgam9iIChpZCA9ICV1LCBjbWRsaXN0IG51bWJlciA9ICV1KSBmaW5pc2hlZCFcbiIsCisJCQlqb2ItPmlkLCBjbWRsaXN0X25vKTsKKworCWpvYi0+YnVzeSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2cyZF9ldmVudF9oYW5kbGVyKHN0cnVjdCBleHlub3NfZXZoYW5kbGVyICpldmhhbmRsZXIsIGludCBmZCkKK3sKKwlldmhhbmRsZXItPmZkcy5mZCA9IGZkOworCWV2aGFuZGxlci0+ZmRzLmV2ZW50cyA9IFBPTExJTjsKKwlldmhhbmRsZXItPmV2Y3R4LmJhc2UudmVyc2lvbiA9IDI7CisJZXZoYW5kbGVyLT5ldmN0eC52ZXJzaW9uID0gMTsKKwlldmhhbmRsZXItPmV2Y3R4LmcyZF9ldmVudF9oYW5kbGVyID0gZzJkX2V2ZW50X2hhbmRsZXI7Cit9CisKK3N0YXRpYyB2b2lkKiB0aHJlYWRmdW5jKHZvaWQgKmFyZykgeworCWNvbnN0IGludCB0aW1lb3V0ID0gMDsKKwlzdHJ1Y3QgdGhyZWFkZGF0YSAqZGF0YTsKKworCWRhdGEgPSBhcmc7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoZGF0YS0+c3RvcCkgYnJlYWs7CisKKwkJdXNsZWVwKDUwMCk7CisKKwkJZGF0YS0+ZXZoYW5kbGVyLmZkcy5yZXZlbnRzID0gMDsKKworCQlpZiAocG9sbCgmZGF0YS0+ZXZoYW5kbGVyLmZkcywgMSwgdGltZW91dCkgPCAwKQorCQkJY29udGludWU7CisKKwkJaWYgKGRhdGEtPmV2aGFuZGxlci5mZHMucmV2ZW50cyAmIChQT0xMSFVQIHwgUE9MTEVSUikpCisJCQljb250aW51ZTsKKworCQlpZiAoZGF0YS0+ZXZoYW5kbGVyLmZkcy5yZXZlbnRzICYgUE9MTElOKQorCQkJZXh5bm9zX2hhbmRsZV9ldmVudChkYXRhLT5kZXYsICZkYXRhLT5ldmhhbmRsZXIuZXZjdHgpOworCX0KKworCXB0aHJlYWRfZXhpdCgwKTsKK30KKworLyoKKyAqIFdlIG5lZWQgdG8gd2FpdCB1bnRpbCBhbGwgRzJEIGpvYnMgYXJlIGZpbmlzaGVkLCBvdGhlcndpc2Ugd2UKKyAqIHBvdGVudGlhbGx5IHJlbW92ZSBhIEJPIHdoaWNoIHRoZSBlbmdpbmUgc3RpbGwgb3BlcmF0ZXMgb24uCisgKiBUaGlzIHJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyBrZXJuZWwgbWVzc2FnZToKKyAqIFtkcm06ZXh5bm9zX2RybV9nZW1fcHV0X2RtYV9hZGRyXSAqRVJST1IqIGZhaWxlZCB0byBsb29rdXAgZ2VtIG9iamVjdC4KKyAqIEFsc28gYW55IHN1YnNlcXVlbnQgQk8gYWxsb2NhdGlvbnMgZmFpbCB0aGVuIHdpdGg6CisgKiBbZHJtOmV4eW5vc19kcm1fYWxsb2NfYnVmXSAqRVJST1IqIGZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkIHdhaXRfYWxsX2pvYnMoc3RydWN0IGcyZF9qb2IqIGpvYnMsIHVuc2lnbmVkIG51bV9qb2JzKQoreworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2pvYnM7ICsraSkgeworCQl3aGlsZSAoam9ic1tpXS5idXN5KQorCQkJdXNsZWVwKDUwMCk7CisJfQorCit9CisKK3N0YXRpYyBzdHJ1Y3QgZzJkX2pvYiogZnJlZV9qb2Ioc3RydWN0IGcyZF9qb2IqIGpvYnMsIHVuc2lnbmVkIG51bV9qb2JzKQoreworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2pvYnM7ICsraSkgeworCQlpZiAoam9ic1tpXS5idXN5ID09IDApCisJCQlyZXR1cm4gJmpvYnNbaV07CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZzJkX3dvcmsoc3RydWN0IGcyZF9jb250ZXh0ICpjdHgsIHN0cnVjdCBnMmRfaW1hZ2UgKmltZywKKwkJCQkJdW5zaWduZWQgbnVtX2pvYnMsIHVuc2lnbmVkIGl0ZXJhdGlvbnMpCit7CisJc3RydWN0IGcyZF9qb2IgKmpvYnMgPSBjYWxsb2MobnVtX2pvYnMsIHNpemVvZihzdHJ1Y3QgZzJkX2pvYikpOworCWludCByZXQ7CisJdW5zaWduZWQgaTsKKworCS8qIHNldHVwIGpvYiBpZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2pvYnM7ICsraSkKKwkJam9ic1tpXS5pZCA9IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgKytpKSB7CisJCXVuc2lnbmVkIHgsIHksIHcsIGg7CisKKwkJc3RydWN0IGcyZF9qb2IgKmogPSBOVUxMOworCisJCXdoaWxlICgxKSB7CisJCQlqID0gZnJlZV9qb2Ioam9icywgbnVtX2pvYnMpOworCisJCQlpZiAoaikKKwkJCQlicmVhazsKKwkJCWVsc2UKKwkJCQl1c2xlZXAoNTAwKTsKKwkJfQorCisJCXggPSByYW5kKCkgJSBpbWctPndpZHRoOworCQl5ID0gcmFuZCgpICUgaW1nLT5oZWlnaHQ7CisKKwkJaWYgKHggPT0gKGltZy0+d2lkdGggLSAxKSkKKwkJCXggLT0gMTsKKwkJaWYgKHkgPT0gKGltZy0+aGVpZ2h0IC0gMSkpCisJCQl5IC09IDE7CisKKwkJdyA9IHJhbmQoKSAlIChpbWctPndpZHRoIC0geCk7CisJCWggPSByYW5kKCkgJSAoaW1nLT5oZWlnaHQgLSB5KTsKKworCQlpZiAodyA9PSAwKSB3ID0gMTsKKwkJaWYgKGggPT0gMCkgaCA9IDE7CisKKwkJaW1nLT5jb2xvciA9IHJhbmQoKTsKKworCQlqLT5idXN5ID0gMTsKKwkJZzJkX2NvbmZpZ19ldmVudChjdHgsIGopOworCisJCXJldCA9IGcyZF9zb2xpZF9maWxsKGN0eCwgaW1nLCB4LCB5LCB3LCBoKTsKKworCQlpZiAocmV0ID09IDApCisJCQlnMmRfZXhlYyhjdHgpOworCisJCWlmIChyZXQgIT0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogaXRlcmF0aW9uICV1ICh4ID0gJXUsIHggPSAldSwgeCA9ICV1LCB4ID0gJXUpIGZhaWxlZFxuIiwKKwkJCQkJaSwgeCwgeSwgdywgaCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXdhaXRfYWxsX2pvYnMoam9icywgbnVtX2pvYnMpOworCWZyZWUoam9icyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbLWlqd2hdXG5cbiIsIG5hbWUpOworCisJZnByaW50ZihzdGRlcnIsICJcdC1pIDxudW1iZXIgb2YgaXRlcmF0aW9ucz5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtaiA8bnVtYmVyIG9mIEcyRCBqb2JzPiAoZGVmYXVsdCA9IDQpXG5cbiIpOworCisJZnByaW50ZihzdGRlcnIsICJcdC13IDxidWZmZXIgd2lkdGg+IChkZWZhdWx0ID0gNDA5NilcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtaCA8YnVmZmVyIGhlaWdodD4gKGRlZmF1bHQgPSA0MDk2KVxuIik7CisKKwlleGl0KDApOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGZkLCByZXQsIGMsIHBhcnNlZmFpbDsKKworCXB0aHJlYWRfdCBldmVudF90aHJlYWQ7CisJc3RydWN0IHRocmVhZGRhdGEgZXZlbnRfZGF0YSA9IHswfTsKKworCXN0cnVjdCBleHlub3NfZGV2aWNlICpkZXY7CisJc3RydWN0IGcyZF9jb250ZXh0ICpjdHg7CisJc3RydWN0IGV4eW5vc19ibyAqYm87CisKKwlzdHJ1Y3QgZzJkX2ltYWdlIGltZyA9IHswfTsKKworCXVuc2lnbmVkIGludCBpdGVycyA9IDAsIG5qb2JzID0gNDsKKwl1bnNpZ25lZCBpbnQgYnVmdyA9IDQwOTYsIGJ1ZmggPSA0MDk2OworCisJcmV0ID0gMDsKKwlwYXJzZWZhaWwgPSAwOworCisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJpOmo6dzpoOiIpKSAhPSAtMSkgeworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnaSc6CisJCQlpZiAoc3NjYW5mKG9wdGFyZywgIiV1IiwgJml0ZXJzKSAhPSAxKQorCQkJCXBhcnNlZmFpbCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnaic6CisJCQlpZiAoc3NjYW5mKG9wdGFyZywgIiV1IiwgJm5qb2JzKSAhPSAxKQorCQkJCXBhcnNlZmFpbCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAndyc6CisJCQlpZiAoc3NjYW5mKG9wdGFyZywgIiV1IiwgJmJ1ZncpICE9IDEpCisJCQkJcGFyc2VmYWlsID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJCWlmIChzc2NhbmYob3B0YXJnLCAiJXUiLCAmYnVmaCkgIT0gMSkKKwkJCQlwYXJzZWZhaWwgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwYXJzZWZhaWwgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAocGFyc2VmYWlsIHx8IChhcmdjID09IDEpIHx8IChpdGVycyA9PSAwKSkKKwkJdXNhZ2UoYXJndlswXSk7CisKKwlpZiAoYnVmdyA+IDQwOTYgfHwgYnVmaCA+IDQwOTYpIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogYnVmZmVyIHdpZHRoL2hlaWdodCBzaG91bGQgYmUgbGVzcyB0aGFuIDQwOTYuXG4iKTsKKwkJcmV0ID0gLTE7CisKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGJ1ZncgPT0gMCB8fCBidWZoID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogYnVmZmVyIHdpZHRoL2hlaWdodCBzaG91bGQgYmUgbm9uLXplcm8uXG4iKTsKKwkJcmV0ID0gLTE7CisKKwkJZ290byBvdXQ7CisJfQorCisJZmQgPSBkcm1PcGVuKCJleHlub3MiLCBOVUxMKTsKKwlpZiAoZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGZhaWxlZCB0byBvcGVuIGRybVxuIik7CisJCXJldCA9IC0xOworCisJCWdvdG8gb3V0OworCX0KKworCWRldiA9IGV4eW5vc19kZXZpY2VfY3JlYXRlKGZkKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogZmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2VcbiIpOworCQlyZXQgPSAtMjsKKworCQlnb3RvIGZhaWw7CisJfQorCisJY3R4ID0gZzJkX2luaXQoZmQpOworCWlmIChjdHggPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBmYWlsZWQgdG8gaW5pdCBHMkRcbiIpOworCQlyZXQgPSAtMzsKKworCQlnb3RvIGcyZF9mYWlsOworCX0KKworCWJvID0gZXh5bm9zX2JvX2NyZWF0ZShkZXYsIGJ1ZncgKiBidWZoICogNCwgMCk7CisJaWYgKGJvID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogZmFpbGVkIHRvIGNyZWF0ZSBib1xuIik7CisJCXJldCA9IC00OworCisJCWdvdG8gYm9fZmFpbDsKKwl9CisKKwkvKiBzZXR1cCBnMmQgaW1hZ2Ugb2JqZWN0ICovCisJaW1nLndpZHRoID0gYnVmdzsKKwlpbWcuaGVpZ2h0ID0gYnVmaDsKKwlpbWcuc3RyaWRlID0gYnVmdyAqIDQ7CisJaW1nLmNvbG9yX21vZGUgPSBHMkRfQ09MT1JfRk1UX0FSR0I4ODg4IHwgRzJEX09SREVSX0FYUkdCOworCWltZy5idWZfdHlwZSA9IEcyRF9JTUdCVUZfR0VNOworCWltZy5ib1swXSA9IGJvLT5oYW5kbGU7CisKKwlldmVudF9kYXRhLmRldiA9IGRldjsKKwlzZXR1cF9nMmRfZXZlbnRfaGFuZGxlcigmZXZlbnRfZGF0YS5ldmhhbmRsZXIsIGZkKTsKKworCXB0aHJlYWRfY3JlYXRlKCZldmVudF90aHJlYWQsIE5VTEwsIHRocmVhZGZ1bmMsICZldmVudF9kYXRhKTsKKworCXJldCA9IGcyZF93b3JrKGN0eCwgJmltZywgbmpvYnMsIGl0ZXJzKTsKKwlpZiAocmV0ICE9IDApCisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGcyZF93b3JrIGZhaWxlZFxuIik7CisKKwlldmVudF9kYXRhLnN0b3AgPSAxOworCXB0aHJlYWRfam9pbihldmVudF90aHJlYWQsIE5VTEwpOworCisJZXh5bm9zX2JvX2Rlc3Ryb3koYm8pOworCitib19mYWlsOgorCWcyZF9maW5pKGN0eCk7CisKK2cyZF9mYWlsOgorCWV4eW5vc19kZXZpY2VfZGVzdHJveShkZXYpOworCitmYWlsOgorCWRybUNsb3NlKGZkKTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9leHlub3MvZXh5bm9zX2ZpbWcyZF9wZXJmLmMgYi90ZXN0cy9leHlub3MvZXh5bm9zX2ZpbWcyZF9wZXJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY5OWJiYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4eW5vcy9leHlub3NfZmltZzJkX3BlcmYuYwpAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSAtIFRvYmlhcyBKYWtvYmkKKyAqCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLAorICogb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBJdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIGl0LiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDx4Zjg2ZHJtLmg+CisKKyNpbmNsdWRlICJleHlub3NfZHJtLmgiCisjaW5jbHVkZSAiZXh5bm9zX2RybWlmLmgiCisjaW5jbHVkZSAiZXh5bm9zX2ZpbWcyZC5oIgorCitzdGF0aWMgaW50IG91dHB1dF9tYXRoZW1hdGljYSA9IDA7CisKK3N0YXRpYyBpbnQgZmltZzJkX3BlcmZfc2ltcGxlKHN0cnVjdCBleHlub3NfYm8gKmJvLCBzdHJ1Y3QgZzJkX2NvbnRleHQgKmN0eCwKKwkJCXVuc2lnbmVkIGJ1Zl93aWR0aCwgdW5zaWduZWQgYnVmX2hlaWdodCwgdW5zaWduZWQgaXRlcmF0aW9ucykKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHNwZWMgPSB7IDAgfTsKKwlzdHJ1Y3QgZzJkX2ltYWdlIGltZyA9IHsgMCB9OworCisJdW5zaWduZWQgbG9uZyBsb25nIGcyZF90aW1lOworCXVuc2lnbmVkIGk7CisJaW50IHJldCA9IDA7CisKKwlpbWcud2lkdGggPSBidWZfd2lkdGg7CisJaW1nLmhlaWdodCA9IGJ1Zl9oZWlnaHQ7CisJaW1nLnN0cmlkZSA9IGJ1Zl93aWR0aCAqIDQ7CisJaW1nLmNvbG9yX21vZGUgPSBHMkRfQ09MT1JfRk1UX0FSR0I4ODg4IHwgRzJEX09SREVSX0FYUkdCOworCWltZy5idWZfdHlwZSA9IEcyRF9JTUdCVUZfR0VNOworCWltZy5ib1swXSA9IGJvLT5oYW5kbGU7CisKKwlzcmFuZCh0aW1lKE5VTEwpKTsKKworCXByaW50Zigic3RhcnRpbmcgc2ltcGxlIEcyRCBwZXJmb3JtYW5jZSB0ZXN0XG4iKTsKKwlwcmludGYoImJ1ZmZlciB3aWR0aCA9ICV1LCBidWZmZXIgaGVpZ2h0ID0gJXUsIGl0ZXJhdGlvbnMgPSAldVxuIiwKKwkJYnVmX3dpZHRoLCBidWZfaGVpZ2h0LCBpdGVyYXRpb25zKTsKKworCWlmIChvdXRwdXRfbWF0aGVtYXRpY2EpCisJCXB1dGNoYXIoJ3snKTsKKworCWZvciAoaSA9IDA7IGkgPCBpdGVyYXRpb25zOyArK2kpIHsKKwkJdW5zaWduZWQgeCwgeSwgdywgaDsKKworCQl4ID0gcmFuZCgpICUgYnVmX3dpZHRoOworCQl5ID0gcmFuZCgpICUgYnVmX2hlaWdodDsKKworCQlpZiAoeCA9PSAoYnVmX3dpZHRoIC0gMSkpCisJCQl4IC09IDE7CisJCWlmICh5ID09IChidWZfaGVpZ2h0IC0gMSkpCisJCQl5IC09IDE7CisKKwkJdyA9IHJhbmQoKSAlIChidWZfd2lkdGggLSB4KTsKKwkJaCA9IHJhbmQoKSAlIChidWZfaGVpZ2h0IC0geSk7CisKKwkJaWYgKHcgPT0gMCkgdyA9IDE7CisJCWlmIChoID09IDApIGggPSAxOworCisJCWltZy5jb2xvciA9IHJhbmQoKTsKKworCQlyZXQgPSBnMmRfc29saWRfZmlsbChjdHgsICZpbWcsIHgsIHksIHcsIGgpOworCisJCWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHNwZWMpOworCisJCWlmIChyZXQgPT0gMCkKKwkJCXJldCA9IGcyZF9leGVjKGN0eCk7CisKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBpdGVyYXRpb24gJXUgZmFpbGVkICh4ID0gJXUsIHkgPSAldSwgdyA9ICV1LCBoID0gJXUpXG4iLAorCQkJCWksIHgsIHksIHcsIGgpOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgdGltZXNwZWMgZW5kID0geyAwIH07CisJCQljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmVuZCk7CisKKwkJCWcyZF90aW1lID0gKGVuZC50dl9zZWMgLSB0c3BlYy50dl9zZWMpICogMTAwMDAwMDAwMFVMTDsKKwkJCWcyZF90aW1lICs9IChlbmQudHZfbnNlYyAtIHRzcGVjLnR2X25zZWMpOworCisJCQlpZiAob3V0cHV0X21hdGhlbWF0aWNhKSB7CisJCQkJaWYgKGkgIT0gMCkgcHV0Y2hhcignLCcpOworCQkJCXByaW50ZigieyV1LCVsbHV9IiwgdyAqIGgsIGcyZF90aW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRmKCJudW1fcGl4ZWxzID0gJXUsIHVzZWNzID0gJWxsdVxuIiwgdyAqIGgsIGcyZF90aW1lKTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChvdXRwdXRfbWF0aGVtYXRpY2EpCisJCXByaW50ZigifVxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZpbWcyZF9wZXJmX211bHRpKHN0cnVjdCBleHlub3NfYm8gKmJvLCBzdHJ1Y3QgZzJkX2NvbnRleHQgKmN0eCwKKwkJCXVuc2lnbmVkIGJ1Zl93aWR0aCwgdW5zaWduZWQgYnVmX2hlaWdodCwgdW5zaWduZWQgaXRlcmF0aW9ucywgdW5zaWduZWQgYmF0Y2gpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzcGVjID0geyAwIH07CisJc3RydWN0IGcyZF9pbWFnZSAqaW1hZ2VzOworCisJdW5zaWduZWQgbG9uZyBsb25nIGcyZF90aW1lOworCXVuc2lnbmVkIGksIGo7CisJaW50IHJldCA9IDA7CisKKwlpbWFnZXMgPSBjYWxsb2MoYmF0Y2gsIHNpemVvZihzdHJ1Y3QgZzJkX2ltYWdlKSk7CisJaWYgKGltYWdlcyA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGZhaWxlZCB0byBhbGxvY2F0ZSBHMkQgaW1hZ2VzLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBiYXRjaDsgKytpKSB7CisJCWltYWdlc1tpXS53aWR0aCA9IGJ1Zl93aWR0aDsKKwkJaW1hZ2VzW2ldLmhlaWdodCA9IGJ1Zl9oZWlnaHQ7CisJCWltYWdlc1tpXS5zdHJpZGUgPSBidWZfd2lkdGggKiA0OworCQlpbWFnZXNbaV0uY29sb3JfbW9kZSA9IEcyRF9DT0xPUl9GTVRfQVJHQjg4ODggfCBHMkRfT1JERVJfQVhSR0I7CisJCWltYWdlc1tpXS5idWZfdHlwZSA9IEcyRF9JTUdCVUZfR0VNOworCQlpbWFnZXNbaV0uYm9bMF0gPSBiby0+aGFuZGxlOworCX0KKworCXNyYW5kKHRpbWUoTlVMTCkpOworCisJcHJpbnRmKCJzdGFydGluZyBtdWx0aSBHMkQgcGVyZm9ybWFuY2UgdGVzdCAoYmF0Y2ggc2l6ZSA9ICV1KVxuIiwgYmF0Y2gpOworCXByaW50ZigiYnVmZmVyIHdpZHRoID0gJXUsIGJ1ZmZlciBoZWlnaHQgPSAldSwgaXRlcmF0aW9ucyA9ICV1XG4iLAorCQlidWZfd2lkdGgsIGJ1Zl9oZWlnaHQsIGl0ZXJhdGlvbnMpOworCisJaWYgKG91dHB1dF9tYXRoZW1hdGljYSkKKwkJcHV0Y2hhcigneycpOworCisJZm9yIChpID0gMDsgaSA8IGl0ZXJhdGlvbnM7ICsraSkgeworCQl1bnNpZ25lZCBudW1fcGl4ZWxzID0gMDsKKworCQlmb3IgKGogPSAwOyBqIDwgYmF0Y2g7ICsraikgeworCQkJdW5zaWduZWQgeCwgeSwgdywgaDsKKworCQkJeCA9IHJhbmQoKSAlIGJ1Zl93aWR0aDsKKwkJCXkgPSByYW5kKCkgJSBidWZfaGVpZ2h0OworCisJCQlpZiAoeCA9PSAoYnVmX3dpZHRoIC0gMSkpCisJCQkJeCAtPSAxOworCQkJaWYgKHkgPT0gKGJ1Zl9oZWlnaHQgLSAxKSkKKwkJCQl5IC09IDE7CisKKwkJCXcgPSByYW5kKCkgJSAoYnVmX3dpZHRoIC0geCk7CisJCQloID0gcmFuZCgpICUgKGJ1Zl9oZWlnaHQgLSB5KTsKKworCQkJaWYgKHcgPT0gMCkgdyA9IDE7CisJCQlpZiAoaCA9PSAwKSBoID0gMTsKKworCQkJaW1hZ2VzW2pdLmNvbG9yID0gcmFuZCgpOworCisJCQludW1fcGl4ZWxzICs9IHcgKiBoOworCisJCQlyZXQgPSBnMmRfc29saWRfZmlsbChjdHgsICZpbWFnZXNbal0sIHgsIHksIHcsIGgpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0c3BlYyk7CisKKwkJaWYgKHJldCA9PSAwKQorCQkJcmV0ID0gZzJkX2V4ZWMoY3R4KTsKKworCQlpZiAocmV0ICE9IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGl0ZXJhdGlvbiAldSBmYWlsZWQgKG51bV9waXhlbHMgPSAldSlcbiIsIGksIG51bV9waXhlbHMpOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgdGltZXNwZWMgZW5kID0geyAwIH07CisJCQljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmVuZCk7CisKKwkJCWcyZF90aW1lID0gKGVuZC50dl9zZWMgLSB0c3BlYy50dl9zZWMpICogMTAwMDAwMDAwMFVMTDsKKwkJCWcyZF90aW1lICs9IChlbmQudHZfbnNlYyAtIHRzcGVjLnR2X25zZWMpOworCisJCQlpZiAob3V0cHV0X21hdGhlbWF0aWNhKSB7CisJCQkJaWYgKGkgIT0gMCkgcHV0Y2hhcignLCcpOworCQkJCXByaW50ZigieyV1LCVsbHV9IiwgbnVtX3BpeGVscywgZzJkX3RpbWUpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGYoIm51bV9waXhlbHMgPSAldSwgdXNlY3MgPSAlbGx1XG4iLCBudW1fcGl4ZWxzLCBnMmRfdGltZSk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAob3V0cHV0X21hdGhlbWF0aWNhKQorCQlwcmludGYoIn1cbiIpOworCisJZnJlZShpbWFnZXMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbLWlid2hdXG5cbiIsIG5hbWUpOworCisJZnByaW50ZihzdGRlcnIsICJcdC1pIDxudW1iZXIgb2YgaXRlcmF0aW9ucz5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtYiA8c2l6ZSBvZiBhIGJhdGNoPiAoZGVmYXVsdCA9IDMpXG5cbiIpOworCisJZnByaW50ZihzdGRlcnIsICJcdC13IDxidWZmZXIgd2lkdGg+IChkZWZhdWx0ID0gNDA5NilcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtaCA8YnVmZmVyIGhlaWdodD4gKGRlZmF1bHQgPSA0MDk2KVxuXG4iKTsKKworCWZwcmludGYoc3RkZXJyLCAiXHQtTSA8ZW5hYmxlIE1hdGhlbWF0aWNhIHN0eWxlZCBvdXRwdXQ+XG4iKTsKKworCWV4aXQoMCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgZmQsIHJldCwgYywgcGFyc2VmYWlsOworCisJc3RydWN0IGV4eW5vc19kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZzJkX2NvbnRleHQgKmN0eDsKKwlzdHJ1Y3QgZXh5bm9zX2JvICpibzsKKworCXVuc2lnbmVkIGludCBpdGVycyA9IDAsIGJhdGNoID0gMzsKKwl1bnNpZ25lZCBpbnQgYnVmdyA9IDQwOTYsIGJ1ZmggPSA0MDk2OworCisJcmV0ID0gMDsKKwlwYXJzZWZhaWwgPSAwOworCisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJpOmI6dzpoOk0iKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2knOgorCQkJaWYgKHNzY2FuZihvcHRhcmcsICIldSIsICZpdGVycykgIT0gMSkKKwkJCQlwYXJzZWZhaWwgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2InOgorCQkJaWYgKHNzY2FuZihvcHRhcmcsICIldSIsICZiYXRjaCkgIT0gMSkKKwkJCQlwYXJzZWZhaWwgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3cnOgorCQkJaWYgKHNzY2FuZihvcHRhcmcsICIldSIsICZidWZ3KSAhPSAxKQorCQkJCXBhcnNlZmFpbCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCQlpZiAoc3NjYW5mKG9wdGFyZywgIiV1IiwgJmJ1ZmgpICE9IDEpCisJCQkJcGFyc2VmYWlsID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdNJzoKKwkJCW91dHB1dF9tYXRoZW1hdGljYSA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXBhcnNlZmFpbCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChwYXJzZWZhaWwgfHwgKGFyZ2MgPT0gMSkgfHwgKGl0ZXJzID09IDApKQorCQl1c2FnZShhcmd2WzBdKTsKKworCWlmIChidWZ3IDwgMiB8fCBidWZ3ID4gNDA5NiB8fCBidWZoIDwgMiB8fCBidWZoID4gNDA5NikgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBidWZmZXIgd2lkdGgvaGVpZ2h0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgMiB0byA0MDk2LlxuIik7CisJCXJldCA9IC0xOworCisJCWdvdG8gb3V0OworCX0KKworCWlmIChidWZ3ID09IDAgfHwgYnVmaCA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGJ1ZmZlciB3aWR0aC9oZWlnaHQgc2hvdWxkIGJlIG5vbi16ZXJvLlxuIik7CisJCXJldCA9IC0xOworCisJCWdvdG8gb3V0OworCX0KKworCWZkID0gZHJtT3BlbigiZXh5bm9zIiwgTlVMTCk7CisJaWYgKGZkIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBmYWlsZWQgdG8gb3BlbiBkcm1cbiIpOworCQlyZXQgPSAtMTsKKworCQlnb3RvIG91dDsKKwl9CisKKwlkZXYgPSBleHlub3NfZGV2aWNlX2NyZWF0ZShmZCk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGZhaWxlZCB0byBjcmVhdGUgZGV2aWNlXG4iKTsKKwkJcmV0ID0gLTI7CisKKwkJZ290byBmYWlsOworCX0KKworCWN0eCA9IGcyZF9pbml0KGZkKTsKKwlpZiAoY3R4ID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogZmFpbGVkIHRvIGluaXQgRzJEXG4iKTsKKwkJcmV0ID0gLTM7CisKKwkJZ290byBnMmRfZmFpbDsKKwl9CisKKwlibyA9IGV4eW5vc19ib19jcmVhdGUoZGV2LCBidWZ3ICogYnVmaCAqIDQsIDApOworCWlmIChibyA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGZhaWxlZCB0byBjcmVhdGUgYm9cbiIpOworCQlyZXQgPSAtNDsKKworCQlnb3RvIGJvX2ZhaWw7CisJfQorCisJcmV0ID0gZmltZzJkX3BlcmZfc2ltcGxlKGJvLCBjdHgsIGJ1ZncsIGJ1ZmgsIGl0ZXJzKTsKKworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gZmltZzJkX3BlcmZfbXVsdGkoYm8sIGN0eCwgYnVmdywgYnVmaCwgaXRlcnMsIGJhdGNoKTsKKworCWV4eW5vc19ib19kZXN0cm95KGJvKTsKKworYm9fZmFpbDoKKwlnMmRfZmluaShjdHgpOworCitnMmRfZmFpbDoKKwlleHlub3NfZGV2aWNlX2Rlc3Ryb3koZGV2KTsKKworZmFpbDoKKwlkcm1DbG9zZShmZCk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXh5bm9zL2V4eW5vc19maW1nMmRfdGVzdC5jIGIvdGVzdHMvZXh5bm9zL2V4eW5vc19maW1nMmRfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMTAyOGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leHlub3MvZXh5bm9zX2ZpbWcyZF90ZXN0LmMKQEAgLTAsMCArMSw4OTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby5MdGQKKyAqIEF1dGhvcnM6CisgKglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisKKyNpbmNsdWRlIDx4Zjg2ZHJtLmg+CisjaW5jbHVkZSA8eGY4NmRybU1vZGUuaD4KKyNpbmNsdWRlIDxsaWJrbXMuaD4KKyNpbmNsdWRlIDxkcm1fZm91cmNjLmg+CisKKyNpbmNsdWRlICJleHlub3NfZHJtLmgiCisjaW5jbHVkZSAiZXh5bm9zX2RybWlmLmgiCisjaW5jbHVkZSAiZXh5bm9zX2ZpbWcyZC5oIgorCisjZGVmaW5lIERSTV9NT0RVTEVfTkFNRQkJImV4eW5vcyIKKworc3RhdGljIHVuc2lnbmVkIGludCBzY3JlZW5fd2lkdGgsIHNjcmVlbl9oZWlnaHQ7CisKK3N0cnVjdCBjb25uZWN0b3IgeworCXVpbnQzMl90IGlkOworCWNoYXIgbW9kZV9zdHJbNjRdOworCWRybU1vZGVNb2RlSW5mbyAqbW9kZTsKKwlkcm1Nb2RlRW5jb2RlciAqZW5jb2RlcjsKKwlpbnQgY3J0YzsKK307CisKK3N0YXRpYyB2b2lkIGNvbm5lY3Rvcl9maW5kX21vZGUoaW50IGZkLCBzdHJ1Y3QgY29ubmVjdG9yICpjLAorCQkJCWRybU1vZGVSZXMgKnJlc291cmNlcykKK3sKKwlkcm1Nb2RlQ29ubmVjdG9yICpjb25uZWN0b3I7CisJaW50IGksIGo7CisKKwkvKiBGaXJzdCwgZmluZCB0aGUgY29ubmVjdG9yICYgbW9kZSAqLworCWMtPm1vZGUgPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCByZXNvdXJjZXMtPmNvdW50X2Nvbm5lY3RvcnM7IGkrKykgeworCQljb25uZWN0b3IgPSBkcm1Nb2RlR2V0Q29ubmVjdG9yKGZkLCByZXNvdXJjZXMtPmNvbm5lY3RvcnNbaV0pOworCisJCWlmICghY29ubmVjdG9yKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBnZXQgY29ubmVjdG9yICVpOiAlc1xuIiwKKwkJCQlyZXNvdXJjZXMtPmNvbm5lY3RvcnNbaV0sIHN0cmVycm9yKGVycm5vKSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghY29ubmVjdG9yLT5jb3VudF9tb2RlcykgeworCQkJZHJtTW9kZUZyZWVDb25uZWN0b3IoY29ubmVjdG9yKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX2lkICE9IGMtPmlkKSB7CisJCQlkcm1Nb2RlRnJlZUNvbm5lY3Rvcihjb25uZWN0b3IpOworCQkJY29udGludWU7CisJCX0KKworCQlmb3IgKGogPSAwOyBqIDwgY29ubmVjdG9yLT5jb3VudF9tb2RlczsgaisrKSB7CisJCQljLT5tb2RlID0gJmNvbm5lY3Rvci0+bW9kZXNbal07CisJCQlpZiAoIXN0cmNtcChjLT5tb2RlLT5uYW1lLCBjLT5tb2RlX3N0cikpCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBGb3VuZCBpdCwgYnJlYWsgb3V0ICovCisJCWlmIChjLT5tb2RlKQorCQkJYnJlYWs7CisKKwkJZHJtTW9kZUZyZWVDb25uZWN0b3IoY29ubmVjdG9yKTsKKwl9CisKKwlpZiAoIWMtPm1vZGUpIHsKKwkJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gZmluZCBtb2RlIFwiJXNcIlxuIiwgYy0+bW9kZV9zdHIpOworCQlyZXR1cm47CisJfQorCisJLyogTm93IGdldCB0aGUgZW5jb2RlciAqLworCWZvciAoaSA9IDA7IGkgPCByZXNvdXJjZXMtPmNvdW50X2VuY29kZXJzOyBpKyspIHsKKwkJYy0+ZW5jb2RlciA9IGRybU1vZGVHZXRFbmNvZGVyKGZkLCByZXNvdXJjZXMtPmVuY29kZXJzW2ldKTsKKworCQlpZiAoIWMtPmVuY29kZXIpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGdldCBlbmNvZGVyICVpOiAlc1xuIiwKKwkJCQlyZXNvdXJjZXMtPmVuY29kZXJzW2ldLCBzdHJlcnJvcihlcnJubykpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoYy0+ZW5jb2Rlci0+ZW5jb2Rlcl9pZCAgPT0gY29ubmVjdG9yLT5lbmNvZGVyX2lkKQorCQkJYnJlYWs7CisKKwkJZHJtTW9kZUZyZWVFbmNvZGVyKGMtPmVuY29kZXIpOworCX0KKworCWlmIChjLT5jcnRjID09IC0xKQorCQljLT5jcnRjID0gYy0+ZW5jb2Rlci0+Y3J0Y19pZDsKK30KKworc3RhdGljIGludCBkcm1fc2V0X2NydGMoc3RydWN0IGV4eW5vc19kZXZpY2UgKmRldiwgc3RydWN0IGNvbm5lY3RvciAqYywKKwkJCXVuc2lnbmVkIGludCBmYl9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZHJtTW9kZVNldENydGMoZGV2LT5mZCwgYy0+Y3J0YywKKwkJCWZiX2lkLCAwLCAwLCAmYy0+aWQsIDEsIGMtPm1vZGUpOworCWlmIChyZXQpCisJCWRybU1zZygiZmFpbGVkIHRvIHNldCBtb2RlOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXh5bm9zX2JvICpleHlub3NfY3JlYXRlX2J1ZmZlcihzdHJ1Y3QgZXh5bm9zX2RldmljZSAqZGV2LAorCQkJCQkJdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCQkJdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBleHlub3NfYm8gKmJvOworCisJYm8gPSBleHlub3NfYm9fY3JlYXRlKGRldiwgc2l6ZSwgZmxhZ3MpOworCWlmICghYm8pCisJCXJldHVybiBibzsKKworCWlmICghZXh5bm9zX2JvX21hcChibykpIHsKKwkJZXh5bm9zX2JvX2Rlc3Ryb3koYm8pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gYm87Cit9CisKKy8qIEFsbG9jYXRlIGJ1ZmZlciBhbmQgZmlsbCBpdCB3aXRoIGNoZWNrZXJib2FyZCBwYXR0ZXJuLCB3aGVyZSB0aGUgdGlsZXMgKgorICogaGF2ZSBhIHJhbmRvbSBjb2xvci4gVGhlIGNhbGxlciBoYXMgdG8gZnJlZSB0aGUgYnVmZmVyLiAgICAgICAgICAgICAgICAqLworc3RhdGljIHZvaWQgKmNyZWF0ZV9jaGVja2VyYm9hcmRfcGF0dGVybih1bnNpZ25lZCBpbnQgbnVtX3RpbGVzX3gsCisJCQkJCQl1bnNpZ25lZCBpbnQgbnVtX3RpbGVzX3ksIHVuc2lnbmVkIGludCB0aWxlX3NpemUpCit7CisJdW5zaWduZWQgaW50ICpidWY7CisJdW5zaWduZWQgaW50IHgsIHksIGksIGo7CisJY29uc3QgdW5zaWduZWQgaW50IHN0cmlkZSA9IG51bV90aWxlc194ICogdGlsZV9zaXplOworCisJaWYgKHBvc2l4X21lbWFsaWduKCh2b2lkKikmYnVmLCA2NCwgbnVtX3RpbGVzX3kgKiB0aWxlX3NpemUgKiBzdHJpZGUgKiA0KSAhPSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoeCA9IDA7IHggPCBudW1fdGlsZXNfeDsgKyt4KSB7CisJCWZvciAoeSA9IDA7IHkgPCBudW1fdGlsZXNfeTsgKyt5KSB7CisJCQljb25zdCB1bnNpZ25lZCBpbnQgY29sb3IgPSAweGZmMDAwMDAwICsgKHJhbmRvbSgpICYgMHhmZmZmZmYpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgdGlsZV9zaXplOyArK2kpIHsKKwkJCQlmb3IgKGogPSAwOyBqIDwgdGlsZV9zaXplOyArK2opIHsKKwkJCQkJYnVmW3ggKiB0aWxlX3NpemUgKyB5ICogc3RyaWRlICogdGlsZV9zaXplICsgaSArIGogKiBzdHJpZGVdID0gY29sb3I7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zX2Rlc3Ryb3lfYnVmZmVyKHN0cnVjdCBleHlub3NfYm8gKmJvKQoreworCWV4eW5vc19ib19kZXN0cm95KGJvKTsKK30KKworc3RhdGljIHZvaWQgd2FpdF9mb3JfdXNlcl9pbnB1dChpbnQgbGFzdCkKK3sKKwlwcmludGYoInByZXNzIDxFTlRFUj4gdG8gJXNcbiIsIGxhc3QgPyAiZXhpdCB0ZXN0IGFwcGxpY2F0aW9uIiA6CisJCQkic2tpcCB0byBuZXh0IHRlc3QiKTsKKworCWdldGNoYXIoKTsKK30KKworc3RhdGljIGludCBnMmRfc29saWRfZmlsbF90ZXN0KHN0cnVjdCBleHlub3NfZGV2aWNlICpkZXYsIHN0cnVjdCBleHlub3NfYm8gKmRzdCkKK3sKKwlzdHJ1Y3QgZzJkX2NvbnRleHQgKmN0eDsKKwlzdHJ1Y3QgZzJkX2ltYWdlIGltZyA9IHswfTsKKwl1bnNpZ25lZCBpbnQgY291bnQsIGltZ193LCBpbWdfaDsKKwlpbnQgcmV0ID0gMDsKKworCWN0eCA9IGcyZF9pbml0KGRldi0+ZmQpOworCWlmICghY3R4KQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWltZy5ib1swXSA9IGRzdC0+aGFuZGxlOworCisJcHJpbnRmKCJzb2xpZCBmaWxsIHRlc3QuXG4iKTsKKworCXNyYW5kKHRpbWUoTlVMTCkpOworCWltZ193ID0gc2NyZWVuX3dpZHRoOworCWltZ19oID0gc2NyZWVuX2hlaWdodDsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDI7IGNvdW50KyspIHsKKwkJdW5zaWduZWQgaW50IHgsIHksIHcsIGg7CisKKwkJeCA9IHJhbmQoKSAlIChpbWdfdyAvIDIpOworCQl5ID0gcmFuZCgpICUgKGltZ19oIC8gMik7CisJCXcgPSByYW5kKCkgJSAoaW1nX3cgLSB4KTsKKwkJaCA9IHJhbmQoKSAlIChpbWdfaCAtIHkpOworCisJCWltZy53aWR0aCA9IGltZ193OworCQlpbWcuaGVpZ2h0ID0gaW1nX2g7CisJCWltZy5zdHJpZGUgPSBpbWcud2lkdGggKiA0OworCQlpbWcuY29sb3JfbW9kZSA9IEcyRF9DT0xPUl9GTVRfQVJHQjg4ODggfCBHMkRfT1JERVJfQVhSR0I7CisJCWltZy5jb2xvciA9IDB4ZmYwMDAwMDAgKyAocmFuZG9tKCkgJiAweGZmZmZmZik7CisKKwkJcmV0ID0gZzJkX3NvbGlkX2ZpbGwoY3R4LCAmaW1nLCB4LCB5LCB3LCBoKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycl9maW5pOworCisJCXJldCA9IGcyZF9leGVjKGN0eCk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisJfQorCitlcnJfZmluaToKKwlnMmRfZmluaShjdHgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnMmRfY29weV90ZXN0KHN0cnVjdCBleHlub3NfZGV2aWNlICpkZXYsIHN0cnVjdCBleHlub3NfYm8gKnNyYywKKwkJCQlzdHJ1Y3QgZXh5bm9zX2JvICpkc3QsCisJCQkJZW51bSBlX2cyZF9idWZfdHlwZSB0eXBlKQoreworCXN0cnVjdCBnMmRfY29udGV4dCAqY3R4OworCXN0cnVjdCBnMmRfaW1hZ2Ugc3JjX2ltZyA9IHswfSwgZHN0X2ltZyA9IHswfTsKKwl1bnNpZ25lZCBpbnQgc3JjX3gsIHNyY195LCBkc3RfeCwgZHN0X3ksIGltZ193LCBpbWdfaDsKKwl1bnNpZ25lZCBsb25nIHVzZXJwdHIsIHNpemU7CisJaW50IHJldDsKKworCWN0eCA9IGcyZF9pbml0KGRldi0+ZmQpOworCWlmICghY3R4KQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRzdF9pbWcuYm9bMF0gPSBkc3QtPmhhbmRsZTsKKworCXNyY194ID0gMDsKKwlzcmNfeSA9IDA7CisJZHN0X3ggPSAwOworCWRzdF95ID0gMDsKKwlpbWdfdyA9IHNjcmVlbl93aWR0aDsKKwlpbWdfaCA9IHNjcmVlbl9oZWlnaHQ7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEcyRF9JTUdCVUZfR0VNOgorCQlzcmNfaW1nLmJvWzBdID0gc3JjLT5oYW5kbGU7CisJCWJyZWFrOworCWNhc2UgRzJEX0lNR0JVRl9VU0VSUFRSOgorCQlzaXplID0gaW1nX3cgKiBpbWdfaCAqIDQ7CisKKwkJdXNlcnB0ciA9ICh1bnNpZ25lZCBsb25nKW1hbGxvYyhzaXplKTsKKwkJaWYgKCF1c2VycHRyKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBhbGxvY2F0ZSB1c2VycHRyLlxuIik7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBmYWlsOworCQl9CisKKwkJc3JjX2ltZy51c2VyX3B0clswXS51c2VycHRyID0gdXNlcnB0cjsKKwkJc3JjX2ltZy51c2VyX3B0clswXS5zaXplID0gc2l6ZTsKKwkJYnJlYWs7CisJY2FzZSBHMkRfSU1HQlVGX0NPTE9SOgorCWRlZmF1bHQ6CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwcmludGYoImNvcHkgdGVzdCB3aXRoICVzLlxuIiwKKwkJCXR5cGUgPT0gRzJEX0lNR0JVRl9HRU0gPyAiZ2VtIiA6ICJ1c2VycHRyIik7CisKKwlzcmNfaW1nLndpZHRoID0gaW1nX3c7CisJc3JjX2ltZy5oZWlnaHQgPSBpbWdfaDsKKwlzcmNfaW1nLnN0cmlkZSA9IHNyY19pbWcud2lkdGggKiA0OworCXNyY19pbWcuYnVmX3R5cGUgPSB0eXBlOworCXNyY19pbWcuY29sb3JfbW9kZSA9IEcyRF9DT0xPUl9GTVRfQVJHQjg4ODggfCBHMkRfT1JERVJfQVhSR0I7CisJc3JjX2ltZy5jb2xvciA9IDB4ZmZmZjAwMDA7CisJcmV0ID0gZzJkX3NvbGlkX2ZpbGwoY3R4LCAmc3JjX2ltZywgc3JjX3gsIHNyY195LCBpbWdfdywgaW1nX2gpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9mcmVlX3VzZXJwdHI7CisKKwlkc3RfaW1nLndpZHRoID0gaW1nX3c7CisJZHN0X2ltZy5oZWlnaHQgPSBpbWdfaDsKKwlkc3RfaW1nLnN0cmlkZSA9IGRzdF9pbWcud2lkdGggKiA0OworCWRzdF9pbWcuYnVmX3R5cGUgPSBHMkRfSU1HQlVGX0dFTTsKKwlkc3RfaW1nLmNvbG9yX21vZGUgPSBHMkRfQ09MT1JfRk1UX0FSR0I4ODg4IHwgRzJEX09SREVSX0FYUkdCOworCisJcmV0ID0gZzJkX2NvcHkoY3R4LCAmc3JjX2ltZywgJmRzdF9pbWcsIHNyY194LCBzcmNfeSwgZHN0X3gsIGRzdF95LAorCQkJaW1nX3cgLSA0LCBpbWdfaCAtIDQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9mcmVlX3VzZXJwdHI7CisKKwlnMmRfZXhlYyhjdHgpOworCitlcnJfZnJlZV91c2VycHRyOgorCWlmICh0eXBlID09IEcyRF9JTUdCVUZfVVNFUlBUUikKKwkJaWYgKHVzZXJwdHIpCisJCQlmcmVlKCh2b2lkICopdXNlcnB0cik7CisKK2ZhaWw6CisJZzJkX2ZpbmkoY3R4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZzJkX21vdmVfdGVzdChzdHJ1Y3QgZXh5bm9zX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBleHlub3NfYm8gKnRtcCwKKwkJCQlzdHJ1Y3QgZXh5bm9zX2JvICpidWYsCisJCQkJZW51bSBlX2cyZF9idWZfdHlwZSB0eXBlKQoreworCXN0cnVjdCBnMmRfY29udGV4dCAqY3R4OworCXN0cnVjdCBnMmRfaW1hZ2UgaW1nID0gezB9LCB0bXBfaW1nID0gezB9OworCXVuc2lnbmVkIGludCBpbWdfdywgaW1nX2gsIGNvdW50OworCWludCBjdXJfeCwgY3VyX3k7CisJdm9pZCAqY2hlY2tlcmJvYXJkOworCWludCByZXQ7CisKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGcyZF9zdGVwIHsKKwkJaW50IHgsIHk7CisJfSBzdGVwc1tdID0geworCQl7IDEsICAwfSwgeyAwLCAgMX0sCisJCXstMSwgIDB9LCB7IDAsIC0xfSwKKwkJeyAxLCAgMX0sIHstMSwgLTF9LAorCQl7IDEsIC0xfSwgey0xLCAgMX0sCisJCXsgMiwgIDF9LCB7IDEsICAyfSwKKwkJey0yLCAtMX0sIHstMSwgLTJ9LAorCQl7IDIsIC0xfSwgeyAxLCAtMn0sCisJCXstMiwgIDF9LCB7LTEsICAyfQorCX07CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBudW1fc3RlcHMgPQorCQlzaXplb2Yoc3RlcHMpIC8gc2l6ZW9mKHN0cnVjdCBnMmRfc3RlcCk7CisKKwljdHggPSBnMmRfaW5pdChkZXYtPmZkKTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpbWcuYm9bMF0gPSBidWYtPmhhbmRsZTsKKworCS8qIGNyZWF0ZSBwYXR0ZXJuIG9mIGhhbGYgdGhlIHNjcmVlbiBzaXplICovCisJY2hlY2tlcmJvYXJkID0gY3JlYXRlX2NoZWNrZXJib2FyZF9wYXR0ZXJuKHNjcmVlbl93aWR0aCAvIDY0LCBzY3JlZW5faGVpZ2h0IC8gNjQsIDMyKTsKKwlpZiAoIWNoZWNrZXJib2FyZCkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGZhaWw7CisJfQorCisJaW1nX3cgPSAoc2NyZWVuX3dpZHRoIC8gNjQpICogMzI7CisJaW1nX2ggPSAoc2NyZWVuX2hlaWdodCAvIDY0KSAqIDMyOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBHMkRfSU1HQlVGX0dFTToKKwkJbWVtY3B5KHRtcC0+dmFkZHIsIGNoZWNrZXJib2FyZCwgaW1nX3cgKiBpbWdfaCAqIDQpOworCQl0bXBfaW1nLmJvWzBdID0gdG1wLT5oYW5kbGU7CisJCWJyZWFrOworCWNhc2UgRzJEX0lNR0JVRl9VU0VSUFRSOgorCQl0bXBfaW1nLnVzZXJfcHRyWzBdLnVzZXJwdHIgPSAodW5zaWduZWQgbG9uZyljaGVja2VyYm9hcmQ7CisJCXRtcF9pbWcudXNlcl9wdHJbMF0uc2l6ZSA9IGltZ193ICogaW1nX2ggKiA0OworCQlicmVhazsKKwljYXNlIEcyRF9JTUdCVUZfQ09MT1I6CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBmYWlsOworCX0KKworCS8qIHNvbGlkIGZpbGwgZnJhbWVidWZmZXIgd2l0aCB3aGl0ZSBjb2xvciAqLworCWltZy53aWR0aCA9IHNjcmVlbl93aWR0aDsKKwlpbWcuaGVpZ2h0ID0gc2NyZWVuX2hlaWdodDsKKwlpbWcuc3RyaWRlID0gc2NyZWVuX3dpZHRoICogNDsKKwlpbWcuYnVmX3R5cGUgPSBHMkRfSU1HQlVGX0dFTTsKKwlpbWcuY29sb3JfbW9kZSA9IEcyRF9DT0xPUl9GTVRfQVJHQjg4ODggfCBHMkRfT1JERVJfQVhSR0I7CisJaW1nLmNvbG9yID0gMHhmZmZmZmZmZjsKKworCS8qIHB1dCBjaGVja2VyYm9hcmQgcGF0dGVybiBpbiB0aGUgY2VudGVyIG9mIHRoZSBmcmFtZWJ1ZmZlciAqLworCWN1cl94ID0gKHNjcmVlbl93aWR0aCAtIGltZ193KSAvIDI7CisJY3VyX3kgPSAoc2NyZWVuX2hlaWdodCAtIGltZ19oKSAvIDI7CisJdG1wX2ltZy53aWR0aCA9IGltZ193OworCXRtcF9pbWcuaGVpZ2h0ID0gaW1nX2g7CisJdG1wX2ltZy5zdHJpZGUgPSBpbWdfdyAqIDQ7CisJdG1wX2ltZy5idWZfdHlwZSA9IHR5cGU7CisJdG1wX2ltZy5jb2xvcl9tb2RlID0gRzJEX0NPTE9SX0ZNVF9BUkdCODg4OCB8IEcyRF9PUkRFUl9BWFJHQjsKKworCXJldCA9IGcyZF9zb2xpZF9maWxsKGN0eCwgJmltZywgMCwgMCwgc2NyZWVuX3dpZHRoLCBzY3JlZW5faGVpZ2h0KSB8fAorCQlnMmRfY29weShjdHgsICZ0bXBfaW1nLCAmaW1nLCAwLCAwLCBjdXJfeCwgY3VyX3ksIGltZ193LCBpbWdfaCk7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gZzJkX2V4ZWMoY3R4KTsKKwlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZmFpbDsKKworCXByaW50ZigibW92ZSB0ZXN0IHdpdGggJXMuXG4iLAorCQkJdHlwZSA9PSBHMkRfSU1HQlVGX0dFTSA/ICJnZW0iIDogInVzZXJwdHIiKTsKKworCXNyYW5kKHRpbWUoTlVMTCkpOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDI1NjsgKytjb3VudCkgeworCQljb25zdCBzdHJ1Y3QgZzJkX3N0ZXAgKnM7CisKKwkJLyogc2VsZWN0IHN0ZXAgYW5kIHZhbGlkYXRlIGl0ICovCisJCXdoaWxlICgxKSB7CisJCQlzID0gJnN0ZXBzW3JhbmRvbSgpICUgbnVtX3N0ZXBzXTsKKworCQkJaWYgKGN1cl94ICsgcy0+eCA8IDAgfHwgY3VyX3kgKyBzLT55IDwgMCB8fAorCQkJCWN1cl94ICsgaW1nX3cgKyBzLT54ID49IHNjcmVlbl93aWR0aCB8fAorCQkJCWN1cl95ICsgaW1nX2ggKyBzLT55ID49IHNjcmVlbl9oZWlnaHQpCisJCQkJY29udGludWU7CisJCQllbHNlCisJCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSBnMmRfbW92ZShjdHgsICZpbWcsIGN1cl94LCBjdXJfeSwgY3VyX3ggKyBzLT54LCBjdXJfeSArIHMtPnksCisJCQlpbWdfdywgaW1nX2gpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGcyZF9leGVjKGN0eCk7CisKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGZhaWw7CisKKwkJY3VyX3ggKz0gcy0+eDsKKwkJY3VyX3kgKz0gcy0+eTsKKworCQl1c2xlZXAoMTAwMDAwKTsKKwl9CisKK2ZhaWw6CisJZzJkX2ZpbmkoY3R4KTsKKworCWZyZWUoY2hlY2tlcmJvYXJkKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZzJkX2NvcHlfd2l0aF9zY2FsZV90ZXN0KHN0cnVjdCBleHlub3NfZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBleHlub3NfYm8gKnNyYywKKwkJCQkJc3RydWN0IGV4eW5vc19ibyAqZHN0LAorCQkJCQllbnVtIGVfZzJkX2J1Zl90eXBlIHR5cGUpCit7CisJc3RydWN0IGcyZF9jb250ZXh0ICpjdHg7CisJc3RydWN0IGcyZF9pbWFnZSBzcmNfaW1nID0gezB9LCBkc3RfaW1nID0gezB9OworCXVuc2lnbmVkIGludCBzcmNfeCwgc3JjX3ksIGltZ193LCBpbWdfaDsKKwl1bnNpZ25lZCBsb25nIHVzZXJwdHIsIHNpemU7CisJaW50IHJldDsKKworCWN0eCA9IGcyZF9pbml0KGRldi0+ZmQpOworCWlmICghY3R4KQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRzdF9pbWcuYm9bMF0gPSBkc3QtPmhhbmRsZTsKKworCXNyY194ID0gMDsKKwlzcmNfeSA9IDA7CisJaW1nX3cgPSBzY3JlZW5fd2lkdGg7CisJaW1nX2ggPSBzY3JlZW5faGVpZ2h0OworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBHMkRfSU1HQlVGX0dFTToKKwkJc3JjX2ltZy5ib1swXSA9IHNyYy0+aGFuZGxlOworCQlicmVhazsKKwljYXNlIEcyRF9JTUdCVUZfVVNFUlBUUjoKKwkJc2l6ZSA9IGltZ193ICogaW1nX2ggKiA0OworCisJCXVzZXJwdHIgPSAodW5zaWduZWQgbG9uZyltYWxsb2Moc2l6ZSk7CisJCWlmICghdXNlcnB0cikgeworCQkJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gYWxsb2NhdGUgdXNlcnB0ci5cbiIpOworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCXNyY19pbWcudXNlcl9wdHJbMF0udXNlcnB0ciA9IHVzZXJwdHI7CisJCXNyY19pbWcudXNlcl9wdHJbMF0uc2l6ZSA9IHNpemU7CisJCWJyZWFrOworCWNhc2UgRzJEX0lNR0JVRl9DT0xPUjoKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGZhaWw7CisJfQorCisJcHJpbnRmKCJjb3B5IGFuZCBzY2FsZSB0ZXN0IHdpdGggJXMuXG4iLAorCQkJdHlwZSA9PSBHMkRfSU1HQlVGX0dFTSA/ICJnZW0iIDogInVzZXJwdHIiKTsKKworCXNyY19pbWcud2lkdGggPSBpbWdfdzsKKwlzcmNfaW1nLmhlaWdodCA9IGltZ19oOworCXNyY19pbWcuc3RyaWRlID0gc3JjX2ltZy53aWR0aCAqIDQ7CisJc3JjX2ltZy5idWZfdHlwZSA9IHR5cGU7CisJc3JjX2ltZy5jb2xvcl9tb2RlID0gRzJEX0NPTE9SX0ZNVF9BUkdCODg4OCB8IEcyRF9PUkRFUl9BWFJHQjsKKwlzcmNfaW1nLmNvbG9yID0gMHhmZmZmZmZmZjsKKwlyZXQgPSBnMmRfc29saWRfZmlsbChjdHgsICZzcmNfaW1nLCBzcmNfeCwgc3JjX3ksIGltZ193ICwgIGltZ19oKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZnJlZV91c2VycHRyOworCisJc3JjX2ltZy5jb2xvciA9IDB4ZmYwMGZmMDA7CisJcmV0ID0gZzJkX3NvbGlkX2ZpbGwoY3R4LCAmc3JjX2ltZywgNSwgNSwgMTAwLCAxMDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9mcmVlX3VzZXJwdHI7CisKKwlkc3RfaW1nLndpZHRoID0gaW1nX3c7CisJZHN0X2ltZy5oZWlnaHQgPSBpbWdfaDsKKwlkc3RfaW1nLmJ1Zl90eXBlID0gRzJEX0lNR0JVRl9HRU07CisJZHN0X2ltZy5zdHJpZGUgPSBkc3RfaW1nLndpZHRoICogNDsKKwlkc3RfaW1nLmNvbG9yX21vZGUgPSBHMkRfQ09MT1JfRk1UX0FSR0I4ODg4IHwgRzJEX09SREVSX0FYUkdCOworCisJcmV0ID0gZzJkX2NvcHlfd2l0aF9zY2FsZShjdHgsICZzcmNfaW1nLCAmZHN0X2ltZywgNSwgNSwgMTAwLCAxMDAsCisJCQkJCTEwMCwgMTAwLCAyMDAsIDIwMCwgMCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2ZyZWVfdXNlcnB0cjsKKworCWcyZF9leGVjKGN0eCk7CisKK2Vycl9mcmVlX3VzZXJwdHI6CisJaWYgKHR5cGUgPT0gRzJEX0lNR0JVRl9VU0VSUFRSKQorCQlpZiAodXNlcnB0cikKKwkJCWZyZWUoKHZvaWQgKil1c2VycHRyKTsKKworZmFpbDoKKwlnMmRfZmluaShjdHgpOworCisJcmV0dXJuIHJldDs7Cit9CisKKyNpZiBFWFlOT1NfRzJEX1VTRVJQVFJfVEVTVAorc3RhdGljIGludCBnMmRfYmxlbmRfdGVzdChzdHJ1Y3QgZXh5bm9zX2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZXh5bm9zX2JvICpzcmMsCisJCQkJCXN0cnVjdCBleHlub3NfYm8gKmRzdCwKKwkJCQkJZW51bSBlX2cyZF9idWZfdHlwZSB0eXBlKQoreworCXN0cnVjdCBnMmRfY29udGV4dCAqY3R4OworCXN0cnVjdCBnMmRfaW1hZ2Ugc3JjX2ltZyA9IHswfSwgZHN0X2ltZyA9IHswfTsKKwl1bnNpZ25lZCBpbnQgc3JjX3gsIHNyY195LCBkc3RfeCwgZHN0X3ksIGltZ193LCBpbWdfaDsKKwl1bnNpZ25lZCBsb25nIHVzZXJwdHIsIHNpemU7CisJaW50IHJldDsKKworCWN0eCA9IGcyZF9pbml0KGRldi0+ZmQpOworCWlmICghY3R4KQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRzdF9pbWcuYm9bMF0gPSBkc3QtPmhhbmRsZTsKKworCXNyY194ID0gMDsKKwlzcmNfeSA9IDA7CisJZHN0X3ggPSAwOworCWRzdF95ID0gMDsKKwlpbWdfdyA9IHNjcmVlbl93aWR0aDsKKwlpbWdfaCA9IHNjcmVlbl9oZWlnaHQ7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEcyRF9JTUdCVUZfR0VNOgorCQlzcmNfaW1nLmJvWzBdID0gc3JjLT5oYW5kbGU7CisJCWJyZWFrOworCWNhc2UgRzJEX0lNR0JVRl9VU0VSUFRSOgorCQlzaXplID0gaW1nX3cgKiBpbWdfaCAqIDQ7CisKKwkJdXNlcnB0ciA9ICh1bnNpZ25lZCBsb25nKW1hbGxvYyhzaXplKTsKKwkJaWYgKCF1c2VycHRyKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBhbGxvY2F0ZSB1c2VycHRyLlxuIik7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBmYWlsOworCQl9CisKKwkJc3JjX2ltZy51c2VyX3B0clswXS51c2VycHRyID0gdXNlcnB0cjsKKwkJc3JjX2ltZy51c2VyX3B0clswXS5zaXplID0gc2l6ZTsKKwkJYnJlYWs7CisJY2FzZSBHMkRfSU1HQlVGX0NPTE9SOgorCWRlZmF1bHQ6CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwcmludGYoImJsZW5kIHRlc3Qgd2l0aCAlcy5cbiIsCisJCQl0eXBlID09IEcyRF9JTUdCVUZfR0VNID8gImdlbSIgOiAidXNlcnB0ciIpOworCisJc3JjX2ltZy53aWR0aCA9IGltZ193OworCXNyY19pbWcuaGVpZ2h0ID0gaW1nX2g7CisJc3JjX2ltZy5zdHJpZGUgPSBzcmNfaW1nLndpZHRoICogNDsKKwlzcmNfaW1nLmJ1Zl90eXBlID0gdHlwZTsKKwlzcmNfaW1nLnNlbGVjdF9tb2RlID0gRzJEX1NFTEVDVF9NT0RFX05PUk1BTDsKKwlzcmNfaW1nLmNvbG9yX21vZGUgPSBHMkRfQ09MT1JfRk1UX0FSR0I4ODg4IHwgRzJEX09SREVSX0FYUkdCOworCXNyY19pbWcuY29sb3IgPSAweGZmZmZmZmZmOworCXJldCA9IGcyZF9zb2xpZF9maWxsKGN0eCwgJnNyY19pbWcsIHNyY194LCBzcmNfeSwgaW1nX3csIGltZ19oKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZnJlZV91c2VycHRyOworCisJc3JjX2ltZy5jb2xvciA9IDB4NzcwMDAwZmY7CisJcmV0ID0gZzJkX3NvbGlkX2ZpbGwoY3R4LCAmc3JjX2ltZywgNSwgNSwgMjAwLCAyMDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9mcmVlX3VzZXJwdHI7CisKKwlkc3RfaW1nLndpZHRoID0gaW1nX3c7CisJZHN0X2ltZy5oZWlnaHQgPSBpbWdfaDsKKwlkc3RfaW1nLnN0cmlkZSA9IGRzdF9pbWcud2lkdGggKiA0OworCWRzdF9pbWcuYnVmX3R5cGUgPSBHMkRfSU1HQlVGX0dFTTsKKwlkc3RfaW1nLnNlbGVjdF9tb2RlID0gRzJEX1NFTEVDVF9NT0RFX05PUk1BTDsKKwlkc3RfaW1nLmNvbG9yX21vZGUgPSBHMkRfQ09MT1JfRk1UX0FSR0I4ODg4IHwgRzJEX09SREVSX0FYUkdCOworCWRzdF9pbWcuY29sb3IgPSAweGZmZmZmZmZmOworCXJldCA9IGcyZF9zb2xpZF9maWxsKGN0eCwgJmRzdF9pbWcsIGRzdF94LCBkc3RfeSwgaW1nX3csIGltZ19oKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZnJlZV91c2VycHRyOworCisJZHN0X2ltZy5jb2xvciA9IDB4NzdmZjAwMDA7CisJcmV0ID0gZzJkX3NvbGlkX2ZpbGwoY3R4LCAmZHN0X2ltZywgMTA1LCAxMDUsIDIwMCwgMjAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZnJlZV91c2VycHRyOworCisJcmV0ID0gZzJkX2JsZW5kKGN0eCwgJnNyY19pbWcsICZkc3RfaW1nLCA1LCA1LCAxMDUsIDEwNSwgMjAwLCAyMDAsCisJCQlHMkRfT1BfT1ZFUik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2ZyZWVfdXNlcnB0cjsKKworCWcyZF9leGVjKGN0eCk7CisKK2Vycl9mcmVlX3VzZXJwdHI6CisJaWYgKHR5cGUgPT0gRzJEX0lNR0JVRl9VU0VSUFRSKQorCQlpZiAodXNlcnB0cikKKwkJCWZyZWUoKHZvaWQgKil1c2VycHRyKTsKKworZmFpbDoKKwlnMmRfZmluaShjdHgpOworCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGcyZF9jaGVja2VyYm9hcmRfdGVzdChzdHJ1Y3QgZXh5bm9zX2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZXh5bm9zX2JvICpzcmMsCisJCQkJCXN0cnVjdCBleHlub3NfYm8gKmRzdCwKKwkJCQkJZW51bSBlX2cyZF9idWZfdHlwZSB0eXBlKQoreworCXN0cnVjdCBnMmRfY29udGV4dCAqY3R4OworCXN0cnVjdCBnMmRfaW1hZ2Ugc3JjX2ltZyA9IHswfSwgZHN0X2ltZyA9IHswfTsKKwl1bnNpZ25lZCBpbnQgc3JjX3gsIHNyY195LCBkc3RfeCwgZHN0X3ksIGltZ193LCBpbWdfaDsKKwl2b2lkICpjaGVja2VyYm9hcmQgPSBOVUxMOworCWludCByZXQ7CisKKwljdHggPSBnMmRfaW5pdChkZXYtPmZkKTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkc3RfaW1nLmJvWzBdID0gZHN0LT5oYW5kbGU7CisKKwlzcmNfeCA9IDA7CisJc3JjX3kgPSAwOworCWRzdF94ID0gMDsKKwlkc3RfeSA9IDA7CisKKwljaGVja2VyYm9hcmQgPSBjcmVhdGVfY2hlY2tlcmJvYXJkX3BhdHRlcm4oc2NyZWVuX3dpZHRoIC8gMzIsIHNjcmVlbl9oZWlnaHQgLyAzMiwgMzIpOworCWlmICghY2hlY2tlcmJvYXJkKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpbWdfdyA9IHNjcmVlbl93aWR0aCAtIChzY3JlZW5fd2lkdGggJSAzMik7CisJaW1nX2ggPSBzY3JlZW5faGVpZ2h0IC0gKHNjcmVlbl9oZWlnaHQgJSAzMik7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEcyRF9JTUdCVUZfR0VNOgorCQltZW1jcHkoc3JjLT52YWRkciwgY2hlY2tlcmJvYXJkLCBpbWdfdyAqIGltZ19oICogNCk7CisJCXNyY19pbWcuYm9bMF0gPSBzcmMtPmhhbmRsZTsKKwkJYnJlYWs7CisJY2FzZSBHMkRfSU1HQlVGX1VTRVJQVFI6CisJCXNyY19pbWcudXNlcl9wdHJbMF0udXNlcnB0ciA9ICh1bnNpZ25lZCBsb25nKWNoZWNrZXJib2FyZDsKKwkJc3JjX2ltZy51c2VyX3B0clswXS5zaXplID0gaW1nX3cgKiBpbWdfaCAqIDQ7CisJCWJyZWFrOworCWNhc2UgRzJEX0lNR0JVRl9DT0xPUjoKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGZhaWw7CisJfQorCisJcHJpbnRmKCJjaGVja2VyYm9hcmQgdGVzdCB3aXRoICVzLlxuIiwKKwkJCXR5cGUgPT0gRzJEX0lNR0JVRl9HRU0gPyAiZ2VtIiA6ICJ1c2VycHRyIik7CisKKwlzcmNfaW1nLndpZHRoID0gaW1nX3c7CisJc3JjX2ltZy5oZWlnaHQgPSBpbWdfaDsKKwlzcmNfaW1nLnN0cmlkZSA9IHNyY19pbWcud2lkdGggKiA0OworCXNyY19pbWcuYnVmX3R5cGUgPSB0eXBlOworCXNyY19pbWcuY29sb3JfbW9kZSA9IEcyRF9DT0xPUl9GTVRfQVJHQjg4ODggfCBHMkRfT1JERVJfQVhSR0I7CisKKwlkc3RfaW1nLndpZHRoID0gc2NyZWVuX3dpZHRoOworCWRzdF9pbWcuaGVpZ2h0ID0gc2NyZWVuX2hlaWdodDsKKwlkc3RfaW1nLnN0cmlkZSA9IGRzdF9pbWcud2lkdGggKiA0OworCWRzdF9pbWcuYnVmX3R5cGUgPSBHMkRfSU1HQlVGX0dFTTsKKwlkc3RfaW1nLmNvbG9yX21vZGUgPSBHMkRfQ09MT1JfRk1UX0FSR0I4ODg4IHwgRzJEX09SREVSX0FYUkdCOworCXNyY19pbWcuY29sb3IgPSAweGZmMDAwMDAwOworCXJldCA9IGcyZF9zb2xpZF9maWxsKGN0eCwgJmRzdF9pbWcsIHNyY194LCBzcmNfeSwgc2NyZWVuX3dpZHRoLCBzY3JlZW5faGVpZ2h0KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmYWlsOworCisJcmV0ID0gZzJkX2NvcHkoY3R4LCAmc3JjX2ltZywgJmRzdF9pbWcsIHNyY194LCBzcmNfeSwgZHN0X3gsIGRzdF95LAorCQkJaW1nX3csIGltZ19oKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmYWlsOworCisJZzJkX2V4ZWMoY3R4KTsKKworZmFpbDoKKwlmcmVlKGNoZWNrZXJib2FyZCk7CisJZzJkX2ZpbmkoY3R4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHVzYWdlKGNoYXIgKm5hbWUpCit7CisJZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgWy1zXVxuIiwgbmFtZSk7CisJZnByaW50ZihzdGRlcnIsICItcyA8Y29ubmVjdG9yX2lkPkA8Y3J0Y19pZD46PG1vZGU+XG4iKTsKKwlleGl0KDApOworfQorCitleHRlcm4gY2hhciAqb3B0YXJnOworc3RhdGljIGNvbnN0IGNoYXIgb3B0c3RyW10gPSAiczoiOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGV4eW5vc19kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZXh5bm9zX2JvICpibywgKnNyYzsKKwlzdHJ1Y3QgY29ubmVjdG9yIGNvbjsKKwl1bnNpZ25lZCBpbnQgZmJfaWQ7CisJdWludDMyX3QgaGFuZGxlc1s0XSA9IHswfSwgcGl0Y2hlc1s0XSA9IHswfSwgb2Zmc2V0c1s0XSA9IHswfTsKKwlkcm1Nb2RlUmVzICpyZXNvdXJjZXM7CisJaW50IHJldCwgZmQsIGM7CisKKwltZW1zZXQoJmNvbiwgMCwgc2l6ZW9mKHN0cnVjdCBjb25uZWN0b3IpKTsKKworCWlmIChhcmdjICE9IDMpIHsKKwkJdXNhZ2UoYXJndlswXSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCBvcHRzdHIpKSAhPSAtMSkgeworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAncyc6CisJCQljb24uY3J0YyA9IC0xOworCQkJaWYgKHNzY2FuZihvcHRhcmcsICIlZDoweCU2NHMiLAorCQkJCQkJJmNvbi5pZCwKKwkJCQkJCWNvbi5tb2RlX3N0cikgIT0gMiAmJgorCQkJCQlzc2NhbmYob3B0YXJnLCAiJWRAJWQ6JTY0cyIsCisJCQkJCQkmY29uLmlkLAorCQkJCQkJJmNvbi5jcnRjLAorCQkJCQkJY29uLm1vZGVfc3RyKSAhPSAzKQorCQkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl1c2FnZShhcmd2WzBdKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZmQgPSBkcm1PcGVuKERSTV9NT0RVTEVfTkFNRSwgTlVMTCk7CisJaWYgKGZkIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBvcGVuLlxuIik7CisJCXJldHVybiBmZDsKKwl9CisKKwlkZXYgPSBleHlub3NfZGV2aWNlX2NyZWF0ZShmZCk7CisJaWYgKCFkZXYpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJfZHJtX2Nsb3NlOworCX0KKworCXJlc291cmNlcyA9IGRybU1vZGVHZXRSZXNvdXJjZXMoZGV2LT5mZCk7CisJaWYgKCFyZXNvdXJjZXMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJkcm1Nb2RlR2V0UmVzb3VyY2VzIGZhaWxlZDogJXNcbiIsCisJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJfZGV2X2Rlc3Rvcnk7CisJfQorCisJY29ubmVjdG9yX2ZpbmRfbW9kZShkZXYtPmZkLCAmY29uLCByZXNvdXJjZXMpOworCWRybU1vZGVGcmVlUmVzb3VyY2VzKHJlc291cmNlcyk7CisKKwlpZiAoIWNvbi5tb2RlKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIGZpbmQgdXNhYmxlIGNvbm5lY3RvclxuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyX2Rldl9kZXN0b3J5OworCX0KKworCXNjcmVlbl93aWR0aCA9IGNvbi5tb2RlLT5oZGlzcGxheTsKKwlzY3JlZW5faGVpZ2h0ID0gY29uLm1vZGUtPnZkaXNwbGF5OworCisJaWYgKHNjcmVlbl93aWR0aCA9PSAwIHx8IHNjcmVlbl9oZWlnaHQgPT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBmaW5kIHNhbmUgcmVzb2x1dGlvbiBvbiBjb25uZWN0b3JcbiIpOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycl9kZXZfZGVzdG9yeTsKKwl9CisKKwlwcmludGYoInNjcmVlbiB3aWR0aCA9ICVkLCBzY3JlZW4gaGVpZ2h0ID0gJWRcbiIsIHNjcmVlbl93aWR0aCwKKwkJCXNjcmVlbl9oZWlnaHQpOworCisJYm8gPSBleHlub3NfY3JlYXRlX2J1ZmZlcihkZXYsIHNjcmVlbl93aWR0aCAqIHNjcmVlbl9oZWlnaHQgKiA0LCAwKTsKKwlpZiAoIWJvKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyX2Rldl9kZXN0b3J5OworCX0KKworCWhhbmRsZXNbMF0gPSBiby0+aGFuZGxlOworCXBpdGNoZXNbMF0gPSBzY3JlZW5fd2lkdGggKiA0OworCW9mZnNldHNbMF0gPSAwOworCisJcmV0ID0gZHJtTW9kZUFkZEZCMihkZXYtPmZkLCBzY3JlZW5fd2lkdGgsIHNjcmVlbl9oZWlnaHQsCisJCQkJRFJNX0ZPUk1BVF9YUkdCODg4OCwgaGFuZGxlcywKKwkJCQlwaXRjaGVzLCBvZmZzZXRzLCAmZmJfaWQsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9kZXN0cm95X2J1ZmZlcjsKKworCW1lbXNldChiby0+dmFkZHIsIDB4ZmYsIHNjcmVlbl93aWR0aCAqIHNjcmVlbl9oZWlnaHQgKiA0KTsKKworCXJldCA9IGRybV9zZXRfY3J0YyhkZXYsICZjb24sIGZiX2lkKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcm1fZmI7CisKKwlyZXQgPSBnMmRfc29saWRfZmlsbF90ZXN0KGRldiwgYm8pOworCWlmIChyZXQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIHNvbGlkIGZpbGwgb3BlcmF0aW9uLlxuIik7CisJCWdvdG8gZXJyX3JtX2ZiOworCX0KKworCXdhaXRfZm9yX3VzZXJfaW5wdXQoMCk7CisKKwlzcmMgPSBleHlub3NfY3JlYXRlX2J1ZmZlcihkZXYsIHNjcmVlbl93aWR0aCAqIHNjcmVlbl9oZWlnaHQgKiA0LCAwKTsKKwlpZiAoIXNyYykgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycl9ybV9mYjsKKwl9CisKKwlyZXQgPSBnMmRfY29weV90ZXN0KGRldiwgc3JjLCBibywgRzJEX0lNR0JVRl9HRU0pOworCWlmIChyZXQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIHRlc3QgY29weSBvcGVyYXRpb24uXG4iKTsKKwkJZ290byBlcnJfZnJlZV9zcmM7CisJfQorCisJd2FpdF9mb3JfdXNlcl9pbnB1dCgwKTsKKworCXJldCA9IGcyZF9tb3ZlX3Rlc3QoZGV2LCBzcmMsIGJvLCBHMkRfSU1HQlVGX0dFTSk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gdGVzdCBtb3ZlIG9wZXJhdGlvbi5cbiIpOworCQlnb3RvIGVycl9mcmVlX3NyYzsKKwl9CisKKwl3YWl0X2Zvcl91c2VyX2lucHV0KDApOworCisJcmV0ID0gZzJkX2NvcHlfd2l0aF9zY2FsZV90ZXN0KGRldiwgc3JjLCBibywgRzJEX0lNR0JVRl9HRU0pOworCWlmIChyZXQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIHRlc3QgY29weSBhbmQgc2NhbGUgb3BlcmF0aW9uLlxuIik7CisJCWdvdG8gZXJyX2ZyZWVfc3JjOworCX0KKworCXdhaXRfZm9yX3VzZXJfaW5wdXQoMCk7CisKKwlyZXQgPSBnMmRfY2hlY2tlcmJvYXJkX3Rlc3QoZGV2LCBzcmMsIGJvLCBHMkRfSU1HQlVGX0dFTSk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gaXNzdWUgY2hlY2tlcmJvYXJkIHRlc3QuXG4iKTsKKwkJZ290byBlcnJfZnJlZV9zcmM7CisJfQorCisJd2FpdF9mb3JfdXNlcl9pbnB1dCgxKTsKKworCS8qCisJICogVGhlIGJsZW5kIHRlc3QgdXNlcyB0aGUgdXNlcnB0ciBmdW5jdGlvbmFsaXR5IG9mIGV4eW5vcy1kcm0sIHdoaWNoCisJICogaXMgY3VycmVudGx5IG5vdCBzYWZlIHRvIHVzZS4gSWYgdGhlIGtlcm5lbCBoYXNuJ3QgYmVlbiBidWlsZCB3aXRoCisJICogZXh5bm9zLWlvbW11IHN1cHBvcnQsIHRoZW4gdGhlIGJsZW5kIHRlc3QgaXMgZ29pbmcgdG8gcHJvZHVjZSAoa2VybmVsKQorCSAqIG1lbW9yeSBjb3JydXB0aW9uLCBldmVudHVhbGx5IGxlYWRpbmcgdG8gYSBzeXN0ZW0gY3Jhc2guCisJICoKKwkgKiBEaXNhYmxlIHRoZSB0ZXN0IGZvciBub3csIHVudGlsIHRoZSBrZXJuZWwgY29kZSBoYXMgYmVlbiBzYW5pdGl6ZWQuCisJICovCisjaWYgRVhZTk9TX0cyRF9VU0VSUFRSX1RFU1QKKwlyZXQgID0gZzJkX2JsZW5kX3Rlc3QoZGV2LCBzcmMsIGJvLCBHMkRfSU1HQlVGX1VTRVJQVFIpOworCWlmIChyZXQgPCAwKQorCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byB0ZXN0IGJsZW5kIG9wZXJhdGlvbi5cbiIpOworCisJZ2V0Y2hhcigpOworI2VuZGlmCisKK2Vycl9mcmVlX3NyYzoKKwlpZiAoc3JjKQorCQlleHlub3NfZGVzdHJveV9idWZmZXIoc3JjKTsKKworZXJyX3JtX2ZiOgorCWRybU1vZGVSbUZCKGRldi0+ZmQsIGZiX2lkKTsKKworZXJyX2Rlc3Ryb3lfYnVmZmVyOgorCWV4eW5vc19kZXN0cm95X2J1ZmZlcihibyk7CisKK2Vycl9kZXZfZGVzdG9yeToKKwlleHlub3NfZGV2aWNlX2Rlc3Ryb3koZGV2KTsKKworZXJyX2RybV9jbG9zZToKKwlkcm1DbG9zZShmZCk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaGFzaC5jIGIvdGVzdHMvaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NzVmYmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9oYXNoLmMKQEAgLTAsMCArMSwyMTcgQEAKKy8qIHhmODZkcm1IYXNoLmMgLS0gU21hbGwgaGFzaCB0YWJsZSBzdXBwb3J0IGZvciBpbnRlZ2VyIC0+IGludGVnZXIgbWFwcGluZworICogQ3JlYXRlZDogU3VuIEFwciAxOCAwOTozNTo0NSAxOTk5IGJ5IGZhaXRoQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKgorICogREVTQ1JJUFRJT04KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYSBzdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2YgYSBmaXhlZC1zaXplZAorICogaGFzaCB0YWJsZSB1c2luZyBzZWxmLW9yZ2FuaXppbmcgbGlua2VkIGxpc3RzIFtLbnV0aDczLCBwcC4gMzk4LTM5OV0gZm9yCisgKiBjb2xsaXNpb24gcmVzb2x1dGlvbi4gIFRoZXJlIGFyZSB0d28gcG90ZW50aWFsbHkgaW50ZXJlc3RpbmcgdGhpbmdzCisgKiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uOgorICoKKyAqIDEpIFRoZSB0YWJsZSBpcyBwb3dlci1vZi10d28gc2l6ZWQuICBQcmltZSBzaXplZCB0YWJsZXMgYXJlIG1vcmUKKyAqIHRyYWRpdGlvbmFsLCBidXQgZG8gbm90IGhhdmUgYSBzaWduaWZpY2FudCBhZHZhbnRhZ2Ugb3ZlciBwb3dlci1vZi10d28KKyAqIHNpemVkIHRhYmxlLCBlc3BlY2lhbGx5IHdoZW4gZG91YmxlIGhhc2hpbmcgaXMgbm90IHVzZWQgZm9yIGNvbGxpc2lvbgorICogcmVzb2x1dGlvbi4KKyAqCisgKiAyKSBUaGUgaGFzaCBjb21wdXRhdGlvbiB1c2VzIGEgdGFibGUgb2YgcmFuZG9tIGludGVnZXJzIFtIYW5zb245NywKKyAqIHBwLiAzOS00MV0uCisgKgorICogRlVUVVJFIEVOSEFOQ0VNRU5UUworICoKKyAqIFdpdGggYSB0YWJsZSBzaXplIG9mIDUxMiwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgc3VmZmljaWVudCBmb3IgYQorICogZmV3IGh1bmRyZWQga2V5cy4gIFNpbmNlIHRoaXMgaXMgd2VsbCBhYm92ZSB0aGUgZXhwZWN0ZWQgc2l6ZSBvZiB0aGUKKyAqIHRhYmxlcyBmb3Igd2hpY2ggdGhpcyBpbXBsZW1lbnRhdGlvbiB3YXMgZGVzaWduZWQsIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorICogZHluYW1pYyBoYXNoIHRhYmxlcyB3YXMgcG9zdHBvbmVkIHVudGlsIHRoZSBuZWVkIGFyaXNlcy4gIEEgY29tbW9uIChhbmQKKyAqIG5haXZlKSBhcHByb2FjaCB0byBkeW5hbWljIGhhc2ggdGFibGUgaW1wbGVtZW50YXRpb24gc2ltcGx5IGNyZWF0ZXMgYQorICogbmV3IGhhc2ggdGFibGUgd2hlbiBuZWNlc3NhcnksIHJlaGFzaGVzIGFsbCB0aGUgZGF0YSBpbnRvIHRoZSBuZXcgdGFibGUsCisgKiBhbmQgZGVzdHJveXMgdGhlIG9sZCB0YWJsZS4gIFRoZSBhcHByb2FjaCBpbiBbTGFyc29uODhdIGlzIHN1cGVyaW9yIGluCisgKiB0d28gd2F5czogMSkgb25seSBhIHBvcnRpb24gb2YgdGhlIHRhYmxlIGlzIGV4cGFuZGVkIHdoZW4gbmVlZGVkLAorICogZGlzdHJpYnV0aW5nIHRoZSBleHBhbnNpb24gY29zdCBvdmVyIHNldmVyYWwgaW5zZXJ0aW9ucywgYW5kIDIpIHBvcnRpb25zCisgKiBvZiB0aGUgdGFibGUgY2FuIGJlIGxvY2tlZCwgZW5hYmxpbmcgYSBzY2FsYWJsZSB0aHJlYWQtc2FmZQorICogaW1wbGVtZW50YXRpb24uCisgKgorICogUkVGRVJFTkNFUworICoKKyAqIFtIYW5zb245N10gRGF2aWQgUi4gSGFuc29uLiAgQyBJbnRlcmZhY2VzIGFuZCBJbXBsZW1lbnRhdGlvbnM6CisgKiBUZWNobmlxdWVzIGZvciBDcmVhdGluZyBSZXVzYWJsZSBTb2Z0d2FyZS4gIFJlYWRpbmcsIE1hc3NhY2h1c2V0dHM6CisgKiBBZGRpc29uLVdlc2xleSwgMTk5Ny4KKyAqCisgKiBbS251dGg3M10gRG9uYWxkIEUuIEtudXRoLiBUaGUgQXJ0IG9mIENvbXB1dGVyIFByb2dyYW1taW5nLiAgVm9sdW1lIDM6CisgKiBTb3J0aW5nIGFuZCBTZWFyY2hpbmcuICBSZWFkaW5nLCBNYXNzYWNodXNldHRzOiBBZGRpc29uLVdlc2xleSwgMTk3My4KKyAqCisgKiBbTGFyc29uODhdIFBlci1Ba2UgTGFyc29uLiAiRHluYW1pYyBIYXNoIFRhYmxlcyIuICBDQUNNIDMxKDQpLCBBcHJpbAorICogMTk4OCwgcHAuIDQ0Ni00NTcuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAieGY4NmRybS5oIgorI2luY2x1ZGUgInhmODZkcm1IYXNoLmgiCisKKyNkZWZpbmUgRElTVF9MSU1JVCAxMAorc3RhdGljIGludCBkaXN0W0RJU1RfTElNSVRdOworCitzdGF0aWMgdm9pZCBjbGVhcl9kaXN0KHZvaWQpIHsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBESVNUX0xJTUlUOyBpKyspCisgICAgICAgIGRpc3RbaV0gPSAwOworfQorCitzdGF0aWMgaW50IGNvdW50X2VudHJpZXMoSGFzaEJ1Y2tldFB0ciBidWNrZXQpCit7CisgICAgaW50IGNvdW50ID0gMDsKKworICAgIGZvciAoOyBidWNrZXQ7IGJ1Y2tldCA9IGJ1Y2tldC0+bmV4dCkKKyAgICAgICAgKytjb3VudDsKKyAgICByZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9kaXN0KGludCBjb3VudCkKK3sKKyAgICBpZiAoY291bnQgPj0gRElTVF9MSU1JVCkKKyAgICAgICAgKytkaXN0W0RJU1RfTElNSVQtMV07CisgICAgZWxzZQorICAgICAgICArK2Rpc3RbY291bnRdOworfQorCitzdGF0aWMgdm9pZCBjb21wdXRlX2Rpc3QoSGFzaFRhYmxlUHRyIHRhYmxlKQoreworICAgIGludCAgICAgICAgICAgaTsKKyAgICBIYXNoQnVja2V0UHRyIGJ1Y2tldDsKKworICAgIHByaW50ZigiRW50cmllcyA9ICVsZCwgaGl0cyA9ICVsZCwgcGFydGlhbHMgPSAlbGQsIG1pc3NlcyA9ICVsZFxuIiwKKyAgICAgICAgICB0YWJsZS0+ZW50cmllcywgdGFibGUtPmhpdHMsIHRhYmxlLT5wYXJ0aWFscywgdGFibGUtPm1pc3Nlcyk7CisgICAgY2xlYXJfZGlzdCgpOworICAgIGZvciAoaSA9IDA7IGkgPCBIQVNIX1NJWkU7IGkrKykgeworICAgICAgICBidWNrZXQgPSB0YWJsZS0+YnVja2V0c1tpXTsKKyAgICAgICAgdXBkYXRlX2Rpc3QoY291bnRfZW50cmllcyhidWNrZXQpKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IERJU1RfTElNSVQ7IGkrKykgeworICAgICAgICBpZiAoaSAhPSBESVNUX0xJTUlULTEpCisgICAgICAgICAgICBwcmludGYoIiU1ZCAlMTBkXG4iLCBpLCBkaXN0W2ldKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmKCJvdGhlciAlMTBkXG4iLCBkaXN0W2ldKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfdGFibGUoSGFzaFRhYmxlUHRyIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqIHZhbHVlKQoreworICAgIHZvaWQgKnJldHZhbDsKKyAgICBpbnQgICByZXRjb2RlID0gZHJtSGFzaExvb2t1cCh0YWJsZSwga2V5LCAmcmV0dmFsKTsKKworICAgIHN3aXRjaCAocmV0Y29kZSkgeworICAgIGNhc2UgLTE6CisgICAgICAgIHByaW50ZigiQmFkIG1hZ2ljID0gMHglMDhseDoiCisgICAgICAgICAgICAgICAiIGtleSA9ICVsdSwgZXhwZWN0ZWQgPSAlcCwgcmV0dXJuZWQgPSAlcFxuIiwKKyAgICAgICAgICAgICAgIHRhYmxlLT5tYWdpYywga2V5LCB2YWx1ZSwgcmV0dmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBwcmludGYoIk5vdCBmb3VuZDoga2V5ID0gJWx1LCBleHBlY3RlZCA9ICVwLCByZXR1cm5lZCA9ICVwXG4iLAorICAgICAgICAgICAgICAga2V5LCB2YWx1ZSwgcmV0dmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAwOgorICAgICAgICBpZiAodmFsdWUgIT0gcmV0dmFsKSB7CisgICAgICAgICAgICBwcmludGYoIkJhZCB2YWx1ZToga2V5ID0gJWx1LCBleHBlY3RlZCA9ICVwLCByZXR1cm5lZCA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgIGtleSwgdmFsdWUsIHJldHZhbCk7CisgICAgICAgICAgICByZXRjb2RlID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRmKCJCYWQgcmV0Y29kZSA9ICVkOiBrZXkgPSAlbHUsIGV4cGVjdGVkID0gJXAsIHJldHVybmVkID0gJXBcbiIsCisgICAgICAgICAgICAgICByZXRjb2RlLCBrZXksIHZhbHVlLCByZXR2YWwpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJldGNvZGU7Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgSGFzaFRhYmxlUHRyICB0YWJsZTsKKyAgICB1bnNpZ25lZCBsb25nIGk7CisgICAgaW50ICAgICAgICAgICByZXQgPSAwOworCisgICAgcHJpbnRmKCJcbioqKioqIDI1NiBjb25zZWN1dGl2ZSBpbnRlZ2VycyAqKioqXG4iKTsKKyAgICB0YWJsZSA9IGRybUhhc2hDcmVhdGUoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgIGRybUhhc2hJbnNlcnQodGFibGUsIGksICh2b2lkICopKGkgPDwgMTYgfCBpKSk7CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICByZXQgfD0gY2hlY2tfdGFibGUodGFibGUsIGksICh2b2lkICopKGkgPDwgMTYgfCBpKSk7CisgICAgY29tcHV0ZV9kaXN0KHRhYmxlKTsKKyAgICBkcm1IYXNoRGVzdHJveSh0YWJsZSk7CisKKyAgICBwcmludGYoIlxuKioqKiogMTAyNCBjb25zZWN1dGl2ZSBpbnRlZ2VycyAqKioqXG4iKTsKKyAgICB0YWJsZSA9IGRybUhhc2hDcmVhdGUoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgICAgICBkcm1IYXNoSW5zZXJ0KHRhYmxlLCBpLCAodm9pZCAqKShpIDw8IDE2IHwgaSkpOworICAgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgICAgIHJldCB8PSBjaGVja190YWJsZSh0YWJsZSwgaSwgKHZvaWQgKikoaSA8PCAxNiB8IGkpKTsKKyAgICBjb21wdXRlX2Rpc3QodGFibGUpOworICAgIGRybUhhc2hEZXN0cm95KHRhYmxlKTsKKworICAgIHByaW50ZigiXG4qKioqKiAxMDI0IGNvbnNlY3V0aXZlIHBhZ2UgYWRkcmVzc2VzICg0ayBwYWdlcykgKioqKlxuIik7CisgICAgdGFibGUgPSBkcm1IYXNoQ3JlYXRlKCk7CisgICAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICAgICAgZHJtSGFzaEluc2VydCh0YWJsZSwgaSo0MDk2LCAodm9pZCAqKShpIDw8IDE2IHwgaSkpOworICAgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgICAgIHJldCB8PSBjaGVja190YWJsZSh0YWJsZSwgaSo0MDk2LCAodm9pZCAqKShpIDw8IDE2IHwgaSkpOworICAgIGNvbXB1dGVfZGlzdCh0YWJsZSk7CisgICAgZHJtSGFzaERlc3Ryb3kodGFibGUpOworCisgICAgcHJpbnRmKCJcbioqKioqIDEwMjQgcmFuZG9tIGludGVnZXJzICoqKipcbiIpOworICAgIHRhYmxlID0gZHJtSGFzaENyZWF0ZSgpOworICAgIHNyYW5kb20oMHhiZWVmYmVlZik7CisgICAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICAgICAgZHJtSGFzaEluc2VydCh0YWJsZSwgcmFuZG9tKCksICh2b2lkICopKGkgPDwgMTYgfCBpKSk7CisgICAgc3JhbmRvbSgweGJlZWZiZWVmKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgICAgICByZXQgfD0gY2hlY2tfdGFibGUodGFibGUsIHJhbmRvbSgpLCAodm9pZCAqKShpIDw8IDE2IHwgaSkpOworICAgIHNyYW5kb20oMHhiZWVmYmVlZik7CisgICAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICAgICAgcmV0IHw9IGNoZWNrX3RhYmxlKHRhYmxlLCByYW5kb20oKSwgKHZvaWQgKikoaSA8PCAxNiB8IGkpKTsKKyAgICBjb21wdXRlX2Rpc3QodGFibGUpOworICAgIGRybUhhc2hEZXN0cm95KHRhYmxlKTsKKworICAgIHByaW50ZigiXG4qKioqKiA1MDAwIHJhbmRvbSBpbnRlZ2VycyAqKioqXG4iKTsKKyAgICB0YWJsZSA9IGRybUhhc2hDcmVhdGUoKTsKKyAgICBzcmFuZG9tKDB4YmVlZmJlZWYpOworICAgIGZvciAoaSA9IDA7IGkgPCA1MDAwOyBpKyspCisgICAgICAgIGRybUhhc2hJbnNlcnQodGFibGUsIHJhbmRvbSgpLCAodm9pZCAqKShpIDw8IDE2IHwgaSkpOworICAgIHNyYW5kb20oMHhiZWVmYmVlZik7CisgICAgZm9yIChpID0gMDsgaSA8IDUwMDA7IGkrKykKKyAgICAgICAgcmV0IHw9IGNoZWNrX3RhYmxlKHRhYmxlLCByYW5kb20oKSwgKHZvaWQgKikoaSA8PCAxNiB8IGkpKTsKKyAgICBzcmFuZG9tKDB4YmVlZmJlZWYpOworICAgIGZvciAoaSA9IDA7IGkgPCA1MDAwOyBpKyspCisgICAgICAgIHJldCB8PSBjaGVja190YWJsZSh0YWJsZSwgcmFuZG9tKCksICh2b2lkICopKGkgPDwgMTYgfCBpKSk7CisgICAgY29tcHV0ZV9kaXN0KHRhYmxlKTsKKyAgICBkcm1IYXNoRGVzdHJveSh0YWJsZSk7CisKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdGVzdHMva21zL01ha2VmaWxlLmFtIGIvdGVzdHMva21zL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NDVhZjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9rbXMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzNiBAQAorQU1fQ1BQRkxBR1MgPSBcCisJLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUvZHJtIFwKKwktSSQodG9wX3NyY2RpcikvdGVzdHMgXAorCS1JJCh0b3Bfc3JjZGlyKQorCitBTV9DRkxBR1MgPSBcCisJJChXQVJOX0NGTEFHUykKKworbm9pbnN0X0xUTElCUkFSSUVTID0gbGlia21zLXRlc3QubGEKKworbGlia21zX3Rlc3RfbGFfU09VUkNFUyA9IFwKKwlsaWJrbXMtdGVzdC5oIFwKKwlsaWJrbXMtdGVzdC1jcnRjLmMgXAorCWxpYmttcy10ZXN0LWRldmljZS5jIFwKKwlsaWJrbXMtdGVzdC1mcmFtZWJ1ZmZlci5jIFwKKwlsaWJrbXMtdGVzdC1wbGFuZS5jIFwKKwlsaWJrbXMtdGVzdC1zY3JlZW4uYworCitsaWJrbXNfdGVzdF9sYV9MSUJBREQgPSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYmRybS5sYQorCitpZiBIQVZFX0lOU1RBTExfVEVTVFMKK2Jpbl9QUk9HUkFNUyA9IFwKKwlrbXMtc3RlYWwtY3J0YyBcCisJa21zLXVuaXZlcnNhbC1wbGFuZXMKK2Vsc2UKK25vaW5zdF9QUk9HUkFNUyA9IFwKKwlrbXMtc3RlYWwtY3J0YyBcCisJa21zLXVuaXZlcnNhbC1wbGFuZXMKK2VuZGlmCisKK2ttc19zdGVhbF9jcnRjX1NPVVJDRVMgPSBrbXMtc3RlYWwtY3J0Yy5jCitrbXNfc3RlYWxfY3J0Y19MREFERCA9IGxpYmttcy10ZXN0LmxhIC4uL3V0aWwvbGlidXRpbC5sYSAkKENBSVJPX0xJQlMpCisKK2ttc191bml2ZXJzYWxfcGxhbmVzX1NPVVJDRVMgPSBrbXMtdW5pdmVyc2FsLXBsYW5lcy5jCitrbXNfdW5pdmVyc2FsX3BsYW5lc19MREFERCA9IGxpYmttcy10ZXN0LmxhICQoQ0FJUk9fTElCUykKZGlmZiAtLWdpdCBhL3Rlc3RzL2ttcy9rbXMtc3RlYWwtY3J0Yy5jIGIvdGVzdHMva21zL2ttcy1zdGVhbC1jcnRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI4MzBkMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ttcy9rbXMtc3RlYWwtY3J0Yy5jCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTQgTlZJRElBIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2lmZGVmIEhBVkVfU1lTX1NFTEVDVF9ICisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkcm1fZm91cmNjLmg+CisKKyNpbmNsdWRlICJ1dGlsL3BhdHRlcm4uaCIKKyNpbmNsdWRlICJsaWJrbXMtdGVzdC5oIgorCitzdGF0aWMgdm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnbnVtKQoreworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXN0cnVjdCBrbXNfZnJhbWVidWZmZXIgKmZiOworCXN0cnVjdCBrbXNfc2NyZWVuICpzY3JlZW47CisJc3RydWN0IGttc19kZXZpY2UgKmRldmljZTsKKwl1bnNpZ25lZCBpbnQgaW5kZXggPSAwOworCXN0cnVjdCBzaWdhY3Rpb24gc2E7CisJaW50IGZkLCBlcnI7CisJdm9pZCAqcHRyOworCisJaWYgKGFyZ2MgPCAyKSB7CisJCWZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIERFVklDRVxuIiwgYXJndlswXSk7CisJCXJldHVybiAxOworCX0KKworCW1lbXNldCgmc2EsIDAsIHNpemVvZihzYSkpOworCXNhLnNhX2hhbmRsZXIgPSBzaWduYWxfaGFuZGxlcjsKKworCWVyciA9IHNpZ2FjdGlvbihTSUdJTlQsICZzYSwgTlVMTCk7CisJaWYgKGVyciA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJzaWdhY3Rpb24oKSBmYWlsZWQ6ICVtXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZmQgPSBvcGVuKGFyZ3ZbMV0sIE9fUkRXUik7CisJaWYgKGZkIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIm9wZW4oKSBmYWlsZWQ6ICVtXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZGV2aWNlID0ga21zX2RldmljZV9vcGVuKGZkKTsKKwlpZiAoIWRldmljZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImttc19kZXZpY2Vfb3BlbigpIGZhaWxlZDogJW1cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoZGV2aWNlLT5udW1fc2NyZWVucyA8IDEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJubyBzY3JlZW5zIGZvdW5kXG4iKTsKKwkJa21zX2RldmljZV9jbG9zZShkZXZpY2UpOworCQljbG9zZShmZCk7CisJCXJldHVybiAxOworCX0KKworCS8qIFRPRE86IGFsbG93IGNvbW1hbmQtbGluZSB0byBvdmVycmlkZSAqLworCXNjcmVlbiA9IGRldmljZS0+c2NyZWVuc1swXTsKKworCXByaW50ZigiVXNpbmcgc2NyZWVuICVzLCByZXNvbHV0aW9uICV1eCV1XG4iLCBzY3JlZW4tPm5hbWUsCisJICAgICAgIHNjcmVlbi0+d2lkdGgsIHNjcmVlbi0+aGVpZ2h0KTsKKworCWZiID0ga21zX2ZyYW1lYnVmZmVyX2NyZWF0ZShkZXZpY2UsIHNjcmVlbi0+d2lkdGgsIHNjcmVlbi0+aGVpZ2h0LAorCQkJCSAgICBEUk1fRk9STUFUX1hSR0I4ODg4KTsKKwlpZiAoIWZiKSB7CisJCWZwcmludGYoc3RkZXJyLCAia21zX2ZyYW1lYnVmZmVyX2NyZWF0ZSgpIGZhaWxlZFxuIik7CisJCXJldHVybiAxOworCX0KKworCWVyciA9IGttc19mcmFtZWJ1ZmZlcl9tYXAoZmIsICZwdHIpOworCWlmIChlcnIgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAia21zX2ZyYW1lYnVmZmVyX21hcCgpIGZhaWxlZDogJWRcbiIsIGVycik7CisJCXJldHVybiAxOworCX0KKworCXV0aWxfZmlsbF9wYXR0ZXJuKGZiLT5mb3JtYXQsIFVUSUxfUEFUVEVSTl9TTVBURSwgJnB0ciwgZmItPndpZHRoLAorCQkJICBmYi0+aGVpZ2h0LCBmYi0+cGl0Y2gpOworCisJa21zX2ZyYW1lYnVmZmVyX3VubWFwKGZiKTsKKworCWVyciA9IGttc19zY3JlZW5fc2V0KHNjcmVlbiwgZGV2aWNlLT5jcnRjc1tpbmRleCsrXSwgZmIpOworCWlmIChlcnIgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAia21zX3NjcmVlbl9zZXQoKSBmYWlsZWQ6ICVkXG4iLCBlcnIpOworCQlyZXR1cm4gMTsKKwl9CisKKwl3aGlsZSAodHJ1ZSkgeworCQlpbnQgbmZkcyA9IFNURElOX0ZJTEVOTyArIDE7CisJCXN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisJCWZkX3NldCBmZHM7CisKKwkJbWVtc2V0KCZ0aW1lb3V0LCAwLCBzaXplb2YodGltZW91dCkpOworCQl0aW1lb3V0LnR2X3NlYyA9IDU7CisJCXRpbWVvdXQudHZfdXNlYyA9IDA7CisKKwkJRkRfWkVSTygmZmRzKTsKKwkJRkRfU0VUKFNURElOX0ZJTEVOTywgJmZkcyk7CisKKwkJZXJyID0gc2VsZWN0KG5mZHMsICZmZHMsIE5VTEwsIE5VTEwsICZ0aW1lb3V0KTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCQlicmVhazsKKworCQkJZnByaW50ZihzdGRlcnIsICJzZWxlY3QoKSBmYWlsZWQ6ICVkXG4iLCBlcnJubyk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChlcnIgPiAwKSB7CisJCQlpZiAoRkRfSVNTRVQoU1RESU5fRklMRU5PLCAmZmRzKSkKKwkJCQlicmVhazsKKwkJfQorCisJCS8qIHN3aXRjaCBDUlRDICovCisJCWlmIChpbmRleCA+PSBkZXZpY2UtPm51bV9jcnRjcykKKwkJCWluZGV4ID0gMDsKKworCQllcnIgPSBrbXNfc2NyZWVuX3NldChzY3JlZW4sIGRldmljZS0+Y3J0Y3NbaW5kZXhdLCBmYik7CisJCWlmIChlcnIgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImttc19zY3JlZW5fc2V0KCkgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaW5kZXgrKzsKKwl9CisKKwlrbXNfZnJhbWVidWZmZXJfZnJlZShmYik7CisJa21zX2RldmljZV9jbG9zZShkZXZpY2UpOworCWNsb3NlKGZkKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMva21zL2ttcy11bml2ZXJzYWwtcGxhbmVzLmMgYi90ZXN0cy9rbXMva21zLXVuaXZlcnNhbC1wbGFuZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTA1N2JiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMva21zL2ttcy11bml2ZXJzYWwtcGxhbmVzLmMKQEAgLTAsMCArMSwzNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNCBOVklESUEgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZmRlZiBIQVZFX1NZU19TRUxFQ1RfSAorI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHJtX2ZvdXJjYy5oPgorI2luY2x1ZGUgInhmODZkcm0uaCIKKworI2luY2x1ZGUgInV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGlia21zLXRlc3QuaCIKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGZvcm1hdHNbXSA9IHsKKwlEUk1fRk9STUFUX1hSR0I4ODg4LAorCURSTV9GT1JNQVRfWEJHUjg4ODgsCisJRFJNX0ZPUk1BVF9SR0JBODg4OCwKK307CisKK3N0YXRpYyB1aW50MzJfdCBjaG9vc2VfZm9ybWF0KHN0cnVjdCBrbXNfcGxhbmUgKnBsYW5lKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZm9ybWF0cyk7IGkrKykKKwkJaWYgKGttc19wbGFuZV9zdXBwb3J0c19mb3JtYXQocGxhbmUsIGZvcm1hdHNbaV0pKQorCQkJcmV0dXJuIGZvcm1hdHNbaV07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJlcGFyZV9mcmFtZWJ1ZmZlcihzdHJ1Y3Qga21zX2ZyYW1lYnVmZmVyICpmYiwgYm9vbCBpbnZlcnQpCit7CisJY29uc3QgdW5zaWduZWQgaW50IGJsb2NrX3NpemUgPSAxNjsKKwl1aW50MzJfdCBjb2xvcnNbMl07CisJdW5zaWduZWQgaW50IGksIGo7CisJdWludDMyX3QgKmJ1ZjsKKwl2b2lkICpwdHI7CisJaW50IGVycjsKKworCXN3aXRjaCAoZmItPmZvcm1hdCkgeworCWNhc2UgRFJNX0ZPUk1BVF9YUkdCODg4ODoKKwkJcHJpbnRmKCJ1c2luZyBYUkdCODg4OCBmb3JtYXRcbiIpOworCQkgICAgICAgICAgIC8qIFhYUlJHR0JCICovCisJCWNvbG9yc1swXSA9IDB4ZmZmZjAwMDA7CisJCWNvbG9yc1sxXSA9IDB4ZmYwMDAwZmY7CisJCWJyZWFrOworCisJY2FzZSBEUk1fRk9STUFUX1hCR1I4ODg4OgorCQlwcmludGYoInVzaW5nIFhCR1I4ODg4IGZvcm1hdFxuIik7CisJCSAgICAgICAgICAgLyogWFhCQkdHUlIgKi8KKwkJY29sb3JzWzBdID0gMHhmZjAwMDBmZjsKKwkJY29sb3JzWzFdID0gMHhmZmZmMDAwMDsKKwkJYnJlYWs7CisKKwljYXNlIERSTV9GT1JNQVRfUkdCQTg4ODg6CisJCXByaW50ZigidXNpbmcgUkdCQTg4ODggZm9ybWF0XG4iKTsKKwkJICAgICAgICAgICAvKiBSUkdHQkJBQSAqLworCQljb2xvcnNbMF0gPSAweGZmMDAwMGZmOworCQljb2xvcnNbMV0gPSAweDAwMDBmZmZmOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWNvbG9yc1swXSA9IDB4ZmZmZmZmZmY7CisJCWNvbG9yc1sxXSA9IDB4ZmZmZmZmZmY7CisJCWJyZWFrOworCX0KKworCWVyciA9IGttc19mcmFtZWJ1ZmZlcl9tYXAoZmIsICZwdHIpOworCWlmIChlcnIgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAia21zX2ZyYW1lYnVmZmVyX21hcCgpIGZhaWxlZDogJXNcbiIsCisJCQlzdHJlcnJvcigtZXJyKSk7CisJCXJldHVybjsKKwl9CisKKwlidWYgPSBwdHI7CisKKwlmb3IgKGogPSAwOyBqIDwgZmItPmhlaWdodDsgaisrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBmYi0+d2lkdGg7IGkrKykgeworCQkJdW5zaWduZWQgaW50IGNvbG9yID0gKGogLyBibG9ja19zaXplKSBeCisJCQkJCSAgICAgKGkgLyBibG9ja19zaXplKTsKKworCQkJaWYgKGludmVydCkKKwkJCQljb2xvciBePSBjb2xvcjsKKworCQkJKmJ1ZisrID0gY29sb3JzW2NvbG9yICYgMV07CisJCX0KKwl9CisKKwlrbXNfZnJhbWVidWZmZXJfdW5tYXAoZmIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG9wdHNbXSA9ICJjaG9wdiI7CisJc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0geworCQl7ICJjdXJzb3IiLCAwLCAwLCAnYycgfSwKKwkJeyAiaGVscCIsIDAsIDAsICdoJyB9LAorCQl7ICJvdmVybGF5IiwgMCwgMCwgJ28nIH0sCisJCXsgInByaW1hcnkiLCAwLCAwLCAncCcgfSwKKwkJeyAidmVyYm9zZSIsIDAsIDAsICd2JyB9LAorCQl7IDAsIDAsIDAsIDAgfSwKKwl9OworCXN0cnVjdCBrbXNfZnJhbWVidWZmZXIgKmN1cnNvciA9IE5VTEw7CisJc3RydWN0IGttc19mcmFtZWJ1ZmZlciAqcm9vdCA9IE5VTEw7CisJc3RydWN0IGttc19mcmFtZWJ1ZmZlciAqZmIgPSBOVUxMOworCXN0cnVjdCBrbXNfZGV2aWNlICpkZXZpY2U7CisJYm9vbCB1c2Vfb3ZlcmxheSA9IGZhbHNlOworCWJvb2wgdXNlX3ByaW1hcnkgPSBmYWxzZTsKKwlzdHJ1Y3Qga21zX3BsYW5lICpwbGFuZTsKKwlib29sIHVzZV9jdXJzb3IgPSBmYWxzZTsKKwlib29sIHZlcmJvc2UgPSBmYWxzZTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgb3B0LCBpZHg7CisJaW50IGZkLCBlcnI7CisKKwl3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIG9wdHMsIG9wdGlvbnMsICZpZHgpKSAhPSAtMSkgeworCQlzd2l0Y2ggKG9wdCkgeworCQljYXNlICdjJzoKKwkJCXVzZV9jdXJzb3IgPSB0cnVlOworCQkJYnJlYWs7CisKKwkJY2FzZSAnaCc6CisJCQlicmVhazsKKworCQljYXNlICdvJzoKKwkJCXVzZV9vdmVybGF5ID0gdHJ1ZTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ3AnOgorCQkJdXNlX3ByaW1hcnkgPSB0cnVlOworCQkJYnJlYWs7CisKKwkJY2FzZSAndic6CisJCQl2ZXJib3NlID0gdHJ1ZTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGYoInVua25vd24gb3B0aW9uIFwiJWNcIlxuIiwgb3B0KTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKG9wdGluZCA+PSBhcmdjKSB7CisJCWZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIFtvcHRpb25zXSBERVZJQ0VcbiIsIGFyZ3ZbMF0pOworCQlyZXR1cm4gMTsKKwl9CisKKwlmZCA9IG9wZW4oYXJndltvcHRpbmRdLCBPX1JEV1IpOworCWlmIChmZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJvcGVuKCkgZmFpbGVkOiAlbVxuIik7CisJCXJldHVybiAxOworCX0KKworCWVyciA9IGRybVNldENsaWVudENhcChmZCwgRFJNX0NMSUVOVF9DQVBfVU5JVkVSU0FMX1BMQU5FUywgMSk7CisJaWYgKGVyciA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJkcm1TZXRDbGllbnRDYXAoKSBmYWlsZWQ6ICVkXG4iLCBlcnIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkZXZpY2UgPSBrbXNfZGV2aWNlX29wZW4oZmQpOworCWlmICghZGV2aWNlKQorCQlyZXR1cm4gMTsKKworCWlmICh2ZXJib3NlKSB7CisJCXByaW50ZigiU2NyZWVuczogJXVcbiIsIGRldmljZS0+bnVtX3NjcmVlbnMpOworCisJCWZvciAoaSA9IDA7IGkgPCBkZXZpY2UtPm51bV9zY3JlZW5zOyBpKyspIHsKKwkJCXN0cnVjdCBrbXNfc2NyZWVuICpzY3JlZW4gPSBkZXZpY2UtPnNjcmVlbnNbaV07CisJCQljb25zdCBjaGFyICpzdGF0dXMgPSAiZGlzY29ubmVjdGVkIjsKKworCQkJaWYgKHNjcmVlbi0+Y29ubmVjdGVkKQorCQkJCXN0YXR1cyA9ICJjb25uZWN0ZWQiOworCisJCQlwcmludGYoIiAgJXU6ICV4XG4iLCBpLCBzY3JlZW4tPmlkKTsKKwkJCXByaW50ZigiICAgIFN0YXR1czogJXNcbiIsIHN0YXR1cyk7CisJCQlwcmludGYoIiAgICBOYW1lOiAlc1xuIiwgc2NyZWVuLT5uYW1lKTsKKwkJCXByaW50ZigiICAgIFJlc29sdXRpb246ICV1eCV1XG4iLCBzY3JlZW4tPndpZHRoLAorCQkJICAgICAgIHNjcmVlbi0+aGVpZ2h0KTsKKwkJfQorCisJCXByaW50ZigiUGxhbmVzOiAldVxuIiwgZGV2aWNlLT5udW1fcGxhbmVzKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgZGV2aWNlLT5udW1fcGxhbmVzOyBpKyspIHsKKwkJCWNvbnN0IGNoYXIgKnR5cGUgPSBOVUxMOworCisJCQlwbGFuZSA9IGRldmljZS0+cGxhbmVzW2ldOworCQkJc3dpdGNoIChwbGFuZS0+dHlwZSkgeworCQkJY2FzZSBEUk1fUExBTkVfVFlQRV9PVkVSTEFZOgorCQkJCXR5cGUgPSAib3ZlcmxheSI7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRFJNX1BMQU5FX1RZUEVfUFJJTUFSWToKKwkJCQl0eXBlID0gInByaW1hcnkiOworCQkJCWJyZWFrOworCisJCQljYXNlIERSTV9QTEFORV9UWVBFX0NVUlNPUjoKKwkJCQl0eXBlID0gImN1cnNvciI7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXByaW50ZigiICAldTogJXBcbiIsIGksIHBsYW5lKTsKKwkJCXByaW50ZigiICAgIElEOiAleFxuIiwgcGxhbmUtPmlkKTsKKwkJCXByaW50ZigiICAgIENSVEM6ICV4XG4iLCBwbGFuZS0+Y3J0Yy0+aWQpOworCQkJcHJpbnRmKCIgICAgVHlwZTogJXggKCVzKVxuIiwgcGxhbmUtPnR5cGUsIHR5cGUpOworCQl9CisJfQorCisJaWYgKHVzZV9jdXJzb3IpIHsKKwkJdW5zaWduZWQgaW50IHgsIHk7CisJCXVpbnQzMl90IGZvcm1hdDsKKworCQlwbGFuZSA9IGttc19kZXZpY2VfZmluZF9wbGFuZV9ieV90eXBlKGRldmljZSwKKwkJCQkJCSAgICAgIERSTV9QTEFORV9UWVBFX0NVUlNPUiwKKwkJCQkJCSAgICAgIDApOworCQlpZiAoIXBsYW5lKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIm5vIGN1cnNvciBwbGFuZSBmb3VuZFxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCWZvcm1hdCA9IGNob29zZV9mb3JtYXQocGxhbmUpOworCQlpZiAoIWZvcm1hdCkgeworCQkJZnByaW50ZihzdGRlcnIsICJubyBtYXRjaGluZyBmb3JtYXQgZm91bmRcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQljdXJzb3IgPSBrbXNfZnJhbWVidWZmZXJfY3JlYXRlKGRldmljZSwgMzIsIDMyLCBmb3JtYXQpOworCQlpZiAoIWN1cnNvcikgeworCQkJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gY3JlYXRlIGN1cnNvciBidWZmZXJcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlwcmVwYXJlX2ZyYW1lYnVmZmVyKGN1cnNvciwgZmFsc2UpOworCisJCXggPSAoZGV2aWNlLT5zY3JlZW5zWzBdLT53aWR0aCAtIGN1cnNvci0+d2lkdGgpIC8gMjsKKwkJeSA9IChkZXZpY2UtPnNjcmVlbnNbMF0tPmhlaWdodCAtIGN1cnNvci0+aGVpZ2h0KSAvIDI7CisKKwkJa21zX3BsYW5lX3NldChwbGFuZSwgY3Vyc29yLCB4LCB5KTsKKwl9CisKKwlpZiAodXNlX292ZXJsYXkpIHsKKwkJdWludDMyX3QgZm9ybWF0OworCisJCXBsYW5lID0ga21zX2RldmljZV9maW5kX3BsYW5lX2J5X3R5cGUoZGV2aWNlLAorCQkJCQkJICAgICAgRFJNX1BMQU5FX1RZUEVfT1ZFUkxBWSwKKwkJCQkJCSAgICAgIDApOworCQlpZiAoIXBsYW5lKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIm5vIG92ZXJsYXkgcGxhbmUgZm91bmRcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlmb3JtYXQgPSBjaG9vc2VfZm9ybWF0KHBsYW5lKTsKKwkJaWYgKCFmb3JtYXQpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAibm8gbWF0Y2hpbmcgZm9ybWF0IGZvdW5kXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJZmIgPSBrbXNfZnJhbWVidWZmZXJfY3JlYXRlKGRldmljZSwgMzIwLCAyNDAsIGZvcm1hdCk7CisJCWlmICghZmIpCisJCQlyZXR1cm4gMTsKKworCQlwcmVwYXJlX2ZyYW1lYnVmZmVyKGZiLCBmYWxzZSk7CisKKwkJa21zX3BsYW5lX3NldChwbGFuZSwgZmIsIDAsIDApOworCX0KKworCWlmICh1c2VfcHJpbWFyeSkgeworCQl1bnNpZ25lZCBpbnQgeCwgeTsKKwkJdWludDMyX3QgZm9ybWF0OworCisJCXBsYW5lID0ga21zX2RldmljZV9maW5kX3BsYW5lX2J5X3R5cGUoZGV2aWNlLAorCQkJCQkJICAgICAgRFJNX1BMQU5FX1RZUEVfUFJJTUFSWSwKKwkJCQkJCSAgICAgIDApOworCQlpZiAoIXBsYW5lKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIm5vIHByaW1hcnkgcGxhbmUgZm91bmRcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlmb3JtYXQgPSBjaG9vc2VfZm9ybWF0KHBsYW5lKTsKKwkJaWYgKCFmb3JtYXQpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAibm8gbWF0Y2hpbmcgZm9ybWF0IGZvdW5kXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJcm9vdCA9IGttc19mcmFtZWJ1ZmZlcl9jcmVhdGUoZGV2aWNlLCA2NDAsIDQ4MCwgZm9ybWF0KTsKKwkJaWYgKCFyb290KQorCQkJcmV0dXJuIDE7CisKKwkJcHJlcGFyZV9mcmFtZWJ1ZmZlcihyb290LCB0cnVlKTsKKworCQl4ID0gKGRldmljZS0+c2NyZWVuc1swXS0+d2lkdGggLSByb290LT53aWR0aCkgLyAyOworCQl5ID0gKGRldmljZS0+c2NyZWVuc1swXS0+aGVpZ2h0IC0gcm9vdC0+aGVpZ2h0KSAvIDI7CisKKwkJa21zX3BsYW5lX3NldChwbGFuZSwgcm9vdCwgeCwgeSk7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IHRpbWV2YWwgdGltZW91dCA9IHsgMSwgMCB9OworCQlmZF9zZXQgZmRzOworCisJCUZEX1pFUk8oJmZkcyk7CisJCUZEX1NFVChTVERJTl9GSUxFTk8sICZmZHMpOworCisJCWVyciA9IHNlbGVjdChTVERJTl9GSUxFTk8gKyAxLCAmZmRzLCBOVUxMLCBOVUxMLCAmdGltZW91dCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgInNlbGVjdCgpIGZhaWxlZDogJW1cbiIpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiB0aW1lb3V0ICovCisJCWlmIChlcnIgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChGRF9JU1NFVChTVERJTl9GSUxFTk8sICZmZHMpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGN1cnNvcikKKwkJa21zX2ZyYW1lYnVmZmVyX2ZyZWUoY3Vyc29yKTsKKworCWlmIChyb290KQorCQlrbXNfZnJhbWVidWZmZXJfZnJlZShyb290KTsKKworCWlmIChmYikKKwkJa21zX2ZyYW1lYnVmZmVyX2ZyZWUoZmIpOworCisJa21zX2RldmljZV9jbG9zZShkZXZpY2UpOworCWNsb3NlKGZkKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMva21zL2xpYmttcy10ZXN0LWNydGMuYyBiL3Rlc3RzL2ttcy9saWJrbXMtdGVzdC1jcnRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkYjQ5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ttcy9saWJrbXMtdGVzdC1jcnRjLmMKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDE0IE5WSURJQSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJrbXMtdGVzdC5oIgorCitzdHJ1Y3Qga21zX2NydGMgKmttc19jcnRjX2NyZWF0ZShzdHJ1Y3Qga21zX2RldmljZSAqZGV2aWNlLCB1aW50MzJfdCBpZCkKK3sKKwlzdHJ1Y3Qga21zX2NydGMgKmNydGM7CisKKwljcnRjID0gY2FsbG9jKDEsIHNpemVvZigqY3J0YykpOworCWlmICghY3J0YykKKwkJcmV0dXJuIE5VTEw7CisKKwljcnRjLT5kZXZpY2UgPSBkZXZpY2U7CisJY3J0Yy0+aWQgPSBpZDsKKworCXJldHVybiBjcnRjOworfQorCit2b2lkIGttc19jcnRjX2ZyZWUoc3RydWN0IGttc19jcnRjICpjcnRjKQoreworCWZyZWUoY3J0Yyk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9rbXMvbGlia21zLXRlc3QtZGV2aWNlLmMgYi90ZXN0cy9rbXMvbGlia21zLXRlc3QtZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNjNzM0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ttcy9saWJrbXMtdGVzdC1kZXZpY2UuYwpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDE0IE5WSURJQSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAidXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJrbXMtdGVzdC5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29ubmVjdG9yX25hbWVzW10gPSB7CisJIlVua25vd24iLAorCSJWR0EiLAorCSJEVkktSSIsCisJIkRWSS1EIiwKKwkiRFZJLUEiLAorCSJDb21wb3NpdGUiLAorCSJTVklERU8iLAorCSJMVkRTIiwKKwkiQ29tcG9uZW50IiwKKwkiOVBpbkRJTiIsCisJIkRpc3BsYXlQb3J0IiwKKwkiSERNSS1BIiwKKwkiSERNSS1CIiwKKwkiVFYiLAorCSJlRFAiLAorCSJWaXJ0dWFsIiwKKwkiRFNJIiwKK307CisKK3N0YXRpYyB2b2lkIGttc19kZXZpY2VfcHJvYmVfc2NyZWVucyhzdHJ1Y3Qga21zX2RldmljZSAqZGV2aWNlKQoreworCXVuc2lnbmVkIGludCBjb3VudHNbQVJSQVlfU0laRShjb25uZWN0b3JfbmFtZXMpXTsKKwlzdHJ1Y3Qga21zX3NjcmVlbiAqc2NyZWVuOworCWRybU1vZGVSZXMgKnJlczsKKwlpbnQgaTsKKworCW1lbXNldChjb3VudHMsIDAsIHNpemVvZihjb3VudHMpKTsKKworCXJlcyA9IGRybU1vZGVHZXRSZXNvdXJjZXMoZGV2aWNlLT5mZCk7CisJaWYgKCFyZXMpCisJCXJldHVybjsKKworCWRldmljZS0+c2NyZWVucyA9IGNhbGxvYyhyZXMtPmNvdW50X2Nvbm5lY3RvcnMsIHNpemVvZihzY3JlZW4pKTsKKwlpZiAoIWRldmljZS0+c2NyZWVucykKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IHJlcy0+Y291bnRfY29ubmVjdG9yczsgaSsrKSB7CisJCXVuc2lnbmVkIGludCAqY291bnQ7CisJCWNvbnN0IGNoYXIgKnR5cGU7CisJCWludCBsZW47CisKKwkJc2NyZWVuID0ga21zX3NjcmVlbl9jcmVhdGUoZGV2aWNlLCByZXMtPmNvbm5lY3RvcnNbaV0pOworCQlpZiAoIXNjcmVlbikKKwkJCWNvbnRpbnVlOworCisJCS8qIGFzc2lnbiBhIHVuaXF1ZSBuYW1lIHRvIHRoaXMgc2NyZWVuICovCisJCXR5cGUgPSBjb25uZWN0b3JfbmFtZXNbc2NyZWVuLT50eXBlXTsKKwkJY291bnQgPSAmY291bnRzW3NjcmVlbi0+dHlwZV07CisKKwkJbGVuID0gc25wcmludGYoTlVMTCwgMCwgIiVzLSV1IiwgdHlwZSwgKmNvdW50KTsKKworCQlzY3JlZW4tPm5hbWUgPSBtYWxsb2MobGVuICsgMSk7CisJCWlmICghc2NyZWVuLT5uYW1lKSB7CisJCQlmcmVlKHNjcmVlbik7CisJCQljb250aW51ZTsKKwkJfQorCisJCXNucHJpbnRmKHNjcmVlbi0+bmFtZSwgbGVuICsgMSwgIiVzLSV1IiwgdHlwZSwgKmNvdW50KTsKKwkJKCpjb3VudCkrKzsKKworCQlkZXZpY2UtPnNjcmVlbnNbaV0gPSBzY3JlZW47CisJCWRldmljZS0+bnVtX3NjcmVlbnMrKzsKKwl9CisKKwlkcm1Nb2RlRnJlZVJlc291cmNlcyhyZXMpOworfQorCitzdGF0aWMgdm9pZCBrbXNfZGV2aWNlX3Byb2JlX2NydGNzKHN0cnVjdCBrbXNfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGttc19jcnRjICpjcnRjOworCWRybU1vZGVSZXMgKnJlczsKKwlpbnQgaTsKKworCXJlcyA9IGRybU1vZGVHZXRSZXNvdXJjZXMoZGV2aWNlLT5mZCk7CisJaWYgKCFyZXMpCisJCXJldHVybjsKKworCWRldmljZS0+Y3J0Y3MgPSBjYWxsb2MocmVzLT5jb3VudF9jcnRjcywgc2l6ZW9mKGNydGMpKTsKKwlpZiAoIWRldmljZS0+Y3J0Y3MpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCByZXMtPmNvdW50X2NydGNzOyBpKyspIHsKKwkJY3J0YyA9IGttc19jcnRjX2NyZWF0ZShkZXZpY2UsIHJlcy0+Y3J0Y3NbaV0pOworCQlpZiAoIWNydGMpCisJCQljb250aW51ZTsKKworCQlkZXZpY2UtPmNydGNzW2ldID0gY3J0YzsKKwkJZGV2aWNlLT5udW1fY3J0Y3MrKzsKKwl9CisKKwlkcm1Nb2RlRnJlZVJlc291cmNlcyhyZXMpOworfQorCitzdGF0aWMgdm9pZCBrbXNfZGV2aWNlX3Byb2JlX3BsYW5lcyhzdHJ1Y3Qga21zX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBrbXNfcGxhbmUgKnBsYW5lOworCWRybU1vZGVQbGFuZVJlcyAqcmVzOworCXVuc2lnbmVkIGludCBpOworCisJcmVzID0gZHJtTW9kZUdldFBsYW5lUmVzb3VyY2VzKGRldmljZS0+ZmQpOworCWlmICghcmVzKQorCQlyZXR1cm47CisKKwlkZXZpY2UtPnBsYW5lcyA9IGNhbGxvYyhyZXMtPmNvdW50X3BsYW5lcywgc2l6ZW9mKHBsYW5lKSk7CisJaWYgKCFkZXZpY2UtPnBsYW5lcykKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IHJlcy0+Y291bnRfcGxhbmVzOyBpKyspIHsKKwkJcGxhbmUgPSBrbXNfcGxhbmVfY3JlYXRlKGRldmljZSwgcmVzLT5wbGFuZXNbaV0pOworCQlpZiAoIXBsYW5lKQorCQkJY29udGludWU7CisKKwkJZGV2aWNlLT5wbGFuZXNbaV0gPSBwbGFuZTsKKwkJZGV2aWNlLT5udW1fcGxhbmVzKys7CisJfQorCisJZHJtTW9kZUZyZWVQbGFuZVJlc291cmNlcyhyZXMpOworfQorCitzdGF0aWMgdm9pZCBrbXNfZGV2aWNlX3Byb2JlKHN0cnVjdCBrbXNfZGV2aWNlICpkZXZpY2UpCit7CisJa21zX2RldmljZV9wcm9iZV9zY3JlZW5zKGRldmljZSk7CisJa21zX2RldmljZV9wcm9iZV9jcnRjcyhkZXZpY2UpOworCWttc19kZXZpY2VfcHJvYmVfcGxhbmVzKGRldmljZSk7Cit9CisKK3N0cnVjdCBrbXNfZGV2aWNlICprbXNfZGV2aWNlX29wZW4oaW50IGZkKQoreworCXN0cnVjdCBrbXNfZGV2aWNlICpkZXZpY2U7CisKKwlkZXZpY2UgPSBjYWxsb2MoMSwgc2l6ZW9mKCpkZXZpY2UpKTsKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkZXZpY2UtPmZkID0gZmQ7CisKKwlrbXNfZGV2aWNlX3Byb2JlKGRldmljZSk7CisKKwlyZXR1cm4gZGV2aWNlOworfQorCit2b2lkIGttc19kZXZpY2VfY2xvc2Uoc3RydWN0IGttc19kZXZpY2UgKmRldmljZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXZpY2UtPm51bV9wbGFuZXM7IGkrKykKKwkJa21zX3BsYW5lX2ZyZWUoZGV2aWNlLT5wbGFuZXNbaV0pOworCisJZnJlZShkZXZpY2UtPnBsYW5lcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2aWNlLT5udW1fY3J0Y3M7IGkrKykKKwkJa21zX2NydGNfZnJlZShkZXZpY2UtPmNydGNzW2ldKTsKKworCWZyZWUoZGV2aWNlLT5jcnRjcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2aWNlLT5udW1fc2NyZWVuczsgaSsrKQorCQlrbXNfc2NyZWVuX2ZyZWUoZGV2aWNlLT5zY3JlZW5zW2ldKTsKKworCWZyZWUoZGV2aWNlLT5zY3JlZW5zKTsKKworCWlmIChkZXZpY2UtPmZkID49IDApCisJCWNsb3NlKGRldmljZS0+ZmQpOworCisJZnJlZShkZXZpY2UpOworfQorCitzdHJ1Y3Qga21zX3BsYW5lICprbXNfZGV2aWNlX2ZpbmRfcGxhbmVfYnlfdHlwZShzdHJ1Y3Qga21zX2RldmljZSAqZGV2aWNlLAorCQkJCQkJdWludDMyX3QgdHlwZSwKKwkJCQkJCXVuc2lnbmVkIGludCBpbmRleCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXZpY2UtPm51bV9wbGFuZXM7IGkrKykgeworCQlpZiAoZGV2aWNlLT5wbGFuZXNbaV0tPnR5cGUgPT0gdHlwZSkgeworCQkJaWYgKGluZGV4ID09IDApCisJCQkJcmV0dXJuIGRldmljZS0+cGxhbmVzW2ldOworCisJCQlpbmRleC0tOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9rbXMvbGlia21zLXRlc3QtZnJhbWVidWZmZXIuYyBiL3Rlc3RzL2ttcy9saWJrbXMtdGVzdC1mcmFtZWJ1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZTVhZDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9rbXMvbGlia21zLXRlc3QtZnJhbWVidWZmZXIuYwpAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDE0IE5WSURJQSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2luY2x1ZGUgPGRybV9mb3VyY2MuaD4KKworI2luY2x1ZGUgInhmODZkcm0uaCIKKworI2luY2x1ZGUgImxpYmttcy10ZXN0LmgiCisKK3N0cnVjdCBrbXNfZnJhbWVidWZmZXIgKmttc19mcmFtZWJ1ZmZlcl9jcmVhdGUoc3RydWN0IGttc19kZXZpY2UgKmRldmljZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCB3aWR0aCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBoZWlnaHQsCisJCQkJCSAgICAgICB1aW50MzJfdCBmb3JtYXQpCit7CisJdWludDMyX3QgaGFuZGxlc1s0XSwgcGl0Y2hlc1s0XSwgb2Zmc2V0c1s0XTsKKwlzdHJ1Y3QgZHJtX21vZGVfY3JlYXRlX2R1bWIgYXJnczsKKwlzdHJ1Y3Qga21zX2ZyYW1lYnVmZmVyICpmYjsKKwlpbnQgZXJyOworCisJZmIgPSBjYWxsb2MoMSwgc2l6ZW9mKCpmYikpOworCWlmICghZmIpCisJCXJldHVybiBOVUxMOworCisJZmItPmRldmljZSA9IGRldmljZTsKKwlmYi0+d2lkdGggPSB3aWR0aDsKKwlmYi0+aGVpZ2h0ID0gaGVpZ2h0OworCWZiLT5mb3JtYXQgPSBmb3JtYXQ7CisKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisJYXJncy53aWR0aCA9IHdpZHRoOworCWFyZ3MuaGVpZ2h0ID0gaGVpZ2h0OworCisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIERSTV9GT1JNQVRfWFJHQjg4ODg6CisJY2FzZSBEUk1fRk9STUFUX1hCR1I4ODg4OgorCWNhc2UgRFJNX0ZPUk1BVF9SR0JBODg4ODoKKwkJYXJncy5icHAgPSAzMjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlmcmVlKGZiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZXJyID0gZHJtSW9jdGwoZGV2aWNlLT5mZCwgRFJNX0lPQ1RMX01PREVfQ1JFQVRFX0RVTUIsICZhcmdzKTsKKwlpZiAoZXJyIDwgMCkgeworCQlmcmVlKGZiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZmItPmhhbmRsZSA9IGFyZ3MuaGFuZGxlOworCWZiLT5waXRjaCA9IGFyZ3MucGl0Y2g7CisJZmItPnNpemUgPSBhcmdzLnNpemU7CisKKwloYW5kbGVzWzBdID0gZmItPmhhbmRsZTsKKwlwaXRjaGVzWzBdID0gZmItPnBpdGNoOworCW9mZnNldHNbMF0gPSAwOworCisJZXJyID0gZHJtTW9kZUFkZEZCMihkZXZpY2UtPmZkLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGhhbmRsZXMsCisJCQkgICAgcGl0Y2hlcywgb2Zmc2V0cywgJmZiLT5pZCwgMCk7CisJaWYgKGVyciA8IDApIHsKKwkJa21zX2ZyYW1lYnVmZmVyX2ZyZWUoZmIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gZmI7Cit9CisKK3ZvaWQga21zX2ZyYW1lYnVmZmVyX2ZyZWUoc3RydWN0IGttc19mcmFtZWJ1ZmZlciAqZmIpCit7CisJc3RydWN0IGttc19kZXZpY2UgKmRldmljZSA9IGZiLT5kZXZpY2U7CisJc3RydWN0IGRybV9tb2RlX2Rlc3Ryb3lfZHVtYiBhcmdzOworCWludCBlcnI7CisKKwlpZiAoZmItPmlkKSB7CisJCWVyciA9IGRybU1vZGVSbUZCKGRldmljZS0+ZmQsIGZiLT5pZCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQkvKiBub3QgbXVjaCB3ZSBjYW4gZG8gbm93ICovCisJCX0KKwl9CisKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisJYXJncy5oYW5kbGUgPSBmYi0+aGFuZGxlOworCisJZXJyID0gZHJtSW9jdGwoZGV2aWNlLT5mZCwgRFJNX0lPQ1RMX01PREVfREVTVFJPWV9EVU1CLCAmYXJncyk7CisJaWYgKGVyciA8IDApIHsKKwkJLyogbm90IG11Y2ggd2UgY2FuIGRvIG5vdyAqLworCX0KKworCWZyZWUoZmIpOworfQorCitpbnQga21zX2ZyYW1lYnVmZmVyX21hcChzdHJ1Y3Qga21zX2ZyYW1lYnVmZmVyICpmYiwgdm9pZCAqKnB0cnApCit7CisJc3RydWN0IGttc19kZXZpY2UgKmRldmljZSA9IGZiLT5kZXZpY2U7CisJc3RydWN0IGRybV9tb2RlX21hcF9kdW1iIGFyZ3M7CisJdm9pZCAqcHRyOworCWludCBlcnI7CisKKwlpZiAoZmItPnB0cikgeworCQkqcHRycCA9IGZiLT5wdHI7CisJCXJldHVybiAwOworCX0KKworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKwlhcmdzLmhhbmRsZSA9IGZiLT5oYW5kbGU7CisKKwllcnIgPSBkcm1Jb2N0bChkZXZpY2UtPmZkLCBEUk1fSU9DVExfTU9ERV9NQVBfRFVNQiwgJmFyZ3MpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gLWVycm5vOworCisJcHRyID0gbW1hcCgwLCBmYi0+c2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwKKwkJICAgZGV2aWNlLT5mZCwgYXJncy5vZmZzZXQpOworCWlmIChwdHIgPT0gTUFQX0ZBSUxFRCkKKwkJcmV0dXJuIC1lcnJubzsKKworCSpwdHJwID0gZmItPnB0ciA9IHB0cjsKKworCXJldHVybiAwOworfQorCit2b2lkIGttc19mcmFtZWJ1ZmZlcl91bm1hcChzdHJ1Y3Qga21zX2ZyYW1lYnVmZmVyICpmYikKK3sKKwlpZiAoZmItPnB0cikgeworCQltdW5tYXAoZmItPnB0ciwgZmItPnNpemUpOworCQlmYi0+cHRyID0gTlVMTDsKKwl9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9rbXMvbGlia21zLXRlc3QtcGxhbmUuYyBiL3Rlc3RzL2ttcy9saWJrbXMtdGVzdC1wbGFuZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYjc4YWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9rbXMvbGlia21zLXRlc3QtcGxhbmUuYwpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDE0IE5WSURJQSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGlia21zLXRlc3QuaCIKKworc3RhdGljIGludCBrbXNfcGxhbmVfcHJvYmUoc3RydWN0IGttc19wbGFuZSAqcGxhbmUpCit7CisJc3RydWN0IGttc19kZXZpY2UgKmRldmljZSA9IHBsYW5lLT5kZXZpY2U7CisJZHJtTW9kZU9iamVjdFByb3BlcnRpZXNQdHIgcHJvcHM7CisJZHJtTW9kZVBsYW5lICpwOworCXVuc2lnbmVkIGludCBpOworCisJcCA9IGRybU1vZGVHZXRQbGFuZShkZXZpY2UtPmZkLCBwbGFuZS0+aWQpOworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBUT0RPOiBhbGxvdyBkeW5hbWljIGFzc2lnbm1lbnQgdG8gQ1JUQ3MgKi8KKwlpZiAocC0+Y3J0Y19pZCA9PSAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkZXZpY2UtPm51bV9jcnRjczsgaSsrKSB7CisJCQlpZiAocC0+cG9zc2libGVfY3J0Y3MgJiAoMSA8PCBpKSkgeworCQkJCXAtPmNydGNfaWQgPSBkZXZpY2UtPmNydGNzW2ldLT5pZDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBkZXZpY2UtPm51bV9jcnRjczsgaSsrKSB7CisJCWlmIChkZXZpY2UtPmNydGNzW2ldLT5pZCA9PSBwLT5jcnRjX2lkKSB7CisJCQlwbGFuZS0+Y3J0YyA9IGRldmljZS0+Y3J0Y3NbaV07CisJCQlicmVhazsKKwkJfQorCX0KKworCXBsYW5lLT5mb3JtYXRzID0gY2FsbG9jKHAtPmNvdW50X2Zvcm1hdHMsIHNpemVvZih1aW50MzJfdCkpOworCWlmICghcGxhbmUtPmZvcm1hdHMpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IHAtPmNvdW50X2Zvcm1hdHM7IGkrKykKKwkJcGxhbmUtPmZvcm1hdHNbaV0gPSBwLT5mb3JtYXRzW2ldOworCisJcGxhbmUtPm51bV9mb3JtYXRzID0gcC0+Y291bnRfZm9ybWF0czsKKworCWRybU1vZGVGcmVlUGxhbmUocCk7CisKKwlwcm9wcyA9IGRybU1vZGVPYmplY3RHZXRQcm9wZXJ0aWVzKGRldmljZS0+ZmQsIHBsYW5lLT5pZCwKKwkJCQkJICAgRFJNX01PREVfT0JKRUNUX1BMQU5FKTsKKwlpZiAoIXByb3BzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWZvciAoaSA9IDA7IGkgPCBwcm9wcy0+Y291bnRfcHJvcHM7IGkrKykgeworCQlkcm1Nb2RlUHJvcGVydHlQdHIgcHJvcDsKKworCQlwcm9wID0gZHJtTW9kZUdldFByb3BlcnR5KGRldmljZS0+ZmQsIHByb3BzLT5wcm9wc1tpXSk7CisJCWlmIChwcm9wKSB7CisJCQlpZiAoc3RyY21wKHByb3AtPm5hbWUsICJ0eXBlIikgPT0gMCkKKwkJCQlwbGFuZS0+dHlwZSA9IHByb3BzLT5wcm9wX3ZhbHVlc1tpXTsKKworCQkJZHJtTW9kZUZyZWVQcm9wZXJ0eShwcm9wKTsKKwkJfQorCX0KKworCWRybU1vZGVGcmVlT2JqZWN0UHJvcGVydGllcyhwcm9wcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGttc19wbGFuZSAqa21zX3BsYW5lX2NyZWF0ZShzdHJ1Y3Qga21zX2RldmljZSAqZGV2aWNlLCB1aW50MzJfdCBpZCkKK3sKKwlzdHJ1Y3Qga21zX3BsYW5lICpwbGFuZTsKKworCXBsYW5lID0gY2FsbG9jKDEsIHNpemVvZigqcGxhbmUpKTsKKwlpZiAoIXBsYW5lKQorCQlyZXR1cm4gTlVMTDsKKworCXBsYW5lLT5kZXZpY2UgPSBkZXZpY2U7CisJcGxhbmUtPmlkID0gaWQ7CisKKwlrbXNfcGxhbmVfcHJvYmUocGxhbmUpOworCisJcmV0dXJuIHBsYW5lOworfQorCit2b2lkIGttc19wbGFuZV9mcmVlKHN0cnVjdCBrbXNfcGxhbmUgKnBsYW5lKQoreworCWZyZWUocGxhbmUpOworfQorCitpbnQga21zX3BsYW5lX3NldChzdHJ1Y3Qga21zX3BsYW5lICpwbGFuZSwgc3RydWN0IGttc19mcmFtZWJ1ZmZlciAqZmIsCisJCSAgdW5zaWduZWQgaW50IHgsIHVuc2lnbmVkIGludCB5KQoreworCXN0cnVjdCBrbXNfZGV2aWNlICpkZXZpY2UgPSBwbGFuZS0+ZGV2aWNlOworCWludCBlcnI7CisKKwllcnIgPSBkcm1Nb2RlU2V0UGxhbmUoZGV2aWNlLT5mZCwgcGxhbmUtPmlkLCBwbGFuZS0+Y3J0Yy0+aWQsIGZiLT5pZCwKKwkJCSAgICAgIDAsIHgsIHksIGZiLT53aWR0aCwgZmItPmhlaWdodCwgMCA8PCAxNiwKKwkJCSAgICAgIDAgPDwgMTYsIGZiLT53aWR0aCA8PCAxNiwgZmItPmhlaWdodCA8PCAxNik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiAtZXJybm87CisKKwlyZXR1cm4gMDsKK30KKworYm9vbCBrbXNfcGxhbmVfc3VwcG9ydHNfZm9ybWF0KHN0cnVjdCBrbXNfcGxhbmUgKnBsYW5lLCB1aW50MzJfdCBmb3JtYXQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGxhbmUtPm51bV9mb3JtYXRzOyBpKyspCisJCWlmIChwbGFuZS0+Zm9ybWF0c1tpXSA9PSBmb3JtYXQpCisJCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ttcy9saWJrbXMtdGVzdC1zY3JlZW4uYyBiL3Rlc3RzL2ttcy9saWJrbXMtdGVzdC1zY3JlZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzY5MDIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMva21zL2xpYmttcy10ZXN0LXNjcmVlbi5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNCBOVklESUEgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmttcy10ZXN0LmgiCisKK3N0YXRpYyB2b2lkIGttc19zY3JlZW5fcHJvYmUoc3RydWN0IGttc19zY3JlZW4gKnNjcmVlbikKK3sKKwlzdHJ1Y3Qga21zX2RldmljZSAqZGV2aWNlID0gc2NyZWVuLT5kZXZpY2U7CisJZHJtTW9kZUNvbm5lY3RvciAqY29uOworCisJY29uID0gZHJtTW9kZUdldENvbm5lY3RvcihkZXZpY2UtPmZkLCBzY3JlZW4tPmlkKTsKKwlpZiAoIWNvbikKKwkJcmV0dXJuOworCisJc2NyZWVuLT50eXBlID0gY29uLT5jb25uZWN0b3JfdHlwZTsKKworCWlmIChjb24tPmNvbm5lY3Rpb24gPT0gRFJNX01PREVfQ09OTkVDVEVEKQorCQlzY3JlZW4tPmNvbm5lY3RlZCA9IHRydWU7CisJZWxzZQorCQlzY3JlZW4tPmNvbm5lY3RlZCA9IGZhbHNlOworCisJbWVtY3B5KCZzY3JlZW4tPm1vZGUsICZjb24tPm1vZGVzWzBdLCBzaXplb2YoZHJtTW9kZU1vZGVJbmZvKSk7CisJc2NyZWVuLT53aWR0aCA9IHNjcmVlbi0+bW9kZS5oZGlzcGxheTsKKwlzY3JlZW4tPmhlaWdodCA9IHNjcmVlbi0+bW9kZS52ZGlzcGxheTsKKworCWRybU1vZGVGcmVlQ29ubmVjdG9yKGNvbik7Cit9CisKK3N0cnVjdCBrbXNfc2NyZWVuICprbXNfc2NyZWVuX2NyZWF0ZShzdHJ1Y3Qga21zX2RldmljZSAqZGV2aWNlLCB1aW50MzJfdCBpZCkKK3sKKwlzdHJ1Y3Qga21zX3NjcmVlbiAqc2NyZWVuOworCisJc2NyZWVuID0gY2FsbG9jKDEsIHNpemVvZigqc2NyZWVuKSk7CisJaWYgKCFzY3JlZW4pCisJCXJldHVybiBOVUxMOworCisJc2NyZWVuLT5kZXZpY2UgPSBkZXZpY2U7CisJc2NyZWVuLT5pZCA9IGlkOworCisJa21zX3NjcmVlbl9wcm9iZShzY3JlZW4pOworCisJcmV0dXJuIHNjcmVlbjsKK30KKwordm9pZCBrbXNfc2NyZWVuX2ZyZWUoc3RydWN0IGttc19zY3JlZW4gKnNjcmVlbikKK3sKKwlpZiAoc2NyZWVuKQorCQlmcmVlKHNjcmVlbi0+bmFtZSk7CisKKwlmcmVlKHNjcmVlbik7Cit9CisKK2ludCBrbXNfc2NyZWVuX3NldChzdHJ1Y3Qga21zX3NjcmVlbiAqc2NyZWVuLCBzdHJ1Y3Qga21zX2NydGMgKmNydGMsCisJCSAgIHN0cnVjdCBrbXNfZnJhbWVidWZmZXIgKmZiKQoreworCXN0cnVjdCBrbXNfZGV2aWNlICpkZXZpY2UgPSBzY3JlZW4tPmRldmljZTsKKwlpbnQgZXJyOworCisJZXJyID0gZHJtTW9kZVNldENydGMoZGV2aWNlLT5mZCwgY3J0Yy0+aWQsIGZiLT5pZCwgMCwgMCwgJnNjcmVlbi0+aWQsCisJCQkgICAgIDEsICZzY3JlZW4tPm1vZGUpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gLWVycm5vOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9rbXMvbGlia21zLXRlc3QuaCBiL3Rlc3RzL2ttcy9saWJrbXMtdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMWQwMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9rbXMvbGlia21zLXRlc3QuaApAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDE0IE5WSURJQSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIExJQktNU19URVNUX0gKKyNkZWZpbmUgTElCS01TX1RFU1RfSAorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8eGY4NmRybU1vZGUuaD4KKworc3RydWN0IGttc19kZXZpY2UgeworCWludCBmZDsKKworCXN0cnVjdCBrbXNfc2NyZWVuICoqc2NyZWVuczsKKwl1bnNpZ25lZCBpbnQgbnVtX3NjcmVlbnM7CisKKwlzdHJ1Y3Qga21zX2NydGMgKipjcnRjczsKKwl1bnNpZ25lZCBpbnQgbnVtX2NydGNzOworCisJc3RydWN0IGttc19wbGFuZSAqKnBsYW5lczsKKwl1bnNpZ25lZCBpbnQgbnVtX3BsYW5lczsKK307CisKK3N0cnVjdCBrbXNfZGV2aWNlICprbXNfZGV2aWNlX29wZW4oaW50IGZkKTsKK3ZvaWQga21zX2RldmljZV9jbG9zZShzdHJ1Y3Qga21zX2RldmljZSAqZGV2aWNlKTsKKworc3RydWN0IGttc19wbGFuZSAqa21zX2RldmljZV9maW5kX3BsYW5lX2J5X3R5cGUoc3RydWN0IGttc19kZXZpY2UgKmRldmljZSwKKwkJCQkJCXVpbnQzMl90IHR5cGUsCisJCQkJCQl1bnNpZ25lZCBpbnQgaW5kZXgpOworCitzdHJ1Y3Qga21zX2NydGMgeworCXN0cnVjdCBrbXNfZGV2aWNlICpkZXZpY2U7CisJdWludDMyX3QgaWQ7Cit9OworCitzdHJ1Y3Qga21zX2NydGMgKmttc19jcnRjX2NyZWF0ZShzdHJ1Y3Qga21zX2RldmljZSAqZGV2aWNlLCB1aW50MzJfdCBpZCk7Cit2b2lkIGttc19jcnRjX2ZyZWUoc3RydWN0IGttc19jcnRjICpjcnRjKTsKKworc3RydWN0IGttc19mcmFtZWJ1ZmZlciB7CisJc3RydWN0IGttc19kZXZpY2UgKmRldmljZTsKKworCXVuc2lnbmVkIGludCB3aWR0aDsKKwl1bnNpZ25lZCBpbnQgaGVpZ2h0OworCXVuc2lnbmVkIGludCBwaXRjaDsKKwl1aW50MzJfdCBmb3JtYXQ7CisJc2l6ZV90IHNpemU7CisKKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3QgaWQ7CisKKwl2b2lkICpwdHI7Cit9OworCitzdHJ1Y3Qga21zX2ZyYW1lYnVmZmVyICprbXNfZnJhbWVidWZmZXJfY3JlYXRlKHN0cnVjdCBrbXNfZGV2aWNlICpkZXZpY2UsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgd2lkdGgsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0LAorCQkJCQkgICAgICAgdWludDMyX3QgZm9ybWF0KTsKK3ZvaWQga21zX2ZyYW1lYnVmZmVyX2ZyZWUoc3RydWN0IGttc19mcmFtZWJ1ZmZlciAqZmIpOworaW50IGttc19mcmFtZWJ1ZmZlcl9tYXAoc3RydWN0IGttc19mcmFtZWJ1ZmZlciAqZmIsIHZvaWQgKipwdHJwKTsKK3ZvaWQga21zX2ZyYW1lYnVmZmVyX3VubWFwKHN0cnVjdCBrbXNfZnJhbWVidWZmZXIgKmZiKTsKKworc3RydWN0IGttc19zY3JlZW4geworCXN0cnVjdCBrbXNfZGV2aWNlICpkZXZpY2U7CisJYm9vbCBjb25uZWN0ZWQ7CisJdWludDMyX3QgdHlwZTsKKwl1aW50MzJfdCBpZDsKKworCXVuc2lnbmVkIGludCB3aWR0aDsKKwl1bnNpZ25lZCBpbnQgaGVpZ2h0OworCWNoYXIgKm5hbWU7CisKKwlkcm1Nb2RlTW9kZUluZm8gbW9kZTsKK307CisKK3N0cnVjdCBrbXNfc2NyZWVuICprbXNfc2NyZWVuX2NyZWF0ZShzdHJ1Y3Qga21zX2RldmljZSAqZGV2aWNlLCB1aW50MzJfdCBpZCk7Cit2b2lkIGttc19zY3JlZW5fZnJlZShzdHJ1Y3Qga21zX3NjcmVlbiAqc2NyZWVuKTsKKworaW50IGttc19zY3JlZW5fc2V0KHN0cnVjdCBrbXNfc2NyZWVuICpzY3JlZW4sIHN0cnVjdCBrbXNfY3J0YyAqY3J0YywKKwkJICAgc3RydWN0IGttc19mcmFtZWJ1ZmZlciAqZmIpOworCitzdHJ1Y3Qga21zX3BsYW5lIHsKKwlzdHJ1Y3Qga21zX2RldmljZSAqZGV2aWNlOworCXN0cnVjdCBrbXNfY3J0YyAqY3J0YzsKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKwl1aW50MzJfdCBpZDsKKworCXVpbnQzMl90ICpmb3JtYXRzOworCXVuc2lnbmVkIGludCBudW1fZm9ybWF0czsKK307CisKK3N0cnVjdCBrbXNfcGxhbmUgKmttc19wbGFuZV9jcmVhdGUoc3RydWN0IGttc19kZXZpY2UgKmRldmljZSwgdWludDMyX3QgaWQpOwordm9pZCBrbXNfcGxhbmVfZnJlZShzdHJ1Y3Qga21zX3BsYW5lICpwbGFuZSk7CisKK2ludCBrbXNfcGxhbmVfc2V0KHN0cnVjdCBrbXNfcGxhbmUgKnBsYW5lLCBzdHJ1Y3Qga21zX2ZyYW1lYnVmZmVyICpmYiwKKwkJICB1bnNpZ25lZCBpbnQgeCwgdW5zaWduZWQgaW50IHkpOworYm9vbCBrbXNfcGxhbmVfc3VwcG9ydHNfZm9ybWF0KHN0cnVjdCBrbXNfcGxhbmUgKnBsYW5lLCB1aW50MzJfdCBmb3JtYXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3RzL2ttc3Rlc3QvTWFrZWZpbGUuYW0gYi90ZXN0cy9rbXN0ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZDU0MWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9rbXN0ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjUgQEAKK0FNX0NGTEFHUyA9IFwKKwkkKFdBUk5fQ0ZMQUdTKVwKKwktSSQodG9wX3NyY2RpcikvaW5jbHVkZS9kcm0gXAorCS1JJCh0b3Bfc3JjZGlyKS9saWJrbXMvIFwKKwktSSQodG9wX3NyY2RpcikvdGVzdHMvIFwKKwktSSQodG9wX3NyY2RpcikKKworaWYgSEFWRV9JTlNUQUxMX1RFU1RTCitiaW5fUFJPR1JBTVMgPSBcCisJa21zdGVzdAorZWxzZQorbm9pbnN0X1BST0dSQU1TID0gXAorCWttc3Rlc3QKK2VuZGlmCisKK2ttc3Rlc3RfU09VUkNFUyA9IFwKKwltYWluLmMKKwora21zdGVzdF9MREFERCA9IFwKKwkkKHRvcF9idWlsZGRpcikvdGVzdHMvdXRpbC9saWJ1dGlsLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGlia21zL2xpYmttcy5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYmRybS5sYQorCitydW46IGttc3Rlc3QKKwkuL2ttc3Rlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL2ttc3Rlc3QvbWFpbi5jIGIvdGVzdHMva21zdGVzdC9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlNGViYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ttc3Rlc3QvbWFpbi5jCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwOSBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAieGY4NmRybS5oIgorI2luY2x1ZGUgImxpYmttcy5oIgorCisjaW5jbHVkZSAidXRpbC9rbXMuaCIKKworI2RlZmluZSBDSEVDS19SRVRfUkVUVVJOKHJldCwgc3RyKSBcCisJaWYgKHJldCA8IDApIHsgXAorCQlwcmludGYoIiVzOiAlcyAoJXMpXG4iLCBfX2Z1bmNfXywgc3RyLCBzdHJlcnJvcigtcmV0KSk7IFwKKwkJcmV0dXJuIHJldDsgXAorCX0KKworc3RhdGljIGludCB0ZXN0X2JvKHN0cnVjdCBrbXNfZHJpdmVyICprbXMpCit7CisJc3RydWN0IGttc19ibyAqYm87CisJaW50IHJldDsKKwl1bnNpZ25lZCBhdHRyc1s3XSA9IHsKKwkJS01TX1dJRFRILCAxMDI0LAorCQlLTVNfSEVJR0hULCA3NjgsCisJCUtNU19CT19UWVBFLCBLTVNfQk9fVFlQRV9TQ0FOT1VUX1g4UjhHOEI4LAorCQlLTVNfVEVSTUlOQVRFX1BST1BfTElTVCwKKwl9OworCisJcmV0ID0ga21zX2JvX2NyZWF0ZShrbXMsIGF0dHJzLCAmYm8pOworCUNIRUNLX1JFVF9SRVRVUk4ocmV0LCAiQ291bGQgbm90IGNyZWF0ZSBibyIpOworCisJa21zX2JvX2Rlc3Ryb3koJmJvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyICpwcm9ncmFtKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFtvcHRpb25zXVxuIiwgcHJvZ3JhbSk7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAtRCBERVZJQ0UgIG9wZW4gdGhlIGdpdmVuIGRldmljZVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1NIE1PRFVMRSAgb3BlbiB0aGUgZ2l2ZW4gbW9kdWxlXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCXN0YXRpYyBjb25zdCBjaGFyIG9wdHN0cltdID0gIkQ6TToiOworCXN0cnVjdCBrbXNfZHJpdmVyICprbXM7CisJaW50IGMsIGZkLCByZXQ7CisJY2hhciAqZGV2aWNlID0gTlVMTDsKKwljaGFyICptb2R1bGUgPSBOVUxMOworCisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIG9wdHN0cikpICE9IC0xKSB7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdEJzoKKwkJCWRldmljZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdNJzoKKwkJCW1vZHVsZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdXNhZ2UoYXJndlswXSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWZkID0gdXRpbF9vcGVuKGRldmljZSwgbW9kdWxlKTsKKwlDSEVDS19SRVRfUkVUVVJOKGZkLCAiQ291bGQgbm90IG9wZW4gZGV2aWNlIik7CisKKwlyZXQgPSBrbXNfY3JlYXRlKGZkLCAma21zKTsKKwlDSEVDS19SRVRfUkVUVVJOKHJldCwgIkZhaWxlZCB0byBjcmVhdGUga21zIGRyaXZlciIpOworCisJcmV0ID0gdGVzdF9ibyhrbXMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcHJpbnRmKCIlczogQWxsIG9rIVxuIiwgX19mdW5jX18pOworCisJa21zX2Rlc3Ryb3koJmttcyk7CisJcmV0dXJuIDA7CisKK2VycjoKKwlrbXNfZGVzdHJveSgma21zKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbW9kZXByaW50L01ha2VmaWxlLmFtIGIvdGVzdHMvbW9kZXByaW50L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMWRiYzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tb2RlcHJpbnQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxOCBAQAorQU1fQ0ZMQUdTID0gXAorCSQoV0FSTl9DRkxBR1MpXAorCS1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlL2RybSBcCisJLUkkKHRvcF9zcmNkaXIpL3Rlc3RzIFwKKwktSSQodG9wX3NyY2RpcikKKworaWYgSEFWRV9JTlNUQUxMX1RFU1RTCitiaW5fUFJPR1JBTVMgPSBcCisJbW9kZXByaW50CitlbHNlCitub2luc3RfUFJPR1JBTVMgPSBcCisJbW9kZXByaW50CitlbmRpZgorCittb2RlcHJpbnRfU09VUkNFUyA9IFwKKwltb2RlcHJpbnQuYworbW9kZXByaW50X0xEQUREID0gXAorCSQodG9wX2J1aWxkZGlyKS9saWJkcm0ubGEKZGlmZiAtLWdpdCBhL3Rlc3RzL21vZGVwcmludC9tb2RlcHJpbnQuYyBiL3Rlc3RzL21vZGVwcmludC9tb2RlcHJpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDg1NDEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbW9kZXByaW50L21vZGVwcmludC5jCkBAIC0wLDAgKzEsNDQxIEBACisvKgorICogXGZpbGUgbW9kZWRlbW8uYworICogVGVzdCBwcm9ncmFtIHRvIGR1bXAgRFJNIGtlcm5lbCBtb2RlIHNldHRpbmcgcmVsYXRlZCBpbmZvcm1hdGlvbi4KKyAqIFF1ZXJpZXMgdGhlIGtlcm5lbCBmb3IgYWxsIGF2YWlsYWJsZSBpbmZvcm1hdGlvbiBhbmQgZHVtcHMgaXQgdG8gc3Rkb3V0LgorICoKKyAqIFxhdXRob3IgSmFrb2IgQm9ybmVjcmFudHogPHdhbGxicmFrZXJAZ21haWwuY29tPgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBKYWtvYiBCb3JuZWNyYW50eiA8d2FsbGJyYWtlckBnbWFpbC5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAieGY4NmRybS5oIgorI2luY2x1ZGUgInhmODZkcm1Nb2RlLmgiCisKKyNpbmNsdWRlICJ1dGlsL2NvbW1vbi5oIgorCitpbnQgY3VycmVudDsKK2ludCBjb25uZWN0b3JzOworaW50IGZ1bGxfcHJvcHM7CitpbnQgZWRpZDsKK2ludCBtb2RlczsKK2ludCBmdWxsX21vZGVzOworaW50IGVuY29kZXJzOworaW50IGNydGNzOworaW50IGZiczsKK2NoYXIgKm1vZHVsZV9uYW1lOworCitzdGF0aWMgY29uc3QgY2hhciogZ2V0Q29ubmVjdGlvblRleHQoZHJtTW9kZUNvbm5lY3Rpb24gY29ubikKK3sKKwlzd2l0Y2ggKGNvbm4pIHsKKwljYXNlIERSTV9NT0RFX0NPTk5FQ1RFRDoKKwkJcmV0dXJuICJjb25uZWN0ZWQiOworCWNhc2UgRFJNX01PREVfRElTQ09OTkVDVEVEOgorCQlyZXR1cm4gImRpc2Nvbm5lY3RlZCI7CisJY2FzZSBEUk1fTU9ERV9VTktOT1dOQ09OTkVDVElPTjoKKwlkZWZhdWx0OgorCQlyZXR1cm4gInVua25vd24iOworCX0KKworfQorCitzdGF0aWMgaW50IHByaW50TW9kZShzdHJ1Y3QgZHJtX21vZGVfbW9kZWluZm8gKm1vZGUpCit7CisJaWYgKGZ1bGxfbW9kZXMpIHsKKwkJcHJpbnRmKCJNb2RlOiAlc1xuIiwgbW9kZS0+bmFtZSk7CisJCXByaW50ZigiXHRjbG9jayAgICAgICA6ICVpXG4iLCBtb2RlLT5jbG9jayk7CisJCXByaW50ZigiXHRoZGlzcGxheSAgICA6ICVpXG4iLCBtb2RlLT5oZGlzcGxheSk7CisJCXByaW50ZigiXHRoc3luY19zdGFydCA6ICVpXG4iLCBtb2RlLT5oc3luY19zdGFydCk7CisJCXByaW50ZigiXHRoc3luY19lbmQgICA6ICVpXG4iLCBtb2RlLT5oc3luY19lbmQpOworCQlwcmludGYoIlx0aHRvdGFsICAgICAgOiAlaVxuIiwgbW9kZS0+aHRvdGFsKTsKKwkJcHJpbnRmKCJcdGhza2V3ICAgICAgIDogJWlcbiIsIG1vZGUtPmhza2V3KTsKKwkJcHJpbnRmKCJcdHZkaXNwbGF5ICAgIDogJWlcbiIsIG1vZGUtPnZkaXNwbGF5KTsKKwkJcHJpbnRmKCJcdHZzeW5jX3N0YXJ0IDogJWlcbiIsIG1vZGUtPnZzeW5jX3N0YXJ0KTsKKwkJcHJpbnRmKCJcdHZzeW5jX2VuZCAgIDogJWlcbiIsIG1vZGUtPnZzeW5jX2VuZCk7CisJCXByaW50ZigiXHR2dG90YWwgICAgICA6ICVpXG4iLCBtb2RlLT52dG90YWwpOworCQlwcmludGYoIlx0dnNjYW4gICAgICAgOiAlaVxuIiwgbW9kZS0+dnNjYW4pOworCQlwcmludGYoIlx0dnJlZnJlc2ggICAgOiAlaVxuIiwgbW9kZS0+dnJlZnJlc2gpOworCQlwcmludGYoIlx0ZmxhZ3MgICAgICAgOiAlaVxuIiwgbW9kZS0+ZmxhZ3MpOworCX0gZWxzZSB7CisJCXByaW50ZigiTW9kZTogXCIlc1wiICVpeCVpICVpXG4iLCBtb2RlLT5uYW1lLAorCQkJCW1vZGUtPmhkaXNwbGF5LCBtb2RlLT52ZGlzcGxheSwgbW9kZS0+dnJlZnJlc2gpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmludFByb3BlcnR5KGludCBmZCwgZHJtTW9kZVJlc1B0ciByZXMsIGRybU1vZGVQcm9wZXJ0eVB0ciBwcm9wcywgdWludDY0X3QgdmFsdWUpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisJaW50IGo7CisKKwlwcmludGYoIlByb3BlcnR5OiAlc1xuIiwgcHJvcHMtPm5hbWUpOworCXByaW50ZigiXHRpZCAgICAgICAgICAgOiAlaVxuIiwgcHJvcHMtPnByb3BfaWQpOworCXByaW50ZigiXHRmbGFncyAgICAgICAgOiAlaVxuIiwgcHJvcHMtPmZsYWdzKTsKKwlwcmludGYoIlx0Y291bnRfdmFsdWVzIDogJWRcbiIsIHByb3BzLT5jb3VudF92YWx1ZXMpOworCisKKwlpZiAocHJvcHMtPmNvdW50X3ZhbHVlcykgeworCQlwcmludGYoIlx0dmFsdWVzICAgICAgIDoiKTsKKwkJZm9yIChqID0gMDsgaiA8IHByb3BzLT5jb3VudF92YWx1ZXM7IGorKykKKwkJCXByaW50ZigiICUiIFBSSXU2NCwgcHJvcHMtPnZhbHVlc1tqXSk7CisJCXByaW50ZigiXG4iKTsKKwl9CisKKworCXByaW50ZigiXHRjb3VudF9lbnVtcyAgOiAlZFxuIiwgcHJvcHMtPmNvdW50X2VudW1zKTsKKworCWlmIChwcm9wcy0+ZmxhZ3MgJiBEUk1fTU9ERV9QUk9QX0JMT0IpIHsKKwkJZHJtTW9kZVByb3BlcnR5QmxvYlB0ciBibG9iOworCisJCWJsb2IgPSBkcm1Nb2RlR2V0UHJvcGVydHlCbG9iKGZkLCB2YWx1ZSk7CisJCWlmIChibG9iKSB7CisJCQlwcmludGYoImJsb2IgaXMgJWQgbGVuZ3RoLCAlMDhYXG4iLCBibG9iLT5sZW5ndGgsICoodWludDMyX3QgKilibG9iLT5kYXRhKTsKKwkJCWRybU1vZGVGcmVlUHJvcGVydHlCbG9iKGJsb2IpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJlcnJvciBnZXR0aW5nIGJsb2IgJSIgUFJJdTY0ICJcbiIsIHZhbHVlKTsKKwkJfQorCisJfSBlbHNlIHsKKwkJZm9yIChqID0gMDsgaiA8IHByb3BzLT5jb3VudF9lbnVtczsgaisrKSB7CisJCQlwcmludGYoIlx0XHQlbGxkID0gJXNcbiIsIHByb3BzLT5lbnVtc1tqXS52YWx1ZSwgcHJvcHMtPmVudW1zW2pdLm5hbWUpOworCQkJaWYgKHByb3BzLT5lbnVtc1tqXS52YWx1ZSA9PSB2YWx1ZSkKKwkJCQluYW1lID0gcHJvcHMtPmVudW1zW2pdLm5hbWU7CisJCX0KKworCQlpZiAocHJvcHMtPmNvdW50X2VudW1zICYmIG5hbWUpIHsKKwkJCXByaW50ZigiXHRjb25fdmFsdWUgICAgOiAlc1xuIiwgbmFtZSk7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIlx0Y29uX3ZhbHVlICAgIDogJSIgUFJJdTY0ICJcbiIsIHZhbHVlKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG91dHB1dF9uYW1lc1tdID0geyAiTm9uZSIsCisJCQkJCSAgICAgIlZHQSIsCisJCQkJCSAgICAgIkRWSS1JIiwKKwkJCQkJICAgICAiRFZJLUQiLAorCQkJCQkgICAgICJEVkktQSIsCisJCQkJCSAgICAgIkNvbXBvc2l0ZSIsCisJCQkJCSAgICAgIlNWSURFTyIsCisJCQkJCSAgICAgIkxWRFMiLAorCQkJCQkgICAgICJDb21wb25lbnQiLAorCQkJCQkgICAgICJESU4iLAorCQkJCQkgICAgICJEUCIsCisJCQkJCSAgICAgIkhETUktQSIsCisJCQkJCSAgICAgIkhETUktQiIsCisJCQkJCSAgICAgIlRWIiwKKwkJCQkJICAgICAiZURQIiwKKwkJCQkJICAgICAiVmlydHVhbCIsCisJCQkJCSAgICAgIkRTSSIsCit9OworCitzdGF0aWMgaW50IHByaW50Q29ubmVjdG9yKGludCBmZCwgZHJtTW9kZVJlc1B0ciByZXMsIGRybU1vZGVDb25uZWN0b3JQdHIgY29ubmVjdG9yLCB1aW50MzJfdCBpZCkKK3sKKwlpbnQgaSA9IDA7CisJc3RydWN0IGRybV9tb2RlX21vZGVpbmZvICptb2RlID0gTlVMTDsKKwlkcm1Nb2RlUHJvcGVydHlQdHIgcHJvcHM7CisKKwlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA8IEFSUkFZX1NJWkUob3V0cHV0X25hbWVzKSkKKwkJcHJpbnRmKCJDb25uZWN0b3I6ICVzLSVkXG4iLCBvdXRwdXRfbmFtZXNbY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZV0sCisJCQljb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlX2lkKTsKKwllbHNlCisJCXByaW50ZigiQ29ubmVjdG9yOiAlZC0lZFxuIiwgY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSwKKwkJCWNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGVfaWQpOworCXByaW50ZigiXHRpZCAgICAgICAgICAgICA6ICVpXG4iLCBpZCk7CisJcHJpbnRmKCJcdGVuY29kZXIgaWQgICAgIDogJWlcbiIsIGNvbm5lY3Rvci0+ZW5jb2Rlcl9pZCk7CisJcHJpbnRmKCJcdGNvbm4gICAgICAgICAgIDogJXNcbiIsIGdldENvbm5lY3Rpb25UZXh0KGNvbm5lY3Rvci0+Y29ubmVjdGlvbikpOworCXByaW50ZigiXHRzaXplICAgICAgICAgICA6ICVpeCVpIChtbSlcbiIsIGNvbm5lY3Rvci0+bW1XaWR0aCwgY29ubmVjdG9yLT5tbUhlaWdodCk7CisJcHJpbnRmKCJcdGNvdW50X21vZGVzICAgIDogJWlcbiIsIGNvbm5lY3Rvci0+Y291bnRfbW9kZXMpOworCXByaW50ZigiXHRjb3VudF9wcm9wcyAgICA6ICVpXG4iLCBjb25uZWN0b3ItPmNvdW50X3Byb3BzKTsKKwlpZiAoY29ubmVjdG9yLT5jb3VudF9wcm9wcykgeworCQlwcmludGYoIlx0cHJvcHMgICAgICAgICAgOiIpOworCQlmb3IgKGkgPSAwOyBpIDwgY29ubmVjdG9yLT5jb3VudF9wcm9wczsgaSsrKQorCQkJcHJpbnRmKCIgJWkiLCBjb25uZWN0b3ItPnByb3BzW2ldKTsKKwkJcHJpbnRmKCJcbiIpOworCX0KKworCXByaW50ZigiXHRjb3VudF9lbmNvZGVycyA6ICVpXG4iLCBjb25uZWN0b3ItPmNvdW50X2VuY29kZXJzKTsKKwlpZiAoY29ubmVjdG9yLT5jb3VudF9lbmNvZGVycykgeworCQlwcmludGYoIlx0ZW5jb2RlcnMgICAgICAgOiIpOworCQlmb3IgKGkgPSAwOyBpIDwgY29ubmVjdG9yLT5jb3VudF9lbmNvZGVyczsgaSsrKQorCQkJcHJpbnRmKCIgJWkiLCBjb25uZWN0b3ItPmVuY29kZXJzW2ldKTsKKwkJcHJpbnRmKCJcbiIpOworCX0KKworCWlmIChtb2RlcykgeworCQlmb3IgKGkgPSAwOyBpIDwgY29ubmVjdG9yLT5jb3VudF9tb2RlczsgaSsrKSB7CisJCQltb2RlID0gKHN0cnVjdCBkcm1fbW9kZV9tb2RlaW5mbyAqKSZjb25uZWN0b3ItPm1vZGVzW2ldOworCQkJcHJpbnRNb2RlKG1vZGUpOworCQl9CisJfQorCisJaWYgKGZ1bGxfcHJvcHMpIHsKKwkJZm9yIChpID0gMDsgaSA8IGNvbm5lY3Rvci0+Y291bnRfcHJvcHM7IGkrKykgeworCQkJcHJvcHMgPSBkcm1Nb2RlR2V0UHJvcGVydHkoZmQsIGNvbm5lY3Rvci0+cHJvcHNbaV0pOworCQkJaWYgKHByb3BzKSB7CisJCQkJcHJpbnRQcm9wZXJ0eShmZCwgcmVzLCBwcm9wcywgY29ubmVjdG9yLT5wcm9wX3ZhbHVlc1tpXSk7CisJCQkJZHJtTW9kZUZyZWVQcm9wZXJ0eShwcm9wcyk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmludEVuY29kZXIoaW50IGZkLCBkcm1Nb2RlUmVzUHRyIHJlcywgZHJtTW9kZUVuY29kZXJQdHIgZW5jb2RlciwgdWludDMyX3QgaWQpCit7CisJcHJpbnRmKCJFbmNvZGVyXG4iKTsKKwlwcmludGYoIlx0aWQgICAgIDolaVxuIiwgaWQpOworCXByaW50ZigiXHRjcnRjX2lkICAgOiVkXG4iLCBlbmNvZGVyLT5jcnRjX2lkKTsKKwlwcmludGYoIlx0dHlwZSAgIDolZFxuIiwgZW5jb2Rlci0+ZW5jb2Rlcl90eXBlKTsKKwlwcmludGYoIlx0cG9zc2libGVfY3J0Y3MgIDoweCV4XG4iLCBlbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyk7CisJcHJpbnRmKCJcdHBvc3NpYmxlX2Nsb25lcyA6MHgleFxuIiwgZW5jb2Rlci0+cG9zc2libGVfY2xvbmVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmludENydGMoaW50IGZkLCBkcm1Nb2RlUmVzUHRyIHJlcywgZHJtTW9kZUNydGNQdHIgY3J0YywgdWludDMyX3QgaWQpCit7CisJcHJpbnRmKCJDcnRjXG4iKTsKKwlwcmludGYoIlx0aWQgICAgICAgICAgICAgOiAlaVxuIiwgaWQpOworCXByaW50ZigiXHR4ICAgICAgICAgICAgICA6ICVpXG4iLCBjcnRjLT54KTsKKwlwcmludGYoIlx0eSAgICAgICAgICAgICAgOiAlaVxuIiwgY3J0Yy0+eSk7CisJcHJpbnRmKCJcdHdpZHRoICAgICAgICAgIDogJWlcbiIsIGNydGMtPndpZHRoKTsKKwlwcmludGYoIlx0aGVpZ2h0ICAgICAgICAgOiAlaVxuIiwgY3J0Yy0+aGVpZ2h0KTsKKwlwcmludGYoIlx0bW9kZSAgICAgICAgICAgOiAlcFxuIiwgJmNydGMtPm1vZGUpOworCXByaW50ZigiXHRnYW1tYSBzaXplICAgICA6ICVkXG4iLCBjcnRjLT5nYW1tYV9zaXplKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByaW50RnJhbWVCdWZmZXIoaW50IGZkLCBkcm1Nb2RlUmVzUHRyIHJlcywgZHJtTW9kZUZCUHRyIGZiKQoreworCXByaW50ZigiRnJhbWVidWZmZXJcbiIpOworCXByaW50ZigiXHRoYW5kbGUgICAgOiAlaVxuIiwgZmItPmhhbmRsZSk7CisJcHJpbnRmKCJcdHdpZHRoICAgICA6ICVpXG4iLCBmYi0+d2lkdGgpOworCXByaW50ZigiXHRoZWlnaHQgICAgOiAlaVxuIiwgZmItPmhlaWdodCk7CisJcHJpbnRmKCJcdHBpdGNoICAgICA6ICVpXG4iLCBmYi0+cGl0Y2gpOzsKKwlwcmludGYoIlx0YnBwICAgICAgIDogJWlcbiIsIGZiLT5icHApOworCXByaW50ZigiXHRkZXB0aCAgICAgOiAlaVxuIiwgZmItPmRlcHRoKTsKKwlwcmludGYoIlx0YnVmZmVyX2lkIDogJWlcbiIsIGZiLT5oYW5kbGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRSZXMoaW50IGZkLCBkcm1Nb2RlUmVzUHRyIHJlcykKK3sKKwlpbnQgaTsKKwlkcm1Nb2RlRkJQdHIgZmI7CisJZHJtTW9kZUNydGNQdHIgY3J0YzsKKwlkcm1Nb2RlRW5jb2RlclB0ciBlbmNvZGVyOworCWRybU1vZGVDb25uZWN0b3JQdHIgY29ubmVjdG9yOworCisJcHJpbnRmKCJSZXNvdXJjZXNcblxuIik7CisKKwlwcmludGYoImNvdW50X2Nvbm5lY3RvcnMgOiAlaVxuIiwgcmVzLT5jb3VudF9jb25uZWN0b3JzKTsKKwlwcmludGYoImNvdW50X2VuY29kZXJzICAgOiAlaVxuIiwgcmVzLT5jb3VudF9lbmNvZGVycyk7CisJcHJpbnRmKCJjb3VudF9jcnRjcyAgICAgIDogJWlcbiIsIHJlcy0+Y291bnRfY3J0Y3MpOworCXByaW50ZigiY291bnRfZmJzICAgICAgICA6ICVpXG4iLCByZXMtPmNvdW50X2Zicyk7CisKKwlwcmludGYoIlxuIik7CisKKwlpZiAoY29ubmVjdG9ycykgeworCQlmb3IgKGkgPSAwOyBpIDwgcmVzLT5jb3VudF9jb25uZWN0b3JzOyBpKyspIHsKKwkJCWNvbm5lY3RvciA9IChjdXJyZW50ID8gZHJtTW9kZUdldENvbm5lY3RvckN1cnJlbnQgOiBkcm1Nb2RlR2V0Q29ubmVjdG9yKSAoZmQsIHJlcy0+Y29ubmVjdG9yc1tpXSk7CisKKwkJCWlmICghY29ubmVjdG9yKQorCQkJCXByaW50ZigiQ291bGQgbm90IGdldCBjb25uZWN0b3IgJWlcbiIsIHJlcy0+Y29ubmVjdG9yc1tpXSk7CisJCQllbHNlIHsKKwkJCQlwcmludENvbm5lY3RvcihmZCwgcmVzLCBjb25uZWN0b3IsIHJlcy0+Y29ubmVjdG9yc1tpXSk7CisJCQkJZHJtTW9kZUZyZWVDb25uZWN0b3IoY29ubmVjdG9yKTsKKwkJCX0KKwkJfQorCQlwcmludGYoIlxuIik7CisJfQorCisKKwlpZiAoZW5jb2RlcnMpIHsKKwkJZm9yIChpID0gMDsgaSA8IHJlcy0+Y291bnRfZW5jb2RlcnM7IGkrKykgeworCQkJZW5jb2RlciA9IGRybU1vZGVHZXRFbmNvZGVyKGZkLCByZXMtPmVuY29kZXJzW2ldKTsKKworCQkJaWYgKCFlbmNvZGVyKQorCQkJCXByaW50ZigiQ291bGQgbm90IGdldCBlbmNvZGVyICVpXG4iLCByZXMtPmVuY29kZXJzW2ldKTsKKwkJCWVsc2UgeworCQkJCXByaW50RW5jb2RlcihmZCwgcmVzLCBlbmNvZGVyLCByZXMtPmVuY29kZXJzW2ldKTsKKwkJCQlkcm1Nb2RlRnJlZUVuY29kZXIoZW5jb2Rlcik7CisJCQl9CisJCX0KKwkJcHJpbnRmKCJcbiIpOworCX0KKworCWlmIChjcnRjcykgeworCQlmb3IgKGkgPSAwOyBpIDwgcmVzLT5jb3VudF9jcnRjczsgaSsrKSB7CisJCQljcnRjID0gZHJtTW9kZUdldENydGMoZmQsIHJlcy0+Y3J0Y3NbaV0pOworCisJCQlpZiAoIWNydGMpCisJCQkJcHJpbnRmKCJDb3VsZCBub3QgZ2V0IGNydGMgJWlcbiIsIHJlcy0+Y3J0Y3NbaV0pOworCQkJZWxzZSB7CisJCQkJcHJpbnRDcnRjKGZkLCByZXMsIGNydGMsIHJlcy0+Y3J0Y3NbaV0pOworCQkJCWRybU1vZGVGcmVlQ3J0YyhjcnRjKTsKKwkJCX0KKwkJfQorCQlwcmludGYoIlxuIik7CisJfQorCisJaWYgKGZicykgeworCQlmb3IgKGkgPSAwOyBpIDwgcmVzLT5jb3VudF9mYnM7IGkrKykgeworCQkJZmIgPSBkcm1Nb2RlR2V0RkIoZmQsIHJlcy0+ZmJzW2ldKTsKKworCQkJaWYgKCFmYikKKwkJCQlwcmludGYoIkNvdWxkIG5vdCBnZXQgZmIgJWlcbiIsIHJlcy0+ZmJzW2ldKTsKKwkJCWVsc2UgeworCQkJCXByaW50RnJhbWVCdWZmZXIoZmQsIHJlcywgZmIpOworCQkJCWRybU1vZGVGcmVlRkIoZmIpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFyZ3MoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBkZWZhdWx0cyA9IDE7CisJaW50IGk7CisKKwlmYnMgPSAwOworCWVkaWQgPSAwOworCWNydGNzID0gMDsKKwltb2RlcyA9IDA7CisJZW5jb2RlcnMgPSAwOworCWZ1bGxfbW9kZXMgPSAwOworCWZ1bGxfcHJvcHMgPSAwOworCWNvbm5lY3RvcnMgPSAwOworCWN1cnJlbnQgPSAwOworCisJbW9kdWxlX25hbWUgPSBhcmd2WzFdOworCisJZm9yIChpID0gMjsgaSA8IGFyZ2M7IGkrKykgeworCQlpZiAoc3RyY21wKGFyZ3ZbaV0sICItZmIiKSA9PSAwKSB7CisJCQlmYnMgPSAxOworCQkJZGVmYXVsdHMgPSAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWNydGNzIikgPT0gMCkgeworCQkJY3J0Y3MgPSAxOworCQkJZGVmYXVsdHMgPSAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWNvbnMiKSA9PSAwKSB7CisJCQljb25uZWN0b3JzID0gMTsKKwkJCW1vZGVzID0gMTsKKwkJCWRlZmF1bHRzID0gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi1tb2RlcyIpID09IDApIHsKKwkJCWNvbm5lY3RvcnMgPSAxOworCQkJbW9kZXMgPSAxOworCQkJZGVmYXVsdHMgPSAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWZ1bGwiKSA9PSAwKSB7CisJCQljb25uZWN0b3JzID0gMTsKKwkJCW1vZGVzID0gMTsKKwkJCWZ1bGxfbW9kZXMgPSAxOworCQkJZGVmYXVsdHMgPSAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiLXByb3BzIikgPT0gMCkgeworCQkJY29ubmVjdG9ycyA9IDE7CisJCQlmdWxsX3Byb3BzID0gMTsKKwkJCWRlZmF1bHRzID0gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi1lZGlkcyIpID09IDApIHsKKwkJCWNvbm5lY3RvcnMgPSAxOworCQkJZWRpZCA9IDE7CisJCQlkZWZhdWx0cyA9IDA7CisJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbaV0sICItZW5jb2RlcnMiKSA9PSAwKSB7CisJCQllbmNvZGVycyA9IDE7CisJCQlkZWZhdWx0cyA9IDA7CisJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbaV0sICItdiIpID09IDApIHsKKwkJCWZicyA9IDE7CisJCQllZGlkID0gMTsKKwkJCWNydGNzID0gMTsKKwkJCW1vZGVzID0gMTsKKwkJCWVuY29kZXJzID0gMTsKKwkJCWZ1bGxfbW9kZXMgPSAxOworCQkJZnVsbF9wcm9wcyA9IDE7CisJCQljb25uZWN0b3JzID0gMTsKKwkJCWRlZmF1bHRzID0gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi1jdXJyZW50IikgPT0gMCkgeworCQkJY3VycmVudCA9IDE7CisJCX0KKwl9CisKKwlpZiAoZGVmYXVsdHMpIHsKKwkJZmJzID0gMTsKKwkJZWRpZCA9IDE7CisJCWNydGNzID0gMTsKKwkJbW9kZXMgPSAxOworCQllbmNvZGVycyA9IDE7CisJCWZ1bGxfbW9kZXMgPSAwOworCQlmdWxsX3Byb3BzID0gMDsKKwkJY29ubmVjdG9ycyA9IDE7CisJfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGZkOworCWRybU1vZGVSZXNQdHIgcmVzOworCisJaWYgKGFyZ2MgPT0gMSkgeworCQlwcmludGYoIlBsZWFzZSBhZGQgbW9kdWxlbmFtZSBhcyBmaXJzdCBhcmd1bWVudFxuIik7CisJCXJldHVybiAxOworCX0KKworCWFyZ3MoYXJnYywgYXJndik7CisKKwlwcmludGYoIlN0YXJ0aW5nIHRlc3RcbiIpOworCisJZmQgPSBkcm1PcGVuKG1vZHVsZV9uYW1lLCBOVUxMKTsKKworCWlmIChmZCA8IDApIHsKKwkJcHJpbnRmKCJGYWlsZWQgdG8gb3BlbiB0aGUgY2FyZCBmZCAoJWQpXG4iLGZkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmVzID0gZHJtTW9kZUdldFJlc291cmNlcyhmZCk7CisJaWYgKHJlcyA9PSAwKSB7CisJCXByaW50ZigiRmFpbGVkIHRvIGdldCByZXNvdXJjZXMgZnJvbSBjYXJkXG4iKTsKKwkJZHJtQ2xvc2UoZmQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlwcmludFJlcyhmZCwgcmVzKTsKKworCWRybU1vZGVGcmVlUmVzb3VyY2VzKHJlcyk7CisKKwlwcmludGYoIk9rXG4iKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbW9kZXRlc3QvQW5kcm9pZC5tayBiL3Rlc3RzL21vZGV0ZXN0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhNzFmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21vZGV0ZXN0L0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9NYWtlZmlsZS5zb3VyY2VzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKE1PREVURVNUX0ZJTEVTKQorCitMT0NBTF9NT0RVTEUgOj0gbW9kZXRlc3QKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJkcm0KK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZHJtX3V0aWwKKworaW5jbHVkZSAkKExJQkRSTV9DT01NT05fTUspCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL21vZGV0ZXN0L01ha2VmaWxlLmFtIGIvdGVzdHMvbW9kZXRlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyOTZjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21vZGV0ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjQgQEAKK2luY2x1ZGUgTWFrZWZpbGUuc291cmNlcworCitBTV9DRkxBR1MgPSAkKGZpbHRlci1vdXQgLVdwb2ludGVyLWFyaXRoLCAkKFdBUk5fQ0ZMQUdTKSkKKworQU1fQ0ZMQUdTICs9IFwKKwktcHRocmVhZCBcCisJLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUvZHJtIFwKKwktSSQodG9wX3NyY2RpcikvdGVzdHMgXAorCS1JJCh0b3Bfc3JjZGlyKQorCitpZiBIQVZFX0lOU1RBTExfVEVTVFMKK2Jpbl9QUk9HUkFNUyA9IFwKKwltb2RldGVzdAorZWxzZQorbm9pbnN0X1BST0dSQU1TID0gXAorCW1vZGV0ZXN0CitlbmRpZgorCittb2RldGVzdF9TT1VSQ0VTID0gJChNT0RFVEVTVF9GSUxFUykKKworbW9kZXRlc3RfTERBREQgPSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYmRybS5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL3Rlc3RzL3V0aWwvbGlidXRpbC5sYSBcCisJJChDQUlST19MSUJTKQpkaWZmIC0tZ2l0IGEvdGVzdHMvbW9kZXRlc3QvTWFrZWZpbGUuc291cmNlcyBiL3Rlc3RzL21vZGV0ZXN0L01ha2VmaWxlLnNvdXJjZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5YWYwZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21vZGV0ZXN0L01ha2VmaWxlLnNvdXJjZXMKQEAgLTAsMCArMSw2IEBACitNT0RFVEVTVF9GSUxFUyA6PSBcCisJYnVmZmVycy5jIFwKKwlidWZmZXJzLmggXAorCWN1cnNvci5jIFwKKwljdXJzb3IuaCBcCisJbW9kZXRlc3QuYwpkaWZmIC0tZ2l0IGEvdGVzdHMvbW9kZXRlc3QvYnVmZmVycy5jIGIvdGVzdHMvbW9kZXRlc3QvYnVmZmVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZDMxMGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tb2RldGVzdC9idWZmZXJzLmMKQEAgLTAsMCArMSwzNDYgQEAKKy8qCisgKiBEUk0gYmFzZWQgbW9kZSBzZXR0aW5nIHRlc3QgcHJvZ3JhbQorICogQ29weXJpZ2h0IDIwMDggVHVuZ3N0ZW4gR3JhcGhpY3MKKyAqICAgSmFrb2IgQm9ybmVjcmFudHogPGpha29iQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICogQ29weXJpZ2h0IDIwMDggSW50ZWwgQ29ycG9yYXRpb24KKyAqICAgSmVzc2UgQmFybmVzIDxqZXNzZS5iYXJuZXNAaW50ZWwuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJkcm1fZm91cmNjLmgiCisKKyNpbmNsdWRlICJsaWJkcm1fbWFjcm9zLmgiCisjaW5jbHVkZSAieGY4NmRybS5oIgorCisjaW5jbHVkZSAiYnVmZmVycy5oIgorCitzdHJ1Y3QgYm8KK3sKKwlpbnQgZmQ7CisJdm9pZCAqcHRyOworCXNpemVfdCBzaXplOworCXNpemVfdCBvZmZzZXQ7CisJc2l6ZV90IHBpdGNoOworCXVuc2lnbmVkIGhhbmRsZTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCdWZmZXJzIG1hbmFnZW1lbnQKKyAqLworCitzdGF0aWMgc3RydWN0IGJvICoKK2JvX2NyZWF0ZV9kdW1iKGludCBmZCwgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCB1bnNpZ25lZCBpbnQgYnBwKQoreworCXN0cnVjdCBkcm1fbW9kZV9jcmVhdGVfZHVtYiBhcmc7CisJc3RydWN0IGJvICpibzsKKwlpbnQgcmV0OworCisJYm8gPSBjYWxsb2MoMSwgc2l6ZW9mKCpibykpOworCWlmIChibyA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBvYmplY3RcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoJmFyZywgMCwgc2l6ZW9mKGFyZykpOworCWFyZy5icHAgPSBicHA7CisJYXJnLndpZHRoID0gd2lkdGg7CisJYXJnLmhlaWdodCA9IGhlaWdodDsKKworCXJldCA9IGRybUlvY3RsKGZkLCBEUk1fSU9DVExfTU9ERV9DUkVBVEVfRFVNQiwgJmFyZyk7CisJaWYgKHJldCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBjcmVhdGUgZHVtYiBidWZmZXI6ICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJZnJlZShibyk7CisJCXJldHVybiBOVUxMOworCX0KKworCWJvLT5mZCA9IGZkOworCWJvLT5oYW5kbGUgPSBhcmcuaGFuZGxlOworCWJvLT5zaXplID0gYXJnLnNpemU7CisJYm8tPnBpdGNoID0gYXJnLnBpdGNoOworCisJcmV0dXJuIGJvOworfQorCitzdGF0aWMgaW50IGJvX21hcChzdHJ1Y3QgYm8gKmJvLCB2b2lkICoqb3V0KQoreworCXN0cnVjdCBkcm1fbW9kZV9tYXBfZHVtYiBhcmc7CisJdm9pZCAqbWFwOworCWludCByZXQ7CisKKwltZW1zZXQoJmFyZywgMCwgc2l6ZW9mKGFyZykpOworCWFyZy5oYW5kbGUgPSBiby0+aGFuZGxlOworCisJcmV0ID0gZHJtSW9jdGwoYm8tPmZkLCBEUk1fSU9DVExfTU9ERV9NQVBfRFVNQiwgJmFyZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW1hcCA9IGRybV9tbWFwKDAsIGJvLT5zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELAorCQkgICAgICAgYm8tPmZkLCBhcmcub2Zmc2V0KTsKKwlpZiAobWFwID09IE1BUF9GQUlMRUQpCisJCXJldHVybiAtRUlOVkFMOworCisJYm8tPnB0ciA9IG1hcDsKKwkqb3V0ID0gbWFwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJvX3VubWFwKHN0cnVjdCBibyAqYm8pCit7CisJaWYgKCFiby0+cHRyKQorCQlyZXR1cm47CisKKwlkcm1fbXVubWFwKGJvLT5wdHIsIGJvLT5zaXplKTsKKwliby0+cHRyID0gTlVMTDsKK30KKworc3RydWN0IGJvICoKK2JvX2NyZWF0ZShpbnQgZmQsIHVuc2lnbmVkIGludCBmb3JtYXQsCisJICB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsCisJICB1bnNpZ25lZCBpbnQgaGFuZGxlc1s0XSwgdW5zaWduZWQgaW50IHBpdGNoZXNbNF0sCisJICB1bnNpZ25lZCBpbnQgb2Zmc2V0c1s0XSwgZW51bSB1dGlsX2ZpbGxfcGF0dGVybiBwYXR0ZXJuKQoreworCXVuc2lnbmVkIGludCB2aXJ0dWFsX2hlaWdodDsKKwlzdHJ1Y3QgYm8gKmJvOworCXVuc2lnbmVkIGludCBicHA7CisJdm9pZCAqcGxhbmVzWzNdID0geyAwLCB9OworCXZvaWQgKnZpcnR1YWw7CisJaW50IHJldDsKKworCXN3aXRjaCAoZm9ybWF0KSB7CisJY2FzZSBEUk1fRk9STUFUX05WMTI6CisJY2FzZSBEUk1fRk9STUFUX05WMjE6CisJY2FzZSBEUk1fRk9STUFUX05WMTY6CisJY2FzZSBEUk1fRk9STUFUX05WNjE6CisJY2FzZSBEUk1fRk9STUFUX1lVVjQyMDoKKwljYXNlIERSTV9GT1JNQVRfWVZVNDIwOgorCQlicHAgPSA4OworCQlicmVhazsKKworCWNhc2UgRFJNX0ZPUk1BVF9BUkdCNDQ0NDoKKwljYXNlIERSTV9GT1JNQVRfWFJHQjQ0NDQ6CisJY2FzZSBEUk1fRk9STUFUX0FCR1I0NDQ0OgorCWNhc2UgRFJNX0ZPUk1BVF9YQkdSNDQ0NDoKKwljYXNlIERSTV9GT1JNQVRfUkdCQTQ0NDQ6CisJY2FzZSBEUk1fRk9STUFUX1JHQlg0NDQ0OgorCWNhc2UgRFJNX0ZPUk1BVF9CR1JBNDQ0NDoKKwljYXNlIERSTV9GT1JNQVRfQkdSWDQ0NDQ6CisJY2FzZSBEUk1fRk9STUFUX0FSR0IxNTU1OgorCWNhc2UgRFJNX0ZPUk1BVF9YUkdCMTU1NToKKwljYXNlIERSTV9GT1JNQVRfQUJHUjE1NTU6CisJY2FzZSBEUk1fRk9STUFUX1hCR1IxNTU1OgorCWNhc2UgRFJNX0ZPUk1BVF9SR0JBNTU1MToKKwljYXNlIERSTV9GT1JNQVRfUkdCWDU1NTE6CisJY2FzZSBEUk1fRk9STUFUX0JHUkE1NTUxOgorCWNhc2UgRFJNX0ZPUk1BVF9CR1JYNTU1MToKKwljYXNlIERSTV9GT1JNQVRfUkdCNTY1OgorCWNhc2UgRFJNX0ZPUk1BVF9CR1I1NjU6CisJY2FzZSBEUk1fRk9STUFUX1VZVlk6CisJY2FzZSBEUk1fRk9STUFUX1ZZVVk6CisJY2FzZSBEUk1fRk9STUFUX1lVWVY6CisJY2FzZSBEUk1fRk9STUFUX1lWWVU6CisJCWJwcCA9IDE2OworCQlicmVhazsKKworCWNhc2UgRFJNX0ZPUk1BVF9CR1I4ODg6CisJY2FzZSBEUk1fRk9STUFUX1JHQjg4ODoKKwkJYnBwID0gMjQ7CisJCWJyZWFrOworCisJY2FzZSBEUk1fRk9STUFUX0FSR0I4ODg4OgorCWNhc2UgRFJNX0ZPUk1BVF9YUkdCODg4ODoKKwljYXNlIERSTV9GT1JNQVRfQUJHUjg4ODg6CisJY2FzZSBEUk1fRk9STUFUX1hCR1I4ODg4OgorCWNhc2UgRFJNX0ZPUk1BVF9SR0JBODg4ODoKKwljYXNlIERSTV9GT1JNQVRfUkdCWDg4ODg6CisJY2FzZSBEUk1fRk9STUFUX0JHUkE4ODg4OgorCWNhc2UgRFJNX0ZPUk1BVF9CR1JYODg4ODoKKwljYXNlIERSTV9GT1JNQVRfQVJHQjIxMDEwMTA6CisJY2FzZSBEUk1fRk9STUFUX1hSR0IyMTAxMDEwOgorCWNhc2UgRFJNX0ZPUk1BVF9BQkdSMjEwMTAxMDoKKwljYXNlIERSTV9GT1JNQVRfWEJHUjIxMDEwMTA6CisJY2FzZSBEUk1fRk9STUFUX1JHQkExMDEwMTAyOgorCWNhc2UgRFJNX0ZPUk1BVF9SR0JYMTAxMDEwMjoKKwljYXNlIERSTV9GT1JNQVRfQkdSQTEwMTAxMDI6CisJY2FzZSBEUk1fRk9STUFUX0JHUlgxMDEwMTAyOgorCQlicHAgPSAzMjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZGVyciwgInVuc3VwcG9ydGVkIGZvcm1hdCAweCUwOHhcbiIsICBmb3JtYXQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzd2l0Y2ggKGZvcm1hdCkgeworCWNhc2UgRFJNX0ZPUk1BVF9OVjEyOgorCWNhc2UgRFJNX0ZPUk1BVF9OVjIxOgorCWNhc2UgRFJNX0ZPUk1BVF9ZVVY0MjA6CisJY2FzZSBEUk1fRk9STUFUX1lWVTQyMDoKKwkJdmlydHVhbF9oZWlnaHQgPSBoZWlnaHQgKiAzIC8gMjsKKwkJYnJlYWs7CisKKwljYXNlIERSTV9GT1JNQVRfTlYxNjoKKwljYXNlIERSTV9GT1JNQVRfTlY2MToKKwkJdmlydHVhbF9oZWlnaHQgPSBoZWlnaHQgKiAyOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXZpcnR1YWxfaGVpZ2h0ID0gaGVpZ2h0OworCQlicmVhazsKKwl9CisKKwlibyA9IGJvX2NyZWF0ZV9kdW1iKGZkLCB3aWR0aCwgdmlydHVhbF9oZWlnaHQsIGJwcCk7CisJaWYgKCFibykKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBib19tYXAoYm8sICZ2aXJ0dWFsKTsKKwlpZiAocmV0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIG1hcCBidWZmZXI6ICVzXG4iLAorCQkJc3RyZXJyb3IoLWVycm5vKSk7CisJCWJvX2Rlc3Ryb3koYm8pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBqdXN0IHRlc3RpbmcgYSBsaW1pdGVkICMgb2YgZm9ybWF0cyB0byB0ZXN0IHNpbmdsZQorCSAqIGFuZCBtdWx0aS1wbGFuYXIgcGF0aC4uIHdvdWxkIGJlIG5pY2UgdG8gYWRkIG1vcmUuLgorCSAqLworCXN3aXRjaCAoZm9ybWF0KSB7CisJY2FzZSBEUk1fRk9STUFUX1VZVlk6CisJY2FzZSBEUk1fRk9STUFUX1ZZVVk6CisJY2FzZSBEUk1fRk9STUFUX1lVWVY6CisJY2FzZSBEUk1fRk9STUFUX1lWWVU6CisJCW9mZnNldHNbMF0gPSAwOworCQloYW5kbGVzWzBdID0gYm8tPmhhbmRsZTsKKwkJcGl0Y2hlc1swXSA9IGJvLT5waXRjaDsKKworCQlwbGFuZXNbMF0gPSB2aXJ0dWFsOworCQlicmVhazsKKworCWNhc2UgRFJNX0ZPUk1BVF9OVjEyOgorCWNhc2UgRFJNX0ZPUk1BVF9OVjIxOgorCWNhc2UgRFJNX0ZPUk1BVF9OVjE2OgorCWNhc2UgRFJNX0ZPUk1BVF9OVjYxOgorCQlvZmZzZXRzWzBdID0gMDsKKwkJaGFuZGxlc1swXSA9IGJvLT5oYW5kbGU7CisJCXBpdGNoZXNbMF0gPSBiby0+cGl0Y2g7CisJCXBpdGNoZXNbMV0gPSBwaXRjaGVzWzBdOworCQlvZmZzZXRzWzFdID0gcGl0Y2hlc1swXSAqIGhlaWdodDsKKwkJaGFuZGxlc1sxXSA9IGJvLT5oYW5kbGU7CisKKwkJcGxhbmVzWzBdID0gdmlydHVhbDsKKwkJcGxhbmVzWzFdID0gdmlydHVhbCArIG9mZnNldHNbMV07CisJCWJyZWFrOworCisJY2FzZSBEUk1fRk9STUFUX1lVVjQyMDoKKwljYXNlIERSTV9GT1JNQVRfWVZVNDIwOgorCQlvZmZzZXRzWzBdID0gMDsKKwkJaGFuZGxlc1swXSA9IGJvLT5oYW5kbGU7CisJCXBpdGNoZXNbMF0gPSBiby0+cGl0Y2g7CisJCXBpdGNoZXNbMV0gPSBwaXRjaGVzWzBdIC8gMjsKKwkJb2Zmc2V0c1sxXSA9IHBpdGNoZXNbMF0gKiBoZWlnaHQ7CisJCWhhbmRsZXNbMV0gPSBiby0+aGFuZGxlOworCQlwaXRjaGVzWzJdID0gcGl0Y2hlc1sxXTsKKwkJb2Zmc2V0c1syXSA9IG9mZnNldHNbMV0gKyBwaXRjaGVzWzFdICogaGVpZ2h0IC8gMjsKKwkJaGFuZGxlc1syXSA9IGJvLT5oYW5kbGU7CisKKwkJcGxhbmVzWzBdID0gdmlydHVhbDsKKwkJcGxhbmVzWzFdID0gdmlydHVhbCArIG9mZnNldHNbMV07CisJCXBsYW5lc1syXSA9IHZpcnR1YWwgKyBvZmZzZXRzWzJdOworCQlicmVhazsKKworCWNhc2UgRFJNX0ZPUk1BVF9BUkdCNDQ0NDoKKwljYXNlIERSTV9GT1JNQVRfWFJHQjQ0NDQ6CisJY2FzZSBEUk1fRk9STUFUX0FCR1I0NDQ0OgorCWNhc2UgRFJNX0ZPUk1BVF9YQkdSNDQ0NDoKKwljYXNlIERSTV9GT1JNQVRfUkdCQTQ0NDQ6CisJY2FzZSBEUk1fRk9STUFUX1JHQlg0NDQ0OgorCWNhc2UgRFJNX0ZPUk1BVF9CR1JBNDQ0NDoKKwljYXNlIERSTV9GT1JNQVRfQkdSWDQ0NDQ6CisJY2FzZSBEUk1fRk9STUFUX0FSR0IxNTU1OgorCWNhc2UgRFJNX0ZPUk1BVF9YUkdCMTU1NToKKwljYXNlIERSTV9GT1JNQVRfQUJHUjE1NTU6CisJY2FzZSBEUk1fRk9STUFUX1hCR1IxNTU1OgorCWNhc2UgRFJNX0ZPUk1BVF9SR0JBNTU1MToKKwljYXNlIERSTV9GT1JNQVRfUkdCWDU1NTE6CisJY2FzZSBEUk1fRk9STUFUX0JHUkE1NTUxOgorCWNhc2UgRFJNX0ZPUk1BVF9CR1JYNTU1MToKKwljYXNlIERSTV9GT1JNQVRfUkdCNTY1OgorCWNhc2UgRFJNX0ZPUk1BVF9CR1I1NjU6CisJY2FzZSBEUk1fRk9STUFUX0JHUjg4ODoKKwljYXNlIERSTV9GT1JNQVRfUkdCODg4OgorCWNhc2UgRFJNX0ZPUk1BVF9BUkdCODg4ODoKKwljYXNlIERSTV9GT1JNQVRfWFJHQjg4ODg6CisJY2FzZSBEUk1fRk9STUFUX0FCR1I4ODg4OgorCWNhc2UgRFJNX0ZPUk1BVF9YQkdSODg4ODoKKwljYXNlIERSTV9GT1JNQVRfUkdCQTg4ODg6CisJY2FzZSBEUk1fRk9STUFUX1JHQlg4ODg4OgorCWNhc2UgRFJNX0ZPUk1BVF9CR1JBODg4ODoKKwljYXNlIERSTV9GT1JNQVRfQkdSWDg4ODg6CisJY2FzZSBEUk1fRk9STUFUX0FSR0IyMTAxMDEwOgorCWNhc2UgRFJNX0ZPUk1BVF9YUkdCMjEwMTAxMDoKKwljYXNlIERSTV9GT1JNQVRfQUJHUjIxMDEwMTA6CisJY2FzZSBEUk1fRk9STUFUX1hCR1IyMTAxMDEwOgorCWNhc2UgRFJNX0ZPUk1BVF9SR0JBMTAxMDEwMjoKKwljYXNlIERSTV9GT1JNQVRfUkdCWDEwMTAxMDI6CisJY2FzZSBEUk1fRk9STUFUX0JHUkExMDEwMTAyOgorCWNhc2UgRFJNX0ZPUk1BVF9CR1JYMTAxMDEwMjoKKwkJb2Zmc2V0c1swXSA9IDA7CisJCWhhbmRsZXNbMF0gPSBiby0+aGFuZGxlOworCQlwaXRjaGVzWzBdID0gYm8tPnBpdGNoOworCisJCXBsYW5lc1swXSA9IHZpcnR1YWw7CisJCWJyZWFrOworCX0KKworCXV0aWxfZmlsbF9wYXR0ZXJuKGZvcm1hdCwgcGF0dGVybiwgcGxhbmVzLCB3aWR0aCwgaGVpZ2h0LCBwaXRjaGVzWzBdKTsKKwlib191bm1hcChibyk7CisKKwlyZXR1cm4gYm87Cit9CisKK3ZvaWQgYm9fZGVzdHJveShzdHJ1Y3QgYm8gKmJvKQoreworCXN0cnVjdCBkcm1fbW9kZV9kZXN0cm95X2R1bWIgYXJnOworCWludCByZXQ7CisKKwltZW1zZXQoJmFyZywgMCwgc2l6ZW9mKGFyZykpOworCWFyZy5oYW5kbGUgPSBiby0+aGFuZGxlOworCisJcmV0ID0gZHJtSW9jdGwoYm8tPmZkLCBEUk1fSU9DVExfTU9ERV9ERVNUUk9ZX0RVTUIsICZhcmcpOworCWlmIChyZXQpCisJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIGRlc3Ryb3kgZHVtYiBidWZmZXI6ICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKworCWZyZWUoYm8pOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbW9kZXRlc3QvYnVmZmVycy5oIGIvdGVzdHMvbW9kZXRlc3QvYnVmZmVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOTUzOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tb2RldGVzdC9idWZmZXJzLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIERSTSBiYXNlZCBtb2RlIHNldHRpbmcgdGVzdCBwcm9ncmFtCisgKiBDb3B5cmlnaHQgMjAwOCBUdW5nc3RlbiBHcmFwaGljcworICogICBKYWtvYiBCb3JuZWNyYW50eiA8amFrb2JAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKiBDb3B5cmlnaHQgMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbgorICogICBKZXNzZSBCYXJuZXMgPGplc3NlLmJhcm5lc0BpbnRlbC5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19CVUZGRVJTX0hfXworI2RlZmluZSBfX0JVRkZFUlNfSF9fCisKKyNpbmNsdWRlICJ1dGlsL3BhdHRlcm4uaCIKKworc3RydWN0IGJvOworCitzdHJ1Y3QgYm8gKmJvX2NyZWF0ZShpbnQgZmQsIHVuc2lnbmVkIGludCBmb3JtYXQsCisJCSAgIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwKKwkJICAgdW5zaWduZWQgaW50IGhhbmRsZXNbNF0sIHVuc2lnbmVkIGludCBwaXRjaGVzWzRdLAorCQkgICB1bnNpZ25lZCBpbnQgb2Zmc2V0c1s0XSwgZW51bSB1dGlsX2ZpbGxfcGF0dGVybiBwYXR0ZXJuKTsKK3ZvaWQgYm9fZGVzdHJveShzdHJ1Y3QgYm8gKmJvKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0cy9tb2RldGVzdC9jdXJzb3IuYyBiL3Rlc3RzL21vZGV0ZXN0L2N1cnNvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZTgyYTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tb2RldGVzdC9jdXJzb3IuYwpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIERSTSBiYXNlZCBtb2RlIHNldHRpbmcgdGVzdCBwcm9ncmFtCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdAorICogQXV0aG9yOiBSb2IgQ2xhcmsgPHJvYmRjbGFya0BnbWFpbC5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgInhmODZkcm0uaCIKKyNpbmNsdWRlICJ4Zjg2ZHJtTW9kZS5oIgorCisjaW5jbHVkZSAidXRpbC9jb21tb24uaCIKKworI2luY2x1ZGUgImJ1ZmZlcnMuaCIKKyNpbmNsdWRlICJjdXJzb3IuaCIKKworc3RydWN0IGN1cnNvciB7CisJaW50IGZkOworCXVpbnQzMl90IGJvX2hhbmRsZTsKKwl1aW50MzJfdCBjcnRjX2lkOworCXVpbnQzMl90IGNydGNfdywgY3J0Y19oOworCXVpbnQzMl90IHcsIGg7CisKKwkvKiBjdXJyZW50IHN0YXRlICovCisJdWludDMyX3QgZW5hYmxlZCwgeCwgeTsKKwlpbnQzMl90IGR4LCBkeTsKK307CisKKyNkZWZpbmUgTUFYX0NVUlNPUlMgOAorc3RhdGljIHN0cnVjdCBjdXJzb3IgY3Vyc29yc1tNQVhfQ1VSU09SU107CitzdGF0aWMgaW50IG5jdXJzb3JzOworCitzdGF0aWMgcHRocmVhZF90IGN1cnNvcl90aHJlYWQ7CitzdGF0aWMgaW50IGN1cnNvcl9ydW5uaW5nOworCisvKgorICogVGltZXIgZHJpdmVuIHByb2dyYW0gbG9vcHMgdGhyb3VnaCB0aGVzZSBzdGVwcyB0byBtb3ZlL2VuYWJsZS9kaXNhYmxlCisgKiB0aGUgY3Vyc29yCisgKi8KKworc3RydWN0IGN1cnNvcl9zdGVwIHsKKwl2b2lkICgqcnVuKShzdHJ1Y3QgY3Vyc29yICpjdXJzb3IsIGNvbnN0IHN0cnVjdCBjdXJzb3Jfc3RlcCAqc3RlcCk7CisJdWludDMyX3QgbXNlYzsKKwl1aW50MzJfdCByZXBlYXQ7CisJaW50IGFyZzsKK307CisKK3N0YXRpYyB1aW50MzJfdCBpbmR4LCBjb3VudDsKKworc3RhdGljIHZvaWQgc2V0X2N1cnNvcihzdHJ1Y3QgY3Vyc29yICpjdXJzb3IsIGNvbnN0IHN0cnVjdCBjdXJzb3Jfc3RlcCAqc3RlcCkKK3sKKwlpbnQgZW5hYmxlZCA9IChzdGVwLT5hcmcgXiBjb3VudCkgJiAweDE7CisJdWludDMyX3QgaGFuZGxlID0gMDsKKworCWlmIChlbmFibGVkKQorCQloYW5kbGUgPSBjdXJzb3ItPmJvX2hhbmRsZTsKKworCWN1cnNvci0+ZW5hYmxlZCA9IGVuYWJsZWQ7CisKKwlkcm1Nb2RlU2V0Q3Vyc29yKGN1cnNvci0+ZmQsIGN1cnNvci0+Y3J0Y19pZCwgaGFuZGxlLCBjdXJzb3ItPncsIGN1cnNvci0+aCk7Cit9CisKK3N0YXRpYyB2b2lkIG1vdmVfY3Vyc29yKHN0cnVjdCBjdXJzb3IgKmN1cnNvciwgY29uc3Qgc3RydWN0IGN1cnNvcl9zdGVwICpzdGVwKQoreworCWludCB4ID0gY3Vyc29yLT54OworCWludCB5ID0gY3Vyc29yLT55OworCisJaWYgKCFjdXJzb3ItPmVuYWJsZWQpCisJCWRybU1vZGVTZXRDdXJzb3IoY3Vyc29yLT5mZCwgY3Vyc29yLT5jcnRjX2lkLAorCQkJCWN1cnNvci0+Ym9faGFuZGxlLCBjdXJzb3ItPncsIGN1cnNvci0+aCk7CisKKwkvKiBjYWxjdWxhdGUgbmV3IGN1cnNvciBwb3NpdGlvbjogKi8KKwl4ICs9IGN1cnNvci0+ZHggKiBzdGVwLT5hcmc7CisJeSArPSBjdXJzb3ItPmR5ICogc3RlcC0+YXJnOworCisJaWYgKHggPCAwKSB7CisJCXggPSAwOworCQljdXJzb3ItPmR4ID0gMTsKKwl9IGVsc2UgaWYgKHggPiAoaW50KWN1cnNvci0+Y3J0Y193KSB7CisJCXggPSBjdXJzb3ItPmNydGNfdyAtIDE7CisJCWN1cnNvci0+ZHggPSAtMTsKKwl9CisKKwlpZiAoeSA8IDApIHsKKwkJeSA9IDA7CisJCWN1cnNvci0+ZHkgPSAxOworCX0gZWxzZSBpZiAoeSA+IChpbnQpY3Vyc29yLT5jcnRjX2gpIHsKKwkJeSA9IGN1cnNvci0+Y3J0Y19oIC0gMTsKKwkJY3Vyc29yLT5keSA9IC0xOworCX0KKworCWN1cnNvci0+eCA9IHg7CisJY3Vyc29yLT55ID0geTsKKworCWRybU1vZGVNb3ZlQ3Vyc29yKGN1cnNvci0+ZmQsIGN1cnNvci0+Y3J0Y19pZCwgeCwgeSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3Vyc29yX3N0ZXAgc3RlcHNbXSA9IHsKKwkJeyAgc2V0X2N1cnNvciwgMTAsICAgMCwgIDEgfSwgIC8qIGVuYWJsZSAqLworCQl7IG1vdmVfY3Vyc29yLCAgMSwgMTAwLCAgMSB9LAorCQl7IG1vdmVfY3Vyc29yLCAgMSwgIDEwLCAxMCB9LAorCQl7ICBzZXRfY3Vyc29yLCAgMSwgMTAwLCAgMCB9LCAgLyogZGlzYWJsZS9lbmFibGUgbG9vcCAqLworCQl7IG1vdmVfY3Vyc29yLCAgMSwgIDEwLCAxMCB9LAorCQl7IG1vdmVfY3Vyc29yLCAgOSwgMTAwLCAgMSB9LAorCQl7IG1vdmVfY3Vyc29yLCAxMSwgMTAwLCAgNSB9LAorCQl7ICBzZXRfY3Vyc29yLCAxNywgIDEwLCAgMCB9LCAgLyogZGlzYWJsZS9lbmFibGUgbG9vcCAqLworCQl7IG1vdmVfY3Vyc29yLCAgOSwgMTAwLCAgMSB9LAorCQl7ICBzZXRfY3Vyc29yLCAxMywgIDEwLCAgMCB9LCAgLyogZGlzYWJsZS9lbmFibGUgbG9vcCAqLworCQl7IG1vdmVfY3Vyc29yLCAgOSwgMTAwLCAgMSB9LAorCQl7ICBzZXRfY3Vyc29yLCAxMywgIDEwLCAgMCB9LCAgLyogZGlzYWJsZS9lbmFibGUgbG9vcCAqLworCQl7ICBzZXRfY3Vyc29yLCAxMCwgICAwLCAgMCB9LCAgLyogZGlzYWJsZSAqLworfTsKKworc3RhdGljIHZvaWQgKmN1cnNvcl90aHJlYWRfZnVuYyh2b2lkICpkYXRhKQoreworCXdoaWxlIChjdXJzb3JfcnVubmluZykgeworCQljb25zdCBzdHJ1Y3QgY3Vyc29yX3N0ZXAgKnN0ZXAgPSAmc3RlcHNbaW5keCAlIEFSUkFZX1NJWkUoc3RlcHMpXTsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IG5jdXJzb3JzOyBpKyspIHsKKwkJCXN0cnVjdCBjdXJzb3IgKmN1cnNvciA9ICZjdXJzb3JzW2ldOworCQkJc3RlcC0+cnVuKGN1cnNvciwgc3RlcCk7CisJCX0KKworCQkvKiBpdGVyYXRlIHRvIG5leHQgY291bnQvc3RlcDogKi8KKwkJaWYgKGNvdW50IDwgc3RlcC0+cmVwZWF0KSB7CisJCQljb3VudCsrOworCQl9IGVsc2UgeworCQkJY291bnQgPSAwOworCQkJaW5keCsrOworCQl9CisKKwkJdXNsZWVwKDEwMDAgKiBzdGVwLT5tc2VjKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IGN1cnNvcl9pbml0KGludCBmZCwgdWludDMyX3QgYm9faGFuZGxlLCB1aW50MzJfdCBjcnRjX2lkLAorCQl1aW50MzJfdCBjcnRjX3csIHVpbnQzMl90IGNydGNfaCwgdWludDMyX3QgdywgdWludDMyX3QgaCkKK3sKKwlzdHJ1Y3QgY3Vyc29yICpjdXJzb3IgPSAmY3Vyc29yc1tuY3Vyc29yc107CisKKwlhc3NlcnQobmN1cnNvcnMgPCBNQVhfQ1VSU09SUyk7CisKKwljdXJzb3ItPmZkID0gZmQ7CisJY3Vyc29yLT5ib19oYW5kbGUgPSBib19oYW5kbGU7CisJY3Vyc29yLT5jcnRjX2lkID0gY3J0Y19pZDsKKwljdXJzb3ItPmNydGNfdyA9IGNydGNfdzsKKwljdXJzb3ItPmNydGNfaCA9IGNydGNfaDsKKwljdXJzb3ItPncgPSB3OworCWN1cnNvci0+aCA9IGg7CisKKwljdXJzb3ItPmVuYWJsZWQgPSAwOworCWN1cnNvci0+eCA9IHcvMjsKKwljdXJzb3ItPnkgPSBoLzI7CisJY3Vyc29yLT5keCA9IDE7CisJY3Vyc29yLT5keSA9IDE7CisKKwluY3Vyc29ycysrOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjdXJzb3Jfc3RhcnQodm9pZCkKK3sKKwljdXJzb3JfcnVubmluZyA9IDE7CisJcHRocmVhZF9jcmVhdGUoJmN1cnNvcl90aHJlYWQsIE5VTEwsIGN1cnNvcl90aHJlYWRfZnVuYywgTlVMTCk7CisJcHJpbnRmKCJzdGFydGluZyBjdXJzb3JcbiIpOworCXJldHVybiAwOworfQorCitpbnQgY3Vyc29yX3N0b3Aodm9pZCkKK3sKKwljdXJzb3JfcnVubmluZyA9IDA7CisJcHRocmVhZF9qb2luKGN1cnNvcl90aHJlYWQsIE5VTEwpOworCXByaW50ZigiY3Vyc29yIHN0b3BwZWRcbiIpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbW9kZXRlc3QvY3Vyc29yLmggYi90ZXN0cy9tb2RldGVzdC9jdXJzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODQ5ZjZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbW9kZXRlc3QvY3Vyc29yLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIERSTSBiYXNlZCBtb2RlIHNldHRpbmcgdGVzdCBwcm9ncmFtCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdAorICogQXV0aG9yOiBSb2IgQ2xhcmsgPHJvYmRjbGFya0BnbWFpbC5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19DVVJTT1JfSF9fCisjZGVmaW5lIF9fQ1VSU09SX0hfXworCitpbnQgY3Vyc29yX2luaXQoaW50IGZkLCB1aW50MzJfdCBib19oYW5kbGUsIHVpbnQzMl90IGNydGNfaWQsCisJCXVpbnQzMl90IGNydGNfdywgdWludDMyX3QgY3J0Y19oLCB1aW50MzJfdCB3LCB1aW50MzJfdCBoKTsKK2ludCBjdXJzb3Jfc3RhcnQodm9pZCk7CitpbnQgY3Vyc29yX3N0b3Aodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdHMvbW9kZXRlc3QvbW9kZXRlc3QuYyBiL3Rlc3RzL21vZGV0ZXN0L21vZGV0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg4OTFmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21vZGV0ZXN0L21vZGV0ZXN0LmMKQEAgLTAsMCArMSwxNzIwIEBACisvKgorICogRFJNIGJhc2VkIG1vZGUgc2V0dGluZyB0ZXN0IHByb2dyYW0KKyAqIENvcHlyaWdodCAyMDA4IFR1bmdzdGVuIEdyYXBoaWNzCisgKiAgIEpha29iIEJvcm5lY3JhbnR6IDxqYWtvYkB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KKyAqIENvcHlyaWdodCAyMDA4IEludGVsIENvcnBvcmF0aW9uCisgKiAgIEplc3NlIEJhcm5lcyA8amVzc2UuYmFybmVzQGludGVsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoaXMgZmFpcmx5IHNpbXBsZSB0ZXN0IHByb2dyYW0gZHVtcHMgb3V0cHV0IGluIGEgc2ltaWxhciBmb3JtYXQgdG8gdGhlCisgKiAieHJhbmRyIiB0b29sIGV2ZXJ5b25lIGtub3dzICYgbG92ZXMuICBJdCdzIG5lY2Vzc2FyaWx5IHNsaWdodGx5IGRpZmZlcmVudAorICogc2luY2UgdGhlIGtlcm5lbCBzZXBhcmF0ZXMgb3V0cHV0cyBpbnRvIGVuY29kZXIgYW5kIGNvbm5lY3RvciBzdHJ1Y3R1cmVzLAorICogZWFjaCB3aXRoIHRoZWlyIG93biB1bmlxdWUgSUQuICBUaGUgcHJvZ3JhbSBhbHNvIGFsbG93cyB0ZXN0IHRlc3Rpbmcgb2YgdGhlCisgKiBtZW1vcnkgbWFuYWdlbWVudCBhbmQgbW9kZSBzZXR0aW5nIEFQSXMgYnkgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3BlY2lmeSBhCisgKiBjb25uZWN0b3IgYW5kIG1vZGUgdG8gdXNlIGZvciBtb2RlIHNldHRpbmcuICBJZiBhbGwgd29ya3MgYXMgZXhwZWN0ZWQsIGEKKyAqIGJsdWUgYmFja2dyb3VuZCBzaG91bGQgYmUgcGFpbnRlZCBvbiB0aGUgbW9uaXRvciBhdHRhY2hlZCB0byB0aGUgc3BlY2lmaWVkCisgKiBjb25uZWN0b3IgYWZ0ZXIgdGhlIHNlbGVjdGVkIG1vZGUgaXMgc2V0LgorICoKKyAqIFRPRE86IHVzZSBjYWlybyB0byB3cml0ZSB0aGUgbW9kZSBpbmZvIG9uIHRoZSBzZWxlY3RlZCBvdXRwdXQgb25jZQorICogICAgICAgdGhlIG1vZGUgaGFzIGJlZW4gcHJvZ3JhbW1lZCwgYWxvbmcgd2l0aCBwb3NzaWJsZSB0ZXN0IHBhdHRlcm5zLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpZmRlZiBIQVZFX1NZU19TRUxFQ1RfSAorI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAieGY4NmRybS5oIgorI2luY2x1ZGUgInhmODZkcm1Nb2RlLmgiCisjaW5jbHVkZSAiZHJtX2ZvdXJjYy5oIgorCisjaW5jbHVkZSAidXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJ1dGlsL2Zvcm1hdC5oIgorI2luY2x1ZGUgInV0aWwva21zLmgiCisjaW5jbHVkZSAidXRpbC9wYXR0ZXJuLmgiCisKKyNpbmNsdWRlICJidWZmZXJzLmgiCisjaW5jbHVkZSAiY3Vyc29yLmgiCisKK3N0cnVjdCBjcnRjIHsKKwlkcm1Nb2RlQ3J0YyAqY3J0YzsKKwlkcm1Nb2RlT2JqZWN0UHJvcGVydGllcyAqcHJvcHM7CisJZHJtTW9kZVByb3BlcnR5UmVzICoqcHJvcHNfaW5mbzsKKwlkcm1Nb2RlTW9kZUluZm8gKm1vZGU7Cit9OworCitzdHJ1Y3QgZW5jb2RlciB7CisJZHJtTW9kZUVuY29kZXIgKmVuY29kZXI7Cit9OworCitzdHJ1Y3QgY29ubmVjdG9yIHsKKwlkcm1Nb2RlQ29ubmVjdG9yICpjb25uZWN0b3I7CisJZHJtTW9kZU9iamVjdFByb3BlcnRpZXMgKnByb3BzOworCWRybU1vZGVQcm9wZXJ0eVJlcyAqKnByb3BzX2luZm87CisJY2hhciAqbmFtZTsKK307CisKK3N0cnVjdCBmYiB7CisJZHJtTW9kZUZCICpmYjsKK307CisKK3N0cnVjdCBwbGFuZSB7CisJZHJtTW9kZVBsYW5lICpwbGFuZTsKKwlkcm1Nb2RlT2JqZWN0UHJvcGVydGllcyAqcHJvcHM7CisJZHJtTW9kZVByb3BlcnR5UmVzICoqcHJvcHNfaW5mbzsKK307CisKK3N0cnVjdCByZXNvdXJjZXMgeworCWRybU1vZGVSZXMgKnJlczsKKwlkcm1Nb2RlUGxhbmVSZXMgKnBsYW5lX3JlczsKKworCXN0cnVjdCBjcnRjICpjcnRjczsKKwlzdHJ1Y3QgZW5jb2RlciAqZW5jb2RlcnM7CisJc3RydWN0IGNvbm5lY3RvciAqY29ubmVjdG9yczsKKwlzdHJ1Y3QgZmIgKmZiczsKKwlzdHJ1Y3QgcGxhbmUgKnBsYW5lczsKK307CisKK3N0cnVjdCBkZXZpY2UgeworCWludCBmZDsKKworCXN0cnVjdCByZXNvdXJjZXMgKnJlc291cmNlczsKKworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGludCB3aWR0aDsKKwkJdW5zaWduZWQgaW50IGhlaWdodDsKKworCQl1bnNpZ25lZCBpbnQgZmJfaWQ7CisJCXN0cnVjdCBibyAqYm87CisJCXN0cnVjdCBibyAqY3Vyc29yX2JvOworCX0gbW9kZTsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50NjRfdCBVNjQySTY0KHVpbnQ2NF90IHZhbCkKK3sKKwlyZXR1cm4gKGludDY0X3QpKigoaW50NjRfdCAqKSZ2YWwpOworfQorCisjZGVmaW5lIGJpdF9uYW1lX2ZuKHJlcykJCQkJCVwKK2NvbnN0IGNoYXIgKiByZXMjI19zdHIoaW50IHR5cGUpIHsJCQkJXAorCXVuc2lnbmVkIGludCBpOwkJCQkJCVwKKwljb25zdCBjaGFyICpzZXAgPSAiIjsJCQkJCVwKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZXMjI19uYW1lcyk7IGkrKykgewkJXAorCQlpZiAodHlwZSAmICgxIDw8IGkpKSB7CQkJCVwKKwkJCXByaW50ZigiJXMlcyIsIHNlcCwgcmVzIyNfbmFtZXNbaV0pOwlcCisJCQlzZXAgPSAiLCAiOwkJCQlcCisJCX0JCQkJCQlcCisJfQkJCQkJCQlcCisJcmV0dXJuIE5VTEw7CQkJCQkJXAorfQorCitzdGF0aWMgY29uc3QgY2hhciAqbW9kZV90eXBlX25hbWVzW10gPSB7CisJImJ1aWx0aW4iLAorCSJjbG9ja19jIiwKKwkiY3J0Y19jIiwKKwkicHJlZmVycmVkIiwKKwkiZGVmYXVsdCIsCisJInVzZXJkZWYiLAorCSJkcml2ZXIiLAorfTsKKworc3RhdGljIGJpdF9uYW1lX2ZuKG1vZGVfdHlwZSkKKworc3RhdGljIGNvbnN0IGNoYXIgKm1vZGVfZmxhZ19uYW1lc1tdID0geworCSJwaHN5bmMiLAorCSJuaHN5bmMiLAorCSJwdnN5bmMiLAorCSJudnN5bmMiLAorCSJpbnRlcmxhY2UiLAorCSJkYmxzY2FuIiwKKwkiY3N5bmMiLAorCSJwY3N5bmMiLAorCSJuY3N5bmMiLAorCSJoc2tldyIsCisJImJjYXN0IiwKKwkicGl4bXV4IiwKKwkiZGJsY2xrIiwKKwkiY2xrZGl2MiIKK307CisKK3N0YXRpYyBiaXRfbmFtZV9mbihtb2RlX2ZsYWcpCisKK3N0YXRpYyB2b2lkIGR1bXBfZm91cmNjKHVpbnQzMl90IGZvdXJjYykKK3sKKwlwcmludGYoIiAlYyVjJWMlYyIsCisJCWZvdXJjYywKKwkJZm91cmNjID4+IDgsCisJCWZvdXJjYyA+PiAxNiwKKwkJZm91cmNjID4+IDI0KTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9lbmNvZGVycyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZHJtTW9kZUVuY29kZXIgKmVuY29kZXI7CisJaW50IGk7CisKKwlwcmludGYoIkVuY29kZXJzOlxuIik7CisJcHJpbnRmKCJpZFx0Y3J0Y1x0dHlwZVx0cG9zc2libGUgY3J0Y3NcdHBvc3NpYmxlIGNsb25lc1x0XG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5yZXNvdXJjZXMtPnJlcy0+Y291bnRfZW5jb2RlcnM7IGkrKykgeworCQllbmNvZGVyID0gZGV2LT5yZXNvdXJjZXMtPmVuY29kZXJzW2ldLmVuY29kZXI7CisJCWlmICghZW5jb2RlcikKKwkJCWNvbnRpbnVlOworCisJCXByaW50ZigiJWRcdCVkXHQlc1x0MHglMDh4XHQweCUwOHhcbiIsCisJCSAgICAgICBlbmNvZGVyLT5lbmNvZGVyX2lkLAorCQkgICAgICAgZW5jb2Rlci0+Y3J0Y19pZCwKKwkJICAgICAgIHV0aWxfbG9va3VwX2VuY29kZXJfdHlwZV9uYW1lKGVuY29kZXItPmVuY29kZXJfdHlwZSksCisJCSAgICAgICBlbmNvZGVyLT5wb3NzaWJsZV9jcnRjcywKKwkJICAgICAgIGVuY29kZXItPnBvc3NpYmxlX2Nsb25lcyk7CisJfQorCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9tb2RlKGRybU1vZGVNb2RlSW5mbyAqbW9kZSkKK3sKKwlwcmludGYoIiAgJXMgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQiLAorCSAgICAgICBtb2RlLT5uYW1lLAorCSAgICAgICBtb2RlLT52cmVmcmVzaCwKKwkgICAgICAgbW9kZS0+aGRpc3BsYXksCisJICAgICAgIG1vZGUtPmhzeW5jX3N0YXJ0LAorCSAgICAgICBtb2RlLT5oc3luY19lbmQsCisJICAgICAgIG1vZGUtPmh0b3RhbCwKKwkgICAgICAgbW9kZS0+dmRpc3BsYXksCisJICAgICAgIG1vZGUtPnZzeW5jX3N0YXJ0LAorCSAgICAgICBtb2RlLT52c3luY19lbmQsCisJICAgICAgIG1vZGUtPnZ0b3RhbCwKKwkgICAgICAgbW9kZS0+Y2xvY2spOworCisJcHJpbnRmKCIgZmxhZ3M6ICIpOworCW1vZGVfZmxhZ19zdHIobW9kZS0+ZmxhZ3MpOworCXByaW50ZigiOyB0eXBlOiAiKTsKKwltb2RlX3R5cGVfc3RyKG1vZGUtPnR5cGUpOworCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9ibG9iKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDMyX3QgYmxvYl9pZCkKK3sKKwl1aW50MzJfdCBpOworCXVuc2lnbmVkIGNoYXIgKmJsb2JfZGF0YTsKKwlkcm1Nb2RlUHJvcGVydHlCbG9iUHRyIGJsb2I7CisKKwlibG9iID0gZHJtTW9kZUdldFByb3BlcnR5QmxvYihkZXYtPmZkLCBibG9iX2lkKTsKKwlpZiAoIWJsb2IpIHsKKwkJcHJpbnRmKCJcbiIpOworCQlyZXR1cm47CisJfQorCisJYmxvYl9kYXRhID0gYmxvYi0+ZGF0YTsKKworCWZvciAoaSA9IDA7IGkgPCBibG9iLT5sZW5ndGg7IGkrKykgeworCQlpZiAoaSAlIDE2ID09IDApCisJCQlwcmludGYoIlxuXHRcdFx0Iik7CisJCXByaW50ZigiJS4yaGh4IiwgYmxvYl9kYXRhW2ldKTsKKwl9CisJcHJpbnRmKCJcbiIpOworCisJZHJtTW9kZUZyZWVQcm9wZXJ0eUJsb2IoYmxvYik7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfcHJvcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGRybU1vZGVQcm9wZXJ0eVB0ciBwcm9wLAorCQkgICAgICB1aW50MzJfdCBwcm9wX2lkLCB1aW50NjRfdCB2YWx1ZSkKK3sKKwlpbnQgaTsKKwlwcmludGYoIlx0JWQiLCBwcm9wX2lkKTsKKwlpZiAoIXByb3ApIHsKKwkJcHJpbnRmKCJcbiIpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRmKCIgJXM6XG4iLCBwcm9wLT5uYW1lKTsKKworCXByaW50ZigiXHRcdGZsYWdzOiIpOworCWlmIChwcm9wLT5mbGFncyAmIERSTV9NT0RFX1BST1BfUEVORElORykKKwkJcHJpbnRmKCIgcGVuZGluZyIpOworCWlmIChwcm9wLT5mbGFncyAmIERSTV9NT0RFX1BST1BfSU1NVVRBQkxFKQorCQlwcmludGYoIiBpbW11dGFibGUiKTsKKwlpZiAoZHJtX3Byb3BlcnR5X3R5cGVfaXMocHJvcCwgRFJNX01PREVfUFJPUF9TSUdORURfUkFOR0UpKQorCQlwcmludGYoIiBzaWduZWQgcmFuZ2UiKTsKKwlpZiAoZHJtX3Byb3BlcnR5X3R5cGVfaXMocHJvcCwgRFJNX01PREVfUFJPUF9SQU5HRSkpCisJCXByaW50ZigiIHJhbmdlIik7CisJaWYgKGRybV9wcm9wZXJ0eV90eXBlX2lzKHByb3AsIERSTV9NT0RFX1BST1BfRU5VTSkpCisJCXByaW50ZigiIGVudW0iKTsKKwlpZiAoZHJtX3Byb3BlcnR5X3R5cGVfaXMocHJvcCwgRFJNX01PREVfUFJPUF9CSVRNQVNLKSkKKwkJcHJpbnRmKCIgYml0bWFzayIpOworCWlmIChkcm1fcHJvcGVydHlfdHlwZV9pcyhwcm9wLCBEUk1fTU9ERV9QUk9QX0JMT0IpKQorCQlwcmludGYoIiBibG9iIik7CisJaWYgKGRybV9wcm9wZXJ0eV90eXBlX2lzKHByb3AsIERSTV9NT0RFX1BST1BfT0JKRUNUKSkKKwkJcHJpbnRmKCIgb2JqZWN0Iik7CisJcHJpbnRmKCJcbiIpOworCisJaWYgKGRybV9wcm9wZXJ0eV90eXBlX2lzKHByb3AsIERSTV9NT0RFX1BST1BfU0lHTkVEX1JBTkdFKSkgeworCQlwcmludGYoIlx0XHR2YWx1ZXM6Iik7CisJCWZvciAoaSA9IDA7IGkgPCBwcm9wLT5jb3VudF92YWx1ZXM7IGkrKykKKwkJCXByaW50ZigiICUiUFJJZDY0LCBVNjQySTY0KHByb3AtPnZhbHVlc1tpXSkpOworCQlwcmludGYoIlxuIik7CisJfQorCisJaWYgKGRybV9wcm9wZXJ0eV90eXBlX2lzKHByb3AsIERSTV9NT0RFX1BST1BfUkFOR0UpKSB7CisJCXByaW50ZigiXHRcdHZhbHVlczoiKTsKKwkJZm9yIChpID0gMDsgaSA8IHByb3AtPmNvdW50X3ZhbHVlczsgaSsrKQorCQkJcHJpbnRmKCIgJSJQUkl1NjQsIHByb3AtPnZhbHVlc1tpXSk7CisJCXByaW50ZigiXG4iKTsKKwl9CisKKwlpZiAoZHJtX3Byb3BlcnR5X3R5cGVfaXMocHJvcCwgRFJNX01PREVfUFJPUF9FTlVNKSkgeworCQlwcmludGYoIlx0XHRlbnVtczoiKTsKKwkJZm9yIChpID0gMDsgaSA8IHByb3AtPmNvdW50X2VudW1zOyBpKyspCisJCQlwcmludGYoIiAlcz0lbGx1IiwgcHJvcC0+ZW51bXNbaV0ubmFtZSwKKwkJCSAgICAgICBwcm9wLT5lbnVtc1tpXS52YWx1ZSk7CisJCXByaW50ZigiXG4iKTsKKwl9IGVsc2UgaWYgKGRybV9wcm9wZXJ0eV90eXBlX2lzKHByb3AsIERSTV9NT0RFX1BST1BfQklUTUFTSykpIHsKKwkJcHJpbnRmKCJcdFx0dmFsdWVzOiIpOworCQlmb3IgKGkgPSAwOyBpIDwgcHJvcC0+Y291bnRfZW51bXM7IGkrKykKKwkJCXByaW50ZigiICVzPTB4JWxseCIsIHByb3AtPmVudW1zW2ldLm5hbWUsCisJCQkgICAgICAgKDFMTCA8PCBwcm9wLT5lbnVtc1tpXS52YWx1ZSkpOworCQlwcmludGYoIlxuIik7CisJfSBlbHNlIHsKKwkJYXNzZXJ0KHByb3AtPmNvdW50X2VudW1zID09IDApOworCX0KKworCWlmIChkcm1fcHJvcGVydHlfdHlwZV9pcyhwcm9wLCBEUk1fTU9ERV9QUk9QX0JMT0IpKSB7CisJCXByaW50ZigiXHRcdGJsb2JzOlxuIik7CisJCWZvciAoaSA9IDA7IGkgPCBwcm9wLT5jb3VudF9ibG9iczsgaSsrKQorCQkJZHVtcF9ibG9iKGRldiwgcHJvcC0+YmxvYl9pZHNbaV0pOworCQlwcmludGYoIlxuIik7CisJfSBlbHNlIHsKKwkJYXNzZXJ0KHByb3AtPmNvdW50X2Jsb2JzID09IDApOworCX0KKworCXByaW50ZigiXHRcdHZhbHVlOiIpOworCWlmIChkcm1fcHJvcGVydHlfdHlwZV9pcyhwcm9wLCBEUk1fTU9ERV9QUk9QX0JMT0IpKQorCQlkdW1wX2Jsb2IoZGV2LCB2YWx1ZSk7CisJZWxzZSBpZiAoZHJtX3Byb3BlcnR5X3R5cGVfaXMocHJvcCwgRFJNX01PREVfUFJPUF9TSUdORURfUkFOR0UpKQorCQlwcmludGYoIiAlIlBSSWQ2NCJcbiIsIHZhbHVlKTsKKwllbHNlCisJCXByaW50ZigiICUiUFJJdTY0IlxuIiwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2Nvbm5lY3RvcnMoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCBpLCBqOworCisJcHJpbnRmKCJDb25uZWN0b3JzOlxuIik7CisJcHJpbnRmKCJpZFx0ZW5jb2Rlclx0c3RhdHVzXHRcdG5hbWVcdFx0c2l6ZSAobW0pXHRtb2Rlc1x0ZW5jb2RlcnNcbiIpOworCWZvciAoaSA9IDA7IGkgPCBkZXYtPnJlc291cmNlcy0+cmVzLT5jb3VudF9jb25uZWN0b3JzOyBpKyspIHsKKwkJc3RydWN0IGNvbm5lY3RvciAqX2Nvbm5lY3RvciA9ICZkZXYtPnJlc291cmNlcy0+Y29ubmVjdG9yc1tpXTsKKwkJZHJtTW9kZUNvbm5lY3RvciAqY29ubmVjdG9yID0gX2Nvbm5lY3Rvci0+Y29ubmVjdG9yOworCQlpZiAoIWNvbm5lY3RvcikKKwkJCWNvbnRpbnVlOworCisJCXByaW50ZigiJWRcdCVkXHQlc1x0JS0xNXNcdCVkeCVkXHRcdCVkXHQiLAorCQkgICAgICAgY29ubmVjdG9yLT5jb25uZWN0b3JfaWQsCisJCSAgICAgICBjb25uZWN0b3ItPmVuY29kZXJfaWQsCisJCSAgICAgICB1dGlsX2xvb2t1cF9jb25uZWN0b3Jfc3RhdHVzX25hbWUoY29ubmVjdG9yLT5jb25uZWN0aW9uKSwKKwkJICAgICAgIF9jb25uZWN0b3ItPm5hbWUsCisJCSAgICAgICBjb25uZWN0b3ItPm1tV2lkdGgsIGNvbm5lY3Rvci0+bW1IZWlnaHQsCisJCSAgICAgICBjb25uZWN0b3ItPmNvdW50X21vZGVzKTsKKworCQlmb3IgKGogPSAwOyBqIDwgY29ubmVjdG9yLT5jb3VudF9lbmNvZGVyczsgaisrKQorCQkJcHJpbnRmKCIlcyVkIiwgaiA+IDAgPyAiLCAiIDogIiIsIGNvbm5lY3Rvci0+ZW5jb2RlcnNbal0pOworCQlwcmludGYoIlxuIik7CisKKwkJaWYgKGNvbm5lY3Rvci0+Y291bnRfbW9kZXMpIHsKKwkJCXByaW50ZigiICBtb2RlczpcbiIpOworCQkJcHJpbnRmKCJcdG5hbWUgcmVmcmVzaCAoSHopIGhkaXNwIGhzcyBoc2UgaHRvdCB2ZGlzcCAiCisJCQkgICAgICAgInZzcyB2c2UgdnRvdClcbiIpOworCQkJZm9yIChqID0gMDsgaiA8IGNvbm5lY3Rvci0+Y291bnRfbW9kZXM7IGorKykKKwkJCQlkdW1wX21vZGUoJmNvbm5lY3Rvci0+bW9kZXNbal0pOworCQl9CisKKwkJaWYgKF9jb25uZWN0b3ItPnByb3BzKSB7CisJCQlwcmludGYoIiAgcHJvcHM6XG4iKTsKKwkJCWZvciAoaiA9IDA7IGogPCAoaW50KV9jb25uZWN0b3ItPnByb3BzLT5jb3VudF9wcm9wczsgaisrKQorCQkJCWR1bXBfcHJvcChkZXYsIF9jb25uZWN0b3ItPnByb3BzX2luZm9bal0sCisJCQkJCSAgX2Nvbm5lY3Rvci0+cHJvcHMtPnByb3BzW2pdLAorCQkJCQkgIF9jb25uZWN0b3ItPnByb3BzLT5wcm9wX3ZhbHVlc1tqXSk7CisJCX0KKwl9CisJcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2NydGNzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwl1aW50MzJfdCBqOworCisJcHJpbnRmKCJDUlRDczpcbiIpOworCXByaW50ZigiaWRcdGZiXHRwb3NcdHNpemVcbiIpOworCWZvciAoaSA9IDA7IGkgPCBkZXYtPnJlc291cmNlcy0+cmVzLT5jb3VudF9jcnRjczsgaSsrKSB7CisJCXN0cnVjdCBjcnRjICpfY3J0YyA9ICZkZXYtPnJlc291cmNlcy0+Y3J0Y3NbaV07CisJCWRybU1vZGVDcnRjICpjcnRjID0gX2NydGMtPmNydGM7CisJCWlmICghY3J0YykKKwkJCWNvbnRpbnVlOworCisJCXByaW50ZigiJWRcdCVkXHQoJWQsJWQpXHQoJWR4JWQpXG4iLAorCQkgICAgICAgY3J0Yy0+Y3J0Y19pZCwKKwkJICAgICAgIGNydGMtPmJ1ZmZlcl9pZCwKKwkJICAgICAgIGNydGMtPngsIGNydGMtPnksCisJCSAgICAgICBjcnRjLT53aWR0aCwgY3J0Yy0+aGVpZ2h0KTsKKwkJZHVtcF9tb2RlKCZjcnRjLT5tb2RlKTsKKworCQlpZiAoX2NydGMtPnByb3BzKSB7CisJCQlwcmludGYoIiAgcHJvcHM6XG4iKTsKKwkJCWZvciAoaiA9IDA7IGogPCBfY3J0Yy0+cHJvcHMtPmNvdW50X3Byb3BzOyBqKyspCisJCQkJZHVtcF9wcm9wKGRldiwgX2NydGMtPnByb3BzX2luZm9bal0sCisJCQkJCSAgX2NydGMtPnByb3BzLT5wcm9wc1tqXSwKKwkJCQkJICBfY3J0Yy0+cHJvcHMtPnByb3BfdmFsdWVzW2pdKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiICBubyBwcm9wZXJ0aWVzIGZvdW5kXG4iKTsKKwkJfQorCX0KKwlwcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfZnJhbWVidWZmZXJzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlkcm1Nb2RlRkIgKmZiOworCWludCBpOworCisJcHJpbnRmKCJGcmFtZSBidWZmZXJzOlxuIik7CisJcHJpbnRmKCJpZFx0c2l6ZVx0cGl0Y2hcbiIpOworCWZvciAoaSA9IDA7IGkgPCBkZXYtPnJlc291cmNlcy0+cmVzLT5jb3VudF9mYnM7IGkrKykgeworCQlmYiA9IGRldi0+cmVzb3VyY2VzLT5mYnNbaV0uZmI7CisJCWlmICghZmIpCisJCQljb250aW51ZTsKKworCQlwcmludGYoIiV1XHQoJXV4JXUpXHQldVxuIiwKKwkJICAgICAgIGZiLT5mYl9pZCwKKwkJICAgICAgIGZiLT53aWR0aCwgZmItPmhlaWdodCwKKwkJICAgICAgIGZiLT5waXRjaCk7CisJfQorCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9wbGFuZXMoc3RydWN0IGRldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGludCBpLCBqOworCisJcHJpbnRmKCJQbGFuZXM6XG4iKTsKKwlwcmludGYoImlkXHRjcnRjXHRmYlx0Q1JUQyB4LHlcdHgseVx0Z2FtbWEgc2l6ZVx0cG9zc2libGUgY3J0Y3NcbiIpOworCisJaWYgKCFkZXYtPnJlc291cmNlcy0+cGxhbmVfcmVzKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5yZXNvdXJjZXMtPnBsYW5lX3Jlcy0+Y291bnRfcGxhbmVzOyBpKyspIHsKKwkJc3RydWN0IHBsYW5lICpwbGFuZSA9ICZkZXYtPnJlc291cmNlcy0+cGxhbmVzW2ldOworCQlkcm1Nb2RlUGxhbmUgKm92ciA9IHBsYW5lLT5wbGFuZTsKKwkJaWYgKCFvdnIpCisJCQljb250aW51ZTsKKworCQlwcmludGYoIiVkXHQlZFx0JWRcdCVkLCVkXHRcdCVkLCVkXHQlLThkXHQweCUwOHhcbiIsCisJCSAgICAgICBvdnItPnBsYW5lX2lkLCBvdnItPmNydGNfaWQsIG92ci0+ZmJfaWQsCisJCSAgICAgICBvdnItPmNydGNfeCwgb3ZyLT5jcnRjX3ksIG92ci0+eCwgb3ZyLT55LAorCQkgICAgICAgb3ZyLT5nYW1tYV9zaXplLCBvdnItPnBvc3NpYmxlX2NydGNzKTsKKworCQlpZiAoIW92ci0+Y291bnRfZm9ybWF0cykKKwkJCWNvbnRpbnVlOworCisJCXByaW50ZigiICBmb3JtYXRzOiIpOworCQlmb3IgKGogPSAwOyBqIDwgb3ZyLT5jb3VudF9mb3JtYXRzOyBqKyspCisJCQlkdW1wX2ZvdXJjYyhvdnItPmZvcm1hdHNbal0pOworCQlwcmludGYoIlxuIik7CisKKwkJaWYgKHBsYW5lLT5wcm9wcykgeworCQkJcHJpbnRmKCIgIHByb3BzOlxuIik7CisJCQlmb3IgKGogPSAwOyBqIDwgcGxhbmUtPnByb3BzLT5jb3VudF9wcm9wczsgaisrKQorCQkJCWR1bXBfcHJvcChkZXYsIHBsYW5lLT5wcm9wc19pbmZvW2pdLAorCQkJCQkgIHBsYW5lLT5wcm9wcy0+cHJvcHNbal0sCisJCQkJCSAgcGxhbmUtPnByb3BzLT5wcm9wX3ZhbHVlc1tqXSk7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiAgbm8gcHJvcGVydGllcyBmb3VuZFxuIik7CisJCX0KKwl9CisJcHJpbnRmKCJcbiIpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3Jlc291cmNlcyhzdHJ1Y3QgcmVzb3VyY2VzICpyZXMpCit7CisJaW50IGk7CisKKwlpZiAoIXJlcykKKwkJcmV0dXJuOworCisjZGVmaW5lIGZyZWVfcmVzb3VyY2UoX3JlcywgX19yZXMsIHR5cGUsIFR5cGUpCQkJCQlcCisJZG8gewkJCQkJCQkJCVwKKwkJaWYgKCEoX3JlcyktPnR5cGUjI3MpCQkJCQkJXAorCQkJYnJlYWs7CQkJCQkJCVwKKwkJZm9yIChpID0gMDsgaSA8IChpbnQpKF9yZXMpLT5fX3Jlcy0+Y291bnRfIyN0eXBlIyNzOyArK2kpIHsJXAorCQkJaWYgKCEoX3JlcyktPnR5cGUjI3NbaV0udHlwZSkJCQkJXAorCQkJCWJyZWFrOwkJCQkJCVwKKwkJCWRybU1vZGVGcmVlIyNUeXBlKChfcmVzKS0+dHlwZSMjc1tpXS50eXBlKTsJCVwKKwkJfQkJCQkJCQkJXAorCQlmcmVlKChfcmVzKS0+dHlwZSMjcyk7CQkJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgZnJlZV9wcm9wZXJ0aWVzKF9yZXMsIF9fcmVzLCB0eXBlKQkJCQkJXAorCWRvIHsJCQkJCQkJCQlcCisJCWZvciAoaSA9IDA7IGkgPCAoaW50KShfcmVzKS0+X19yZXMtPmNvdW50XyMjdHlwZSMjczsgKytpKSB7CVwKKwkJCWRybU1vZGVGcmVlT2JqZWN0UHJvcGVydGllcyhyZXMtPnR5cGUjI3NbaV0ucHJvcHMpOwlcCisJCQlmcmVlKHJlcy0+dHlwZSMjc1tpXS5wcm9wc19pbmZvKTsJCQlcCisJCX0JCQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisJaWYgKHJlcy0+cmVzKSB7CisJCWZyZWVfcHJvcGVydGllcyhyZXMsIHJlcywgY3J0Yyk7CisKKwkJZnJlZV9yZXNvdXJjZShyZXMsIHJlcywgY3J0YywgQ3J0Yyk7CisJCWZyZWVfcmVzb3VyY2UocmVzLCByZXMsIGVuY29kZXIsIEVuY29kZXIpOworCisJCWZvciAoaSA9IDA7IGkgPCByZXMtPnJlcy0+Y291bnRfY29ubmVjdG9yczsgaSsrKQorCQkJZnJlZShyZXMtPmNvbm5lY3RvcnNbaV0ubmFtZSk7CisKKwkJZnJlZV9yZXNvdXJjZShyZXMsIHJlcywgY29ubmVjdG9yLCBDb25uZWN0b3IpOworCQlmcmVlX3Jlc291cmNlKHJlcywgcmVzLCBmYiwgRkIpOworCisJCWRybU1vZGVGcmVlUmVzb3VyY2VzKHJlcy0+cmVzKTsKKwl9CisKKwlpZiAocmVzLT5wbGFuZV9yZXMpIHsKKwkJZnJlZV9wcm9wZXJ0aWVzKHJlcywgcGxhbmVfcmVzLCBwbGFuZSk7CisKKwkJZnJlZV9yZXNvdXJjZShyZXMsIHBsYW5lX3JlcywgcGxhbmUsIFBsYW5lKTsKKworCQlkcm1Nb2RlRnJlZVBsYW5lUmVzb3VyY2VzKHJlcy0+cGxhbmVfcmVzKTsKKwl9CisKKwlmcmVlKHJlcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2VzICpnZXRfcmVzb3VyY2VzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2VzICpyZXM7CisJaW50IGk7CisKKwlyZXMgPSBjYWxsb2MoMSwgc2l6ZW9mKCpyZXMpKTsKKwlpZiAocmVzID09IDApCisJCXJldHVybiBOVUxMOworCisJZHJtU2V0Q2xpZW50Q2FwKGRldi0+ZmQsIERSTV9DTElFTlRfQ0FQX1VOSVZFUlNBTF9QTEFORVMsIDEpOworCisJcmVzLT5yZXMgPSBkcm1Nb2RlR2V0UmVzb3VyY2VzKGRldi0+ZmQpOworCWlmICghcmVzLT5yZXMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJkcm1Nb2RlR2V0UmVzb3VyY2VzIGZhaWxlZDogJXNcbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCQlnb3RvIGVycm9yOworCX0KKworCXJlcy0+Y3J0Y3MgPSBjYWxsb2MocmVzLT5yZXMtPmNvdW50X2NydGNzLCBzaXplb2YoKnJlcy0+Y3J0Y3MpKTsKKwlyZXMtPmVuY29kZXJzID0gY2FsbG9jKHJlcy0+cmVzLT5jb3VudF9lbmNvZGVycywgc2l6ZW9mKCpyZXMtPmVuY29kZXJzKSk7CisJcmVzLT5jb25uZWN0b3JzID0gY2FsbG9jKHJlcy0+cmVzLT5jb3VudF9jb25uZWN0b3JzLCBzaXplb2YoKnJlcy0+Y29ubmVjdG9ycykpOworCXJlcy0+ZmJzID0gY2FsbG9jKHJlcy0+cmVzLT5jb3VudF9mYnMsIHNpemVvZigqcmVzLT5mYnMpKTsKKworCWlmICghcmVzLT5jcnRjcyB8fCAhcmVzLT5lbmNvZGVycyB8fCAhcmVzLT5jb25uZWN0b3JzIHx8ICFyZXMtPmZicykKKwkJZ290byBlcnJvcjsKKworI2RlZmluZSBnZXRfcmVzb3VyY2UoX3JlcywgX19yZXMsIHR5cGUsIFR5cGUpCQkJCQlcCisJZG8gewkJCQkJCQkJCVwKKwkJZm9yIChpID0gMDsgaSA8IChpbnQpKF9yZXMpLT5fX3Jlcy0+Y291bnRfIyN0eXBlIyNzOyArK2kpIHsJXAorCQkJKF9yZXMpLT50eXBlIyNzW2ldLnR5cGUgPQkJCQlcCisJCQkJZHJtTW9kZUdldCMjVHlwZShkZXYtPmZkLCAoX3JlcyktPl9fcmVzLT50eXBlIyNzW2ldKTsgXAorCQkJaWYgKCEoX3JlcyktPnR5cGUjI3NbaV0udHlwZSkJCQkJXAorCQkJCWZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGdldCAlcyAlaTogJXNcbiIsCVwKKwkJCQkJI3R5cGUsIChfcmVzKS0+X19yZXMtPnR5cGUjI3NbaV0sCVwKKwkJCQkJc3RyZXJyb3IoZXJybm8pKTsJCQlcCisJCX0JCQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisJZ2V0X3Jlc291cmNlKHJlcywgcmVzLCBjcnRjLCBDcnRjKTsKKwlnZXRfcmVzb3VyY2UocmVzLCByZXMsIGVuY29kZXIsIEVuY29kZXIpOworCWdldF9yZXNvdXJjZShyZXMsIHJlcywgY29ubmVjdG9yLCBDb25uZWN0b3IpOworCWdldF9yZXNvdXJjZShyZXMsIHJlcywgZmIsIEZCKTsKKworCS8qIFNldCB0aGUgbmFtZSBvZiBhbGwgY29ubmVjdG9ycyBiYXNlZCBvbiB0aGUgdHlwZSBuYW1lIGFuZCB0aGUgcGVyLXR5cGUgSUQuICovCisJZm9yIChpID0gMDsgaSA8IHJlcy0+cmVzLT5jb3VudF9jb25uZWN0b3JzOyBpKyspIHsKKwkJc3RydWN0IGNvbm5lY3RvciAqY29ubmVjdG9yID0gJnJlcy0+Y29ubmVjdG9yc1tpXTsKKwkJZHJtTW9kZUNvbm5lY3RvciAqY29ubiA9IGNvbm5lY3Rvci0+Y29ubmVjdG9yOworCisJCWFzcHJpbnRmKCZjb25uZWN0b3ItPm5hbWUsICIlcy0ldSIsCisJCQkgdXRpbF9sb29rdXBfY29ubmVjdG9yX3R5cGVfbmFtZShjb25uLT5jb25uZWN0b3JfdHlwZSksCisJCQkgY29ubi0+Y29ubmVjdG9yX3R5cGVfaWQpOworCX0KKworI2RlZmluZSBnZXRfcHJvcGVydGllcyhfcmVzLCBfX3JlcywgdHlwZSwgVHlwZSkJCQkJCVwKKwlkbyB7CQkJCQkJCQkJXAorCQlmb3IgKGkgPSAwOyBpIDwgKGludCkoX3JlcyktPl9fcmVzLT5jb3VudF8jI3R5cGUjI3M7ICsraSkgewlcCisJCQlzdHJ1Y3QgdHlwZSAqb2JqID0gJnJlcy0+dHlwZSMjc1tpXTsJCQlcCisJCQl1bnNpZ25lZCBpbnQgajsJCQkJCQlcCisJCQlvYmotPnByb3BzID0JCQkJCQlcCisJCQkJZHJtTW9kZU9iamVjdEdldFByb3BlcnRpZXMoZGV2LT5mZCwgb2JqLT50eXBlLT50eXBlIyNfaWQsIFwKKwkJCQkJCQkgICBEUk1fTU9ERV9PQkpFQ1RfIyNUeXBlKTsgXAorCQkJaWYgKCFvYmotPnByb3BzKSB7CQkJCQlcCisJCQkJZnByaW50ZihzdGRlcnIsCQkJCQlcCisJCQkJCSJjb3VsZCBub3QgZ2V0ICVzICVpIHByb3BlcnRpZXM6ICVzXG4iLCBcCisJCQkJCSN0eXBlLCBvYmotPnR5cGUtPnR5cGUjI19pZCwJCVwKKwkJCQkJc3RyZXJyb3IoZXJybm8pKTsJCQlcCisJCQkJY29udGludWU7CQkJCQlcCisJCQl9CQkJCQkJCVwKKwkJCW9iai0+cHJvcHNfaW5mbyA9IGNhbGxvYyhvYmotPnByb3BzLT5jb3VudF9wcm9wcywJXAorCQkJCQkJIHNpemVvZigqb2JqLT5wcm9wc19pbmZvKSk7CVwKKwkJCWlmICghb2JqLT5wcm9wc19pbmZvKQkJCQkJXAorCQkJCWNvbnRpbnVlOwkJCQkJXAorCQkJZm9yIChqID0gMDsgaiA8IG9iai0+cHJvcHMtPmNvdW50X3Byb3BzOyArK2opCQlcCisJCQkJb2JqLT5wcm9wc19pbmZvW2pdID0JCQkJXAorCQkJCQlkcm1Nb2RlR2V0UHJvcGVydHkoZGV2LT5mZCwgb2JqLT5wcm9wcy0+cHJvcHNbal0pOyBcCisJCX0JCQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisJZ2V0X3Byb3BlcnRpZXMocmVzLCByZXMsIGNydGMsIENSVEMpOworCWdldF9wcm9wZXJ0aWVzKHJlcywgcmVzLCBjb25uZWN0b3IsIENPTk5FQ1RPUik7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVzLT5yZXMtPmNvdW50X2NydGNzOyArK2kpCisJCXJlcy0+Y3J0Y3NbaV0ubW9kZSA9ICZyZXMtPmNydGNzW2ldLmNydGMtPm1vZGU7CisKKwlyZXMtPnBsYW5lX3JlcyA9IGRybU1vZGVHZXRQbGFuZVJlc291cmNlcyhkZXYtPmZkKTsKKwlpZiAoIXJlcy0+cGxhbmVfcmVzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZHJtTW9kZUdldFBsYW5lUmVzb3VyY2VzIGZhaWxlZDogJXNcbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gcmVzOworCX0KKworCXJlcy0+cGxhbmVzID0gY2FsbG9jKHJlcy0+cGxhbmVfcmVzLT5jb3VudF9wbGFuZXMsIHNpemVvZigqcmVzLT5wbGFuZXMpKTsKKwlpZiAoIXJlcy0+cGxhbmVzKQorCQlnb3RvIGVycm9yOworCisJZ2V0X3Jlc291cmNlKHJlcywgcGxhbmVfcmVzLCBwbGFuZSwgUGxhbmUpOworCWdldF9wcm9wZXJ0aWVzKHJlcywgcGxhbmVfcmVzLCBwbGFuZSwgUExBTkUpOworCisJcmV0dXJuIHJlczsKKworZXJyb3I6CisJZnJlZV9yZXNvdXJjZXMocmVzKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBnZXRfY3J0Y19pbmRleChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVpbnQzMl90IGlkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGRldi0+cmVzb3VyY2VzLT5yZXMtPmNvdW50X2NydGNzOyArK2kpIHsKKwkJZHJtTW9kZUNydGMgKmNydGMgPSBkZXYtPnJlc291cmNlcy0+Y3J0Y3NbaV0uY3J0YzsKKwkJaWYgKGNydGMgJiYgY3J0Yy0+Y3J0Y19pZCA9PSBpZCkKKwkJCXJldHVybiBpOworCX0KKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGRybU1vZGVDb25uZWN0b3IgKmdldF9jb25uZWN0b3JfYnlfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGNvbm5lY3RvciAqY29ubmVjdG9yOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGRldi0+cmVzb3VyY2VzLT5yZXMtPmNvdW50X2Nvbm5lY3RvcnM7IGkrKykgeworCQljb25uZWN0b3IgPSAmZGV2LT5yZXNvdXJjZXMtPmNvbm5lY3RvcnNbaV07CisKKwkJaWYgKHN0cmNtcChjb25uZWN0b3ItPm5hbWUsIG5hbWUpID09IDApCisJCQlyZXR1cm4gY29ubmVjdG9yLT5jb25uZWN0b3I7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBkcm1Nb2RlQ29ubmVjdG9yICpnZXRfY29ubmVjdG9yX2J5X2lkKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDMyX3QgaWQpCit7CisJZHJtTW9kZUNvbm5lY3RvciAqY29ubmVjdG9yOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGRldi0+cmVzb3VyY2VzLT5yZXMtPmNvdW50X2Nvbm5lY3RvcnM7IGkrKykgeworCQljb25uZWN0b3IgPSBkZXYtPnJlc291cmNlcy0+Y29ubmVjdG9yc1tpXS5jb25uZWN0b3I7CisJCWlmIChjb25uZWN0b3IgJiYgY29ubmVjdG9yLT5jb25uZWN0b3JfaWQgPT0gaWQpCisJCQlyZXR1cm4gY29ubmVjdG9yOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgZHJtTW9kZUVuY29kZXIgKmdldF9lbmNvZGVyX2J5X2lkKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDMyX3QgaWQpCit7CisJZHJtTW9kZUVuY29kZXIgKmVuY29kZXI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5yZXNvdXJjZXMtPnJlcy0+Y291bnRfZW5jb2RlcnM7IGkrKykgeworCQllbmNvZGVyID0gZGV2LT5yZXNvdXJjZXMtPmVuY29kZXJzW2ldLmVuY29kZXI7CisJCWlmIChlbmNvZGVyICYmIGVuY29kZXItPmVuY29kZXJfaWQgPT0gaWQpCisJCQlyZXR1cm4gZW5jb2RlcjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBpcGVzIGFuZCBwbGFuZXMKKyAqLworCisvKgorICogTW9kZSBzZXR0aW5nIHdpdGggdGhlIGtlcm5lbCBpbnRlcmZhY2VzIGlzIGEgYml0IG9mIGEgY2hvcmUuCisgKiBGaXJzdCB5b3UgaGF2ZSB0byBmaW5kIHRoZSBjb25uZWN0b3IgaW4gcXVlc3Rpb24gYW5kIG1ha2Ugc3VyZSB0aGUKKyAqIHJlcXVlc3RlZCBtb2RlIGlzIGF2YWlsYWJsZS4KKyAqIFRoZW4geW91IG5lZWQgdG8gZmluZCB0aGUgZW5jb2RlciBhdHRhY2hlZCB0byB0aGF0IGNvbm5lY3RvciBzbyB5b3UKKyAqIGNhbiBiaW5kIGl0IHdpdGggYSBmcmVlIGNydGMuCisgKi8KK3N0cnVjdCBwaXBlX2FyZyB7CisJY29uc3QgY2hhciAqKmNvbnM7CisJdWludDMyX3QgKmNvbl9pZHM7CisJdW5zaWduZWQgaW50IG51bV9jb25zOworCXVpbnQzMl90IGNydGNfaWQ7CisJY2hhciBtb2RlX3N0cls2NF07CisJY2hhciBmb3JtYXRfc3RyWzVdOworCXVuc2lnbmVkIGludCB2cmVmcmVzaDsKKwl1bnNpZ25lZCBpbnQgZm91cmNjOworCWRybU1vZGVNb2RlSW5mbyAqbW9kZTsKKwlzdHJ1Y3QgY3J0YyAqY3J0YzsKKwl1bnNpZ25lZCBpbnQgZmJfaWRbMl0sIGN1cnJlbnRfZmJfaWQ7CisJc3RydWN0IHRpbWV2YWwgc3RhcnQ7CisKKwlpbnQgc3dhcF9jb3VudDsKK307CisKK3N0cnVjdCBwbGFuZV9hcmcgeworCXVpbnQzMl90IHBsYW5lX2lkOyAgLyogdGhlIGlkIG9mIHBsYW5lIHRvIHVzZSAqLworCXVpbnQzMl90IGNydGNfaWQ7ICAvKiB0aGUgaWQgb2YgQ1JUQyB0byBiaW5kIHRvICovCisJYm9vbCBoYXNfcG9zaXRpb247CisJaW50MzJfdCB4LCB5OworCXVpbnQzMl90IHcsIGg7CisJZG91YmxlIHNjYWxlOworCXVuc2lnbmVkIGludCBmYl9pZDsKKwlzdHJ1Y3QgYm8gKmJvOworCWNoYXIgZm9ybWF0X3N0cls1XTsgLyogbmVlZCB0byBsZWF2ZSByb29tIGZvciB0ZXJtaW5hdGluZyBcMCAqLworCXVuc2lnbmVkIGludCBmb3VyY2M7Cit9OworCitzdGF0aWMgZHJtTW9kZU1vZGVJbmZvICoKK2Nvbm5lY3Rvcl9maW5kX21vZGUoc3RydWN0IGRldmljZSAqZGV2LCB1aW50MzJfdCBjb25faWQsIGNvbnN0IGNoYXIgKm1vZGVfc3RyLAorICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgdnJlZnJlc2gpCit7CisJZHJtTW9kZUNvbm5lY3RvciAqY29ubmVjdG9yOworCWRybU1vZGVNb2RlSW5mbyAqbW9kZTsKKwlpbnQgaTsKKworCWNvbm5lY3RvciA9IGdldF9jb25uZWN0b3JfYnlfaWQoZGV2LCBjb25faWQpOworCWlmICghY29ubmVjdG9yIHx8ICFjb25uZWN0b3ItPmNvdW50X21vZGVzKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBjb25uZWN0b3ItPmNvdW50X21vZGVzOyBpKyspIHsKKwkJbW9kZSA9ICZjb25uZWN0b3ItPm1vZGVzW2ldOworCQlpZiAoIXN0cmNtcChtb2RlLT5uYW1lLCBtb2RlX3N0cikpIHsKKwkJCS8qIElmIHRoZSB2ZXJ0aWNhbCByZWZyZXNoIGZyZXF1ZW5jeSBpcyBub3Qgc3BlY2lmaWVkIHRoZW4gcmV0dXJuIHRoZQorCQkJICogZmlyc3QgbW9kZSB0aGF0IG1hdGNoIHdpdGggdGhlIG5hbWUuIEVsc2UsIHJldHVybiB0aGUgbW9kZSB0aGF0IG1hdGNoCisJCQkgKiB0aGUgbmFtZSBhbmQgdGhlIHNwZWNpZmllZCB2ZXJ0aWNhbCByZWZyZXNoIGZyZXF1ZW5jeS4KKwkJCSAqLworCQkJaWYgKHZyZWZyZXNoID09IDApCisJCQkJcmV0dXJuIG1vZGU7CisJCQllbHNlIGlmIChtb2RlLT52cmVmcmVzaCA9PSB2cmVmcmVzaCkKKwkJCQlyZXR1cm4gbW9kZTsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGNydGMgKnBpcGVfZmluZF9jcnRjKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBpcGVfYXJnICpwaXBlKQoreworCXVpbnQzMl90IHBvc3NpYmxlX2NydGNzID0gfjA7CisJdWludDMyX3QgYWN0aXZlX2NydGNzID0gMDsKKwl1bnNpZ25lZCBpbnQgY3J0Y19pZHg7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGlwZS0+bnVtX2NvbnM7ICsraSkgeworCQl1aW50MzJfdCBjcnRjc19mb3JfY29ubmVjdG9yID0gMDsKKwkJZHJtTW9kZUNvbm5lY3RvciAqY29ubmVjdG9yOworCQlkcm1Nb2RlRW5jb2RlciAqZW5jb2RlcjsKKwkJaW50IGlkeDsKKworCQljb25uZWN0b3IgPSBnZXRfY29ubmVjdG9yX2J5X2lkKGRldiwgcGlwZS0+Y29uX2lkc1tpXSk7CisJCWlmICghY29ubmVjdG9yKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJZm9yIChqID0gMDsgaiA8IGNvbm5lY3Rvci0+Y291bnRfZW5jb2RlcnM7ICsraikgeworCQkJZW5jb2RlciA9IGdldF9lbmNvZGVyX2J5X2lkKGRldiwgY29ubmVjdG9yLT5lbmNvZGVyc1tqXSk7CisJCQlpZiAoIWVuY29kZXIpCisJCQkJY29udGludWU7CisKKwkJCWNydGNzX2Zvcl9jb25uZWN0b3IgfD0gZW5jb2Rlci0+cG9zc2libGVfY3J0Y3M7CisKKwkJCWlkeCA9IGdldF9jcnRjX2luZGV4KGRldiwgZW5jb2Rlci0+Y3J0Y19pZCk7CisJCQlpZiAoaWR4ID49IDApCisJCQkJYWN0aXZlX2NydGNzIHw9IDEgPDwgaWR4OworCQl9CisKKwkJcG9zc2libGVfY3J0Y3MgJj0gY3J0Y3NfZm9yX2Nvbm5lY3RvcjsKKwl9CisKKwlpZiAoIXBvc3NpYmxlX2NydGNzKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIFJldHVybiB0aGUgZmlyc3QgcG9zc2libGUgYW5kIGFjdGl2ZSBDUlRDIGlmIG9uZSBleGlzdHMsIG9yIHRoZSBmaXJzdAorCSAqIHBvc3NpYmxlIENSVEMgb3RoZXJ3aXNlLgorCSAqLworCWlmIChwb3NzaWJsZV9jcnRjcyAmIGFjdGl2ZV9jcnRjcykKKwkJY3J0Y19pZHggPSBmZnMocG9zc2libGVfY3J0Y3MgJiBhY3RpdmVfY3J0Y3MpOworCWVsc2UKKwkJY3J0Y19pZHggPSBmZnMocG9zc2libGVfY3J0Y3MpOworCisJcmV0dXJuICZkZXYtPnJlc291cmNlcy0+Y3J0Y3NbY3J0Y19pZHggLSAxXTsKK30KKworc3RhdGljIGludCBwaXBlX2ZpbmRfY3J0Y19hbmRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwaXBlX2FyZyAqcGlwZSkKK3sKKwlkcm1Nb2RlTW9kZUluZm8gKm1vZGUgPSBOVUxMOworCWludCBpOworCisJcGlwZS0+bW9kZSA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgKGludClwaXBlLT5udW1fY29uczsgaSsrKSB7CisJCW1vZGUgPSBjb25uZWN0b3JfZmluZF9tb2RlKGRldiwgcGlwZS0+Y29uX2lkc1tpXSwKKwkJCQkJICAgcGlwZS0+bW9kZV9zdHIsIHBpcGUtPnZyZWZyZXNoKTsKKwkJaWYgKG1vZGUgPT0gTlVMTCkgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJImZhaWxlZCB0byBmaW5kIG1vZGUgXCIlc1wiIGZvciBjb25uZWN0b3IgJXNcbiIsCisJCQkJcGlwZS0+bW9kZV9zdHIsIHBpcGUtPmNvbnNbaV0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBJZiB0aGUgQ1JUQyBJRCB3YXMgc3BlY2lmaWVkLCBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgQ1JUQy4gT3RoZXJ3aXNlCisJICogbG9jYXRlIGEgQ1JUQyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbGwgdGhlIGNvbm5lY3RvcnMuCisJICovCisJaWYgKHBpcGUtPmNydGNfaWQgIT0gKHVpbnQzMl90KS0xKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPnJlc291cmNlcy0+cmVzLT5jb3VudF9jcnRjczsgaSsrKSB7CisJCQlzdHJ1Y3QgY3J0YyAqY3J0YyA9ICZkZXYtPnJlc291cmNlcy0+Y3J0Y3NbaV07CisKKwkJCWlmIChwaXBlLT5jcnRjX2lkID09IGNydGMtPmNydGMtPmNydGNfaWQpIHsKKwkJCQlwaXBlLT5jcnRjID0gY3J0YzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXBpcGUtPmNydGMgPSBwaXBlX2ZpbmRfY3J0YyhkZXYsIHBpcGUpOworCX0KKworCWlmICghcGlwZS0+Y3J0YykgeworCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBmaW5kIENSVEMgZm9yIHBpcGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwaXBlLT5tb2RlID0gbW9kZTsKKwlwaXBlLT5jcnRjLT5tb2RlID0gbW9kZTsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHJvcGVydGllcworICovCisKK3N0cnVjdCBwcm9wZXJ0eV9hcmcgeworCXVpbnQzMl90IG9ial9pZDsKKwl1aW50MzJfdCBvYmpfdHlwZTsKKwljaGFyIG5hbWVbRFJNX1BST1BfTkFNRV9MRU4rMV07CisJdWludDMyX3QgcHJvcF9pZDsKKwl1aW50NjRfdCB2YWx1ZTsKK307CisKK3N0YXRpYyB2b2lkIHNldF9wcm9wZXJ0eShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwcm9wZXJ0eV9hcmcgKnApCit7CisJZHJtTW9kZU9iamVjdFByb3BlcnRpZXMgKnByb3BzID0gTlVMTDsKKwlkcm1Nb2RlUHJvcGVydHlSZXMgKipwcm9wc19pbmZvID0gTlVMTDsKKwljb25zdCBjaGFyICpvYmpfdHlwZTsKKwlpbnQgcmV0OworCWludCBpOworCisJcC0+b2JqX3R5cGUgPSAwOworCXAtPnByb3BfaWQgPSAwOworCisjZGVmaW5lIGZpbmRfb2JqZWN0KF9yZXMsIF9fcmVzLCB0eXBlLCBUeXBlKQkJCQkJXAorCWRvIHsJCQkJCQkJCQlcCisJCWZvciAoaSA9IDA7IGkgPCAoaW50KShfcmVzKS0+X19yZXMtPmNvdW50XyMjdHlwZSMjczsgKytpKSB7CVwKKwkJCXN0cnVjdCB0eXBlICpvYmogPSAmKF9yZXMpLT50eXBlIyNzW2ldOwkJCVwKKwkJCWlmIChvYmotPnR5cGUtPnR5cGUjI19pZCAhPSBwLT5vYmpfaWQpCQkJXAorCQkJCWNvbnRpbnVlOwkJCQkJXAorCQkJcC0+b2JqX3R5cGUgPSBEUk1fTU9ERV9PQkpFQ1RfIyNUeXBlOwkJCVwKKwkJCW9ial90eXBlID0gI1R5cGU7CQkJCQlcCisJCQlwcm9wcyA9IG9iai0+cHJvcHM7CQkJCQlcCisJCQlwcm9wc19pbmZvID0gb2JqLT5wcm9wc19pbmZvOwkJCQlcCisJCX0JCQkJCQkJCVwKKwl9IHdoaWxlKDApCQkJCQkJCQlcCisKKwlmaW5kX29iamVjdChkZXYtPnJlc291cmNlcywgcmVzLCBjcnRjLCBDUlRDKTsKKwlpZiAocC0+b2JqX3R5cGUgPT0gMCkKKwkJZmluZF9vYmplY3QoZGV2LT5yZXNvdXJjZXMsIHJlcywgY29ubmVjdG9yLCBDT05ORUNUT1IpOworCWlmIChwLT5vYmpfdHlwZSA9PSAwKQorCQlmaW5kX29iamVjdChkZXYtPnJlc291cmNlcywgcGxhbmVfcmVzLCBwbGFuZSwgUExBTkUpOworCWlmIChwLT5vYmpfdHlwZSA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiT2JqZWN0ICVpIG5vdCBmb3VuZCwgY2FuJ3Qgc2V0IHByb3BlcnR5XG4iLAorCQkJcC0+b2JqX2lkKTsKKwkJCXJldHVybjsKKwl9CisKKwlpZiAoIXByb3BzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXMgJWkgaGFzIG5vIHByb3BlcnRpZXNcbiIsCisJCQlvYmpfdHlwZSwgcC0+b2JqX2lkKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAoaW50KXByb3BzLT5jb3VudF9wcm9wczsgKytpKSB7CisJCWlmICghcHJvcHNfaW5mb1tpXSkKKwkJCWNvbnRpbnVlOworCQlpZiAoc3RyY21wKHByb3BzX2luZm9baV0tPm5hbWUsIHAtPm5hbWUpID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSAoaW50KXByb3BzLT5jb3VudF9wcm9wcykgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzICVpIGhhcyBubyAlcyBwcm9wZXJ0eVxuIiwKKwkJCW9ial90eXBlLCBwLT5vYmpfaWQsIHAtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJcC0+cHJvcF9pZCA9IHByb3BzLT5wcm9wc1tpXTsKKworCXJldCA9IGRybU1vZGVPYmplY3RTZXRQcm9wZXJ0eShkZXYtPmZkLCBwLT5vYmpfaWQsIHAtPm9ial90eXBlLAorCQkJCSAgICAgICBwLT5wcm9wX2lkLCBwLT52YWx1ZSk7CisJaWYgKHJldCA8IDApCisJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIHNldCAlcyAlaSBwcm9wZXJ0eSAlcyB0byAlIiBQUkl1NjQgIjogJXNcbiIsCisJCQlvYmpfdHlwZSwgcC0+b2JqX2lkLCBwLT5uYW1lLCBwLT52YWx1ZSwgc3RyZXJyb3IoZXJybm8pKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQKK3BhZ2VfZmxpcF9oYW5kbGVyKGludCBmZCwgdW5zaWduZWQgaW50IGZyYW1lLAorCQkgIHVuc2lnbmVkIGludCBzZWMsIHVuc2lnbmVkIGludCB1c2VjLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwaXBlX2FyZyAqcGlwZTsKKwl1bnNpZ25lZCBpbnQgbmV3X2ZiX2lkOworCXN0cnVjdCB0aW1ldmFsIGVuZDsKKwlkb3VibGUgdDsKKworCXBpcGUgPSBkYXRhOworCWlmIChwaXBlLT5jdXJyZW50X2ZiX2lkID09IHBpcGUtPmZiX2lkWzBdKQorCQluZXdfZmJfaWQgPSBwaXBlLT5mYl9pZFsxXTsKKwllbHNlCisJCW5ld19mYl9pZCA9IHBpcGUtPmZiX2lkWzBdOworCisJZHJtTW9kZVBhZ2VGbGlwKGZkLCBwaXBlLT5jcnRjLT5jcnRjLT5jcnRjX2lkLCBuZXdfZmJfaWQsCisJCQlEUk1fTU9ERV9QQUdFX0ZMSVBfRVZFTlQsIHBpcGUpOworCXBpcGUtPmN1cnJlbnRfZmJfaWQgPSBuZXdfZmJfaWQ7CisJcGlwZS0+c3dhcF9jb3VudCsrOworCWlmIChwaXBlLT5zd2FwX2NvdW50ID09IDYwKSB7CisJCWdldHRpbWVvZmRheSgmZW5kLCBOVUxMKTsKKwkJdCA9IGVuZC50dl9zZWMgKyBlbmQudHZfdXNlYyAqIDFlLTYgLQorCQkJKHBpcGUtPnN0YXJ0LnR2X3NlYyArIHBpcGUtPnN0YXJ0LnR2X3VzZWMgKiAxZS02KTsKKwkJZnByaW50ZihzdGRlcnIsICJmcmVxOiAlLjAyZkh6XG4iLCBwaXBlLT5zd2FwX2NvdW50IC8gdCk7CisJCXBpcGUtPnN3YXBfY291bnQgPSAwOworCQlwaXBlLT5zdGFydCA9IGVuZDsKKwl9Cit9CisKK3N0YXRpYyBib29sIGZvcm1hdF9zdXBwb3J0KGNvbnN0IGRybU1vZGVQbGFuZVB0ciBvdnIsIHVpbnQzMl90IGZtdCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBvdnItPmNvdW50X2Zvcm1hdHM7ICsraSkgeworCQlpZiAob3ZyLT5mb3JtYXRzW2ldID09IGZtdCkKKwkJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludCBzZXRfcGxhbmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGxhbmVfYXJnICpwKQoreworCWRybU1vZGVQbGFuZSAqb3ZyOworCXVpbnQzMl90IGhhbmRsZXNbNF0gPSB7MH0sIHBpdGNoZXNbNF0gPSB7MH0sIG9mZnNldHNbNF0gPSB7MH07CisJdWludDMyX3QgcGxhbmVfaWQ7CisJc3RydWN0IGJvICpwbGFuZV9ibzsKKwl1aW50MzJfdCBwbGFuZV9mbGFncyA9IDA7CisJaW50IGNydGNfeCwgY3J0Y195LCBjcnRjX3csIGNydGNfaDsKKwlzdHJ1Y3QgY3J0YyAqY3J0YyA9IE5VTEw7CisJdW5zaWduZWQgaW50IHBpcGU7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBGaW5kIGFuIHVudXNlZCBwbGFuZSB3aGljaCBjYW4gYmUgY29ubmVjdGVkIHRvIG91ciBDUlRDLiBGaW5kIHRoZQorCSAqIENSVEMgaW5kZXggZmlyc3QsIHRoZW4gaXRlcmF0ZSBvdmVyIGF2YWlsYWJsZSBwbGFuZXMuCisJICovCisJZm9yIChpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpZGV2LT5yZXNvdXJjZXMtPnJlcy0+Y291bnRfY3J0Y3M7IGkrKykgeworCQlpZiAocC0+Y3J0Y19pZCA9PSBkZXYtPnJlc291cmNlcy0+cmVzLT5jcnRjc1tpXSkgeworCQkJY3J0YyA9ICZkZXYtPnJlc291cmNlcy0+Y3J0Y3NbaV07CisJCQlwaXBlID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFjcnRjKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ1JUQyAldSBub3QgZm91bmRcbiIsIHAtPmNydGNfaWQpOworCQlyZXR1cm4gLTE7CisJfQorCisJcGxhbmVfaWQgPSBwLT5wbGFuZV9pZDsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPnJlc291cmNlcy0+cGxhbmVfcmVzLT5jb3VudF9wbGFuZXM7IGkrKykgeworCQlvdnIgPSBkZXYtPnJlc291cmNlcy0+cGxhbmVzW2ldLnBsYW5lOworCQlpZiAoIW92cikKKwkJCWNvbnRpbnVlOworCisJCWlmIChwbGFuZV9pZCAmJiBwbGFuZV9pZCAhPSBvdnItPnBsYW5lX2lkKQorCQkJY29udGludWU7CisKKwkJaWYgKCFmb3JtYXRfc3VwcG9ydChvdnIsIHAtPmZvdXJjYykpCisJCQljb250aW51ZTsKKworCQlpZiAoKG92ci0+cG9zc2libGVfY3J0Y3MgJiAoMSA8PCBwaXBlKSkgJiYgIW92ci0+Y3J0Y19pZCkgeworCQkJcGxhbmVfaWQgPSBvdnItPnBsYW5lX2lkOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaSA9PSBkZXYtPnJlc291cmNlcy0+cGxhbmVfcmVzLT5jb3VudF9wbGFuZXMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJubyB1bnVzZWQgcGxhbmUgYXZhaWxhYmxlIGZvciBDUlRDICV1XG4iLAorCQkJY3J0Yy0+Y3J0Yy0+Y3J0Y19pZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlmcHJpbnRmKHN0ZGVyciwgInRlc3RpbmcgJWR4JWRAJXMgb3ZlcmxheSBwbGFuZSAldVxuIiwKKwkJcC0+dywgcC0+aCwgcC0+Zm9ybWF0X3N0ciwgcGxhbmVfaWQpOworCisJcGxhbmVfYm8gPSBib19jcmVhdGUoZGV2LT5mZCwgcC0+Zm91cmNjLCBwLT53LCBwLT5oLCBoYW5kbGVzLAorCQkJICAgICBwaXRjaGVzLCBvZmZzZXRzLCBVVElMX1BBVFRFUk5fVElMRVMpOworCWlmIChwbGFuZV9ibyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlwLT5ibyA9IHBsYW5lX2JvOworCisJLyoganVzdCB1c2Ugc2luZ2xlIHBsYW5lIGZvcm1hdCBmb3Igbm93Li4gKi8KKwlpZiAoZHJtTW9kZUFkZEZCMihkZXYtPmZkLCBwLT53LCBwLT5oLCBwLT5mb3VyY2MsCisJCQloYW5kbGVzLCBwaXRjaGVzLCBvZmZzZXRzLCAmcC0+ZmJfaWQsIHBsYW5lX2ZsYWdzKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBhZGQgZmI6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJY3J0Y193ID0gcC0+dyAqIHAtPnNjYWxlOworCWNydGNfaCA9IHAtPmggKiBwLT5zY2FsZTsKKwlpZiAoIXAtPmhhc19wb3NpdGlvbikgeworCQkvKiBEZWZhdWx0IHRvIHRoZSBtaWRkbGUgb2YgdGhlIHNjcmVlbiAqLworCQljcnRjX3ggPSAoY3J0Yy0+bW9kZS0+aGRpc3BsYXkgLSBjcnRjX3cpIC8gMjsKKwkJY3J0Y195ID0gKGNydGMtPm1vZGUtPnZkaXNwbGF5IC0gY3J0Y19oKSAvIDI7CisJfSBlbHNlIHsKKwkJY3J0Y194ID0gcC0+eDsKKwkJY3J0Y195ID0gcC0+eTsKKwl9CisKKwkvKiBub3RlIHNyYyBjb29yZHMgKGxhc3QgNCBhcmdzKSBhcmUgaW4gUTE2IGZvcm1hdCAqLworCWlmIChkcm1Nb2RlU2V0UGxhbmUoZGV2LT5mZCwgcGxhbmVfaWQsIGNydGMtPmNydGMtPmNydGNfaWQsIHAtPmZiX2lkLAorCQkJICAgIHBsYW5lX2ZsYWdzLCBjcnRjX3gsIGNydGNfeSwgY3J0Y193LCBjcnRjX2gsCisJCQkgICAgMCwgMCwgcC0+dyA8PCAxNiwgcC0+aCA8PCAxNikpIHsKKwkJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gZW5hYmxlIHBsYW5lOiAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlvdnItPmNydGNfaWQgPSBjcnRjLT5jcnRjLT5jcnRjX2lkOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX3BsYW5lcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwbGFuZV9hcmcgKnAsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWlmIChwW2ldLmZiX2lkKQorCQkJZHJtTW9kZVJtRkIoZGV2LT5mZCwgcFtpXS5mYl9pZCk7CisJCWlmIChwW2ldLmJvKQorCQkJYm9fZGVzdHJveShwW2ldLmJvKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgc2V0X21vZGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGlwZV9hcmcgKnBpcGVzLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJdWludDMyX3QgaGFuZGxlc1s0XSA9IHswfSwgcGl0Y2hlc1s0XSA9IHswfSwgb2Zmc2V0c1s0XSA9IHswfTsKKwl1bnNpZ25lZCBpbnQgZmJfaWQ7CisJc3RydWN0IGJvICpibzsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgajsKKwlpbnQgcmV0LCB4OworCisJZGV2LT5tb2RlLndpZHRoID0gMDsKKwlkZXYtPm1vZGUuaGVpZ2h0ID0gMDsKKwlkZXYtPm1vZGUuZmJfaWQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJc3RydWN0IHBpcGVfYXJnICpwaXBlID0gJnBpcGVzW2ldOworCisJCXJldCA9IHBpcGVfZmluZF9jcnRjX2FuZF9tb2RlKGRldiwgcGlwZSk7CisJCWlmIChyZXQgPCAwKQorCQkJY29udGludWU7CisKKwkJZGV2LT5tb2RlLndpZHRoICs9IHBpcGUtPm1vZGUtPmhkaXNwbGF5OworCQlpZiAoZGV2LT5tb2RlLmhlaWdodCA8IHBpcGUtPm1vZGUtPnZkaXNwbGF5KQorCQkJZGV2LT5tb2RlLmhlaWdodCA9IHBpcGUtPm1vZGUtPnZkaXNwbGF5OworCX0KKworCWJvID0gYm9fY3JlYXRlKGRldi0+ZmQsIHBpcGVzWzBdLmZvdXJjYywgZGV2LT5tb2RlLndpZHRoLAorCQkgICAgICAgZGV2LT5tb2RlLmhlaWdodCwgaGFuZGxlcywgcGl0Y2hlcywgb2Zmc2V0cywKKwkJICAgICAgIFVUSUxfUEFUVEVSTl9TTVBURSk7CisJaWYgKGJvID09IE5VTEwpCisJCXJldHVybjsKKworCWRldi0+bW9kZS5ibyA9IGJvOworCisJcmV0ID0gZHJtTW9kZUFkZEZCMihkZXYtPmZkLCBkZXYtPm1vZGUud2lkdGgsIGRldi0+bW9kZS5oZWlnaHQsCisJCQkgICAgcGlwZXNbMF0uZm91cmNjLCBoYW5kbGVzLCBwaXRjaGVzLCBvZmZzZXRzLCAmZmJfaWQsIDApOworCWlmIChyZXQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gYWRkIGZiICgldXgldSk6ICVzXG4iLAorCQkJZGV2LT5tb2RlLndpZHRoLCBkZXYtPm1vZGUuaGVpZ2h0LCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm47CisJfQorCisJZGV2LT5tb2RlLmZiX2lkID0gZmJfaWQ7CisKKwl4ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgcGlwZV9hcmcgKnBpcGUgPSAmcGlwZXNbaV07CisKKwkJaWYgKHBpcGUtPm1vZGUgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCXByaW50Zigic2V0dGluZyBtb2RlICVzLSVkSHpAJXMgb24gY29ubmVjdG9ycyAiLAorCQkgICAgICAgcGlwZS0+bW9kZV9zdHIsIHBpcGUtPm1vZGUtPnZyZWZyZXNoLCBwaXBlLT5mb3JtYXRfc3RyKTsKKwkJZm9yIChqID0gMDsgaiA8IHBpcGUtPm51bV9jb25zOyArK2opCisJCQlwcmludGYoIiVzLCAiLCBwaXBlLT5jb25zW2pdKTsKKwkJcHJpbnRmKCJjcnRjICVkXG4iLCBwaXBlLT5jcnRjLT5jcnRjLT5jcnRjX2lkKTsKKworCQlyZXQgPSBkcm1Nb2RlU2V0Q3J0YyhkZXYtPmZkLCBwaXBlLT5jcnRjLT5jcnRjLT5jcnRjX2lkLCBmYl9pZCwKKwkJCQkgICAgIHgsIDAsIHBpcGUtPmNvbl9pZHMsIHBpcGUtPm51bV9jb25zLAorCQkJCSAgICAgcGlwZS0+bW9kZSk7CisKKwkJLyogWFhYOiBBY3R1YWxseSBjaGVjayBpZiB0aGlzIGlzIG5lZWRlZCAqLworCQlkcm1Nb2RlRGlydHlGQihkZXYtPmZkLCBmYl9pZCwgTlVMTCwgMCk7CisKKwkJeCArPSBwaXBlLT5tb2RlLT5oZGlzcGxheTsKKworCQlpZiAocmV0KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBzZXQgbW9kZTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX21vZGUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmIChkZXYtPm1vZGUuZmJfaWQpCisJCWRybU1vZGVSbUZCKGRldi0+ZmQsIGRldi0+bW9kZS5mYl9pZCk7CisJaWYgKGRldi0+bW9kZS5ibykKKwkJYm9fZGVzdHJveShkZXYtPm1vZGUuYm8pOworfQorCitzdGF0aWMgdm9pZCBzZXRfcGxhbmVzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBsYW5lX2FyZyAqcCwgdW5zaWduZWQgaW50IGNvdW50KQoreworCXVuc2lnbmVkIGludCBpOworCisJLyogc2V0IHVwIHBsYW5lcy9vdmVybGF5cyAqLworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQlpZiAoc2V0X3BsYW5lKGRldiwgJnBbaV0pKQorCQkJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBzZXRfY3Vyc29ycyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwaXBlX2FyZyAqcGlwZXMsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwl1aW50MzJfdCBoYW5kbGVzWzRdID0gezB9LCBwaXRjaGVzWzRdID0gezB9LCBvZmZzZXRzWzRdID0gezB9OworCXN0cnVjdCBibyAqYm87CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldDsKKworCS8qIG1heWJlIG1ha2UgY3Vyc29yIHdpZHRoL2hlaWdodCBjb25maWd1cmFibGUgc29tZSBkYXkgKi8KKwl1aW50MzJfdCBjdyA9IDY0OworCXVpbnQzMl90IGNoID0gNjQ7CisKKwkvKiBjcmVhdGUgY3Vyc29yIGJvLi4ganVzdCB1c2luZyBQQVRURVJOX1BMQUlOIGFzIGl0IGhhcworCSAqIHRyYW5zbHVjZW50IGFscGhhCisJICovCisJYm8gPSBib19jcmVhdGUoZGV2LT5mZCwgRFJNX0ZPUk1BVF9BUkdCODg4OCwgY3csIGNoLCBoYW5kbGVzLCBwaXRjaGVzLAorCQkgICAgICAgb2Zmc2V0cywgVVRJTF9QQVRURVJOX1BMQUlOKTsKKwlpZiAoYm8gPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZGV2LT5tb2RlLmN1cnNvcl9ibyA9IGJvOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJc3RydWN0IHBpcGVfYXJnICpwaXBlID0gJnBpcGVzW2ldOworCQlyZXQgPSBjdXJzb3JfaW5pdChkZXYtPmZkLCBoYW5kbGVzWzBdLAorCQkJCXBpcGUtPmNydGMtPmNydGMtPmNydGNfaWQsCisJCQkJcGlwZS0+bW9kZS0+aGRpc3BsYXksIHBpcGUtPm1vZGUtPnZkaXNwbGF5LAorCQkJCWN3LCBjaCk7CisJCWlmIChyZXQpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIGluaXQgY3Vyc29yIGZvciBDUlRDWyV1XVxuIiwKKwkJCQkJcGlwZS0+Y3J0Y19pZCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwljdXJzb3Jfc3RhcnQoKTsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfY3Vyc29ycyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY3Vyc29yX3N0b3AoKTsKKworCWlmIChkZXYtPm1vZGUuY3Vyc29yX2JvKQorCQlib19kZXN0cm95KGRldi0+bW9kZS5jdXJzb3JfYm8pOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3BhZ2VfZmxpcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwaXBlX2FyZyAqcGlwZXMsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwl1aW50MzJfdCBoYW5kbGVzWzRdID0gezB9LCBwaXRjaGVzWzRdID0gezB9LCBvZmZzZXRzWzRdID0gezB9OworCXVuc2lnbmVkIGludCBvdGhlcl9mYl9pZDsKKwlzdHJ1Y3QgYm8gKm90aGVyX2JvOworCWRybUV2ZW50Q29udGV4dCBldmN0eDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJb3RoZXJfYm8gPSBib19jcmVhdGUoZGV2LT5mZCwgcGlwZXNbMF0uZm91cmNjLCBkZXYtPm1vZGUud2lkdGgsCisJCQkgICAgIGRldi0+bW9kZS5oZWlnaHQsIGhhbmRsZXMsIHBpdGNoZXMsIG9mZnNldHMsCisJCQkgICAgIFVUSUxfUEFUVEVSTl9QTEFJTik7CisJaWYgKG90aGVyX2JvID09IE5VTEwpCisJCXJldHVybjsKKworCXJldCA9IGRybU1vZGVBZGRGQjIoZGV2LT5mZCwgZGV2LT5tb2RlLndpZHRoLCBkZXYtPm1vZGUuaGVpZ2h0LAorCQkJICAgIHBpcGVzWzBdLmZvdXJjYywgaGFuZGxlcywgcGl0Y2hlcywgb2Zmc2V0cywKKwkJCSAgICAmb3RoZXJfZmJfaWQsIDApOworCWlmIChyZXQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gYWRkIGZiOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBlcnI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJc3RydWN0IHBpcGVfYXJnICpwaXBlID0gJnBpcGVzW2ldOworCisJCWlmIChwaXBlLT5tb2RlID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlyZXQgPSBkcm1Nb2RlUGFnZUZsaXAoZGV2LT5mZCwgcGlwZS0+Y3J0Yy0+Y3J0Yy0+Y3J0Y19pZCwKKwkJCQkgICAgICBvdGhlcl9mYl9pZCwgRFJNX01PREVfUEFHRV9GTElQX0VWRU5ULAorCQkJCSAgICAgIHBpcGUpOworCQlpZiAocmV0KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBwYWdlIGZsaXA6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQkJZ290byBlcnJfcm1mYjsKKwkJfQorCQlnZXR0aW1lb2ZkYXkoJnBpcGUtPnN0YXJ0LCBOVUxMKTsKKwkJcGlwZS0+c3dhcF9jb3VudCA9IDA7CisJCXBpcGUtPmZiX2lkWzBdID0gZGV2LT5tb2RlLmZiX2lkOworCQlwaXBlLT5mYl9pZFsxXSA9IG90aGVyX2ZiX2lkOworCQlwaXBlLT5jdXJyZW50X2ZiX2lkID0gb3RoZXJfZmJfaWQ7CisJfQorCisJbWVtc2V0KCZldmN0eCwgMCwgc2l6ZW9mIGV2Y3R4KTsKKwlldmN0eC52ZXJzaW9uID0gRFJNX0VWRU5UX0NPTlRFWFRfVkVSU0lPTjsKKwlldmN0eC52YmxhbmtfaGFuZGxlciA9IE5VTEw7CisJZXZjdHgucGFnZV9mbGlwX2hhbmRsZXIgPSBwYWdlX2ZsaXBfaGFuZGxlcjsKKworCXdoaWxlICgxKSB7CisjaWYgMAorCQlzdHJ1Y3QgcG9sbGZkIHBmZFsyXTsKKworCQlwZmRbMF0uZmQgPSAwOworCQlwZmRbMF0uZXZlbnRzID0gUE9MTElOOworCQlwZmRbMV0uZmQgPSBmZDsKKwkJcGZkWzFdLmV2ZW50cyA9IFBPTExJTjsKKworCQlpZiAocG9sbChwZmQsIDIsIC0xKSA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAicG9sbCBlcnJvclxuIik7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChwZmRbMF0ucmV2ZW50cykKKwkJCWJyZWFrOworI2Vsc2UKKwkJc3RydWN0IHRpbWV2YWwgdGltZW91dCA9IHsgLnR2X3NlYyA9IDMsIC50dl91c2VjID0gMCB9OworCQlmZF9zZXQgZmRzOworCisJCUZEX1pFUk8oJmZkcyk7CisJCUZEX1NFVCgwLCAmZmRzKTsKKwkJRkRfU0VUKGRldi0+ZmQsICZmZHMpOworCQlyZXQgPSBzZWxlY3QoZGV2LT5mZCArIDEsICZmZHMsIE5VTEwsIE5VTEwsICZ0aW1lb3V0KTsKKworCQlpZiAocmV0IDw9IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAic2VsZWN0IHRpbWVkIG91dCBvciBlcnJvciAocmV0ICVkKVxuIiwKKwkJCQlyZXQpOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoRkRfSVNTRVQoMCwgJmZkcykpIHsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKworCQlkcm1IYW5kbGVFdmVudChkZXYtPmZkLCAmZXZjdHgpOworCX0KKworZXJyX3JtZmI6CisJZHJtTW9kZVJtRkIoZGV2LT5mZCwgb3RoZXJfZmJfaWQpOworZXJyOgorCWJvX2Rlc3Ryb3kob3RoZXJfYm8pOworfQorCisjZGVmaW5lIG1pbihhLCBiKQkoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorCitzdGF0aWMgaW50IHBhcnNlX2Nvbm5lY3RvcihzdHJ1Y3QgcGlwZV9hcmcgKnBpcGUsIGNvbnN0IGNoYXIgKmFyZykKK3sKKwl1bnNpZ25lZCBpbnQgbGVuOworCXVuc2lnbmVkIGludCBpOworCWNvbnN0IGNoYXIgKnA7CisJY2hhciAqZW5kcDsKKworCXBpcGUtPnZyZWZyZXNoID0gMDsKKwlwaXBlLT5jcnRjX2lkID0gKHVpbnQzMl90KS0xOworCXN0cmNweShwaXBlLT5mb3JtYXRfc3RyLCAiWFIyNCIpOworCisJLyogQ291bnQgdGhlIG51bWJlciBvZiBjb25uZWN0b3JzIGFuZCBhbGxvY2F0ZSB0aGVtLiAqLworCXBpcGUtPm51bV9jb25zID0gMTsKKwlmb3IgKHAgPSBhcmc7ICpwICYmICpwICE9ICc6JyAmJiAqcCAhPSAnQCc7ICsrcCkgeworCQlpZiAoKnAgPT0gJywnKQorCQkJcGlwZS0+bnVtX2NvbnMrKzsKKwl9CisKKwlwaXBlLT5jb25faWRzID0gY2FsbG9jKHBpcGUtPm51bV9jb25zLCBzaXplb2YoKnBpcGUtPmNvbl9pZHMpKTsKKwlwaXBlLT5jb25zID0gY2FsbG9jKHBpcGUtPm51bV9jb25zLCBzaXplb2YoKnBpcGUtPmNvbnMpKTsKKwlpZiAocGlwZS0+Y29uX2lkcyA9PSBOVUxMIHx8IHBpcGUtPmNvbnMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJLyogUGFyc2UgdGhlIGNvbm5lY3RvcnMuICovCisJZm9yIChpID0gMCwgcCA9IGFyZzsgaSA8IHBpcGUtPm51bV9jb25zOyArK2ksIHAgPSBlbmRwICsgMSkgeworCQllbmRwID0gc3RycGJyayhwLCAiLEA6Iik7CisJCWlmICghZW5kcCkKKwkJCWJyZWFrOworCisJCXBpcGUtPmNvbnNbaV0gPSBzdHJuZHVwKHAsIGVuZHAgLSBwKTsKKworCQlpZiAoKmVuZHAgIT0gJywnKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgIT0gcGlwZS0+bnVtX2NvbnMgLSAxKQorCQlyZXR1cm4gLTE7CisKKwkvKiBQYXJzZSB0aGUgcmVtYWluaW5nIHBhcmFtZXRlcnMuICovCisJaWYgKCplbmRwID09ICdAJykgeworCQlhcmcgPSBlbmRwICsgMTsKKwkJcGlwZS0+Y3J0Y19pZCA9IHN0cnRvdWwoYXJnLCAmZW5kcCwgMTApOworCX0KKwlpZiAoKmVuZHAgIT0gJzonKQorCQlyZXR1cm4gLTE7CisKKwlhcmcgPSBlbmRwICsgMTsKKworCS8qIFNlYXJjaCBmb3IgdGhlIHZlcnRpY2FsIHJlZnJlc2ggb3IgdGhlIGZvcm1hdC4gKi8KKwlwID0gc3RycGJyayhhcmcsICItQCIpOworCWlmIChwID09IE5VTEwpCisJCXAgPSBhcmcgKyBzdHJsZW4oYXJnKTsKKwlsZW4gPSBtaW4oc2l6ZW9mIHBpcGUtPm1vZGVfc3RyIC0gMSwgKHVuc2lnbmVkIGludCkocCAtIGFyZykpOworCXN0cm5jcHkocGlwZS0+bW9kZV9zdHIsIGFyZywgbGVuKTsKKwlwaXBlLT5tb2RlX3N0cltsZW5dID0gJ1wwJzsKKworCWlmICgqcCA9PSAnLScpIHsKKwkJcGlwZS0+dnJlZnJlc2ggPSBzdHJ0b3VsKHAgKyAxLCAmZW5kcCwgMTApOworCQlwID0gZW5kcDsKKwl9CisKKwlpZiAoKnAgPT0gJ0AnKSB7CisJCXN0cm5jcHkocGlwZS0+Zm9ybWF0X3N0ciwgcCArIDEsIDQpOworCQlwaXBlLT5mb3JtYXRfc3RyWzRdID0gJ1wwJzsKKwl9CisKKwlwaXBlLT5mb3VyY2MgPSB1dGlsX2Zvcm1hdF9mb3VyY2MocGlwZS0+Zm9ybWF0X3N0cik7CisJaWYgKHBpcGUtPmZvdXJjYyA9PSAwKSAgeworCQlmcHJpbnRmKHN0ZGVyciwgInVua25vd24gZm9ybWF0ICVzXG4iLCBwaXBlLT5mb3JtYXRfc3RyKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX3BsYW5lKHN0cnVjdCBwbGFuZV9hcmcgKnBsYW5lLCBjb25zdCBjaGFyICpwKQoreworCWNoYXIgKmVuZDsKKworCXBsYW5lLT5wbGFuZV9pZCA9IHN0cnRvdWwocCwgJmVuZCwgMTApOworCWlmICgqZW5kICE9ICdAJykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwID0gZW5kICsgMTsKKwlwbGFuZS0+Y3J0Y19pZCA9IHN0cnRvdWwocCwgJmVuZCwgMTApOworCWlmICgqZW5kICE9ICc6JykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwID0gZW5kICsgMTsKKwlwbGFuZS0+dyA9IHN0cnRvdWwocCwgJmVuZCwgMTApOworCWlmICgqZW5kICE9ICd4JykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwID0gZW5kICsgMTsKKwlwbGFuZS0+aCA9IHN0cnRvdWwocCwgJmVuZCwgMTApOworCisJaWYgKCplbmQgPT0gJysnIHx8ICplbmQgPT0gJy0nKSB7CisJCXBsYW5lLT54ID0gc3RydG9sKGVuZCwgJmVuZCwgMTApOworCQlpZiAoKmVuZCAhPSAnKycgJiYgKmVuZCAhPSAnLScpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcGxhbmUtPnkgPSBzdHJ0b2woZW5kLCAmZW5kLCAxMCk7CisKKwkJcGxhbmUtPmhhc19wb3NpdGlvbiA9IHRydWU7CisJfQorCisJaWYgKCplbmQgPT0gJyonKSB7CisJCXAgPSBlbmQgKyAxOworCQlwbGFuZS0+c2NhbGUgPSBzdHJ0b2QocCwgJmVuZCk7CisJCWlmIChwbGFuZS0+c2NhbGUgPD0gMC4wKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJcGxhbmUtPnNjYWxlID0gMS4wOworCX0KKworCWlmICgqZW5kID09ICdAJykgeworCQlwID0gZW5kICsgMTsKKwkJaWYgKHN0cmxlbihwKSAhPSA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJc3RyY3B5KHBsYW5lLT5mb3JtYXRfc3RyLCBwKTsKKwl9IGVsc2UgeworCQlzdHJjcHkocGxhbmUtPmZvcm1hdF9zdHIsICJYUjI0Iik7CisJfQorCisJcGxhbmUtPmZvdXJjYyA9IHV0aWxfZm9ybWF0X2ZvdXJjYyhwbGFuZS0+Zm9ybWF0X3N0cik7CisJaWYgKHBsYW5lLT5mb3VyY2MgPT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInVua25vd24gZm9ybWF0ICVzXG4iLCBwbGFuZS0+Zm9ybWF0X3N0cik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX3Byb3BlcnR5KHN0cnVjdCBwcm9wZXJ0eV9hcmcgKnAsIGNvbnN0IGNoYXIgKmFyZykKK3sKKwlpZiAoc3NjYW5mKGFyZywgIiVkOiUzMlteOl06JSIgU0NOdTY0LCAmcC0+b2JqX2lkLCBwLT5uYW1lLCAmcC0+dmFsdWUpICE9IDMpCisJCXJldHVybiAtMTsKKworCXAtPm9ial90eXBlID0gMDsKKwlwLT5uYW1lW0RSTV9QUk9QX05BTUVfTEVOXSA9ICdcMCc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdXNhZ2UoY2hhciAqbmFtZSkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbLWNEZGVmTVBwc0N2d11cbiIsIG5hbWUpOworCisJZnByaW50ZihzdGRlcnIsICJcbiBRdWVyeSBvcHRpb25zOlxuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LWNcdGxpc3QgY29ubmVjdG9yc1xuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1lXHRsaXN0IGVuY29kZXJzXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LWZcdGxpc3QgZnJhbWVidWZmZXJzXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LXBcdGxpc3QgQ1JUQ3MgYW5kIHBsYW5lcyAocGlwZXMpXG4iKTsKKworCWZwcmludGYoc3RkZXJyLCAiXG4gVGVzdCBvcHRpb25zOlxuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LVAgPHBsYW5lX2lkPkA8Y3J0Y19pZD46PHc+eDxoPlsrPHg+Kzx5Pl1bKjxzY2FsZT5dW0A8Zm9ybWF0Pl1cdHNldCBhIHBsYW5lXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LXMgPGNvbm5lY3Rvcl9pZD5bLDxjb25uZWN0b3JfaWQ+XVtAPGNydGNfaWQ+XTo8bW9kZT5bLTx2cmVmcmVzaD5dW0A8Zm9ybWF0Pl1cdHNldCBhIG1vZGVcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtQ1x0dGVzdCBodyBjdXJzb3JcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtdlx0dGVzdCB2c3luY2VkIHBhZ2UgZmxpcHBpbmdcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtdyA8b2JqX2lkPjo8cHJvcF9uYW1lPjo8dmFsdWU+XHRzZXQgcHJvcGVydHlcbiIpOworCisJZnByaW50ZihzdGRlcnIsICJcbiBHZW5lcmljIG9wdGlvbnM6XG5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtZFx0ZHJvcCBtYXN0ZXIgYWZ0ZXIgbW9kZSBzZXRcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtTSBtb2R1bGVcdHVzZSB0aGUgZ2l2ZW4gZHJpdmVyXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LUQgZGV2aWNlXHR1c2UgdGhlIGdpdmVuIGRldmljZVxuIik7CisKKwlmcHJpbnRmKHN0ZGVyciwgIlxuXHREZWZhdWx0IGlzIHRvIGR1bXAgYWxsIGluZm8uXG4iKTsKKwlleGl0KDApOworfQorCitzdGF0aWMgaW50IHBhZ2VfZmxpcHBpbmdfc3VwcG9ydGVkKHZvaWQpCit7CisJLypGSVhNRTogZ2VuZXJpYyBpb2N0bCBuZWVkZWQ/ICovCisJcmV0dXJuIDE7CisjaWYgMAorCWludCByZXQsIHZhbHVlOworCXN0cnVjdCBkcm1faTkxNV9nZXRwYXJhbSBncDsKKworCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9IQVNfUEFHRUZMSVBQSU5HOworCWdwLnZhbHVlID0gJnZhbHVlOworCisJcmV0ID0gZHJtQ29tbWFuZFdyaXRlUmVhZChmZCwgRFJNX0k5MTVfR0VUUEFSQU0sICZncCwgc2l6ZW9mKGdwKSk7CisJaWYgKHJldCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImRybV9pOTE1X2dldHBhcmFtOiAlbVxuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAqZ3AudmFsdWU7CisjZW5kaWYKK30KKworc3RhdGljIGludCBjdXJzb3Jfc3VwcG9ydGVkKHZvaWQpCit7CisJLypGSVhNRTogZ2VuZXJpYyBpb2N0bCBuZWVkZWQ/ICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGlwZV9yZXNvbHZlX2Nvbm5lY3RvcnMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGlwZV9hcmcgKnBpcGUpCit7CisJZHJtTW9kZUNvbm5lY3RvciAqY29ubmVjdG9yOworCXVuc2lnbmVkIGludCBpOworCXVpbnQzMl90IGlkOworCWNoYXIgKmVuZHA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGlwZS0+bnVtX2NvbnM7IGkrKykgeworCQlpZCA9IHN0cnRvdWwocGlwZS0+Y29uc1tpXSwgJmVuZHAsIDEwKTsKKwkJaWYgKGVuZHAgPT0gcGlwZS0+Y29uc1tpXSkgeworCQkJY29ubmVjdG9yID0gZ2V0X2Nvbm5lY3Rvcl9ieV9uYW1lKGRldiwgcGlwZS0+Y29uc1tpXSk7CisJCQlpZiAoIWNvbm5lY3RvcikgeworCQkJCWZwcmludGYoc3RkZXJyLCAibm8gY29ubmVjdG9yIG5hbWVkICclcydcbiIsCisJCQkJCXBpcGUtPmNvbnNbaV0pOworCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCisJCQlpZCA9IGNvbm5lY3Rvci0+Y29ubmVjdG9yX2lkOworCQl9CisKKwkJcGlwZS0+Y29uX2lkc1tpXSA9IGlkOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciBvcHRzdHJbXSA9ICJjZEQ6ZWZNOlA6cHM6Q3Z3OiI7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgZGV2aWNlIGRldjsKKworCWludCBjOworCWludCBlbmNvZGVycyA9IDAsIGNvbm5lY3RvcnMgPSAwLCBjcnRjcyA9IDAsIHBsYW5lcyA9IDAsIGZyYW1lYnVmZmVycyA9IDA7CisJaW50IGRyb3BfbWFzdGVyID0gMDsKKwlpbnQgdGVzdF92c3luYyA9IDA7CisJaW50IHRlc3RfY3Vyc29yID0gMDsKKwljaGFyICpkZXZpY2UgPSBOVUxMOworCWNoYXIgKm1vZHVsZSA9IE5VTEw7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMCwgcGxhbmVfY291bnQgPSAwOworCXVuc2lnbmVkIGludCBwcm9wX2NvdW50ID0gMDsKKwlzdHJ1Y3QgcGlwZV9hcmcgKnBpcGVfYXJncyA9IE5VTEw7CisJc3RydWN0IHBsYW5lX2FyZyAqcGxhbmVfYXJncyA9IE5VTEw7CisJc3RydWN0IHByb3BlcnR5X2FyZyAqcHJvcF9hcmdzID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgYXJncyA9IDA7CisJaW50IHJldDsKKworCW1lbXNldCgmZGV2LCAwLCBzaXplb2YgZGV2KTsKKworCW9wdGVyciA9IDA7CisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIG9wdHN0cikpICE9IC0xKSB7CisJCWFyZ3MrKzsKKworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnYyc6CisJCQljb25uZWN0b3JzID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdEJzoKKwkJCWRldmljZSA9IG9wdGFyZzsKKwkJCWFyZ3MtLTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWRyb3BfbWFzdGVyID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdlJzoKKwkJCWVuY29kZXJzID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCWZyYW1lYnVmZmVycyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnTSc6CisJCQltb2R1bGUgPSBvcHRhcmc7CisJCQkvKiBQcmVzZXJ2ZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2YgZHVtcGluZyBhbGwgaW5mb3JtYXRpb24uICovCisJCQlhcmdzLS07CisJCQlicmVhazsKKwkJY2FzZSAnUCc6CisJCQlwbGFuZV9hcmdzID0gcmVhbGxvYyhwbGFuZV9hcmdzLAorCQkJCQkgICAgIChwbGFuZV9jb3VudCArIDEpICogc2l6ZW9mICpwbGFuZV9hcmdzKTsKKwkJCWlmIChwbGFuZV9hcmdzID09IE5VTEwpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQltZW1zZXQoJnBsYW5lX2FyZ3NbcGxhbmVfY291bnRdLCAwLCBzaXplb2YoKnBsYW5lX2FyZ3MpKTsKKworCQkJaWYgKHBhcnNlX3BsYW5lKCZwbGFuZV9hcmdzW3BsYW5lX2NvdW50XSwgb3B0YXJnKSA8IDApCisJCQkJdXNhZ2UoYXJndlswXSk7CisKKwkJCXBsYW5lX2NvdW50Kys7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQljcnRjcyA9IDE7CisJCQlwbGFuZXMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJcGlwZV9hcmdzID0gcmVhbGxvYyhwaXBlX2FyZ3MsCisJCQkJCSAgICAoY291bnQgKyAxKSAqIHNpemVvZiAqcGlwZV9hcmdzKTsKKwkJCWlmIChwaXBlX2FyZ3MgPT0gTlVMTCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAibWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCW1lbXNldCgmcGlwZV9hcmdzW2NvdW50XSwgMCwgc2l6ZW9mKCpwaXBlX2FyZ3MpKTsKKworCQkJaWYgKHBhcnNlX2Nvbm5lY3RvcigmcGlwZV9hcmdzW2NvdW50XSwgb3B0YXJnKSA8IDApCisJCQkJdXNhZ2UoYXJndlswXSk7CisKKwkJCWNvdW50Kys7CisJCQlicmVhazsKKwkJY2FzZSAnQyc6CisJCQl0ZXN0X2N1cnNvciA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQl0ZXN0X3ZzeW5jID0gMTsKKwkJCWJyZWFrOworCQljYXNlICd3JzoKKwkJCXByb3BfYXJncyA9IHJlYWxsb2MocHJvcF9hcmdzLAorCQkJCQkgICAocHJvcF9jb3VudCArIDEpICogc2l6ZW9mICpwcm9wX2FyZ3MpOworCQkJaWYgKHByb3BfYXJncyA9PSBOVUxMKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJbWVtc2V0KCZwcm9wX2FyZ3NbcHJvcF9jb3VudF0sIDAsIHNpemVvZigqcHJvcF9hcmdzKSk7CisKKwkJCWlmIChwYXJzZV9wcm9wZXJ0eSgmcHJvcF9hcmdzW3Byb3BfY291bnRdLCBvcHRhcmcpIDwgMCkKKwkJCQl1c2FnZShhcmd2WzBdKTsKKworCQkJcHJvcF9jb3VudCsrOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl1c2FnZShhcmd2WzBdKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFhcmdzKQorCQllbmNvZGVycyA9IGNvbm5lY3RvcnMgPSBjcnRjcyA9IHBsYW5lcyA9IGZyYW1lYnVmZmVycyA9IDE7CisKKwlkZXYuZmQgPSB1dGlsX29wZW4oZGV2aWNlLCBtb2R1bGUpOworCWlmIChkZXYuZmQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAodGVzdF92c3luYyAmJiAhcGFnZV9mbGlwcGluZ19zdXBwb3J0ZWQoKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgInBhZ2UgZmxpcHBpbmcgbm90IHN1cHBvcnRlZCBieSBkcm0uXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICh0ZXN0X3ZzeW5jICYmICFjb3VudCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInBhZ2UgZmxpcHBpbmcgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIC1zIG9wdGlvbi5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHRlc3RfY3Vyc29yICYmICFjdXJzb3Jfc3VwcG9ydGVkKCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJodyBjdXJzb3Igbm90IHN1cHBvcnRlZCBieSBkcm0uXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWRldi5yZXNvdXJjZXMgPSBnZXRfcmVzb3VyY2VzKCZkZXYpOworCWlmICghZGV2LnJlc291cmNlcykgeworCQlkcm1DbG9zZShkZXYuZmQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlpZiAocGlwZV9yZXNvbHZlX2Nvbm5lY3RvcnMoJmRldiwgJnBpcGVfYXJnc1tpXSkgPCAwKSB7CisJCQlmcmVlX3Jlc291cmNlcyhkZXYucmVzb3VyY2VzKTsKKwkJCWRybUNsb3NlKGRldi5mZCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworI2RlZmluZSBkdW1wX3Jlc291cmNlKGRldiwgcmVzKSBpZiAocmVzKSBkdW1wXyMjcmVzKGRldikKKworCWR1bXBfcmVzb3VyY2UoJmRldiwgZW5jb2RlcnMpOworCWR1bXBfcmVzb3VyY2UoJmRldiwgY29ubmVjdG9ycyk7CisJZHVtcF9yZXNvdXJjZSgmZGV2LCBjcnRjcyk7CisJZHVtcF9yZXNvdXJjZSgmZGV2LCBwbGFuZXMpOworCWR1bXBfcmVzb3VyY2UoJmRldiwgZnJhbWVidWZmZXJzKTsKKworCWZvciAoaSA9IDA7IGkgPCBwcm9wX2NvdW50OyArK2kpCisJCXNldF9wcm9wZXJ0eSgmZGV2LCAmcHJvcF9hcmdzW2ldKTsKKworCWlmIChjb3VudCB8fCBwbGFuZV9jb3VudCkgeworCQl1aW50NjRfdCBjYXAgPSAwOworCisJCXJldCA9IGRybUdldENhcChkZXYuZmQsIERSTV9DQVBfRFVNQl9CVUZGRVIsICZjYXApOworCQlpZiAocmV0IHx8IGNhcCA9PSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImRyaXZlciBkb2Vzbid0IHN1cHBvcnQgdGhlIGR1bWIgYnVmZmVyIEFQSVxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCWlmIChjb3VudCkKKwkJCXNldF9tb2RlKCZkZXYsIHBpcGVfYXJncywgY291bnQpOworCisJCWlmIChwbGFuZV9jb3VudCkKKwkJCXNldF9wbGFuZXMoJmRldiwgcGxhbmVfYXJncywgcGxhbmVfY291bnQpOworCisJCWlmICh0ZXN0X2N1cnNvcikKKwkJCXNldF9jdXJzb3JzKCZkZXYsIHBpcGVfYXJncywgY291bnQpOworCisJCWlmICh0ZXN0X3ZzeW5jKQorCQkJdGVzdF9wYWdlX2ZsaXAoJmRldiwgcGlwZV9hcmdzLCBjb3VudCk7CisKKwkJaWYgKGRyb3BfbWFzdGVyKQorCQkJZHJtRHJvcE1hc3RlcihkZXYuZmQpOworCisJCWdldGNoYXIoKTsKKworCQlpZiAodGVzdF9jdXJzb3IpCisJCQljbGVhcl9jdXJzb3JzKCZkZXYpOworCisJCWlmIChwbGFuZV9jb3VudCkKKwkJCWNsZWFyX3BsYW5lcygmZGV2LCBwbGFuZV9hcmdzLCBwbGFuZV9jb3VudCk7CisKKwkJaWYgKGNvdW50KQorCQkJY2xlYXJfbW9kZSgmZGV2KTsKKwl9CisKKwlmcmVlX3Jlc291cmNlcyhkZXYucmVzb3VyY2VzKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbm91dmVhdS8uZ2l0aWdub3JlIGIvdGVzdHMvbm91dmVhdS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzN2JmYjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9ub3V2ZWF1Ly5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAordGhyZWFkZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL25vdXZlYXUvTWFrZWZpbGUuYW0gYi90ZXN0cy9ub3V2ZWF1L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNzk5YTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9ub3V2ZWF1L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTYgQEAKK0FNX0NGTEFHUyA9IFwKKwktcHRocmVhZCBcCisJJChXQVJOX0NGTEFHUykgXAorCS1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlL2RybSBcCisJLUkkKHRvcF9zcmNkaXIpL25vdXZlYXUgXAorCS1JJCh0b3Bfc3JjZGlyKQorCitMREFERCA9IFwKKwkuLi8uLi9ub3V2ZWF1L2xpYmRybV9ub3V2ZWF1LmxhIFwKKwkuLi8uLi9saWJkcm0ubGEgXAorCS1sZGwKKworVEVTVFMgPSB0aHJlYWRlZAorCitjaGVja19QUk9HUkFNUyA9ICQoVEVTVFMpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL25vdXZlYXUvdGhyZWFkZWQuYyBiL3Rlc3RzL25vdXZlYXUvdGhyZWFkZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODFhZjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbm91dmVhdS90aHJlYWRlZC5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTUgQ2Fub25pY2FsIEx0ZC4gKE1hYXJ0ZW4gTGFua2hvcnN0KQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlICJ4Zjg2ZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdS5oIgorCitzdGF0aWMgdHlwZW9mKGlvY3RsKSAqb2xkX2lvY3RsOworc3RhdGljIGludCBmYWlsZWQ7CisKK3N0YXRpYyBpbnQgaW1wb3J0X2ZkOworCitpbnQgaW9jdGwoaW50IGZkLCB1bnNpZ25lZCBsb25nIHJlcXVlc3QsIC4uLikKK3sKKwl2YV9saXN0IHZhOworCWludCByZXQ7CisJdm9pZCAqYXJnOworCisJdmFfc3RhcnQodmEsIHJlcXVlc3QpOworCWFyZyA9IHZhX2FyZyh2YSwgdm9pZCAqKTsKKwlyZXQgPSBvbGRfaW9jdGwoZmQsIHJlcXVlc3QsIGFyZyk7CisJdmFfZW5kKHZhKTsKKworCWlmIChyZXQgPCAwICYmIHJlcXVlc3QgPT0gRFJNX0lPQ1RMX0dFTV9DTE9TRSAmJiBlcnJubyA9PSBFSU5WQUwpCisJCWZhaWxlZCA9IDE7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCAqCitvcGVuY2xvc2Uodm9pZCAqZGV2KQoreworCXN0cnVjdCBub3V2ZWF1X2RldmljZSAqbnZkZXYgPSBkZXY7CisJc3RydWN0IG5vdXZlYXVfYm8gKmJvID0gTlVMTDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDAwMDA7ICsraSkgeworCQlpZiAoIW5vdXZlYXVfYm9fcHJpbWVfaGFuZGxlX3JlZihudmRldiwgaW1wb3J0X2ZkLCAmYm8pKQorCQkJbm91dmVhdV9ib19yZWYoTlVMTCwgJmJvKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJZHJtVmVyc2lvblB0ciB2ZXJzaW9uOworCWNvbnN0IGNoYXIgKmRldmljZSA9IE5VTEw7CisJaW50IGVyciwgZmQsIGZkMjsKKwlzdHJ1Y3Qgbm91dmVhdV9kZXZpY2UgKm52ZGV2LCAqbnZkZXYyOworCXN0cnVjdCBub3V2ZWF1X2JvICpibzsKKwlwdGhyZWFkX3QgdDEsIHQyOworCisJb2xkX2lvY3RsID0gZGxzeW0oUlRMRF9ORVhULCAiaW9jdGwiKTsKKworCWlmIChhcmdjIDwgMikgeworCQlmZCA9IGRybU9wZW5XaXRoVHlwZSgibm91dmVhdSIsIE5VTEwsIERSTV9OT0RFX1JFTkRFUik7CisJCWlmIChmZCA+PSAwKQorCQkJZmQyID0gZHJtT3BlbldpdGhUeXBlKCJub3V2ZWF1IiwgTlVMTCwgRFJNX05PREVfUkVOREVSKTsKKwl9IGVsc2UgeworCQlkZXZpY2UgPSBhcmd2WzFdOworCisJCWZkID0gb3BlbihkZXZpY2UsIE9fUkRXUik7CisJCWlmIChmZCA+PSAwKQorCQkJZmQyID0gb3BlbihkZXZpY2UsIE9fUkRXUik7CisJCWVsc2UKKwkJCWZkMiA9IGZkID0gLWVycm5vOworCX0KKworCWlmIChmZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJPcGVuaW5nIG5vdXZlYXUgcmVuZGVyIG5vZGUgZmFpbGVkIHdpdGggJWlcbiIsIGZkKTsKKwkJcmV0dXJuIGRldmljZSA/IC1mZCA6IDc3OworCX0KKworCWlmIChmZDIgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiT3BlbmluZyBzZWNvbmQgbm91dmVhdSByZW5kZXIgbm9kZSBmYWlsZWQgd2l0aCAlaVxuIiwgLWVycm5vKTsKKwkJcmV0dXJuIGVycm5vOworCX0KKworCXZlcnNpb24gPSBkcm1HZXRWZXJzaW9uKGZkKTsKKwlpZiAodmVyc2lvbikgeworCQlwcmludGYoIlZlcnNpb246ICVkLiVkLiVkXG4iLCB2ZXJzaW9uLT52ZXJzaW9uX21ham9yLAorCQkgICAgICAgdmVyc2lvbi0+dmVyc2lvbl9taW5vciwgdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsKTsKKwkJcHJpbnRmKCIgIE5hbWU6ICVzXG4iLCB2ZXJzaW9uLT5uYW1lKTsKKwkJcHJpbnRmKCIgIERhdGU6ICVzXG4iLCB2ZXJzaW9uLT5kYXRlKTsKKwkJcHJpbnRmKCIgIERlc2NyaXB0aW9uOiAlc1xuIiwgdmVyc2lvbi0+ZGVzYyk7CisKKwkJZHJtRnJlZVZlcnNpb24odmVyc2lvbik7CisJfQorCisJZXJyID0gbm91dmVhdV9kZXZpY2Vfd3JhcChmZCwgMCwgJm52ZGV2KTsKKwlpZiAoIWVycikKKwkJZXJyID0gbm91dmVhdV9kZXZpY2Vfd3JhcChmZDIsIDAsICZudmRldjIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gMTsKKworCWVyciA9IG5vdXZlYXVfYm9fbmV3KG52ZGV2MiwgTk9VVkVBVV9CT19HQVJULCAwLCA0MDk2LCBOVUxMLCAmYm8pOworCWlmICghZXJyKQorCQllcnIgPSBub3V2ZWF1X2JvX3NldF9wcmltZShibywgJmltcG9ydF9mZCk7CisKKwlpZiAoIWVycikgeworCQlwdGhyZWFkX2NyZWF0ZSgmdDEsIE5VTEwsIG9wZW5jbG9zZSwgbnZkZXYpOworCQlwdGhyZWFkX2NyZWF0ZSgmdDIsIE5VTEwsIG9wZW5jbG9zZSwgbnZkZXYpOworCX0KKworCXB0aHJlYWRfam9pbih0MSwgTlVMTCk7CisJcHRocmVhZF9qb2luKHQyLCBOVUxMKTsKKworCWNsb3NlKGltcG9ydF9mZCk7CisJbm91dmVhdV9ib19yZWYoTlVMTCwgJmJvKTsKKworCW5vdXZlYXVfZGV2aWNlX2RlbCgmbnZkZXYyKTsKKwlub3V2ZWF1X2RldmljZV9kZWwoJm52ZGV2KTsKKwlpZiAoZGV2aWNlKSB7CisJCWNsb3NlKGZkMik7CisJCWNsb3NlKGZkKTsKKwl9IGVsc2UgeworCQlkcm1DbG9zZShmZDIpOworCQlkcm1DbG9zZShmZCk7CisJfQorCisJaWYgKGZhaWxlZCkKKwkJZnByaW50ZihzdGRlcnIsICJEUk1fSU9DVExfR0VNX0NMT1NFIGZhaWxlZCB3aXRoIEVJTlZBTCxcbiIKKwkJCQkicmFjZSBpbiBvcGVuaW5nL2Nsb3NpbmcgYm8gaXMgbGlrZWx5LlxuIik7CisKKwlyZXR1cm4gZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcHJvcHRlc3QvQW5kcm9pZC5tayBiL3Rlc3RzL3Byb3B0ZXN0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFhNTkwZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Byb3B0ZXN0L0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9NYWtlZmlsZS5zb3VyY2VzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKFBST1BURVNUX0ZJTEVTKQorCitMT0NBTF9NT0RVTEUgOj0gcHJvcHRlc3QKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJkcm0KK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZHJtX3V0aWwKKworaW5jbHVkZSAkKExJQkRSTV9DT01NT05fTUspCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Byb3B0ZXN0L01ha2VmaWxlLmFtIGIvdGVzdHMvcHJvcHRlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkZTQ2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Byb3B0ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjEgQEAKK2luY2x1ZGUgTWFrZWZpbGUuc291cmNlcworCitBTV9DRkxBR1MgPSBcCisJJChXQVJOX0NGTEFHUylcCisJLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUvZHJtIFwKKwktSSQodG9wX3NyY2RpcikvdGVzdHMgXAorCS1JJCh0b3Bfc3JjZGlyKQorCitpZiBIQVZFX0lOU1RBTExfVEVTVFMKK2Jpbl9QUk9HUkFNUyA9IFwKKwlwcm9wdGVzdAorZWxzZQorbm9pbnN0X1BST0dSQU1TID0gXAorCXByb3B0ZXN0CitlbmRpZgorCitwcm9wdGVzdF9TT1VSQ0VTID0gJChQUk9QVEVTVF9GSUxFUykKKworcHJvcHRlc3RfTERBREQgPSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYmRybS5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL3Rlc3RzL3V0aWwvbGlidXRpbC5sYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcHJvcHRlc3QvTWFrZWZpbGUuc291cmNlcyBiL3Rlc3RzL3Byb3B0ZXN0L01ha2VmaWxlLnNvdXJjZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ2MTEwZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Byb3B0ZXN0L01ha2VmaWxlLnNvdXJjZXMKQEAgLTAsMCArMSwyIEBACitQUk9QVEVTVF9GSUxFUyA6PSBcCisJcHJvcHRlc3QuYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcHJvcHRlc3QvcHJvcHRlc3QuYyBiL3Rlc3RzL3Byb3B0ZXN0L3Byb3B0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFiYmYwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Byb3B0ZXN0L3Byb3B0ZXN0LmMKQEAgLTAsMCArMSwzMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgUGF1bG8gWmFub25pIDxwYXVsby5yLnphbm9uaUBpbnRlbC5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInhmODZkcm0uaCIKKyNpbmNsdWRlICJ4Zjg2ZHJtTW9kZS5oIgorCisjaW5jbHVkZSAidXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJ1dGlsL2ttcy5oIgorCitzdGF0aWMgaW5saW5lIGludDY0X3QgVTY0Mkk2NCh1aW50NjRfdCB2YWwpCit7CisJcmV0dXJuIChpbnQ2NF90KSooKGludDY0X3QgKikmdmFsKTsKK30KKworaW50IGZkOworZHJtTW9kZVJlc1B0ciByZXMgPSBOVUxMOworCisvKiBkdW1wX2Jsb2IgYW5kIGR1bXBfcHJvcCBzaGFtZWxlc3NseSBjb3BpZWQgZnJvbSAuLi9tb2RldGVzdC9tb2RldGVzdC5jICovCitzdGF0aWMgdm9pZAorZHVtcF9ibG9iKHVpbnQzMl90IGJsb2JfaWQpCit7CisJdWludDMyX3QgaTsKKwl1bnNpZ25lZCBjaGFyICpibG9iX2RhdGE7CisJZHJtTW9kZVByb3BlcnR5QmxvYlB0ciBibG9iOworCisJYmxvYiA9IGRybU1vZGVHZXRQcm9wZXJ0eUJsb2IoZmQsIGJsb2JfaWQpOworCWlmICghYmxvYikgeworCQlwcmludGYoIlxuIik7CisJCXJldHVybjsKKwl9CisKKwlibG9iX2RhdGEgPSBibG9iLT5kYXRhOworCisJZm9yIChpID0gMDsgaSA8IGJsb2ItPmxlbmd0aDsgaSsrKSB7CisJCWlmIChpICUgMTYgPT0gMCkKKwkJCXByaW50ZigiXG5cdFx0XHQiKTsKKwkJcHJpbnRmKCIlLjJoaHgiLCBibG9iX2RhdGFbaV0pOworCX0KKwlwcmludGYoIlxuIik7CisKKwlkcm1Nb2RlRnJlZVByb3BlcnR5QmxvYihibG9iKTsKK30KKworc3RhdGljIHZvaWQKK2R1bXBfcHJvcCh1aW50MzJfdCBwcm9wX2lkLCB1aW50NjRfdCB2YWx1ZSkKK3sKKwlpbnQgaTsKKwlkcm1Nb2RlUHJvcGVydHlQdHIgcHJvcDsKKworCXByb3AgPSBkcm1Nb2RlR2V0UHJvcGVydHkoZmQsIHByb3BfaWQpOworCisJcHJpbnRmKCJcdCVkIiwgcHJvcF9pZCk7CisJaWYgKCFwcm9wKSB7CisJCXByaW50ZigiXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ZigiICVzOlxuIiwgcHJvcC0+bmFtZSk7CisKKwlwcmludGYoIlx0XHRmbGFnczoiKTsKKwlpZiAocHJvcC0+ZmxhZ3MgJiBEUk1fTU9ERV9QUk9QX1BFTkRJTkcpCisJCXByaW50ZigiIHBlbmRpbmciKTsKKwlpZiAocHJvcC0+ZmxhZ3MgJiBEUk1fTU9ERV9QUk9QX0lNTVVUQUJMRSkKKwkJcHJpbnRmKCIgaW1tdXRhYmxlIik7CisJaWYgKGRybV9wcm9wZXJ0eV90eXBlX2lzKHByb3AsIERSTV9NT0RFX1BST1BfU0lHTkVEX1JBTkdFKSkKKwkJcHJpbnRmKCIgc2lnbmVkIHJhbmdlIik7CisJaWYgKGRybV9wcm9wZXJ0eV90eXBlX2lzKHByb3AsIERSTV9NT0RFX1BST1BfUkFOR0UpKQorCQlwcmludGYoIiByYW5nZSIpOworCWlmIChkcm1fcHJvcGVydHlfdHlwZV9pcyhwcm9wLCBEUk1fTU9ERV9QUk9QX0VOVU0pKQorCQlwcmludGYoIiBlbnVtIik7CisJaWYgKGRybV9wcm9wZXJ0eV90eXBlX2lzKHByb3AsIERSTV9NT0RFX1BST1BfQklUTUFTSykpCisJCXByaW50ZigiIGJpdG1hc2siKTsKKwlpZiAoZHJtX3Byb3BlcnR5X3R5cGVfaXMocHJvcCwgRFJNX01PREVfUFJPUF9CTE9CKSkKKwkJcHJpbnRmKCIgYmxvYiIpOworCWlmIChkcm1fcHJvcGVydHlfdHlwZV9pcyhwcm9wLCBEUk1fTU9ERV9QUk9QX09CSkVDVCkpCisJCXByaW50ZigiIG9iamVjdCIpOworCXByaW50ZigiXG4iKTsKKworCisJaWYgKGRybV9wcm9wZXJ0eV90eXBlX2lzKHByb3AsIERSTV9NT0RFX1BST1BfU0lHTkVEX1JBTkdFKSkgeworCQlwcmludGYoIlx0XHR2YWx1ZXM6Iik7CisJCWZvciAoaSA9IDA7IGkgPCBwcm9wLT5jb3VudF92YWx1ZXM7IGkrKykKKwkJCXByaW50ZigiICUiUFJJZDY0LCBVNjQySTY0KHByb3AtPnZhbHVlc1tpXSkpOworCQlwcmludGYoIlxuIik7CisJfQorCisJaWYgKGRybV9wcm9wZXJ0eV90eXBlX2lzKHByb3AsIERSTV9NT0RFX1BST1BfUkFOR0UpKSB7CisJCXByaW50ZigiXHRcdHZhbHVlczoiKTsKKwkJZm9yIChpID0gMDsgaSA8IHByb3AtPmNvdW50X3ZhbHVlczsgaSsrKQorCQkJcHJpbnRmKCIgJSJQUkl1NjQsIHByb3AtPnZhbHVlc1tpXSk7CisJCXByaW50ZigiXG4iKTsKKwl9CisKKwlpZiAoZHJtX3Byb3BlcnR5X3R5cGVfaXMocHJvcCwgRFJNX01PREVfUFJPUF9FTlVNKSkgeworCQlwcmludGYoIlx0XHRlbnVtczoiKTsKKwkJZm9yIChpID0gMDsgaSA8IHByb3AtPmNvdW50X2VudW1zOyBpKyspCisJCQlwcmludGYoIiAlcz0lbGx1IiwgcHJvcC0+ZW51bXNbaV0ubmFtZSwKKwkJCSAgICAgICBwcm9wLT5lbnVtc1tpXS52YWx1ZSk7CisJCXByaW50ZigiXG4iKTsKKwl9IGVsc2UgaWYgKGRybV9wcm9wZXJ0eV90eXBlX2lzKHByb3AsIERSTV9NT0RFX1BST1BfQklUTUFTSykpIHsKKwkJcHJpbnRmKCJcdFx0dmFsdWVzOiIpOworCQlmb3IgKGkgPSAwOyBpIDwgcHJvcC0+Y291bnRfZW51bXM7IGkrKykKKwkJCXByaW50ZigiICVzPTB4JWxseCIsIHByb3AtPmVudW1zW2ldLm5hbWUsCisJCQkgICAgICAgKDFMTCA8PCBwcm9wLT5lbnVtc1tpXS52YWx1ZSkpOworCQlwcmludGYoIlxuIik7CisJfSBlbHNlIHsKKwkJYXNzZXJ0KHByb3AtPmNvdW50X2VudW1zID09IDApOworCX0KKworCWlmIChkcm1fcHJvcGVydHlfdHlwZV9pcyhwcm9wLCBEUk1fTU9ERV9QUk9QX0JMT0IpKSB7CisJCXByaW50ZigiXHRcdGJsb2JzOlxuIik7CisJCWZvciAoaSA9IDA7IGkgPCBwcm9wLT5jb3VudF9ibG9iczsgaSsrKQorCQkJZHVtcF9ibG9iKHByb3AtPmJsb2JfaWRzW2ldKTsKKwkJcHJpbnRmKCJcbiIpOworCX0gZWxzZSB7CisJCWFzc2VydChwcm9wLT5jb3VudF9ibG9icyA9PSAwKTsKKwl9CisKKwlwcmludGYoIlx0XHR2YWx1ZToiKTsKKwlpZiAoZHJtX3Byb3BlcnR5X3R5cGVfaXMocHJvcCwgRFJNX01PREVfUFJPUF9CTE9CKSkKKwkJZHVtcF9ibG9iKHZhbHVlKTsKKwllbHNlIGlmIChkcm1fcHJvcGVydHlfdHlwZV9pcyhwcm9wLCBEUk1fTU9ERV9QUk9QX1NJR05FRF9SQU5HRSkpCisJCXByaW50ZigiICUiUFJJZDY0IlxuIiwgdmFsdWUpOworCWVsc2UKKwkJcHJpbnRmKCIgJSJQUkl1NjQiXG4iLCB2YWx1ZSk7CisKKwlkcm1Nb2RlRnJlZVByb3BlcnR5KHByb3ApOworfQorCitzdGF0aWMgdm9pZCBsaXN0T2JqZWN0UHJvcGVydGllcyh1aW50MzJfdCBpZCwgdWludDMyX3QgdHlwZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlkcm1Nb2RlT2JqZWN0UHJvcGVydGllc1B0ciBwcm9wczsKKworCXByb3BzID0gZHJtTW9kZU9iamVjdEdldFByb3BlcnRpZXMoZmQsIGlkLCB0eXBlKTsKKworCWlmICghcHJvcHMpIHsKKwkJcHJpbnRmKCJcdE5vIHByb3BlcnRpZXM6ICVzLlxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwcm9wcy0+Y291bnRfcHJvcHM7IGkrKykKKwkJZHVtcF9wcm9wKHByb3BzLT5wcm9wc1tpXSwgcHJvcHMtPnByb3BfdmFsdWVzW2ldKTsKKworCWRybU1vZGVGcmVlT2JqZWN0UHJvcGVydGllcyhwcm9wcyk7Cit9CisKK3N0YXRpYyB2b2lkIGxpc3RDb25uZWN0b3JQcm9wZXJ0aWVzKHZvaWQpCit7CisJaW50IGk7CisJZHJtTW9kZUNvbm5lY3RvclB0ciBjOworCisJZm9yIChpID0gMDsgaSA8IHJlcy0+Y291bnRfY29ubmVjdG9yczsgaSsrKSB7CisJCWMgPSBkcm1Nb2RlR2V0Q29ubmVjdG9yKGZkLCByZXMtPmNvbm5lY3RvcnNbaV0pOworCisJCWlmICghYykgeworCQkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZ2V0IGNvbm5lY3RvciAldTogJXNcbiIsCisJCQkJcmVzLT5jb25uZWN0b3JzW2ldLCBzdHJlcnJvcihlcnJubykpOworCQkJY29udGludWU7CisJCX0KKworCQlwcmludGYoIkNvbm5lY3RvciAldSAoJXMtJXUpXG4iLCBjLT5jb25uZWN0b3JfaWQsCisJCSAgICAgICB1dGlsX2xvb2t1cF9jb25uZWN0b3JfdHlwZV9uYW1lKGMtPmNvbm5lY3Rvcl90eXBlKSwKKwkJICAgICAgIGMtPmNvbm5lY3Rvcl90eXBlX2lkKTsKKworCQlsaXN0T2JqZWN0UHJvcGVydGllcyhjLT5jb25uZWN0b3JfaWQsCisJCQkJICAgICBEUk1fTU9ERV9PQkpFQ1RfQ09OTkVDVE9SKTsKKworCQlkcm1Nb2RlRnJlZUNvbm5lY3RvcihjKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxpc3RDcnRjUHJvcGVydGllcyh2b2lkKQoreworCWludCBpOworCWRybU1vZGVDcnRjUHRyIGM7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVzLT5jb3VudF9jcnRjczsgaSsrKSB7CisJCWMgPSBkcm1Nb2RlR2V0Q3J0YyhmZCwgcmVzLT5jcnRjc1tpXSk7CisKKwkJaWYgKCFjKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBnZXQgY3J0YyAldTogJXNcbiIsCisJCQkJcmVzLT5jcnRjc1tpXSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcHJpbnRmKCJDUlRDICV1XG4iLCBjLT5jcnRjX2lkKTsKKworCQlsaXN0T2JqZWN0UHJvcGVydGllcyhjLT5jcnRjX2lkLCBEUk1fTU9ERV9PQkpFQ1RfQ1JUQyk7CisKKwkJZHJtTW9kZUZyZWVDcnRjKGMpOworCX0KK30KKworc3RhdGljIHZvaWQgbGlzdEFsbFByb3BlcnRpZXModm9pZCkKK3sKKwlsaXN0Q29ubmVjdG9yUHJvcGVydGllcygpOworCWxpc3RDcnRjUHJvcGVydGllcygpOworfQorCitzdGF0aWMgaW50IHNldFByb3BlcnR5KGNoYXIgKmFyZ3ZbXSkKK3sKKwl1aW50MzJfdCBvYmpfaWQsIG9ial90eXBlLCBwcm9wX2lkOworCXVpbnQ2NF90IHZhbHVlOworCisJb2JqX2lkID0gYXRvaShhcmd2WzBdKTsKKworCWlmICghc3RyY21wKGFyZ3ZbMV0sICJjb25uZWN0b3IiKSkgeworCQlvYmpfdHlwZSA9IERSTV9NT0RFX09CSkVDVF9DT05ORUNUT1I7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICJjcnRjIikpIHsKKwkJb2JqX3R5cGUgPSBEUk1fTU9ERV9PQkpFQ1RfQ1JUQzsKKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgb2JqZWN0IHR5cGUuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcHJvcF9pZCA9IGF0b2koYXJndlsyXSk7CisJdmFsdWUgPSBhdG9sbChhcmd2WzNdKTsKKworCXJldHVybiBkcm1Nb2RlT2JqZWN0U2V0UHJvcGVydHkoZmQsIG9ial9pZCwgb2JqX3R5cGUsIHByb3BfaWQsIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciAqcHJvZ3JhbSkKK3sKKwlwcmludGYoIlVzYWdlOlxuIgorIiAgJXMgW29wdGlvbnNdXG4iCisiICAlcyBbb3B0aW9uc10gW29iaiBpZF0gW29iaiB0eXBlXSBbcHJvcCBpZF0gW3ZhbHVlXVxuIgorIlxuIgorIm9wdGlvbnM6XG4iCisiICAtRCBERVZJQ0UgIHVzZSB0aGUgZ2l2ZW4gZGV2aWNlXG4iCisiICAtTSBNT0RVTEUgIHVzZSB0aGUgZ2l2ZW4gZHJpdmVyXG4iCisiXG4iCisiVGhlIGZpcnN0IGZvcm0ganVzdCBwcmludHMgYWxsIHRoZSBleGlzdGluZyBwcm9wZXJ0aWVzLiBUaGUgc2Vjb25kIG9uZSBpc1xuIgorInVzZWQgdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwcm9wZXJ0eS4gVGhlIG9iamVjdCB0eXBlIGNhbiBiZSBvbmUgb2ZcbiIKKyJ0aGUgZm9sbG93aW5nIHN0cmluZ3M6XG4iCisiICBjb25uZWN0b3IgY3J0Y1xuIgorIlxuIgorIkV4YW1wbGU6XG4iCisiICBwcm9wdGVzdCA3IGNvbm5lY3RvciAyIDFcbiIKKyJ3aWxsIHNldCBwcm9wZXJ0eSAyIG9mIGNvbm5lY3RvciA3IHRvIDFcbiIsIHByb2dyYW0sIHByb2dyYW0pOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG9wdHN0cltdID0gIkQ6TToiOworCWludCBjLCBhcmdzLCByZXQgPSAwOworCWNoYXIgKmRldmljZSA9IE5VTEw7CisJY2hhciAqbW9kdWxlID0gTlVMTDsKKworCXdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCBvcHRzdHIpKSAhPSAtMSkgeworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnRCc6CisJCQlkZXZpY2UgPSBvcHRhcmc7CisJCQlicmVhazsKKworCQljYXNlICdNJzoKKwkJCW1vZHVsZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQl1c2FnZShhcmd2WzBdKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJYXJncyA9IGFyZ2MgLSBvcHRpbmQ7CisKKwlmZCA9IHV0aWxfb3BlbihkZXZpY2UsIG1vZHVsZSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIDE7CisKKwlyZXMgPSBkcm1Nb2RlR2V0UmVzb3VyY2VzKGZkKTsKKwlpZiAoIXJlcykgeworCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBnZXQgcmVzb3VyY2VzOiAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldCA9IDE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoYXJncyA8IDEpIHsKKwkJbGlzdEFsbFByb3BlcnRpZXMoKTsKKwl9IGVsc2UgaWYgKGFyZ3MgPT0gNCkgeworCQlyZXQgPSBzZXRQcm9wZXJ0eSgmYXJndltvcHRpbmRdKTsKKwl9IGVsc2UgeworCQl1c2FnZShhcmd2WzBdKTsKKwkJcmV0ID0gMTsKKwl9CisKKwlkcm1Nb2RlRnJlZVJlc291cmNlcyhyZXMpOworZG9uZToKKwlkcm1DbG9zZShmZCk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3JhZGVvbi9NYWtlZmlsZS5hbSBiL3Rlc3RzL3JhZGVvbi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGE3NjI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmFkZW9uL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTQgQEAKK0FNX0NGTEFHUyA9IFwKKwkkKFdBUk5fQ0ZMQUdTKVwKKwktSSAkKHRvcF9zcmNkaXIpL2luY2x1ZGUvZHJtIFwKKwktSSAkKHRvcF9zcmNkaXIpCisKK0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYmRybS5sYQorCitub2luc3RfUFJPR1JBTVMgPSBcCisJcmFkZW9uX3R0bQorCityYWRlb25fdHRtX1NPVVJDRVMgPSBcCisJcmJvLmMgXAorCXJiby5oIFwKKwlyYWRlb25fdHRtLmMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JhZGVvbi9yYWRlb25fdHRtLmMgYi90ZXN0cy9yYWRlb24vcmFkZW9uX3R0bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNDZlODUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yYWRlb24vcmFkZW9uX3R0bS5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBSZWQgSGF0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBKZXJvbWUgR2xpc3NlIDxqLmdsaXNzZUBnbWFpbC5jb20+CisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgInJiby5oIgorI2luY2x1ZGUgInhmODZkcm0uaCIKKworLyogYWxsb2NhdGUgYXMgbWFueSBzaW5nbGUgcGFnZSBibyB0byB0cnkgdG8gc3RhcnZlIHRoZSBrZXJuZWwKKyAqIG1lbW9yeSB6b25lIChiZWxvdyBoaWdobWVtKQorICovCitzdGF0aWMgdm9pZCB0dG1fc3RhcnZlX2tlcm5lbF9wcml2YXRlX21lbW9yeShpbnQgZmQpCit7CisgICAgc3RydWN0IGxpc3RfaGVhZCBsaXN0OworICAgIHN0cnVjdCByYm8gKmJvLCAqdG1wOworICAgIHVuc2lnbmVkIG5ibyA9IDA7CisKKyAgICBwcmludGYoIlxuWyVzXVxuIiwgX19mdW5jX18pOworICAgIGxpc3RfaW5pdGhlYWQoJmxpc3QpOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGJvID0gcmJvKGZkLCAwLCA0MDk2LCAwLCBOVUxMKTsKKyAgICAgICAgaWYgKGJvID09IE5VTEwpIHsKKyAgICAgICAgICAgIHByaW50ZigiZmFpbGluZyBhZnRlciAlZCBib1xuIiwgbmJvKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG5ibysrOworICAgICAgICBsaXN0X2FkZCgmYm8tPmxpc3QsICZsaXN0KTsKKyAgICB9CisgICAgTElTVF9GT1JfRUFDSF9FTlRSWV9TQUZFKGJvLCB0bXAsICZsaXN0LCBsaXN0KSB7CisgICAgICAgIGxpc3RfZGVsKCZiby0+bGlzdCk7CisgICAgICAgIHJib19kZWNyZWYoYm8pOworICAgIH0KK30KKworc3RhdGljIGludCByYWRlb25fb3Blbl9mZCh2b2lkKQoreworICAgIHJldHVybiBkcm1PcGVuKCJyYWRlb24iLCBOVUxMKTsKK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgcmFkZW9uZmQ7CisKKyAgICByYWRlb25mZCA9IHJhZGVvbl9vcGVuX2ZkKCk7CisgICAgaWYgKHJhZGVvbmZkIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBvcGVuIHJhZGVvbiBmZFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB0dG1fc3RhcnZlX2tlcm5lbF9wcml2YXRlX21lbW9yeShyYWRlb25mZCk7CisKKyAgICBjbG9zZShyYWRlb25mZCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9yYWRlb24vcmJvLmMgYi90ZXN0cy9yYWRlb24vcmJvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBhMjg4YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JhZGVvbi9yYm8uYwpAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDExIFJlZCBIYXQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEplcm9tZSBHbGlzc2UgPGouZ2xpc3NlQGdtYWlsLmNvbT4KKyAqLworI2RlZmluZSBfRklMRV9PRkZTRVRfQklUUyA2NAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgInhmODZkcm0uaCIKKyNpbmNsdWRlICJyYWRlb25fZHJtLmgiCisjaW5jbHVkZSAicmJvLmgiCisKK3N0cnVjdCByYm8gKnJibyhpbnQgZmQsIHVuc2lnbmVkIGhhbmRsZSwgdW5zaWduZWQgc2l6ZSwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBhbGlnbm1lbnQsIHZvaWQgKnB0cikKK3sKKyAgICBzdHJ1Y3QgcmJvICpibzsKKyAgICBpbnQgcjsKKworICAgIGJvID0gY2FsbG9jKDEsIHNpemVvZigqYm8pKTsKKyAgICBpZiAoYm8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbGlzdF9pbml0aGVhZCgmYm8tPmxpc3QpOworICAgIGJvLT5mZCA9IGZkOworICAgIGJvLT5zaXplID0gc2l6ZTsKKyAgICBiby0+aGFuZGxlID0gaGFuZGxlOworICAgIGJvLT5yZWZjb3VudCA9IDE7CisgICAgYm8tPmFsaWdubWVudCA9IGFsaWdubWVudDsKKworICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgc3RydWN0IGRybV9nZW1fb3BlbiBvcGVuX2FyZzsKKworICAgICAgICBtZW1zZXQoJm9wZW5fYXJnLCAwLCBzaXplb2Yob3Blbl9hcmcpKTsKKyAgICAgICAgb3Blbl9hcmcubmFtZSA9IGhhbmRsZTsKKyAgICAgICAgciA9IGRybUlvY3RsKGZkLCBEUk1fSU9DVExfR0VNX09QRU4sICZvcGVuX2FyZyk7CisgICAgICAgIGlmIChyICE9IDApIHsKKyAgICAgICAgICAgIGZyZWUoYm8pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYm8tPmhhbmRsZSA9IG9wZW5fYXJnLmhhbmRsZTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fY3JlYXRlIGFyZ3M7CisKKyAgICAgICAgYXJncy5zaXplID0gc2l6ZTsKKyAgICAgICAgYXJncy5hbGlnbm1lbnQgPSBhbGlnbm1lbnQ7CisgICAgICAgIGFyZ3MuaW5pdGlhbF9kb21haW4gPSBSQURFT05fR0VNX0RPTUFJTl9DUFU7CisgICAgICAgIGFyZ3MuZmxhZ3MgPSAwOworICAgICAgICBhcmdzLmhhbmRsZSA9IDA7CisgICAgICAgIHIgPSBkcm1Db21tYW5kV3JpdGVSZWFkKGZkLCBEUk1fUkFERU9OX0dFTV9DUkVBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmdzLCBzaXplb2YoYXJncykpOworICAgICAgICBiby0+aGFuZGxlID0gYXJncy5oYW5kbGU7CisgICAgICAgIGlmIChyKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBhbGxvY2F0ZSA6XG4iKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgc2l6ZSAgICAgIDogJWQgYnl0ZXNcbiIsIHNpemUpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICBhbGlnbm1lbnQgOiAlZCBieXRlc1xuIiwgYWxpZ25tZW50KTsKKyAgICAgICAgICAgIGZyZWUoYm8pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHB0cikgeworICAgICAgICBpZiAocmJvX21hcChibykpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgZmFpbGVkIHRvIGNvcHkgZGF0YSBpbnRvIGJvXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gcmJvX2RlY3JlZihibyk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGJvLT5kYXRhLCBwdHIsIHNpemUpOworICAgICAgICByYm9fdW5tYXAoYm8pOworICAgIH0KKyAgICByZXR1cm4gYm87Cit9CisKK2ludCByYm9fbWFwKHN0cnVjdCByYm8gKmJvKQoreworICAgIHN0cnVjdCBkcm1fcmFkZW9uX2dlbV9tbWFwIGFyZ3M7CisgICAgdm9pZCAqcHRyOworICAgIGludCByOworCisgICAgaWYgKGJvLT5tYXBjb3VudCsrICE9IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8qIFplcm8gb3V0IGFyZ3MgdG8gbWFrZSB2YWxncmluZCBoYXBweSAqLworICAgIG1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKyAgICBhcmdzLmhhbmRsZSA9IGJvLT5oYW5kbGU7CisgICAgYXJncy5vZmZzZXQgPSAwOworICAgIGFyZ3Muc2l6ZSA9ICh1aW50NjRfdCliby0+c2l6ZTsKKyAgICByID0gZHJtQ29tbWFuZFdyaXRlUmVhZChiby0+ZmQsIERSTV9SQURFT05fR0VNX01NQVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyZ3MsIHNpemVvZihhcmdzKSk7CisgICAgaWYgKHIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvciBtYXBwaW5nICVwIDB4JTA4WCAoZXJyb3IgPSAlZClcbiIsCisgICAgICAgICAgICBibywgYm8tPmhhbmRsZSwgcik7CisgICAgICAgIHJldHVybiByOworICAgIH0KKyAgICBwdHIgPSBtbWFwKDAsIGFyZ3Muc2l6ZSwgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGJvLT5mZCwgYXJncy5hZGRyX3B0cik7CisgICAgaWYgKHB0ciA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgZmFpbGVkIHRvIG1hcCBib1xuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLWVycm5vOworICAgIH0KKyAgICBiby0+ZGF0YSA9IHB0cjsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCByYm9fdW5tYXAoc3RydWN0IHJibyAqYm8pCit7CisgICAgaWYgKC0tYm8tPm1hcGNvdW50ID4gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG11bm1hcChiby0+ZGF0YSwgYm8tPnNpemUpOworICAgIGJvLT5kYXRhID0gTlVMTDsKK30KKworc3RydWN0IHJibyAqcmJvX2luY3JlZihzdHJ1Y3QgcmJvICpibykKK3sKKyAgICBiby0+cmVmY291bnQrKzsKKyAgICByZXR1cm4gYm87Cit9CisKK3N0cnVjdCByYm8gKnJib19kZWNyZWYoc3RydWN0IHJibyAqYm8pCit7CisgICAgc3RydWN0IGRybV9nZW1fY2xvc2UgYXJnczsKKworICAgIGlmIChibyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoLS1iby0+cmVmY291bnQgPiAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG11bm1hcChiby0+ZGF0YSwgYm8tPnNpemUpOworICAgIG1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKyAgICBhcmdzLmhhbmRsZSA9IGJvLT5oYW5kbGU7CisgICAgZHJtSW9jdGwoYm8tPmZkLCBEUk1fSU9DVExfR0VNX0NMT1NFLCAmYXJncyk7CisgICAgbWVtc2V0KGJvLCAwLCBzaXplb2Yoc3RydWN0IHJibykpOworICAgIGZyZWUoYm8pOworICAgIHJldHVybiBOVUxMOworfQorCitpbnQgcmJvX3dhaXQoc3RydWN0IHJibyAqYm8pCit7CisgICAgc3RydWN0IGRybV9yYWRlb25fZ2VtX3dhaXRfaWRsZSBhcmdzOworICAgIGludCByZXQ7CisKKyAgICAvKiBaZXJvIG91dCBhcmdzIHRvIG1ha2UgdmFsZ3JpbmQgaGFwcHkgKi8KKyAgICBtZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisgICAgYXJncy5oYW5kbGUgPSBiby0+aGFuZGxlOworICAgIGRvIHsKKyAgICAgICAgcmV0ID0gZHJtQ29tbWFuZFdyaXRlUmVhZChiby0+ZmQsIERSTV9SQURFT05fR0VNX1dBSVRfSURMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJncywgc2l6ZW9mKGFyZ3MpKTsKKyAgICB9IHdoaWxlIChyZXQgPT0gLUVCVVNZKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmFkZW9uL3Jiby5oIGIvdGVzdHMvcmFkZW9uL3Jiby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNjQwOTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yYWRlb24vcmJvLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDExIFJlZCBIYXQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEplcm9tZSBHbGlzc2UgPGouZ2xpc3NlQGdtYWlsLmNvbT4KKyAqLworI2lmbmRlZiBSQk9fSAorI2RlZmluZSBSQk9fSAorCisjaW5jbHVkZSAidXRpbF9kb3VibGVfbGlzdC5oIgorCitzdHJ1Y3QgcmJvIHsKKyAgICBzdHJ1Y3QgbGlzdF9oZWFkICAgIGxpc3Q7CisgICAgaW50ICAgICAgICAgICAgICAgICBmZDsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgIHJlZmNvdW50OworICAgIHVuc2lnbmVkICAgICAgICAgICAgbWFwY291bnQ7CisgICAgdW5zaWduZWQgICAgICAgICAgICBoYW5kbGU7CisgICAgdW5zaWduZWQgICAgICAgICAgICBzaXplOworICAgIHVuc2lnbmVkICAgICAgICAgICAgYWxpZ25tZW50OworICAgIHZvaWQgICAgICAgICAgICAgICAgKmRhdGE7Cit9OworCitzdHJ1Y3QgcmJvICpyYm8oaW50IGZkLCB1bnNpZ25lZCBoYW5kbGUsIHVuc2lnbmVkIHNpemUsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgYWxpZ25tZW50LCB2b2lkICpwdHIpOworaW50IHJib19tYXAoc3RydWN0IHJibyAqYm8pOwordm9pZCByYm9fdW5tYXAoc3RydWN0IHJibyAqYm8pOworc3RydWN0IHJibyAqcmJvX2luY3JlZihzdHJ1Y3QgcmJvICpibyk7CitzdHJ1Y3QgcmJvICpyYm9fZGVjcmVmKHN0cnVjdCByYm8gKmJvKTsKK2ludCByYm9fd2FpdChzdHJ1Y3QgcmJvICpibyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmFuZG9tLmMgYi90ZXN0cy9yYW5kb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2Q0YzgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmFuZG9tLmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qIHhmODZkcm1SYW5kb20uYyAtLSAiTWluaW1hbCBTdGFuZGFyZCIgUFJORyBJbXBsZW1lbnRhdGlvbgorICogQ3JlYXRlZDogTW9uIEFwciAxOSAwODoyODoxMyAxOTk5IGJ5IGZhaXRoQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqIAorICogQXV0aG9yczogUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKgorICogREVTQ1JJUFRJT04KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYSBzaW1wbGUsIHN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUGFyaworICogJiBNaWxsZXIgIk1pbmltYWwgU3RhbmRhcmQiIFBSTkcgW1BNODgsIFBNUzkzXSwgd2hpY2ggaXMgYSBMZWhtZXIKKyAqIG11bHRpcGxpY2F0aXZlIGxpbmVhciBjb25ncnVlbnRpYWwgZ2VuZXJhdG9yIChNTENHKSB3aXRoIGEgcGVyaW9kIG9mCisgKiAyXjMxLTEuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBpbnRlbmRlZCB0byBwcm92aWRlIGEgcmVsaWFibGUsIHBvcnRhYmxlIFBSTkcKKyAqIHRoYXQgaXMgc3VpdGFibGUgZm9yIHRlc3RpbmcgYSBoYXNoIHRhYmxlIGltcGxlbWVudGF0aW9uIGFuZCBmb3IKKyAqIGltcGxlbWVudGluZyBza2lwIGxpc3RzLgorICoKKyAqIEZVVFVSRSBFTkhBTkNFTUVOVFMKKyAqCisgKiBJZiBpbml0aWFsIHNlZWRzIGFyZSBub3Qgc2VsZWN0ZWQgcmFuZG9tbHksIHR3byBpbnN0YW5jZXMgb2YgdGhlIFBSTkcKKyAqIGNhbiBiZSBjb3JyZWxhdGVkLiAgW0tudXRoODEsIHBwLiAzMi0zM10gZGVzY3JpYmVzIGEgc2h1ZmZsaW5nIHRlY2huaXF1ZQorICogdGhhdCBjYW4gZWxpbWluYXRlIHRoaXMgcHJvYmxlbS4KKyAqCisgKiBJZiBQUk5HcyBhcmUgdXNlZCBmb3Igc2ltdWxhdGlvbiwgdGhlIHBlcmlvZCBvZiB0aGUgY3VycmVudAorICogaW1wbGVtZW50YXRpb24gbWF5IGJlIHRvbyBzaG9ydC4gIFtMRTg4XSBkaXNjdXNzZXMgbWV0aG9kcyBvZiBjb21iaW5pbmcKKyAqIE1MQ0dzIHRvIHByb2R1Y2UgbXVjaCBsb25nZXIgcGVyaW9kcywgYW5kIHN1Z2dlc3RzIHNvbWUgYWx0ZXJuYXRpdmUKKyAqIHZhbHVlcyBmb3IgQSBhbmQgTS4gIFtMRTkwIGFuZCBTY2g5Ml0gYWxzbyBwcm92aWRlIGluZm9ybWF0aW9uIG9uCisgKiBsb25nLXBlcmlvZCBQUk5Hcy4KKyAqCisgKiBSRUZFUkVOQ0VTCisgKgorICogW0tudXRoODFdIERvbmFsZCBFLiBLbnV0aC4gVGhlIEFydCBvZiBDb21wdXRlciBQcm9ncmFtbWluZy4gIFZvbHVtZSAyOgorICogU2VtaW51bWVyaWNhbCBBbGdvcml0aG1zLiAgUmVhZGluZywgTWFzc2FjaHVzZXR0czogQWRkaXNvbi1XZXNsZXksIDE5ODEuCisgKgorICogW0xFODhdIFBpZXJyZSBMJ0VjdXllci4gIkVmZmljaWVudCBhbmQgUG9ydGFibGUgQ29tYmluZWQgUmFuZG9tIE51bWJlcgorICogR2VuZXJhdG9ycyIuICBDQUNNIDMxKDYpLCBKdW5lIDE5ODgsIHBwLiA3NDItNzc0LgorICoKKyAqIFtMRTkwXSBQaWVycmUgTCdFY3V5ZXIuICJSYW5kb20gTnVtYmVycyBmb3IgU2ltdWxhdGlvbiIuIENBQ00gMzMoMTAsCisgKiBPY3RvYmVyIDE5OTAsIHBwLiA4NS05Ny4KKyAqCisgKiBbUE04OF0gU3RlcGhlbiBLLiBQYXJrIGFuZCBLZWl0aCBXLiBNaWxsZXIuICJSYW5kb20gTnVtYmVyIEdlbmVyYXRvcnM6CisgKiBHb29kIE9uZXMgYXJlIEhhcmQgdG8gRmluZCIuIENBQ00gMzEoMTApLCBPY3RvYmVyIDE5ODgsIHBwLiAxMTkyLTEyMDEuCisgKgorICogW1NjaDkyXSBCcnVjZSBTY2huZWllci4gIlBzZXVkby1SYW5zb20gU2VxdWVuY2UgR2VuZXJhdG9yIGZvciAzMi1CaXQKKyAqIENQVXMiLiAgRHIuIERvYmIncyBKb3VybmFsIDE3KDIpLCBGZWJydWFyeSAxOTkyLCBwcC4gMzQsIDM3LTM4LCA0MC4KKyAqCisgKiBbUE1TOTNdIFN0ZXBoZW4gSy4gUGFyaywgS2VpdGggVy4gTWlsbGVyLCBhbmQgUGF1bCBLLiBTdG9ja21leWVyLiAgSW4KKyAqICJUZWNobmljYWwgQ29ycmVzcG9uZGVuY2U6IFJlbWFya3Mgb24gQ2hvb3NpbmcgYW5kIEltcGxlbWVudGluZyBSYW5kb20KKyAqIE51bWJlciBHZW5lcmF0b3JzIi4gQ0FDTSAzNig3KSwgSnVseSAxOTkzLCBwcC4gMTA1LTExMC4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJ4Zjg2ZHJtLmgiCisjaW5jbHVkZSAieGY4NmRybVJhbmRvbS5oIgorCitzdGF0aWMgdm9pZCBjaGVja19wZXJpb2QodW5zaWduZWQgbG9uZyBzZWVkKQoreworICAgIHVuc2lnbmVkIGxvbmcgY291bnQgPSAwOworICAgIHVuc2lnbmVkIGxvbmcgaW5pdGlhbDsKKyAgICB2b2lkICAgICAgICAgICpzdGF0ZTsKKyAgICAKKyAgICBzdGF0ZSA9IGRybVJhbmRvbUNyZWF0ZShzZWVkKTsKKyAgICBpbml0aWFsID0gZHJtUmFuZG9tKHN0YXRlKTsKKyAgICArK2NvdW50OworICAgIHdoaWxlIChpbml0aWFsICE9IGRybVJhbmRvbShzdGF0ZSkpIHsKKwlpZiAoISsrY291bnQpIGJyZWFrOworICAgIH0KKyAgICBwcmludGYoIldpdGggc2VlZCBvZiAlMTBsdSwgcGVyaW9kID0gJTEwbHUgKDB4JTA4bHgpXG4iLAorCSAgIHNlZWQsIGNvdW50LCBjb3VudCk7CisgICAgZHJtUmFuZG9tRGVzdHJveShzdGF0ZSk7Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgUmFuZG9tU3RhdGUgICAqc3RhdGU7CisgICAgaW50ICAgICAgICAgICBpOworICAgIGludCAgICAgICAgICAgcmV0OworICAgIHVuc2lnbmVkIGxvbmcgcmFuZDsKKworICAgIHN0YXRlID0gZHJtUmFuZG9tQ3JlYXRlKDEpOworICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7CisJcmFuZCA9IGRybVJhbmRvbShzdGF0ZSk7CisgICAgfQorICAgIHJldCA9IHJhbmQgIT0gc3RhdGUtPmNoZWNrOworICAgIHByaW50ZigiQWZ0ZXIgMTAwMDAgaXRlcmF0aW9uczogJWx1ICglbHUgZXhwZWN0ZWQpOiAlc1xuIiwKKwkgICByYW5kLCBzdGF0ZS0+Y2hlY2ssCisJICAgcmV0ID8gIipJTkNPUlJFQ1QqIiA6ICJDT1JSRUNUIik7CisgICAgZHJtUmFuZG9tRGVzdHJveShzdGF0ZSk7CisKKyAgICBwcmludGYoIkNoZWNraW5nIHBlcmlvZHMuLi5cbiIpOworICAgIGNoZWNrX3BlcmlvZCgxKTsKKyAgICBjaGVja19wZXJpb2QoMik7CisgICAgY2hlY2tfcGVyaW9kKDMxNDE1OTI2KTsKKyAgICAKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVncmEvLmdpdGlnbm9yZSBiL3Rlc3RzL3RlZ3JhLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1MjE2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3RlZ3JhLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorb3BlbmNsb3NlCmRpZmYgLS1naXQgYS90ZXN0cy90ZWdyYS9NYWtlZmlsZS5hbSBiL3Rlc3RzL3RlZ3JhL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNjI1YzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZWdyYS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEzIEBACitBTV9DUFBGTEFHUyA9IFwKKwktSSQodG9wX3NyY2RpcikvaW5jbHVkZS9kcm0gXAorCS1JJCh0b3Bfc3JjZGlyKS90ZWdyYSBcCisJLUkkKHRvcF9zcmNkaXIpCisKK0FNX0NGTEFHUyA9ICQoV0FSTl9DRkxBR1MpCisKK0xEQUREID0gXAorCS4uLy4uL3RlZ3JhL2xpYmRybV90ZWdyYS5sYSBcCisJLi4vLi4vbGliZHJtLmxhCisKK25vaW5zdF9QUk9HUkFNUyA9IFwKKwlvcGVuY2xvc2UKZGlmZiAtLWdpdCBhL3Rlc3RzL3RlZ3JhL29wZW5jbG9zZS5jIGIvdGVzdHMvdGVncmEvb3BlbmNsb3NlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxZDhhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3RlZ3JhL29wZW5jbG9zZS5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNCBOVklESUEgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgInhmODZkcm0uaCIKKyNpbmNsdWRlICJ0ZWdyYS5oIgorCitzdGF0aWMgY29uc3QgY2hhciBkZWZhdWx0X2RldmljZVtdID0gIi9kZXYvZHJpL2NhcmQwIjsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlzdHJ1Y3QgZHJtX3RlZ3JhICp0ZWdyYTsKKwlkcm1WZXJzaW9uUHRyIHZlcnNpb247CisJY29uc3QgY2hhciAqZGV2aWNlOworCWludCBlcnIsIGZkOworCisJaWYgKGFyZ2MgPCAyKQorCQlkZXZpY2UgPSBkZWZhdWx0X2RldmljZTsKKwllbHNlCisJCWRldmljZSA9IGFyZ3ZbMV07CisKKwlmZCA9IG9wZW4oZGV2aWNlLCBPX1JEV1IpOworCWlmIChmZCA8IDApCisJCXJldHVybiAxOworCisJdmVyc2lvbiA9IGRybUdldFZlcnNpb24oZmQpOworCWlmICh2ZXJzaW9uKSB7CisJCXByaW50ZigiVmVyc2lvbjogJWQuJWQuJWRcbiIsIHZlcnNpb24tPnZlcnNpb25fbWFqb3IsCisJCSAgICAgICB2ZXJzaW9uLT52ZXJzaW9uX21pbm9yLCB2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwpOworCQlwcmludGYoIiAgTmFtZTogJXNcbiIsIHZlcnNpb24tPm5hbWUpOworCQlwcmludGYoIiAgRGF0ZTogJXNcbiIsIHZlcnNpb24tPmRhdGUpOworCQlwcmludGYoIiAgRGVzY3JpcHRpb246ICVzXG4iLCB2ZXJzaW9uLT5kZXNjKTsKKworCQlkcm1GcmVlVmVyc2lvbih2ZXJzaW9uKTsKKwl9CisKKwllcnIgPSBkcm1fdGVncmFfbmV3KCZ0ZWdyYSwgZmQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gMTsKKworCWRybV90ZWdyYV9jbG9zZSh0ZWdyYSk7CisJY2xvc2UoZmQpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90dG10ZXN0L0FVVEhPUlMgYi90ZXN0cy90dG10ZXN0L0FVVEhPUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0YTA4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3R0bXRlc3QvQVVUSE9SUwpAQCAtMCwwICsxIEBACitUaG9tYXMgSGVsbHN0cvZtIDx0aG9tYXMtYXQtdHVuZ3N0ZW5ncmFwaGljcy5jb20+IGFuZCBvdGhlcnMuCmRpZmYgLS1naXQgYS90ZXN0cy90dG10ZXN0L0NoYW5nZUxvZyBiL3Rlc3RzL3R0bXRlc3QvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ODhjOGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90dG10ZXN0L0NoYW5nZUxvZwpAQCAtMCwwICsxLDIzIEBACisyMDA2LTAxLTI0ICBUaG9tYXMgSGVsbHN0cvZtICA8dGhvbWFzLWF0LXR1bmdzdGVuZ3JhcGhpY3MuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBzcmMvdHRtdGVzdC5jOgorCisJRml4ZWQgaW5jbHVkZSBwYXRoLgorCisyMDA2LTAxLTI0ICBUaG9tYXMgSGVsbHN0cvZtICA8dGhvbWFzLWF0LXR1bmdzdGVuZ3JhcGhpY3MuY29tPgorCisJKiBBVVRIT1JTOgorCSogTWFrZWZpbGUuYW06CisJKiBjb25maWd1cmUuYWM6CisJKiByZWNvbmY6CisJKiBzcmMvTWFrZWZpbGUuYW06CisJKiBzcmMvdHRtdGVzdC5jOiAoZmFzdHJkdHNjKSwgKHRpbWVfZGlmZiksIChyZWxlYXNlQ29udGV4dCksCisJKHRlc3RBR1ApLCAobWFpbik6CisJKiBzcmMveGY4NmRyaS5jOiAodW5pRFJJRGVzdHJveUNvbnRleHQpLCAodW5pRFJJQ3JlYXRlRHJhd2FibGUpLAorCSh1bmlEUklEZXN0cm95RHJhd2FibGUpLCAodW5pRFJJR2V0RHJhd2FibGVJbmZvKToKKwkqIHNyYy94Zjg2ZHJpLmg6CisJKiBzcmMveGY4NmRyaXN0ci5oOgorCisJSW5pdGlhbCBpbXBvcnQgb2YgdGhlIHR0bXRlc3QgdXRpbGl0eS4KKwkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90dG10ZXN0L01ha2VmaWxlLmFtIGIvdGVzdHMvdHRtdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjQzN2E2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdHRtdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxIEBACitTVUJESVJTID0gc3JjCmRpZmYgLS1naXQgYS90ZXN0cy90dG10ZXN0L05FV1MgYi90ZXN0cy90dG10ZXN0L05FV1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3R0bXRlc3QvTkVXUwpkaWZmIC0tZ2l0IGEvdGVzdHMvdHRtdGVzdC9SRUFETUUgYi90ZXN0cy90dG10ZXN0L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdHRtdGVzdC9SRUFETUUKZGlmZiAtLWdpdCBhL3Rlc3RzL3R0bXRlc3QvY29uZmlndXJlLmFjIGIvdGVzdHMvdHRtdGVzdC9jb25maWd1cmUuYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQxZTkxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3R0bXRlc3QvY29uZmlndXJlLmFjCkBAIC0wLDAgKzEsMzMgQEAKK0FDX0lOSVQKK0FDX1BST0dfQ0MKK0FDX1BBVEhfWAoraWYgdGVzdCAieCRub194IiAhPSAieHllcyI7IHRoZW4KKyAgc2F2ZWNwcD0iJENQUEZMQUdTIgorICBDUFBGTEFHUz0iJENQUEZMQUdTIC1JJHhfaW5jbHVkZXMiCisgIEFDX0NIRUNLX0hFQURFUigkeF9pbmNsdWRlcy9YMTEvWGxpYi5oLCxcCisJIFtBQ19NU0dfRVJST1IoQ291bGQgbm90IGZpbmQgWCBpbnN0YWxsYXRpb24uKV0pCisgIENQUEZMQUdTPSIkc2F2ZWNwcCIKKyAgTURSSUlOQz0iLUkkeF9pbmNsdWRlcyIKKyAgTElCUz0iLUwkeF9saWJyYXJpZXMgJExJQlMiCitlbHNlCisgIEFDX01TR19FUlJPUihDb3VsZCBub3QgZmluZCBYIGluc3RhbGxhdGlvbi4gQWJvcnRpbmcuKQorZmkKK0FDX0FSR19XSVRIKGxpYmRybSwKKyAgICAgICAgICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtbGliZHJtPURJUl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW5zdGFsbGF0aW9uIHByZWZpeCBvZiBsaWJkcm0gW1tkZWZhdWx0PS91c3JdXV0pLAorICAgICAgICAgICAgW2xpYmRybXByZWY9IiR3aXRodmFsIl0sCisgICAgICAgICAgICBbbGliZHJtcHJlZj0iL3VzciJdKQorc2F2ZWNwcD0iJENQUEZMQUdTIgorTURSSUlOQz0iLUkkbGliZHJtcHJlZi9pbmNsdWRlIC1JJGxpYmRybXByZWYvaW5jbHVkZS9kcm0gLUkkeF9pbmNsdWRlcyIKK0NQUEZMQUdTPSIkQ1BQRkxBR1MgJE1EUklJTkMiCitBQ19DSEVDS19IRUFERVIoeGY4NmRybS5oLCxcCisJCSBbQUNfTVNHX0VSUk9SKENvdWxkIG5vdCBmaW5kIGxpYmRybSBpbnN0YWxsYXRpb24uIFVzZSAtLXdpdGgtbGliZHJtPTxsaWJkcm1faW5zdGFsbGF0aW9uX3ByZWZpeD4pXSkKK0FDX0NIRUNLX0hFQURFUihkcm0uaCwsXAorCQkgW0FDX01TR19FUlJPUihDb3VsZCBub3QgZmluZCBsaWJkcm0gaW5zdGFsbGF0aW9uLiBVc2UgLS13aXRoLWxpYmRybT08bGliZHJtX2luc3RhbGxhdGlvbl9wcmVmaXg+KV0pCitDUFBGTEFHUz0iJHNhdmVjcHAiCitMSUJTPSItTCRsaWJkcm1wcmVmL2xpYjY0IC1MJGxpYmRybXByZWYvbGliICRMSUJTIgorQUNfU1VCU1QoTURSSUlOQykKK0FDX1NZU19MQVJHRUZJTEUKK0FNX0lOSVRfQVVUT01BS0UobWluaWRyaSwwLjEuMCkKK0FNX0NPTkZJR19IRUFERVIoY29uZmlnLmgpCitBQ19PVVRQVVQoW01ha2VmaWxlIHNyYy9NYWtlZmlsZV0pCmRpZmYgLS1naXQgYS90ZXN0cy90dG10ZXN0L3JlY29uZiBiL3Rlc3RzL3R0bXRlc3QvcmVjb25mCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU2NGQwMGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90dG10ZXN0L3JlY29uZgpAQCAtMCwwICsxLDIgQEAKKyMhL2Jpbi9zaAorYXV0b3JlY29uZiAtdiAtLWluc3RhbGwgfHwgZXhpdCAxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdHRtdGVzdC9zcmMvTWFrZWZpbGUuYW0gYi90ZXN0cy90dG10ZXN0L3NyYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2VlODI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdHRtdGVzdC9zcmMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4IEBACitJTkNMVURFUyA9IEBNRFJJSU5DQAorYmluX1BST0dSQU1TID0gdHRtdGVzdAordHRtdGVzdF9TT1VSQ0VTID0gXAorCXR0bXRlc3QuYyBcCisJeGY4NmRyaS5jIFwKKwl4Zjg2ZHJpLmggXAorCXhmODZkcmlzdHIuaCAKK3R0bXRlc3RfTERBREQgPSAtbGRybSAtbFhleHQgLWxYMTEKZGlmZiAtLWdpdCBhL3Rlc3RzL3R0bXRlc3Qvc3JjL3R0bXRlc3QuYyBiL3Rlc3RzL3R0bXRlc3Qvc3JjL3R0bXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmRmMjQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdHRtdGVzdC9zcmMvdHRtdGVzdC5jCkBAIC0wLDAgKzEsNDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IDIwMDcgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRYLiwgVVNBCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIAorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSAKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKiAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEF1dGhvcnM6IFRob21hcyBIZWxsc3Ry9m0gPHRob21hcy1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxkcm0vZHJtLmg+CisjaW5jbHVkZSAieGY4NmRyaS5oIgorI2luY2x1ZGUgInhmODZkcm0uaCIKKyNpbmNsdWRlICJzdGRpby5oIgorI2luY2x1ZGUgInN5cy90eXBlcy5oIgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAic3lzL21tYW4uaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBlbnVtCisgICAgeworCWhhdmVOb3RoaW5nLAorCWhhdmVEaXNwbGF5LAorCWhhdmVDb25uZWN0aW9uLAorCWhhdmVEcml2ZXJOYW1lLAorCWhhdmVEZXZpY2VJbmZvLAorCWhhdmVEUk0sCisJaGF2ZUNvbnRleHQKKyAgICB9CisgICAgc3RhdGU7CisKKyAgICBEaXNwbGF5ICpkaXNwbGF5OworICAgIGludCBzY3JlZW47CisgICAgZHJtX2hhbmRsZV90IHNBcmVhT2Zmc2V0OworICAgIGNoYXIgKmN1ckJ1c0lEOworICAgIGNoYXIgKmRyaXZlck5hbWU7CisgICAgaW50IGRybUZEOworICAgIFhWaXN1YWxJbmZvIHZpc3VhbEluZm87CisgICAgWElEIGlkOworICAgIGRybV9jb250ZXh0X3QgaHdDb250ZXh0OworICAgIHZvaWQgKmRyaVByaXY7CisgICAgaW50IGRyaVByaXZTaXplOworICAgIGludCBmYlNpemU7CisgICAgaW50IGZiT3JpZ2luOworICAgIGludCBmYlN0cmlkZTsKKyAgICBkcm1faGFuZGxlX3QgZmJIYW5kbGU7CisgICAgaW50IGRkeERyaXZlck1ham9yOworICAgIGludCBkZHhEcml2ZXJNaW5vcjsKKyAgICBpbnQgZGR4RHJpdmVyUGF0Y2g7Cit9IFRpbnlEUklDb250ZXh0OworCisjaWZuZGVmIF9feDg2XzY0X18KK3N0YXRpYyB1bnNpZ25lZAorZmFzdHJkdHNjKHZvaWQpCit7CisgICAgdW5zaWduZWQgZWF4OworICAgIF9fYXNtX18gdm9sYXRpbGUgKCJcdCIKKwkicHVzaGwgICUlZWJ4XG5cdCIKKwkiY3B1aWRcblx0IiAiLmJ5dGUgMHgwZiwgMHgzMVxuXHQiICJwb3BsICUlZWJ4XG4iOiI9YSIgKGVheCkKKwk6IjAiKDApCisJOiJlY3giLCAiZWR4IiwgImNjIik7CisKKyAgICByZXR1cm4gZWF4OworfQorI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZAorZmFzdHJkdHNjKHZvaWQpCit7CisgICAgdW5zaWduZWQgZWF4OworICAgIF9fYXNtX18gdm9sYXRpbGUgKCJcdCIgImNwdWlkXG5cdCIgIi5ieXRlIDB4MGYsIDB4MzFcblx0IjoiPWEiIChlYXgpCisJOiIwIigwKQorCToiZWN4IiwgImVkeCIsICJlYngiLCAiY2MiKTsKKworICAgIHJldHVybiBlYXg7Cit9CisjZW5kaWYKKwordm9pZAorYm1FcnJvcihpbnQgdmFsLCBjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpmdW5jdGlvbiwgaW50IGxpbmUpCit7CisgICAgZnByaW50ZihzdGRlcnIsICJGYXRhbCB2aWRlbyBtZW1vcnkgbWFuYWdlciBlcnJvciBcIiVzXCIuXG4iCisJIkNoZWNrIGtlcm5lbCBsb2dzIG9yIHNldCB0aGUgTElCR0xfREVCVUdcbiIKKwkiZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gXCJ2ZXJib3NlXCIgZm9yIG1vcmUgaW5mby5cbiIKKwkiRGV0ZWN0ZWQgaW4gZmlsZSAlcywgbGluZSAlZCwgZnVuY3Rpb24gJXMuXG4iLAorCXN0cmVycm9yKC12YWwpLCBmaWxlLCBsaW5lLCBmdW5jdGlvbik7CisgICAgYWJvcnQoKTsKK30KKworI2RlZmluZSBCTV9DS0ZBVEFMKHZhbCkJCQkJCSAgICAgICBcCisgIGRvewkJCQkJCQkgICAgICAgXAorICAgIGludCB0c3RWYWwgPSAodmFsKTsJCQkJCSAgICAgICBcCisgICAgaWYgKHRzdFZhbCkgCQkJCQkgICAgICAgXAorICAgICAgYm1FcnJvcih0c3RWYWwsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgICAgICAgXAorICB9IHdoaWxlKDApOworCitzdGF0aWMgdW5zaWduZWQKK3RpbWVfZGlmZih1bnNpZ25lZCB0LCB1bnNpZ25lZCB0MikKK3sKKyAgICByZXR1cm4gKCh0IDwgdDIpID8gdDIgLSB0IDogMHhGRkZGRkZGRlUgLSAodCAtIHQyIC0gMSkpOworfQorCitzdGF0aWMgaW50CityZWxlYXNlQ29udGV4dChUaW55RFJJQ29udGV4dCAqIGN0eCkKK3sKKyAgICBzd2l0Y2ggKGN0eC0+c3RhdGUpIHsKKyAgICBjYXNlIGhhdmVDb250ZXh0OgorCXVuaURSSURlc3Ryb3lDb250ZXh0KGN0eC0+ZGlzcGxheSwgY3R4LT5zY3JlZW4sIGN0eC0+aWQpOworICAgIGNhc2UgaGF2ZURSTToKKwlkcm1DbG9zZShjdHgtPmRybUZEKTsKKyAgICBjYXNlIGhhdmVEZXZpY2VJbmZvOgorCVhGcmVlKGN0eC0+ZHJpUHJpdik7CisgICAgY2FzZSBoYXZlRHJpdmVyTmFtZToKKwlYRnJlZShjdHgtPmRyaXZlck5hbWUpOworICAgIGNhc2UgaGF2ZUNvbm5lY3Rpb246CisJWEZyZWUoY3R4LT5jdXJCdXNJRCk7CisJdW5pRFJJQ2xvc2VDb25uZWN0aW9uKGN0eC0+ZGlzcGxheSwgY3R4LT5zY3JlZW4pOworICAgIGNhc2UgaGF2ZURpc3BsYXk6CisJWENsb3NlRGlzcGxheShjdHgtPmRpc3BsYXkpOworICAgIGRlZmF1bHQ6CisJYnJlYWs7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQKK3JlYWRCdWYodm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgKmJ1ZjMyID0gKHVuc2lnbmVkICopYnVmOworICAgIHVuc2lnbmVkICplbmQgPSAodW5zaWduZWQgKilidWYzMiArIHNpemUgLyBzaXplb2YoKmJ1ZjMyKTsKKworICAgIHdoaWxlIChidWYzMiA8IGVuZCkgeworCSh2b2lkKSpidWYzMisrOworICAgIH0KK30KKworc3RhdGljIGludAorYmVuY2htYXJrQnVmZmVyKFRpbnlEUklDb250ZXh0ICogY3R4LCB1bnNpZ25lZCBsb25nIHNpemUsCisgICAgdW5zaWduZWQgbG9uZyAqdGlja3MpCit7CisgICAgdW5zaWduZWQgbG9uZyBjdXJUaW1lLCBvbGRUaW1lOworICAgIGludCByZXQ7CisgICAgZHJtQk8gYnVmOworICAgIHZvaWQgKnZpcnR1YWw7CisKKyAgICAvKgorICAgICAqIFRlc3Qgc3lzdGVtIG1lbW9yeSBvYmplY3RzLgorICAgICAqLworICAgIG9sZFRpbWUgPSBmYXN0cmR0c2MoKTsKKyAgICBCTV9DS0ZBVEFMKGRybUJPQ3JlYXRlKGN0eC0+ZHJtRkQsIHNpemUsIDAsIE5VTEwsCisJCQkgICBEUk1fQk9fRkxBR19SRUFEIHwKKwkJCSAgIERSTV9CT19GTEFHX1dSSVRFIHwKKwkJCSAgIERSTV9CT19GTEFHX01FTV9MT0NBTCwgMCwgJmJ1ZikpOworICAgIGN1clRpbWUgPSBmYXN0cmR0c2MoKTsKKyAgICAqdGlja3MrKyA9IHRpbWVfZGlmZihvbGRUaW1lLCBjdXJUaW1lKTsKKworICAgIG9sZFRpbWUgPSBmYXN0cmR0c2MoKTsKKyAgICBCTV9DS0ZBVEFMKGRybUJPTWFwKGN0eC0+ZHJtRkQsICZidWYsCisJICAgIERSTV9CT19GTEFHX1JFQUQgfCBEUk1fQk9fRkxBR19XUklURSwgMCwgJnZpcnR1YWwpKTsKKyAgICBjdXJUaW1lID0gZmFzdHJkdHNjKCk7CisgICAgKnRpY2tzKysgPSB0aW1lX2RpZmYob2xkVGltZSwgY3VyVGltZSk7CisKKyAgICBvbGRUaW1lID0gZmFzdHJkdHNjKCk7CisgICAgbWVtc2V0KHZpcnR1YWwsIDB4RjAsIGJ1Zi5zaXplKTsKKyAgICBjdXJUaW1lID0gZmFzdHJkdHNjKCk7CisgICAgKnRpY2tzKysgPSB0aW1lX2RpZmYob2xkVGltZSwgY3VyVGltZSk7CisKKyAgICBvbGRUaW1lID0gZmFzdHJkdHNjKCk7CisgICAgbWVtc2V0KHZpcnR1YWwsIDB4MEYsIGJ1Zi5zaXplKTsKKyAgICBjdXJUaW1lID0gZmFzdHJkdHNjKCk7CisgICAgKnRpY2tzKysgPSB0aW1lX2RpZmYob2xkVGltZSwgY3VyVGltZSk7CisKKyAgICBvbGRUaW1lID0gZmFzdHJkdHNjKCk7CisgICAgcmVhZEJ1Zih2aXJ0dWFsLCBidWYuc2l6ZSk7CisgICAgY3VyVGltZSA9IGZhc3RyZHRzYygpOworICAgICp0aWNrcysrID0gdGltZV9kaWZmKG9sZFRpbWUsIGN1clRpbWUpOworCisgICAgb2xkVGltZSA9IGZhc3RyZHRzYygpOworICAgIEJNX0NLRkFUQUwoZHJtQk9Vbm1hcChjdHgtPmRybUZELCAmYnVmKSk7CisgICAgY3VyVGltZSA9IGZhc3RyZHRzYygpOworICAgICp0aWNrcysrID0gdGltZV9kaWZmKG9sZFRpbWUsIGN1clRpbWUpOworCisgICAgLyoKKyAgICAgKiBUZXN0IFRUIGJvdW5kIGJ1ZmZlciBvYmplY3RzLgorICAgICAqLworCisgICAgb2xkVGltZSA9IGZhc3RyZHRzYygpOworICAgIEJNX0NLRkFUQUwoZHJtQk9TZXRTdGF0dXMoY3R4LT5kcm1GRCwgJmJ1ZiwKKwkJCSAgICAgRFJNX0JPX0ZMQUdfTUVNX1RULCAKKwkJCSAgICAgRFJNX0JPX01BU0tfTUVNLCAKKwkJCSAgICAgIDAsMCwwKSk7CisgICAgY3VyVGltZSA9IGZhc3RyZHRzYygpOworICAgICp0aWNrcysrID0gdGltZV9kaWZmKG9sZFRpbWUsIGN1clRpbWUpOworCisgICAgb2xkVGltZSA9IGZhc3RyZHRzYygpOworICAgIEJNX0NLRkFUQUwoZHJtQk9NYXAoY3R4LT5kcm1GRCwgJmJ1ZiwKKwkgICAgRFJNX0JPX0ZMQUdfUkVBRCB8IERSTV9CT19GTEFHX1dSSVRFLCAwLCAmdmlydHVhbCkpOworICAgIGN1clRpbWUgPSBmYXN0cmR0c2MoKTsKKyAgICAqdGlja3MrKyA9IHRpbWVfZGlmZihvbGRUaW1lLCBjdXJUaW1lKTsKKworICAgIG9sZFRpbWUgPSBmYXN0cmR0c2MoKTsKKyAgICBtZW1zZXQodmlydHVhbCwgMHhGMCwgYnVmLnNpemUpOworICAgIGN1clRpbWUgPSBmYXN0cmR0c2MoKTsKKyAgICAqdGlja3MrKyA9IHRpbWVfZGlmZihvbGRUaW1lLCBjdXJUaW1lKTsKKworICAgIG9sZFRpbWUgPSBmYXN0cmR0c2MoKTsKKyAgICBtZW1zZXQodmlydHVhbCwgMHgwRiwgYnVmLnNpemUpOworICAgIGN1clRpbWUgPSBmYXN0cmR0c2MoKTsKKyAgICAqdGlja3MrKyA9IHRpbWVfZGlmZihvbGRUaW1lLCBjdXJUaW1lKTsKKworICAgIG9sZFRpbWUgPSBmYXN0cmR0c2MoKTsKKyAgICByZWFkQnVmKHZpcnR1YWwsIGJ1Zi5zaXplKTsKKyAgICBjdXJUaW1lID0gZmFzdHJkdHNjKCk7CisgICAgKnRpY2tzKysgPSB0aW1lX2RpZmYob2xkVGltZSwgY3VyVGltZSk7CisKKyAgICBCTV9DS0ZBVEFMKGRybUJPVW5tYXAoY3R4LT5kcm1GRCwgJmJ1ZikpOworCisgICAgb2xkVGltZSA9IGZhc3RyZHRzYygpOworICAgIEJNX0NLRkFUQUwoZHJtQk9TZXRTdGF0dXMoY3R4LT5kcm1GRCwgJmJ1ZiwKKwkJCSAgICAgRFJNX0JPX0ZMQUdfTUVNX0xPQ0FMLCBEUk1fQk9fTUFTS19NRU0sIDAsIDAsMCkpOworICAgIGN1clRpbWUgPSBmYXN0cmR0c2MoKTsKKyAgICAqdGlja3MrKyA9IHRpbWVfZGlmZihvbGRUaW1lLCBjdXJUaW1lKTsKKworICAgIC8qCisgICAgICogVGVzdCBjYWNoZWQgYnVmZmVycyBvYmplY3RzLgorICAgICAqLworCisgICAgb2xkVGltZSA9IGZhc3RyZHRzYygpOworICAgIHJldCA9IGRybUJPU2V0U3RhdHVzKGN0eC0+ZHJtRkQsICZidWYsCisJCQkgRFJNX0JPX0ZMQUdfTUVNX1RUIHwgCisJCQkgRFJNX0JPX0ZMQUdfQ0FDSEVEIHwgCisJCQkgRFJNX0JPX0ZMQUdfRk9SQ0VfQ0FDSElORywKKwkJCSBEUk1fQk9fTUFTS19NRU1UWVBFIHwgCisJCQkgRFJNX0JPX0ZMQUdfRk9SQ0VfQ0FDSElORywKKwkJCSAwLCAwLCAwKTsKKyAgICBjdXJUaW1lID0gZmFzdHJkdHNjKCk7CisKKyAgICBpZiAocmV0KSB7CisJcHJpbnRmKCJDb3VsZG4ndCBiaW5kIGNhY2hlZC4gUHJvYmFibHkgbm8gc3VwcG9ydFxuIik7CisJQk1fQ0tGQVRBTChkcm1CT1VucmVmZXJlbmNlKGN0eC0+ZHJtRkQsICZidWYpKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgKnRpY2tzKysgPSB0aW1lX2RpZmYob2xkVGltZSwgY3VyVGltZSk7CisKKyAgICBvbGRUaW1lID0gZmFzdHJkdHNjKCk7CisgICAgQk1fQ0tGQVRBTChkcm1CT01hcChjdHgtPmRybUZELCAmYnVmLAorCSAgICBEUk1fQk9fRkxBR19SRUFEIHwgRFJNX0JPX0ZMQUdfV1JJVEUsIDAsICZ2aXJ0dWFsKSk7CisKKyAgICBjdXJUaW1lID0gZmFzdHJkdHNjKCk7CisgICAgKnRpY2tzKysgPSB0aW1lX2RpZmYob2xkVGltZSwgY3VyVGltZSk7CisKKyAgICBvbGRUaW1lID0gZmFzdHJkdHNjKCk7CisgICAgbWVtc2V0KHZpcnR1YWwsIDB4RjAsIGJ1Zi5zaXplKTsKKyAgICBjdXJUaW1lID0gZmFzdHJkdHNjKCk7CisgICAgKnRpY2tzKysgPSB0aW1lX2RpZmYob2xkVGltZSwgY3VyVGltZSk7CisKKyAgICBvbGRUaW1lID0gZmFzdHJkdHNjKCk7CisgICAgbWVtc2V0KHZpcnR1YWwsIDB4MEYsIGJ1Zi5zaXplKTsKKyAgICBjdXJUaW1lID0gZmFzdHJkdHNjKCk7CisgICAgKnRpY2tzKysgPSB0aW1lX2RpZmYob2xkVGltZSwgY3VyVGltZSk7CisKKyAgICBvbGRUaW1lID0gZmFzdHJkdHNjKCk7CisgICAgcmVhZEJ1Zih2aXJ0dWFsLCBidWYuc2l6ZSk7CisgICAgY3VyVGltZSA9IGZhc3RyZHRzYygpOworICAgICp0aWNrcysrID0gdGltZV9kaWZmKG9sZFRpbWUsIGN1clRpbWUpOworCisgICAgQk1fQ0tGQVRBTChkcm1CT1VubWFwKGN0eC0+ZHJtRkQsICZidWYpKTsKKyAgICBCTV9DS0ZBVEFMKGRybUJPVW5yZWZlcmVuY2UoY3R4LT5kcm1GRCwgJmJ1ZikpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0QUdQKFRpbnlEUklDb250ZXh0ICogY3R4KQoreworICAgIHVuc2lnbmVkIGxvbmcgdGlja3NbMTI4XSwgKnBUaWNrczsKKyAgICB1bnNpZ25lZCBsb25nIHNpemUgPSA4ICogMTAyNDsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gYmVuY2htYXJrQnVmZmVyKGN0eCwgc2l6ZSwgdGlja3MpOworICAgIGlmIChyZXQgPCAwKSB7CisJZnByaW50ZihzdGRlcnIsICJCdWZmZXIgZXJyb3IgJXNcbiIsIHN0cmVycm9yKC1yZXQpKTsKKwlyZXR1cm47CisgICAgfQorICAgIHBUaWNrcyA9IHRpY2tzOworCisgICAgcHJpbnRmKCJCdWZmZXIgc2l6ZSAlZCBieXRlc1xuIiwgc2l6ZSk7CisgICAgcHJpbnRmKCJTeXN0ZW0gbWVtb3J5IHRpbWluZ3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworICAgIHByaW50ZigiQ3JlYXRpb24gdG9vayAgICAgICAgICAgICUxMmx1IHRpY2tzXG4iLCAqcFRpY2tzKyspOworICAgIHByaW50ZigiTWFwcGluZyB0b29rICAgICAgICAgICAgICUxMmx1IHRpY2tzXG4iLCAqcFRpY2tzKyspOworICAgIHByaW50ZigiV3JpdGluZyB0b29rICAgICAgICAgICAgICUxMmx1IHRpY2tzXG4iLCAqcFRpY2tzKyspOworICAgIHByaW50ZigiV3JpdGluZyBBZ2FpbiB0b29rICAgICAgICUxMmx1IHRpY2tzXG4iLCAqcFRpY2tzKyspOworICAgIHByaW50ZigiUmVhZGluZyB0b29rICAgICAgICAgICAgICUxMmx1IHRpY2tzXG4iLCAqcFRpY2tzKyspOworICAgIHByaW50ZigiVW5tYXBwaW5nIHRvb2sgICAgICAgICAgICUxMmx1IHRpY2tzXG4iLCAqcFRpY2tzKyspOworCisgICAgcHJpbnRmKCJcblRUIE1lbW9yeSB0aW1pbmdzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisgICAgcHJpbnRmKCJNb3ZpbmcgdG8gVFQgdG9vayAgICAgICAgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CisgICAgcHJpbnRmKCJNYXBwaW5nIGluIFRUIHRvb2sgICAgICAgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CisgICAgcHJpbnRmKCJXcml0aW5nIHRvIFRUIHRvb2sgICAgICAgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CisgICAgcHJpbnRmKCJXcml0aW5nIGFnYWluIHRvIFRUIHRvb2sgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CisgICAgcHJpbnRmKCJSZWFkaW5nIGZyb20gVFQgdG9vayAgICAgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CisgICAgcHJpbnRmKCJNb3ZpbmcgdG8gc3lzdGVtIHRvb2sgICAgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CisKKyAgICBpZiAocmV0ID09IDEpCisJcmV0dXJuOworCisgICAgcHJpbnRmKCJcbkNhY2hlZCBUVCBNZW1vcnkgdGltaW5ncyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisgICAgcHJpbnRmKCJNb3ZpbmcgdG8gQ1RUIHRvb2sgICAgICAgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CisgICAgcHJpbnRmKCJNYXBwaW5nIGluIENUVCB0b29rICAgICAgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CisgICAgcHJpbnRmKCJXcml0aW5nIHRvIENUVCB0b29rICAgICAgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CisgICAgcHJpbnRmKCJSZS13cml0aW5nIHRvIENUVCB0b29rICAgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CisgICAgcHJpbnRmKCJSZWFkaW5nIGZyb20gQ1RUIHRvb2sgICAgJTEybHUgdGlja3NcbiIsICpwVGlja3MrKyk7CisgICAgcHJpbnRmKCJcblxuIik7Cit9CisKK2ludAorbWFpbigpCit7CisgICAgaW50IHJldCwgc2NyZWVuLCBpc0NhcGFibGU7CisgICAgY2hhciAqZGlzcGxheU5hbWUgPSAiOjAiOworICAgIFRpbnlEUklDb250ZXh0IGN0eDsKKyAgICB1bnNpZ25lZCBtYWdpYzsKKworICAgIGN0eC5zY3JlZW4gPSAwOworICAgIGN0eC5zdGF0ZSA9IGhhdmVOb3RoaW5nOworICAgIGN0eC5kaXNwbGF5ID0gWE9wZW5EaXNwbGF5KGRpc3BsYXlOYW1lKTsKKyAgICBpZiAoIWN0eC5kaXNwbGF5KSB7CisJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBkaXNwbGF5XG4iKTsKKwlyZXR1cm4gcmVsZWFzZUNvbnRleHQoJmN0eCk7CisgICAgfQorICAgIGN0eC5zdGF0ZSA9IGhhdmVEaXNwbGF5OworCisgICAgcmV0ID0KKwl1bmlEUklRdWVyeURpcmVjdFJlbmRlcmluZ0NhcGFibGUoY3R4LmRpc3BsYXksIGN0eC5zY3JlZW4sCisJJmlzQ2FwYWJsZSk7CisgICAgaWYgKCFyZXQgfHwgIWlzQ2FwYWJsZSkgeworCWZwcmludGYoc3RkZXJyLCAiTm8gRFJJIG9uIHRoaXMgZGlzcGxheTpzY2VlblxuIik7CisJcmV0dXJuIHJlbGVhc2VDb250ZXh0KCZjdHgpOworICAgIH0KKworICAgIGlmICghdW5pRFJJT3BlbkNvbm5lY3Rpb24oY3R4LmRpc3BsYXksIGN0eC5zY3JlZW4sICZjdHguc0FyZWFPZmZzZXQsCisJICAgICZjdHguY3VyQnVzSUQpKSB7CisJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBEUkkgY29ubmVjdGlvbi5cbiIpOworCXJldHVybiByZWxlYXNlQ29udGV4dCgmY3R4KTsKKyAgICB9CisgICAgY3R4LnN0YXRlID0gaGF2ZUNvbm5lY3Rpb247CisKKyAgICBpZiAoIXVuaURSSUdldENsaWVudERyaXZlck5hbWUoY3R4LmRpc3BsYXksIGN0eC5zY3JlZW4sCisJICAgICZjdHguZGR4RHJpdmVyTWFqb3IsICZjdHguZGR4RHJpdmVyTWlub3IsCisJICAgICZjdHguZGR4RHJpdmVyUGF0Y2gsICZjdHguZHJpdmVyTmFtZSkpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBnZXQgRFJJIGRyaXZlciBuYW1lLlxuIik7CisJcmV0dXJuIHJlbGVhc2VDb250ZXh0KCZjdHgpOworICAgIH0KKyAgICBjdHguc3RhdGUgPSBoYXZlRHJpdmVyTmFtZTsKKworICAgIGlmICghdW5pRFJJR2V0RGV2aWNlSW5mbyhjdHguZGlzcGxheSwgY3R4LnNjcmVlbiwKKwkgICAgJmN0eC5mYkhhbmRsZSwgJmN0eC5mYk9yaWdpbiwgJmN0eC5mYlNpemUsCisJICAgICZjdHguZmJTdHJpZGUsICZjdHguZHJpUHJpdlNpemUsICZjdHguZHJpUHJpdikpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBnZXQgRFJJIGRldmljZSBpbmZvLlxuIik7CisJcmV0dXJuIHJlbGVhc2VDb250ZXh0KCZjdHgpOworICAgIH0KKyAgICBjdHguc3RhdGUgPSBoYXZlRHJpdmVyTmFtZTsKKworICAgIGlmICgoY3R4LmRybUZEID0gZHJtT3BlbihOVUxMLCBjdHguY3VyQnVzSUQpKSA8IDApIHsKKwlwZXJyb3IoIkRSTSBEZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIpOworCXJldHVybiByZWxlYXNlQ29udGV4dCgmY3R4KTsKKyAgICB9CisgICAgY3R4LnN0YXRlID0gaGF2ZURSTTsKKworICAgIGRybUdldE1hZ2ljKGN0eC5kcm1GRCwgJm1hZ2ljKTsKKyAgICBpZiAoIXVuaURSSUF1dGhDb25uZWN0aW9uKGN0eC5kaXNwbGF5LCBjdHguc2NyZWVuLCBtYWdpYykpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBnZXQgWCBzZXJ2ZXIgdG8gYXV0aGVudGljYXRlIHVzLlxuIik7CisJcmV0dXJuIHJlbGVhc2VDb250ZXh0KCZjdHgpOworICAgIH0KKworICAgIHJldCA9IFhNYXRjaFZpc3VhbEluZm8oY3R4LmRpc3BsYXksIGN0eC5zY3JlZW4sIDI0LCBUcnVlQ29sb3IsCisJJmN0eC52aXN1YWxJbmZvKTsKKyAgICBpZiAoIXJldCkgeworCXJldCA9IFhNYXRjaFZpc3VhbEluZm8oY3R4LmRpc3BsYXksIGN0eC5zY3JlZW4sIDE2LCBUcnVlQ29sb3IsCisJICAgICZjdHgudmlzdWFsSW5mbyk7CisJaWYgKCFyZXQpIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZmluZCBhIG1hdGNoaW5nIHZpc3VhbC5cbiIpOworCSAgICByZXR1cm4gcmVsZWFzZUNvbnRleHQoJmN0eCk7CisJfQorICAgIH0KKworICAgIGlmICghdW5pRFJJQ3JlYXRlQ29udGV4dChjdHguZGlzcGxheSwgY3R4LnNjcmVlbiwgY3R4LnZpc3VhbEluZm8udmlzdWFsLAorCSAgICAmY3R4LmlkLCAmY3R4Lmh3Q29udGV4dCkpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBjcmVhdGUgRFJJIGNvbnRleHQuXG4iKTsKKwlyZXR1cm4gcmVsZWFzZUNvbnRleHQoJmN0eCk7CisgICAgfQorICAgIGN0eC5zdGF0ZSA9IGhhdmVDb250ZXh0OworCisgICAgdGVzdEFHUCgmY3R4KTsKKworICAgIHJlbGVhc2VDb250ZXh0KCZjdHgpOworICAgIHByaW50ZigiVGVybWluYXRpbmcgbm9ybWFsbHlcbiIpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdHRtdGVzdC9zcmMveGY4NmRyaS5jIGIvdGVzdHMvdHRtdGVzdC9zcmMveGY4NmRyaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZTBiODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90dG10ZXN0L3NyYy94Zjg2ZHJpLmMKQEAgLTAsMCArMSw2MDMgQEAKKy8qICRYRnJlZTg2OiB4Yy9saWIvR0wvZHJpL1hGODZkcmkuYyx2IDEuMTMgMjAwMi8xMC8zMCAxMjo1MToyNSBhbGFuaCBFeHAgJCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTk4LTE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLgorQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKK2NvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKK3dpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKK2Rpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KK3Blcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKK29mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKK09SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCitBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKK1RPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCitTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBBdXRob3JzOgorICogICBLZXZpbiBFLiBNYXJ0aW4gPG1hcnRpbkB2YWxpbnV4LmNvbT4KKyAqICAgSmVucyBPd2VuIDxqZW5zQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICogICBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqCisgKi8KKworLyogVEhJUyBJUyBOT1QgQU4gWCBDT05TT1JUSVVNIFNUQU5EQVJEICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPFgxMS9YbGliaW50Lmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWGV4dC5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL2V4dHV0aWwuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJ4Zjg2ZHJpc3RyLmgiCisKK3N0YXRpYyBYRXh0ZW5zaW9uSW5mbyBfeGY4NmRyaV9pbmZvX2RhdGE7CitzdGF0aWMgWEV4dGVuc2lvbkluZm8gKnhmODZkcmlfaW5mbyA9ICZfeGY4NmRyaV9pbmZvX2RhdGE7CitzdGF0aWMgY2hhciB4Zjg2ZHJpX2V4dGVuc2lvbl9uYW1lW10gPSBYRjg2RFJJTkFNRTsKKworI2RlZmluZSB1bmlEUklDaGVja0V4dGVuc2lvbihkcHksaSx2YWwpIFwKKyAgWGV4dENoZWNrRXh0ZW5zaW9uIChkcHksIGksIHhmODZkcmlfZXh0ZW5zaW9uX25hbWUsIHZhbCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqCQkJICAgcHJpdmF0ZSB1dGlsaXR5IHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBjbG9zZV9kaXNwbGF5KERpc3BsYXkgKiBkcHksIFhFeHRDb2RlcyAqIGV4dENvZGVzKTsKK3N0YXRpYyAvKiBjb25zdCAqLyBYRXh0ZW5zaW9uSG9va3MgeGY4NmRyaV9leHRlbnNpb25faG9va3MgPSB7CisgICAgTlVMTCwJCQkgICAgICAgLyogY3JlYXRlX2djICovCisgICAgTlVMTCwJCQkgICAgICAgLyogY29weV9nYyAqLworICAgIE5VTEwsCQkJICAgICAgIC8qIGZsdXNoX2djICovCisgICAgTlVMTCwJCQkgICAgICAgLyogZnJlZV9nYyAqLworICAgIE5VTEwsCQkJICAgICAgIC8qIGNyZWF0ZV9mb250ICovCisgICAgTlVMTCwJCQkgICAgICAgLyogZnJlZV9mb250ICovCisgICAgY2xvc2VfZGlzcGxheSwJCSAgICAgICAvKiBjbG9zZV9kaXNwbGF5ICovCisgICAgTlVMTCwJCQkgICAgICAgLyogd2lyZV90b19ldmVudCAqLworICAgIE5VTEwsCQkJICAgICAgIC8qIGV2ZW50X3RvX3dpcmUgKi8KKyAgICBOVUxMLAkJCSAgICAgICAvKiBlcnJvciAqLworICAgIE5VTEwsCQkJICAgICAgIC8qIGVycm9yX3N0cmluZyAqLworfTsKKworc3RhdGljCitYRVhUX0dFTkVSQVRFX0ZJTkRfRElTUExBWShmaW5kX2Rpc3BsYXksIHhmODZkcmlfaW5mbywKKyAgICB4Zjg2ZHJpX2V4dGVuc2lvbl9uYW1lLCAmeGY4NmRyaV9leHRlbnNpb25faG9va3MsIDAsIE5VTEwpCisKKyAgICBzdGF0aWMgWEVYVF9HRU5FUkFURV9DTE9TRV9ESVNQTEFZKGNsb3NlX2Rpc3BsYXksIHhmODZkcmlfaW5mbykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqCQkgICAgcHVibGljIFhGcmVlODYtRFJJIEV4dGVuc2lvbiByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgMAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZGVmaW5lIFRSQUNFKG1zZykgIGZwcmludGYoc3RkZXJyLCJ1bmlEUkklc1xuIiwgbXNnKTsKKyNlbHNlCisjZGVmaW5lIFRSQUNFKG1zZykKKyNlbmRpZgorICAgIEJvb2wgdW5pRFJJUXVlcnlFeHRlbnNpb24oZHB5LCBldmVudF9iYXNlcCwgZXJyb3JfYmFzZXApCisgICAgRGlzcGxheSAqZHB5OworICAgIGludCAqZXZlbnRfYmFzZXAsICplcnJvcl9iYXNlcDsKK3sKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkoZHB5KTsKKworICAgIFRSQUNFKCJRdWVyeUV4dGVuc2lvbi4uLiIpOworICAgIGlmIChYZXh0SGFzRXh0ZW5zaW9uKGluZm8pKSB7CisJKmV2ZW50X2Jhc2VwID0gaW5mby0+Y29kZXMtPmZpcnN0X2V2ZW50OworCSplcnJvcl9iYXNlcCA9IGluZm8tPmNvZGVzLT5maXJzdF9lcnJvcjsKKwlUUkFDRSgiUXVlcnlFeHRlbnNpb24uLi4gcmV0dXJuIFRydWUiKTsKKwlyZXR1cm4gVHJ1ZTsKKyAgICB9IGVsc2UgeworCVRSQUNFKCJRdWVyeUV4dGVuc2lvbi4uLiByZXR1cm4gRmFsc2UiKTsKKwlyZXR1cm4gRmFsc2U7CisgICAgfQorfQorCitCb29sCit1bmlEUklRdWVyeVZlcnNpb24oZHB5LCBtYWpvclZlcnNpb24sIG1pbm9yVmVyc2lvbiwgcGF0Y2hWZXJzaW9uKQorICAgIERpc3BsYXkgKmRweTsKKyAgICBpbnQgKm1ham9yVmVyc2lvbjsKKyAgICBpbnQgKm1pbm9yVmVyc2lvbjsKKyAgICBpbnQgKnBhdGNoVmVyc2lvbjsKK3sKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkoZHB5KTsKKyAgICB4WEY4NkRSSVF1ZXJ5VmVyc2lvblJlcGx5IHJlcDsKKyAgICB4WEY4NkRSSVF1ZXJ5VmVyc2lvblJlcSAqcmVxOworCisgICAgVFJBQ0UoIlF1ZXJ5VmVyc2lvbi4uLiIpOworICAgIHVuaURSSUNoZWNrRXh0ZW5zaW9uKGRweSwgaW5mbywgRmFsc2UpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoWEY4NkRSSVF1ZXJ5VmVyc2lvbiwgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+ZHJpUmVxVHlwZSA9IFhfWEY4NkRSSVF1ZXJ5VmVyc2lvbjsKKyAgICBpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopICYgcmVwLCAwLCB4RmFsc2UpKSB7CisJVW5sb2NrRGlzcGxheShkcHkpOworCVN5bmNIYW5kbGUoKTsKKwlUUkFDRSgiUXVlcnlWZXJzaW9uLi4uIHJldHVybiBGYWxzZSIpOworCXJldHVybiBGYWxzZTsKKyAgICB9CisgICAgKm1ham9yVmVyc2lvbiA9IHJlcC5tYWpvclZlcnNpb247CisgICAgKm1pbm9yVmVyc2lvbiA9IHJlcC5taW5vclZlcnNpb247CisgICAgKnBhdGNoVmVyc2lvbiA9IHJlcC5wYXRjaFZlcnNpb247CisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKyAgICBUUkFDRSgiUXVlcnlWZXJzaW9uLi4uIHJldHVybiBUcnVlIik7CisgICAgcmV0dXJuIFRydWU7Cit9CisKK0Jvb2wKK3VuaURSSVF1ZXJ5RGlyZWN0UmVuZGVyaW5nQ2FwYWJsZShkcHksIHNjcmVlbiwgaXNDYXBhYmxlKQorICAgIERpc3BsYXkgKmRweTsKKyAgICBpbnQgc2NyZWVuOworICAgIEJvb2wgKmlzQ2FwYWJsZTsKK3sKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkoZHB5KTsKKyAgICB4WEY4NkRSSVF1ZXJ5RGlyZWN0UmVuZGVyaW5nQ2FwYWJsZVJlcGx5IHJlcDsKKyAgICB4WEY4NkRSSVF1ZXJ5RGlyZWN0UmVuZGVyaW5nQ2FwYWJsZVJlcSAqcmVxOworCisgICAgVFJBQ0UoIlF1ZXJ5RGlyZWN0UmVuZGVyaW5nQ2FwYWJsZS4uLiIpOworICAgIHVuaURSSUNoZWNrRXh0ZW5zaW9uKGRweSwgaW5mbywgRmFsc2UpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoWEY4NkRSSVF1ZXJ5RGlyZWN0UmVuZGVyaW5nQ2FwYWJsZSwgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+ZHJpUmVxVHlwZSA9IFhfWEY4NkRSSVF1ZXJ5RGlyZWN0UmVuZGVyaW5nQ2FwYWJsZTsKKyAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICBpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopICYgcmVwLCAwLCB4RmFsc2UpKSB7CisJVW5sb2NrRGlzcGxheShkcHkpOworCVN5bmNIYW5kbGUoKTsKKwlUUkFDRSgiUXVlcnlEaXJlY3RSZW5kZXJpbmdDYXBhYmxlLi4uIHJldHVybiBGYWxzZSIpOworCXJldHVybiBGYWxzZTsKKyAgICB9CisgICAgKmlzQ2FwYWJsZSA9IHJlcC5pc0NhcGFibGU7CisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKyAgICBUUkFDRSgiUXVlcnlEaXJlY3RSZW5kZXJpbmdDYXBhYmxlLi4uIHJldHVybiBUcnVlIik7CisgICAgcmV0dXJuIFRydWU7Cit9CisKK0Jvb2wKK3VuaURSSU9wZW5Db25uZWN0aW9uKGRweSwgc2NyZWVuLCBoU0FSRUEsIGJ1c0lkU3RyaW5nKQorICAgIERpc3BsYXkgKmRweTsKKyAgICBpbnQgc2NyZWVuOworICAgIGRybV9oYW5kbGVfdCAqaFNBUkVBOworICAgIGNoYXIgKipidXNJZFN0cmluZzsKK3sKKyAgICBYRXh0RGlzcGxheUluZm8gKmluZm8gPSBmaW5kX2Rpc3BsYXkoZHB5KTsKKyAgICB4WEY4NkRSSU9wZW5Db25uZWN0aW9uUmVwbHkgcmVwOworICAgIHhYRjg2RFJJT3BlbkNvbm5lY3Rpb25SZXEgKnJlcTsKKworICAgIFRSQUNFKCJPcGVuQ29ubmVjdGlvbi4uLiIpOworICAgIHVuaURSSUNoZWNrRXh0ZW5zaW9uKGRweSwgaW5mbywgRmFsc2UpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoWEY4NkRSSU9wZW5Db25uZWN0aW9uLCByZXEpOworICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisgICAgcmVxLT5kcmlSZXFUeXBlID0gWF9YRjg2RFJJT3BlbkNvbm5lY3Rpb247CisgICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47CisgICAgaWYgKCFfWFJlcGx5KGRweSwgKHhSZXBseSAqKSAmIHJlcCwgMCwgeEZhbHNlKSkgeworCVVubG9ja0Rpc3BsYXkoZHB5KTsKKwlTeW5jSGFuZGxlKCk7CisJVFJBQ0UoIk9wZW5Db25uZWN0aW9uLi4uIHJldHVybiBGYWxzZSIpOworCXJldHVybiBGYWxzZTsKKyAgICB9CisKKyAgICAqaFNBUkVBID0gcmVwLmhTQVJFQUxvdzsKKyNpZmRlZiBMT05HNjQKKyAgICBpZiAoc2l6ZW9mKGRybV9oYW5kbGVfdCkgPT0gOCkgeworCSpoU0FSRUEgfD0gKCh1bnNpZ25lZCBsb25nKXJlcC5oU0FSRUFIaWdoKSA8PCAzMjsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAocmVwLmxlbmd0aCkgeworCWlmICghKCpidXNJZFN0cmluZyA9IChjaGFyICopWGNhbGxvYyhyZXAuYnVzSWRTdHJpbmdMZW5ndGggKyAxLCAxKSkpIHsKKwkgICAgX1hFYXREYXRhKGRweSwgKChyZXAuYnVzSWRTdHJpbmdMZW5ndGggKyAzKSAmIH4zKSk7CisJICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKwkgICAgU3luY0hhbmRsZSgpOworCSAgICBUUkFDRSgiT3BlbkNvbm5lY3Rpb24uLi4gcmV0dXJuIEZhbHNlIik7CisJICAgIHJldHVybiBGYWxzZTsKKwl9CisJX1hSZWFkUGFkKGRweSwgKmJ1c0lkU3RyaW5nLCByZXAuYnVzSWRTdHJpbmdMZW5ndGgpOworICAgIH0gZWxzZSB7CisJKmJ1c0lkU3RyaW5nID0gTlVMTDsKKyAgICB9CisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKyAgICBUUkFDRSgiT3BlbkNvbm5lY3Rpb24uLi4gcmV0dXJuIFRydWUiKTsKKyAgICByZXR1cm4gVHJ1ZTsKK30KKworQm9vbAordW5pRFJJQXV0aENvbm5lY3Rpb24oZHB5LCBzY3JlZW4sIG1hZ2ljKQorICAgIERpc3BsYXkgKmRweTsKKyAgICBpbnQgc2NyZWVuOworICAgIGRybV9tYWdpY190IG1hZ2ljOworeworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheShkcHkpOworICAgIHhYRjg2RFJJQXV0aENvbm5lY3Rpb25SZXEgKnJlcTsKKyAgICB4WEY4NkRSSUF1dGhDb25uZWN0aW9uUmVwbHkgcmVwOworCisgICAgVFJBQ0UoIkF1dGhDb25uZWN0aW9uLi4uIik7CisgICAgdW5pRFJJQ2hlY2tFeHRlbnNpb24oZHB5LCBpbmZvLCBGYWxzZSk7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShYRjg2RFJJQXV0aENvbm5lY3Rpb24sIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPmRyaVJlcVR5cGUgPSBYX1hGODZEUklBdXRoQ29ubmVjdGlvbjsKKyAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICByZXEtPm1hZ2ljID0gbWFnaWM7CisgICAgcmVwLmF1dGhlbnRpY2F0ZWQgPSAwOworICAgIGlmICghX1hSZXBseShkcHksICh4UmVwbHkgKikgJiByZXAsIDAsIHhGYWxzZSkgfHwgIXJlcC5hdXRoZW50aWNhdGVkKSB7CisJVW5sb2NrRGlzcGxheShkcHkpOworCVN5bmNIYW5kbGUoKTsKKwlUUkFDRSgiQXV0aENvbm5lY3Rpb24uLi4gcmV0dXJuIEZhbHNlIik7CisJcmV0dXJuIEZhbHNlOworICAgIH0KKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworICAgIFRSQUNFKCJBdXRoQ29ubmVjdGlvbi4uLiByZXR1cm4gVHJ1ZSIpOworICAgIHJldHVybiBUcnVlOworfQorCitCb29sCit1bmlEUklDbG9zZUNvbm5lY3Rpb24oZHB5LCBzY3JlZW4pCisgICAgRGlzcGxheSAqZHB5OworICAgIGludCBzY3JlZW47Cit7CisgICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gZmluZF9kaXNwbGF5KGRweSk7CisgICAgeFhGODZEUklDbG9zZUNvbm5lY3Rpb25SZXEgKnJlcTsKKworICAgIFRSQUNFKCJDbG9zZUNvbm5lY3Rpb24uLi4iKTsKKworICAgIHVuaURSSUNoZWNrRXh0ZW5zaW9uKGRweSwgaW5mbywgRmFsc2UpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoWEY4NkRSSUNsb3NlQ29ubmVjdGlvbiwgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+ZHJpUmVxVHlwZSA9IFhfWEY4NkRSSUNsb3NlQ29ubmVjdGlvbjsKKyAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworICAgIFRSQUNFKCJDbG9zZUNvbm5lY3Rpb24uLi4gcmV0dXJuIFRydWUiKTsKKyAgICByZXR1cm4gVHJ1ZTsKK30KKworQm9vbAordW5pRFJJR2V0Q2xpZW50RHJpdmVyTmFtZShkcHksIHNjcmVlbiwgZGR4RHJpdmVyTWFqb3JWZXJzaW9uLAorICAgIGRkeERyaXZlck1pbm9yVmVyc2lvbiwgZGR4RHJpdmVyUGF0Y2hWZXJzaW9uLCBjbGllbnREcml2ZXJOYW1lKQorICAgIERpc3BsYXkgKmRweTsKKyAgICBpbnQgc2NyZWVuOworICAgIGludCAqZGR4RHJpdmVyTWFqb3JWZXJzaW9uOworICAgIGludCAqZGR4RHJpdmVyTWlub3JWZXJzaW9uOworICAgIGludCAqZGR4RHJpdmVyUGF0Y2hWZXJzaW9uOworICAgIGNoYXIgKipjbGllbnREcml2ZXJOYW1lOworeworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheShkcHkpOworICAgIHhYRjg2RFJJR2V0Q2xpZW50RHJpdmVyTmFtZVJlcGx5IHJlcDsKKyAgICB4WEY4NkRSSUdldENsaWVudERyaXZlck5hbWVSZXEgKnJlcTsKKworICAgIFRSQUNFKCJHZXRDbGllbnREcml2ZXJOYW1lLi4uIik7CisgICAgdW5pRFJJQ2hlY2tFeHRlbnNpb24oZHB5LCBpbmZvLCBGYWxzZSk7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShYRjg2RFJJR2V0Q2xpZW50RHJpdmVyTmFtZSwgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+ZHJpUmVxVHlwZSA9IFhfWEY4NkRSSUdldENsaWVudERyaXZlck5hbWU7CisgICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47CisgICAgaWYgKCFfWFJlcGx5KGRweSwgKHhSZXBseSAqKSAmIHJlcCwgMCwgeEZhbHNlKSkgeworCVVubG9ja0Rpc3BsYXkoZHB5KTsKKwlTeW5jSGFuZGxlKCk7CisJVFJBQ0UoIkdldENsaWVudERyaXZlck5hbWUuLi4gcmV0dXJuIEZhbHNlIik7CisJcmV0dXJuIEZhbHNlOworICAgIH0KKworICAgICpkZHhEcml2ZXJNYWpvclZlcnNpb24gPSByZXAuZGR4RHJpdmVyTWFqb3JWZXJzaW9uOworICAgICpkZHhEcml2ZXJNaW5vclZlcnNpb24gPSByZXAuZGR4RHJpdmVyTWlub3JWZXJzaW9uOworICAgICpkZHhEcml2ZXJQYXRjaFZlcnNpb24gPSByZXAuZGR4RHJpdmVyUGF0Y2hWZXJzaW9uOworCisgICAgaWYgKHJlcC5sZW5ndGgpIHsKKwlpZiAoISgqY2xpZW50RHJpdmVyTmFtZSA9CisJCShjaGFyICopWGNhbGxvYyhyZXAuY2xpZW50RHJpdmVyTmFtZUxlbmd0aCArIDEsIDEpKSkgeworCSAgICBfWEVhdERhdGEoZHB5LCAoKHJlcC5jbGllbnREcml2ZXJOYW1lTGVuZ3RoICsgMykgJiB+MykpOworCSAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisJICAgIFN5bmNIYW5kbGUoKTsKKwkgICAgVFJBQ0UoIkdldENsaWVudERyaXZlck5hbWUuLi4gcmV0dXJuIEZhbHNlIik7CisJICAgIHJldHVybiBGYWxzZTsKKwl9CisJX1hSZWFkUGFkKGRweSwgKmNsaWVudERyaXZlck5hbWUsIHJlcC5jbGllbnREcml2ZXJOYW1lTGVuZ3RoKTsKKyAgICB9IGVsc2UgeworCSpjbGllbnREcml2ZXJOYW1lID0gTlVMTDsKKyAgICB9CisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKyAgICBUUkFDRSgiR2V0Q2xpZW50RHJpdmVyTmFtZS4uLiByZXR1cm4gVHJ1ZSIpOworICAgIHJldHVybiBUcnVlOworfQorCitCb29sCit1bmlEUklDcmVhdGVDb250ZXh0V2l0aENvbmZpZyhkcHksIHNjcmVlbiwgY29uZmlnSUQsIGNvbnRleHQsIGhIV0NvbnRleHQpCisgICAgRGlzcGxheSAqZHB5OworICAgIGludCBzY3JlZW47CisgICAgaW50IGNvbmZpZ0lEOworICAgIFhJRCAqY29udGV4dDsKKyAgICBkcm1fY29udGV4dF90ICpoSFdDb250ZXh0OworeworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheShkcHkpOworICAgIHhYRjg2RFJJQ3JlYXRlQ29udGV4dFJlcGx5IHJlcDsKKyAgICB4WEY4NkRSSUNyZWF0ZUNvbnRleHRSZXEgKnJlcTsKKworICAgIFRSQUNFKCJDcmVhdGVDb250ZXh0Li4uIik7CisgICAgdW5pRFJJQ2hlY2tFeHRlbnNpb24oZHB5LCBpbmZvLCBGYWxzZSk7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShYRjg2RFJJQ3JlYXRlQ29udGV4dCwgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+ZHJpUmVxVHlwZSA9IFhfWEY4NkRSSUNyZWF0ZUNvbnRleHQ7CisgICAgcmVxLT52aXN1YWwgPSBjb25maWdJRDsKKyAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICAqY29udGV4dCA9IFhBbGxvY0lEKGRweSk7CisgICAgcmVxLT5jb250ZXh0ID0gKmNvbnRleHQ7CisgICAgaWYgKCFfWFJlcGx5KGRweSwgKHhSZXBseSAqKSAmIHJlcCwgMCwgeEZhbHNlKSkgeworCVVubG9ja0Rpc3BsYXkoZHB5KTsKKwlTeW5jSGFuZGxlKCk7CisJVFJBQ0UoIkNyZWF0ZUNvbnRleHQuLi4gcmV0dXJuIEZhbHNlIik7CisJcmV0dXJuIEZhbHNlOworICAgIH0KKyAgICAqaEhXQ29udGV4dCA9IHJlcC5oSFdDb250ZXh0OworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgVFJBQ0UoIkNyZWF0ZUNvbnRleHQuLi4gcmV0dXJuIFRydWUiKTsKKyAgICByZXR1cm4gVHJ1ZTsKK30KKworQm9vbAordW5pRFJJQ3JlYXRlQ29udGV4dChkcHksIHNjcmVlbiwgdmlzdWFsLCBjb250ZXh0LCBoSFdDb250ZXh0KQorICAgIERpc3BsYXkgKmRweTsKKyAgICBpbnQgc2NyZWVuOworICAgIFZpc3VhbCAqdmlzdWFsOworICAgIFhJRCAqY29udGV4dDsKKyAgICBkcm1fY29udGV4dF90ICpoSFdDb250ZXh0OworeworICAgIHJldHVybiB1bmlEUklDcmVhdGVDb250ZXh0V2l0aENvbmZpZyhkcHksIHNjcmVlbiwgdmlzdWFsLT52aXN1YWxpZCwKKwljb250ZXh0LCBoSFdDb250ZXh0KTsKK30KKworQm9vbAordW5pRFJJRGVzdHJveUNvbnRleHQoRGlzcGxheSAqIG5kcHksIGludCBzY3JlZW4sIFhJRCBjb250ZXh0KQoreworICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IChEaXNwbGF5ICopIG5kcHk7CisgICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gZmluZF9kaXNwbGF5KGRweSk7CisgICAgeFhGODZEUklEZXN0cm95Q29udGV4dFJlcSAqcmVxOworCisgICAgVFJBQ0UoIkRlc3Ryb3lDb250ZXh0Li4uIik7CisgICAgdW5pRFJJQ2hlY2tFeHRlbnNpb24oZHB5LCBpbmZvLCBGYWxzZSk7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShYRjg2RFJJRGVzdHJveUNvbnRleHQsIHJlcSk7CisgICAgcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsKKyAgICByZXEtPmRyaVJlcVR5cGUgPSBYX1hGODZEUklEZXN0cm95Q29udGV4dDsKKyAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICByZXEtPmNvbnRleHQgPSBjb250ZXh0OworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgVFJBQ0UoIkRlc3Ryb3lDb250ZXh0Li4uIHJldHVybiBUcnVlIik7CisgICAgcmV0dXJuIFRydWU7Cit9CisKK0Jvb2wKK3VuaURSSUNyZWF0ZURyYXdhYmxlKERpc3BsYXkgKiBuZHB5LCBpbnQgc2NyZWVuLAorICAgIERyYXdhYmxlIGRyYXdhYmxlLCBkcm1fZHJhd2FibGVfdCAqIGhIV0RyYXdhYmxlKQoreworICAgIERpc3BsYXkgKmNvbnN0IGRweSA9IChEaXNwbGF5ICopIG5kcHk7CisgICAgWEV4dERpc3BsYXlJbmZvICppbmZvID0gZmluZF9kaXNwbGF5KGRweSk7CisgICAgeFhGODZEUklDcmVhdGVEcmF3YWJsZVJlcGx5IHJlcDsKKyAgICB4WEY4NkRSSUNyZWF0ZURyYXdhYmxlUmVxICpyZXE7CisKKyAgICBUUkFDRSgiQ3JlYXRlRHJhd2FibGUuLi4iKTsKKyAgICB1bmlEUklDaGVja0V4dGVuc2lvbihkcHksIGluZm8sIEZhbHNlKTsKKworICAgIExvY2tEaXNwbGF5KGRweSk7CisgICAgR2V0UmVxKFhGODZEUklDcmVhdGVEcmF3YWJsZSwgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+ZHJpUmVxVHlwZSA9IFhfWEY4NkRSSUNyZWF0ZURyYXdhYmxlOworICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworICAgIHJlcS0+ZHJhd2FibGUgPSBkcmF3YWJsZTsKKyAgICBpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopICYgcmVwLCAwLCB4RmFsc2UpKSB7CisJVW5sb2NrRGlzcGxheShkcHkpOworCVN5bmNIYW5kbGUoKTsKKwlUUkFDRSgiQ3JlYXRlRHJhd2FibGUuLi4gcmV0dXJuIEZhbHNlIik7CisJcmV0dXJuIEZhbHNlOworICAgIH0KKyAgICAqaEhXRHJhd2FibGUgPSByZXAuaEhXRHJhd2FibGU7CisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKyAgICBUUkFDRSgiQ3JlYXRlRHJhd2FibGUuLi4gcmV0dXJuIFRydWUiKTsKKyAgICByZXR1cm4gVHJ1ZTsKK30KKworQm9vbAordW5pRFJJRGVzdHJveURyYXdhYmxlKERpc3BsYXkgKiBuZHB5LCBpbnQgc2NyZWVuLCBEcmF3YWJsZSBkcmF3YWJsZSkKK3sKKyAgICBEaXNwbGF5ICpjb25zdCBkcHkgPSAoRGlzcGxheSAqKSBuZHB5OworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheShkcHkpOworICAgIHhYRjg2RFJJRGVzdHJveURyYXdhYmxlUmVxICpyZXE7CisKKyAgICBUUkFDRSgiRGVzdHJveURyYXdhYmxlLi4uIik7CisgICAgdW5pRFJJQ2hlY2tFeHRlbnNpb24oZHB5LCBpbmZvLCBGYWxzZSk7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShYRjg2RFJJRGVzdHJveURyYXdhYmxlLCByZXEpOworICAgIHJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7CisgICAgcmVxLT5kcmlSZXFUeXBlID0gWF9YRjg2RFJJRGVzdHJveURyYXdhYmxlOworICAgIHJlcS0+c2NyZWVuID0gc2NyZWVuOworICAgIHJlcS0+ZHJhd2FibGUgPSBkcmF3YWJsZTsKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworICAgIFRSQUNFKCJEZXN0cm95RHJhd2FibGUuLi4gcmV0dXJuIFRydWUiKTsKKyAgICByZXR1cm4gVHJ1ZTsKK30KKworQm9vbAordW5pRFJJR2V0RHJhd2FibGVJbmZvKERpc3BsYXkgKiBkcHksIGludCBzY3JlZW4sIERyYXdhYmxlIGRyYXdhYmxlLAorICAgIHVuc2lnbmVkIGludCAqaW5kZXgsIHVuc2lnbmVkIGludCAqc3RhbXAsCisgICAgaW50ICpYLCBpbnQgKlksIGludCAqVywgaW50ICpILAorICAgIGludCAqbnVtQ2xpcFJlY3RzLCBkcm1fY2xpcF9yZWN0X3QgKiogcENsaXBSZWN0cywKKyAgICBpbnQgKmJhY2tYLCBpbnQgKmJhY2tZLAorICAgIGludCAqbnVtQmFja0NsaXBSZWN0cywgZHJtX2NsaXBfcmVjdF90ICoqIHBCYWNrQ2xpcFJlY3RzKQoreworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheShkcHkpOworICAgIHhYRjg2RFJJR2V0RHJhd2FibGVJbmZvUmVwbHkgcmVwOworICAgIHhYRjg2RFJJR2V0RHJhd2FibGVJbmZvUmVxICpyZXE7CisgICAgaW50IHRvdGFsX3JlY3RzOworCisgICAgVFJBQ0UoIkdldERyYXdhYmxlSW5mby4uLiIpOworICAgIHVuaURSSUNoZWNrRXh0ZW5zaW9uKGRweSwgaW5mbywgRmFsc2UpOworCisgICAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBHZXRSZXEoWEY4NkRSSUdldERyYXdhYmxlSW5mbywgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+ZHJpUmVxVHlwZSA9IFhfWEY4NkRSSUdldERyYXdhYmxlSW5mbzsKKyAgICByZXEtPnNjcmVlbiA9IHNjcmVlbjsKKyAgICByZXEtPmRyYXdhYmxlID0gZHJhd2FibGU7CisKKyAgICBpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopICYgcmVwLCAxLCB4RmFsc2UpKSB7CisJVW5sb2NrRGlzcGxheShkcHkpOworCVN5bmNIYW5kbGUoKTsKKwlUUkFDRSgiR2V0RHJhd2FibGVJbmZvLi4uIHJldHVybiBGYWxzZSIpOworCXJldHVybiBGYWxzZTsKKyAgICB9CisgICAgKmluZGV4ID0gcmVwLmRyYXdhYmxlVGFibGVJbmRleDsKKyAgICAqc3RhbXAgPSByZXAuZHJhd2FibGVUYWJsZVN0YW1wOworICAgICpYID0gKGludClyZXAuZHJhd2FibGVYOworICAgICpZID0gKGludClyZXAuZHJhd2FibGVZOworICAgICpXID0gKGludClyZXAuZHJhd2FibGVXaWR0aDsKKyAgICAqSCA9IChpbnQpcmVwLmRyYXdhYmxlSGVpZ2h0OworICAgICpudW1DbGlwUmVjdHMgPSByZXAubnVtQ2xpcFJlY3RzOworICAgIHRvdGFsX3JlY3RzID0gKm51bUNsaXBSZWN0czsKKworICAgICpiYWNrWCA9IHJlcC5iYWNrWDsKKyAgICAqYmFja1kgPSByZXAuYmFja1k7CisgICAgKm51bUJhY2tDbGlwUmVjdHMgPSByZXAubnVtQmFja0NsaXBSZWN0czsKKyAgICB0b3RhbF9yZWN0cyArPSAqbnVtQmFja0NsaXBSZWN0czsKKworI2lmIDAKKyAgICAvKiBCZWNhdXNlIG9mIHRoZSBmaXggaW4gWHNlcnZlci9HTC9kcmkveGY4NmRyaS5jLCB0aGlzIGNoZWNrIGJyZWFrcworICAgICAqIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IChCZWNhdXNlIG9mIHRoZSA+PiAyIHNoaWZ0KSBidXQgdGhlIGZpeAorICAgICAqIGVuYWJsZXMgbXVsdGktdGhyZWFkZWQgYXBwcyB0byB3b3JrLgorICAgICAqLworICAgIGlmIChyZXAubGVuZ3RoICE9ICgoKChTSVpFT0YoeFhGODZEUklHZXREcmF3YWJsZUluZm9SZXBseSkgLQorCQkJU0laRU9GKHhHZW5lcmljUmVwbHkpICsKKwkJCXRvdGFsX3JlY3RzICogc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCkpICsKKwkJICAgIDMpICYgfjMpID4+IDIpKSB7CisJX1hFYXREYXRhKGRweSwgcmVwLmxlbmd0aCk7CisJVW5sb2NrRGlzcGxheShkcHkpOworCVN5bmNIYW5kbGUoKTsKKwlUUkFDRSgiR2V0RHJhd2FibGVJbmZvLi4uIHJldHVybiBGYWxzZSIpOworCXJldHVybiBGYWxzZTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICgqbnVtQ2xpcFJlY3RzKSB7CisJaW50IGxlbiA9IHNpemVvZihkcm1fY2xpcF9yZWN0X3QpICogKCpudW1DbGlwUmVjdHMpOworCisJKnBDbGlwUmVjdHMgPSAoZHJtX2NsaXBfcmVjdF90ICopIFhjYWxsb2MobGVuLCAxKTsKKwlpZiAoKnBDbGlwUmVjdHMpCisJICAgIF9YUmVhZChkcHksIChjaGFyICopKnBDbGlwUmVjdHMsIGxlbik7CisgICAgfSBlbHNlIHsKKwkqcENsaXBSZWN0cyA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKCpudW1CYWNrQ2xpcFJlY3RzKSB7CisJaW50IGxlbiA9IHNpemVvZihkcm1fY2xpcF9yZWN0X3QpICogKCpudW1CYWNrQ2xpcFJlY3RzKTsKKworCSpwQmFja0NsaXBSZWN0cyA9IChkcm1fY2xpcF9yZWN0X3QgKikgWGNhbGxvYyhsZW4sIDEpOworCWlmICgqcEJhY2tDbGlwUmVjdHMpCisJICAgIF9YUmVhZChkcHksIChjaGFyICopKnBCYWNrQ2xpcFJlY3RzLCBsZW4pOworICAgIH0gZWxzZSB7CisJKnBCYWNrQ2xpcFJlY3RzID0gTlVMTDsKKyAgICB9CisKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworICAgIFRSQUNFKCJHZXREcmF3YWJsZUluZm8uLi4gcmV0dXJuIFRydWUiKTsKKyAgICByZXR1cm4gVHJ1ZTsKK30KKworQm9vbAordW5pRFJJR2V0RGV2aWNlSW5mbyhkcHksIHNjcmVlbiwgaEZyYW1lQnVmZmVyLAorICAgIGZiT3JpZ2luLCBmYlNpemUsIGZiU3RyaWRlLCBkZXZQcml2YXRlU2l6ZSwgcERldlByaXZhdGUpCisgICAgRGlzcGxheSAqZHB5OworICAgIGludCBzY3JlZW47CisgICAgZHJtX2hhbmRsZV90ICpoRnJhbWVCdWZmZXI7CisgICAgaW50ICpmYk9yaWdpbjsKKyAgICBpbnQgKmZiU2l6ZTsKKyAgICBpbnQgKmZiU3RyaWRlOworICAgIGludCAqZGV2UHJpdmF0ZVNpemU7CisgICAgdm9pZCAqKnBEZXZQcml2YXRlOworeworICAgIFhFeHREaXNwbGF5SW5mbyAqaW5mbyA9IGZpbmRfZGlzcGxheShkcHkpOworICAgIHhYRjg2RFJJR2V0RGV2aWNlSW5mb1JlcGx5IHJlcDsKKyAgICB4WEY4NkRSSUdldERldmljZUluZm9SZXEgKnJlcTsKKworICAgIFRSQUNFKCJHZXREZXZpY2VJbmZvLi4uIik7CisgICAgdW5pRFJJQ2hlY2tFeHRlbnNpb24oZHB5LCBpbmZvLCBGYWxzZSk7CisKKyAgICBMb2NrRGlzcGxheShkcHkpOworICAgIEdldFJlcShYRjg2RFJJR2V0RGV2aWNlSW5mbywgcmVxKTsKKyAgICByZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICAgIHJlcS0+ZHJpUmVxVHlwZSA9IFhfWEY4NkRSSUdldERldmljZUluZm87CisgICAgcmVxLT5zY3JlZW4gPSBzY3JlZW47CisgICAgaWYgKCFfWFJlcGx5KGRweSwgKHhSZXBseSAqKSAmIHJlcCwgMCwgeEZhbHNlKSkgeworCVVubG9ja0Rpc3BsYXkoZHB5KTsKKwlTeW5jSGFuZGxlKCk7CisJVFJBQ0UoIkdldERldmljZUluZm8uLi4gcmV0dXJuIEZhbHNlIik7CisJcmV0dXJuIEZhbHNlOworICAgIH0KKworICAgICpoRnJhbWVCdWZmZXIgPSByZXAuaEZyYW1lQnVmZmVyTG93OworI2lmZGVmIExPTkc2NAorICAgIGlmIChzaXplb2YoZHJtX2hhbmRsZV90KSA9PSA4KSB7CisJKmhGcmFtZUJ1ZmZlciB8PSAoKHVuc2lnbmVkIGxvbmcpcmVwLmhGcmFtZUJ1ZmZlckhpZ2gpIDw8IDMyOworICAgIH0KKyNlbmRpZgorCisgICAgKmZiT3JpZ2luID0gcmVwLmZyYW1lYnVmZmVyT3JpZ2luOworICAgICpmYlNpemUgPSByZXAuZnJhbWVidWZmZXJTaXplOworICAgICpmYlN0cmlkZSA9IHJlcC5mcmFtZWJ1ZmZlclN0cmlkZTsKKyAgICAqZGV2UHJpdmF0ZVNpemUgPSByZXAuZGV2UHJpdmF0ZVNpemU7CisKKyAgICBpZiAocmVwLmxlbmd0aCkgeworCWlmICghKCpwRGV2UHJpdmF0ZSA9ICh2b2lkICopWGNhbGxvYyhyZXAuZGV2UHJpdmF0ZVNpemUsIDEpKSkgeworCSAgICBfWEVhdERhdGEoZHB5LCAoKHJlcC5kZXZQcml2YXRlU2l6ZSArIDMpICYgfjMpKTsKKwkgICAgVW5sb2NrRGlzcGxheShkcHkpOworCSAgICBTeW5jSGFuZGxlKCk7CisJICAgIFRSQUNFKCJHZXREZXZpY2VJbmZvLi4uIHJldHVybiBGYWxzZSIpOworCSAgICByZXR1cm4gRmFsc2U7CisJfQorCV9YUmVhZChkcHksIChjaGFyICopKnBEZXZQcml2YXRlLCByZXAuZGV2UHJpdmF0ZVNpemUpOworICAgIH0gZWxzZSB7CisJKnBEZXZQcml2YXRlID0gTlVMTDsKKyAgICB9CisKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworICAgIFRSQUNFKCJHZXREZXZpY2VJbmZvLi4uIHJldHVybiBUcnVlIik7CisgICAgcmV0dXJuIFRydWU7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90dG10ZXN0L3NyYy94Zjg2ZHJpLmggYi90ZXN0cy90dG10ZXN0L3NyYy94Zjg2ZHJpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZiNzg5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3R0bXRlc3Qvc3JjL3hmODZkcmkuaApAQCAtMCwwICsxLDExNiBAQAorLyogJFhGcmVlODY6IHhjL2xpYi9HTC9kcmkveGY4NmRyaS5oLHYgMS44IDIwMDIvMTAvMzAgMTI6NTE6MjUgYWxhbmggRXhwICQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk5OC0xOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KK0NvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4KK0FsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCitjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCit3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCitkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KK3RoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKK25leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCitvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCitPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCitUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFxmaWxlIHhmODZkcmkuaAorICogUHJvdG9jb2wgbnVtYmVycyBhbmQgZnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgRFJJIFggcHJvdG9jb2wuCisgKgorICogXGF1dGhvciBLZXZpbiBFLiBNYXJ0aW4gPG1hcnRpbkB2YWxpbnV4LmNvbT4KKyAqIFxhdXRob3IgSmVucyBPd2VuIDxqZW5zQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICogXGF1dGhvciBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqLworCisjaWZuZGVmIF9YRjg2RFJJX0hfCisjZGVmaW5lIF9YRjg2RFJJX0hfCisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorI2luY2x1ZGUgPGRybS9kcm0uaD4KKworI2RlZmluZSBYX1hGODZEUklRdWVyeVZlcnNpb24JCQkwCisjZGVmaW5lIFhfWEY4NkRSSVF1ZXJ5RGlyZWN0UmVuZGVyaW5nQ2FwYWJsZQkxCisjZGVmaW5lIFhfWEY4NkRSSU9wZW5Db25uZWN0aW9uCQkJMgorI2RlZmluZSBYX1hGODZEUklDbG9zZUNvbm5lY3Rpb24JCTMKKyNkZWZpbmUgWF9YRjg2RFJJR2V0Q2xpZW50RHJpdmVyTmFtZQkJNAorI2RlZmluZSBYX1hGODZEUklDcmVhdGVDb250ZXh0CQkJNQorI2RlZmluZSBYX1hGODZEUklEZXN0cm95Q29udGV4dAkJCTYKKyNkZWZpbmUgWF9YRjg2RFJJQ3JlYXRlRHJhd2FibGUJCQk3CisjZGVmaW5lIFhfWEY4NkRSSURlc3Ryb3lEcmF3YWJsZQkJOAorI2RlZmluZSBYX1hGODZEUklHZXREcmF3YWJsZUluZm8JCTkKKyNkZWZpbmUgWF9YRjg2RFJJR2V0RGV2aWNlSW5mbwkJCTEwCisjZGVmaW5lIFhfWEY4NkRSSUF1dGhDb25uZWN0aW9uICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBYX1hGODZEUklPcGVuRnVsbFNjcmVlbiAgICAgICAgICAgICAgICAgMTIJLyogRGVwcmVjYXRlZCAqLworI2RlZmluZSBYX1hGODZEUklDbG9zZUZ1bGxTY3JlZW4gICAgICAgICAgICAgICAgMTMJLyogRGVwcmVjYXRlZCAqLworCisjZGVmaW5lIFhGODZEUklOdW1iZXJFdmVudHMJCTAKKworI2RlZmluZSBYRjg2RFJJQ2xpZW50Tm90TG9jYWwJCTAKKyNkZWZpbmUgWEY4NkRSSU9wZXJhdGlvbk5vdFN1cHBvcnRlZAkxCisjZGVmaW5lIFhGODZEUklOdW1iZXJFcnJvcnMJCShYRjg2RFJJT3BlcmF0aW9uTm90U3VwcG9ydGVkICsgMSkKKworI2lmbmRlZiBfWEY4NkRSSV9TRVJWRVJfCisKK19YRlVOQ1BST1RPQkVHSU4KKyAgICBCb29sIHVuaURSSVF1ZXJ5RXh0ZW5zaW9uKERpc3BsYXkgKiBkcHksIGludCAqZXZlbnRfYmFzZSwKKyAgICBpbnQgKmVycm9yX2Jhc2UpOworCitCb29sIHVuaURSSVF1ZXJ5VmVyc2lvbihEaXNwbGF5ICogZHB5LCBpbnQgKm1ham9yVmVyc2lvbiwgaW50ICptaW5vclZlcnNpb24sCisgICAgaW50ICpwYXRjaFZlcnNpb24pOworCitCb29sIHVuaURSSVF1ZXJ5RGlyZWN0UmVuZGVyaW5nQ2FwYWJsZShEaXNwbGF5ICogZHB5LCBpbnQgc2NyZWVuLAorICAgIEJvb2wgKiBpc0NhcGFibGUpOworCitCb29sIHVuaURSSU9wZW5Db25uZWN0aW9uKERpc3BsYXkgKiBkcHksIGludCBzY3JlZW4sIGRybV9oYW5kbGVfdCAqIGhTQVJFQSwKKyAgICBjaGFyICoqYnVzSURTdHJpbmcpOworCitCb29sIHVuaURSSUF1dGhDb25uZWN0aW9uKERpc3BsYXkgKiBkcHksIGludCBzY3JlZW4sIGRybV9tYWdpY190IG1hZ2ljKTsKKworQm9vbCB1bmlEUklDbG9zZUNvbm5lY3Rpb24oRGlzcGxheSAqIGRweSwgaW50IHNjcmVlbik7CisKK0Jvb2wgdW5pRFJJR2V0Q2xpZW50RHJpdmVyTmFtZShEaXNwbGF5ICogZHB5LCBpbnQgc2NyZWVuLAorICAgIGludCAqZGR4RHJpdmVyTWFqb3JWZXJzaW9uLCBpbnQgKmRkeERyaXZlck1pbm9yVmVyc2lvbiwKKyAgICBpbnQgKmRkeERyaXZlclBhdGNoVmVyc2lvbiwgY2hhciAqKmNsaWVudERyaXZlck5hbWUpOworCitCb29sIHVuaURSSUNyZWF0ZUNvbnRleHQoRGlzcGxheSAqIGRweSwgaW50IHNjcmVlbiwgVmlzdWFsICogdmlzdWFsLAorICAgIFhJRCAqIHB0cl90b19yZXR1cm5lZF9jb250ZXh0X2lkLCBkcm1fY29udGV4dF90ICogaEhXQ29udGV4dCk7CisKK0Jvb2wgdW5pRFJJQ3JlYXRlQ29udGV4dFdpdGhDb25maWcoRGlzcGxheSAqIGRweSwgaW50IHNjcmVlbiwgaW50IGNvbmZpZ0lELAorICAgIFhJRCAqIHB0cl90b19yZXR1cm5lZF9jb250ZXh0X2lkLCBkcm1fY29udGV4dF90ICogaEhXQ29udGV4dCk7CisKK2V4dGVybiBCb29sIHVuaURSSURlc3Ryb3lDb250ZXh0KERpc3BsYXkgKiBkcHksIGludCBzY3JlZW4sIFhJRCBjb250ZXh0X2lkKTsKKworZXh0ZXJuIEJvb2wgdW5pRFJJQ3JlYXRlRHJhd2FibGUoRGlzcGxheSAqIGRweSwgaW50IHNjcmVlbiwKKyAgICBEcmF3YWJsZSBkcmF3YWJsZSwgZHJtX2RyYXdhYmxlX3QgKiBoSFdEcmF3YWJsZSk7CisKK2V4dGVybiBCb29sIHVuaURSSURlc3Ryb3lEcmF3YWJsZShEaXNwbGF5ICogZHB5LCBpbnQgc2NyZWVuLAorICAgIERyYXdhYmxlIGRyYXdhYmxlKTsKKworQm9vbCB1bmlEUklHZXREcmF3YWJsZUluZm8oRGlzcGxheSAqIGRweSwgaW50IHNjcmVlbiwgRHJhd2FibGUgZHJhd2FibGUsCisgICAgdW5zaWduZWQgaW50ICppbmRleCwgdW5zaWduZWQgaW50ICpzdGFtcCwKKyAgICBpbnQgKlgsIGludCAqWSwgaW50ICpXLCBpbnQgKkgsCisgICAgaW50ICpudW1DbGlwUmVjdHMsIGRybV9jbGlwX3JlY3RfdCAqKiBwQ2xpcFJlY3RzLAorICAgIGludCAqYmFja1gsIGludCAqYmFja1ksCisgICAgaW50ICpudW1CYWNrQ2xpcFJlY3RzLCBkcm1fY2xpcF9yZWN0X3QgKiogcEJhY2tDbGlwUmVjdHMpOworCitCb29sIHVuaURSSUdldERldmljZUluZm8oRGlzcGxheSAqIGRweSwgaW50IHNjcmVlbiwKKyAgICBkcm1faGFuZGxlX3QgKiBoRnJhbWVCdWZmZXIsIGludCAqZmJPcmlnaW4sIGludCAqZmJTaXplLAorICAgIGludCAqZmJTdHJpZGUsIGludCAqZGV2UHJpdmF0ZVNpemUsIHZvaWQgKipwRGV2UHJpdmF0ZSk7CisKK19YRlVOQ1BST1RPRU5ECisjZW5kaWYgLyogX1hGODZEUklfU0VSVkVSXyAqLworI2VuZGlmIC8qIF9YRjg2RFJJX0hfICovCmRpZmYgLS1naXQgYS90ZXN0cy90dG10ZXN0L3NyYy94Zjg2ZHJpc3RyLmggYi90ZXN0cy90dG10ZXN0L3NyYy94Zjg2ZHJpc3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I0MzQzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3R0bXRlc3Qvc3JjL3hmODZkcmlzdHIuaApAQCAtMCwwICsxLDM5MCBAQAorLyogJFhGcmVlODY6IHhjL2xpYi9HTC9kcmkveGY4NmRyaXN0ci5oLHYgMS4xMCAyMDAyLzEwLzMwIDEyOjUxOjI1IGFsYW5oIEV4cCAkICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IDE5OTgtMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCitDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuCitBbGwgUmlnaHRzIFJlc2VydmVkLgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZword2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCit0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCituZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKK0FOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKK1NPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEF1dGhvcnM6CisgKiAgIEtldmluIEUuIE1hcnRpbiA8bWFydGluQHZhbGludXguY29tPgorICogICBKZW5zIE93ZW4gPGplbnNAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKiAgIFJpY2thcmQgRS4gKFJpaykgRmlhdGggPGZhaXRoQHZhbGludXguY29tPgorICoKKyAqLworCisjaWZuZGVmIF9YRjg2RFJJU1RSX0hfCisjZGVmaW5lIF9YRjg2RFJJU1RSX0hfCisKKyNpbmNsdWRlICJ4Zjg2ZHJpLmgiCisKKyNkZWZpbmUgWEY4NkRSSU5BTUUgIlhGcmVlODYtRFJJIgorCisvKiBUaGUgRFJJIHZlcnNpb24gbnVtYmVyLiAgVGhpcyB3YXMgb3JpZ2luYWxseSBzZXQgdG8gYmUgdGhlIHNhbWUgb2YgdGhlCisgKiBYRnJlZTg2IHZlcnNpb24gbnVtYmVyLiAgSG93ZXZlciwgdGhpcyB2ZXJzaW9uIGlzIHJlYWxseSBpbmRlcGVkZW50IG9mCisgKiB0aGUgWEZyZWU4NiB2ZXJzaW9uLgorICoKKyAqIFZlcnNpb24gSGlzdG9yeToKKyAqICAgIDQuMC4wOiBPcmlnaW5hbAorICogICAgNC4wLjE6IFBhdGNoIHRvIGJ1bXAgY2xpcHN0YW1wIHdoZW4gd2luZG93cyBhcmUgZGVzdHJveWVkLCAyOCBNYXkgMDIKKyAqICAgIDQuMS4wOiBBZGQgdHJhbnNpdGlvbiBmcm9tIHNpbmdsZSB0byBtdWx0aSBpbiBEUk1JbmZvIHJlYywgMjQgSnVuIDAyCisgKi8KKyNkZWZpbmUgWEY4NkRSSV9NQUpPUl9WRVJTSU9OCTQKKyNkZWZpbmUgWEY4NkRSSV9NSU5PUl9WRVJTSU9OCTEKKyNkZWZpbmUgWEY4NkRSSV9QQVRDSF9WRVJTSU9OCTAKKwordHlwZWRlZiBzdHJ1Y3QgX1hGODZEUklRdWVyeVZlcnNpb24KK3sKKyAgICBDQVJEOCByZXFUeXBlOwkJICAgICAgIC8qIGFsd2F5cyBEUklSZXFDb2RlICovCisgICAgQ0FSRDggZHJpUmVxVHlwZTsJCSAgICAgICAvKiBhbHdheXMgWF9EUklRdWVyeVZlcnNpb24gKi8KKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKK30geFhGODZEUklRdWVyeVZlcnNpb25SZXE7CisKKyNkZWZpbmUgc3pfeFhGODZEUklRdWVyeVZlcnNpb25SZXEJNAorCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJZVEUgdHlwZTsJCQkgICAgICAgLyogWF9SZXBseSAqLworICAgIEJPT0wgcGFkMTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOworICAgIENBUkQxNiBtYWpvclZlcnNpb24gQjE2OwkgICAgICAgLyogbWFqb3IgdmVyc2lvbiBvZiBEUkkgcHJvdG9jb2wgKi8KKyAgICBDQVJEMTYgbWlub3JWZXJzaW9uIEIxNjsJICAgICAgIC8qIG1pbm9yIHZlcnNpb24gb2YgRFJJIHByb3RvY29sICovCisgICAgQ0FSRDMyIHBhdGNoVmVyc2lvbiBCMzI7CSAgICAgICAvKiBwYXRjaCB2ZXJzaW9uIG9mIERSSSBwcm90b2NvbCAqLworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIENBUkQzMiBwYWQ2IEIzMjsKK30geFhGODZEUklRdWVyeVZlcnNpb25SZXBseTsKKworI2RlZmluZSBzel94WEY4NkRSSVF1ZXJ5VmVyc2lvblJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF9YRjg2RFJJUXVlcnlEaXJlY3RSZW5kZXJpbmdDYXBhYmxlCit7CisgICAgQ0FSRDggcmVxVHlwZTsJCSAgICAgICAvKiBhbHdheXMgRFJJUmVxQ29kZSAqLworICAgIENBUkQ4IGRyaVJlcVR5cGU7CQkgICAgICAgLyogWF9EUklRdWVyeURpcmVjdFJlbmRlcmluZ0NhcGFibGUgKi8KKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIgc2NyZWVuIEIzMjsKK30geFhGODZEUklRdWVyeURpcmVjdFJlbmRlcmluZ0NhcGFibGVSZXE7CisKKyNkZWZpbmUgc3pfeFhGODZEUklRdWVyeURpcmVjdFJlbmRlcmluZ0NhcGFibGVSZXEJOAorCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJZVEUgdHlwZTsJCQkgICAgICAgLyogWF9SZXBseSAqLworICAgIEJPT0wgcGFkMTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOworICAgIEJPT0wgaXNDYXBhYmxlOworICAgIEJPT0wgcGFkMjsKKyAgICBCT09MIHBhZDM7CisgICAgQk9PTCBwYWQ0OworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgQ0FSRDMyIHBhZDcgQjMyOworICAgIENBUkQzMiBwYWQ4IEIzMjsKKyAgICBDQVJEMzIgcGFkOSBCMzI7Cit9IHhYRjg2RFJJUXVlcnlEaXJlY3RSZW5kZXJpbmdDYXBhYmxlUmVwbHk7CisKKyNkZWZpbmUgc3pfeFhGODZEUklRdWVyeURpcmVjdFJlbmRlcmluZ0NhcGFibGVSZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfWEY4NkRSSU9wZW5Db25uZWN0aW9uCit7CisgICAgQ0FSRDggcmVxVHlwZTsJCSAgICAgICAvKiBhbHdheXMgRFJJUmVxQ29kZSAqLworICAgIENBUkQ4IGRyaVJlcVR5cGU7CQkgICAgICAgLyogYWx3YXlzIFhfRFJJT3BlbkNvbm5lY3Rpb24gKi8KKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIgc2NyZWVuIEIzMjsKK30geFhGODZEUklPcGVuQ29ubmVjdGlvblJlcTsKKworI2RlZmluZSBzel94WEY4NkRSSU9wZW5Db25uZWN0aW9uUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCWVRFIHR5cGU7CQkJICAgICAgIC8qIFhfUmVwbHkgKi8KKyAgICBCT09MIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIgaFNBUkVBTG93IEIzMjsKKyAgICBDQVJEMzIgaFNBUkVBSGlnaCBCMzI7CisgICAgQ0FSRDMyIGJ1c0lkU3RyaW5nTGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgQ0FSRDMyIHBhZDcgQjMyOworICAgIENBUkQzMiBwYWQ4IEIzMjsKK30geFhGODZEUklPcGVuQ29ubmVjdGlvblJlcGx5OworCisjZGVmaW5lIHN6X3hYRjg2RFJJT3BlbkNvbm5lY3Rpb25SZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfWEY4NkRSSUF1dGhDb25uZWN0aW9uCit7CisgICAgQ0FSRDggcmVxVHlwZTsJCSAgICAgICAvKiBhbHdheXMgRFJJUmVxQ29kZSAqLworICAgIENBUkQ4IGRyaVJlcVR5cGU7CQkgICAgICAgLyogYWx3YXlzIFhfRFJJQ2xvc2VDb25uZWN0aW9uICovCisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ0FSRDMyIHNjcmVlbiBCMzI7CisgICAgQ0FSRDMyIG1hZ2ljIEIzMjsKK30geFhGODZEUklBdXRoQ29ubmVjdGlvblJlcTsKKworI2RlZmluZSBzel94WEY4NkRSSUF1dGhDb25uZWN0aW9uUmVxCTEyCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQllURSB0eXBlOworICAgIEJPT0wgcGFkMTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOworICAgIENBUkQzMiBhdXRoZW50aWNhdGVkIEIzMjsKKyAgICBDQVJEMzIgcGFkMiBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworfSB4WEY4NkRSSUF1dGhDb25uZWN0aW9uUmVwbHk7CisKKyNkZWZpbmUgenhfeFhGODZEUklBdXRoQ29ubmVjdGlvblJlcGx5ICAzMgorCit0eXBlZGVmIHN0cnVjdCBfWEY4NkRSSUNsb3NlQ29ubmVjdGlvbgoreworICAgIENBUkQ4IHJlcVR5cGU7CQkgICAgICAgLyogYWx3YXlzIERSSVJlcUNvZGUgKi8KKyAgICBDQVJEOCBkcmlSZXFUeXBlOwkJICAgICAgIC8qIGFsd2F5cyBYX0RSSUNsb3NlQ29ubmVjdGlvbiAqLworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENBUkQzMiBzY3JlZW4gQjMyOworfSB4WEY4NkRSSUNsb3NlQ29ubmVjdGlvblJlcTsKKworI2RlZmluZSBzel94WEY4NkRSSUNsb3NlQ29ubmVjdGlvblJlcQk4CisKK3R5cGVkZWYgc3RydWN0IF9YRjg2RFJJR2V0Q2xpZW50RHJpdmVyTmFtZQoreworICAgIENBUkQ4IHJlcVR5cGU7CQkgICAgICAgLyogYWx3YXlzIERSSVJlcUNvZGUgKi8KKyAgICBDQVJEOCBkcmlSZXFUeXBlOwkJICAgICAgIC8qIGFsd2F5cyBYX0RSSUdldENsaWVudERyaXZlck5hbWUgKi8KKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIgc2NyZWVuIEIzMjsKK30geFhGODZEUklHZXRDbGllbnREcml2ZXJOYW1lUmVxOworCisjZGVmaW5lIHN6X3hYRjg2RFJJR2V0Q2xpZW50RHJpdmVyTmFtZVJlcQk4CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQllURSB0eXBlOwkJCSAgICAgICAvKiBYX1JlcGx5ICovCisgICAgQk9PTCBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CisgICAgQ0FSRDMyIGRkeERyaXZlck1ham9yVmVyc2lvbiBCMzI7CisgICAgQ0FSRDMyIGRkeERyaXZlck1pbm9yVmVyc2lvbiBCMzI7CisgICAgQ0FSRDMyIGRkeERyaXZlclBhdGNoVmVyc2lvbiBCMzI7CisgICAgQ0FSRDMyIGNsaWVudERyaXZlck5hbWVMZW5ndGggQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7Cit9IHhYRjg2RFJJR2V0Q2xpZW50RHJpdmVyTmFtZVJlcGx5OworCisjZGVmaW5lIHN6X3hYRjg2RFJJR2V0Q2xpZW50RHJpdmVyTmFtZVJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF9YRjg2RFJJQ3JlYXRlQ29udGV4dAoreworICAgIENBUkQ4IHJlcVR5cGU7CQkgICAgICAgLyogYWx3YXlzIERSSVJlcUNvZGUgKi8KKyAgICBDQVJEOCBkcmlSZXFUeXBlOwkJICAgICAgIC8qIGFsd2F5cyBYX0RSSUNyZWF0ZUNvbnRleHQgKi8KKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIgc2NyZWVuIEIzMjsKKyAgICBDQVJEMzIgdmlzdWFsIEIzMjsKKyAgICBDQVJEMzIgY29udGV4dCBCMzI7Cit9IHhYRjg2RFJJQ3JlYXRlQ29udGV4dFJlcTsKKworI2RlZmluZSBzel94WEY4NkRSSUNyZWF0ZUNvbnRleHRSZXEJMTYKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCWVRFIHR5cGU7CQkJICAgICAgIC8qIFhfUmVwbHkgKi8KKyAgICBCT09MIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIgaEhXQ29udGV4dCBCMzI7CisgICAgQ0FSRDMyIHBhZDIgQjMyOworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIENBUkQzMiBwYWQ2IEIzMjsKK30geFhGODZEUklDcmVhdGVDb250ZXh0UmVwbHk7CisKKyNkZWZpbmUgc3pfeFhGODZEUklDcmVhdGVDb250ZXh0UmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX1hGODZEUklEZXN0cm95Q29udGV4dAoreworICAgIENBUkQ4IHJlcVR5cGU7CQkgICAgICAgLyogYWx3YXlzIERSSVJlcUNvZGUgKi8KKyAgICBDQVJEOCBkcmlSZXFUeXBlOwkJICAgICAgIC8qIGFsd2F5cyBYX0RSSURlc3Ryb3lDb250ZXh0ICovCisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ0FSRDMyIHNjcmVlbiBCMzI7CisgICAgQ0FSRDMyIGNvbnRleHQgQjMyOworfSB4WEY4NkRSSURlc3Ryb3lDb250ZXh0UmVxOworCisjZGVmaW5lIHN6X3hYRjg2RFJJRGVzdHJveUNvbnRleHRSZXEJMTIKKwordHlwZWRlZiBzdHJ1Y3QgX1hGODZEUklDcmVhdGVEcmF3YWJsZQoreworICAgIENBUkQ4IHJlcVR5cGU7CQkgICAgICAgLyogYWx3YXlzIERSSVJlcUNvZGUgKi8KKyAgICBDQVJEOCBkcmlSZXFUeXBlOwkJICAgICAgIC8qIGFsd2F5cyBYX0RSSUNyZWF0ZURyYXdhYmxlICovCisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ0FSRDMyIHNjcmVlbiBCMzI7CisgICAgQ0FSRDMyIGRyYXdhYmxlIEIzMjsKK30geFhGODZEUklDcmVhdGVEcmF3YWJsZVJlcTsKKworI2RlZmluZSBzel94WEY4NkRSSUNyZWF0ZURyYXdhYmxlUmVxCTEyCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQllURSB0eXBlOwkJCSAgICAgICAvKiBYX1JlcGx5ICovCisgICAgQk9PTCBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CisgICAgQ0FSRDMyIGhIV0RyYXdhYmxlIEIzMjsKKyAgICBDQVJEMzIgcGFkMiBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworfSB4WEY4NkRSSUNyZWF0ZURyYXdhYmxlUmVwbHk7CisKKyNkZWZpbmUgc3pfeFhGODZEUklDcmVhdGVEcmF3YWJsZVJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF9YRjg2RFJJRGVzdHJveURyYXdhYmxlCit7CisgICAgQ0FSRDggcmVxVHlwZTsJCSAgICAgICAvKiBhbHdheXMgRFJJUmVxQ29kZSAqLworICAgIENBUkQ4IGRyaVJlcVR5cGU7CQkgICAgICAgLyogYWx3YXlzIFhfRFJJRGVzdHJveURyYXdhYmxlICovCisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ0FSRDMyIHNjcmVlbiBCMzI7CisgICAgQ0FSRDMyIGRyYXdhYmxlIEIzMjsKK30geFhGODZEUklEZXN0cm95RHJhd2FibGVSZXE7CisKKyNkZWZpbmUgc3pfeFhGODZEUklEZXN0cm95RHJhd2FibGVSZXEJMTIKKwordHlwZWRlZiBzdHJ1Y3QgX1hGODZEUklHZXREcmF3YWJsZUluZm8KK3sKKyAgICBDQVJEOCByZXFUeXBlOwkJICAgICAgIC8qIGFsd2F5cyBEUklSZXFDb2RlICovCisgICAgQ0FSRDggZHJpUmVxVHlwZTsJCSAgICAgICAvKiBhbHdheXMgWF9EUklHZXREcmF3YWJsZUluZm8gKi8KKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIgc2NyZWVuIEIzMjsKKyAgICBDQVJEMzIgZHJhd2FibGUgQjMyOworfSB4WEY4NkRSSUdldERyYXdhYmxlSW5mb1JlcTsKKworI2RlZmluZSBzel94WEY4NkRSSUdldERyYXdhYmxlSW5mb1JlcQkxMgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJZVEUgdHlwZTsJCQkgICAgICAgLyogWF9SZXBseSAqLworICAgIEJPT0wgcGFkMTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOworICAgIENBUkQzMiBkcmF3YWJsZVRhYmxlSW5kZXggQjMyOworICAgIENBUkQzMiBkcmF3YWJsZVRhYmxlU3RhbXAgQjMyOworICAgIElOVDE2IGRyYXdhYmxlWCBCMTY7CisgICAgSU5UMTYgZHJhd2FibGVZIEIxNjsKKyAgICBJTlQxNiBkcmF3YWJsZVdpZHRoIEIxNjsKKyAgICBJTlQxNiBkcmF3YWJsZUhlaWdodCBCMTY7CisgICAgQ0FSRDMyIG51bUNsaXBSZWN0cyBCMzI7CisgICAgSU5UMTYgYmFja1ggQjE2OworICAgIElOVDE2IGJhY2tZIEIxNjsKKyAgICBDQVJEMzIgbnVtQmFja0NsaXBSZWN0cyBCMzI7Cit9IHhYRjg2RFJJR2V0RHJhd2FibGVJbmZvUmVwbHk7CisKKyNkZWZpbmUgc3pfeFhGODZEUklHZXREcmF3YWJsZUluZm9SZXBseQkzNgorCit0eXBlZGVmIHN0cnVjdCBfWEY4NkRSSUdldERldmljZUluZm8KK3sKKyAgICBDQVJEOCByZXFUeXBlOwkJICAgICAgIC8qIGFsd2F5cyBEUklSZXFDb2RlICovCisgICAgQ0FSRDggZHJpUmVxVHlwZTsJCSAgICAgICAvKiBhbHdheXMgWF9EUklHZXREZXZpY2VJbmZvICovCisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ0FSRDMyIHNjcmVlbiBCMzI7Cit9IHhYRjg2RFJJR2V0RGV2aWNlSW5mb1JlcTsKKworI2RlZmluZSBzel94WEY4NkRSSUdldERldmljZUluZm9SZXEJOAorCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJZVEUgdHlwZTsJCQkgICAgICAgLyogWF9SZXBseSAqLworICAgIEJPT0wgcGFkMTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOworICAgIENBUkQzMiBoRnJhbWVCdWZmZXJMb3cgQjMyOworICAgIENBUkQzMiBoRnJhbWVCdWZmZXJIaWdoIEIzMjsKKyAgICBDQVJEMzIgZnJhbWVidWZmZXJPcmlnaW4gQjMyOworICAgIENBUkQzMiBmcmFtZWJ1ZmZlclNpemUgQjMyOworICAgIENBUkQzMiBmcmFtZWJ1ZmZlclN0cmlkZSBCMzI7CisgICAgQ0FSRDMyIGRldlByaXZhdGVTaXplIEIzMjsKK30geFhGODZEUklHZXREZXZpY2VJbmZvUmVwbHk7CisKKyNkZWZpbmUgc3pfeFhGODZEUklHZXREZXZpY2VJbmZvUmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX1hGODZEUklPcGVuRnVsbFNjcmVlbgoreworICAgIENBUkQ4IHJlcVR5cGU7CQkgICAgICAgLyogYWx3YXlzIERSSVJlcUNvZGUgKi8KKyAgICBDQVJEOCBkcmlSZXFUeXBlOwkJICAgICAgIC8qIGFsd2F5cyBYX0RSSU9wZW5GdWxsU2NyZWVuICovCisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ0FSRDMyIHNjcmVlbiBCMzI7CisgICAgQ0FSRDMyIGRyYXdhYmxlIEIzMjsKK30geFhGODZEUklPcGVuRnVsbFNjcmVlblJlcTsKKworI2RlZmluZSBzel94WEY4NkRSSU9wZW5GdWxsU2NyZWVuUmVxICAgIDEyCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQllURSB0eXBlOworICAgIEJPT0wgcGFkMTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOworICAgIENBUkQzMiBpc0Z1bGxTY3JlZW4gQjMyOworICAgIENBUkQzMiBwYWQyIEIzMjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7Cit9IHhYRjg2RFJJT3BlbkZ1bGxTY3JlZW5SZXBseTsKKworI2RlZmluZSBzel94WEY4NkRSSU9wZW5GdWxsU2NyZWVuUmVwbHkgIDMyCisKK3R5cGVkZWYgc3RydWN0IF9YRjg2RFJJQ2xvc2VGdWxsU2NyZWVuCit7CisgICAgQ0FSRDggcmVxVHlwZTsJCSAgICAgICAvKiBhbHdheXMgRFJJUmVxQ29kZSAqLworICAgIENBUkQ4IGRyaVJlcVR5cGU7CQkgICAgICAgLyogYWx3YXlzIFhfRFJJQ2xvc2VGdWxsU2NyZWVuICovCisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ0FSRDMyIHNjcmVlbiBCMzI7CisgICAgQ0FSRDMyIGRyYXdhYmxlIEIzMjsKK30geFhGODZEUklDbG9zZUZ1bGxTY3JlZW5SZXE7CisKKyNkZWZpbmUgc3pfeFhGODZEUklDbG9zZUZ1bGxTY3JlZW5SZXEgICAxMgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJZVEUgdHlwZTsKKyAgICBCT09MIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIgcGFkMiBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIENBUkQzMiBwYWQ3IEIzMjsKK30geFhGODZEUklDbG9zZUZ1bGxTY3JlZW5SZXBseTsKKworI2RlZmluZSBzel94WEY4NkRSSUNsb3NlRnVsbFNjcmVlblJlcGx5ICAzMgorCisjZW5kaWYgLyogX1hGODZEUklTVFJfSF8gKi8KZGlmZiAtLWdpdCBhL3Rlc3RzL3V0aWwvQW5kcm9pZC5tayBiL3Rlc3RzL3V0aWwvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmVjY2I0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdXRpbC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgQ29weXJpZ2h0IMKpIDIwMTUgTlZJRElBIENvcnBvcmF0aW9uCisjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisjIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisjIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyMgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisjIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorIyBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIworIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisjIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyMgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisjIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyMgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyMgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworIyBJTiBUSEUgU09GVFdBUkUuCisjCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvTWFrZWZpbGUuc291cmNlcworCitMT0NBTF9NT0RVTEUgOj0gbGliZHJtX3V0aWwKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJkcm0KKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoVVRJTF9GSUxFUykKKworTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTElCRFJNX1RPUCkvdGVzdHMKKworaW5jbHVkZSAkKExJQkRSTV9DT01NT05fTUspCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90ZXN0cy91dGlsL01ha2VmaWxlLmFtIGIvdGVzdHMvdXRpbC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGUwYjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdXRpbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEzIEBACitpbmNsdWRlIE1ha2VmaWxlLnNvdXJjZXMKKworbm9pbnN0X0xUTElCUkFSSUVTID0gXAorCWxpYnV0aWwubGEKKworbGlidXRpbF9sYV9DUFBGTEFHUyA9IFwKKwktSSQodG9wX3NyY2RpcikvaW5jbHVkZS9kcm0gXAorCS1JJCh0b3Bfc3JjZGlyKQorCitsaWJ1dGlsX2xhX0NGTEFHUyA9IFwKKwkkKENBSVJPX0NGTEFHUykKKworbGlidXRpbF9sYV9TT1VSQ0VTID0gJChVVElMX0ZJTEVTKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdXRpbC9NYWtlZmlsZS5zb3VyY2VzIGIvdGVzdHMvdXRpbC9NYWtlZmlsZS5zb3VyY2VzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1Zjg1MTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy91dGlsL01ha2VmaWxlLnNvdXJjZXMKQEAgLTAsMCArMSw4IEBACitVVElMX0ZJTEVTIDo9IFwKKwljb21tb24uaCBcCisJZm9ybWF0LmMgXAorCWZvcm1hdC5oIFwKKwlrbXMuYyBcCisJa21zLmggXAorCXBhdHRlcm4uYyBcCisJcGF0dGVybi5oCmRpZmYgLS1naXQgYS90ZXN0cy91dGlsL2NvbW1vbi5oIGIvdGVzdHMvdXRpbC9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDU3MmMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdXRpbC9jb21tb24uaApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDggVHVuZ3N0ZW4gR3JhcGhpY3MKKyAqICAgSmFrb2IgQm9ybmVjcmFudHogPGpha29iQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICogQ29weXJpZ2h0IDIwMDggSW50ZWwgQ29ycG9yYXRpb24KKyAqICAgSmVzc2UgQmFybmVzIDxqZXNzZS5iYXJuZXNAaW50ZWwuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFVUSUxfQ09NTU9OX0gKKyNkZWZpbmUgVVRJTF9DT01NT05fSAorCisjaWZuZGVmIEFSUkFZX1NJWkUKKyNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCisjZW5kaWYKKworI2VuZGlmIC8qIFVUSUxfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL3Rlc3RzL3V0aWwvZm9ybWF0LmMgYi90ZXN0cy91dGlsL2Zvcm1hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0M2NmZTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy91dGlsL2Zvcm1hdC5jCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDggVHVuZ3N0ZW4gR3JhcGhpY3MKKyAqICAgSmFrb2IgQm9ybmVjcmFudHogPGpha29iQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICogQ29weXJpZ2h0IDIwMDggSW50ZWwgQ29ycG9yYXRpb24KKyAqICAgSmVzc2UgQmFybmVzIDxqZXNzZS5iYXJuZXNAaW50ZWwuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGRybV9mb3VyY2MuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImZvcm1hdC5oIgorCisjZGVmaW5lIE1BS0VfUkdCX0lORk8ocmwsIHJvLCBnbCwgZ28sIGJsLCBibywgYWwsIGFvKSBcCisJLnJnYiA9IHsgeyAocmwpLCAocm8pIH0sIHsgKGdsKSwgKGdvKSB9LCB7IChibCksIChibykgfSwgeyAoYWwpLCAoYW8pIH0gfQorCisjZGVmaW5lIE1BS0VfWVVWX0lORk8ob3JkZXIsIHhzdWIsIHlzdWIsIGNocm9tYV9zdHJpZGUpIFwKKwkueXV2ID0geyAob3JkZXIpLCAoeHN1YiksICh5c3ViKSwgKGNocm9tYV9zdHJpZGUpIH0KKworc3RhdGljIGNvbnN0IHN0cnVjdCB1dGlsX2Zvcm1hdF9pbmZvIGZvcm1hdF9pbmZvW10gPSB7CisJLyogWVVWIHBhY2tlZCAqLworCXsgRFJNX0ZPUk1BVF9VWVZZLCAiVVlWWSIsIE1BS0VfWVVWX0lORk8oWVVWX1lDYkNyIHwgWVVWX0NZLCAyLCAyLCAyKSB9LAorCXsgRFJNX0ZPUk1BVF9WWVVZLCAiVllVWSIsIE1BS0VfWVVWX0lORk8oWVVWX1lDckNiIHwgWVVWX0NZLCAyLCAyLCAyKSB9LAorCXsgRFJNX0ZPUk1BVF9ZVVlWLCAiWVVZViIsIE1BS0VfWVVWX0lORk8oWVVWX1lDYkNyIHwgWVVWX1lDLCAyLCAyLCAyKSB9LAorCXsgRFJNX0ZPUk1BVF9ZVllVLCAiWVZZVSIsIE1BS0VfWVVWX0lORk8oWVVWX1lDckNiIHwgWVVWX1lDLCAyLCAyLCAyKSB9LAorCS8qIFlVViBzZW1pLXBsYW5hciAqLworCXsgRFJNX0ZPUk1BVF9OVjEyLCAiTlYxMiIsIE1BS0VfWVVWX0lORk8oWVVWX1lDYkNyLCAyLCAyLCAyKSB9LAorCXsgRFJNX0ZPUk1BVF9OVjIxLCAiTlYyMSIsIE1BS0VfWVVWX0lORk8oWVVWX1lDckNiLCAyLCAyLCAyKSB9LAorCXsgRFJNX0ZPUk1BVF9OVjE2LCAiTlYxNiIsIE1BS0VfWVVWX0lORk8oWVVWX1lDYkNyLCAyLCAxLCAyKSB9LAorCXsgRFJNX0ZPUk1BVF9OVjYxLCAiTlY2MSIsIE1BS0VfWVVWX0lORk8oWVVWX1lDckNiLCAyLCAxLCAyKSB9LAorCS8qIFlVViBwbGFuYXIgKi8KKwl7IERSTV9GT1JNQVRfWVVWNDIwLCAiWVUxMiIsIE1BS0VfWVVWX0lORk8oWVVWX1lDYkNyLCAyLCAyLCAxKSB9LAorCXsgRFJNX0ZPUk1BVF9ZVlU0MjAsICJZVjEyIiwgTUFLRV9ZVVZfSU5GTyhZVVZfWUNyQ2IsIDIsIDIsIDEpIH0sCisJLyogUkdCMTYgKi8KKwl7IERSTV9GT1JNQVRfQVJHQjQ0NDQsICJBUjEyIiwgTUFLRV9SR0JfSU5GTyg0LCA4LCA0LCA0LCA0LCAwLCA0LCAxMikgfSwKKwl7IERSTV9GT1JNQVRfWFJHQjQ0NDQsICJYUjEyIiwgTUFLRV9SR0JfSU5GTyg0LCA4LCA0LCA0LCA0LCAwLCAwLCAwKSB9LAorCXsgRFJNX0ZPUk1BVF9BQkdSNDQ0NCwgIkFCMTIiLCBNQUtFX1JHQl9JTkZPKDQsIDAsIDQsIDQsIDQsIDgsIDQsIDEyKSB9LAorCXsgRFJNX0ZPUk1BVF9YQkdSNDQ0NCwgIlhCMTIiLCBNQUtFX1JHQl9JTkZPKDQsIDAsIDQsIDQsIDQsIDgsIDAsIDApIH0sCisJeyBEUk1fRk9STUFUX1JHQkE0NDQ0LCAiUkExMiIsIE1BS0VfUkdCX0lORk8oNCwgMTIsIDQsIDgsIDQsIDQsIDQsIDApIH0sCisJeyBEUk1fRk9STUFUX1JHQlg0NDQ0LCAiUlgxMiIsIE1BS0VfUkdCX0lORk8oNCwgMTIsIDQsIDgsIDQsIDQsIDAsIDApIH0sCisJeyBEUk1fRk9STUFUX0JHUkE0NDQ0LCAiQkExMiIsIE1BS0VfUkdCX0lORk8oNCwgNCwgNCwgOCwgNCwgMTIsIDQsIDApIH0sCisJeyBEUk1fRk9STUFUX0JHUlg0NDQ0LCAiQlgxMiIsIE1BS0VfUkdCX0lORk8oNCwgNCwgNCwgOCwgNCwgMTIsIDAsIDApIH0sCisJeyBEUk1fRk9STUFUX0FSR0IxNTU1LCAiQVIxNSIsIE1BS0VfUkdCX0lORk8oNSwgMTAsIDUsIDUsIDUsIDAsIDEsIDE1KSB9LAorCXsgRFJNX0ZPUk1BVF9YUkdCMTU1NSwgIlhSMTUiLCBNQUtFX1JHQl9JTkZPKDUsIDEwLCA1LCA1LCA1LCAwLCAwLCAwKSB9LAorCXsgRFJNX0ZPUk1BVF9BQkdSMTU1NSwgIkFCMTUiLCBNQUtFX1JHQl9JTkZPKDUsIDAsIDUsIDUsIDUsIDEwLCAxLCAxNSkgfSwKKwl7IERSTV9GT1JNQVRfWEJHUjE1NTUsICJYQjE1IiwgTUFLRV9SR0JfSU5GTyg1LCAwLCA1LCA1LCA1LCAxMCwgMCwgMCkgfSwKKwl7IERSTV9GT1JNQVRfUkdCQTU1NTEsICJSQTE1IiwgTUFLRV9SR0JfSU5GTyg1LCAxMSwgNSwgNiwgNSwgMSwgMSwgMCkgfSwKKwl7IERSTV9GT1JNQVRfUkdCWDU1NTEsICJSWDE1IiwgTUFLRV9SR0JfSU5GTyg1LCAxMSwgNSwgNiwgNSwgMSwgMCwgMCkgfSwKKwl7IERSTV9GT1JNQVRfQkdSQTU1NTEsICJCQTE1IiwgTUFLRV9SR0JfSU5GTyg1LCAxLCA1LCA2LCA1LCAxMSwgMSwgMCkgfSwKKwl7IERSTV9GT1JNQVRfQkdSWDU1NTEsICJCWDE1IiwgTUFLRV9SR0JfSU5GTyg1LCAxLCA1LCA2LCA1LCAxMSwgMCwgMCkgfSwKKwl7IERSTV9GT1JNQVRfUkdCNTY1LCAiUkcxNiIsIE1BS0VfUkdCX0lORk8oNSwgMTEsIDYsIDUsIDUsIDAsIDAsIDApIH0sCisJeyBEUk1fRk9STUFUX0JHUjU2NSwgIkJHMTYiLCBNQUtFX1JHQl9JTkZPKDUsIDAsIDYsIDUsIDUsIDExLCAwLCAwKSB9LAorCS8qIFJHQjI0ICovCisJeyBEUk1fRk9STUFUX0JHUjg4OCwgIkJHMjQiLCBNQUtFX1JHQl9JTkZPKDgsIDAsIDgsIDgsIDgsIDE2LCAwLCAwKSB9LAorCXsgRFJNX0ZPUk1BVF9SR0I4ODgsICJSRzI0IiwgTUFLRV9SR0JfSU5GTyg4LCAxNiwgOCwgOCwgOCwgMCwgMCwgMCkgfSwKKwkvKiBSR0IzMiAqLworCXsgRFJNX0ZPUk1BVF9BUkdCODg4OCwgIkFSMjQiLCBNQUtFX1JHQl9JTkZPKDgsIDE2LCA4LCA4LCA4LCAwLCA4LCAyNCkgfSwKKwl7IERSTV9GT1JNQVRfWFJHQjg4ODgsICJYUjI0IiwgTUFLRV9SR0JfSU5GTyg4LCAxNiwgOCwgOCwgOCwgMCwgMCwgMCkgfSwKKwl7IERSTV9GT1JNQVRfQUJHUjg4ODgsICJBQjI0IiwgTUFLRV9SR0JfSU5GTyg4LCAwLCA4LCA4LCA4LCAxNiwgOCwgMjQpIH0sCisJeyBEUk1fRk9STUFUX1hCR1I4ODg4LCAiWEIyNCIsIE1BS0VfUkdCX0lORk8oOCwgMCwgOCwgOCwgOCwgMTYsIDAsIDApIH0sCisJeyBEUk1fRk9STUFUX1JHQkE4ODg4LCAiUkEyNCIsIE1BS0VfUkdCX0lORk8oOCwgMjQsIDgsIDE2LCA4LCA4LCA4LCAwKSB9LAorCXsgRFJNX0ZPUk1BVF9SR0JYODg4OCwgIlJYMjQiLCBNQUtFX1JHQl9JTkZPKDgsIDI0LCA4LCAxNiwgOCwgOCwgMCwgMCkgfSwKKwl7IERSTV9GT1JNQVRfQkdSQTg4ODgsICJCQTI0IiwgTUFLRV9SR0JfSU5GTyg4LCA4LCA4LCAxNiwgOCwgMjQsIDgsIDApIH0sCisJeyBEUk1fRk9STUFUX0JHUlg4ODg4LCAiQlgyNCIsIE1BS0VfUkdCX0lORk8oOCwgOCwgOCwgMTYsIDgsIDI0LCAwLCAwKSB9LAorCXsgRFJNX0ZPUk1BVF9BUkdCMjEwMTAxMCwgIkFSMzAiLCBNQUtFX1JHQl9JTkZPKDEwLCAyMCwgMTAsIDEwLCAxMCwgMCwgMiwgMzApIH0sCisJeyBEUk1fRk9STUFUX1hSR0IyMTAxMDEwLCAiWFIzMCIsIE1BS0VfUkdCX0lORk8oMTAsIDIwLCAxMCwgMTAsIDEwLCAwLCAwLCAwKSB9LAorCXsgRFJNX0ZPUk1BVF9BQkdSMjEwMTAxMCwgIkFCMzAiLCBNQUtFX1JHQl9JTkZPKDEwLCAwLCAxMCwgMTAsIDEwLCAyMCwgMiwgMzApIH0sCisJeyBEUk1fRk9STUFUX1hCR1IyMTAxMDEwLCAiWEIzMCIsIE1BS0VfUkdCX0lORk8oMTAsIDAsIDEwLCAxMCwgMTAsIDIwLCAwLCAwKSB9LAorCXsgRFJNX0ZPUk1BVF9SR0JBMTAxMDEwMiwgIlJBMzAiLCBNQUtFX1JHQl9JTkZPKDEwLCAyMiwgMTAsIDEyLCAxMCwgMiwgMiwgMCkgfSwKKwl7IERSTV9GT1JNQVRfUkdCWDEwMTAxMDIsICJSWDMwIiwgTUFLRV9SR0JfSU5GTygxMCwgMjIsIDEwLCAxMiwgMTAsIDIsIDAsIDApIH0sCisJeyBEUk1fRk9STUFUX0JHUkExMDEwMTAyLCAiQkEzMCIsIE1BS0VfUkdCX0lORk8oMTAsIDIsIDEwLCAxMiwgMTAsIDIyLCAyLCAwKSB9LAorCXsgRFJNX0ZPUk1BVF9CR1JYMTAxMDEwMiwgIkJYMzAiLCBNQUtFX1JHQl9JTkZPKDEwLCAyLCAxMCwgMTIsIDEwLCAyMiwgMCwgMCkgfSwKK307CisKK3VpbnQzMl90IHV0aWxfZm9ybWF0X2ZvdXJjYyhjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZm9ybWF0X2luZm8pOyBpKyspCisJCWlmICghc3RyY21wKGZvcm1hdF9pbmZvW2ldLm5hbWUsIG5hbWUpKQorCQkJcmV0dXJuIGZvcm1hdF9pbmZvW2ldLmZvcm1hdDsKKworCXJldHVybiAwOworfQorCitjb25zdCBzdHJ1Y3QgdXRpbF9mb3JtYXRfaW5mbyAqdXRpbF9mb3JtYXRfaW5mb19maW5kKHVpbnQzMl90IGZvcm1hdCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZvcm1hdF9pbmZvKTsgaSsrKQorCQlpZiAoZm9ybWF0X2luZm9baV0uZm9ybWF0ID09IGZvcm1hdCkKKwkJCXJldHVybiAmZm9ybWF0X2luZm9baV07CisKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3V0aWwvZm9ybWF0LmggYi90ZXN0cy91dGlsL2Zvcm1hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZTFjMDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy91dGlsL2Zvcm1hdC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBUdW5nc3RlbiBHcmFwaGljcworICogICBKYWtvYiBCb3JuZWNyYW50eiA8amFrb2JAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKiBDb3B5cmlnaHQgMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbgorICogICBKZXNzZSBCYXJuZXMgPGplc3NlLmJhcm5lc0BpbnRlbC5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgVVRJTF9GT1JNQVRfSAorI2RlZmluZSBVVElMX0ZPUk1BVF9ICisKK3N0cnVjdCB1dGlsX2NvbG9yX2NvbXBvbmVudCB7CisJdW5zaWduZWQgaW50IGxlbmd0aDsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworfTsKKworc3RydWN0IHV0aWxfcmdiX2luZm8geworCXN0cnVjdCB1dGlsX2NvbG9yX2NvbXBvbmVudCByZWQ7CisJc3RydWN0IHV0aWxfY29sb3JfY29tcG9uZW50IGdyZWVuOworCXN0cnVjdCB1dGlsX2NvbG9yX2NvbXBvbmVudCBibHVlOworCXN0cnVjdCB1dGlsX2NvbG9yX2NvbXBvbmVudCBhbHBoYTsKK307CisKK2VudW0gdXRpbF95dXZfb3JkZXIgeworCVlVVl9ZQ2JDciA9IDEsCisJWVVWX1lDckNiID0gMiwKKwlZVVZfWUMgPSA0LAorCVlVVl9DWSA9IDgsCit9OworCitzdHJ1Y3QgdXRpbF95dXZfaW5mbyB7CisJZW51bSB1dGlsX3l1dl9vcmRlciBvcmRlcjsKKwl1bnNpZ25lZCBpbnQgeHN1YjsKKwl1bnNpZ25lZCBpbnQgeXN1YjsKKwl1bnNpZ25lZCBpbnQgY2hyb21hX3N0cmlkZTsKK307CisKK3N0cnVjdCB1dGlsX2Zvcm1hdF9pbmZvIHsKKwl1aW50MzJfdCBmb3JtYXQ7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBzdHJ1Y3QgdXRpbF9yZ2JfaW5mbyByZ2I7CisJY29uc3Qgc3RydWN0IHV0aWxfeXV2X2luZm8geXV2OworfTsKKwordWludDMyX3QgdXRpbF9mb3JtYXRfZm91cmNjKGNvbnN0IGNoYXIgKm5hbWUpOworY29uc3Qgc3RydWN0IHV0aWxfZm9ybWF0X2luZm8gKnV0aWxfZm9ybWF0X2luZm9fZmluZCh1aW50MzJfdCBmb3JtYXQpOworCisjZW5kaWYgLyogVVRJTF9GT1JNQVRfSCAqLwpkaWZmIC0tZ2l0IGEvdGVzdHMvdXRpbC9rbXMuYyBiL3Rlc3RzL3V0aWwva21zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4Y2M4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3V0aWwva21zLmMKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBUdW5nc3RlbiBHcmFwaGljcworICogICBKYWtvYiBCb3JuZWNyYW50eiA8amFrb2JAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKiBDb3B5cmlnaHQgMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbgorICogICBKZXNzZSBCYXJuZXMgPGplc3NlLmJhcm5lc0BpbnRlbC5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZhaXJseSBzaW1wbGUgdGVzdCBwcm9ncmFtIGR1bXBzIG91dHB1dCBpbiBhIHNpbWlsYXIgZm9ybWF0IHRvIHRoZQorICogInhyYW5kciIgdG9vbCBldmVyeW9uZSBrbm93cyAmIGxvdmVzLiAgSXQncyBuZWNlc3NhcmlseSBzbGlnaHRseSBkaWZmZXJlbnQKKyAqIHNpbmNlIHRoZSBrZXJuZWwgc2VwYXJhdGVzIG91dHB1dHMgaW50byBlbmNvZGVyIGFuZCBjb25uZWN0b3Igc3RydWN0dXJlcywKKyAqIGVhY2ggd2l0aCB0aGVpciBvd24gdW5pcXVlIElELiAgVGhlIHByb2dyYW0gYWxzbyBhbGxvd3MgdGVzdCB0ZXN0aW5nIG9mIHRoZQorICogbWVtb3J5IG1hbmFnZW1lbnQgYW5kIG1vZGUgc2V0dGluZyBBUElzIGJ5IGFsbG93aW5nIHRoZSB1c2VyIHRvIHNwZWNpZnkgYQorICogY29ubmVjdG9yIGFuZCBtb2RlIHRvIHVzZSBmb3IgbW9kZSBzZXR0aW5nLiAgSWYgYWxsIHdvcmtzIGFzIGV4cGVjdGVkLCBhCisgKiBibHVlIGJhY2tncm91bmQgc2hvdWxkIGJlIHBhaW50ZWQgb24gdGhlIG1vbml0b3IgYXR0YWNoZWQgdG8gdGhlIHNwZWNpZmllZAorICogY29ubmVjdG9yIGFmdGVyIHRoZSBzZWxlY3RlZCBtb2RlIGlzIHNldC4KKyAqCisgKiBUT0RPOiB1c2UgY2Fpcm8gdG8gd3JpdGUgdGhlIG1vZGUgaW5mbyBvbiB0aGUgc2VsZWN0ZWQgb3V0cHV0IG9uY2UKKyAqICAgICAgIHRoZSBtb2RlIGhhcyBiZWVuIHByb2dyYW1tZWQsIGFsb25nIHdpdGggcG9zc2libGUgdGVzdCBwYXR0ZXJucy4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ4Zjg2ZHJtLmgiCisjaW5jbHVkZSAieGY4NmRybU1vZGUuaCIKKworI2luY2x1ZGUgImNvbW1vbi5oIgorCitzdHJ1Y3QgdHlwZV9uYW1lIHsKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnV0aWxfbG9va3VwX3R5cGVfbmFtZSh1bnNpZ25lZCBpbnQgdHlwZSwKKwkJCQkJIGNvbnN0IHN0cnVjdCB0eXBlX25hbWUgKnRhYmxlLAorCQkJCQkgdW5zaWduZWQgaW50IGNvdW50KQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCWlmICh0YWJsZVtpXS50eXBlID09IHR5cGUpCisJCQlyZXR1cm4gdGFibGVbaV0ubmFtZTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHR5cGVfbmFtZSBlbmNvZGVyX3R5cGVfbmFtZXNbXSA9IHsKKwl7IERSTV9NT0RFX0VOQ09ERVJfTk9ORSwgIm5vbmUiIH0sCisJeyBEUk1fTU9ERV9FTkNPREVSX0RBQywgIkRBQyIgfSwKKwl7IERSTV9NT0RFX0VOQ09ERVJfVE1EUywgIlRNRFMiIH0sCisJeyBEUk1fTU9ERV9FTkNPREVSX0xWRFMsICJMVkRTIiB9LAorCXsgRFJNX01PREVfRU5DT0RFUl9UVkRBQywgIlRWREFDIiB9LAorCXsgRFJNX01PREVfRU5DT0RFUl9WSVJUVUFMLCAiVmlydHVhbCIgfSwKKwl7IERSTV9NT0RFX0VOQ09ERVJfRFNJLCAiRFNJIiB9LAorCXsgRFJNX01PREVfRU5DT0RFUl9EUE1TVCwgIkRQTVNUIiB9LAorCXsgRFJNX01PREVfRU5DT0RFUl9EUEksICJEUEkiIH0sCit9OworCitjb25zdCBjaGFyICp1dGlsX2xvb2t1cF9lbmNvZGVyX3R5cGVfbmFtZSh1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gdXRpbF9sb29rdXBfdHlwZV9uYW1lKHR5cGUsIGVuY29kZXJfdHlwZV9uYW1lcywKKwkJCQkgICAgIEFSUkFZX1NJWkUoZW5jb2Rlcl90eXBlX25hbWVzKSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHlwZV9uYW1lIGNvbm5lY3Rvcl9zdGF0dXNfbmFtZXNbXSA9IHsKKwl7IERSTV9NT0RFX0NPTk5FQ1RFRCwgImNvbm5lY3RlZCIgfSwKKwl7IERSTV9NT0RFX0RJU0NPTk5FQ1RFRCwgImRpc2Nvbm5lY3RlZCIgfSwKKwl7IERSTV9NT0RFX1VOS05PV05DT05ORUNUSU9OLCAidW5rbm93biIgfSwKK307CisKK2NvbnN0IGNoYXIgKnV0aWxfbG9va3VwX2Nvbm5lY3Rvcl9zdGF0dXNfbmFtZSh1bnNpZ25lZCBpbnQgc3RhdHVzKQoreworCXJldHVybiB1dGlsX2xvb2t1cF90eXBlX25hbWUoc3RhdHVzLCBjb25uZWN0b3Jfc3RhdHVzX25hbWVzLAorCQkJCSAgICAgQVJSQVlfU0laRShjb25uZWN0b3Jfc3RhdHVzX25hbWVzKSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHlwZV9uYW1lIGNvbm5lY3Rvcl90eXBlX25hbWVzW10gPSB7CisJeyBEUk1fTU9ERV9DT05ORUNUT1JfVW5rbm93biwgInVua25vd24iIH0sCisJeyBEUk1fTU9ERV9DT05ORUNUT1JfVkdBLCAiVkdBIiB9LAorCXsgRFJNX01PREVfQ09OTkVDVE9SX0RWSUksICJEVkktSSIgfSwKKwl7IERSTV9NT0RFX0NPTk5FQ1RPUl9EVklELCAiRFZJLUQiIH0sCisJeyBEUk1fTU9ERV9DT05ORUNUT1JfRFZJQSwgIkRWSS1BIiB9LAorCXsgRFJNX01PREVfQ09OTkVDVE9SX0NvbXBvc2l0ZSwgImNvbXBvc2l0ZSIgfSwKKwl7IERSTV9NT0RFX0NPTk5FQ1RPUl9TVklERU8sICJzLXZpZGVvIiB9LAorCXsgRFJNX01PREVfQ09OTkVDVE9SX0xWRFMsICJMVkRTIiB9LAorCXsgRFJNX01PREVfQ09OTkVDVE9SX0NvbXBvbmVudCwgImNvbXBvbmVudCIgfSwKKwl7IERSTV9NT0RFX0NPTk5FQ1RPUl85UGluRElOLCAiOS1waW4gRElOIiB9LAorCXsgRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0LCAiRFAiIH0sCisJeyBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUEsICJIRE1JLUEiIH0sCisJeyBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUIsICJIRE1JLUIiIH0sCisJeyBEUk1fTU9ERV9DT05ORUNUT1JfVFYsICJUViIgfSwKKwl7IERSTV9NT0RFX0NPTk5FQ1RPUl9lRFAsICJlRFAiIH0sCisJeyBEUk1fTU9ERV9DT05ORUNUT1JfVklSVFVBTCwgIlZpcnR1YWwiIH0sCisJeyBEUk1fTU9ERV9DT05ORUNUT1JfRFNJLCAiRFNJIiB9LAorCXsgRFJNX01PREVfQ09OTkVDVE9SX0RQSSwgIkRQSSIgfSwKK307CisKK2NvbnN0IGNoYXIgKnV0aWxfbG9va3VwX2Nvbm5lY3Rvcl90eXBlX25hbWUodW5zaWduZWQgaW50IHR5cGUpCit7CisJcmV0dXJuIHV0aWxfbG9va3VwX3R5cGVfbmFtZSh0eXBlLCBjb25uZWN0b3JfdHlwZV9uYW1lcywKKwkJCQkgICAgIEFSUkFZX1NJWkUoY29ubmVjdG9yX3R5cGVfbmFtZXMpKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtb2R1bGVzW10gPSB7CisJImk5MTUiLAorCSJhbWRncHUiLAorCSJyYWRlb24iLAorCSJub3V2ZWF1IiwKKwkidm13Z2Z4IiwKKwkib21hcGRybSIsCisJImV4eW5vcyIsCisJInRpbGNkYyIsCisJIm1zbSIsCisJInN0aSIsCisJInRlZ3JhIiwKKwkiaW14LWRybSIsCisJInJvY2tjaGlwIiwKKwkiYXRtZWwtaGxjZGMiLAorCSJmc2wtZGN1LWRybSIsCisJInZjNCIsCisJInZpcnRpb19ncHUiLAorCSJtZWRpYXRlayIsCisJIm1lc29uIiwKKwkicGwxMTEiLAorfTsKKworaW50IHV0aWxfb3Blbihjb25zdCBjaGFyICpkZXZpY2UsIGNvbnN0IGNoYXIgKm1vZHVsZSkKK3sKKwlpbnQgZmQ7CisKKwlpZiAobW9kdWxlKSB7CisJCWZkID0gZHJtT3Blbihtb2R1bGUsIGRldmljZSk7CisJCWlmIChmZCA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIG9wZW4gZGV2aWNlICclcyc6ICVzXG4iLAorCQkJCW1vZHVsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAtZXJybm87CisJCX0KKwl9IGVsc2UgeworCQl1bnNpZ25lZCBpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtb2R1bGVzKTsgaSsrKSB7CisJCQlwcmludGYoInRyeWluZyB0byBvcGVuIGRldmljZSAnJXMnLi4uIiwgbW9kdWxlc1tpXSk7CisKKwkJCWZkID0gZHJtT3Blbihtb2R1bGVzW2ldLCBkZXZpY2UpOworCQkJaWYgKGZkIDwgMCkgeworCQkJCXByaW50ZigiZmFpbGVkXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRmKCJkb25lXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChmZCA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAibm8gZGV2aWNlIGZvdW5kXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJcmV0dXJuIGZkOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdXRpbC9rbXMuaCBiL3Rlc3RzL3V0aWwva21zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRlMmVkMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3V0aWwva21zLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IFR1bmdzdGVuIEdyYXBoaWNzCisgKiAgIEpha29iIEJvcm5lY3JhbnR6IDxqYWtvYkB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KKyAqIENvcHlyaWdodCAyMDA4IEludGVsIENvcnBvcmF0aW9uCisgKiAgIEplc3NlIEJhcm5lcyA8amVzc2UuYmFybmVzQGludGVsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBVVElMX0tNU19ICisjZGVmaW5lIFVUSUxfS01TX0gKKworY29uc3QgY2hhciAqdXRpbF9sb29rdXBfZW5jb2Rlcl90eXBlX25hbWUodW5zaWduZWQgaW50IHR5cGUpOworY29uc3QgY2hhciAqdXRpbF9sb29rdXBfY29ubmVjdG9yX3N0YXR1c19uYW1lKHVuc2lnbmVkIGludCB0eXBlKTsKK2NvbnN0IGNoYXIgKnV0aWxfbG9va3VwX2Nvbm5lY3Rvcl90eXBlX25hbWUodW5zaWduZWQgaW50IHR5cGUpOworCitpbnQgdXRpbF9vcGVuKGNvbnN0IGNoYXIgKmRldmljZSwgY29uc3QgY2hhciAqbW9kdWxlKTsKKworI2VuZGlmIC8qIFVUSUxfS01TX0ggKi8KZGlmZiAtLWdpdCBhL3Rlc3RzL3V0aWwvcGF0dGVybi5jIGIvdGVzdHMvdXRpbC9wYXR0ZXJuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiMDhhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3V0aWwvcGF0dGVybi5jCkBAIC0wLDAgKzEsODcwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDggVHVuZ3N0ZW4gR3JhcGhpY3MKKyAqICAgSmFrb2IgQm9ybmVjcmFudHogPGpha29iQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICogQ29weXJpZ2h0IDIwMDggSW50ZWwgQ29ycG9yYXRpb24KKyAqICAgSmVzc2UgQmFybmVzIDxqZXNzZS5iYXJuZXNAaW50ZWwuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8ZHJtX2ZvdXJjYy5oPgorCisjaWZkZWYgSEFWRV9DQUlSTworI2luY2x1ZGUgPGNhaXJvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJmb3JtYXQuaCIKKyNpbmNsdWRlICJwYXR0ZXJuLmgiCisKK3N0cnVjdCBjb2xvcl9yZ2IyNCB7CisJdW5zaWduZWQgaW50IHZhbHVlOjI0OworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBjb2xvcl95dXYgeworCXVuc2lnbmVkIGNoYXIgeTsKKwl1bnNpZ25lZCBjaGFyIHU7CisJdW5zaWduZWQgY2hhciB2OworfTsKKworI2RlZmluZSBNQUtFX1lVVl82MDFfWShyLCBnLCBiKSBcCisJKCgoIDY2ICogKHIpICsgMTI5ICogKGcpICsgIDI1ICogKGIpICsgMTI4KSA+PiA4KSArIDE2KQorI2RlZmluZSBNQUtFX1lVVl82MDFfVShyLCBnLCBiKSBcCisJKCgoLTM4ICogKHIpIC0gIDc0ICogKGcpICsgMTEyICogKGIpICsgMTI4KSA+PiA4KSArIDEyOCkKKyNkZWZpbmUgTUFLRV9ZVVZfNjAxX1YociwgZywgYikgXAorCSgoKDExMiAqIChyKSAtICA5NCAqIChnKSAtICAxOCAqIChiKSArIDEyOCkgPj4gOCkgKyAxMjgpCisKKyNkZWZpbmUgTUFLRV9ZVVZfNjAxKHIsIGcsIGIpIFwKKwl7IC55ID0gTUFLRV9ZVVZfNjAxX1kociwgZywgYiksIFwKKwkgIC51ID0gTUFLRV9ZVVZfNjAxX1UociwgZywgYiksIFwKKwkgIC52ID0gTUFLRV9ZVVZfNjAxX1YociwgZywgYikgfQorCisjZGVmaW5lIE1BS0VfUkdCQShyZ2IsIHIsIGcsIGIsIGEpIFwKKwkoKCgocikgPj4gKDggLSAocmdiKS0+cmVkLmxlbmd0aCkpIDw8IChyZ2IpLT5yZWQub2Zmc2V0KSB8IFwKKwkgKCgoZykgPj4gKDggLSAocmdiKS0+Z3JlZW4ubGVuZ3RoKSkgPDwgKHJnYiktPmdyZWVuLm9mZnNldCkgfCBcCisJICgoKGIpID4+ICg4IC0gKHJnYiktPmJsdWUubGVuZ3RoKSkgPDwgKHJnYiktPmJsdWUub2Zmc2V0KSB8IFwKKwkgKCgoYSkgPj4gKDggLSAocmdiKS0+YWxwaGEubGVuZ3RoKSkgPDwgKHJnYiktPmFscGhhLm9mZnNldCkpCisKKyNkZWZpbmUgTUFLRV9SR0IyNChyZ2IsIHIsIGcsIGIpIFwKKwl7IC52YWx1ZSA9IE1BS0VfUkdCQShyZ2IsIHIsIGcsIGIsIDApIH0KKworc3RhdGljIHZvaWQgZmlsbF9zbXB0ZV95dXZfcGxhbmFyKGNvbnN0IHN0cnVjdCB1dGlsX3l1dl9pbmZvICp5dXYsCisJCQkJICB1bnNpZ25lZCBjaGFyICp5X21lbSwgdW5zaWduZWQgY2hhciAqdV9tZW0sCisJCQkJICB1bnNpZ25lZCBjaGFyICp2X21lbSwgdW5zaWduZWQgaW50IHdpZHRoLAorCQkJCSAgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IHN0cmlkZSkKK3sKKwljb25zdCBzdHJ1Y3QgY29sb3JfeXV2IGNvbG9yc190b3BbXSA9IHsKKwkJTUFLRV9ZVVZfNjAxKDE5MSwgMTkyLCAxOTIpLAkvKiBncmV5ICovCisJCU1BS0VfWVVWXzYwMSgxOTIsIDE5MiwgMCksCS8qIHllbGxvdyAqLworCQlNQUtFX1lVVl82MDEoMCwgMTkyLCAxOTIpLAkvKiBjeWFuICovCisJCU1BS0VfWVVWXzYwMSgwLCAxOTIsIDApLAkvKiBncmVlbiAqLworCQlNQUtFX1lVVl82MDEoMTkyLCAwLCAxOTIpLAkvKiBtYWdlbnRhICovCisJCU1BS0VfWVVWXzYwMSgxOTIsIDAsIDApLAkvKiByZWQgKi8KKwkJTUFLRV9ZVVZfNjAxKDAsIDAsIDE5MiksCS8qIGJsdWUgKi8KKwl9OworCWNvbnN0IHN0cnVjdCBjb2xvcl95dXYgY29sb3JzX21pZGRsZVtdID0geworCQlNQUtFX1lVVl82MDEoMCwgMCwgMTkyKSwJLyogYmx1ZSAqLworCQlNQUtFX1lVVl82MDEoMTksIDE5LCAxOSksCS8qIGJsYWNrICovCisJCU1BS0VfWVVWXzYwMSgxOTIsIDAsIDE5MiksCS8qIG1hZ2VudGEgKi8KKwkJTUFLRV9ZVVZfNjAxKDE5LCAxOSwgMTkpLAkvKiBibGFjayAqLworCQlNQUtFX1lVVl82MDEoMCwgMTkyLCAxOTIpLAkvKiBjeWFuICovCisJCU1BS0VfWVVWXzYwMSgxOSwgMTksIDE5KSwJLyogYmxhY2sgKi8KKwkJTUFLRV9ZVVZfNjAxKDE5MiwgMTkyLCAxOTIpLAkvKiBncmV5ICovCisJfTsKKwljb25zdCBzdHJ1Y3QgY29sb3JfeXV2IGNvbG9yc19ib3R0b21bXSA9IHsKKwkJTUFLRV9ZVVZfNjAxKDAsIDMzLCA3NiksCS8qIGluLXBoYXNlICovCisJCU1BS0VfWVVWXzYwMSgyNTUsIDI1NSwgMjU1KSwJLyogc3VwZXIgd2hpdGUgKi8KKwkJTUFLRV9ZVVZfNjAxKDUwLCAwLCAxMDYpLAkvKiBxdWFkcmF0dXJlICovCisJCU1BS0VfWVVWXzYwMSgxOSwgMTksIDE5KSwJLyogYmxhY2sgKi8KKwkJTUFLRV9ZVVZfNjAxKDksIDksIDkpLAkJLyogMy41JSAqLworCQlNQUtFX1lVVl82MDEoMTksIDE5LCAxOSksCS8qIDcuNSUgKi8KKwkJTUFLRV9ZVVZfNjAxKDI5LCAyOSwgMjkpLAkvKiAxMS41JSAqLworCQlNQUtFX1lVVl82MDEoMTksIDE5LCAxOSksCS8qIGJsYWNrICovCisJfTsKKwl1bnNpZ25lZCBpbnQgY3MgPSB5dXYtPmNocm9tYV9zdHJpZGU7CisJdW5zaWduZWQgaW50IHhzdWIgPSB5dXYtPnhzdWI7CisJdW5zaWduZWQgaW50IHlzdWIgPSB5dXYtPnlzdWI7CisJdW5zaWduZWQgaW50IHg7CisJdW5zaWduZWQgaW50IHk7CisKKwkvKiBMdW1hICovCisJZm9yICh5ID0gMDsgeSA8IGhlaWdodCAqIDYgLyA5OyArK3kpIHsKKwkJZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpCisJCQl5X21lbVt4XSA9IGNvbG9yc190b3BbeCAqIDcgLyB3aWR0aF0ueTsKKwkJeV9tZW0gKz0gc3RyaWRlOworCX0KKworCWZvciAoOyB5IDwgaGVpZ2h0ICogNyAvIDk7ICsreSkgeworCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkKKwkJCXlfbWVtW3hdID0gY29sb3JzX21pZGRsZVt4ICogNyAvIHdpZHRoXS55OworCQl5X21lbSArPSBzdHJpZGU7CisJfQorCisJZm9yICg7IHkgPCBoZWlnaHQ7ICsreSkgeworCQlmb3IgKHggPSAwOyB4IDwgd2lkdGggKiA1IC8gNzsgKyt4KQorCQkJeV9tZW1beF0gPSBjb2xvcnNfYm90dG9tW3ggKiA0IC8gKHdpZHRoICogNSAvIDcpXS55OworCQlmb3IgKDsgeCA8IHdpZHRoICogNiAvIDc7ICsreCkKKwkJCXlfbWVtW3hdID0gY29sb3JzX2JvdHRvbVsoeCAtIHdpZHRoICogNSAvIDcpICogMworCQkJCQkJIC8gKHdpZHRoIC8gNykgKyA0XS55OworCQlmb3IgKDsgeCA8IHdpZHRoOyArK3gpCisJCQl5X21lbVt4XSA9IGNvbG9yc19ib3R0b21bN10ueTsKKwkJeV9tZW0gKz0gc3RyaWRlOworCX0KKworCS8qIENocm9tYSAqLworCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQgLyB5c3ViICogNiAvIDk7ICsreSkgeworCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0geHN1YikgeworCQkJdV9tZW1beCpjcy94c3ViXSA9IGNvbG9yc190b3BbeCAqIDcgLyB3aWR0aF0udTsKKwkJCXZfbWVtW3gqY3MveHN1Yl0gPSBjb2xvcnNfdG9wW3ggKiA3IC8gd2lkdGhdLnY7CisJCX0KKwkJdV9tZW0gKz0gc3RyaWRlICogY3MgLyB4c3ViOworCQl2X21lbSArPSBzdHJpZGUgKiBjcyAvIHhzdWI7CisJfQorCisJZm9yICg7IHkgPCBoZWlnaHQgLyB5c3ViICogNyAvIDk7ICsreSkgeworCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0geHN1YikgeworCQkJdV9tZW1beCpjcy94c3ViXSA9IGNvbG9yc19taWRkbGVbeCAqIDcgLyB3aWR0aF0udTsKKwkJCXZfbWVtW3gqY3MveHN1Yl0gPSBjb2xvcnNfbWlkZGxlW3ggKiA3IC8gd2lkdGhdLnY7CisJCX0KKwkJdV9tZW0gKz0gc3RyaWRlICogY3MgLyB4c3ViOworCQl2X21lbSArPSBzdHJpZGUgKiBjcyAvIHhzdWI7CisJfQorCisJZm9yICg7IHkgPCBoZWlnaHQgLyB5c3ViOyArK3kpIHsKKwkJZm9yICh4ID0gMDsgeCA8IHdpZHRoICogNSAvIDc7IHggKz0geHN1YikgeworCQkJdV9tZW1beCpjcy94c3ViXSA9CisJCQkJY29sb3JzX2JvdHRvbVt4ICogNCAvICh3aWR0aCAqIDUgLyA3KV0udTsKKwkJCXZfbWVtW3gqY3MveHN1Yl0gPQorCQkJCWNvbG9yc19ib3R0b21beCAqIDQgLyAod2lkdGggKiA1IC8gNyldLnY7CisJCX0KKwkJZm9yICg7IHggPCB3aWR0aCAqIDYgLyA3OyB4ICs9IHhzdWIpIHsKKwkJCXVfbWVtW3gqY3MveHN1Yl0gPSBjb2xvcnNfYm90dG9tWyh4IC0gd2lkdGggKiA1IC8gNykgKgorCQkJCQkJCSAzIC8gKHdpZHRoIC8gNykgKyA0XS51OworCQkJdl9tZW1beCpjcy94c3ViXSA9IGNvbG9yc19ib3R0b21bKHggLSB3aWR0aCAqIDUgLyA3KSAqCisJCQkJCQkJIDMgLyAod2lkdGggLyA3KSArIDRdLnY7CisJCX0KKwkJZm9yICg7IHggPCB3aWR0aDsgeCArPSB4c3ViKSB7CisJCQl1X21lbVt4KmNzL3hzdWJdID0gY29sb3JzX2JvdHRvbVs3XS51OworCQkJdl9tZW1beCpjcy94c3ViXSA9IGNvbG9yc19ib3R0b21bN10udjsKKwkJfQorCQl1X21lbSArPSBzdHJpZGUgKiBjcyAvIHhzdWI7CisJCXZfbWVtICs9IHN0cmlkZSAqIGNzIC8geHN1YjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfc21wdGVfeXV2X3BhY2tlZChjb25zdCBzdHJ1Y3QgdXRpbF95dXZfaW5mbyAqeXV2LCB2b2lkICptZW0sCisJCQkJICB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsCisJCQkJICB1bnNpZ25lZCBpbnQgc3RyaWRlKQoreworCWNvbnN0IHN0cnVjdCBjb2xvcl95dXYgY29sb3JzX3RvcFtdID0geworCQlNQUtFX1lVVl82MDEoMTkxLCAxOTIsIDE5MiksCS8qIGdyZXkgKi8KKwkJTUFLRV9ZVVZfNjAxKDE5MiwgMTkyLCAwKSwJLyogeWVsbG93ICovCisJCU1BS0VfWVVWXzYwMSgwLCAxOTIsIDE5MiksCS8qIGN5YW4gKi8KKwkJTUFLRV9ZVVZfNjAxKDAsIDE5MiwgMCksCS8qIGdyZWVuICovCisJCU1BS0VfWVVWXzYwMSgxOTIsIDAsIDE5MiksCS8qIG1hZ2VudGEgKi8KKwkJTUFLRV9ZVVZfNjAxKDE5MiwgMCwgMCksCS8qIHJlZCAqLworCQlNQUtFX1lVVl82MDEoMCwgMCwgMTkyKSwJLyogYmx1ZSAqLworCX07CisJY29uc3Qgc3RydWN0IGNvbG9yX3l1diBjb2xvcnNfbWlkZGxlW10gPSB7CisJCU1BS0VfWVVWXzYwMSgwLCAwLCAxOTIpLAkvKiBibHVlICovCisJCU1BS0VfWVVWXzYwMSgxOSwgMTksIDE5KSwJLyogYmxhY2sgKi8KKwkJTUFLRV9ZVVZfNjAxKDE5MiwgMCwgMTkyKSwJLyogbWFnZW50YSAqLworCQlNQUtFX1lVVl82MDEoMTksIDE5LCAxOSksCS8qIGJsYWNrICovCisJCU1BS0VfWVVWXzYwMSgwLCAxOTIsIDE5MiksCS8qIGN5YW4gKi8KKwkJTUFLRV9ZVVZfNjAxKDE5LCAxOSwgMTkpLAkvKiBibGFjayAqLworCQlNQUtFX1lVVl82MDEoMTkyLCAxOTIsIDE5MiksCS8qIGdyZXkgKi8KKwl9OworCWNvbnN0IHN0cnVjdCBjb2xvcl95dXYgY29sb3JzX2JvdHRvbVtdID0geworCQlNQUtFX1lVVl82MDEoMCwgMzMsIDc2KSwJLyogaW4tcGhhc2UgKi8KKwkJTUFLRV9ZVVZfNjAxKDI1NSwgMjU1LCAyNTUpLAkvKiBzdXBlciB3aGl0ZSAqLworCQlNQUtFX1lVVl82MDEoNTAsIDAsIDEwNiksCS8qIHF1YWRyYXR1cmUgKi8KKwkJTUFLRV9ZVVZfNjAxKDE5LCAxOSwgMTkpLAkvKiBibGFjayAqLworCQlNQUtFX1lVVl82MDEoOSwgOSwgOSksCQkvKiAzLjUlICovCisJCU1BS0VfWVVWXzYwMSgxOSwgMTksIDE5KSwJLyogNy41JSAqLworCQlNQUtFX1lVVl82MDEoMjksIDI5LCAyOSksCS8qIDExLjUlICovCisJCU1BS0VfWVVWXzYwMSgxOSwgMTksIDE5KSwJLyogYmxhY2sgKi8KKwl9OworCXVuc2lnbmVkIGNoYXIgKnlfbWVtID0gKHl1di0+b3JkZXIgJiBZVVZfWUMpID8gbWVtIDogbWVtICsgMTsKKwl1bnNpZ25lZCBjaGFyICpjX21lbSA9ICh5dXYtPm9yZGVyICYgWVVWX0NZKSA/IG1lbSA6IG1lbSArIDE7CisJdW5zaWduZWQgaW50IHUgPSAoeXV2LT5vcmRlciAmIFlVVl9ZQ3JDYikgPyAyIDogMDsKKwl1bnNpZ25lZCBpbnQgdiA9ICh5dXYtPm9yZGVyICYgWVVWX1lDYkNyKSA/IDIgOiAwOworCXVuc2lnbmVkIGludCB4OworCXVuc2lnbmVkIGludCB5OworCisJLyogTHVtYSAqLworCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQgKiA2IC8gOTsgKyt5KSB7CisJCWZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KQorCQkJeV9tZW1bMip4XSA9IGNvbG9yc190b3BbeCAqIDcgLyB3aWR0aF0ueTsKKwkJeV9tZW0gKz0gc3RyaWRlOworCX0KKworCWZvciAoOyB5IDwgaGVpZ2h0ICogNyAvIDk7ICsreSkgeworCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkKKwkJCXlfbWVtWzIqeF0gPSBjb2xvcnNfbWlkZGxlW3ggKiA3IC8gd2lkdGhdLnk7CisJCXlfbWVtICs9IHN0cmlkZTsKKwl9CisKKwlmb3IgKDsgeSA8IGhlaWdodDsgKyt5KSB7CisJCWZvciAoeCA9IDA7IHggPCB3aWR0aCAqIDUgLyA3OyArK3gpCisJCQl5X21lbVsyKnhdID0gY29sb3JzX2JvdHRvbVt4ICogNCAvICh3aWR0aCAqIDUgLyA3KV0ueTsKKwkJZm9yICg7IHggPCB3aWR0aCAqIDYgLyA3OyArK3gpCisJCQl5X21lbVsyKnhdID0gY29sb3JzX2JvdHRvbVsoeCAtIHdpZHRoICogNSAvIDcpICogMworCQkJCQkJICAgLyAod2lkdGggLyA3KSArIDRdLnk7CisJCWZvciAoOyB4IDwgd2lkdGg7ICsreCkKKwkJCXlfbWVtWzIqeF0gPSBjb2xvcnNfYm90dG9tWzddLnk7CisJCXlfbWVtICs9IHN0cmlkZTsKKwl9CisKKwkvKiBDaHJvbWEgKi8KKwlmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0ICogNiAvIDk7ICsreSkgeworCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gMikgeworCQkJY19tZW1bMip4K3VdID0gY29sb3JzX3RvcFt4ICogNyAvIHdpZHRoXS51OworCQkJY19tZW1bMip4K3ZdID0gY29sb3JzX3RvcFt4ICogNyAvIHdpZHRoXS52OworCQl9CisJCWNfbWVtICs9IHN0cmlkZTsKKwl9CisKKwlmb3IgKDsgeSA8IGhlaWdodCAqIDcgLyA5OyArK3kpIHsKKwkJZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDIpIHsKKwkJCWNfbWVtWzIqeCt1XSA9IGNvbG9yc19taWRkbGVbeCAqIDcgLyB3aWR0aF0udTsKKwkJCWNfbWVtWzIqeCt2XSA9IGNvbG9yc19taWRkbGVbeCAqIDcgLyB3aWR0aF0udjsKKwkJfQorCQljX21lbSArPSBzdHJpZGU7CisJfQorCisJZm9yICg7IHkgPCBoZWlnaHQ7ICsreSkgeworCQlmb3IgKHggPSAwOyB4IDwgd2lkdGggKiA1IC8gNzsgeCArPSAyKSB7CisJCQljX21lbVsyKngrdV0gPSBjb2xvcnNfYm90dG9tW3ggKiA0IC8gKHdpZHRoICogNSAvIDcpXS51OworCQkJY19tZW1bMip4K3ZdID0gY29sb3JzX2JvdHRvbVt4ICogNCAvICh3aWR0aCAqIDUgLyA3KV0udjsKKwkJfQorCQlmb3IgKDsgeCA8IHdpZHRoICogNiAvIDc7IHggKz0gMikgeworCQkJY19tZW1bMip4K3VdID0gY29sb3JzX2JvdHRvbVsoeCAtIHdpZHRoICogNSAvIDcpICoKKwkJCQkJCSAgICAgMyAvICh3aWR0aCAvIDcpICsgNF0udTsKKwkJCWNfbWVtWzIqeCt2XSA9IGNvbG9yc19ib3R0b21bKHggLSB3aWR0aCAqIDUgLyA3KSAqCisJCQkJCQkgICAgIDMgLyAod2lkdGggLyA3KSArIDRdLnY7CisJCX0KKwkJZm9yICg7IHggPCB3aWR0aDsgeCArPSAyKSB7CisJCQljX21lbVsyKngrdV0gPSBjb2xvcnNfYm90dG9tWzddLnU7CisJCQljX21lbVsyKngrdl0gPSBjb2xvcnNfYm90dG9tWzddLnY7CisJCX0KKwkJY19tZW0gKz0gc3RyaWRlOworCX0KK30KKworc3RhdGljIHZvaWQgZmlsbF9zbXB0ZV9yZ2IxNihjb25zdCBzdHJ1Y3QgdXRpbF9yZ2JfaW5mbyAqcmdiLCB2b2lkICptZW0sCisJCQkgICAgIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwKKwkJCSAgICAgdW5zaWduZWQgaW50IHN0cmlkZSkKK3sKKwljb25zdCB1aW50MTZfdCBjb2xvcnNfdG9wW10gPSB7CisJCU1BS0VfUkdCQShyZ2IsIDE5MiwgMTkyLCAxOTIsIDI1NSksCS8qIGdyZXkgKi8KKwkJTUFLRV9SR0JBKHJnYiwgMTkyLCAxOTIsIDAsIDI1NSksCS8qIHllbGxvdyAqLworCQlNQUtFX1JHQkEocmdiLCAwLCAxOTIsIDE5MiwgMjU1KSwJLyogY3lhbiAqLworCQlNQUtFX1JHQkEocmdiLCAwLCAxOTIsIDAsIDI1NSksCQkvKiBncmVlbiAqLworCQlNQUtFX1JHQkEocmdiLCAxOTIsIDAsIDE5MiwgMjU1KSwJLyogbWFnZW50YSAqLworCQlNQUtFX1JHQkEocmdiLCAxOTIsIDAsIDAsIDI1NSksCQkvKiByZWQgKi8KKwkJTUFLRV9SR0JBKHJnYiwgMCwgMCwgMTkyLCAyNTUpLAkJLyogYmx1ZSAqLworCX07CisJY29uc3QgdWludDE2X3QgY29sb3JzX21pZGRsZVtdID0geworCQlNQUtFX1JHQkEocmdiLCAwLCAwLCAxOTIsIDEyNyksCQkvKiBibHVlICovCisJCU1BS0VfUkdCQShyZ2IsIDE5LCAxOSwgMTksIDEyNyksCS8qIGJsYWNrICovCisJCU1BS0VfUkdCQShyZ2IsIDE5MiwgMCwgMTkyLCAxMjcpLAkvKiBtYWdlbnRhICovCisJCU1BS0VfUkdCQShyZ2IsIDE5LCAxOSwgMTksIDEyNyksCS8qIGJsYWNrICovCisJCU1BS0VfUkdCQShyZ2IsIDAsIDE5MiwgMTkyLCAxMjcpLAkvKiBjeWFuICovCisJCU1BS0VfUkdCQShyZ2IsIDE5LCAxOSwgMTksIDEyNyksCS8qIGJsYWNrICovCisJCU1BS0VfUkdCQShyZ2IsIDE5MiwgMTkyLCAxOTIsIDEyNyksCS8qIGdyZXkgKi8KKwl9OworCWNvbnN0IHVpbnQxNl90IGNvbG9yc19ib3R0b21bXSA9IHsKKwkJTUFLRV9SR0JBKHJnYiwgMCwgMzMsIDc2LCAyNTUpLAkJLyogaW4tcGhhc2UgKi8KKwkJTUFLRV9SR0JBKHJnYiwgMjU1LCAyNTUsIDI1NSwgMjU1KSwJLyogc3VwZXIgd2hpdGUgKi8KKwkJTUFLRV9SR0JBKHJnYiwgNTAsIDAsIDEwNiwgMjU1KSwJLyogcXVhZHJhdHVyZSAqLworCQlNQUtFX1JHQkEocmdiLCAxOSwgMTksIDE5LCAyNTUpLAkvKiBibGFjayAqLworCQlNQUtFX1JHQkEocmdiLCA5LCA5LCA5LCAyNTUpLAkJLyogMy41JSAqLworCQlNQUtFX1JHQkEocmdiLCAxOSwgMTksIDE5LCAyNTUpLAkvKiA3LjUlICovCisJCU1BS0VfUkdCQShyZ2IsIDI5LCAyOSwgMjksIDI1NSksCS8qIDExLjUlICovCisJCU1BS0VfUkdCQShyZ2IsIDE5LCAxOSwgMTksIDI1NSksCS8qIGJsYWNrICovCisJfTsKKwl1bnNpZ25lZCBpbnQgeDsKKwl1bnNpZ25lZCBpbnQgeTsKKworCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQgKiA2IC8gOTsgKyt5KSB7CisJCWZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KQorCQkJKCh1aW50MTZfdCAqKW1lbSlbeF0gPSBjb2xvcnNfdG9wW3ggKiA3IC8gd2lkdGhdOworCQltZW0gKz0gc3RyaWRlOworCX0KKworCWZvciAoOyB5IDwgaGVpZ2h0ICogNyAvIDk7ICsreSkgeworCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkKKwkJCSgodWludDE2X3QgKiltZW0pW3hdID0gY29sb3JzX21pZGRsZVt4ICogNyAvIHdpZHRoXTsKKwkJbWVtICs9IHN0cmlkZTsKKwl9CisKKwlmb3IgKDsgeSA8IGhlaWdodDsgKyt5KSB7CisJCWZvciAoeCA9IDA7IHggPCB3aWR0aCAqIDUgLyA3OyArK3gpCisJCQkoKHVpbnQxNl90ICopbWVtKVt4XSA9CisJCQkJY29sb3JzX2JvdHRvbVt4ICogNCAvICh3aWR0aCAqIDUgLyA3KV07CisJCWZvciAoOyB4IDwgd2lkdGggKiA2IC8gNzsgKyt4KQorCQkJKCh1aW50MTZfdCAqKW1lbSlbeF0gPQorCQkJCWNvbG9yc19ib3R0b21bKHggLSB3aWR0aCAqIDUgLyA3KSAqIDMKKwkJCQkJICAgICAgLyAod2lkdGggLyA3KSArIDRdOworCQlmb3IgKDsgeCA8IHdpZHRoOyArK3gpCisJCQkoKHVpbnQxNl90ICopbWVtKVt4XSA9IGNvbG9yc19ib3R0b21bN107CisJCW1lbSArPSBzdHJpZGU7CisJfQorfQorCitzdGF0aWMgdm9pZCBmaWxsX3NtcHRlX3JnYjI0KGNvbnN0IHN0cnVjdCB1dGlsX3JnYl9pbmZvICpyZ2IsIHZvaWQgKm1lbSwKKwkJCSAgICAgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LAorCQkJICAgICB1bnNpZ25lZCBpbnQgc3RyaWRlKQoreworCWNvbnN0IHN0cnVjdCBjb2xvcl9yZ2IyNCBjb2xvcnNfdG9wW10gPSB7CisJCU1BS0VfUkdCMjQocmdiLCAxOTIsIDE5MiwgMTkyKSwJLyogZ3JleSAqLworCQlNQUtFX1JHQjI0KHJnYiwgMTkyLCAxOTIsIDApLAkvKiB5ZWxsb3cgKi8KKwkJTUFLRV9SR0IyNChyZ2IsIDAsIDE5MiwgMTkyKSwJLyogY3lhbiAqLworCQlNQUtFX1JHQjI0KHJnYiwgMCwgMTkyLCAwKSwJLyogZ3JlZW4gKi8KKwkJTUFLRV9SR0IyNChyZ2IsIDE5MiwgMCwgMTkyKSwJLyogbWFnZW50YSAqLworCQlNQUtFX1JHQjI0KHJnYiwgMTkyLCAwLCAwKSwJLyogcmVkICovCisJCU1BS0VfUkdCMjQocmdiLCAwLCAwLCAxOTIpLAkvKiBibHVlICovCisJfTsKKwljb25zdCBzdHJ1Y3QgY29sb3JfcmdiMjQgY29sb3JzX21pZGRsZVtdID0geworCQlNQUtFX1JHQjI0KHJnYiwgMCwgMCwgMTkyKSwJLyogYmx1ZSAqLworCQlNQUtFX1JHQjI0KHJnYiwgMTksIDE5LCAxOSksCS8qIGJsYWNrICovCisJCU1BS0VfUkdCMjQocmdiLCAxOTIsIDAsIDE5MiksCS8qIG1hZ2VudGEgKi8KKwkJTUFLRV9SR0IyNChyZ2IsIDE5LCAxOSwgMTkpLAkvKiBibGFjayAqLworCQlNQUtFX1JHQjI0KHJnYiwgMCwgMTkyLCAxOTIpLAkvKiBjeWFuICovCisJCU1BS0VfUkdCMjQocmdiLCAxOSwgMTksIDE5KSwJLyogYmxhY2sgKi8KKwkJTUFLRV9SR0IyNChyZ2IsIDE5MiwgMTkyLCAxOTIpLAkvKiBncmV5ICovCisJfTsKKwljb25zdCBzdHJ1Y3QgY29sb3JfcmdiMjQgY29sb3JzX2JvdHRvbVtdID0geworCQlNQUtFX1JHQjI0KHJnYiwgMCwgMzMsIDc2KSwJLyogaW4tcGhhc2UgKi8KKwkJTUFLRV9SR0IyNChyZ2IsIDI1NSwgMjU1LCAyNTUpLAkvKiBzdXBlciB3aGl0ZSAqLworCQlNQUtFX1JHQjI0KHJnYiwgNTAsIDAsIDEwNiksCS8qIHF1YWRyYXR1cmUgKi8KKwkJTUFLRV9SR0IyNChyZ2IsIDE5LCAxOSwgMTkpLAkvKiBibGFjayAqLworCQlNQUtFX1JHQjI0KHJnYiwgOSwgOSwgOSksCS8qIDMuNSUgKi8KKwkJTUFLRV9SR0IyNChyZ2IsIDE5LCAxOSwgMTkpLAkvKiA3LjUlICovCisJCU1BS0VfUkdCMjQocmdiLCAyOSwgMjksIDI5KSwJLyogMTEuNSUgKi8KKwkJTUFLRV9SR0IyNChyZ2IsIDE5LCAxOSwgMTkpLAkvKiBibGFjayAqLworCX07CisJdW5zaWduZWQgaW50IHg7CisJdW5zaWduZWQgaW50IHk7CisKKwlmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0ICogNiAvIDk7ICsreSkgeworCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkKKwkJCSgoc3RydWN0IGNvbG9yX3JnYjI0ICopbWVtKVt4XSA9CisJCQkJY29sb3JzX3RvcFt4ICogNyAvIHdpZHRoXTsKKwkJbWVtICs9IHN0cmlkZTsKKwl9CisKKwlmb3IgKDsgeSA8IGhlaWdodCAqIDcgLyA5OyArK3kpIHsKKwkJZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpCisJCQkoKHN0cnVjdCBjb2xvcl9yZ2IyNCAqKW1lbSlbeF0gPQorCQkJCWNvbG9yc19taWRkbGVbeCAqIDcgLyB3aWR0aF07CisJCW1lbSArPSBzdHJpZGU7CisJfQorCisJZm9yICg7IHkgPCBoZWlnaHQ7ICsreSkgeworCQlmb3IgKHggPSAwOyB4IDwgd2lkdGggKiA1IC8gNzsgKyt4KQorCQkJKChzdHJ1Y3QgY29sb3JfcmdiMjQgKiltZW0pW3hdID0KKwkJCQljb2xvcnNfYm90dG9tW3ggKiA0IC8gKHdpZHRoICogNSAvIDcpXTsKKwkJZm9yICg7IHggPCB3aWR0aCAqIDYgLyA3OyArK3gpCisJCQkoKHN0cnVjdCBjb2xvcl9yZ2IyNCAqKW1lbSlbeF0gPQorCQkJCWNvbG9yc19ib3R0b21bKHggLSB3aWR0aCAqIDUgLyA3KSAqIDMKKwkJCQkJICAgICAgLyAod2lkdGggLyA3KSArIDRdOworCQlmb3IgKDsgeCA8IHdpZHRoOyArK3gpCisJCQkoKHN0cnVjdCBjb2xvcl9yZ2IyNCAqKW1lbSlbeF0gPSBjb2xvcnNfYm90dG9tWzddOworCQltZW0gKz0gc3RyaWRlOworCX0KK30KKworc3RhdGljIHZvaWQgZmlsbF9zbXB0ZV9yZ2IzMihjb25zdCBzdHJ1Y3QgdXRpbF9yZ2JfaW5mbyAqcmdiLCB2b2lkICptZW0sCisJCQkgICAgIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwKKwkJCSAgICAgdW5zaWduZWQgaW50IHN0cmlkZSkKK3sKKwljb25zdCB1aW50MzJfdCBjb2xvcnNfdG9wW10gPSB7CisJCU1BS0VfUkdCQShyZ2IsIDE5MiwgMTkyLCAxOTIsIDI1NSksCS8qIGdyZXkgKi8KKwkJTUFLRV9SR0JBKHJnYiwgMTkyLCAxOTIsIDAsIDI1NSksCS8qIHllbGxvdyAqLworCQlNQUtFX1JHQkEocmdiLCAwLCAxOTIsIDE5MiwgMjU1KSwJLyogY3lhbiAqLworCQlNQUtFX1JHQkEocmdiLCAwLCAxOTIsIDAsIDI1NSksCQkvKiBncmVlbiAqLworCQlNQUtFX1JHQkEocmdiLCAxOTIsIDAsIDE5MiwgMjU1KSwJLyogbWFnZW50YSAqLworCQlNQUtFX1JHQkEocmdiLCAxOTIsIDAsIDAsIDI1NSksCQkvKiByZWQgKi8KKwkJTUFLRV9SR0JBKHJnYiwgMCwgMCwgMTkyLCAyNTUpLAkJLyogYmx1ZSAqLworCX07CisJY29uc3QgdWludDMyX3QgY29sb3JzX21pZGRsZVtdID0geworCQlNQUtFX1JHQkEocmdiLCAwLCAwLCAxOTIsIDEyNyksCQkvKiBibHVlICovCisJCU1BS0VfUkdCQShyZ2IsIDE5LCAxOSwgMTksIDEyNyksCS8qIGJsYWNrICovCisJCU1BS0VfUkdCQShyZ2IsIDE5MiwgMCwgMTkyLCAxMjcpLAkvKiBtYWdlbnRhICovCisJCU1BS0VfUkdCQShyZ2IsIDE5LCAxOSwgMTksIDEyNyksCS8qIGJsYWNrICovCisJCU1BS0VfUkdCQShyZ2IsIDAsIDE5MiwgMTkyLCAxMjcpLAkvKiBjeWFuICovCisJCU1BS0VfUkdCQShyZ2IsIDE5LCAxOSwgMTksIDEyNyksCS8qIGJsYWNrICovCisJCU1BS0VfUkdCQShyZ2IsIDE5MiwgMTkyLCAxOTIsIDEyNyksCS8qIGdyZXkgKi8KKwl9OworCWNvbnN0IHVpbnQzMl90IGNvbG9yc19ib3R0b21bXSA9IHsKKwkJTUFLRV9SR0JBKHJnYiwgMCwgMzMsIDc2LCAyNTUpLAkJLyogaW4tcGhhc2UgKi8KKwkJTUFLRV9SR0JBKHJnYiwgMjU1LCAyNTUsIDI1NSwgMjU1KSwJLyogc3VwZXIgd2hpdGUgKi8KKwkJTUFLRV9SR0JBKHJnYiwgNTAsIDAsIDEwNiwgMjU1KSwJLyogcXVhZHJhdHVyZSAqLworCQlNQUtFX1JHQkEocmdiLCAxOSwgMTksIDE5LCAyNTUpLAkvKiBibGFjayAqLworCQlNQUtFX1JHQkEocmdiLCA5LCA5LCA5LCAyNTUpLAkJLyogMy41JSAqLworCQlNQUtFX1JHQkEocmdiLCAxOSwgMTksIDE5LCAyNTUpLAkvKiA3LjUlICovCisJCU1BS0VfUkdCQShyZ2IsIDI5LCAyOSwgMjksIDI1NSksCS8qIDExLjUlICovCisJCU1BS0VfUkdCQShyZ2IsIDE5LCAxOSwgMTksIDI1NSksCS8qIGJsYWNrICovCisJfTsKKwl1bnNpZ25lZCBpbnQgeDsKKwl1bnNpZ25lZCBpbnQgeTsKKworCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQgKiA2IC8gOTsgKyt5KSB7CisJCWZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KQorCQkJKCh1aW50MzJfdCAqKW1lbSlbeF0gPSBjb2xvcnNfdG9wW3ggKiA3IC8gd2lkdGhdOworCQltZW0gKz0gc3RyaWRlOworCX0KKworCWZvciAoOyB5IDwgaGVpZ2h0ICogNyAvIDk7ICsreSkgeworCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkKKwkJCSgodWludDMyX3QgKiltZW0pW3hdID0gY29sb3JzX21pZGRsZVt4ICogNyAvIHdpZHRoXTsKKwkJbWVtICs9IHN0cmlkZTsKKwl9CisKKwlmb3IgKDsgeSA8IGhlaWdodDsgKyt5KSB7CisJCWZvciAoeCA9IDA7IHggPCB3aWR0aCAqIDUgLyA3OyArK3gpCisJCQkoKHVpbnQzMl90ICopbWVtKVt4XSA9CisJCQkJY29sb3JzX2JvdHRvbVt4ICogNCAvICh3aWR0aCAqIDUgLyA3KV07CisJCWZvciAoOyB4IDwgd2lkdGggKiA2IC8gNzsgKyt4KQorCQkJKCh1aW50MzJfdCAqKW1lbSlbeF0gPQorCQkJCWNvbG9yc19ib3R0b21bKHggLSB3aWR0aCAqIDUgLyA3KSAqIDMKKwkJCQkJICAgICAgLyAod2lkdGggLyA3KSArIDRdOworCQlmb3IgKDsgeCA8IHdpZHRoOyArK3gpCisJCQkoKHVpbnQzMl90ICopbWVtKVt4XSA9IGNvbG9yc19ib3R0b21bN107CisJCW1lbSArPSBzdHJpZGU7CisJfQorfQorCitzdGF0aWMgdm9pZCBmaWxsX3NtcHRlKGNvbnN0IHN0cnVjdCB1dGlsX2Zvcm1hdF9pbmZvICppbmZvLCB2b2lkICpwbGFuZXNbM10sCisJCSAgICAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgc3RyaWRlKQoreworCXVuc2lnbmVkIGNoYXIgKnUsICp2OworCisJc3dpdGNoIChpbmZvLT5mb3JtYXQpIHsKKwljYXNlIERSTV9GT1JNQVRfVVlWWToKKwljYXNlIERSTV9GT1JNQVRfVllVWToKKwljYXNlIERSTV9GT1JNQVRfWVVZVjoKKwljYXNlIERSTV9GT1JNQVRfWVZZVToKKwkJcmV0dXJuIGZpbGxfc21wdGVfeXV2X3BhY2tlZCgmaW5mby0+eXV2LCBwbGFuZXNbMF0sIHdpZHRoLAorCQkJCQkgICAgIGhlaWdodCwgc3RyaWRlKTsKKworCWNhc2UgRFJNX0ZPUk1BVF9OVjEyOgorCWNhc2UgRFJNX0ZPUk1BVF9OVjIxOgorCWNhc2UgRFJNX0ZPUk1BVF9OVjE2OgorCWNhc2UgRFJNX0ZPUk1BVF9OVjYxOgorCQl1ID0gaW5mby0+eXV2Lm9yZGVyICYgWVVWX1lDYkNyID8gcGxhbmVzWzFdIDogcGxhbmVzWzFdICsgMTsKKwkJdiA9IGluZm8tPnl1di5vcmRlciAmIFlVVl9ZQ3JDYiA/IHBsYW5lc1sxXSA6IHBsYW5lc1sxXSArIDE7CisJCXJldHVybiBmaWxsX3NtcHRlX3l1dl9wbGFuYXIoJmluZm8tPnl1diwgcGxhbmVzWzBdLCB1LCB2LAorCQkJCQkgICAgIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSk7CisKKwljYXNlIERSTV9GT1JNQVRfWVVWNDIwOgorCQlyZXR1cm4gZmlsbF9zbXB0ZV95dXZfcGxhbmFyKCZpbmZvLT55dXYsIHBsYW5lc1swXSwgcGxhbmVzWzFdLAorCQkJCQkgICAgIHBsYW5lc1syXSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlKTsKKworCWNhc2UgRFJNX0ZPUk1BVF9ZVlU0MjA6CisJCXJldHVybiBmaWxsX3NtcHRlX3l1dl9wbGFuYXIoJmluZm8tPnl1diwgcGxhbmVzWzBdLCBwbGFuZXNbMl0sCisJCQkJCSAgICAgcGxhbmVzWzFdLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUpOworCisJY2FzZSBEUk1fRk9STUFUX0FSR0I0NDQ0OgorCWNhc2UgRFJNX0ZPUk1BVF9YUkdCNDQ0NDoKKwljYXNlIERSTV9GT1JNQVRfQUJHUjQ0NDQ6CisJY2FzZSBEUk1fRk9STUFUX1hCR1I0NDQ0OgorCWNhc2UgRFJNX0ZPUk1BVF9SR0JBNDQ0NDoKKwljYXNlIERSTV9GT1JNQVRfUkdCWDQ0NDQ6CisJY2FzZSBEUk1fRk9STUFUX0JHUkE0NDQ0OgorCWNhc2UgRFJNX0ZPUk1BVF9CR1JYNDQ0NDoKKwljYXNlIERSTV9GT1JNQVRfUkdCNTY1OgorCWNhc2UgRFJNX0ZPUk1BVF9CR1I1NjU6CisJY2FzZSBEUk1fRk9STUFUX0FSR0IxNTU1OgorCWNhc2UgRFJNX0ZPUk1BVF9YUkdCMTU1NToKKwljYXNlIERSTV9GT1JNQVRfQUJHUjE1NTU6CisJY2FzZSBEUk1fRk9STUFUX1hCR1IxNTU1OgorCWNhc2UgRFJNX0ZPUk1BVF9SR0JBNTU1MToKKwljYXNlIERSTV9GT1JNQVRfUkdCWDU1NTE6CisJY2FzZSBEUk1fRk9STUFUX0JHUkE1NTUxOgorCWNhc2UgRFJNX0ZPUk1BVF9CR1JYNTU1MToKKwkJcmV0dXJuIGZpbGxfc21wdGVfcmdiMTYoJmluZm8tPnJnYiwgcGxhbmVzWzBdLAorCQkJCQl3aWR0aCwgaGVpZ2h0LCBzdHJpZGUpOworCisJY2FzZSBEUk1fRk9STUFUX0JHUjg4ODoKKwljYXNlIERSTV9GT1JNQVRfUkdCODg4OgorCQlyZXR1cm4gZmlsbF9zbXB0ZV9yZ2IyNCgmaW5mby0+cmdiLCBwbGFuZXNbMF0sCisJCQkJCXdpZHRoLCBoZWlnaHQsIHN0cmlkZSk7CisJY2FzZSBEUk1fRk9STUFUX0FSR0I4ODg4OgorCWNhc2UgRFJNX0ZPUk1BVF9YUkdCODg4ODoKKwljYXNlIERSTV9GT1JNQVRfQUJHUjg4ODg6CisJY2FzZSBEUk1fRk9STUFUX1hCR1I4ODg4OgorCWNhc2UgRFJNX0ZPUk1BVF9SR0JBODg4ODoKKwljYXNlIERSTV9GT1JNQVRfUkdCWDg4ODg6CisJY2FzZSBEUk1fRk9STUFUX0JHUkE4ODg4OgorCWNhc2UgRFJNX0ZPUk1BVF9CR1JYODg4ODoKKwljYXNlIERSTV9GT1JNQVRfQVJHQjIxMDEwMTA6CisJY2FzZSBEUk1fRk9STUFUX1hSR0IyMTAxMDEwOgorCWNhc2UgRFJNX0ZPUk1BVF9BQkdSMjEwMTAxMDoKKwljYXNlIERSTV9GT1JNQVRfWEJHUjIxMDEwMTA6CisJY2FzZSBEUk1fRk9STUFUX1JHQkExMDEwMTAyOgorCWNhc2UgRFJNX0ZPUk1BVF9SR0JYMTAxMDEwMjoKKwljYXNlIERSTV9GT1JNQVRfQkdSQTEwMTAxMDI6CisJY2FzZSBEUk1fRk9STUFUX0JHUlgxMDEwMTAyOgorCQlyZXR1cm4gZmlsbF9zbXB0ZV9yZ2IzMigmaW5mby0+cmdiLCBwbGFuZXNbMF0sCisJCQkJCXdpZHRoLCBoZWlnaHQsIHN0cmlkZSk7CisJfQorfQorCisvKiBzd2FwIHRoZXNlIGZvciBiaWcgZW5kaWFuLi4gKi8KKyNkZWZpbmUgUkVEICAgMgorI2RlZmluZSBHUkVFTiAxCisjZGVmaW5lIEJMVUUgIDAKKworc3RhdGljIHZvaWQgbWFrZV9wd2V0dHkodm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LAorCQkJdW5zaWduZWQgaW50IHN0cmlkZSwgdWludDMyX3QgZm9ybWF0KQoreworI2lmZGVmIEhBVkVfQ0FJUk8KKwljYWlyb19zdXJmYWNlX3QgKnN1cmZhY2U7CisJY2Fpcm9fdCAqY3I7CisJaW50IHgsIHk7CisJY2Fpcm9fZm9ybWF0X3QgY2Fpcm9fZm9ybWF0OworCisJLyogd2UgY2FuIGlnbm9yZSB0aGUgb3JkZXIgb2YgUixHLEIgY2hhbm5lbHMgKi8KKwlzd2l0Y2ggKGZvcm1hdCkgeworCWNhc2UgRFJNX0ZPUk1BVF9YUkdCODg4ODoKKwljYXNlIERSTV9GT1JNQVRfQVJHQjg4ODg6CisJY2FzZSBEUk1fRk9STUFUX1hCR1I4ODg4OgorCWNhc2UgRFJNX0ZPUk1BVF9BQkdSODg4ODoKKwkJY2Fpcm9fZm9ybWF0ID0gQ0FJUk9fRk9STUFUX0FSR0IzMjsKKwkJYnJlYWs7CisJY2FzZSBEUk1fRk9STUFUX1JHQjU2NToKKwljYXNlIERSTV9GT1JNQVRfQkdSNTY1OgorCQljYWlyb19mb3JtYXQgPSBDQUlST19GT1JNQVRfUkdCMTZfNTY1OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJc3VyZmFjZSA9IGNhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlX2Zvcl9kYXRhKGRhdGEsCisJCQkJCQkgICAgICBjYWlyb19mb3JtYXQsCisJCQkJCQkgICAgICB3aWR0aCwgaGVpZ2h0LAorCQkJCQkJICAgICAgc3RyaWRlKTsKKwljciA9IGNhaXJvX2NyZWF0ZShzdXJmYWNlKTsKKwljYWlyb19zdXJmYWNlX2Rlc3Ryb3koc3VyZmFjZSk7CisKKwljYWlyb19zZXRfbGluZV9jYXAoY3IsIENBSVJPX0xJTkVfQ0FQX1NRVUFSRSk7CisJZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDI1MCkKKwkJZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSArPSAyNTApIHsKKwkJCWNoYXIgYnVmWzY0XTsKKworCQkJY2Fpcm9fbW92ZV90byhjciwgeCwgeSAtIDIwKTsKKwkJCWNhaXJvX2xpbmVfdG8oY3IsIHgsIHkgKyAyMCk7CisJCQljYWlyb19tb3ZlX3RvKGNyLCB4IC0gMjAsIHkpOworCQkJY2Fpcm9fbGluZV90byhjciwgeCArIDIwLCB5KTsKKwkJCWNhaXJvX25ld19zdWJfcGF0aChjcik7CisJCQljYWlyb19hcmMoY3IsIHgsIHksIDEwLCAwLCBNX1BJICogMik7CisJCQljYWlyb19zZXRfbGluZV93aWR0aChjciwgNCk7CisJCQljYWlyb19zZXRfc291cmNlX3JnYihjciwgMCwgMCwgMCk7CisJCQljYWlyb19zdHJva2VfcHJlc2VydmUoY3IpOworCQkJY2Fpcm9fc2V0X3NvdXJjZV9yZ2IoY3IsIDEsIDEsIDEpOworCQkJY2Fpcm9fc2V0X2xpbmVfd2lkdGgoY3IsIDIpOworCQkJY2Fpcm9fc3Ryb2tlKGNyKTsKKworCQkJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiJWQsICVkIiwgeCwgeSk7CisJCQljYWlyb19tb3ZlX3RvKGNyLCB4ICsgMjAsIHkgKyAyMCk7CisJCQljYWlyb190ZXh0X3BhdGgoY3IsIGJ1Zik7CisJCQljYWlyb19zZXRfc291cmNlX3JnYihjciwgMCwgMCwgMCk7CisJCQljYWlyb19zdHJva2VfcHJlc2VydmUoY3IpOworCQkJY2Fpcm9fc2V0X3NvdXJjZV9yZ2IoY3IsIDEsIDEsIDEpOworCQkJY2Fpcm9fZmlsbChjcik7CisJCX0KKworCWNhaXJvX2Rlc3Ryb3koY3IpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGZpbGxfdGlsZXNfeXV2X3BsYW5hcihjb25zdCBzdHJ1Y3QgdXRpbF9mb3JtYXRfaW5mbyAqaW5mbywKKwkJCQkgIHVuc2lnbmVkIGNoYXIgKnlfbWVtLCB1bnNpZ25lZCBjaGFyICp1X21lbSwKKwkJCQkgIHVuc2lnbmVkIGNoYXIgKnZfbWVtLCB1bnNpZ25lZCBpbnQgd2lkdGgsCisJCQkJICB1bnNpZ25lZCBpbnQgaGVpZ2h0LCB1bnNpZ25lZCBpbnQgc3RyaWRlKQoreworCWNvbnN0IHN0cnVjdCB1dGlsX3l1dl9pbmZvICp5dXYgPSAmaW5mby0+eXV2OworCXVuc2lnbmVkIGludCBjcyA9IHl1di0+Y2hyb21hX3N0cmlkZTsKKwl1bnNpZ25lZCBpbnQgeHN1YiA9IHl1di0+eHN1YjsKKwl1bnNpZ25lZCBpbnQgeXN1YiA9IHl1di0+eXN1YjsKKwl1bnNpZ25lZCBpbnQgeDsKKwl1bnNpZ25lZCBpbnQgeTsKKworCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworCQkJZGl2X3QgZCA9IGRpdih4K3ksIHdpZHRoKTsKKwkJCXVpbnQzMl90IHJnYjMyID0gMHgwMDEzMDUwMiAqIChkLnF1b3QgPj4gNikKKwkJCQkgICAgICAgKyAweDAwMGExMTIwICogKGQucmVtID4+IDYpOworCQkJc3RydWN0IGNvbG9yX3l1diBjb2xvciA9CisJCQkJTUFLRV9ZVVZfNjAxKChyZ2IzMiA+PiAxNikgJiAweGZmLAorCQkJCQkgICAgIChyZ2IzMiA+PiA4KSAmIDB4ZmYsIHJnYjMyICYgMHhmZik7CisKKwkJCXlfbWVtW3hdID0gY29sb3IueTsKKwkJCXVfbWVtW3gveHN1Yipjc10gPSBjb2xvci51OworCQkJdl9tZW1beC94c3ViKmNzXSA9IGNvbG9yLnY7CisJCX0KKworCQl5X21lbSArPSBzdHJpZGU7CisJCWlmICgoeSArIDEpICUgeXN1YiA9PSAwKSB7CisJCQl1X21lbSArPSBzdHJpZGUgKiBjcyAvIHhzdWI7CisJCQl2X21lbSArPSBzdHJpZGUgKiBjcyAvIHhzdWI7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfdGlsZXNfeXV2X3BhY2tlZChjb25zdCBzdHJ1Y3QgdXRpbF9mb3JtYXRfaW5mbyAqaW5mbywKKwkJCQkgIHZvaWQgKm1lbSwgdW5zaWduZWQgaW50IHdpZHRoLAorCQkJCSAgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IHN0cmlkZSkKK3sKKwljb25zdCBzdHJ1Y3QgdXRpbF95dXZfaW5mbyAqeXV2ID0gJmluZm8tPnl1djsKKwl1bnNpZ25lZCBjaGFyICp5X21lbSA9ICh5dXYtPm9yZGVyICYgWVVWX1lDKSA/IG1lbSA6IG1lbSArIDE7CisJdW5zaWduZWQgY2hhciAqY19tZW0gPSAoeXV2LT5vcmRlciAmIFlVVl9DWSkgPyBtZW0gOiBtZW0gKyAxOworCXVuc2lnbmVkIGludCB1ID0gKHl1di0+b3JkZXIgJiBZVVZfWUNyQ2IpID8gMiA6IDA7CisJdW5zaWduZWQgaW50IHYgPSAoeXV2LT5vcmRlciAmIFlVVl9ZQ2JDcikgPyAyIDogMDsKKwl1bnNpZ25lZCBpbnQgeDsKKwl1bnNpZ25lZCBpbnQgeTsKKworCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gMikgeworCQkJZGl2X3QgZCA9IGRpdih4K3ksIHdpZHRoKTsKKwkJCXVpbnQzMl90IHJnYjMyID0gMHgwMDEzMDUwMiAqIChkLnF1b3QgPj4gNikKKwkJCQkgICAgICAgKyAweDAwMGExMTIwICogKGQucmVtID4+IDYpOworCQkJc3RydWN0IGNvbG9yX3l1diBjb2xvciA9CisJCQkJTUFLRV9ZVVZfNjAxKChyZ2IzMiA+PiAxNikgJiAweGZmLAorCQkJCQkgICAgIChyZ2IzMiA+PiA4KSAmIDB4ZmYsIHJnYjMyICYgMHhmZik7CisKKwkJCXlfbWVtWzIqeF0gPSBjb2xvci55OworCQkJY19tZW1bMip4K3VdID0gY29sb3IudTsKKwkJCXlfbWVtWzIqeCsyXSA9IGNvbG9yLnk7CisJCQljX21lbVsyKngrdl0gPSBjb2xvci52OworCQl9CisKKwkJeV9tZW0gKz0gc3RyaWRlOworCQljX21lbSArPSBzdHJpZGU7CisJfQorfQorCitzdGF0aWMgdm9pZCBmaWxsX3RpbGVzX3JnYjE2KGNvbnN0IHN0cnVjdCB1dGlsX2Zvcm1hdF9pbmZvICppbmZvLCB2b2lkICptZW0sCisJCQkgICAgIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwKKwkJCSAgICAgdW5zaWduZWQgaW50IHN0cmlkZSkKK3sKKwljb25zdCBzdHJ1Y3QgdXRpbF9yZ2JfaW5mbyAqcmdiID0gJmluZm8tPnJnYjsKKwl2b2lkICptZW1fYmFzZSA9IG1lbTsKKwl1bnNpZ25lZCBpbnQgeCwgeTsKKworCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworCQkJZGl2X3QgZCA9IGRpdih4K3ksIHdpZHRoKTsKKwkJCXVpbnQzMl90IHJnYjMyID0gMHgwMDEzMDUwMiAqIChkLnF1b3QgPj4gNikKKwkJCQkgICAgICAgKyAweDAwMGExMTIwICogKGQucmVtID4+IDYpOworCQkJdWludDE2X3QgY29sb3IgPQorCQkJCU1BS0VfUkdCQShyZ2IsIChyZ2IzMiA+PiAxNikgJiAweGZmLAorCQkJCQkgIChyZ2IzMiA+PiA4KSAmIDB4ZmYsIHJnYjMyICYgMHhmZiwKKwkJCQkJICAyNTUpOworCisJCQkoKHVpbnQxNl90ICopbWVtKVt4XSA9IGNvbG9yOworCQl9CisJCW1lbSArPSBzdHJpZGU7CisJfQorCisJbWFrZV9wd2V0dHkobWVtX2Jhc2UsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgaW5mby0+Zm9ybWF0KTsKK30KKworc3RhdGljIHZvaWQgZmlsbF90aWxlc19yZ2IyNChjb25zdCBzdHJ1Y3QgdXRpbF9mb3JtYXRfaW5mbyAqaW5mbywgdm9pZCAqbWVtLAorCQkJICAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsCisJCQkgICAgIHVuc2lnbmVkIGludCBzdHJpZGUpCit7CisJY29uc3Qgc3RydWN0IHV0aWxfcmdiX2luZm8gKnJnYiA9ICZpbmZvLT5yZ2I7CisJdW5zaWduZWQgaW50IHgsIHk7CisKKwlmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKwkJZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKwkJCWRpdl90IGQgPSBkaXYoeCt5LCB3aWR0aCk7CisJCQl1aW50MzJfdCByZ2IzMiA9IDB4MDAxMzA1MDIgKiAoZC5xdW90ID4+IDYpCisJCQkJICAgICAgICsgMHgwMDBhMTEyMCAqIChkLnJlbSA+PiA2KTsKKwkJCXN0cnVjdCBjb2xvcl9yZ2IyNCBjb2xvciA9CisJCQkJTUFLRV9SR0IyNChyZ2IsIChyZ2IzMiA+PiAxNikgJiAweGZmLAorCQkJCQkgICAocmdiMzIgPj4gOCkgJiAweGZmLCByZ2IzMiAmIDB4ZmYpOworCisJCQkoKHN0cnVjdCBjb2xvcl9yZ2IyNCAqKW1lbSlbeF0gPSBjb2xvcjsKKwkJfQorCQltZW0gKz0gc3RyaWRlOworCX0KK30KKworc3RhdGljIHZvaWQgZmlsbF90aWxlc19yZ2IzMihjb25zdCBzdHJ1Y3QgdXRpbF9mb3JtYXRfaW5mbyAqaW5mbywgdm9pZCAqbWVtLAorCQkJICAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsCisJCQkgICAgIHVuc2lnbmVkIGludCBzdHJpZGUpCit7CisJY29uc3Qgc3RydWN0IHV0aWxfcmdiX2luZm8gKnJnYiA9ICZpbmZvLT5yZ2I7CisJdm9pZCAqbWVtX2Jhc2UgPSBtZW07CisJdW5zaWduZWQgaW50IHgsIHk7CisKKwlmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKwkJZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKwkJCWRpdl90IGQgPSBkaXYoeCt5LCB3aWR0aCk7CisJCQl1aW50MzJfdCByZ2IzMiA9IDB4MDAxMzA1MDIgKiAoZC5xdW90ID4+IDYpCisJCQkJICAgICAgICsgMHgwMDBhMTEyMCAqIChkLnJlbSA+PiA2KTsKKwkJCXVpbnQzMl90IGFscGhhID0gKCh5IDwgaGVpZ2h0LzIpICYmICh4IDwgd2lkdGgvMikpID8gMTI3IDogMjU1OworCQkJdWludDMyX3QgY29sb3IgPQorCQkJCU1BS0VfUkdCQShyZ2IsIChyZ2IzMiA+PiAxNikgJiAweGZmLAorCQkJCQkgIChyZ2IzMiA+PiA4KSAmIDB4ZmYsIHJnYjMyICYgMHhmZiwKKwkJCQkJICBhbHBoYSk7CisKKwkJCSgodWludDMyX3QgKiltZW0pW3hdID0gY29sb3I7CisJCX0KKwkJbWVtICs9IHN0cmlkZTsKKwl9CisKKwltYWtlX3B3ZXR0eShtZW1fYmFzZSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBpbmZvLT5mb3JtYXQpOworfQorCitzdGF0aWMgdm9pZCBmaWxsX3RpbGVzKGNvbnN0IHN0cnVjdCB1dGlsX2Zvcm1hdF9pbmZvICppbmZvLCB2b2lkICpwbGFuZXNbM10sCisJCSAgICAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgc3RyaWRlKQoreworCXVuc2lnbmVkIGNoYXIgKnUsICp2OworCisJc3dpdGNoIChpbmZvLT5mb3JtYXQpIHsKKwljYXNlIERSTV9GT1JNQVRfVVlWWToKKwljYXNlIERSTV9GT1JNQVRfVllVWToKKwljYXNlIERSTV9GT1JNQVRfWVVZVjoKKwljYXNlIERSTV9GT1JNQVRfWVZZVToKKwkJcmV0dXJuIGZpbGxfdGlsZXNfeXV2X3BhY2tlZChpbmZvLCBwbGFuZXNbMF0sCisJCQkJCSAgICAgd2lkdGgsIGhlaWdodCwgc3RyaWRlKTsKKworCWNhc2UgRFJNX0ZPUk1BVF9OVjEyOgorCWNhc2UgRFJNX0ZPUk1BVF9OVjIxOgorCWNhc2UgRFJNX0ZPUk1BVF9OVjE2OgorCWNhc2UgRFJNX0ZPUk1BVF9OVjYxOgorCQl1ID0gaW5mby0+eXV2Lm9yZGVyICYgWVVWX1lDYkNyID8gcGxhbmVzWzFdIDogcGxhbmVzWzFdICsgMTsKKwkJdiA9IGluZm8tPnl1di5vcmRlciAmIFlVVl9ZQ3JDYiA/IHBsYW5lc1sxXSA6IHBsYW5lc1sxXSArIDE7CisJCXJldHVybiBmaWxsX3RpbGVzX3l1dl9wbGFuYXIoaW5mbywgcGxhbmVzWzBdLCB1LCB2LAorCQkJCQkgICAgIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSk7CisKKwljYXNlIERSTV9GT1JNQVRfWVVWNDIwOgorCQlyZXR1cm4gZmlsbF90aWxlc195dXZfcGxhbmFyKGluZm8sIHBsYW5lc1swXSwgcGxhbmVzWzFdLAorCQkJCQkgICAgIHBsYW5lc1syXSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlKTsKKworCWNhc2UgRFJNX0ZPUk1BVF9ZVlU0MjA6CisJCXJldHVybiBmaWxsX3RpbGVzX3l1dl9wbGFuYXIoaW5mbywgcGxhbmVzWzBdLCBwbGFuZXNbMl0sCisJCQkJCSAgICAgcGxhbmVzWzFdLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUpOworCisJY2FzZSBEUk1fRk9STUFUX0FSR0I0NDQ0OgorCWNhc2UgRFJNX0ZPUk1BVF9YUkdCNDQ0NDoKKwljYXNlIERSTV9GT1JNQVRfQUJHUjQ0NDQ6CisJY2FzZSBEUk1fRk9STUFUX1hCR1I0NDQ0OgorCWNhc2UgRFJNX0ZPUk1BVF9SR0JBNDQ0NDoKKwljYXNlIERSTV9GT1JNQVRfUkdCWDQ0NDQ6CisJY2FzZSBEUk1fRk9STUFUX0JHUkE0NDQ0OgorCWNhc2UgRFJNX0ZPUk1BVF9CR1JYNDQ0NDoKKwljYXNlIERSTV9GT1JNQVRfUkdCNTY1OgorCWNhc2UgRFJNX0ZPUk1BVF9CR1I1NjU6CisJY2FzZSBEUk1fRk9STUFUX0FSR0IxNTU1OgorCWNhc2UgRFJNX0ZPUk1BVF9YUkdCMTU1NToKKwljYXNlIERSTV9GT1JNQVRfQUJHUjE1NTU6CisJY2FzZSBEUk1fRk9STUFUX1hCR1IxNTU1OgorCWNhc2UgRFJNX0ZPUk1BVF9SR0JBNTU1MToKKwljYXNlIERSTV9GT1JNQVRfUkdCWDU1NTE6CisJY2FzZSBEUk1fRk9STUFUX0JHUkE1NTUxOgorCWNhc2UgRFJNX0ZPUk1BVF9CR1JYNTU1MToKKwkJcmV0dXJuIGZpbGxfdGlsZXNfcmdiMTYoaW5mbywgcGxhbmVzWzBdLAorCQkJCQl3aWR0aCwgaGVpZ2h0LCBzdHJpZGUpOworCisJY2FzZSBEUk1fRk9STUFUX0JHUjg4ODoKKwljYXNlIERSTV9GT1JNQVRfUkdCODg4OgorCQlyZXR1cm4gZmlsbF90aWxlc19yZ2IyNChpbmZvLCBwbGFuZXNbMF0sCisJCQkJCXdpZHRoLCBoZWlnaHQsIHN0cmlkZSk7CisJY2FzZSBEUk1fRk9STUFUX0FSR0I4ODg4OgorCWNhc2UgRFJNX0ZPUk1BVF9YUkdCODg4ODoKKwljYXNlIERSTV9GT1JNQVRfQUJHUjg4ODg6CisJY2FzZSBEUk1fRk9STUFUX1hCR1I4ODg4OgorCWNhc2UgRFJNX0ZPUk1BVF9SR0JBODg4ODoKKwljYXNlIERSTV9GT1JNQVRfUkdCWDg4ODg6CisJY2FzZSBEUk1fRk9STUFUX0JHUkE4ODg4OgorCWNhc2UgRFJNX0ZPUk1BVF9CR1JYODg4ODoKKwljYXNlIERSTV9GT1JNQVRfQVJHQjIxMDEwMTA6CisJY2FzZSBEUk1fRk9STUFUX1hSR0IyMTAxMDEwOgorCWNhc2UgRFJNX0ZPUk1BVF9BQkdSMjEwMTAxMDoKKwljYXNlIERSTV9GT1JNQVRfWEJHUjIxMDEwMTA6CisJY2FzZSBEUk1fRk9STUFUX1JHQkExMDEwMTAyOgorCWNhc2UgRFJNX0ZPUk1BVF9SR0JYMTAxMDEwMjoKKwljYXNlIERSTV9GT1JNQVRfQkdSQTEwMTAxMDI6CisJY2FzZSBEUk1fRk9STUFUX0JHUlgxMDEwMTAyOgorCQlyZXR1cm4gZmlsbF90aWxlc19yZ2IzMihpbmZvLCBwbGFuZXNbMF0sCisJCQkJCXdpZHRoLCBoZWlnaHQsIHN0cmlkZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBmaWxsX3BsYWluKGNvbnN0IHN0cnVjdCB1dGlsX2Zvcm1hdF9pbmZvICppbmZvLCB2b2lkICpwbGFuZXNbM10sCisJCSAgICAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgc3RyaWRlKQoreworCW1lbXNldChwbGFuZXNbMF0sIDB4NzcsIHN0cmlkZSAqIGhlaWdodCk7Cit9CisKKy8qCisgKiB1dGlsX2ZpbGxfcGF0dGVybiAtIEZpbGwgYSBidWZmZXIgd2l0aCBhIHRlc3QgcGF0dGVybgorICogQGZvcm1hdDogUGl4ZWwgZm9ybWF0CisgKiBAcGF0dGVybjogVGVzdCBwYXR0ZXJuCisgKiBAcGxhbmVzOiBBcnJheSBvZiBidWZmZXJzCisgKiBAd2lkdGg6IFdpZHRoIGluIHBpeGVscworICogQGhlaWdodDogSGVpZ2h0IGluIHBpeGVscworICogQHN0cmlkZTogTGluZSBzdHJpZGUgKHBpdGNoKSBpbiBieXRlcworICoKKyAqIEZpbGwgdGhlIGJ1ZmZlcnMgd2l0aCB0aGUgdGVzdCBwYXR0ZXJuIHNwZWNpZmllZCBieSB0aGUgcGF0dGVybiBwYXJhbWV0ZXIuCisgKiBTdXBwb3J0ZWQgZm9ybWF0cyB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgc2VsZWN0ZWQgcGF0dGVybi4KKyAqLwordm9pZCB1dGlsX2ZpbGxfcGF0dGVybih1aW50MzJfdCBmb3JtYXQsIGVudW0gdXRpbF9maWxsX3BhdHRlcm4gcGF0dGVybiwKKwkJICAgICAgIHZvaWQgKnBsYW5lc1szXSwgdW5zaWduZWQgaW50IHdpZHRoLAorCQkgICAgICAgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IHN0cmlkZSkKK3sKKwljb25zdCBzdHJ1Y3QgdXRpbF9mb3JtYXRfaW5mbyAqaW5mbzsKKworCWluZm8gPSB1dGlsX2Zvcm1hdF9pbmZvX2ZpbmQoZm9ybWF0KTsKKwlpZiAoaW5mbyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHBhdHRlcm4pIHsKKwljYXNlIFVUSUxfUEFUVEVSTl9USUxFUzoKKwkJcmV0dXJuIGZpbGxfdGlsZXMoaW5mbywgcGxhbmVzLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUpOworCisJY2FzZSBVVElMX1BBVFRFUk5fU01QVEU6CisJCXJldHVybiBmaWxsX3NtcHRlKGluZm8sIHBsYW5lcywgd2lkdGgsIGhlaWdodCwgc3RyaWRlKTsKKworCWNhc2UgVVRJTF9QQVRURVJOX1BMQUlOOgorCQlyZXR1cm4gZmlsbF9wbGFpbihpbmZvLCBwbGFuZXMsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSk7CisKKwlkZWZhdWx0OgorCQlwcmludGYoIkVycm9yOiB1bnN1cHBvcnRlZCB0ZXN0IHBhdHRlcm4gJXUuXG4iLCBwYXR0ZXJuKTsKKwkJYnJlYWs7CisJfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdXRpbC9wYXR0ZXJuLmggYi90ZXN0cy91dGlsL3BhdHRlcm4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWM0MjYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdXRpbC9wYXR0ZXJuLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IFR1bmdzdGVuIEdyYXBoaWNzCisgKiAgIEpha29iIEJvcm5lY3JhbnR6IDxqYWtvYkB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KKyAqIENvcHlyaWdodCAyMDA4IEludGVsIENvcnBvcmF0aW9uCisgKiAgIEplc3NlIEJhcm5lcyA8amVzc2UuYmFybmVzQGludGVsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBVVElMX1BBVFRFUk5fSAorI2RlZmluZSBVVElMX1BBVFRFUk5fSAorCitlbnVtIHV0aWxfZmlsbF9wYXR0ZXJuIHsKKwlVVElMX1BBVFRFUk5fVElMRVMsCisJVVRJTF9QQVRURVJOX1BMQUlOLAorCVVUSUxfUEFUVEVSTl9TTVBURSwKK307CisKK3ZvaWQgdXRpbF9maWxsX3BhdHRlcm4odWludDMyX3QgZm9ybWF0LCBlbnVtIHV0aWxfZmlsbF9wYXR0ZXJuIHBhdHRlcm4sCisJCSAgICAgICB2b2lkICpwbGFuZXNbM10sIHVuc2lnbmVkIGludCB3aWR0aCwKKwkJICAgICAgIHVuc2lnbmVkIGludCBoZWlnaHQsIHVuc2lnbmVkIGludCBzdHJpZGUpOworCisjZW5kaWYgLyogVVRJTF9QQVRURVJOX0ggKi8KZGlmZiAtLWdpdCBhL3Rlc3RzL3ZibHRlc3QvTWFrZWZpbGUuYW0gYi90ZXN0cy92Ymx0ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NmFmYWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy92Ymx0ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTkgQEAKK0FNX0NGTEFHUyA9IFwKKwkkKFdBUk5fQ0ZMQUdTKVwKKwktSSQodG9wX3NyY2RpcikvaW5jbHVkZS9kcm0gXAorCS1JJCh0b3Bfc3JjZGlyKS90ZXN0cyBcCisJLUkkKHRvcF9zcmNkaXIpCisKK2lmIEhBVkVfSU5TVEFMTF9URVNUUworYmluX1BST0dSQU1TID0gXAorCXZibHRlc3QKK2Vsc2UKK25vaW5zdF9QUk9HUkFNUyA9IFwKKwl2Ymx0ZXN0CitlbmRpZgorCit2Ymx0ZXN0X1NPVVJDRVMgPSBcCisJdmJsdGVzdC5jCit2Ymx0ZXN0X0xEQUREID0gXAorCSQodG9wX2J1aWxkZGlyKS9saWJkcm0ubGEgXAorCSQodG9wX2J1aWxkZGlyKS90ZXN0cy91dGlsL2xpYnV0aWwubGEKZGlmZiAtLWdpdCBhL3Rlc3RzL3ZibHRlc3QvdmJsdGVzdC5jIGIvdGVzdHMvdmJsdGVzdC92Ymx0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2YjgwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3ZibHRlc3QvdmJsdGVzdC5jCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogRFJNIGJhc2VkIHZibGFuayB0ZXN0IHByb2dyYW0KKyAqIENvcHlyaWdodCAyMDA4IFR1bmdzdGVuIEdyYXBoaWNzCisgKiAgIEpha29iIEJvcm5lY3JhbnR6IDxqYWtvYkB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KKyAqIENvcHlyaWdodCAyMDA4IEludGVsIENvcnBvcmF0aW9uCisgKiAgIEplc3NlIEJhcm5lcyA8amVzc2UuYmFybmVzQGludGVsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2lmZGVmIEhBVkVfU1lTX1NFTEVDVF9ICisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJ4Zjg2ZHJtLmgiCisjaW5jbHVkZSAieGY4NmRybU1vZGUuaCIKKworI2luY2x1ZGUgInV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAidXRpbC9rbXMuaCIKKworZXh0ZXJuIGNoYXIgKm9wdGFyZzsKK2V4dGVybiBpbnQgb3B0aW5kLCBvcHRlcnIsIG9wdG9wdDsKK3N0YXRpYyBjaGFyIG9wdHN0cltdID0gIkQ6TTpzIjsKKworaW50IHNlY29uZGFyeSA9IDA7CisKK3N0cnVjdCB2YmxfaW5mbyB7CisJdW5zaWduZWQgaW50IHZibF9jb3VudDsKKwlzdHJ1Y3QgdGltZXZhbCBzdGFydDsKK307CisKK3N0YXRpYyB2b2lkIHZibGFua19oYW5kbGVyKGludCBmZCwgdW5zaWduZWQgaW50IGZyYW1lLCB1bnNpZ25lZCBpbnQgc2VjLAorCQkJICAgdW5zaWduZWQgaW50IHVzZWMsIHZvaWQgKmRhdGEpCit7CisJZHJtVkJsYW5rIHZibDsKKwlzdHJ1Y3QgdGltZXZhbCBlbmQ7CisJc3RydWN0IHZibF9pbmZvICppbmZvID0gZGF0YTsKKwlkb3VibGUgdDsKKworCXZibC5yZXF1ZXN0LnR5cGUgPSBEUk1fVkJMQU5LX1JFTEFUSVZFIHwgRFJNX1ZCTEFOS19FVkVOVDsKKwlpZiAoc2Vjb25kYXJ5KQorCQl2YmwucmVxdWVzdC50eXBlIHw9IERSTV9WQkxBTktfU0VDT05EQVJZOworCXZibC5yZXF1ZXN0LnNlcXVlbmNlID0gMTsKKwl2YmwucmVxdWVzdC5zaWduYWwgPSAodW5zaWduZWQgbG9uZylkYXRhOworCisJZHJtV2FpdFZCbGFuayhmZCwgJnZibCk7CisKKwlpbmZvLT52YmxfY291bnQrKzsKKworCWlmIChpbmZvLT52YmxfY291bnQgPT0gNjApIHsKKwkJZ2V0dGltZW9mZGF5KCZlbmQsIE5VTEwpOworCQl0ID0gZW5kLnR2X3NlYyArIGVuZC50dl91c2VjICogMWUtNiAtCisJCQkoaW5mby0+c3RhcnQudHZfc2VjICsgaW5mby0+c3RhcnQudHZfdXNlYyAqIDFlLTYpOworCQlmcHJpbnRmKHN0ZGVyciwgImZyZXE6ICUuMDJmSHpcbiIsIGluZm8tPnZibF9jb3VudCAvIHQpOworCQlpbmZvLT52YmxfY291bnQgPSAwOworCQlpbmZvLT5zdGFydCA9IGVuZDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVzYWdlKGNoYXIgKm5hbWUpCit7CisJZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgWy1ETXNdXG4iLCBuYW1lKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZnByaW50ZihzdGRlcnIsICJvcHRpb25zOlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1EIERFVklDRSAgb3BlbiB0aGUgZ2l2ZW4gZGV2aWNlXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLU0gTU9EVUxFICBvcGVuIHRoZSBnaXZlbiBtb2R1bGVcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAtcyAgICAgICAgIHVzZSBzZWNvbmRhcnkgcGlwZVxuIik7CisJZXhpdCgwKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKmRldmljZSA9IE5VTEwsICptb2R1bGUgPSBOVUxMOworCWludCBjLCBmZCwgcmV0OworCWRybVZCbGFuayB2Ymw7CisJZHJtRXZlbnRDb250ZXh0IGV2Y3R4OworCXN0cnVjdCB2YmxfaW5mbyBoYW5kbGVyX2luZm87CisKKwlvcHRlcnIgPSAwOworCXdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCBvcHRzdHIpKSAhPSAtMSkgeworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnRCc6CisJCQlkZXZpY2UgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnTSc6CisJCQltb2R1bGUgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlzZWNvbmRhcnkgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl1c2FnZShhcmd2WzBdKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZmQgPSB1dGlsX29wZW4oZGV2aWNlLCBtb2R1bGUpOworCWlmIChmZCA8IDApCisJCXJldHVybiAxOworCisJLyogR2V0IGN1cnJlbnQgY291bnQgZmlyc3QgKi8KKwl2YmwucmVxdWVzdC50eXBlID0gRFJNX1ZCTEFOS19SRUxBVElWRTsKKwlpZiAoc2Vjb25kYXJ5KQorCQl2YmwucmVxdWVzdC50eXBlIHw9IERSTV9WQkxBTktfU0VDT05EQVJZOworCXZibC5yZXF1ZXN0LnNlcXVlbmNlID0gMDsKKwlyZXQgPSBkcm1XYWl0VkJsYW5rKGZkLCAmdmJsKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRmKCJkcm1XYWl0VkJsYW5rIChyZWxhdGl2ZSkgZmFpbGVkIHJldDogJWlcbiIsIHJldCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcmludGYoInN0YXJ0aW5nIGNvdW50OiAlZFxuIiwgdmJsLnJlcXVlc3Quc2VxdWVuY2UpOworCisJaGFuZGxlcl9pbmZvLnZibF9jb3VudCA9IDA7CisJZ2V0dGltZW9mZGF5KCZoYW5kbGVyX2luZm8uc3RhcnQsIE5VTEwpOworCisJLyogUXVldWUgYW4gZXZlbnQgZm9yIGZyYW1lICsgMSAqLworCXZibC5yZXF1ZXN0LnR5cGUgPSBEUk1fVkJMQU5LX1JFTEFUSVZFIHwgRFJNX1ZCTEFOS19FVkVOVDsKKwlpZiAoc2Vjb25kYXJ5KQorCQl2YmwucmVxdWVzdC50eXBlIHw9IERSTV9WQkxBTktfU0VDT05EQVJZOworCXZibC5yZXF1ZXN0LnNlcXVlbmNlID0gMTsKKwl2YmwucmVxdWVzdC5zaWduYWwgPSAodW5zaWduZWQgbG9uZykmaGFuZGxlcl9pbmZvOworCXJldCA9IGRybVdhaXRWQmxhbmsoZmQsICZ2YmwpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGYoImRybVdhaXRWQmxhbmsgKHJlbGF0aXZlLCBldmVudCkgZmFpbGVkIHJldDogJWlcbiIsIHJldCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBTZXQgdXAgb3VyIGV2ZW50IGhhbmRsZXIgKi8KKwltZW1zZXQoJmV2Y3R4LCAwLCBzaXplb2YgZXZjdHgpOworCWV2Y3R4LnZlcnNpb24gPSBEUk1fRVZFTlRfQ09OVEVYVF9WRVJTSU9OOworCWV2Y3R4LnZibGFua19oYW5kbGVyID0gdmJsYW5rX2hhbmRsZXI7CisJZXZjdHgucGFnZV9mbGlwX2hhbmRsZXIgPSBOVUxMOworCisJLyogUG9sbCBmb3IgZXZlbnRzICovCisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IHRpbWV2YWwgdGltZW91dCA9IHsgLnR2X3NlYyA9IDMsIC50dl91c2VjID0gMCB9OworCQlmZF9zZXQgZmRzOworCisJCUZEX1pFUk8oJmZkcyk7CisJCUZEX1NFVCgwLCAmZmRzKTsKKwkJRkRfU0VUKGZkLCAmZmRzKTsKKwkJcmV0ID0gc2VsZWN0KGZkICsgMSwgJmZkcywgTlVMTCwgTlVMTCwgJnRpbWVvdXQpOworCisJCWlmIChyZXQgPD0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJzZWxlY3QgdGltZWQgb3V0IG9yIGVycm9yIChyZXQgJWQpXG4iLAorCQkJCXJldCk7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChGRF9JU1NFVCgwLCAmZmRzKSkgeworCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSBkcm1IYW5kbGVFdmVudChmZCwgJmV2Y3R4KTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlwcmludGYoImRybUhhbmRsZUV2ZW50IGZhaWxlZDogJWlcbiIsIHJldCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3ZpdmFudGUvTWFrZWZpbGUuYW0gYi90ZXN0cy92aXZhbnRlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5M2E5MjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy92aXZhbnRlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDIgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgICBDb3B5cmlnaHQgMjAxMiAtIDIwMTcgVml2YW50ZSBDb3Jwb3JhdGlvbiwgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEuCisjICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworIyAgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyMgICAgJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworIyAgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisjICAgIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyMgICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0CisjICAgIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyMgICAgbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyMgICAgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyMgICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisjICAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisjICAgIElOIE5PIEVWRU5UIFNIQUxMIFZJVkFOVEUgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgICAgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyMgICAgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyMgICAgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK0FNX0NGTEFHUyA9IFwKKwktcHRocmVhZCBcCisJJChXQVJOX0NGTEFHUykgXAorCS1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlL2RybSBcCisJLUkkKHRvcF9zcmNkaXIpL3ZpdmFudGUgXAorCS1JJCh0b3Bfc3JjZGlyKQorCitMREFERCA9IFwKKwkuLi8uLi92aXZhbnRlL2xpYmRybV92aXZhbnRlLmxhIFwKKwkuLi8uLi9saWJkcm0ubGEgXAorCS1sZGwKKworVEVTVFMgPSB2aXZfYm9fdGVzdAorCitiaW5fUFJPR1JBTVMgPSAkKFRFU1RTKQorCmRpZmYgLS1naXQgYS90ZXN0cy92aXZhbnRlL3Zpdl9ib190ZXN0LmMgYi90ZXN0cy92aXZhbnRlL3Zpdl9ib190ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5YjA2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3ZpdmFudGUvdml2X2JvX3Rlc3QuYwpAQCAtMCwwICsxLDE1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgQ29weXJpZ2h0IDIwMTIgLSAyMDE3IFZpdmFudGUgQ29ycG9yYXRpb24sIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhLgorKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKiAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyogICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisqICAgICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyogICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorKiAgICBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisqICAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorKiAgICB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqCisqICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisqICAgIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisqICAgIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyoKKyogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisqICAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorKiAgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorKiAgICBJTiBOTyBFVkVOVCBTSEFMTCBWSVZBTlRFIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZCisqICAgIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisqICAgIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisqICAgIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKyAqIENvcHlyaWdodCDCqSAyMDE1IENhbm9uaWNhbCBMdGQuIChNYWFydGVuIExhbmtob3JzdCkKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSAieGY4NmRybS5oIgorI2luY2x1ZGUgInZpdmFudGVfYm8uaCIKKworc3RhdGljIGludCBpbXBvcnRfZmQgPSAtMTsKKworc3RhdGljIHZvaWQgKgorb3BlbmNsb3NlKHZvaWQgKmRldikKK3sKKyAgICBzdHJ1Y3QgZHJtX3ZpdmFudGUgKmRybSA9IGRldjsKKyAgICBzdHJ1Y3QgZHJtX3ZpdmFudGVfYm8gKmJvOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDEwMDAwMDsgKytpKSB7CisgICAgICAgIGlmICghZHJtX3ZpdmFudGVfYm9faW1wb3J0X2Zyb21fZmQoZHJtLCBpbXBvcnRfZmQsICZibykpCisgICAgICAgICAgICBkcm1fdml2YW50ZV9ib19kZXN0cm95KGJvKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgZHJtVmVyc2lvblB0ciB2ZXJzaW9uOworICAgIGNvbnN0IGNoYXIgKmRldmljZSA9IE5VTEw7CisgICAgaW50IGVyciwgZmQxLCBmZDI7CisgICAgc3RydWN0IGRybV92aXZhbnRlICpkcm0xLCAqZHJtMjsKKyAgICBzdHJ1Y3QgZHJtX3ZpdmFudGVfYm8gKmJvOworICAgIHB0aHJlYWRfdCB0MSwgdDI7CisKKyAgICBpZiAoYXJnYyA8IDIpIHsKKyAgICAgICAgZmQxID0gZHJtT3BlbldpdGhUeXBlKCJ2aXZhbnRlIiwgTlVMTCwgRFJNX05PREVfUkVOREVSKTsKKyAgICAgICAgaWYgKGZkMSA+PSAwKQorICAgICAgICAgICAgZmQyID0gZHJtT3BlbldpdGhUeXBlKCJ2aXZhbnRlIiwgTlVMTCwgRFJNX05PREVfUkVOREVSKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXZpY2UgPSBhcmd2WzFdOworCisgICAgICAgIGZkMSA9IG9wZW4oZGV2aWNlLCBPX1JEV1IpOworICAgICAgICBpZiAoZmQxID49IDApCisgICAgICAgICAgICBmZDIgPSBvcGVuKGRldmljZSwgT19SRFdSKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmQyID0gZmQxID0gLWVycm5vOworICAgIH0KKworICAgIGlmIChmZDEgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiT3BlbmluZyAxc3Qgdml2YW50ZSByZW5kZXIgbm9kZSBmYWlsZWQgd2l0aCAlaVxuIiwgZmQxKTsKKyAgICAgICAgcmV0dXJuIGRldmljZSA/IC1mZDEgOiA3NzsKKyAgICB9CisKKyAgICBpZiAoZmQyIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk9wZW5pbmcgMm5kIHZpdmFudGUgcmVuZGVyIG5vZGUgZmFpbGVkIHdpdGggJWlcbiIsIC1lcnJubyk7CisgICAgICAgIHJldHVybiBlcnJubzsKKyAgICB9CisKKyAgICB2ZXJzaW9uID0gZHJtR2V0VmVyc2lvbihmZDEpOworICAgIGlmICh2ZXJzaW9uKSB7CisgICAgICAgIHByaW50ZigiVmVyc2lvbjogJWQuJWQuJWRcbiIsIHZlcnNpb24tPnZlcnNpb25fbWFqb3IsCisgICAgICAgICAgICAgICB2ZXJzaW9uLT52ZXJzaW9uX21pbm9yLCB2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwpOworICAgICAgICBwcmludGYoIiAgTmFtZTogJXNcbiIsIHZlcnNpb24tPm5hbWUpOworICAgICAgICBwcmludGYoIiAgRGF0ZTogJXNcbiIsIHZlcnNpb24tPmRhdGUpOworICAgICAgICBwcmludGYoIiAgRGVzY3JpcHRpb246ICVzXG4iLCB2ZXJzaW9uLT5kZXNjKTsKKworICAgICAgICBkcm1GcmVlVmVyc2lvbih2ZXJzaW9uKTsKKyAgICB9CisKKyAgICBlcnIgPSBkcm1fdml2YW50ZV9jcmVhdGUoZmQxLCAmZHJtMSk7CisgICAgaWYgKCFlcnIpCisgICAgICAgIGVyciA9IGRybV92aXZhbnRlX2NyZWF0ZShmZDIsICZkcm0yKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBlcnIgPSBkcm1fdml2YW50ZV9ib19jcmVhdGUoZHJtMiwgMCwgMTkyMCoxMDgwKjQsICZibyk7CisgICAgaWYgKCFlcnIpCisgICAgICAgIGVyciA9IGRybV92aXZhbnRlX2JvX2V4cG9ydF90b19mZChibywgJmltcG9ydF9mZCk7CisKKyAgICBpZiAoIWVycikgeworICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmdDEsIE5VTEwsIG9wZW5jbG9zZSwgKHZvaWQqKWRybTEpOworICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmdDIsIE5VTEwsIG9wZW5jbG9zZSwgKHZvaWQqKWRybTEpOworICAgIH0KKworICAgIHB0aHJlYWRfam9pbih0MSwgTlVMTCk7CisgICAgcHRocmVhZF9qb2luKHQyLCBOVUxMKTsKKworICAgIGRybV92aXZhbnRlX2JvX2Rlc3Ryb3koYm8pOworCisgICAgZHJtX3ZpdmFudGVfY2xvc2UoZHJtMik7CisgICAgZHJtX3ZpdmFudGVfY2xvc2UoZHJtMSk7CisgICAgaWYgKGRldmljZSkgeworICAgICAgICBjbG9zZShmZDIpOworICAgICAgICBjbG9zZShmZDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRybUNsb3NlKGZkMik7CisgICAgICAgIGRybUNsb3NlKGZkMSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91dGlsX2RvdWJsZV9saXN0LmggYi91dGlsX2RvdWJsZV9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0OGIyNgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWxfZG91YmxlX2xpc3QuaApAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAwNiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQmlzbWFyY2ssIE5ELiBVU0EuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKi8KKworLyoqCisgKiBcZmlsZQorICogTGlzdCBtYWNyb3MgaGVhdmlseSBpbnNwaXJlZCBieSB0aGUgTGludXgga2VybmVsCisgKiBsaXN0IGhhbmRsaW5nLiBObyBsaXN0IGxvb3BpbmcgeWV0LgorICoKKyAqIElzIG5vdCB0aHJlYWRzYWZlLCBzbyBjb21tb24gb3BlcmF0aW9ucyBuZWVkIHRvCisgKiBiZSBwcm90ZWN0ZWQgdXNpbmcgYW4gZXh0ZXJuYWwgbXV0ZXguCisgKi8KKyNpZm5kZWYgX1VfRE9VQkxFX0xJU1RfSF8KKyNkZWZpbmUgX1VfRE9VQkxFX0xJU1RfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCitzdHJ1Y3QgbGlzdF9oZWFkCit7CisgICAgc3RydWN0IGxpc3RfaGVhZCAqcHJldjsKKyAgICBzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0OworfTsKKworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfaW5pdGhlYWQoc3RydWN0IGxpc3RfaGVhZCAqaXRlbSkKK3sKKyAgICBpdGVtLT5wcmV2ID0gaXRlbTsKKyAgICBpdGVtLT5uZXh0ID0gaXRlbTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfYWRkKHN0cnVjdCBsaXN0X2hlYWQgKml0ZW0sIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7CisgICAgaXRlbS0+cHJldiA9IGxpc3Q7CisgICAgaXRlbS0+bmV4dCA9IGxpc3QtPm5leHQ7CisgICAgbGlzdC0+bmV4dC0+cHJldiA9IGl0ZW07CisgICAgbGlzdC0+bmV4dCA9IGl0ZW07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X2FkZHRhaWwoc3RydWN0IGxpc3RfaGVhZCAqaXRlbSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKyAgICBpdGVtLT5uZXh0ID0gbGlzdDsKKyAgICBpdGVtLT5wcmV2ID0gbGlzdC0+cHJldjsKKyAgICBsaXN0LT5wcmV2LT5uZXh0ID0gaXRlbTsKKyAgICBsaXN0LT5wcmV2ID0gaXRlbTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfcmVwbGFjZShzdHJ1Y3QgbGlzdF9oZWFkICpmcm9tLCBzdHJ1Y3QgbGlzdF9oZWFkICp0bykKK3sKKyAgICB0by0+cHJldiA9IGZyb20tPnByZXY7CisgICAgdG8tPm5leHQgPSBmcm9tLT5uZXh0OworICAgIGZyb20tPm5leHQtPnByZXYgPSB0bzsKKyAgICBmcm9tLT5wcmV2LT5uZXh0ID0gdG87Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X2RlbChzdHJ1Y3QgbGlzdF9oZWFkICppdGVtKQoreworICAgIGl0ZW0tPnByZXYtPm5leHQgPSBpdGVtLT5uZXh0OworICAgIGl0ZW0tPm5leHQtPnByZXYgPSBpdGVtLT5wcmV2OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9kZWxpbml0KHN0cnVjdCBsaXN0X2hlYWQgKml0ZW0pCit7CisgICAgaXRlbS0+cHJldi0+bmV4dCA9IGl0ZW0tPm5leHQ7CisgICAgaXRlbS0+bmV4dC0+cHJldiA9IGl0ZW0tPnByZXY7CisgICAgaXRlbS0+bmV4dCA9IGl0ZW07CisgICAgaXRlbS0+cHJldiA9IGl0ZW07Cit9CisKKyNkZWZpbmUgTElTVF9JTklUSEVBRChfX2l0ZW0pIGxpc3RfaW5pdGhlYWQoX19pdGVtKQorI2RlZmluZSBMSVNUX0FERChfX2l0ZW0sIF9fbGlzdCkgbGlzdF9hZGQoX19pdGVtLCBfX2xpc3QpCisjZGVmaW5lIExJU1RfQUREVEFJTChfX2l0ZW0sIF9fbGlzdCkgbGlzdF9hZGR0YWlsKF9faXRlbSwgX19saXN0KQorI2RlZmluZSBMSVNUX1JFUExBQ0UoX19mcm9tLCBfX3RvKSBsaXN0X3JlcGxhY2UoX19mcm9tLCBfX3RvKQorI2RlZmluZSBMSVNUX0RFTChfX2l0ZW0pIGxpc3RfZGVsKF9faXRlbSkKKyNkZWZpbmUgTElTVF9ERUxJTklUKF9faXRlbSkgbGlzdF9kZWxpbml0KF9faXRlbSkKKworI2RlZmluZSBMSVNUX0VOVFJZKF9fdHlwZSwgX19pdGVtLCBfX2ZpZWxkKSAgIFwKKyAgICAoKF9fdHlwZSAqKSgoKGNoYXIgKikoX19pdGVtKSkgLSBvZmZzZXRvZihfX3R5cGUsIF9fZmllbGQpKSkKKworI2RlZmluZSBMSVNUX0ZJUlNUX0VOVFJZKF9fcHRyLCBfX3R5cGUsIF9fZmllbGQpICAgXAorICAgIExJU1RfRU5UUlkoX190eXBlLCAoX19wdHIpLT5uZXh0LCBfX2ZpZWxkKQorCisjZGVmaW5lIExJU1RfTEFTVF9FTlRSWShfX3B0ciwgX190eXBlLCBfX2ZpZWxkKSAgIFwKKyAgICBMSVNUX0VOVFJZKF9fdHlwZSwgKF9fcHRyKS0+cHJldiwgX19maWVsZCkKKworI2RlZmluZSBMSVNUX0lTX0VNUFRZKF9fbGlzdCkgICAgICAgICAgICAgICAgICAgXAorICAgICgoX19saXN0KS0+bmV4dCA9PSAoX19saXN0KSkKKworI2lmbmRlZiBjb250YWluZXJfb2YKKyNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgc2FtcGxlLCBtZW1iZXIpCQkJCVwKKyAgICAodm9pZCAqKSgoY2hhciAqKShwdHIpCQkJCQkJXAorCSAgICAgLSAoKGNoYXIgKikmKCh0eXBlb2Yoc2FtcGxlKSkwKS0+bWVtYmVyKSkKKyNlbmRpZgorCisjZGVmaW5lIExJU1RfRk9SX0VBQ0hfRU5UUlkocG9zLCBoZWFkLCBtZW1iZXIpCQkJCVwKKyAgIGZvciAocG9zID0gY29udGFpbmVyX29mKChoZWFkKS0+bmV4dCwgcG9zLCBtZW1iZXIpOwkJCVwKKwkmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOwkJCQkJCVwKKwlwb3MgPSBjb250YWluZXJfb2YocG9zLT5tZW1iZXIubmV4dCwgcG9zLCBtZW1iZXIpKQorCisjZGVmaW5lIExJU1RfRk9SX0VBQ0hfRU5UUllfU0FGRShwb3MsIHN0b3JhZ2UsIGhlYWQsIG1lbWJlcikJXAorICAgZm9yIChwb3MgPSBjb250YWluZXJfb2YoKGhlYWQpLT5uZXh0LCBwb3MsIG1lbWJlciksCQkJXAorCXN0b3JhZ2UgPSBjb250YWluZXJfb2YocG9zLT5tZW1iZXIubmV4dCwgcG9zLCBtZW1iZXIpOwlcCisJJnBvcy0+bWVtYmVyICE9IChoZWFkKTsJCQkJCQlcCisJcG9zID0gc3RvcmFnZSwgc3RvcmFnZSA9IGNvbnRhaW5lcl9vZihzdG9yYWdlLT5tZW1iZXIubmV4dCwgc3RvcmFnZSwgbWVtYmVyKSkKKworI2RlZmluZSBMSVNUX0ZPUl9FQUNIX0VOVFJZX1NBRkVfUkVWKHBvcywgc3RvcmFnZSwgaGVhZCwgbWVtYmVyKQlcCisgICBmb3IgKHBvcyA9IGNvbnRhaW5lcl9vZigoaGVhZCktPnByZXYsIHBvcywgbWVtYmVyKSwJCQlcCisJc3RvcmFnZSA9IGNvbnRhaW5lcl9vZihwb3MtPm1lbWJlci5wcmV2LCBwb3MsIG1lbWJlcik7CQlcCisJJnBvcy0+bWVtYmVyICE9IChoZWFkKTsJCQkJCQlcCisJcG9zID0gc3RvcmFnZSwgc3RvcmFnZSA9IGNvbnRhaW5lcl9vZihzdG9yYWdlLT5tZW1iZXIucHJldiwgc3RvcmFnZSwgbWVtYmVyKSkKKworI2RlZmluZSBMSVNUX0ZPUl9FQUNIX0VOVFJZX0ZST00ocG9zLCBzdGFydCwgaGVhZCwgbWVtYmVyKQkJXAorICAgZm9yIChwb3MgPSBjb250YWluZXJfb2YoKHN0YXJ0KSwgcG9zLCBtZW1iZXIpOwkJCVwKKwkmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOwkJCQkJCVwKKwlwb3MgPSBjb250YWluZXJfb2YocG9zLT5tZW1iZXIubmV4dCwgcG9zLCBtZW1iZXIpKQorCisjZGVmaW5lIExJU1RfRk9SX0VBQ0hfRU5UUllfRlJPTV9SRVYocG9zLCBzdGFydCwgaGVhZCwgbWVtYmVyKQkJXAorICAgZm9yIChwb3MgPSBjb250YWluZXJfb2YoKHN0YXJ0KSwgcG9zLCBtZW1iZXIpOwkJCVwKKwkmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOwkJCQkJCVwKKwlwb3MgPSBjb250YWluZXJfb2YocG9zLT5tZW1iZXIucHJldiwgcG9zLCBtZW1iZXIpKQorCisjZW5kaWYgLypfVV9ET1VCTEVfTElTVF9IXyovCmRpZmYgLS1naXQgYS91dGlsX21hdGguaCBiL3V0aWxfbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYjE1YTgKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsX21hdGguaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyovCisKKyNpZm5kZWYgX1VUSUxfTUFUSF9IXworI2RlZmluZSBfVVRJTF9NQVRIX0hfCisKKyNkZWZpbmUgTUlOMiggQSwgQiApICAgKCAoQSk8KEIpID8gKEEpIDogKEIpICkKKyNkZWZpbmUgTUFYMiggQSwgQiApICAgKCAoQSk+KEIpID8gKEEpIDogKEIpICkKKyNkZWZpbmUgTUFYMyggQSwgQiwgQyApICgoQSkgPiAoQikgPyBNQVgyKEEsIEMpIDogTUFYMihCLCBDKSkKKworI2RlZmluZSBfX2FsaWduX21hc2sodmFsdWUsIG1hc2spICAoKCh2YWx1ZSkgKyAobWFzaykpICYgfihtYXNrKSkKKyNkZWZpbmUgQUxJR04odmFsdWUsIGFsaWdubWVudCkgICAgX19hbGlnbl9tYXNrKHZhbHVlLCAodHlwZW9mKHZhbHVlKSkoKGFsaWdubWVudCkgLSAxKSkKKworI2VuZGlmIC8qX1VUSUxfTUFUSF9IXyovCmRpZmYgLS1naXQgYS92YzQvTWFrZWZpbGUuYW0gYi92YzQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0ODZiNAotLS0gL2Rldi9udWxsCisrKyBiL3ZjNC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM0IEBACisjIENvcHlyaWdodCDCqSAyMDE2IEJyb2FkY29tCisjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisjIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisjIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyMgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisjIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorIyBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIworIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisjIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyMgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisjIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyMgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyMgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworIyBJTiBUSEUgU09GVFdBUkUuCisKK2luY2x1ZGUgTWFrZWZpbGUuc291cmNlcworCitBTV9DRkxBR1MgPSBcCisJJChXQVJOX0NGTEFHUykgXAorCS1JJCh0b3Bfc3JjZGlyKSBcCisJJChQVEhSRUFEU1RVQlNfQ0ZMQUdTKSBcCisJJChWQUxHUklORF9DRkxBR1MpIFwKKwktSSQodG9wX3NyY2RpcikvaW5jbHVkZS9kcm0KKworbGliZHJtX3ZjNGluY2x1ZGVkaXIgPSAke2luY2x1ZGVkaXJ9L2xpYmRybQorbGliZHJtX3ZjNGluY2x1ZGVfSEVBREVSUyA9ICQoTElCRFJNX1ZDNF9IX0ZJTEVTKQorCitwa2djb25maWdfREFUQSA9IGxpYmRybV92YzQucGMKZGlmZiAtLWdpdCBhL3ZjNC9NYWtlZmlsZS5zb3VyY2VzIGIvdmM0L01ha2VmaWxlLnNvdXJjZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmOTdmZgotLS0gL2Rldi9udWxsCisrKyBiL3ZjNC9NYWtlZmlsZS5zb3VyY2VzCkBAIC0wLDAgKzEsMyBAQAorTElCRFJNX1ZDNF9IX0ZJTEVTIDo9IFwKKwl2YzRfcGFja2V0LmggXAorCXZjNF9xcHVfZGVmaW5lcy5oCmRpZmYgLS1naXQgYS92YzQvbGliZHJtX3ZjNC5wYy5pbiBiL3ZjNC9saWJkcm1fdmM0LnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MjY3OGUKLS0tIC9kZXYvbnVsbAorKysgYi92YzQvbGliZHJtX3ZjNC5wYy5pbgpAQCAtMCwwICsxLDkgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiBsaWJkcm1fdmM0CitEZXNjcmlwdGlvbjogVXNlcnNwYWNlIGludGVyZmFjZSB0byB2YzQga2VybmVsIERSTSBzZXJ2aWNlcworVmVyc2lvbjogQFBBQ0tBR0VfVkVSU0lPTkAKK1JlcXVpcmVzLnByaXZhdGU6IGxpYmRybQpkaWZmIC0tZ2l0IGEvdmM0L3ZjNF9wYWNrZXQuaCBiL3ZjNC92YzRfcGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4ZTBiZAotLS0gL2Rldi9udWxsCisrKyBiL3ZjNC92YzRfcGFja2V0LmgKQEAgLTAsMCArMSwzOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNCBCcm9hZGNvbQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFZDNF9QQUNLRVRfSAorI2RlZmluZSBWQzRfUEFDS0VUX0gKKworZW51bSB2YzRfcGFja2V0IHsKKyAgICAgICAgVkM0X1BBQ0tFVF9IQUxUID0gMCwKKyAgICAgICAgVkM0X1BBQ0tFVF9OT1AgPSAxLAorCisgICAgICAgIFZDNF9QQUNLRVRfRkxVU0ggPSA0LAorICAgICAgICBWQzRfUEFDS0VUX0ZMVVNIX0FMTCA9IDUsCisgICAgICAgIFZDNF9QQUNLRVRfU1RBUlRfVElMRV9CSU5OSU5HID0gNiwKKyAgICAgICAgVkM0X1BBQ0tFVF9JTkNSRU1FTlRfU0VNQVBIT1JFID0gNywKKyAgICAgICAgVkM0X1BBQ0tFVF9XQUlUX09OX1NFTUFQSE9SRSA9IDgsCisKKyAgICAgICAgVkM0X1BBQ0tFVF9CUkFOQ0ggPSAxNiwKKyAgICAgICAgVkM0X1BBQ0tFVF9CUkFOQ0hfVE9fU1VCX0xJU1QgPSAxNywKKyAgICAgICAgVkM0X1BBQ0tFVF9SRVRVUk5fRlJPTV9TVUJfTElTVCA9IDE4LAorCisgICAgICAgIFZDNF9QQUNLRVRfU1RPUkVfTVNfVElMRV9CVUZGRVIgPSAyNCwKKyAgICAgICAgVkM0X1BBQ0tFVF9TVE9SRV9NU19USUxFX0JVRkZFUl9BTkRfRU9GID0gMjUsCisgICAgICAgIFZDNF9QQUNLRVRfU1RPUkVfRlVMTF9SRVNfVElMRV9CVUZGRVIgPSAyNiwKKyAgICAgICAgVkM0X1BBQ0tFVF9MT0FEX0ZVTExfUkVTX1RJTEVfQlVGRkVSID0gMjcsCisgICAgICAgIFZDNF9QQUNLRVRfU1RPUkVfVElMRV9CVUZGRVJfR0VORVJBTCA9IDI4LAorICAgICAgICBWQzRfUEFDS0VUX0xPQURfVElMRV9CVUZGRVJfR0VORVJBTCA9IDI5LAorCisgICAgICAgIFZDNF9QQUNLRVRfR0xfSU5ERVhFRF9QUklNSVRJVkUgPSAzMiwKKyAgICAgICAgVkM0X1BBQ0tFVF9HTF9BUlJBWV9QUklNSVRJVkUgPSAzMywKKworICAgICAgICBWQzRfUEFDS0VUX0NPTVBSRVNTRURfUFJJTUlUSVZFID0gNDgsCisgICAgICAgIFZDNF9QQUNLRVRfQ0xJUFBFRF9DT01QUkVTU0VEX1BSSU1JVElWRSA9IDQ5LAorCisgICAgICAgIFZDNF9QQUNLRVRfUFJJTUlUSVZFX0xJU1RfRk9STUFUID0gNTYsCisKKyAgICAgICAgVkM0X1BBQ0tFVF9HTF9TSEFERVJfU1RBVEUgPSA2NCwKKyAgICAgICAgVkM0X1BBQ0tFVF9OVl9TSEFERVJfU1RBVEUgPSA2NSwKKyAgICAgICAgVkM0X1BBQ0tFVF9WR19TSEFERVJfU1RBVEUgPSA2NiwKKworICAgICAgICBWQzRfUEFDS0VUX0NPTkZJR1VSQVRJT05fQklUUyA9IDk2LAorICAgICAgICBWQzRfUEFDS0VUX0ZMQVRfU0hBREVfRkxBR1MgPSA5NywKKyAgICAgICAgVkM0X1BBQ0tFVF9QT0lOVF9TSVpFID0gOTgsCisgICAgICAgIFZDNF9QQUNLRVRfTElORV9XSURUSCA9IDk5LAorICAgICAgICBWQzRfUEFDS0VUX1JIVF9YX0JPVU5EQVJZID0gMTAwLAorICAgICAgICBWQzRfUEFDS0VUX0RFUFRIX09GRlNFVCA9IDEwMSwKKyAgICAgICAgVkM0X1BBQ0tFVF9DTElQX1dJTkRPVyA9IDEwMiwKKyAgICAgICAgVkM0X1BBQ0tFVF9WSUVXUE9SVF9PRkZTRVQgPSAxMDMsCisgICAgICAgIFZDNF9QQUNLRVRfWl9DTElQUElORyA9IDEwNCwKKyAgICAgICAgVkM0X1BBQ0tFVF9DTElQUEVSX1hZX1NDQUxJTkcgPSAxMDUsCisgICAgICAgIFZDNF9QQUNLRVRfQ0xJUFBFUl9aX1NDQUxJTkcgPSAxMDYsCisKKyAgICAgICAgVkM0X1BBQ0tFVF9USUxFX0JJTk5JTkdfTU9ERV9DT05GSUcgPSAxMTIsCisgICAgICAgIFZDNF9QQUNLRVRfVElMRV9SRU5ERVJJTkdfTU9ERV9DT05GSUcgPSAxMTMsCisgICAgICAgIFZDNF9QQUNLRVRfQ0xFQVJfQ09MT1JTID0gMTE0LAorICAgICAgICBWQzRfUEFDS0VUX1RJTEVfQ09PUkRJTkFURVMgPSAxMTUsCisKKyAgICAgICAgLyogTm90IGFuIGFjdHVhbCBoYXJkd2FyZSBwYWNrZXQgLS0gdGhpcyBpcyB3aGF0IHdlIHVzZSB0byBwdXQKKyAgICAgICAgICogcmVmZXJlbmNlcyB0byBHRU0gYm9zIGluIHRoZSBjb21tYW5kIHN0cmVhbSwgc2luY2Ugd2UgbmVlZCB0aGUgdTMyCisgICAgICAgICAqIGludCB0aGUgYWN0dWFsIGFkZHJlc3MgcGFja2V0IGluIG9yZGVyIHRvIHN0b3JlIHRoZSBvZmZzZXQgZnJvbSB0aGUKKyAgICAgICAgICogc3RhcnQgb2YgdGhlIEJPLgorICAgICAgICAgKi8KKyAgICAgICAgVkM0X1BBQ0tFVF9HRU1fSEFORExFUyA9IDI1NCwKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworI2RlZmluZSBWQzRfUEFDS0VUX0hBTFRfU0laRQkJCQkJCTEKKyNkZWZpbmUgVkM0X1BBQ0tFVF9OT1BfU0laRQkJCQkJCTEKKyNkZWZpbmUgVkM0X1BBQ0tFVF9GTFVTSF9TSVpFCQkJCQkJMQorI2RlZmluZSBWQzRfUEFDS0VUX0ZMVVNIX0FMTF9TSVpFCQkJCQkxCisjZGVmaW5lIFZDNF9QQUNLRVRfU1RBUlRfVElMRV9CSU5OSU5HX1NJWkUJCQkJMQorI2RlZmluZSBWQzRfUEFDS0VUX0lOQ1JFTUVOVF9TRU1BUEhPUkVfU0laRQkJCQkxCisjZGVmaW5lIFZDNF9QQUNLRVRfV0FJVF9PTl9TRU1BUEhPUkVfU0laRQkJCQkxCisjZGVmaW5lIFZDNF9QQUNLRVRfQlJBTkNIX1NJWkUJCQkJCQk1CisjZGVmaW5lIFZDNF9QQUNLRVRfQlJBTkNIX1RPX1NVQl9MSVNUX1NJWkUJCQkJNQorI2RlZmluZSBWQzRfUEFDS0VUX1JFVFVSTl9GUk9NX1NVQl9MSVNUX1NJWkUJCQkJMQorI2RlZmluZSBWQzRfUEFDS0VUX1NUT1JFX01TX1RJTEVfQlVGRkVSX1NJWkUJCQkJMQorI2RlZmluZSBWQzRfUEFDS0VUX1NUT1JFX01TX1RJTEVfQlVGRkVSX0FORF9FT0ZfU0laRQkJCTEKKyNkZWZpbmUgVkM0X1BBQ0tFVF9TVE9SRV9GVUxMX1JFU19USUxFX0JVRkZFUl9TSVpFCQkJNQorI2RlZmluZSBWQzRfUEFDS0VUX0xPQURfRlVMTF9SRVNfVElMRV9CVUZGRVJfU0laRQkJCTUKKyNkZWZpbmUgVkM0X1BBQ0tFVF9TVE9SRV9USUxFX0JVRkZFUl9HRU5FUkFMX1NJWkUJCQk3CisjZGVmaW5lIFZDNF9QQUNLRVRfTE9BRF9USUxFX0JVRkZFUl9HRU5FUkFMX1NJWkUJCQk3CisjZGVmaW5lIFZDNF9QQUNLRVRfR0xfSU5ERVhFRF9QUklNSVRJVkVfU0laRQkJCQkxNAorI2RlZmluZSBWQzRfUEFDS0VUX0dMX0FSUkFZX1BSSU1JVElWRV9TSVpFCQkJCTEwCisjZGVmaW5lIFZDNF9QQUNLRVRfQ09NUFJFU1NFRF9QUklNSVRJVkVfU0laRQkJCQkxCisjZGVmaW5lIFZDNF9QQUNLRVRfQ0xJUFBFRF9DT01QUkVTU0VEX1BSSU1JVElWRV9TSVpFCQkJMQorI2RlZmluZSBWQzRfUEFDS0VUX1BSSU1JVElWRV9MSVNUX0ZPUk1BVF9TSVpFCQkJCTIKKyNkZWZpbmUgVkM0X1BBQ0tFVF9HTF9TSEFERVJfU1RBVEVfU0laRQkJCQkJNQorI2RlZmluZSBWQzRfUEFDS0VUX05WX1NIQURFUl9TVEFURV9TSVpFCQkJCQk1CisjZGVmaW5lIFZDNF9QQUNLRVRfVkdfU0hBREVSX1NUQVRFX1NJWkUJCQkJCTUKKyNkZWZpbmUgVkM0X1BBQ0tFVF9DT05GSUdVUkFUSU9OX0JJVFNfU0laRQkJCQk0CisjZGVmaW5lIFZDNF9QQUNLRVRfRkxBVF9TSEFERV9GTEFHU19TSVpFCQkJCTUKKyNkZWZpbmUgVkM0X1BBQ0tFVF9QT0lOVF9TSVpFX1NJWkUJCQkJCTUKKyNkZWZpbmUgVkM0X1BBQ0tFVF9MSU5FX1dJRFRIX1NJWkUJCQkJCTUKKyNkZWZpbmUgVkM0X1BBQ0tFVF9SSFRfWF9CT1VOREFSWV9TSVpFCQkJCQkzCisjZGVmaW5lIFZDNF9QQUNLRVRfREVQVEhfT0ZGU0VUX1NJWkUJCQkJCTUKKyNkZWZpbmUgVkM0X1BBQ0tFVF9DTElQX1dJTkRPV19TSVpFCQkJCQk5CisjZGVmaW5lIFZDNF9QQUNLRVRfVklFV1BPUlRfT0ZGU0VUX1NJWkUJCQkJCTUKKyNkZWZpbmUgVkM0X1BBQ0tFVF9aX0NMSVBQSU5HX1NJWkUJCQkJCTkKKyNkZWZpbmUgVkM0X1BBQ0tFVF9DTElQUEVSX1hZX1NDQUxJTkdfU0laRQkJCQk5CisjZGVmaW5lIFZDNF9QQUNLRVRfQ0xJUFBFUl9aX1NDQUxJTkdfU0laRQkJCQk5CisjZGVmaW5lIFZDNF9QQUNLRVRfVElMRV9CSU5OSU5HX01PREVfQ09ORklHX1NJWkUJCQkxNgorI2RlZmluZSBWQzRfUEFDS0VUX1RJTEVfUkVOREVSSU5HX01PREVfQ09ORklHX1NJWkUJCQkxMQorI2RlZmluZSBWQzRfUEFDS0VUX0NMRUFSX0NPTE9SU19TSVpFCQkJCQkxNAorI2RlZmluZSBWQzRfUEFDS0VUX1RJTEVfQ09PUkRJTkFURVNfU0laRQkJCQkzCisjZGVmaW5lIFZDNF9QQUNLRVRfR0VNX0hBTkRMRVNfU0laRQkJCQkJOQorCisjZGVmaW5lIFZDNF9NQVNLKGhpZ2gsIGxvdykgKCgoMSA8PCAoKGhpZ2gpIC0gKGxvdykgKyAxKSkgLSAxKSA8PCAobG93KSkKKy8qIFVzaW5nIHRoZSBHTlUgc3RhdGVtZW50IGV4cHJlc3Npb24gZXh0ZW5zaW9uICovCisjZGVmaW5lIFZDNF9TRVRfRklFTEQodmFsdWUsIGZpZWxkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpZWxkdmFsID0gKHZhbHVlKSA8PCBmaWVsZCAjIyBfU0hJRlQ7CQkgIFwKKyAgICAgICAgICAgICAgICBhc3NlcnQoKGZpZWxkdmFsICYgfiBmaWVsZCAjIyBfTUFTSykgPT0gMCk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZpZWxkdmFsICYgZmllbGQgIyMgX01BU0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICB9KQorCisjZGVmaW5lIFZDNF9HRVRfRklFTEQod29yZCwgZmllbGQpICgoKHdvcmQpICAmIGZpZWxkICMjIF9NQVNLKSA+PiBmaWVsZCAjIyBfU0hJRlQpCisKKy8qKiBAeworICogQml0cyB1c2VkIGJ5IHBhY2tldHMgbGlrZSBWQzRfUEFDS0VUX1NUT1JFX1RJTEVfQlVGRkVSX0dFTkVSQUwgYW5kCisgKiBWQzRfUEFDS0VUX1RJTEVfUkVOREVSSU5HX01PREVfQ09ORklHLgorKi8KKyNkZWZpbmUgVkM0X1RJTElOR19GT1JNQVRfTElORUFSICAgIDAKKyNkZWZpbmUgVkM0X1RJTElOR19GT1JNQVRfVCAgICAgICAgIDEKKyNkZWZpbmUgVkM0X1RJTElOR19GT1JNQVRfTFQgICAgICAgIDIKKy8qKiBAfSAqLworCisvKiogQHsKKyAqCisgKiBsb3cgYml0cyBvZiBWQzRfUEFDS0VUX1NUT1JFX0ZVTExfUkVTX1RJTEVfQlVGRkVSIGFuZAorICogVkM0X1BBQ0tFVF9MT0FEX0ZVTExfUkVTX1RJTEVfQlVGRkVSLgorICovCisjZGVmaW5lIFZDNF9MT0FEU1RPUkVfRlVMTF9SRVNfRU9GICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgVkM0X0xPQURTVE9SRV9GVUxMX1JFU19ESVNBQkxFX0NMRUFSX0FMTCAgICAgICAoMSA8PCAyKQorI2RlZmluZSBWQzRfTE9BRFNUT1JFX0ZVTExfUkVTX0RJU0FCTEVfWlMgICAgICAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIFZDNF9MT0FEU1RPUkVfRlVMTF9SRVNfRElTQUJMRV9DT0xPUiAgICAgICAgICAgKDEgPDwgMCkKKworLyoqIEB7CisgKgorICogYnl0ZSAyIG9mIFZDNF9QQUNLRVRfU1RPUkVfVElMRV9CVUZGRVJfR0VORVJBTCBhbmQKKyAqIFZDNF9QQUNLRVRfTE9BRF9USUxFX0JVRkZFUl9HRU5FUkFMIChsb3cgYml0cyBvZiB0aGUgYWRkcmVzcykKKyAqLworCisjZGVmaW5lIFZDNF9MT0FEU1RPUkVfVElMRV9CVUZGRVJfRU9GICAgICAgICAgICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgVkM0X0xPQURTVE9SRV9USUxFX0JVRkZFUl9ESVNBQkxFX0ZVTExfVkdfTUFTSyAoMSA8PCAyKQorI2RlZmluZSBWQzRfTE9BRFNUT1JFX1RJTEVfQlVGRkVSX0RJU0FCTEVfRlVMTF9aUyAgICAgICgxIDw8IDEpCisjZGVmaW5lIFZDNF9MT0FEU1RPUkVfVElMRV9CVUZGRVJfRElTQUJMRV9GVUxMX0NPTE9SICAgKDEgPDwgMCkKKworLyoqIEB9ICovCisKKy8qKiBAeworICoKKyAqIGJ5dGUgMC0xIG9mIFZDNF9QQUNLRVRfU1RPUkVfVElMRV9CVUZGRVJfR0VORVJBTCBhbmQKKyAqIFZDNF9QQUNLRVRfTE9BRF9USUxFX0JVRkZFUl9HRU5FUkFMCisgKi8KKyNkZWZpbmUgVkM0X1NUT1JFX1RJTEVfQlVGRkVSX0RJU0FCTEVfVkdfTUFTS19DTEVBUiAoMSA8PCAxNSkKKyNkZWZpbmUgVkM0X1NUT1JFX1RJTEVfQlVGRkVSX0RJU0FCTEVfWlNfQ0xFQVIgICAgICgxIDw8IDE0KQorI2RlZmluZSBWQzRfU1RPUkVfVElMRV9CVUZGRVJfRElTQUJMRV9DT0xPUl9DTEVBUiAgKDEgPDwgMTMpCisjZGVmaW5lIFZDNF9TVE9SRV9USUxFX0JVRkZFUl9ESVNBQkxFX1NXQVAgICAgICAgICAoMSA8PCAxMikKKworI2RlZmluZSBWQzRfTE9BRFNUT1JFX1RJTEVfQlVGRkVSX0ZPUk1BVF9NQVNLICAgICAgVkM0X01BU0soOSwgOCkKKyNkZWZpbmUgVkM0X0xPQURTVE9SRV9USUxFX0JVRkZFUl9GT1JNQVRfU0hJRlQgICAgIDgKKyNkZWZpbmUgVkM0X0xPQURTVE9SRV9USUxFX0JVRkZFUl9SR0JBODg4OCAgICAgICAgIDAKKyNkZWZpbmUgVkM0X0xPQURTVE9SRV9USUxFX0JVRkZFUl9CR1I1NjVfRElUSEVSICAgIDEKKyNkZWZpbmUgVkM0X0xPQURTVE9SRV9USUxFX0JVRkZFUl9CR1I1NjUgICAgICAgICAgIDIKKy8qKiBAfSAqLworCisvKiogQHsKKyAqCisgKiBieXRlIDAgb2YgVkM0X1BBQ0tFVF9TVE9SRV9USUxFX0JVRkZFUl9HRU5FUkFMIGFuZAorICogVkM0X1BBQ0tFVF9MT0FEX1RJTEVfQlVGRkVSX0dFTkVSQUwKKyAqLworI2RlZmluZSBWQzRfU1RPUkVfVElMRV9CVUZGRVJfTU9ERV9NQVNLICAgICAgICAgICAgVkM0X01BU0soNywgNikKKyNkZWZpbmUgVkM0X1NUT1JFX1RJTEVfQlVGRkVSX01PREVfU0hJRlQgICAgICAgICAgIDYKKyNkZWZpbmUgVkM0X1NUT1JFX1RJTEVfQlVGRkVSX01PREVfU0FNUExFMCAgICAgICAgICgwIDw8IDYpCisjZGVmaW5lIFZDNF9TVE9SRV9USUxFX0JVRkZFUl9NT0RFX0RFQ0lNQVRFX1g0ICAgICAoMSA8PCA2KQorI2RlZmluZSBWQzRfU1RPUkVfVElMRV9CVUZGRVJfTU9ERV9ERUNJTUFURV9YMTYgICAgKDIgPDwgNikKKworLyoqIFRoZSB2YWx1ZXMgb2YgdGhlIGZpZWxkIGFyZSBWQzRfVElMSU5HX0ZPUk1BVF8qICovCisjZGVmaW5lIFZDNF9MT0FEU1RPUkVfVElMRV9CVUZGRVJfVElMSU5HX01BU0sgICAgICBWQzRfTUFTSyg1LCA0KQorI2RlZmluZSBWQzRfTE9BRFNUT1JFX1RJTEVfQlVGRkVSX1RJTElOR19TSElGVCAgICAgNAorCisjZGVmaW5lIFZDNF9MT0FEU1RPUkVfVElMRV9CVUZGRVJfQlVGRkVSX01BU0sgICAgICBWQzRfTUFTSygyLCAwKQorI2RlZmluZSBWQzRfTE9BRFNUT1JFX1RJTEVfQlVGRkVSX0JVRkZFUl9TSElGVCAgICAgMAorI2RlZmluZSBWQzRfTE9BRFNUT1JFX1RJTEVfQlVGRkVSX05PTkUgICAgICAgICAgICAgMAorI2RlZmluZSBWQzRfTE9BRFNUT1JFX1RJTEVfQlVGRkVSX0NPTE9SICAgICAgICAgICAgMQorI2RlZmluZSBWQzRfTE9BRFNUT1JFX1RJTEVfQlVGRkVSX1pTICAgICAgICAgICAgICAgMgorI2RlZmluZSBWQzRfTE9BRFNUT1JFX1RJTEVfQlVGRkVSX1ogICAgICAgICAgICAgICAgMworI2RlZmluZSBWQzRfTE9BRFNUT1JFX1RJTEVfQlVGRkVSX1ZHX01BU0sgICAgICAgICAgNAorI2RlZmluZSBWQzRfTE9BRFNUT1JFX1RJTEVfQlVGRkVSX0ZVTEwgICAgICAgICAgICAgNQorLyoqIEB9ICovCisKKyNkZWZpbmUgVkM0X0lOREVYX0JVRkZFUl9VOCAgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IDQpCisjZGVmaW5lIFZDNF9JTkRFWF9CVUZGRVJfVTE2ICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA0KQorCisvKiBUaGlzIGZsYWcgaXMgb25seSBwcmVzZW50IGluIE5WIHNoYWRlciBzdGF0ZS4gKi8KKyNkZWZpbmUgVkM0X1NIQURFUl9GTEFHX1NIQURFRF9DTElQX0NPT1JEUyAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIFZDNF9TSEFERVJfRkxBR19FTkFCTEVfQ0xJUFBJTkcgICAgICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBWQzRfU0hBREVSX0ZMQUdfVlNfUE9JTlRfU0laRSAgICAgICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgVkM0X1NIQURFUl9GTEFHX0ZTX1NJTkdMRV9USFJFQUQgICAgICAgICAgICgxIDw8IDApCisKKy8qKiBAeyBieXRlIDIgb2YgY29uZmlnIGJpdHMuICovCisjZGVmaW5lIFZDNF9DT05GSUdfQklUU19FQVJMWV9aX1VQREFURSAgICAgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBWQzRfQ09ORklHX0JJVFNfRUFSTFlfWiAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKKy8qKiBAfSAqLworCisvKiogQHsgYnl0ZSAxIG9mIGNvbmZpZyBiaXRzLiAqLworI2RlZmluZSBWQzRfQ09ORklHX0JJVFNfWl9VUERBVEUgICAgICAgICAgICAgICAgICAgKDEgPDwgNykKKy8qKiBzYW1lIHZhbHVlcyBpbiB0aGlzIDMtYml0IGZpZWxkIGFzIFBJUEVfRlVOQ18qICovCisjZGVmaW5lIFZDNF9DT05GSUdfQklUU19ERVBUSF9GVU5DX1NISUZUICAgICAgICAgICA0CisjZGVmaW5lIFZDNF9DT05GSUdfQklUU19DT1ZFUkFHRV9SRUFEX0xFQVZFICAgICAgICAoMSA8PCAzKQorCisjZGVmaW5lIFZDNF9DT05GSUdfQklUU19DT1ZFUkFHRV9VUERBVEVfTk9OWkVSTyAgICAoMCA8PCAxKQorI2RlZmluZSBWQzRfQ09ORklHX0JJVFNfQ09WRVJBR0VfVVBEQVRFX09ERCAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgVkM0X0NPTkZJR19CSVRTX0NPVkVSQUdFX1VQREFURV9PUiAgICAgICAgICgyIDw8IDEpCisjZGVmaW5lIFZDNF9DT05GSUdfQklUU19DT1ZFUkFHRV9VUERBVEVfWkVSTyAgICAgICAoMyA8PCAxKQorCisjZGVmaW5lIFZDNF9DT05GSUdfQklUU19DT1ZFUkFHRV9QSVBFX1NFTEVDVCAgICAgICAoMSA8PCAwKQorLyoqIEB9ICovCisKKy8qKiBAeyBieXRlIDAgb2YgY29uZmlnIGJpdHMuICovCisjZGVmaW5lIFZDNF9DT05GSUdfQklUU19SQVNURVJJWkVSX09WRVJTQU1QTEVfTk9ORSAoMCA8PCA2KQorI2RlZmluZSBWQzRfQ09ORklHX0JJVFNfUkFTVEVSSVpFUl9PVkVSU0FNUExFXzRYICAgKDEgPDwgNikKKyNkZWZpbmUgVkM0X0NPTkZJR19CSVRTX1JBU1RFUklaRVJfT1ZFUlNBTVBMRV8xNlggICgyIDw8IDYpCisjZGVmaW5lIFZDNF9DT05GSUdfQklUU19SQVNURVJJWkVSX09WRVJTQU1QTEVfTUFTSyAoMyA8PCA2KQorCisjZGVmaW5lIFZDNF9DT05GSUdfQklUU19BQV9QT0lOVFNfQU5EX0xJTkVTICAgICAgICAoMSA8PCA0KQorI2RlZmluZSBWQzRfQ09ORklHX0JJVFNfRU5BQkxFX0RFUFRIX09GRlNFVCAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgVkM0X0NPTkZJR19CSVRTX0NXX1BSSU1JVElWRVMgICAgICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIFZDNF9DT05GSUdfQklUU19FTkFCTEVfUFJJTV9CQUNLICAgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBWQzRfQ09ORklHX0JJVFNfRU5BQkxFX1BSSU1fRlJPTlQgICAgICAgICAgKDEgPDwgMCkKKy8qKiBAfSAqLworCisvKiogQHsgYml0cyBpbiB0aGUgbGFzdCB1OCBvZiBWQzRfUEFDS0VUX1RJTEVfQklOTklOR19NT0RFX0NPTkZJRyAqLworI2RlZmluZSBWQzRfQklOX0NPTkZJR19EQl9OT05fTVMgICAgICAgICAgICAgICAgICAgKDEgPDwgNykKKworI2RlZmluZSBWQzRfQklOX0NPTkZJR19BTExPQ19CTE9DS19TSVpFX01BU0sgICAgICAgVkM0X01BU0soNiwgNSkKKyNkZWZpbmUgVkM0X0JJTl9DT05GSUdfQUxMT0NfQkxPQ0tfU0laRV9TSElGVCAgICAgIDUKKyNkZWZpbmUgVkM0X0JJTl9DT05GSUdfQUxMT0NfQkxPQ0tfU0laRV8zMiAgICAgICAgIDAKKyNkZWZpbmUgVkM0X0JJTl9DT05GSUdfQUxMT0NfQkxPQ0tfU0laRV82NCAgICAgICAgIDEKKyNkZWZpbmUgVkM0X0JJTl9DT05GSUdfQUxMT0NfQkxPQ0tfU0laRV8xMjggICAgICAgIDIKKyNkZWZpbmUgVkM0X0JJTl9DT05GSUdfQUxMT0NfQkxPQ0tfU0laRV8yNTYgICAgICAgIDMKKworI2RlZmluZSBWQzRfQklOX0NPTkZJR19BTExPQ19JTklUX0JMT0NLX1NJWkVfTUFTSyAgVkM0X01BU0soNCwgMykKKyNkZWZpbmUgVkM0X0JJTl9DT05GSUdfQUxMT0NfSU5JVF9CTE9DS19TSVpFX1NISUZUIDMKKyNkZWZpbmUgVkM0X0JJTl9DT05GSUdfQUxMT0NfSU5JVF9CTE9DS19TSVpFXzMyICAgIDAKKyNkZWZpbmUgVkM0X0JJTl9DT05GSUdfQUxMT0NfSU5JVF9CTE9DS19TSVpFXzY0ICAgIDEKKyNkZWZpbmUgVkM0X0JJTl9DT05GSUdfQUxMT0NfSU5JVF9CTE9DS19TSVpFXzEyOCAgIDIKKyNkZWZpbmUgVkM0X0JJTl9DT05GSUdfQUxMT0NfSU5JVF9CTE9DS19TSVpFXzI1NiAgIDMKKworI2RlZmluZSBWQzRfQklOX0NPTkZJR19BVVRPX0lOSVRfVFNEQSAgICAgICAgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgVkM0X0JJTl9DT05GSUdfVElMRV9CVUZGRVJfNjRCSVQgICAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIFZDNF9CSU5fQ09ORklHX01TX01PREVfNFggICAgICAgICAgICAgICAgICAoMSA8PCAwKQorLyoqIEB9ICovCisKKy8qKiBAeyBiaXRzIGluIHRoZSBsYXN0IHUxNiBvZiBWQzRfUEFDS0VUX1RJTEVfUkVOREVSSU5HX01PREVfQ09ORklHICovCisjZGVmaW5lIFZDNF9SRU5ERVJfQ09ORklHX0RCX05PTl9NUyAgICAgICAgICAgICAgICAoMSA8PCAxMikKKyNkZWZpbmUgVkM0X1JFTkRFUl9DT05GSUdfRUFSTFlfWl9DT1ZFUkFHRV9ESVNBQkxFICgxIDw8IDExKQorI2RlZmluZSBWQzRfUkVOREVSX0NPTkZJR19FQVJMWV9aX0RJUkVDVElPTl9HICAgICAgKDEgPDwgMTApCisjZGVmaW5lIFZDNF9SRU5ERVJfQ09ORklHX0NPVkVSQUdFX01PREUgICAgICAgICAgICAoMSA8PCA5KQorI2RlZmluZSBWQzRfUkVOREVSX0NPTkZJR19FTkFCTEVfVkdfTUFTSyAgICAgICAgICAgKDEgPDwgOCkKKworLyoqIFRoZSB2YWx1ZXMgb2YgdGhlIGZpZWxkIGFyZSBWQzRfVElMSU5HX0ZPUk1BVF8qICovCisjZGVmaW5lIFZDNF9SRU5ERVJfQ09ORklHX01FTU9SWV9GT1JNQVRfTUFTSyAgICAgICBWQzRfTUFTSyg3LCA2KQorI2RlZmluZSBWQzRfUkVOREVSX0NPTkZJR19NRU1PUllfRk9STUFUX1NISUZUICAgICAgNgorCisjZGVmaW5lIFZDNF9SRU5ERVJfQ09ORklHX0RFQ0lNQVRFX01PREVfMVggICAgICAgICAoMCA8PCA0KQorI2RlZmluZSBWQzRfUkVOREVSX0NPTkZJR19ERUNJTUFURV9NT0RFXzRYICAgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgVkM0X1JFTkRFUl9DT05GSUdfREVDSU1BVEVfTU9ERV8xNlggICAgICAgICgyIDw8IDQpCisjZGVmaW5lIFZDNF9SRU5ERVJfQ09ORklHX0RFQ0lNQVRFX01PREVfTUFTSyAgICAgICAoMyA8PCA0KQorCisjZGVmaW5lIFZDNF9SRU5ERVJfQ09ORklHX0ZPUk1BVF9NQVNLICAgICAgICAgICAgICBWQzRfTUFTSygzLCAyKQorI2RlZmluZSBWQzRfUkVOREVSX0NPTkZJR19GT1JNQVRfU0hJRlQgICAgICAgICAgICAgMgorI2RlZmluZSBWQzRfUkVOREVSX0NPTkZJR19GT1JNQVRfQkdSNTY1X0RJVEhFUkVEICAgMAorI2RlZmluZSBWQzRfUkVOREVSX0NPTkZJR19GT1JNQVRfUkdCQTg4ODggICAgICAgICAgMQorI2RlZmluZSBWQzRfUkVOREVSX0NPTkZJR19GT1JNQVRfQkdSNTY1ICAgICAgICAgICAgMgorCisjZGVmaW5lIFZDNF9SRU5ERVJfQ09ORklHX1RJTEVfQlVGRkVSXzY0QklUICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBWQzRfUkVOREVSX0NPTkZJR19NU19NT0RFXzRYICAgICAgICAgICAgICAgKDEgPDwgMCkKKworI2RlZmluZSBWQzRfUFJJTUlUSVZFX0xJU1RfRk9STUFUXzE2X0lOREVYICAgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgVkM0X1BSSU1JVElWRV9MSVNUX0ZPUk1BVF8zMl9YWSAgICAgICAgICAgICgzIDw8IDQpCisjZGVmaW5lIFZDNF9QUklNSVRJVkVfTElTVF9GT1JNQVRfVFlQRV9QT0lOVFMgICAgICAoMCA8PCAwKQorI2RlZmluZSBWQzRfUFJJTUlUSVZFX0xJU1RfRk9STUFUX1RZUEVfTElORVMgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgVkM0X1BSSU1JVElWRV9MSVNUX0ZPUk1BVF9UWVBFX1RSSUFOR0xFUyAgICgyIDw8IDApCisjZGVmaW5lIFZDNF9QUklNSVRJVkVfTElTVF9GT1JNQVRfVFlQRV9SSFQgICAgICAgICAoMyA8PCAwKQorCitlbnVtIHZjNF90ZXh0dXJlX2RhdGFfdHlwZSB7CisgICAgICAgIFZDNF9URVhUVVJFX1RZUEVfUkdCQTg4ODggPSAwLAorICAgICAgICBWQzRfVEVYVFVSRV9UWVBFX1JHQlg4ODg4ID0gMSwKKyAgICAgICAgVkM0X1RFWFRVUkVfVFlQRV9SR0JBNDQ0NCA9IDIsCisgICAgICAgIFZDNF9URVhUVVJFX1RZUEVfUkdCQTU1NTEgPSAzLAorICAgICAgICBWQzRfVEVYVFVSRV9UWVBFX1JHQjU2NSA9IDQsCisgICAgICAgIFZDNF9URVhUVVJFX1RZUEVfTFVNSU5BTkNFID0gNSwKKyAgICAgICAgVkM0X1RFWFRVUkVfVFlQRV9BTFBIQSA9IDYsCisgICAgICAgIFZDNF9URVhUVVJFX1RZUEVfTFVNQUxQSEEgPSA3LAorICAgICAgICBWQzRfVEVYVFVSRV9UWVBFX0VUQzEgPSA4LAorICAgICAgICBWQzRfVEVYVFVSRV9UWVBFX1MxNkYgPSA5LAorICAgICAgICBWQzRfVEVYVFVSRV9UWVBFX1M4ID0gMTAsCisgICAgICAgIFZDNF9URVhUVVJFX1RZUEVfUzE2ID0gMTEsCisgICAgICAgIFZDNF9URVhUVVJFX1RZUEVfQlcxID0gMTIsCisgICAgICAgIFZDNF9URVhUVVJFX1RZUEVfQTQgPSAxMywKKyAgICAgICAgVkM0X1RFWFRVUkVfVFlQRV9BMSA9IDE0LAorICAgICAgICBWQzRfVEVYVFVSRV9UWVBFX1JHQkE2NCA9IDE1LAorICAgICAgICBWQzRfVEVYVFVSRV9UWVBFX1JHQkEzMlIgPSAxNiwKKyAgICAgICAgVkM0X1RFWFRVUkVfVFlQRV9ZVVY0MjJSID0gMTcsCit9OworCisjZGVmaW5lIFZDNF9URVhfUDBfT0ZGU0VUX01BU0sgICAgICAgICAgICAgICAgICAgICBWQzRfTUFTSygzMSwgMTIpCisjZGVmaW5lIFZDNF9URVhfUDBfT0ZGU0VUX1NISUZUICAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBWQzRfVEVYX1AwX0NTV0laX01BU0sgICAgICAgICAgICAgICAgICAgICAgVkM0X01BU0soMTEsIDEwKQorI2RlZmluZSBWQzRfVEVYX1AwX0NTV0laX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgVkM0X1RFWF9QMF9DTU1PREVfTUFTSyAgICAgICAgICAgICAgICAgICAgIFZDNF9NQVNLKDksIDkpCisjZGVmaW5lIFZDNF9URVhfUDBfQ01NT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIFZDNF9URVhfUDBfRkxJUFlfTUFTSyAgICAgICAgICAgICAgICAgICAgICBWQzRfTUFTSyg4LCA4KQorI2RlZmluZSBWQzRfVEVYX1AwX0ZMSVBZX1NISUZUICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBWQzRfVEVYX1AwX1RZUEVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgVkM0X01BU0soNywgNCkKKyNkZWZpbmUgVkM0X1RFWF9QMF9UWVBFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgVkM0X1RFWF9QMF9NSVBMVkxTX01BU0sgICAgICAgICAgICAgICAgICAgIFZDNF9NQVNLKDMsIDApCisjZGVmaW5lIFZDNF9URVhfUDBfTUlQTFZMU19TSElGVCAgICAgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgVkM0X1RFWF9QMV9UWVBFNF9NQVNLICAgICAgICAgICAgICAgICAgICAgIFZDNF9NQVNLKDMxLCAzMSkKKyNkZWZpbmUgVkM0X1RFWF9QMV9UWVBFNF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDMxCisjZGVmaW5lIFZDNF9URVhfUDFfSEVJR0hUX01BU0sgICAgICAgICAgICAgICAgICAgICBWQzRfTUFTSygzMCwgMjApCisjZGVmaW5lIFZDNF9URVhfUDFfSEVJR0hUX1NISUZUICAgICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBWQzRfVEVYX1AxX0VUQ0ZMSVBfTUFTSyAgICAgICAgICAgICAgICAgICAgVkM0X01BU0soMTksIDE5KQorI2RlZmluZSBWQzRfVEVYX1AxX0VUQ0ZMSVBfU0hJRlQgICAgICAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgVkM0X1RFWF9QMV9XSURUSF9NQVNLICAgICAgICAgICAgICAgICAgICAgIFZDNF9NQVNLKDE4LCA4KQorI2RlZmluZSBWQzRfVEVYX1AxX1dJRFRIX1NISUZUICAgICAgICAgICAgICAgICAgICAgOAorCisjZGVmaW5lIFZDNF9URVhfUDFfTUFHRklMVF9NQVNLICAgICAgICAgICAgICAgICAgICBWQzRfTUFTSyg3LCA3KQorI2RlZmluZSBWQzRfVEVYX1AxX01BR0ZJTFRfU0hJRlQgICAgICAgICAgICAgICAgICAgNworIyBkZWZpbmUgVkM0X1RFWF9QMV9NQUdGSUxUX0xJTkVBUiAgICAgICAgICAgICAgICAgMAorIyBkZWZpbmUgVkM0X1RFWF9QMV9NQUdGSUxUX05FQVJFU1QgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFZDNF9URVhfUDFfTUlORklMVF9NQVNLICAgICAgICAgICAgICAgICAgICBWQzRfTUFTSyg2LCA0KQorI2RlZmluZSBWQzRfVEVYX1AxX01JTkZJTFRfU0hJRlQgICAgICAgICAgICAgICAgICAgNAorIyBkZWZpbmUgVkM0X1RFWF9QMV9NSU5GSUxUX0xJTkVBUiAgICAgICAgICAgICAgICAgMAorIyBkZWZpbmUgVkM0X1RFWF9QMV9NSU5GSUxUX05FQVJFU1QgICAgICAgICAgICAgICAgMQorIyBkZWZpbmUgVkM0X1RFWF9QMV9NSU5GSUxUX05FQVJfTUlQX05FQVIgICAgICAgICAgMgorIyBkZWZpbmUgVkM0X1RFWF9QMV9NSU5GSUxUX05FQVJfTUlQX0xJTiAgICAgICAgICAgMworIyBkZWZpbmUgVkM0X1RFWF9QMV9NSU5GSUxUX0xJTl9NSVBfTkVBUiAgICAgICAgICAgNAorIyBkZWZpbmUgVkM0X1RFWF9QMV9NSU5GSUxUX0xJTl9NSVBfTElOICAgICAgICAgICAgNQorCisjZGVmaW5lIFZDNF9URVhfUDFfV1JBUF9UX01BU0sgICAgICAgICAgICAgICAgICAgICBWQzRfTUFTSygzLCAyKQorI2RlZmluZSBWQzRfVEVYX1AxX1dSQVBfVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBWQzRfVEVYX1AxX1dSQVBfU19NQVNLICAgICAgICAgICAgICAgICAgICAgVkM0X01BU0soMSwgMCkKKyNkZWZpbmUgVkM0X1RFWF9QMV9XUkFQX1NfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAKKyMgZGVmaW5lIFZDNF9URVhfUDFfV1JBUF9SRVBFQVQgICAgICAgICAgICAgICAgICAgIDAKKyMgZGVmaW5lIFZDNF9URVhfUDFfV1JBUF9DTEFNUCAgICAgICAgICAgICAgICAgICAgIDEKKyMgZGVmaW5lIFZDNF9URVhfUDFfV1JBUF9NSVJST1IgICAgICAgICAgICAgICAgICAgIDIKKyMgZGVmaW5lIFZDNF9URVhfUDFfV1JBUF9CT1JERVIgICAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBWQzRfVEVYX1AyX1BUWVBFX01BU0sgICAgICAgICAgICAgICAgICAgICAgVkM0X01BU0soMzEsIDMwKQorI2RlZmluZSBWQzRfVEVYX1AyX1BUWVBFX1NISUZUICAgICAgICAgICAgICAgICAgICAgMzAKKyMgZGVmaW5lIFZDNF9URVhfUDJfUFRZUEVfSUdOT1JFRCAgICAgICAgICAgICAgICAgIDAKKyMgZGVmaW5lIFZDNF9URVhfUDJfUFRZUEVfQ1VCRV9NQVBfU1RSSURFICAgICAgICAgIDEKKyMgZGVmaW5lIFZDNF9URVhfUDJfUFRZUEVfQ0hJTERfSU1BR0VfRElNRU5TSU9OUyAgIDIKKyMgZGVmaW5lIFZDNF9URVhfUDJfUFRZUEVfQ0hJTERfSU1BR0VfT0ZGU0VUUyAgICAgIDMKKworLyogVkM0X1RFWF9QMl9QVFlQRV9DVUJFX01BUF9TVFJJREUgYml0cyAqLworI2RlZmluZSBWQzRfVEVYX1AyX0NNU1RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgVkM0X01BU0soMjksIDEyKQorI2RlZmluZSBWQzRfVEVYX1AyX0NNU1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgVkM0X1RFWF9QMl9CU0xPRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIFZDNF9NQVNLKDAsIDApCisjZGVmaW5lIFZDNF9URVhfUDJfQlNMT0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIFZDNF9URVhfUDJfUFRZUEVfQ0hJTERfSU1BR0VfRElNRU5TSU9OUyAqLworI2RlZmluZSBWQzRfVEVYX1AyX0NIRUlHSFRfTUFTSyAgICAgICAgICAgICAgICAgICAgVkM0X01BU0soMjIsIDEyKQorI2RlZmluZSBWQzRfVEVYX1AyX0NIRUlHSFRfU0hJRlQgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgVkM0X1RFWF9QMl9DV0lEVEhfTUFTSyAgICAgICAgICAgICAgICAgICAgIFZDNF9NQVNLKDEwLCAwKQorI2RlZmluZSBWQzRfVEVYX1AyX0NXSURUSF9TSElGVCAgICAgICAgICAgICAgICAgICAgMAorCisvKiBWQzRfVEVYX1AyX1BUWVBFX0NISUxEX0lNQUdFX09GRlNFVFMgKi8KKyNkZWZpbmUgVkM0X1RFWF9QMl9DWU9GRl9NQVNLICAgICAgICAgICAgICAgICAgICAgIFZDNF9NQVNLKDIyLCAxMikKKyNkZWZpbmUgVkM0X1RFWF9QMl9DWU9GRl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFZDNF9URVhfUDJfQ1hPRkZfTUFTSyAgICAgICAgICAgICAgICAgICAgICBWQzRfTUFTSygxMCwgMCkKKyNkZWZpbmUgVkM0X1RFWF9QMl9DWE9GRl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAKKworI2VuZGlmIC8qIFZDNF9QQUNLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvdmM0L3ZjNF9xcHVfZGVmaW5lcy5oIGIvdmM0L3ZjNF9xcHVfZGVmaW5lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZmNmNTAKLS0tIC9kZXYvbnVsbAorKysgYi92YzQvdmM0X3FwdV9kZWZpbmVzLmgKQEAgLTAsMCArMSwyNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNCBCcm9hZGNvbQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFZDNF9RUFVfREVGSU5FU19ICisjZGVmaW5lIFZDNF9RUFVfREVGSU5FU19ICisKK2VudW0gcXB1X29wX2FkZCB7CisgICAgICAgIFFQVV9BX05PUCwKKyAgICAgICAgUVBVX0FfRkFERCwKKyAgICAgICAgUVBVX0FfRlNVQiwKKyAgICAgICAgUVBVX0FfRk1JTiwKKyAgICAgICAgUVBVX0FfRk1BWCwKKyAgICAgICAgUVBVX0FfRk1JTkFCUywKKyAgICAgICAgUVBVX0FfRk1BWEFCUywKKyAgICAgICAgUVBVX0FfRlRPSSwKKyAgICAgICAgUVBVX0FfSVRPRiwKKyAgICAgICAgUVBVX0FfQUREID0gMTIsCisgICAgICAgIFFQVV9BX1NVQiwKKyAgICAgICAgUVBVX0FfU0hSLAorICAgICAgICBRUFVfQV9BU1IsCisgICAgICAgIFFQVV9BX1JPUiwKKyAgICAgICAgUVBVX0FfU0hMLAorICAgICAgICBRUFVfQV9NSU4sCisgICAgICAgIFFQVV9BX01BWCwKKyAgICAgICAgUVBVX0FfQU5ELAorICAgICAgICBRUFVfQV9PUiwKKyAgICAgICAgUVBVX0FfWE9SLAorICAgICAgICBRUFVfQV9OT1QsCisgICAgICAgIFFQVV9BX0NMWiwKKyAgICAgICAgUVBVX0FfVjhBRERTID0gMzAsCisgICAgICAgIFFQVV9BX1Y4U1VCUyA9IDMxLAorfTsKKworZW51bSBxcHVfb3BfbXVsIHsKKyAgICAgICAgUVBVX01fTk9QLAorICAgICAgICBRUFVfTV9GTVVMLAorICAgICAgICBRUFVfTV9NVUwyNCwKKyAgICAgICAgUVBVX01fVjhNVUxELAorICAgICAgICBRUFVfTV9WOE1JTiwKKyAgICAgICAgUVBVX01fVjhNQVgsCisgICAgICAgIFFQVV9NX1Y4QUREUywKKyAgICAgICAgUVBVX01fVjhTVUJTLAorfTsKKworZW51bSBxcHVfcmFkZHIgeworICAgICAgICBRUFVfUl9GUkFHX1BBWUxPQURfWlcgPSAxNSwgLyogVyBmb3IgQSBmaWxlLCBaIGZvciBCIGZpbGUgKi8KKyAgICAgICAgLyogMC0zMSBhcmUgdGhlIHBsYWluIHJlZ2ZpbGUgYSBvciBiIGZpZWxkcyAqLworICAgICAgICBRUFVfUl9VTklGID0gMzIsCisgICAgICAgIFFQVV9SX1ZBUlkgPSAzNSwKKyAgICAgICAgUVBVX1JfRUxFTV9RUFUgPSAzOCwKKyAgICAgICAgUVBVX1JfTk9QLAorICAgICAgICBRUFVfUl9YWV9QSVhFTF9DT09SRCA9IDQxLAorICAgICAgICBRUFVfUl9NU19SRVZfRkxBR1MgPSA0MiwKKyAgICAgICAgUVBVX1JfVlBNID0gNDgsCisgICAgICAgIFFQVV9SX1ZQTV9MRF9CVVNZLAorICAgICAgICBRUFVfUl9WUE1fTERfV0FJVCwKKyAgICAgICAgUVBVX1JfTVVURVhfQUNRVUlSRSwKK307CisKK2VudW0gcXB1X3dhZGRyIHsKKyAgICAgICAgLyogMC0zMSBhcmUgdGhlIHBsYWluIHJlZ2ZpbGUgYSBvciBiIGZpZWxkcyAqLworICAgICAgICBRUFVfV19BQ0MwID0gMzIsIC8qIGFrYSByMCAqLworICAgICAgICBRUFVfV19BQ0MxLAorICAgICAgICBRUFVfV19BQ0MyLAorICAgICAgICBRUFVfV19BQ0MzLAorICAgICAgICBRUFVfV19UTVVfTk9TV0FQLAorICAgICAgICBRUFVfV19BQ0M1LAorICAgICAgICBRUFVfV19IT1NUX0lOVCwKKyAgICAgICAgUVBVX1dfTk9QLAorICAgICAgICBRUFVfV19VTklGT1JNU19BRERSRVNTLAorICAgICAgICBRUFVfV19RVUFEX1hZLCAvKiBYIGZvciByZWdmaWxlIGEsIFkgZm9yIHJlZ2ZpbGUgYiAqLworICAgICAgICBRUFVfV19NU19GTEFHUyA9IDQyLAorICAgICAgICBRUFVfV19SRVZfRkxBRyA9IDQyLAorICAgICAgICBRUFVfV19UTEJfU1RFTkNJTF9TRVRVUCA9IDQzLAorICAgICAgICBRUFVfV19UTEJfWiwKKyAgICAgICAgUVBVX1dfVExCX0NPTE9SX01TLAorICAgICAgICBRUFVfV19UTEJfQ09MT1JfQUxMLAorICAgICAgICBRUFVfV19UTEJfQUxQSEFfTUFTSywKKyAgICAgICAgUVBVX1dfVlBNLAorICAgICAgICBRUFVfV19WUE1WQ0RfU0VUVVAsIC8qIExEIGZvciByZWdmaWxlIGEsIFNUIGZvciByZWdmaWxlIGIgKi8KKyAgICAgICAgUVBVX1dfVlBNX0FERFIsIC8qIExEIGZvciByZWdmaWxlIGEsIFNUIGZvciByZWdmaWxlIGIgKi8KKyAgICAgICAgUVBVX1dfTVVURVhfUkVMRUFTRSwKKyAgICAgICAgUVBVX1dfU0ZVX1JFQ0lQLAorICAgICAgICBRUFVfV19TRlVfUkVDSVBTUVJULAorICAgICAgICBRUFVfV19TRlVfRVhQLAorICAgICAgICBRUFVfV19TRlVfTE9HLAorICAgICAgICBRUFVfV19UTVUwX1MsCisgICAgICAgIFFQVV9XX1RNVTBfVCwKKyAgICAgICAgUVBVX1dfVE1VMF9SLAorICAgICAgICBRUFVfV19UTVUwX0IsCisgICAgICAgIFFQVV9XX1RNVTFfUywKKyAgICAgICAgUVBVX1dfVE1VMV9ULAorICAgICAgICBRUFVfV19UTVUxX1IsCisgICAgICAgIFFQVV9XX1RNVTFfQiwKK307CisKK2VudW0gcXB1X3NpZ19iaXRzIHsKKyAgICAgICAgUVBVX1NJR19TV19CUkVBS1BPSU5ULAorICAgICAgICBRUFVfU0lHX05PTkUsCisgICAgICAgIFFQVV9TSUdfVEhSRUFEX1NXSVRDSCwKKyAgICAgICAgUVBVX1NJR19QUk9HX0VORCwKKyAgICAgICAgUVBVX1NJR19XQUlUX0ZPUl9TQ09SRUJPQVJELAorICAgICAgICBRUFVfU0lHX1NDT1JFQk9BUkRfVU5MT0NLLAorICAgICAgICBRUFVfU0lHX0xBU1RfVEhSRUFEX1NXSVRDSCwKKyAgICAgICAgUVBVX1NJR19DT1ZFUkFHRV9MT0FELAorICAgICAgICBRUFVfU0lHX0NPTE9SX0xPQUQsCisgICAgICAgIFFQVV9TSUdfQ09MT1JfTE9BRF9FTkQsCisgICAgICAgIFFQVV9TSUdfTE9BRF9UTVUwLAorICAgICAgICBRUFVfU0lHX0xPQURfVE1VMSwKKyAgICAgICAgUVBVX1NJR19BTFBIQV9NQVNLX0xPQUQsCisgICAgICAgIFFQVV9TSUdfU01BTExfSU1NLAorICAgICAgICBRUFVfU0lHX0xPQURfSU1NLAorICAgICAgICBRUFVfU0lHX0JSQU5DSAorfTsKKworZW51bSBxcHVfbXV4IHsKKyAgICAgICAgLyogaGFyZHdhcmUgbXV4IHZhbHVlcyAqLworICAgICAgICBRUFVfTVVYX1IwLAorICAgICAgICBRUFVfTVVYX1IxLAorICAgICAgICBRUFVfTVVYX1IyLAorICAgICAgICBRUFVfTVVYX1IzLAorICAgICAgICBRUFVfTVVYX1I0LAorICAgICAgICBRUFVfTVVYX1I1LAorICAgICAgICBRUFVfTVVYX0EsCisgICAgICAgIFFQVV9NVVhfQiwKKworICAgICAgICAvKioKKyAgICAgICAgICogTm9uLWhhcmR3YXJlIG11eCB2YWx1ZSwgc3RvcmVzIGEgc21hbGwgaW1tZWRpYXRlIGZpZWxkIHRvIGJlCisgICAgICAgICAqIHByb2dyYW1tZWQgaW50byByYWRkcl9iIGluIHRoZSBxcHVfcmVnLmluZGV4LgorICAgICAgICAgKi8KKyAgICAgICAgUVBVX01VWF9TTUFMTF9JTU0sCit9OworCitlbnVtIHFwdV9jb25kIHsKKyAgICAgICAgUVBVX0NPTkRfTkVWRVIsCisgICAgICAgIFFQVV9DT05EX0FMV0FZUywKKyAgICAgICAgUVBVX0NPTkRfWlMsCisgICAgICAgIFFQVV9DT05EX1pDLAorICAgICAgICBRUFVfQ09ORF9OUywKKyAgICAgICAgUVBVX0NPTkRfTkMsCisgICAgICAgIFFQVV9DT05EX0NTLAorICAgICAgICBRUFVfQ09ORF9DQywKK307CisKK2VudW0gcXB1X3BhY2tfbXVsIHsKKyAgICAgICAgUVBVX1BBQ0tfTVVMX05PUCwKKyAgICAgICAgUVBVX1BBQ0tfTVVMXzg4ODggPSAzLCAvKiByZXBsaWNhdGVkIHRvIGVhY2ggOCBiaXRzIG9mIHRoZSAzMi1iaXQgZHN0LiAqLworICAgICAgICBRUFVfUEFDS19NVUxfOEEsCisgICAgICAgIFFQVV9QQUNLX01VTF84QiwKKyAgICAgICAgUVBVX1BBQ0tfTVVMXzhDLAorICAgICAgICBRUFVfUEFDS19NVUxfOEQsCit9OworCitlbnVtIHFwdV9wYWNrX2EgeworICAgICAgICBRUFVfUEFDS19BX05PUCwKKyAgICAgICAgLyogY29udmVydCB0byAxNiBiaXQgZmxvYXQgaWYgZmxvYXQgaW5wdXQsIG9yIHRvIGludDE2LiAqLworICAgICAgICBRUFVfUEFDS19BXzE2QSwKKyAgICAgICAgUVBVX1BBQ0tfQV8xNkIsCisgICAgICAgIC8qIHJlcGxpY2F0ZWQgdG8gZWFjaCA4IGJpdHMgb2YgdGhlIDMyLWJpdCBkc3QuICovCisgICAgICAgIFFQVV9QQUNLX0FfODg4OCwKKyAgICAgICAgLyogQ29udmVydCB0byA4LWJpdCB1bnNpZ25lZCBpbnQuICovCisgICAgICAgIFFQVV9QQUNLX0FfOEEsCisgICAgICAgIFFQVV9QQUNLX0FfOEIsCisgICAgICAgIFFQVV9QQUNLX0FfOEMsCisgICAgICAgIFFQVV9QQUNLX0FfOEQsCisKKyAgICAgICAgLyogU2F0dXJhdGluZyB2YXJpYW50cyBvZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb25zLiAqLworICAgICAgICBRUFVfUEFDS19BXzMyX1NBVCwgLyogaW50LW9ubHkgKi8KKyAgICAgICAgUVBVX1BBQ0tfQV8xNkFfU0FULCAvKiBpbnQgb3IgZmxvYXQgKi8KKyAgICAgICAgUVBVX1BBQ0tfQV8xNkJfU0FULAorICAgICAgICBRUFVfUEFDS19BXzg4ODhfU0FULAorICAgICAgICBRUFVfUEFDS19BXzhBX1NBVCwKKyAgICAgICAgUVBVX1BBQ0tfQV84Ql9TQVQsCisgICAgICAgIFFQVV9QQUNLX0FfOENfU0FULAorICAgICAgICBRUFVfUEFDS19BXzhEX1NBVCwKK307CisKK2VudW0gcXB1X3VucGFjayB7CisgICAgICAgIFFQVV9VTlBBQ0tfTk9QLAorICAgICAgICBRUFVfVU5QQUNLXzE2QSwKKyAgICAgICAgUVBVX1VOUEFDS18xNkIsCisgICAgICAgIFFQVV9VTlBBQ0tfOERfUkVQLAorICAgICAgICBRUFVfVU5QQUNLXzhBLAorICAgICAgICBRUFVfVU5QQUNLXzhCLAorICAgICAgICBRUFVfVU5QQUNLXzhDLAorICAgICAgICBRUFVfVU5QQUNLXzhELAorfTsKKworI2RlZmluZSBRUFVfTUFTSyhoaWdoLCBsb3cpICgoKCh1aW50NjRfdCkxPDwoKGhpZ2gpLShsb3cpKzEpKS0xKTw8KGxvdykpCisvKiBVc2luZyB0aGUgR05VIHN0YXRlbWVudCBleHByZXNzaW9uIGV4dGVuc2lvbiAqLworI2RlZmluZSBRUFVfU0VUX0ZJRUxEKHZhbHVlLCBmaWVsZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBmaWVsZHZhbCA9ICh1aW50NjRfdCkodmFsdWUpIDw8IGZpZWxkICMjIF9TSElGVDsgXAorICAgICAgICAgICAgICAgIGFzc2VydCgoZmllbGR2YWwgJiB+IGZpZWxkICMjIF9NQVNLKSA9PSAwKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmllbGR2YWwgJiBmaWVsZCAjIyBfTUFTSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIH0pCisKKyNkZWZpbmUgUVBVX0dFVF9GSUVMRCh3b3JkLCBmaWVsZCkgKCh1aW50MzJfdCkoKCh3b3JkKSAgJiBmaWVsZCAjIyBfTUFTSykgPj4gZmllbGQgIyMgX1NISUZUKSkKKworI2RlZmluZSBRUFVfVVBEQVRFX0ZJRUxEKGluc3QsIHZhbHVlLCBmaWVsZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgoKGluc3QpICYgfihmaWVsZCAjIyBfTUFTSykpIHwgUVBVX1NFVF9GSUVMRCh2YWx1ZSwgZmllbGQpKQorCisjZGVmaW5lIFFQVV9TSUdfU0hJRlQgICAgICAgICAgICAgICAgICAgNjAKKyNkZWZpbmUgUVBVX1NJR19NQVNLICAgICAgICAgICAgICAgICAgICBRUFVfTUFTSyg2MywgNjApCisKKyNkZWZpbmUgUVBVX1VOUEFDS19TSElGVCAgICAgICAgICAgICAgICA1NworI2RlZmluZSBRUFVfVU5QQUNLX01BU0sgICAgICAgICAgICAgICAgIFFQVV9NQVNLKDU5LCA1NykKKworLyoqCisgKiBJZiBzZXQsIHRoZSBwYWNrIGZpZWxkIG1lYW5zIFBBQ0tfTVVMIG9yIFI0IHBhY2tpbmcsIGluc3RlYWQgb2Ygbm9ybWFsCisgKiByZWdmaWxlIGEgcGFja2luZy4KKyAqLworI2RlZmluZSBRUFVfUE0gICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDY0X3QpMSA8PCA1NikKKworI2RlZmluZSBRUFVfUEFDS19TSElGVCAgICAgICAgICAgICAgICAgIDUyCisjZGVmaW5lIFFQVV9QQUNLX01BU0sgICAgICAgICAgICAgICAgICAgUVBVX01BU0soNTUsIDUyKQorCisjZGVmaW5lIFFQVV9DT05EX0FERF9TSElGVCAgICAgICAgICAgICAgNDkKKyNkZWZpbmUgUVBVX0NPTkRfQUREX01BU0sgICAgICAgICAgICAgICBRUFVfTUFTSyg1MSwgNDkpCisjZGVmaW5lIFFQVV9DT05EX01VTF9TSElGVCAgICAgICAgICAgICAgNDYKKyNkZWZpbmUgUVBVX0NPTkRfTVVMX01BU0sgICAgICAgICAgICAgICBRUFVfTUFTSyg0OCwgNDYpCisKKyNkZWZpbmUgUVBVX1NGICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ2NF90KTEgPDwgNDUpCisKKyNkZWZpbmUgUVBVX1dBRERSX0FERF9TSElGVCAgICAgICAgICAgICAzOAorI2RlZmluZSBRUFVfV0FERFJfQUREX01BU0sgICAgICAgICAgICAgIFFQVV9NQVNLKDQzLCAzOCkKKyNkZWZpbmUgUVBVX1dBRERSX01VTF9TSElGVCAgICAgICAgICAgICAzMgorI2RlZmluZSBRUFVfV0FERFJfTVVMX01BU0sgICAgICAgICAgICAgIFFQVV9NQVNLKDM3LCAzMikKKworI2RlZmluZSBRUFVfT1BfTVVMX1NISUZUICAgICAgICAgICAgICAgIDI5CisjZGVmaW5lIFFQVV9PUF9NVUxfTUFTSyAgICAgICAgICAgICAgICAgUVBVX01BU0soMzEsIDI5KQorCisjZGVmaW5lIFFQVV9SQUREUl9BX1NISUZUICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgUVBVX1JBRERSX0FfTUFTSyAgICAgICAgICAgICAgICBRUFVfTUFTSygyMywgMTgpCisjZGVmaW5lIFFQVV9SQUREUl9CX1NISUZUICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgUVBVX1JBRERSX0JfTUFTSyAgICAgICAgICAgICAgICBRUFVfTUFTSygxNywgMTIpCisjZGVmaW5lIFFQVV9TTUFMTF9JTU1fU0hJRlQgICAgICAgICAgICAgMTIKKyNkZWZpbmUgUVBVX1NNQUxMX0lNTV9NQVNLICAgICAgICAgICAgICBRUFVfTUFTSygxNywgMTIpCisKKyNkZWZpbmUgUVBVX0FERF9BX1NISUZUICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIFFQVV9BRERfQV9NQVNLICAgICAgICAgICAgICAgICAgUVBVX01BU0soMTEsIDkpCisjZGVmaW5lIFFQVV9BRERfQl9TSElGVCAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBRUFVfQUREX0JfTUFTSyAgICAgICAgICAgICAgICAgIFFQVV9NQVNLKDgsIDYpCisjZGVmaW5lIFFQVV9NVUxfQV9TSElGVCAgICAgICAgICAgICAgICAgMworI2RlZmluZSBRUFVfTVVMX0FfTUFTSyAgICAgICAgICAgICAgICAgIFFQVV9NQVNLKDUsIDMpCisjZGVmaW5lIFFQVV9NVUxfQl9TSElGVCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBRUFVfTVVMX0JfTUFTSyAgICAgICAgICAgICAgICAgIFFQVV9NQVNLKDIsIDApCisKKyNkZWZpbmUgUVBVX1dTICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ2NF90KTEgPDwgNDQpCisKKyNkZWZpbmUgUVBVX09QX0FERF9TSElGVCAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBRUFVfT1BfQUREX01BU0sgICAgICAgICAgICAgICAgIFFQVV9NQVNLKDI4LCAyNCkKKworI2VuZGlmIC8qIFZDNF9RUFVfREVGSU5FU19IICovCmRpZmYgLS1naXQgYS92aXZhbnRlL0FuZHJvaWQubWsgYi92aXZhbnRlL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1YjkzZAotLS0gL2Rldi9udWxsCisrKyBiL3ZpdmFudGUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQzIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgICAgQ29weXJpZ2h0IDIwMTIgLSAyMDE3IFZpdmFudGUgQ29ycG9yYXRpb24sIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhLgorIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyMgICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisjICAgICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyMgICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorIyAgICBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisjICAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorIyAgICB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisjICAgIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisjICAgIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMKKyMgICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisjICAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorIyAgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorIyAgICBJTiBOTyBFVkVOVCBTSEFMTCBWSVZBTlRFIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZCisjICAgIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisjICAgIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisjICAgIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSB2aXZhbnRlX2JvLmMKKworTE9DQUxfQ0ZMQUdTIDo9IC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAgICAkKExJQkRSTV9UT1ApL2luY2x1ZGUvZHJtCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliZHJtX2FuZHJvaWQKKworTE9DQUxfTU9EVUxFIDo9IGxpYmRybV92aXZhbnRlCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3ZpdmFudGUvTWFrZWZpbGUuYW0gYi92aXZhbnRlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNGM3M2UKLS0tIC9kZXYvbnVsbAorKysgYi92aXZhbnRlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTIgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgICBDb3B5cmlnaHQgMjAxMiAtIDIwMTcgVml2YW50ZSBDb3Jwb3JhdGlvbiwgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEuCisjICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworIyAgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyMgICAgJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworIyAgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisjICAgIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyMgICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0CisjICAgIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyMgICAgbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyMgICAgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyMgICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisjICAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisjICAgIElOIE5PIEVWRU5UIFNIQUxMIFZJVkFOVEUgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgICAgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyMgICAgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyMgICAgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCitBTV9DUFBGTEFHUyA9IFwKKwktSSQodG9wX3NyY2RpcikgXAorCS1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlL2RybQorCitBTV9DRkxBR1MgPSBcCisJQFBUSFJFQURTVFVCU19DRkxBR1NAIFwKKwkkKFdBUk5fQ0ZMQUdTKQorCitsaWJkcm1fdml2YW50ZV9sYWRpciA9ICQobGliZGlyKQorbGliZHJtX3ZpdmFudGVfbGFfTFRMSUJSQVJJRVMgPSBsaWJkcm1fdml2YW50ZS5sYQorbGliZHJtX3ZpdmFudGVfbGFfTERGTEFHUyA9IC12ZXJzaW9uLW51bWJlciAxOjA6MCAtbm8tdW5kZWZpbmVkCitsaWJkcm1fdml2YW50ZV9sYV9MSUJBREQgPSAuLi9saWJkcm0ubGEgQFBUSFJFQURTVFVCU19MSUJTQAorCitsaWJkcm1fdml2YW50ZV9sYV9TT1VSQ0VTID0gXAorCXZpdmFudGVfYm8uYworCitsaWJkcm1fdml2YW50ZWluY2x1ZGVkaXIgPSAke2luY2x1ZGVkaXJ9L2xpYmRybQorbGliZHJtX3ZpdmFudGVpbmNsdWRlX0hFQURFUlMgPSB2aXZhbnRlX2JvLmgKKworcGtnY29uZmlnZGlyID0gQHBrZ2NvbmZpZ2RpckAKK3BrZ2NvbmZpZ19EQVRBID0gbGliZHJtX3ZpdmFudGUucGMKKworVEVTVFMgPSB2aXZhbnRlLXN5bWJvbC1jaGVjaworRVhUUkFfRElTVCA9ICQoVEVTVFMpCmRpZmYgLS1naXQgYS92aXZhbnRlL2xpYmRybV92aXZhbnRlLnBjIGIvdml2YW50ZS9saWJkcm1fdml2YW50ZS5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzRhMzNjCi0tLSAvZGV2L251bGwKKysrIGIvdml2YW50ZS9saWJkcm1fdml2YW50ZS5wYwpAQCAtMCwwICsxLDExIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtleGVjX3ByZWZpeH0vbGliCitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCisKK05hbWU6IGxpYmRybV92aXZhbnRlCitEZXNjcmlwdGlvbjogVXNlcnNwYWNlIGludGVyZmFjZSB0byBWaXZhbnRlIGtlcm5lbCBEUk0gc2VydmljZXMKK1ZlcnNpb246IDIuNC44NAorTGliczogLUwke2xpYmRpcn0gLWxkcm1fdml2YW50ZQorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0gLUkke2luY2x1ZGVkaXJ9L2xpYmRybQorUmVxdWlyZXMucHJpdmF0ZTogbGliZHJtCmRpZmYgLS1naXQgYS92aXZhbnRlL2xpYmRybV92aXZhbnRlLnBjLmluIGIvdml2YW50ZS9saWJkcm1fdml2YW50ZS5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTk4ZDZiCi0tLSAvZGV2L251bGwKKysrIGIvdml2YW50ZS9saWJkcm1fdml2YW50ZS5wYy5pbgpAQCAtMCwwICsxLDExIEBACitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKKworTmFtZTogbGliZHJtX3ZpdmFudGUKK0Rlc2NyaXB0aW9uOiBVc2Vyc3BhY2UgaW50ZXJmYWNlIHRvIFZpdmFudGUga2VybmVsIERSTSBzZXJ2aWNlcworVmVyc2lvbjogQFBBQ0tBR0VfVkVSU0lPTkAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sZHJtX3ZpdmFudGUKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9IC1JJHtpbmNsdWRlZGlyfS9saWJkcm0KK1JlcXVpcmVzLnByaXZhdGU6IGxpYmRybQpkaWZmIC0tZ2l0IGEvdml2YW50ZS92aXZhbnRlLXN5bWJvbC1jaGVjayBiL3ZpdmFudGUvdml2YW50ZS1zeW1ib2wtY2hlY2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc3YmJhOQotLS0gL2Rldi9udWxsCisrKyBiL3ZpdmFudGUvdml2YW50ZS1zeW1ib2wtY2hlY2sKQEAgLTAsMCArMSwzMSBAQAorIyEvYmluL2Jhc2gKKworIyBUaGUgZm9sbG93aW5nIHN5bWJvbHMgKHBhc3QgdGhlIGZpcnN0IG5pbmUpIGFyZSB0YWtlbiBmcm9tIHZpdmFudGVfYm8uaC4KKworRlVOQ1M9JChubSAtRCAtLWZvcm1hdD1ic2QgLS1kZWZpbmVkLW9ubHkgJHsxLS5saWJzL2xpYmRybV92aXZhbnRlLnNvfSB8IGF3ayAne3ByaW50ICQzfSd8IHdoaWxlIHJlYWQgZnVuYzsgZG8KKyggZ3JlcCAtcSAiXiRmdW5jJCIgfHwgZWNobyAkZnVuYyApICA8PEVPRgorX19ic3NfZW5kX18KK19fYnNzX3N0YXJ0X18KK19fYnNzX3N0YXJ0CitfX2VuZF9fCitfYnNzX2VuZF9fCitfZWRhdGEKK19lbmQKK19maW5pCitfaW5pdAorZHJtX3ZpdmFudGVfYm9fY3JlYXRlCitkcm1fdml2YW50ZV9ib19jcmVhdGVfd2l0aF90cworZHJtX3ZpdmFudGVfYm9fZXhwb3J0X3RvX2ZkCitkcm1fdml2YW50ZV9ib19pbXBvcnRfZnJvbV9mZAorZHJtX3ZpdmFudGVfYm9fZGVzdHJveQorZHJtX3ZpdmFudGVfYm9fZ2V0X2hhbmRsZQorZHJtX3ZpdmFudGVfYm9fbW1hcAorZHJtX3ZpdmFudGVfYm9fbXVubWFwCitkcm1fdml2YW50ZV9ib19xdWVyeQorZHJtX3ZpdmFudGVfYm9fc2V0X3RpbGluZworZHJtX3ZpdmFudGVfYm9fZ2V0X3RpbGluZworZHJtX3ZpdmFudGVfYm9faW5jX3RpbWVzdGFtcAorZHJtX3ZpdmFudGVfYm9fZ2V0X3RpbWVzdGFtcAorZHJtX3ZpdmFudGVfYm9fcmVmX25vZGUKK0VPRgorZG9uZSkKZGlmZiAtLWdpdCBhL3ZpdmFudGUvdml2YW50ZV9iby5jIGIvdml2YW50ZS92aXZhbnRlX2JvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU5NGU0OAotLS0gL2Rldi9udWxsCisrKyBiL3ZpdmFudGUvdml2YW50ZV9iby5jCkBAIC0wLDAgKzEsNTY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICBDb3B5cmlnaHQgMjAxMiAtIDIwMTcgVml2YW50ZSBDb3Jwb3JhdGlvbiwgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworKiAgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyogICAgJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworKiAgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisqICAgIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyogICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0CisqICAgIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyoKKyogICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyogICAgbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyogICAgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorKgorKiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyogICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqICAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisqICAgIElOIE5PIEVWRU5UIFNIQUxMIFZJVkFOVEUgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyogICAgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyogICAgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyogICAgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisjaW5jbHVkZSA8eGY4NmRybS5oPgorCisjaW5jbHVkZSA8dml2YW50ZV9kcm0uaD4KKworI2luY2x1ZGUgInZpdmFudGVfYm8uaCIKKworc3RydWN0IGRybV92aXZhbnRlCit7CisgICAgLyogZHJpdmVyIGZkLiAqLworICAgIGludCBmZDsKKworICAgIHN0cnVjdCBkcm1fdml2YW50ZV9ibyAqYm9fbGlzdDsKKyAgICBwdGhyZWFkX211dGV4X3QgbXV0ZXg7Cit9OworCitzdHJ1Y3QgZHJtX3ZpdmFudGVfYm8KK3sKKyAgICBzdHJ1Y3QgZHJtX3ZpdmFudGUgKmRybTsKKworICAgIHVpbnQzMl90IGhhbmRsZTsKKworICAgIC8qIGV4cG9ydCBwcmltZSBmZCBpZiBhbnkgKi8KKyAgICBpbnQgZmQ7CisKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICB1aW50MzJfdCBzaXplOworCisgICAgdm9pZCAqdmFkZHI7CisKKyAgICBpbnQgcmVmY291bnQ7CisgICAgc3RydWN0IGRybV92aXZhbnRlX2JvICpuZXh0OworfTsKKworCitpbnQgZHJtX3ZpdmFudGVfY3JlYXRlKGludCBmZCwgc3RydWN0IGRybV92aXZhbnRlICoqZHJtcCkKK3sKKyAgICBpbnQgc3VwcG9ydGVkID0gMDsKKyAgICBkcm1WZXJzaW9uUHRyIHZlcnNpb247CisgICAgc3RydWN0IGRybV92aXZhbnRlICpkcm07CisKKyAgICB2ZXJzaW9uID0gZHJtR2V0VmVyc2lvbihmZCk7CisgICAgaWYgKCF2ZXJzaW9uKQorICAgICAgICByZXR1cm4gLUVOT01FTTsKKworICAgIGlmICghc3RybmNtcCh2ZXJzaW9uLT5uYW1lLCAidml2YW50ZSIsIHZlcnNpb24tPm5hbWVfbGVuKSkKKyAgICAgICAgc3VwcG9ydGVkID0gMTsKKworICAgIGRybUZyZWVWZXJzaW9uKHZlcnNpb24pOworCisgICAgaWYgKCFzdXBwb3J0ZWQpCisgICAgICAgIHJldHVybiAtRU5PVFNVUDsKKworICAgIGRybSA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGRybV92aXZhbnRlKSk7CisgICAgaWYgKCFkcm0pCisgICAgICAgIHJldHVybiAtRU5PTUVNOworCisgICAgZHJtLT5mZCA9IGZkOworICAgIGRybS0+Ym9fbGlzdCA9IE5VTEw7CisgICAgcHRocmVhZF9tdXRleF9pbml0KCZkcm0tPm11dGV4LCBOVUxMKTsKKworICAgICpkcm1wID0gZHJtOworICAgIHJldHVybiAwOworfQorCit2b2lkIGRybV92aXZhbnRlX2Nsb3NlKHN0cnVjdCBkcm1fdml2YW50ZSAqZHJtKQoreworICAgIGZyZWUoZHJtKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRybV92aXZhbnRlX2JvX2FkZF9sb2NrZWQoc3RydWN0IGRybV92aXZhbnRlICpkcm0sCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1fdml2YW50ZV9ibyAqYm8pCit7CisgICAgYm8tPnJlZmNvdW50ID0gMTsKKyAgICBiby0+bmV4dCA9IGRybS0+Ym9fbGlzdDsKKyAgICBkcm0tPmJvX2xpc3QgPSBibzsKK30KKworc3RhdGljIHZvaWQgZHJtX3ZpdmFudGVfYm9fYWRkKHN0cnVjdCBkcm1fdml2YW50ZSAqZHJtLAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX3ZpdmFudGVfYm8gKmJvKQoreworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZHJtLT5tdXRleCk7CisgICAgZHJtX3ZpdmFudGVfYm9fYWRkX2xvY2tlZChkcm0sIGJvKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZHJtLT5tdXRleCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX3ZpdmFudGVfYm8gKmRybV92aXZhbnRlX2JvX2xvb2t1cCgKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV92aXZhbnRlICpkcm0sIHVpbnQzMl90IGhhbmRsZSkKK3sKKyAgICBzdHJ1Y3QgZHJtX3ZpdmFudGVfYm8gKmJvOworICAgIGludCBlcnI7CisKKyAgICBmb3IgKGJvID0gZHJtLT5ib19saXN0OyBibyAhPSBOVUxMOyBibyA9IGJvLT5uZXh0KSB7CisgICAgICAgIGlmIChiby0+aGFuZGxlID09IGhhbmRsZSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYm8pCisgICAgICAgIGJvLT5yZWZjb3VudCsrOworICAgIHJldHVybiBibzsKK30KKworLyogcmV0dXJucyByZWZjb3VudC4gKi8KK3N0YXRpYyBpbnQgZHJtX3ZpdmFudGVfYm9fZGVjcmVmKHN0cnVjdCBkcm1fdml2YW50ZSAqZHJtLAorICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1fdml2YW50ZV9ibyAqYm8pCit7CisgICAgaW50IHJldDsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZHJtLT5tdXRleCk7CisgICAgcmV0ID0gLS1iby0+cmVmY291bnQ7CisKKyAgICBpZiAocmV0ID4gMCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAvKiB1bmxpbmsgYm8uICovCisgICAgaWYgKGJvID09IGRybS0+Ym9fbGlzdCkKKyAgICAgICAgZHJtLT5ib19saXN0ID0gYm8tPm5leHQ7CisgICAgZWxzZSB7CisgICAgICAgIHN0cnVjdCBkcm1fdml2YW50ZV9ibyAqcHJldiA9IE5VTEw7CisgICAgICAgIGZvciAocHJldiA9IGRybS0+Ym9fbGlzdDsgcHJldiAhPSBOVUxMOyBwcmV2ID0gcHJldi0+bmV4dCkgeworICAgICAgICAgICAgaWYgKHByZXYtPm5leHQgPT0gYm8pIHsKKyAgICAgICAgICAgICAgICBwcmV2LT5uZXh0ID0gYm8tPm5leHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK291dDoKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZHJtLT5tdXRleCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkcm1fdml2YW50ZV9ib19pbml0KHN0cnVjdCBkcm1fdml2YW50ZSAqZHJtLAorICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1fdml2YW50ZV9ibyAqKmJvcCkKK3sKKyAgICBzdHJ1Y3QgZHJtX3ZpdmFudGVfYm8gKmJvOworCisgICAgYm8gPSBjYWxsb2MoMSwgc2l6ZW9mKCpibykpOworICAgIGlmICghYm8pCisgICAgICAgIHJldHVybiAtRU5PTUVNOworCisgICAgYm8tPmRybSA9IGRybTsKKyAgICBiby0+ZmQgPSAtMTsKKyAgICBiby0+dmFkZHIgPSBOVUxMOworCisgICAgKmJvcCA9IGJvOworICAgIHJldHVybiAwOworfQorCitpbnQgZHJtX3ZpdmFudGVfYm9fY3JlYXRlKHN0cnVjdCBkcm1fdml2YW50ZSAqZHJtLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsIHVpbnQzMl90IHNpemUsIHN0cnVjdCBkcm1fdml2YW50ZV9ibyAqKmJvcCkKK3sKKyAgICBpbnQgZXJyID0gMDsKKyAgICBzdHJ1Y3QgZHJtX3ZpdmFudGVfYm8gKmJvOworICAgIHN0cnVjdCBkcm1fdml2X2dlbV9jcmVhdGUgYXJncyA9IHsKKyAgICAgICAgLmZsYWdzID0gZmxhZ3MsCisgICAgICAgIC5zaXplICA9IHNpemUKKyAgICB9OworCisgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoIWRybSB8fCAhYm9wKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGVyciA9IGRybV92aXZhbnRlX2JvX2luaXQoZHJtLCAmYm8pOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoZHJtSW9jdGwoZHJtLT5mZCwgRFJNX0lPQ1RMX1ZJVl9HRU1fQ1JFQVRFLCAmYXJncykpIHsKKyAgICAgICAgZnJlZShibyk7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorICAgIGJvLT5oYW5kbGUgPSBhcmdzLmhhbmRsZTsKKyAgICBiby0+ZmxhZ3MgPSBmbGFnczsKKyAgICBiby0+c2l6ZSA9IHNpemU7CisKKyAgICBkcm1fdml2YW50ZV9ib19hZGQoZHJtLCBibyk7CisgICAgKmJvcCA9IGJvOworICAgIHJldHVybiAwOworfQorCitpbnQgZHJtX3ZpdmFudGVfYm9fY3JlYXRlX3dpdGhfdHMoc3RydWN0IGRybV92aXZhbnRlICpkcm0sCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncywgdWludDMyX3Qgc2l6ZSwgc3RydWN0IGRybV92aXZhbnRlX2JvICoqYm9wKQoreworICAgIGludCBlcnIgPSAwOworICAgIHVpbnQzMl90IHRzX2hhbmRsZSA9IDA7CisgICAgc3RydWN0IGRybV92aXZhbnRlX2JvICpibzsKKyAgICBzdHJ1Y3QgZHJtX3Zpdl9nZW1fY3JlYXRlIGFyZ3MgPSB7CisgICAgICAgIC5mbGFncyA9IGZsYWdzLAorICAgICAgICAuc2l6ZSAgPSBzaXplCisgICAgfTsKKyAgICBzdHJ1Y3QgZHJtX2dlbV9jbG9zZSBjbG9zZV9hcmdzOworICAgIHN0cnVjdCBkcm1fdml2X2dlbV9hdHRhY2hfYXV4IGF1eF9hcmdzOworICAgIGNvbnN0IHVpbnQzMl90IHZhbGlkX3RzX2ZsYWdzID0gRFJNX1ZJVl9HRU1fQ09OVElHVU9VUyB8IERSTV9WSVZfR0VNX1NFQ1VSRTsKKworICAgIGlmIChzaXplID09IDApCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKCFkcm0gfHwgIWJvcCkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBlcnIgPSBkcm1fdml2YW50ZV9ib19pbml0KGRybSwgJmJvKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgaWYgKGRybUlvY3RsKGRybS0+ZmQsIERSTV9JT0NUTF9WSVZfR0VNX0NSRUFURSwgJmFyZ3MpKSB7CisgICAgICAgIGVyciA9IC1lcnJubzsKKyAgICAgICAgZ290byBlcnJfY2xvc2U7CisgICAgfQorICAgIGJvLT5oYW5kbGUgPSBhcmdzLmhhbmRsZTsKKworICAgIC8qIGFsbG9jIHRzIGhhbmRsZSwgc2l6ZSBpcyBtYXN0ZXIgYnVmZmVyIHNpemUgLyAyNTYsIGFsaWduIHVwIHRvIDY0Qi4gKi8KKyAgICBhcmdzLmZsYWdzID0gZmxhZ3MgJiB2YWxpZF90c19mbGFnczsKKyAgICBhcmdzLnNpemUgID0gKChzaXplID4+IDgpICsgMHgzZikgJiB+MHgzZjsKKyAgICBpZiAoZHJtSW9jdGwoZHJtLT5mZCwgRFJNX0lPQ1RMX1ZJVl9HRU1fQ1JFQVRFLCAmYXJncykpIHsKKyAgICAgICAgZXJyID0gLWVycm5vOworICAgICAgICBnb3RvIGVycl9jbG9zZTsKKyAgICB9CisgICAgdHNfaGFuZGxlID0gYXJncy5oYW5kbGU7CisKKyAgICAvKiByZWYgdHNfaGFuZGxlIGluIG1hc3RlciBoYW5kbGUuICovCisgICAgYXV4X2FyZ3MuaGFuZGxlID0gYm8tPmhhbmRsZTsKKyAgICBhdXhfYXJncy50c19oYW5kbGUgPSB0c19oYW5kbGU7CisgICAgaWYgKGRybUlvY3RsKGRybS0+ZmQsIERSTV9JT0NUTF9WSVZfR0VNX0FUVEFDSF9BVVgsICZhdXhfYXJncykpIHsKKyAgICAgICAgZXJyID0gLWVycm5vOworICAgICAgICBnb3RvIGVycl9jbG9zZTsKKyAgICB9CisKKyAgICAvKiBOb3cgdHMgd2FzIGF0dGFjaGVkIHRvIG1hc3RlciwgZGVzdHJveSBpdCBub3cuICovCisgICAgY2xvc2VfYXJncy5oYW5kbGUgPSB0c19oYW5kbGU7CisgICAgaWYgKGRybUlvY3RsKGRybS0+ZmQsIERSTV9JT0NUTF9HRU1fQ0xPU0UsICZjbG9zZV9hcmdzKSkgeworICAgICAgICBlcnIgPSAtZXJybm87CisgICAgICAgIGdvdG8gZXJyX2Nsb3NlOworICAgIH0KKyAgICB0c19oYW5kbGUgPSAwOworCisgICAgYm8tPmZsYWdzID0gZmxhZ3M7CisgICAgYm8tPnNpemUgPSBzaXplOworCisgICAgZHJtX3ZpdmFudGVfYm9fYWRkKGRybSwgYm8pOworICAgICpib3AgPSBibzsKKyAgICByZXR1cm4gMDsKKworZXJyX2Nsb3NlOgorICAgIGlmIChiby0+aGFuZGxlKSB7CisKKyAgICAgICAgaWYgKHRzX2hhbmRsZSkgeworICAgICAgICAgICAgY2xvc2VfYXJncy5oYW5kbGUgPSB0c19oYW5kbGU7CisgICAgICAgICAgICBkcm1Jb2N0bChkcm0tPmZkLCBEUk1fSU9DVExfR0VNX0NMT1NFLCAmY2xvc2VfYXJncyk7CisgICAgICAgIH0KKworICAgICAgICBjbG9zZV9hcmdzLmhhbmRsZSA9IGJvLT5oYW5kbGU7CisgICAgICAgIGRybUlvY3RsKGRybS0+ZmQsIERSTV9JT0NUTF9HRU1fQ0xPU0UsICZjbG9zZV9hcmdzKTsKKyAgICB9CisKKyAgICBmcmVlKGJvKTsKKyAgICByZXR1cm4gZXJyOworfQorCitpbnQgZHJtX3ZpdmFudGVfYm9fZXhwb3J0X3RvX2ZkKHN0cnVjdCBkcm1fdml2YW50ZV9ibyAqYm8sIGludCAqcGZkKQoreworICAgIGlmICghYm8gfHwgIXBmZCkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoYm8tPmZkIDwgMCkgeworICAgICAgICBpbnQgZmQ7CisgICAgICAgIGlmIChkcm1QcmltZUhhbmRsZVRvRkQoYm8tPmRybS0+ZmQsIGJvLT5oYW5kbGUsIE9fUkRXUiwgJmZkKSkKKyAgICAgICAgICAgIHJldHVybiAtZXJybm87CisgICAgICAgIGJvLT5mZCA9IGZkOworICAgIH0KKworICAgICpwZmQgPSBiby0+ZmQ7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1fdml2YW50ZV9ib19pbXBvcnRfZnJvbV9mZChzdHJ1Y3QgZHJtX3ZpdmFudGUgKmRybSwgaW50IGZkLAorICAgICAgICAgICAgc3RydWN0IGRybV92aXZhbnRlX2JvICoqYm9wKQoreworICAgIGludCBlcnI7CisgICAgdWludDY0X3Qgc2l6ZTsKKyAgICB1aW50MzJfdCBoYW5kbGUgPSAwOworICAgIHN0cnVjdCBkcm1fdml2YW50ZV9ibyAqYm8gPSBOVUxMOworCisgICAgaWYgKCFkcm0gfHwgIWJvcCB8fCBmZCA8IDApCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZkcm0tPm11dGV4KTsKKworICAgIGlmIChkcm1QcmltZUZEVG9IYW5kbGUoZHJtLT5mZCwgZmQsICZoYW5kbGUpKSB7CisgICAgICAgIGVyciA9IC1lcnJubzsKKyAgICAgICAgZ290byBlcnJfY2xvc2U7CisgICAgfQorCisgICAgYm8gPSBkcm1fdml2YW50ZV9ib19sb29rdXAoZHJtLCBoYW5kbGUpOworICAgIGlmIChibykgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZHJtLT5tdXRleCk7CisgICAgICAgICpib3AgPSBibzsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZXJyID0gZHJtX3ZpdmFudGVfYm9faW5pdChkcm0sICZibyk7CisgICAgaWYgKGVycikKKyAgICAgICAgZ290byBlcnJfY2xvc2U7CisgICAgYm8tPmhhbmRsZSA9IGhhbmRsZTsKKworICAgIGVyciA9IGRybV92aXZhbnRlX2JvX3F1ZXJ5KGJvLCBEUk1fVklWX0dFTV9QQVJBTV9TSVpFLCAmc2l6ZSk7CisgICAgaWYgKGVycikKKyAgICAgICAgZ290byBlcnJfY2xvc2U7CisgICAgYm8tPnNpemUgPSAodWludDMyX3Qpc2l6ZTsKKworICAgIGRybV92aXZhbnRlX2JvX2FkZF9sb2NrZWQoZHJtLCBibyk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmRybS0+bXV0ZXgpOworCisgICAgKmJvcCA9IGJvOworICAgIHJldHVybiAwOworCitlcnJfY2xvc2U6CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmRybS0+bXV0ZXgpOworCisgICAgaWYgKGhhbmRsZSA+IDApIHsKKyAgICAgICAgc3RydWN0IGRybV9nZW1fY2xvc2UgY2xvc2VfYXJncyA9IHsKKyAgICAgICAgICAgIC5oYW5kbGUgPSBoYW5kbGUsCisgICAgICAgIH07CisgICAgICAgIGRybUlvY3RsKGRybS0+ZmQsIERSTV9JT0NUTF9HRU1fQ0xPU0UsICZjbG9zZV9hcmdzKTsKKyAgICB9CisgICAgZnJlZShibyk7CisKKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIGRybV92aXZhbnRlX2JvX2Rlc3Ryb3koc3RydWN0IGRybV92aXZhbnRlX2JvICpibykKK3sKKyAgICBzdHJ1Y3QgZHJtX2dlbV9jbG9zZSBjbG9zZV9hcmdzOworCisgICAgaWYgKCFibykKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGRybV92aXZhbnRlX2JvX2RlY3JlZihiby0+ZHJtLCBibykgIT0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGJvLT52YWRkcikgeworICAgICAgICBkcm1fdml2YW50ZV9ib19tdW5tYXAoYm8pOworICAgIH0KKworICAgIGNsb3NlX2FyZ3MuaGFuZGxlID0gYm8tPmhhbmRsZTsKKyAgICBkcm1Jb2N0bChiby0+ZHJtLT5mZCwgRFJNX0lPQ1RMX0dFTV9DTE9TRSwgJmNsb3NlX2FyZ3MpOworCisgICAgZnJlZShibyk7Cit9CisKK2ludCBkcm1fdml2YW50ZV9ib19nZXRfaGFuZGxlKHN0cnVjdCBkcm1fdml2YW50ZV9ibyAqYm8sIHVpbnQzMl90ICpoYW5kbGUpCit7CisgICAgaWYgKCFibyB8fCAhaGFuZGxlKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICpoYW5kbGUgPSBiby0+aGFuZGxlOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNsZWFuX2JvX2NhY2hlKHN0cnVjdCBkcm1fdml2YW50ZV9ibyAqYm8pCit7CisgICAgc3RydWN0IGRybV92aXZfZ2VtX2NhY2hlIGFyZ3MgPSB7CisgICAgICAgIC5vcCA9IERSTV9WSVZfR0VNX0NMRUFOX0NBQ0hFLAorICAgICAgICAuaGFuZGxlID0gYm8tPmhhbmRsZSwKKyAgICAgICAgLmxvZ2ljYWwgPSAodWludDY0X3QpKHVpbnRwdHJfdCliby0+dmFkZHIsCisgICAgICAgIC5ieXRlcyA9IGJvLT5zaXplCisgICAgfTsKKworICAgIGlmIChkcm1Jb2N0bChiby0+ZHJtLT5mZCwgRFJNX0lPQ1RMX1ZJVl9HRU1fQ0FDSEUsICZhcmdzKSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgIHJldHVybiAwOworfQorCisKK2ludCBkcm1fdml2YW50ZV9ib19tbWFwKHN0cnVjdCBkcm1fdml2YW50ZV9ibyAqYm8sIHZvaWQgKip2YWRkcikKK3sKKyAgICBzdHJ1Y3QgZHJtX3Zpdl9nZW1fbG9jayBhcmdzOworCisgICAgaWYgKCFibyB8fCAhdmFkZHIpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgLyogYWxyZWFkeSBsb2NrZWQgKi8KKyAgICBpZiAoYm8tPnZhZGRyKQorICAgICAgICByZXR1cm4gLUVQRVJNOworICAgICAgICAKKyAgICBhcmdzLmhhbmRsZSA9IGJvLT5oYW5kbGU7CisgICAgYXJncy5jYWNoZWFibGUgPSAoYm8tPmZsYWdzICYgRFJNX1ZJVl9HRU1fQ0FDSEVEKSA/IDEgOiAwOworICAgIGlmIChkcm1Jb2N0bChiby0+ZHJtLT5mZCwgRFJNX0lPQ1RMX1ZJVl9HRU1fTE9DSywgJmFyZ3MpKQorICAgICAgICByZXR1cm4gLWVycm5vOworCisgICAgYm8tPnZhZGRyID0gKHZvaWQgKikodWludHB0cl90KWFyZ3MubG9naWNhbDsKKworICAgICp2YWRkciA9IGJvLT52YWRkcjsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGRybV92aXZhbnRlX2JvX211bm1hcChzdHJ1Y3QgZHJtX3ZpdmFudGVfYm8gKmJvKQoreworICAgIHN0cnVjdCBkcm1fdml2X2dlbV91bmxvY2sgYXJnczsKKworICAgIGlmICghYm8gfHwgIWJvLT52YWRkcikKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBhcmdzLmhhbmRsZSA9IGJvLT5oYW5kbGU7CisgICAgaWYgKGJvLT5mbGFncyAmIERSTV9WSVZfR0VNX0NBQ0hFRCkgeworICAgICAgICBpbnQgZXJyID0gY2xlYW5fYm9fY2FjaGUoYm8pOworICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoZHJtSW9jdGwoYm8tPmRybS0+ZmQsIERSTV9JT0NUTF9WSVZfR0VNX1VOTE9DSywgJmFyZ3MpKQorICAgICAgICByZXR1cm4gLWVycm5vOworCisgICAgYm8tPnZhZGRyID0gTlVMTDsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGRybV92aXZhbnRlX2JvX3F1ZXJ5KHN0cnVjdCBkcm1fdml2YW50ZV9ibyAqYm8sCisgICAgICAgICAgICB1aW50MzJfdCBwYXJhbSwgdWludDY0X3QgKnZhbHVlKQoreworICAgIHN0cnVjdCBkcm1fdml2X2dlbV9xdWVyeSBhcmdzID0geworICAgICAgICAucGFyYW0gPSBwYXJhbSwKKyAgICB9OworCisgICAgaWYgKCFibyB8fCAhdmFsdWUpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgYXJncy5oYW5kbGUgPSBiby0+aGFuZGxlOworICAgIGlmIChkcm1Jb2N0bChiby0+ZHJtLT5mZCwgRFJNX0lPQ1RMX1ZJVl9HRU1fUVVFUlksICZhcmdzKSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgICp2YWx1ZSA9IGFyZ3MudmFsdWU7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1fdml2YW50ZV9ib19zZXRfdGlsaW5nKHN0cnVjdCBkcm1fdml2YW50ZV9ibyAqYm8sCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZHJtX3ZpdmFudGVfYm9fdGlsaW5nICp0aWxpbmcpCit7CisgICAgc3RydWN0IGRybV92aXZfZ2VtX3NldF90aWxpbmcgYXJnczsKKworICAgIGlmICghYm8gfHwgIXRpbGluZykKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBhcmdzID0gKHN0cnVjdCBkcm1fdml2X2dlbV9zZXRfdGlsaW5nKSB7CisgICAgICAgIC5oYW5kbGUgPSBiby0+aGFuZGxlLAorICAgICAgICAudGlsaW5nX21vZGUgPSB0aWxpbmctPnRpbGluZ19tb2RlLAorICAgICAgICAudHNfbW9kZSA9IHRpbGluZy0+dHNfbW9kZSwKKyAgICAgICAgLmNsZWFyX3ZhbHVlID0gdGlsaW5nLT5jbGVhcl92YWx1ZSwKKyAgICB9OworCisgICAgaWYgKGRybUlvY3RsKGJvLT5kcm0tPmZkLCBEUk1fSU9DVExfVklWX0dFTV9TRVRfVElMSU5HLCAmYXJncykpCisgICAgICAgIHJldHVybiAtZXJybm87CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGRybV92aXZhbnRlX2JvX2dldF90aWxpbmcoc3RydWN0IGRybV92aXZhbnRlX2JvICpibywKKyAgICAgICAgICAgIHN0cnVjdCBkcm1fdml2YW50ZV9ib190aWxpbmcgKnRpbGluZykKK3sKKyAgICBzdHJ1Y3QgZHJtX3Zpdl9nZW1fZ2V0X3RpbGluZyBhcmdzOworCisgICAgaWYgKCFibyB8fCAhdGlsaW5nKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGFyZ3MuaGFuZGxlID0gYm8tPmhhbmRsZTsKKyAgICBpZiAoZHJtSW9jdGwoYm8tPmRybS0+ZmQsIERSTV9JT0NUTF9WSVZfR0VNX0dFVF9USUxJTkcsICZhcmdzKSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgIHRpbGluZy0+dGlsaW5nX21vZGUgPSBhcmdzLnRpbGluZ19tb2RlOworICAgIHRpbGluZy0+dHNfbW9kZSA9IGFyZ3MudHNfbW9kZTsKKyAgICB0aWxpbmctPmNsZWFyX3ZhbHVlID0gYXJncy5jbGVhcl92YWx1ZTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpbmNfYm9fdGltZXN0YW1wKHN0cnVjdCBkcm1fdml2YW50ZV9ibyAqYm8sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbmMsIHVpbnQ2NF90ICp0aW1lc3RhbXApCit7CisgICAgc3RydWN0IGRybV92aXZfZ2VtX3RpbWVzdGFtcCBhcmdzID0geworICAgICAgICAuaGFuZGxlID0gYm8tPmhhbmRsZSwKKyAgICAgICAgLmluYyA9IGluYywKKyAgICB9OworICAgIGlmIChkcm1Jb2N0bChiby0+ZHJtLT5mZCwgRFJNX0lPQ1RMX1ZJVl9HRU1fVElNRVNUQU1QLCAmYXJncykpCisgICAgICAgIHJldHVybiAtZXJybm87CisKKyAgICBpZiAodGltZXN0YW1wKQorICAgICAgICAqdGltZXN0YW1wID0gYXJncy50aW1lc3RhbXA7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1fdml2YW50ZV9ib19pbmNfdGltZXN0YW1wKHN0cnVjdCBkcm1fdml2YW50ZV9ibyAqYm8sCisgICAgICAgICAgICB1aW50NjRfdCAqdGltZXN0YW1wKQoreworICAgIGlmICghYm8pCisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIHJldHVybiBpbmNfYm9fdGltZXN0YW1wKGJvLCAxLCB0aW1lc3RhbXApOworfQorCitpbnQgZHJtX3ZpdmFudGVfYm9fZ2V0X3RpbWVzdGFtcChzdHJ1Y3QgZHJtX3ZpdmFudGVfYm8gKmJvLAorICAgICAgICAgICAgdWludDY0X3QgKnRpbWVzdGFtcCkKK3sKKyAgICBpZiAoIWJvIHx8ICF0aW1lc3RhbXApCisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIHJldHVybiBpbmNfYm9fdGltZXN0YW1wKGJvLCAwLCB0aW1lc3RhbXApOworfQorCitpbnQgZHJtX3ZpdmFudGVfYm9fcmVmX25vZGUoc3RydWN0IGRybV92aXZhbnRlX2JvICpibywKKyAgICAgICAgICAgIHVpbnQzMl90ICpub2RlLCB1aW50MzJfdCAqdHNfbm9kZSkKK3sKKyAgICBzdHJ1Y3QgZHJtX3Zpdl9nZW1fcmVmX25vZGUgYXJnczsKKworICAgIGlmICghYm8gfHwgIW5vZGUgfHwgIXRzX25vZGUpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgYXJncy5oYW5kbGUgPSBiby0+aGFuZGxlOworICAgIGlmIChkcm1Jb2N0bChiby0+ZHJtLT5mZCwgRFJNX0lPQ1RMX1ZJVl9HRU1fUkVGX05PREUsICZhcmdzKSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgICpub2RlID0gYXJncy5ub2RlOworICAgICp0c19ub2RlID0gYXJncy50c19ub2RlOworICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS92aXZhbnRlL3ZpdmFudGVfYm8uaCBiL3ZpdmFudGUvdml2YW50ZV9iby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNTRiYjQKLS0tIC9kZXYvbnVsbAorKysgYi92aXZhbnRlL3ZpdmFudGVfYm8uaApAQCAtMCwwICsxLDk1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICBDb3B5cmlnaHQgMjAxMiAtIDIwMTcgVml2YW50ZSBDb3Jwb3JhdGlvbiwgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEuCisqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworKiAgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyogICAgJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworKiAgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisqICAgIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyogICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0CisqICAgIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyoKKyogICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyogICAgbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyogICAgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorKgorKiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyogICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqICAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisqICAgIElOIE5PIEVWRU5UIFNIQUxMIFZJVkFOVEUgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyogICAgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyogICAgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyogICAgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fRFJNX1ZJVkFOVEVfSF9fCisjZGVmaW5lIF9fRFJNX1ZJVkFOVEVfSF9fCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx2aXZhbnRlX2RybS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBkcm1fdml2YW50ZV9ibzsKK3N0cnVjdCBkcm1fdml2YW50ZTsKKworc3RydWN0IGRybV92aXZhbnRlX2JvX3RpbGluZyB7CisgICAgdWludDMyX3QgdGlsaW5nX21vZGU7CisgICAgdWludDMyX3QgdHNfbW9kZTsKKyAgICB1aW50NjRfdCBjbGVhcl92YWx1ZTsKK307CisKKy8qIGNhbGxlciBvd25zIHRoZSBkcml2ZXIgZmQuICovCitpbnQgZHJtX3ZpdmFudGVfY3JlYXRlKGludCBmZCwgc3RydWN0IGRybV92aXZhbnRlICoqZHJtcCk7Cit2b2lkIGRybV92aXZhbnRlX2Nsb3NlKHN0cnVjdCBkcm1fdml2YW50ZSAqZHJtKTsKKworaW50IGRybV92aXZhbnRlX2JvX2NyZWF0ZShzdHJ1Y3QgZHJtX3ZpdmFudGUgKmRybSwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCBzaXplLCBzdHJ1Y3QgZHJtX3ZpdmFudGVfYm8gKipib3ApOworCisvKiBjcmVhdGUgYm8gd2l0aCBhdXhpbGxhcnkgdGlsZS1zdGF0dXMgYm8uICovCitpbnQgZHJtX3ZpdmFudGVfYm9fY3JlYXRlX3dpdGhfdHMoc3RydWN0IGRybV92aXZhbnRlICpkcm0sCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncywgdWludDMyX3Qgc2l6ZSwgc3RydWN0IGRybV92aXZhbnRlX2JvICoqYm9wKTsKKworLyogY2FsbGVyIG93bnMgdGhlIGZkLiAqLworaW50IGRybV92aXZhbnRlX2JvX2V4cG9ydF90b19mZChzdHJ1Y3QgZHJtX3ZpdmFudGVfYm8gKmJvLCBpbnQgKnBmZCk7CisvKiBjYWxsZXIgc3RpbGwgb3ducyB0aGUgZmQgdXBvbiByZXR1cm4uICovCitpbnQgZHJtX3ZpdmFudGVfYm9faW1wb3J0X2Zyb21fZmQoc3RydWN0IGRybV92aXZhbnRlICpkcm0sIGludCBmZCwKKyAgICAgICAgc3RydWN0IGRybV92aXZhbnRlX2JvICoqYm9wKTsKKwordm9pZCBkcm1fdml2YW50ZV9ib19kZXN0cm95KHN0cnVjdCBkcm1fdml2YW50ZV9ibyAqYm8pOworCisvKiBkbyBub3QgY2xvc2UgdGhlIGhhbmRsZSBkaXJlY3RseS4gKi8KK2ludCBkcm1fdml2YW50ZV9ib19nZXRfaGFuZGxlKHN0cnVjdCBkcm1fdml2YW50ZV9ibyAqYm8sIHVpbnQzMl90ICpoYW5kbGUpOworCitpbnQgZHJtX3ZpdmFudGVfYm9fbW1hcChzdHJ1Y3QgZHJtX3ZpdmFudGVfYm8gKmJvLCB2b2lkICoqdmFkZHIpOworaW50IGRybV92aXZhbnRlX2JvX211bm1hcChzdHJ1Y3QgZHJtX3ZpdmFudGVfYm8gKmJvKTsKKworaW50IGRybV92aXZhbnRlX2JvX3F1ZXJ5KHN0cnVjdCBkcm1fdml2YW50ZV9ibyAqYm8sCisgICAgICAgICAgICB1aW50MzJfdCBwYXJhbSwgdWludDY0X3QgKnZhbHVlKTsKKworaW50IGRybV92aXZhbnRlX2JvX3NldF90aWxpbmcoc3RydWN0IGRybV92aXZhbnRlX2JvICpibywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBkcm1fdml2YW50ZV9ib190aWxpbmcgKnRpbGluZyk7CitpbnQgZHJtX3ZpdmFudGVfYm9fZ2V0X3RpbGluZyhzdHJ1Y3QgZHJtX3ZpdmFudGVfYm8gKmJvLAorICAgICAgICAgICAgc3RydWN0IGRybV92aXZhbnRlX2JvX3RpbGluZyAqdGlsaW5nKTsKKworLyogb3V0cHV0IGluYydlZCB0aW1lc3RhbXAsIG9wdGlvbmFsLiAqLworaW50IGRybV92aXZhbnRlX2JvX2luY190aW1lc3RhbXAoc3RydWN0IGRybV92aXZhbnRlX2JvICpibywKKyAgICAgICAgICAgIHVpbnQ2NF90ICp0aW1lc3RhbXApOworaW50IGRybV92aXZhbnRlX2JvX2dldF90aW1lc3RhbXAoc3RydWN0IGRybV92aXZhbnRlX2JvICpibywKKyAgICAgICAgICAgIHVpbnQ2NF90ICp0aW1lc3RhbXApOworCitpbnQgZHJtX3ZpdmFudGVfYm9fcmVmX25vZGUoc3RydWN0IGRybV92aXZhbnRlX2JvICpibywKKyAgICAgICAgICAgIHVpbnQzMl90ICpub2RlLCB1aW50MzJfdCAqdHNfbm9kZSk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0RSTV9WSVZBTlRFX0hfXyAqLwpkaWZmIC0tZ2l0IGEveGY4NmF0b21pYy5oIGIveGY4NmF0b21pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMmIzN2QKLS0tIC9kZXYvbnVsbAorKysgYi94Zjg2YXRvbWljLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgQ2hyaXMgV2lsc29uIDxjaHJpc0BjaHJpcy13aWxzb24uY28udWs+CisgKgorICovCisKKy8qKgorICogQGZpbGUgeGY4NmF0b21pY3MuaAorICoKKyAqIFByaXZhdGUgZGVmaW5pdGlvbnMgZm9yIGF0b21pYyBvcGVyYXRpb25zCisgKi8KKworI2lmbmRlZiBMSUJEUk1fQVRPTUlDU19ICisjZGVmaW5lIExJQkRSTV9BVE9NSUNTX0gKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWYgSEFWRV9MSUJEUk1fQVRPTUlDX1BSSU1JVElWRVMKKworI2RlZmluZSBIQVNfQVRPTUlDX09QUyAxCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgYXRvbWljOworfSBhdG9taWNfdDsKKworIyBkZWZpbmUgYXRvbWljX3JlYWQoeCkgKCh4KS0+YXRvbWljKQorIyBkZWZpbmUgYXRvbWljX3NldCh4LCB2YWwpICgoeCktPmF0b21pYyA9ICh2YWwpKQorIyBkZWZpbmUgYXRvbWljX2luYyh4KSAoKHZvaWQpIF9fc3luY19mZXRjaF9hbmRfYWRkICgmKHgpLT5hdG9taWMsIDEpKQorIyBkZWZpbmUgYXRvbWljX2luY19yZXR1cm4oeCkgKF9fc3luY19hZGRfYW5kX2ZldGNoICgmKHgpLT5hdG9taWMsIDEpKQorIyBkZWZpbmUgYXRvbWljX2RlY19hbmRfdGVzdCh4KSAoX19zeW5jX2FkZF9hbmRfZmV0Y2ggKCYoeCktPmF0b21pYywgLTEpID09IDApCisjIGRlZmluZSBhdG9taWNfYWRkKHgsIHYpICgodm9pZCkgX19zeW5jX2FkZF9hbmRfZmV0Y2goJih4KS0+YXRvbWljLCAodikpKQorIyBkZWZpbmUgYXRvbWljX2RlYyh4LCB2KSAoKHZvaWQpIF9fc3luY19zdWJfYW5kX2ZldGNoKCYoeCktPmF0b21pYywgKHYpKSkKKyMgZGVmaW5lIGF0b21pY19jbXB4Y2hnKHgsIG9sZHYsIG5ld3YpIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCAoJih4KS0+YXRvbWljLCBvbGR2LCBuZXd2KQorCisjZW5kaWYKKworI2lmIEhBVkVfTElCX0FUT01JQ19PUFMKKyNpbmNsdWRlIDxhdG9taWNfb3BzLmg+CisKKyNkZWZpbmUgSEFTX0FUT01JQ19PUFMgMQorCit0eXBlZGVmIHN0cnVjdCB7CisJQU9fdCBhdG9taWM7Cit9IGF0b21pY190OworCisjIGRlZmluZSBhdG9taWNfcmVhZCh4KSBBT19sb2FkX2Z1bGwoJih4KS0+YXRvbWljKQorIyBkZWZpbmUgYXRvbWljX3NldCh4LCB2YWwpIEFPX3N0b3JlX2Z1bGwoJih4KS0+YXRvbWljLCAodmFsKSkKKyMgZGVmaW5lIGF0b21pY19pbmMoeCkgKCh2b2lkKSBBT19mZXRjaF9hbmRfYWRkMV9mdWxsKCYoeCktPmF0b21pYykpCisjIGRlZmluZSBhdG9taWNfaW5jX3JldHVybih4KSAoQU9fZmV0Y2hfYW5kX2FkZDFfZnVsbCgmKHgpLT5hdG9taWMpICsgMSkKKyMgZGVmaW5lIGF0b21pY19hZGQoeCwgdikgKCh2b2lkKSBBT19mZXRjaF9hbmRfYWRkX2Z1bGwoJih4KS0+YXRvbWljLCAodikpKQorIyBkZWZpbmUgYXRvbWljX2RlYyh4LCB2KSAoKHZvaWQpIEFPX2ZldGNoX2FuZF9hZGRfZnVsbCgmKHgpLT5hdG9taWMsIC0odikpKQorIyBkZWZpbmUgYXRvbWljX2RlY19hbmRfdGVzdCh4KSAoQU9fZmV0Y2hfYW5kX3N1YjFfZnVsbCgmKHgpLT5hdG9taWMpID09IDEpCisjIGRlZmluZSBhdG9taWNfY21weGNoZyh4LCBvbGR2LCBuZXd2KSBBT19jb21wYXJlX2FuZF9zd2FwX2Z1bGwoJih4KS0+YXRvbWljLCBvbGR2LCBuZXd2KQorCisjZW5kaWYKKworI2lmIChkZWZpbmVkKF9fc3VuKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pKSAmJiAhZGVmaW5lZChIQVNfQVRPTUlDX09QUykgIC8qIFNvbGFyaXMgJiBPcGVuU29sYXJpcyAmIE5ldEJTRCAqLworCisjaW5jbHVkZSA8c3lzL2F0b21pYy5oPgorI2RlZmluZSBIQVNfQVRPTUlDX09QUyAxCisKKyNpZiBkZWZpbmVkKF9fTmV0QlNEX18pCisjZGVmaW5lIExJQkRSTV9BVE9NSUNfVFlQRSBpbnQKKyNlbHNlCisjZGVmaW5lIExJQkRSTV9BVE9NSUNfVFlQRSB1aW50X3QKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7IExJQkRSTV9BVE9NSUNfVFlQRSBhdG9taWM7IH0gYXRvbWljX3Q7CisKKyMgZGVmaW5lIGF0b21pY19yZWFkKHgpIChpbnQpICgoeCktPmF0b21pYykKKyMgZGVmaW5lIGF0b21pY19zZXQoeCwgdmFsKSAoKHgpLT5hdG9taWMgPSAoTElCRFJNX0FUT01JQ19UWVBFKSh2YWwpKQorIyBkZWZpbmUgYXRvbWljX2luYyh4KSAoYXRvbWljX2luY191aW50ICgmKHgpLT5hdG9taWMpKQorIyBkZWZpbmUgYXRvbWljX2luY19yZXR1cm4oeCkgKGF0b21pY19pbmNfdWludF9udigmKHgpLT5hdG9taWMpKQorIyBkZWZpbmUgYXRvbWljX2RlY19hbmRfdGVzdCh4KSAoYXRvbWljX2RlY191aW50X252KCYoeCktPmF0b21pYykgPT0gMCkKKyMgZGVmaW5lIGF0b21pY19hZGQoeCwgdikgKGF0b21pY19hZGRfaW50KCYoeCktPmF0b21pYywgKHYpKSkKKyMgZGVmaW5lIGF0b21pY19kZWMoeCwgdikgKGF0b21pY19hZGRfaW50KCYoeCktPmF0b21pYywgLSh2KSkpCisjIGRlZmluZSBhdG9taWNfY21weGNoZyh4LCBvbGR2LCBuZXd2KSBhdG9taWNfY2FzX3VpbnQgKCYoeCktPmF0b21pYywgb2xkdiwgbmV3dikKKworI2VuZGlmCisKKyNpZiAhIEhBU19BVE9NSUNfT1BTCisjZXJyb3IgbGliZHJtIHJlcXVpcmVzIGF0b21pYyBvcGVyYXRpb25zLCBwbGVhc2UgZGVmaW5lIHRoZW0gZm9yIHlvdXIgQ1BVL2NvbXBpbGVyLgorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19hZGRfdW5sZXNzKGF0b21pY190ICp2LCBpbnQgYWRkLCBpbnQgdW5sZXNzKQoreworCWludCBjLCBvbGQ7CisJYyA9IGF0b21pY19yZWFkKHYpOworCXdoaWxlIChjICE9IHVubGVzcyAmJiAob2xkID0gYXRvbWljX2NtcHhjaGcodiwgYywgYyArIGFkZCkpICE9IGMpCisJCWMgPSBvbGQ7CisJcmV0dXJuIGMgPT0gdW5sZXNzOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3hmODZkcm0uYyBiL3hmODZkcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTMyNzE3Ci0tLSAvZGV2L251bGwKKysrIGIveGY4NmRybS5jCkBAIC0wLDAgKzEsNDI0OSBAQAorLyoqCisgKiBcZmlsZSB4Zjg2ZHJtLmMKKyAqIFVzZXItbGV2ZWwgaW50ZXJmYWNlIHRvIERSTSBkZXZpY2UKKyAqCisgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogXGF1dGhvciBLZXZpbiBFLiBNYXJ0aW4gPG1hcnRpbkB2YWxpbnV4LmNvbT4KKyAqLworCisvKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZGVmaW5lIHN0YXRfdCBzdHJ1Y3Qgc3RhdAorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaWZkZWYgTUFKT1JfSU5fTUtERVYKKyNpbmNsdWRlIDxzeXMvbWtkZXYuaD4KKyNlbmRpZgorI2lmZGVmIE1BSk9SX0lOX1NZU01BQ1JPUworI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG1hdGguaD4KKworLyogTm90IGFsbCBzeXN0ZW1zIGhhdmUgTUFQX0ZBSUxFRCBkZWZpbmVkICovCisjaWZuZGVmIE1BUF9GQUlMRUQKKyNkZWZpbmUgTUFQX0ZBSUxFRCAoKHZvaWQgKiktMSkKKyNlbmRpZgorCisjaW5jbHVkZSAieGY4NmRybS5oIgorI2luY2x1ZGUgImxpYmRybV9tYWNyb3MuaCIKKworI2luY2x1ZGUgInV0aWxfbWF0aC5oIgorCisjaWZkZWYgX19PcGVuQlNEX18KKyNkZWZpbmUgRFJNX1BSSU1BUllfTUlOT1JfTkFNRSAgImRybSIKKyNkZWZpbmUgRFJNX0NPTlRST0xfTUlOT1JfTkFNRSAgImRybUMiCisjZGVmaW5lIERSTV9SRU5ERVJfTUlOT1JfTkFNRSAgICJkcm1SIgorI2Vsc2UKKyNkZWZpbmUgRFJNX1BSSU1BUllfTUlOT1JfTkFNRSAgImNhcmQiCisjZGVmaW5lIERSTV9DT05UUk9MX01JTk9SX05BTUUgICJjb250cm9sRCIKKyNkZWZpbmUgRFJNX1JFTkRFUl9NSU5PUl9OQU1FICAgInJlbmRlckQiCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX2tlcm5lbF9fKSB8fCBkZWZpbmVkKF9fRHJhZ29uRmx5X18pCisjZGVmaW5lIERSTV9NQUpPUiAxNDUKKyNlbmRpZgorCisjaWZkZWYgX19OZXRCU0RfXworI2RlZmluZSBEUk1fTUFKT1IgMzQKKyNlbmRpZgorCisjaWZkZWYgX19PcGVuQlNEX18KKyNpZmRlZiBfX2kzODZfXworI2RlZmluZSBEUk1fTUFKT1IgODgKKyNlbHNlCisjZGVmaW5lIERSTV9NQUpPUiA4NworI2VuZGlmCisjZW5kaWYgLyogX19PcGVuQlNEX18gKi8KKworI2lmbmRlZiBEUk1fTUFKT1IKKyNkZWZpbmUgRFJNX01BSk9SIDIyNiAvKiBMaW51eCAqLworI2VuZGlmCisKKyNpZmRlZiBfX09wZW5CU0RfXworc3RydWN0IGRybV9wY2lpbmZvIHsKKwl1aW50MTZfdAlkb21haW47CisJdWludDhfdAkJYnVzOworCXVpbnQ4X3QJCWRldjsKKwl1aW50OF90CQlmdW5jOworCXVpbnQxNl90CXZlbmRvcl9pZDsKKwl1aW50MTZfdAlkZXZpY2VfaWQ7CisJdWludDE2X3QJc3VidmVuZG9yX2lkOworCXVpbnQxNl90CXN1YmRldmljZV9pZDsKKwl1aW50OF90CQlyZXZpc2lvbl9pZDsKK307CisKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9QQ0lJTkZPCURSTV9JT1IoMHgxNSwgc3RydWN0IGRybV9wY2lpbmZvKQorI2VuZGlmCisKKyNkZWZpbmUgRFJNX01TR19WRVJCT1NJVFkgMworCisjZGVmaW5lIG1lbWNsZWFyKHMpIG1lbXNldCgmcywgMCwgc2l6ZW9mKHMpKQorCitzdGF0aWMgZHJtU2VydmVySW5mb1B0ciBkcm1fc2VydmVyX2luZm87CisKK3ZvaWQgZHJtU2V0U2VydmVySW5mbyhkcm1TZXJ2ZXJJbmZvUHRyIGluZm8pCit7CisgICAgZHJtX3NlcnZlcl9pbmZvID0gaW5mbzsKK30KKworLyoqCisgKiBPdXRwdXQgYSBtZXNzYWdlIHRvIHN0ZGVyci4KKyAqCisgKiBccGFyYW0gZm9ybWF0IHByaW50ZigpIGxpa2UgZm9ybWF0IHN0cmluZy4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB2ZnByaW50ZigpLgorICovCisKK3N0YXRpYyBpbnQgRFJNX1BSSU5URkxJS0UoMSwgMCkKK2RybURlYnVnUHJpbnQoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQoreworICAgIHJldHVybiB2ZnByaW50ZihzdGRlcnIsIGZvcm1hdCwgYXApOworfQorCit2b2lkCitkcm1Nc2coY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcDsKKyAgICBjb25zdCBjaGFyICplbnY7CisgICAgaWYgKCgoZW52ID0gZ2V0ZW52KCJMSUJHTF9ERUJVRyIpKSAmJiBzdHJzdHIoZW52LCAidmVyYm9zZSIpKSB8fAorICAgICAgICAoZHJtX3NlcnZlcl9pbmZvICYmIGRybV9zZXJ2ZXJfaW5mby0+ZGVidWdfcHJpbnQpKQorICAgIHsKKyAgICAgICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgICAgICAgIGlmIChkcm1fc2VydmVyX2luZm8pIHsKKyAgICAgICAgICAgIGRybV9zZXJ2ZXJfaW5mby0+ZGVidWdfcHJpbnQoZm9ybWF0LGFwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRybURlYnVnUHJpbnQoZm9ybWF0LCBhcCk7CisgICAgICAgIH0KKyAgICAgICAgdmFfZW5kKGFwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkICpkcm1IYXNoVGFibGUgPSBOVUxMOyAvKiBDb250ZXh0IHN3aXRjaCBjYWxsYmFja3MgKi8KKwordm9pZCAqZHJtR2V0SGFzaFRhYmxlKHZvaWQpCit7CisgICAgcmV0dXJuIGRybUhhc2hUYWJsZTsKK30KKwordm9pZCAqZHJtTWFsbG9jKGludCBzaXplKQoreworICAgIHJldHVybiBjYWxsb2MoMSwgc2l6ZSk7Cit9CisKK3ZvaWQgZHJtRnJlZSh2b2lkICpwdCkKK3sKKyAgICBmcmVlKHB0KTsKK30KKworLyoqCisgKiBDYWxsIGlvY3RsLCByZXN0YXJ0aW5nIGlmIGl0IGlzIGludGVydXB0ZWQKKyAqLworaW50Citkcm1Jb2N0bChpbnQgZmQsIHVuc2lnbmVkIGxvbmcgcmVxdWVzdCwgdm9pZCAqYXJnKQoreworICAgIGludCByZXQ7CisKKyAgICBkbyB7CisgICAgICAgIHJldCA9IGlvY3RsKGZkLCByZXF1ZXN0LCBhcmcpOworICAgIH0gd2hpbGUgKHJldCA9PSAtMSAmJiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZHJtR2V0S2V5RnJvbUZkKGludCBmZCkKK3sKKyAgICBzdGF0X3QgICAgIHN0OworCisgICAgc3Quc3RfcmRldiA9IDA7CisgICAgZnN0YXQoZmQsICZzdCk7CisgICAgcmV0dXJuIHN0LnN0X3JkZXY7Cit9CisKK2RybUhhc2hFbnRyeSAqZHJtR2V0RW50cnkoaW50IGZkKQoreworICAgIHVuc2lnbmVkIGxvbmcga2V5ID0gZHJtR2V0S2V5RnJvbUZkKGZkKTsKKyAgICB2b2lkICAgICAgICAgICp2YWx1ZTsKKyAgICBkcm1IYXNoRW50cnkgICplbnRyeTsKKworICAgIGlmICghZHJtSGFzaFRhYmxlKQorICAgICAgICBkcm1IYXNoVGFibGUgPSBkcm1IYXNoQ3JlYXRlKCk7CisKKyAgICBpZiAoZHJtSGFzaExvb2t1cChkcm1IYXNoVGFibGUsIGtleSwgJnZhbHVlKSkgeworICAgICAgICBlbnRyeSAgICAgICAgICAgPSBkcm1NYWxsb2Moc2l6ZW9mKCplbnRyeSkpOworICAgICAgICBlbnRyeS0+ZmQgICAgICAgPSBmZDsKKyAgICAgICAgZW50cnktPmYgICAgICAgID0gTlVMTDsKKyAgICAgICAgZW50cnktPnRhZ1RhYmxlID0gZHJtSGFzaENyZWF0ZSgpOworICAgICAgICBkcm1IYXNoSW5zZXJ0KGRybUhhc2hUYWJsZSwga2V5LCBlbnRyeSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW50cnkgPSB2YWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIGVudHJ5OworfQorCisvKioKKyAqIENvbXBhcmUgdHdvIGJ1c2lkIHN0cmluZ3MKKyAqCisgKiBccGFyYW0gZmlyc3QKKyAqIFxwYXJhbSBzZWNvbmQKKyAqCisgKiBccmV0dXJuIDEgaWYgbWF0Y2hlZC4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gY29tcGFyZXMgdHdvIGJ1cyBJRCBzdHJpbmdzLiAgSXQgdW5kZXJzdGFuZHMgdGhlIG9sZGVyCisgKiBQQ0k6YjpkOmYgZm9ybWF0IGFuZCB0aGUgbmV3ZXIgcGNpOm9vb286YmI6ZGQuZiBmb3JtYXQuICBJbiB0aGUgZm9ybWF0LCBvIGlzCisgKiBkb21haW4sIGIgaXMgYnVzLCBkIGlzIGRldmljZSwgZiBpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCBkcm1NYXRjaEJ1c0lEKGNvbnN0IGNoYXIgKmlkMSwgY29uc3QgY2hhciAqaWQyLCBpbnQgcGNpX2RvbWFpbl9vaykKK3sKKyAgICAvKiBGaXJzdCwgY2hlY2sgaWYgdGhlIElEcyBhcmUgZXhhY3RseSB0aGUgc2FtZSAqLworICAgIGlmIChzdHJjYXNlY21wKGlkMSwgaWQyKSA9PSAwKQorICAgICAgICByZXR1cm4gMTsKKworICAgIC8qIFRyeSB0byBtYXRjaCBvbGQvbmV3LXN0eWxlIFBDSSBidXMgSURzLiAqLworICAgIGlmIChzdHJuY2FzZWNtcChpZDEsICJwY2kiLCAzKSA9PSAwKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBvMSwgYjEsIGQxLCBmMTsKKyAgICAgICAgdW5zaWduZWQgaW50IG8yLCBiMiwgZDIsIGYyOworICAgICAgICBpbnQgcmV0OworCisgICAgICAgIHJldCA9IHNzY2FuZihpZDEsICJwY2k6JTA0eDolMDJ4OiUwMnguJXUiLCAmbzEsICZiMSwgJmQxLCAmZjEpOworICAgICAgICBpZiAocmV0ICE9IDQpIHsKKyAgICAgICAgICAgIG8xID0gMDsKKyAgICAgICAgICAgIHJldCA9IHNzY2FuZihpZDEsICJQQ0k6JXU6JXU6JXUiLCAmYjEsICZkMSwgJmYxKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gMykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IHNzY2FuZihpZDIsICJwY2k6JTA0eDolMDJ4OiUwMnguJXUiLCAmbzIsICZiMiwgJmQyLCAmZjIpOworICAgICAgICBpZiAocmV0ICE9IDQpIHsKKyAgICAgICAgICAgIG8yID0gMDsKKyAgICAgICAgICAgIHJldCA9IHNzY2FuZihpZDIsICJQQ0k6JXU6JXU6JXUiLCAmYjIsICZkMiwgJmYyKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gMykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIGRvbWFpbnMgYXJlbid0IHByb3Blcmx5IHN1cHBvcnRlZCBieSB0aGUga2VybmVsIGludGVyZmFjZSwKKyAgICAgICAgICoganVzdCBpZ25vcmUgdGhlbSwgd2hpY2ggc3Vja3MgbGVzcyB0aGFuIHBpY2tpbmcgYSB0b3RhbGx5IHJhbmRvbQorICAgICAgICAgKiBjYXJkIHdpdGggIm9wZW4gYnkgbmFtZSIKKyAgICAgICAgICovCisgICAgICAgIGlmICghcGNpX2RvbWFpbl9vaykKKyAgICAgICAgICAgIG8xID0gbzIgPSAwOworCisgICAgICAgIGlmICgobzEgIT0gbzIpIHx8IChiMSAhPSBiMikgfHwgKGQxICE9IGQyKSB8fCAoZjEgIT0gZjIpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBIYW5kbGVzIGVycm9yIGNoZWNraW5nIGZvciBjaG93biBjYWxsLgorICoKKyAqIFxwYXJhbSBwYXRoIHRvIGZpbGUuCisgKiBccGFyYW0gaWQgb2YgdGhlIG5ldyBvd25lci4KKyAqIFxwYXJhbSBpZCBvZiB0aGUgbmV3IGdyb3VwLgorICoKKyAqIFxyZXR1cm4gemVybyBpZiBzdWNjZXNzIG9yIC0xIGlmIGZhaWx1cmUuCisgKgorICogXGludGVybmFsCisgKiBDaGVja3MgZm9yIGZhaWx1cmUuIElmIGZhaWx1cmUgd2FzIGNhdXNlZCBieSBzaWduYWwgY2FsbCBjaG93biBhZ2Fpbi4KKyAqIElmIGFueSBvdGhlciBmYWlsdXJlIGhhcHBlbmVkIHRoZW4gaXQgd2lsbCBvdXRwdXQgZXJyb3IgbWVzYWdlIHVzaW5nCisgKiBkcm1Nc2coKSBjYWxsLgorICovCisjaWYgIWRlZmluZWQoVURFVikKK3N0YXRpYyBpbnQgY2hvd25fY2hlY2tfcmV0dXJuKGNvbnN0IGNoYXIgKnBhdGgsIHVpZF90IG93bmVyLCBnaWRfdCBncm91cCkKK3sKKyAgICAgICAgaW50IHJ2OworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHJ2ID0gY2hvd24ocGF0aCwgb3duZXIsIGdyb3VwKTsKKyAgICAgICAgfSB3aGlsZSAocnYgIT0gMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgICAgICAgaWYgKHJ2ID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBkcm1Nc2coIkZhaWxlZCB0byBjaGFuZ2Ugb3duZXIgb3IgZ3JvdXAgZm9yIGZpbGUgJXMhICVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgIHBhdGgsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gLTE7Cit9CisjZW5kaWYKKworLyoqCisgKiBPcGVuIHRoZSBEUk0gZGV2aWNlLCBjcmVhdGluZyBpdCBpZiBuZWNlc3NhcnkuCisgKgorICogXHBhcmFtIGRldiBtYWpvciBhbmQgbWlub3IgbnVtYmVycyBvZiB0aGUgZGV2aWNlLgorICogXHBhcmFtIG1pbm9yIG1pbm9yIG51bWJlciBvZiB0aGUgZGV2aWNlLgorICoKKyAqIFxyZXR1cm4gYSBmaWxlIGRlc2NyaXB0b3Igb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIEFzc2VtYmxlcyB0aGUgZGV2aWNlIG5hbWUgZnJvbSBccCBtaW5vciBhbmQgb3BlbnMgaXQsIGNyZWF0aW5nIHRoZSBkZXZpY2UKKyAqIHNwZWNpYWwgZmlsZSBub2RlIHdpdGggdGhlIG1ham9yIGFuZCBtaW5vciBudW1iZXJzIHNwZWNpZmllZCBieSBccCBkZXYgYW5kCisgKiBwYXJlbnQgZGlyZWN0b3J5IGlmIG5lY2Vzc2FyeSBhbmQgd2FzIGNhbGxlZCBieSByb290LgorICovCitzdGF0aWMgaW50IGRybU9wZW5EZXZpY2UoZGV2X3QgZGV2LCBpbnQgbWlub3IsIGludCB0eXBlKQoreworICAgIHN0YXRfdCAgICAgICAgICBzdDsKKyAgICBjb25zdCBjaGFyICAgICAgKmRldl9uYW1lOworICAgIGNoYXIgICAgICAgICAgICBidWZbNjRdOworICAgIGludCAgICAgICAgICAgICBmZDsKKyAgICBtb2RlX3QgICAgICAgICAgZGV2bW9kZSA9IERSTV9ERVZfTU9ERSwgc2Vydl9tb2RlOworICAgIGdpZF90ICAgICAgICAgICBzZXJ2X2dyb3VwOworI2lmICFkZWZpbmVkKFVERVYpCisgICAgaW50ICAgICAgICAgICAgIGlzcm9vdCAgPSAhZ2V0ZXVpZCgpOworICAgIHVpZF90ICAgICAgICAgICB1c2VyICAgID0gRFJNX0RFVl9VSUQ7CisgICAgZ2lkX3QgICAgICAgICAgIGdyb3VwICAgPSBEUk1fREVWX0dJRDsKKyNlbmRpZgorCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBEUk1fTk9ERV9QUklNQVJZOgorICAgICAgICBkZXZfbmFtZSA9IERSTV9ERVZfTkFNRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEUk1fTk9ERV9DT05UUk9MOgorICAgICAgICBkZXZfbmFtZSA9IERSTV9DT05UUk9MX0RFVl9OQU1FOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSTV9OT0RFX1JFTkRFUjoKKyAgICAgICAgZGV2X25hbWUgPSBEUk1fUkVOREVSX0RFVl9OQU1FOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9OworCisgICAgc3ByaW50ZihidWYsIGRldl9uYW1lLCBEUk1fRElSX05BTUUsIG1pbm9yKTsKKyAgICBkcm1Nc2coImRybU9wZW5EZXZpY2U6IG5vZGUgbmFtZSBpcyAlc1xuIiwgYnVmKTsKKworICAgIGlmIChkcm1fc2VydmVyX2luZm8gJiYgZHJtX3NlcnZlcl9pbmZvLT5nZXRfcGVybXMpIHsKKyAgICAgICAgZHJtX3NlcnZlcl9pbmZvLT5nZXRfcGVybXMoJnNlcnZfZ3JvdXAsICZzZXJ2X21vZGUpOworICAgICAgICBkZXZtb2RlICA9IHNlcnZfbW9kZSA/IHNlcnZfbW9kZSA6IERSTV9ERVZfTU9ERTsKKyAgICAgICAgZGV2bW9kZSAmPSB+KFNfSVhVU1J8U19JWEdSUHxTX0lYT1RIKTsKKyAgICB9CisKKyNpZiAhZGVmaW5lZChVREVWKQorICAgIGlmIChzdGF0KERSTV9ESVJfTkFNRSwgJnN0KSkgeworICAgICAgICBpZiAoIWlzcm9vdCkKKyAgICAgICAgICAgIHJldHVybiBEUk1fRVJSX05PVF9ST09UOworICAgICAgICBta2RpcihEUk1fRElSX05BTUUsIERSTV9ERVZfRElSTU9ERSk7CisgICAgICAgIGNob3duX2NoZWNrX3JldHVybihEUk1fRElSX05BTUUsIDAsIDApOyAvKiByb290OnJvb3QgKi8KKyAgICAgICAgY2htb2QoRFJNX0RJUl9OQU1FLCBEUk1fREVWX0RJUk1PREUpOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIHRoZSBkZXZpY2Ugbm9kZSBleGlzdHMgYW5kIGNyZWF0ZSBpdCBpZiBuZWNlc3NhcnkuICovCisgICAgaWYgKHN0YXQoYnVmLCAmc3QpKSB7CisgICAgICAgIGlmICghaXNyb290KQorICAgICAgICAgICAgcmV0dXJuIERSTV9FUlJfTk9UX1JPT1Q7CisgICAgICAgIHJlbW92ZShidWYpOworICAgICAgICBta25vZChidWYsIFNfSUZDSFIgfCBkZXZtb2RlLCBkZXYpOworICAgIH0KKworICAgIGlmIChkcm1fc2VydmVyX2luZm8gJiYgZHJtX3NlcnZlcl9pbmZvLT5nZXRfcGVybXMpIHsKKyAgICAgICAgZ3JvdXAgPSAoKGludClzZXJ2X2dyb3VwID49IDApID8gc2Vydl9ncm91cCA6IERSTV9ERVZfR0lEOworICAgICAgICBjaG93bl9jaGVja19yZXR1cm4oYnVmLCB1c2VyLCBncm91cCk7CisgICAgICAgIGNobW9kKGJ1ZiwgZGV2bW9kZSk7CisgICAgfQorI2Vsc2UKKyAgICAvKiBpZiB3ZSBtb2Rwcm9iZWQgdGhlbiB3YWl0IGZvciB1ZGV2ICovCisgICAgeworICAgICAgICBpbnQgdWRldl9jb3VudCA9IDA7Cit3YWl0X2Zvcl91ZGV2OgorICAgICAgICBpZiAoc3RhdChEUk1fRElSX05BTUUsICZzdCkpIHsKKyAgICAgICAgICAgIHVzbGVlcCgyMCk7CisgICAgICAgICAgICB1ZGV2X2NvdW50Kys7CisKKyAgICAgICAgICAgIGlmICh1ZGV2X2NvdW50ID09IDUwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGdvdG8gd2FpdF9mb3JfdWRldjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0KGJ1ZiwgJnN0KSkgeworICAgICAgICAgICAgdXNsZWVwKDIwKTsKKyAgICAgICAgICAgIHVkZXZfY291bnQrKzsKKworICAgICAgICAgICAgaWYgKHVkZXZfY291bnQgPT0gNTApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgZ290byB3YWl0X2Zvcl91ZGV2OworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmZCA9IG9wZW4oYnVmLCBPX1JEV1IsIDApOworICAgIGRybU1zZygiZHJtT3BlbkRldmljZTogb3BlbiByZXN1bHQgaXMgJWQsICglcylcbiIsCisgICAgICAgICAgIGZkLCBmZCA8IDAgPyBzdHJlcnJvcihlcnJubykgOiAiT0siKTsKKyAgICBpZiAoZmQgPj0gMCkKKyAgICAgICAgcmV0dXJuIGZkOworCisjaWYgIWRlZmluZWQoVURFVikKKyAgICAvKiBDaGVjayBpZiB0aGUgZGV2aWNlIG5vZGUgaXMgbm90IHdoYXQgd2UgZXhwZWN0IGl0IHRvIGJlLCBhbmQgcmVjcmVhdGUgaXQKKyAgICAgKiBhbmQgdHJ5IGFnYWluIGlmIHNvLgorICAgICAqLworICAgIGlmIChzdC5zdF9yZGV2ICE9IGRldikgeworICAgICAgICBpZiAoIWlzcm9vdCkKKyAgICAgICAgICAgIHJldHVybiBEUk1fRVJSX05PVF9ST09UOworICAgICAgICByZW1vdmUoYnVmKTsKKyAgICAgICAgbWtub2QoYnVmLCBTX0lGQ0hSIHwgZGV2bW9kZSwgZGV2KTsKKyAgICAgICAgaWYgKGRybV9zZXJ2ZXJfaW5mbyAmJiBkcm1fc2VydmVyX2luZm8tPmdldF9wZXJtcykgeworICAgICAgICAgICAgY2hvd25fY2hlY2tfcmV0dXJuKGJ1ZiwgdXNlciwgZ3JvdXApOworICAgICAgICAgICAgY2htb2QoYnVmLCBkZXZtb2RlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmZCA9IG9wZW4oYnVmLCBPX1JEV1IsIDApOworICAgIGRybU1zZygiZHJtT3BlbkRldmljZTogb3BlbiByZXN1bHQgaXMgJWQsICglcylcbiIsCisgICAgICAgICAgIGZkLCBmZCA8IDAgPyBzdHJlcnJvcihlcnJubykgOiAiT0siKTsKKyAgICBpZiAoZmQgPj0gMCkKKyAgICAgICAgcmV0dXJuIGZkOworCisgICAgZHJtTXNnKCJkcm1PcGVuRGV2aWNlOiBPcGVuIGZhaWxlZFxuIik7CisgICAgcmVtb3ZlKGJ1Zik7CisjZW5kaWYKKyAgICByZXR1cm4gLWVycm5vOworfQorCisKKy8qKgorICogT3BlbiB0aGUgRFJNIGRldmljZQorICoKKyAqIFxwYXJhbSBtaW5vciBkZXZpY2UgbWlub3IgbnVtYmVyLgorICogXHBhcmFtIGNyZWF0ZSBhbGxvdyB0byBjcmVhdGUgdGhlIGRldmljZSBpZiBzZXQuCisgKgorICogXHJldHVybiBhIGZpbGUgZGVzY3JpcHRvciBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLgorICoKKyAqIFxpbnRlcm5hbAorICogQ2FsbHMgZHJtT3BlbkRldmljZSgpIGlmIFxwIGNyZWF0ZSBpcyBzZXQsIG90aGVyd2lzZSBhc3NlbWJsZXMgdGhlIGRldmljZQorICogbmFtZSBmcm9tIFxwIG1pbm9yIGFuZCBvcGVucyBpdC4KKyAqLworc3RhdGljIGludCBkcm1PcGVuTWlub3IoaW50IG1pbm9yLCBpbnQgY3JlYXRlLCBpbnQgdHlwZSkKK3sKKyAgICBpbnQgIGZkOworICAgIGNoYXIgYnVmWzY0XTsKKyAgICBjb25zdCBjaGFyICpkZXZfbmFtZTsKKworICAgIGlmIChjcmVhdGUpCisgICAgICAgIHJldHVybiBkcm1PcGVuRGV2aWNlKG1ha2VkZXYoRFJNX01BSk9SLCBtaW5vciksIG1pbm9yLCB0eXBlKTsKKworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRFJNX05PREVfUFJJTUFSWToKKyAgICAgICAgZGV2X25hbWUgPSBEUk1fREVWX05BTUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJNX05PREVfQ09OVFJPTDoKKyAgICAgICAgZGV2X25hbWUgPSBEUk1fQ09OVFJPTF9ERVZfTkFNRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEUk1fTk9ERV9SRU5ERVI6CisgICAgICAgIGRldl9uYW1lID0gRFJNX1JFTkRFUl9ERVZfTkFNRTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfTsKKworICAgIHNwcmludGYoYnVmLCBkZXZfbmFtZSwgRFJNX0RJUl9OQU1FLCBtaW5vcik7CisgICAgaWYgKChmZCA9IG9wZW4oYnVmLCBPX1JEV1IsIDApKSA+PSAwKQorICAgICAgICByZXR1cm4gZmQ7CisgICAgcmV0dXJuIC1lcnJubzsKK30KKworCisvKioKKyAqIERldGVybWluZSB3aGV0aGVyIHRoZSBEUk0ga2VybmVsIGRyaXZlciBoYXMgYmVlbiBsb2FkZWQuCisgKgorICogXHJldHVybiAxIGlmIHRoZSBEUk0gZHJpdmVyIGlzIGxvYWRlZCwgMCBvdGhlcndpc2UuCisgKgorICogXGludGVybmFsCisgKiBEZXRlcm1pbmUgdGhlIHByZXNlbmNlIG9mIHRoZSBrZXJuZWwgZHJpdmVyIGJ5IGF0dGVtcHRpbmcgdG8gb3BlbiB0aGUgMAorICogbWlub3IgYW5kIGdldCB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlcgorICogTGludXggaW1wbGVtZW50YXRpb25zLCAvcHJvYy9kcmkgaXMgYWxzbyBjaGVja2VkLgorICovCitpbnQgZHJtQXZhaWxhYmxlKHZvaWQpCit7CisgICAgZHJtVmVyc2lvblB0ciB2ZXJzaW9uOworICAgIGludCAgICAgICAgICAgcmV0dmFsID0gMDsKKyAgICBpbnQgICAgICAgICAgIGZkOworCisgICAgaWYgKChmZCA9IGRybU9wZW5NaW5vcigwLCAxLCBEUk1fTk9ERV9QUklNQVJZKSkgPCAwKSB7CisjaWZkZWYgX19saW51eF9fCisgICAgICAgIC8qIFRyeSBwcm9jIGZvciBiYWNrd2FyZCBMaW51eCBjb21wYXRpYmlsaXR5ICovCisgICAgICAgIGlmICghYWNjZXNzKCIvcHJvYy9kcmkvMCIsIFJfT0spKQorICAgICAgICAgICAgcmV0dXJuIDE7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCh2ZXJzaW9uID0gZHJtR2V0VmVyc2lvbihmZCkpKSB7CisgICAgICAgIHJldHZhbCA9IDE7CisgICAgICAgIGRybUZyZWVWZXJzaW9uKHZlcnNpb24pOworICAgIH0KKyAgICBjbG9zZShmZCk7CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGRybUdldE1pbm9yQmFzZShpbnQgdHlwZSkKK3sKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIERSTV9OT0RFX1BSSU1BUlk6CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgRFJNX05PREVfQ09OVFJPTDoKKyAgICAgICAgcmV0dXJuIDY0OworICAgIGNhc2UgRFJNX05PREVfUkVOREVSOgorICAgICAgICByZXR1cm4gMTI4OworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9OworfQorCitzdGF0aWMgaW50IGRybUdldE1pbm9yVHlwZShpbnQgbWlub3IpCit7CisgICAgaW50IHR5cGUgPSBtaW5vciA+PiA2OworCisgICAgaWYgKG1pbm9yIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBEUk1fTk9ERV9QUklNQVJZOgorICAgIGNhc2UgRFJNX05PREVfQ09OVFJPTDoKKyAgICBjYXNlIERSTV9OT0RFX1JFTkRFUjoKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmRybUdldE1pbm9yTmFtZShpbnQgdHlwZSkKK3sKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIERSTV9OT0RFX1BSSU1BUlk6CisgICAgICAgIHJldHVybiBEUk1fUFJJTUFSWV9NSU5PUl9OQU1FOworICAgIGNhc2UgRFJNX05PREVfQ09OVFJPTDoKKyAgICAgICAgcmV0dXJuIERSTV9DT05UUk9MX01JTk9SX05BTUU7CisgICAgY2FzZSBEUk1fTk9ERV9SRU5ERVI6CisgICAgICAgIHJldHVybiBEUk1fUkVOREVSX01JTk9SX05BTUU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCisvKioKKyAqIE9wZW4gdGhlIGRldmljZSBieSBidXMgSUQuCisgKgorICogXHBhcmFtIGJ1c2lkIGJ1cyBJRC4KKyAqIFxwYXJhbSB0eXBlIGRldmljZSBub2RlIHR5cGUuCisgKgorICogXHJldHVybiBhIGZpbGUgZGVzY3JpcHRvciBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLgorICoKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBvcGVuIGV2ZXJ5IHBvc3NpYmxlIG1pbm9yICh1cCB0byBEUk1fTUFYX01JTk9SKSwKKyAqIGNvbXBhcmluZyB0aGUgZGV2aWNlIGJ1cyBJRCB3aXRoIHRoZSBvbmUgc3VwcGxpZWQuCisgKgorICogXHNhIGRybU9wZW5NaW5vcigpIGFuZCBkcm1HZXRCdXNpZCgpLgorICovCitzdGF0aWMgaW50IGRybU9wZW5CeUJ1c2lkKGNvbnN0IGNoYXIgKmJ1c2lkLCBpbnQgdHlwZSkKK3sKKyAgICBpbnQgICAgICAgIGksIHBjaV9kb21haW5fb2sgPSAxOworICAgIGludCAgICAgICAgZmQ7CisgICAgY29uc3QgY2hhciAqYnVmOworICAgIGRybVNldFZlcnNpb24gc3Y7CisgICAgaW50ICAgICAgICBiYXNlID0gZHJtR2V0TWlub3JCYXNlKHR5cGUpOworCisgICAgaWYgKGJhc2UgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBkcm1Nc2coImRybU9wZW5CeUJ1c2lkOiBTZWFyY2hpbmcgZm9yIEJ1c0lEICVzXG4iLCBidXNpZCk7CisgICAgZm9yIChpID0gYmFzZTsgaSA8IGJhc2UgKyBEUk1fTUFYX01JTk9SOyBpKyspIHsKKyAgICAgICAgZmQgPSBkcm1PcGVuTWlub3IoaSwgMSwgdHlwZSk7CisgICAgICAgIGRybU1zZygiZHJtT3BlbkJ5QnVzaWQ6IGRybU9wZW5NaW5vciByZXR1cm5zICVkXG4iLCBmZCk7CisgICAgICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgICAgICAvKiBXZSBuZWVkIHRvIHRyeSBmb3IgMS40IGZpcnN0IGZvciBwcm9wZXIgUENJIGRvbWFpbiBzdXBwb3J0CisgICAgICAgICAgICAgKiBhbmQgaWYgdGhhdCBmYWlscywgd2Uga25vdyB0aGUga2VybmVsIGlzIGJ1c3RlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzdi5kcm1fZGlfbWFqb3IgPSAxOworICAgICAgICAgICAgc3YuZHJtX2RpX21pbm9yID0gNDsKKyAgICAgICAgICAgIHN2LmRybV9kZF9tYWpvciA9IC0xOyAgICAgICAgLyogRG9uJ3QgY2FyZSAqLworICAgICAgICAgICAgc3YuZHJtX2RkX21pbm9yID0gLTE7ICAgICAgICAvKiBEb24ndCBjYXJlICovCisgICAgICAgICAgICBpZiAoZHJtU2V0SW50ZXJmYWNlVmVyc2lvbihmZCwgJnN2KSkgeworI2lmbmRlZiBfX2FscGhhX18KKyAgICAgICAgICAgICAgICBwY2lfZG9tYWluX29rID0gMDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHN2LmRybV9kaV9tYWpvciA9IDE7CisgICAgICAgICAgICAgICAgc3YuZHJtX2RpX21pbm9yID0gMTsKKyAgICAgICAgICAgICAgICBzdi5kcm1fZGRfbWFqb3IgPSAtMTsgICAgICAgLyogRG9uJ3QgY2FyZSAqLworICAgICAgICAgICAgICAgIHN2LmRybV9kZF9taW5vciA9IC0xOyAgICAgICAvKiBEb24ndCBjYXJlICovCisgICAgICAgICAgICAgICAgZHJtTXNnKCJkcm1PcGVuQnlCdXNpZDogSW50ZXJmYWNlIDEuNCBmYWlsZWQsIHRyeWluZyAxLjFcbiIpOworICAgICAgICAgICAgICAgIGRybVNldEludGVyZmFjZVZlcnNpb24oZmQsICZzdik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYgPSBkcm1HZXRCdXNpZChmZCk7CisgICAgICAgICAgICBkcm1Nc2coImRybU9wZW5CeUJ1c2lkOiBkcm1HZXRCdXNpZCByZXBvcnRzICVzXG4iLCBidWYpOworICAgICAgICAgICAgaWYgKGJ1ZiAmJiBkcm1NYXRjaEJ1c0lEKGJ1ZiwgYnVzaWQsIHBjaV9kb21haW5fb2spKSB7CisgICAgICAgICAgICAgICAgZHJtRnJlZUJ1c2lkKGJ1Zik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJ1ZikKKyAgICAgICAgICAgICAgICBkcm1GcmVlQnVzaWQoYnVmKTsKKyAgICAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKKworLyoqCisgKiBPcGVuIHRoZSBkZXZpY2UgYnkgbmFtZS4KKyAqCisgKiBccGFyYW0gbmFtZSBkcml2ZXIgbmFtZS4KKyAqIFxwYXJhbSB0eXBlIHRoZSBkZXZpY2Ugbm9kZSB0eXBlLgorICoKKyAqIFxyZXR1cm4gYSBmaWxlIGRlc2NyaXB0b3Igb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIGZpcnN0IG1pbm9yIG51bWJlciB0aGF0IG1hdGNoZXMgdGhlIGRyaXZlciBuYW1lIGFuZAorICogaXNuJ3QgYWxyZWFkeSBpbiB1c2UuICBJZiBpdCdzIGluIHVzZSBpdCB0aGVuIGl0IHdpbGwgYWxyZWFkeSBoYXZlIGEgYnVzIElECisgKiBhc3NpZ25lZC4KKyAqCisgKiBcc2EgZHJtT3Blbk1pbm9yKCksIGRybUdldFZlcnNpb24oKSBhbmQgZHJtR2V0QnVzaWQoKS4KKyAqLworc3RhdGljIGludCBkcm1PcGVuQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGludCB0eXBlKQoreworICAgIGludCAgICAgICAgICAgaTsKKyAgICBpbnQgICAgICAgICAgIGZkOworICAgIGRybVZlcnNpb25QdHIgdmVyc2lvbjsKKyAgICBjaGFyICogICAgICAgIGlkOworICAgIGludCAgICAgICAgICAgYmFzZSA9IGRybUdldE1pbm9yQmFzZSh0eXBlKTsKKworICAgIGlmIChiYXNlIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyoKKyAgICAgKiBPcGVuIHRoZSBmaXJzdCBtaW5vciBudW1iZXIgdGhhdCBtYXRjaGVzIHRoZSBkcml2ZXIgbmFtZSBhbmQgaXNuJ3QKKyAgICAgKiBhbHJlYWR5IGluIHVzZS4gIElmIGl0J3MgaW4gdXNlIGl0IHdpbGwgaGF2ZSBhIGJ1c2lkIGFzc2lnbmVkIGFscmVhZHkuCisgICAgICovCisgICAgZm9yIChpID0gYmFzZTsgaSA8IGJhc2UgKyBEUk1fTUFYX01JTk9SOyBpKyspIHsKKyAgICAgICAgaWYgKChmZCA9IGRybU9wZW5NaW5vcihpLCAxLCB0eXBlKSkgPj0gMCkgeworICAgICAgICAgICAgaWYgKCh2ZXJzaW9uID0gZHJtR2V0VmVyc2lvbihmZCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAodmVyc2lvbi0+bmFtZSwgbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZHJtRnJlZVZlcnNpb24odmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgIGlkID0gZHJtR2V0QnVzaWQoZmQpOworICAgICAgICAgICAgICAgICAgICBkcm1Nc2coImRybUdldEJ1c2lkIHJldHVybmVkICclcydcbiIsIGlkID8gaWQgOiAiTlVMTCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWlkIHx8ICEqaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm1GcmVlQnVzaWQoaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZkOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZHJtRnJlZUJ1c2lkKGlkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRybUZyZWVWZXJzaW9uKHZlcnNpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgfQorICAgIH0KKworI2lmZGVmIF9fbGludXhfXworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGliaWxpdHkgL3Byb2Mgc3VwcG9ydCAqLworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgY2hhciBwcm9jX25hbWVbNjRdLCBidWZbNTEyXTsKKyAgICAgICAgY2hhciAqZHJpdmVyLCAqcHQsICpkZXZzdHJpbmc7CisgICAgICAgIGludCAgcmV0Y29kZTsKKworICAgICAgICBzcHJpbnRmKHByb2NfbmFtZSwgIi9wcm9jL2RyaS8lZC9uYW1lIiwgaSk7CisgICAgICAgIGlmICgoZmQgPSBvcGVuKHByb2NfbmFtZSwgMCwgMCkpID49IDApIHsKKyAgICAgICAgICAgIHJldGNvZGUgPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpLTEpOworICAgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICAgICAgaWYgKHJldGNvZGUpIHsKKyAgICAgICAgICAgICAgICBidWZbcmV0Y29kZS0xXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgZm9yIChkcml2ZXIgPSBwdCA9IGJ1ZjsgKnB0ICYmICpwdCAhPSAnICc7ICsrcHQpCisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICBpZiAoKnB0KSB7IC8qIERldmljZSBpcyBuZXh0ICovCisgICAgICAgICAgICAgICAgICAgICpwdCA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RyY21wKGRyaXZlciwgbmFtZSkpIHsgLyogTWF0Y2ggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZGV2c3RyaW5nID0gKytwdDsgKnB0ICYmICpwdCAhPSAnICc7ICsrcHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpwdCkgeyAvKiBGb3VuZCBidXNpZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkcm1PcGVuQnlCdXNpZCgrK3B0LCB0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8qIE5vIGJ1c2lkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRybU9wZW5EZXZpY2Uoc3RydG9sKGRldnN0cmluZywgTlVMTCwgMCksaSwgdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiAtMTsKK30KKworCisvKioKKyAqIE9wZW4gdGhlIERSTSBkZXZpY2UuCisgKgorICogTG9va3MgdXAgdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBidXMgSUQsIGFuZCBvcGVucyB0aGUgZGV2aWNlIGZvdW5kLiAgVGhlCisgKiBlbnRyeSBpbiAvZGV2L2RyaSBpcyBjcmVhdGVkIGlmIG5lY2Vzc2FyeSBhbmQgaWYgY2FsbGVkIGJ5IHJvb3QuCisgKgorICogXHBhcmFtIG5hbWUgZHJpdmVyIG5hbWUuIE5vdCByZWZlcmVuY2VkIGlmIGJ1cyBJRCBpcyBzdXBwbGllZC4KKyAqIFxwYXJhbSBidXNpZCBidXMgSUQuIFplcm8gaWYgbm90IGtub3duLgorICoKKyAqIFxyZXR1cm4gYSBmaWxlIGRlc2NyaXB0b3Igb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIEl0IGNhbGxzIGRybU9wZW5CeUJ1c2lkKCkgaWYgXHAgYnVzaWQgaXMgc3BlY2lmaWVkIG9yIGRybU9wZW5CeU5hbWUoKQorICogb3RoZXJ3aXNlLgorICovCitpbnQgZHJtT3Blbihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpidXNpZCkKK3sKKyAgICByZXR1cm4gZHJtT3BlbldpdGhUeXBlKG5hbWUsIGJ1c2lkLCBEUk1fTk9ERV9QUklNQVJZKTsKK30KKworLyoqCisgKiBPcGVuIHRoZSBEUk0gZGV2aWNlIHdpdGggc3BlY2lmaWVkIHR5cGUuCisgKgorICogTG9va3MgdXAgdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBidXMgSUQsIGFuZCBvcGVucyB0aGUgZGV2aWNlIGZvdW5kLiAgVGhlCisgKiBlbnRyeSBpbiAvZGV2L2RyaSBpcyBjcmVhdGVkIGlmIG5lY2Vzc2FyeSBhbmQgaWYgY2FsbGVkIGJ5IHJvb3QuCisgKgorICogXHBhcmFtIG5hbWUgZHJpdmVyIG5hbWUuIE5vdCByZWZlcmVuY2VkIGlmIGJ1cyBJRCBpcyBzdXBwbGllZC4KKyAqIFxwYXJhbSBidXNpZCBidXMgSUQuIFplcm8gaWYgbm90IGtub3duLgorICogXHBhcmFtIHR5cGUgdGhlIGRldmljZSBub2RlIHR5cGUgdG8gb3BlbiwgUFJJTUFSWSwgQ09OVFJPTCBvciBSRU5ERVIKKyAqCisgKiBccmV0dXJuIGEgZmlsZSBkZXNjcmlwdG9yIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuCisgKgorICogXGludGVybmFsCisgKiBJdCBjYWxscyBkcm1PcGVuQnlCdXNpZCgpIGlmIFxwIGJ1c2lkIGlzIHNwZWNpZmllZCBvciBkcm1PcGVuQnlOYW1lKCkKKyAqIG90aGVyd2lzZS4KKyAqLworaW50IGRybU9wZW5XaXRoVHlwZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpidXNpZCwgaW50IHR5cGUpCit7CisgICAgaWYgKCFkcm1BdmFpbGFibGUoKSAmJiBuYW1lICE9IE5VTEwgJiYgZHJtX3NlcnZlcl9pbmZvICYmCisgICAgICAgIGRybV9zZXJ2ZXJfaW5mby0+bG9hZF9tb2R1bGUpIHsKKyAgICAgICAgLyogdHJ5IHRvIGxvYWQgdGhlIGtlcm5lbCBtb2R1bGUgKi8KKyAgICAgICAgaWYgKCFkcm1fc2VydmVyX2luZm8tPmxvYWRfbW9kdWxlKG5hbWUpKSB7CisgICAgICAgICAgICBkcm1Nc2coIltkcm1dIGZhaWxlZCB0byBsb2FkIGtlcm5lbCBtb2R1bGUgXCIlc1wiXG4iLCBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChidXNpZCkgeworICAgICAgICBpbnQgZmQgPSBkcm1PcGVuQnlCdXNpZChidXNpZCwgdHlwZSk7CisgICAgICAgIGlmIChmZCA+PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZkOworICAgIH0KKworICAgIGlmIChuYW1lKQorICAgICAgICByZXR1cm4gZHJtT3BlbkJ5TmFtZShuYW1lLCB0eXBlKTsKKworICAgIHJldHVybiAtMTsKK30KKworaW50IGRybU9wZW5Db250cm9sKGludCBtaW5vcikKK3sKKyAgICByZXR1cm4gZHJtT3Blbk1pbm9yKG1pbm9yLCAwLCBEUk1fTk9ERV9DT05UUk9MKTsKK30KKworaW50IGRybU9wZW5SZW5kZXIoaW50IG1pbm9yKQoreworICAgIHJldHVybiBkcm1PcGVuTWlub3IobWlub3IsIDAsIERSTV9OT0RFX1JFTkRFUik7Cit9CisKKy8qKgorICogRnJlZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBkcm1HZXRWZXJzaW9uKCkuCisgKgorICogXHBhcmFtIHYgcG9pbnRlciB0byB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIEl0IGZyZWVzIHRoZSBtZW1vcnkgcG9pbnRlZCBieSBccCAldiBhcyB3ZWxsIGFzIGFsbCB0aGUgbm9uLW51bGwgc3RyaW5ncworICogcG9pbnRlcnMgaW4gaXQuCisgKi8KK3ZvaWQgZHJtRnJlZVZlcnNpb24oZHJtVmVyc2lvblB0ciB2KQoreworICAgIGlmICghdikKKyAgICAgICAgcmV0dXJuOworICAgIGRybUZyZWUodi0+bmFtZSk7CisgICAgZHJtRnJlZSh2LT5kYXRlKTsKKyAgICBkcm1GcmVlKHYtPmRlc2MpOworICAgIGRybUZyZWUodik7Cit9CisKKworLyoqCisgKiBGcmVlIHRoZSBub24tcHVibGljIHZlcnNpb24gaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgdGhlIGtlcm5lbC4KKyAqCisgKiBccGFyYW0gdiBwb2ludGVyIHRvIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uLgorICoKKyAqIFxpbnRlcm5hbAorICogVXNlZCBieSBkcm1HZXRWZXJzaW9uKCkgdG8gZnJlZSB0aGUgbWVtb3J5IHBvaW50ZWQgYnkgXHAgJXYgYXMgd2VsbCBhcyBhbGwKKyAqIHRoZSBub24tbnVsbCBzdHJpbmdzIHBvaW50ZXJzIGluIGl0LgorICovCitzdGF0aWMgdm9pZCBkcm1GcmVlS2VybmVsVmVyc2lvbihkcm1fdmVyc2lvbl90ICp2KQoreworICAgIGlmICghdikKKyAgICAgICAgcmV0dXJuOworICAgIGRybUZyZWUodi0+bmFtZSk7CisgICAgZHJtRnJlZSh2LT5kYXRlKTsKKyAgICBkcm1GcmVlKHYtPmRlc2MpOworICAgIGRybUZyZWUodik7Cit9CisKKworLyoqCisgKiBDb3B5IHZlcnNpb24gaW5mb3JtYXRpb24uCisgKgorICogXHBhcmFtIGQgZGVzdGluYXRpb24gcG9pbnRlci4KKyAqIFxwYXJhbSBzIHNvdXJjZSBwb2ludGVyLgorICoKKyAqIFxpbnRlcm5hbAorICogVXNlZCBieSBkcm1HZXRWZXJzaW9uKCkgdG8gdHJhbnNsYXRlIHRoZSBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSB0aGUgaW9jdGwKKyAqIGludGVyZmFjZSBpbiBhIHByaXZhdGUgc3RydWN0dXJlIGludG8gdGhlIHB1YmxpYyBzdHJ1Y3R1cmUgY291bnRlcnBhcnQuCisgKi8KK3N0YXRpYyB2b2lkIGRybUNvcHlWZXJzaW9uKGRybVZlcnNpb25QdHIgZCwgY29uc3QgZHJtX3ZlcnNpb25fdCAqcykKK3sKKyAgICBkLT52ZXJzaW9uX21ham9yICAgICAgPSBzLT52ZXJzaW9uX21ham9yOworICAgIGQtPnZlcnNpb25fbWlub3IgICAgICA9IHMtPnZlcnNpb25fbWlub3I7CisgICAgZC0+dmVyc2lvbl9wYXRjaGxldmVsID0gcy0+dmVyc2lvbl9wYXRjaGxldmVsOworICAgIGQtPm5hbWVfbGVuICAgICAgICAgICA9IHMtPm5hbWVfbGVuOworICAgIGQtPm5hbWUgICAgICAgICAgICAgICA9IHN0cmR1cChzLT5uYW1lKTsKKyAgICBkLT5kYXRlX2xlbiAgICAgICAgICAgPSBzLT5kYXRlX2xlbjsKKyAgICBkLT5kYXRlICAgICAgICAgICAgICAgPSBzdHJkdXAocy0+ZGF0ZSk7CisgICAgZC0+ZGVzY19sZW4gICAgICAgICAgID0gcy0+ZGVzY19sZW47CisgICAgZC0+ZGVzYyAgICAgICAgICAgICAgID0gc3RyZHVwKHMtPmRlc2MpOworfQorCisKKy8qKgorICogUXVlcnkgdGhlIGRyaXZlciB2ZXJzaW9uIGluZm9ybWF0aW9uLgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogXHJldHVybiBwb2ludGVyIHRvIGEgZHJtVmVyc2lvbiBzdHJ1Y3R1cmUgd2hpY2ggc2hvdWxkIGJlIGZyZWVkIHdpdGgKKyAqIGRybUZyZWVWZXJzaW9uKCkuCisgKgorICogXG5vdGUgU2ltaWxhciBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgdmlhIC9wcm9jL2RyaS4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIEl0IGdldHMgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gdmlhIHN1Y2Nlc3NpdmUgRFJNX0lPQ1RMX1ZFUlNJT04gaW9jdGxzLAorICogZmlyc3Qgd2l0aCB6ZXJvcyB0byBnZXQgdGhlIHN0cmluZyBsZW5ndGhzLCBhbmQgdGhlbiB0aGUgYWN0dWFsbHkgc3RyaW5ncy4KKyAqIEl0IGFsc28gbnVsbC10ZXJtaW5hdGVzIHRoZW0gc2luY2UgdGhleSBtaWdodCBub3QgYmUgYWxyZWFkeS4KKyAqLworZHJtVmVyc2lvblB0ciBkcm1HZXRWZXJzaW9uKGludCBmZCkKK3sKKyAgICBkcm1WZXJzaW9uUHRyIHJldHZhbDsKKyAgICBkcm1fdmVyc2lvbl90ICp2ZXJzaW9uID0gZHJtTWFsbG9jKHNpemVvZigqdmVyc2lvbikpOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfVkVSU0lPTiwgdmVyc2lvbikpIHsKKyAgICAgICAgZHJtRnJlZUtlcm5lbFZlcnNpb24odmVyc2lvbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICh2ZXJzaW9uLT5uYW1lX2xlbikKKyAgICAgICAgdmVyc2lvbi0+bmFtZSAgICA9IGRybU1hbGxvYyh2ZXJzaW9uLT5uYW1lX2xlbiArIDEpOworICAgIGlmICh2ZXJzaW9uLT5kYXRlX2xlbikKKyAgICAgICAgdmVyc2lvbi0+ZGF0ZSAgICA9IGRybU1hbGxvYyh2ZXJzaW9uLT5kYXRlX2xlbiArIDEpOworICAgIGlmICh2ZXJzaW9uLT5kZXNjX2xlbikKKyAgICAgICAgdmVyc2lvbi0+ZGVzYyAgICA9IGRybU1hbGxvYyh2ZXJzaW9uLT5kZXNjX2xlbiArIDEpOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfVkVSU0lPTiwgdmVyc2lvbikpIHsKKyAgICAgICAgZHJtTXNnKCJEUk1fSU9DVExfVkVSU0lPTjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGRybUZyZWVLZXJuZWxWZXJzaW9uKHZlcnNpb24pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBUaGUgcmVzdWx0cyBtaWdodCBub3QgYmUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZ3MsIHNvIHRlcm1pbmF0ZSB0aGVtLiAqLworICAgIGlmICh2ZXJzaW9uLT5uYW1lX2xlbikgdmVyc2lvbi0+bmFtZVt2ZXJzaW9uLT5uYW1lX2xlbl0gPSAnXDAnOworICAgIGlmICh2ZXJzaW9uLT5kYXRlX2xlbikgdmVyc2lvbi0+ZGF0ZVt2ZXJzaW9uLT5kYXRlX2xlbl0gPSAnXDAnOworICAgIGlmICh2ZXJzaW9uLT5kZXNjX2xlbikgdmVyc2lvbi0+ZGVzY1t2ZXJzaW9uLT5kZXNjX2xlbl0gPSAnXDAnOworCisgICAgcmV0dmFsID0gZHJtTWFsbG9jKHNpemVvZigqcmV0dmFsKSk7CisgICAgZHJtQ29weVZlcnNpb24ocmV0dmFsLCB2ZXJzaW9uKTsKKyAgICBkcm1GcmVlS2VybmVsVmVyc2lvbih2ZXJzaW9uKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisKKy8qKgorICogR2V0IHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBEUk0gdXNlciBzcGFjZSBsaWJyYXJ5LgorICoKKyAqIFRoaXMgdmVyc2lvbiBudW1iZXIgaXMgZHJpdmVyIGluZGVwZW5kZW50LgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogXHJldHVybiB2ZXJzaW9uIGluZm9ybWF0aW9uLgorICoKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYW5kIGZpbGxzIGEgZHJtX3ZlcnNpb24gc3RydWN0dXJlIHdpdGggYSBoYXJkIGNvZGVkCisgKiB2ZXJzaW9uIG51bWJlci4KKyAqLworZHJtVmVyc2lvblB0ciBkcm1HZXRMaWJWZXJzaW9uKGludCBmZCkKK3sKKyAgICBkcm1fdmVyc2lvbl90ICp2ZXJzaW9uID0gZHJtTWFsbG9jKHNpemVvZigqdmVyc2lvbikpOworCisgICAgLyogVmVyc2lvbiBoaXN0b3J5OgorICAgICAqICAgTk9URSBUSElTIE1VU1QgTk9UIEdPIEFCT1ZFIFZFUlNJT04gMS5YIGR1ZSB0byBkcml2ZXJzIG5lZWRpbmcgaXQKKyAgICAgKiAgIHJldmlzaW9uIDEuMC54ID0gb3JpZ2luYWwgRFJNIGludGVyZmFjZSB3aXRoIG5vIGRybUdldExpYlZlcnNpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgZW50cnkgcG9pbnQgYW5kIG1hbnkgZHJtPERldmljZT4gZXh0ZW5zaW9ucworICAgICAqICAgcmV2aXNpb24gMS4xLnggPSBhZGRlZCBkcm1Db21tYW5kIGVudHJ5IHBvaW50cyBmb3IgZGV2aWNlIGV4dGVuc2lvbnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgYWRkZWQgZHJtR2V0TGliVmVyc2lvbiB0byBpZGVudGlmeSBsaWJkcm0uYSB2ZXJzaW9uCisgICAgICogICByZXZpc2lvbiAxLjIueCA9IGFkZGVkIGRybVNldEludGVyZmFjZVZlcnNpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgZHJtT3BlbiB0byBoYW5kbGUgYm90aCBidXNpZCBhbmQgbmFtZQorICAgICAqICAgcmV2aXNpb24gMS4zLnggPSBhZGRlZCBzZXJ2ZXIgKyBtZW1vcnkgbWFuYWdlcgorICAgICAqLworICAgIHZlcnNpb24tPnZlcnNpb25fbWFqb3IgICAgICA9IDE7CisgICAgdmVyc2lvbi0+dmVyc2lvbl9taW5vciAgICAgID0gMzsKKyAgICB2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSAwOworCisgICAgcmV0dXJuIChkcm1WZXJzaW9uUHRyKXZlcnNpb247Cit9CisKK2ludCBkcm1HZXRDYXAoaW50IGZkLCB1aW50NjRfdCBjYXBhYmlsaXR5LCB1aW50NjRfdCAqdmFsdWUpCit7CisgICAgc3RydWN0IGRybV9nZXRfY2FwIGNhcDsKKyAgICBpbnQgcmV0OworCisgICAgbWVtY2xlYXIoY2FwKTsKKyAgICBjYXAuY2FwYWJpbGl0eSA9IGNhcGFiaWxpdHk7CisKKyAgICByZXQgPSBkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0dFVF9DQVAsICZjYXApOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAqdmFsdWUgPSBjYXAudmFsdWU7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1TZXRDbGllbnRDYXAoaW50IGZkLCB1aW50NjRfdCBjYXBhYmlsaXR5LCB1aW50NjRfdCB2YWx1ZSkKK3sKKyAgICBzdHJ1Y3QgZHJtX3NldF9jbGllbnRfY2FwIGNhcDsKKworICAgIG1lbWNsZWFyKGNhcCk7CisgICAgY2FwLmNhcGFiaWxpdHkgPSBjYXBhYmlsaXR5OworICAgIGNhcC52YWx1ZSA9IHZhbHVlOworCisgICAgcmV0dXJuIGRybUlvY3RsKGZkLCBEUk1fSU9DVExfU0VUX0NMSUVOVF9DQVAsICZjYXApOworfQorCisvKioKKyAqIEZyZWUgdGhlIGJ1cyBJRCBpbmZvcm1hdGlvbi4KKyAqCisgKiBccGFyYW0gYnVzaWQgYnVzIElEIGluZm9ybWF0aW9uIHN0cmluZyBhcyBnaXZlbiBieSBkcm1HZXRCdXNpZCgpLgorICoKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBqdXN0IGZyZWVzIHRoZSBtZW1vcnkgcG9pbnRlZCBieSBccCBidXNpZC4KKyAqLwordm9pZCBkcm1GcmVlQnVzaWQoY29uc3QgY2hhciAqYnVzaWQpCit7CisgICAgZHJtRnJlZSgodm9pZCAqKWJ1c2lkKTsKK30KKworCisvKioKKyAqIEdldCB0aGUgYnVzIElEIG9mIHRoZSBkZXZpY2UuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBccmV0dXJuIGJ1cyBJRCBzdHJpbmcuCisgKgorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGJ1cyBJRCB2aWEgc3VjY2Vzc2l2ZSBEUk1fSU9DVExfR0VUX1VOSVFVRSBpb2N0bHMgdG8KKyAqIGdldCB0aGUgc3RyaW5nIGxlbmd0aCBhbmQgZGF0YSwgcGFzc2luZyB0aGUgYXJndW1lbnRzIGluIGEgZHJtX3VuaXF1ZQorICogc3RydWN0dXJlLgorICovCitjaGFyICpkcm1HZXRCdXNpZChpbnQgZmQpCit7CisgICAgZHJtX3VuaXF1ZV90IHU7CisKKyAgICBtZW1jbGVhcih1KTsKKworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0dFVF9VTklRVUUsICZ1KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdS51bmlxdWUgPSBkcm1NYWxsb2ModS51bmlxdWVfbGVuICsgMSk7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfR0VUX1VOSVFVRSwgJnUpKSB7CisgICAgICAgIGRybUZyZWUodS51bmlxdWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdS51bmlxdWVbdS51bmlxdWVfbGVuXSA9ICdcMCc7CisKKyAgICByZXR1cm4gdS51bmlxdWU7Cit9CisKKworLyoqCisgKiBTZXQgdGhlIGJ1cyBJRCBvZiB0aGUgZGV2aWNlLgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKiBccGFyYW0gYnVzaWQgYnVzIElEIHN0cmluZy4KKyAqCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZS4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRFJNX0lPQ1RMX1NFVF9VTklRVUUgaW9jdGwsIHBhc3NpbmcKKyAqIHRoZSBhcmd1bWVudHMgaW4gYSBkcm1fdW5pcXVlIHN0cnVjdHVyZS4KKyAqLworaW50IGRybVNldEJ1c2lkKGludCBmZCwgY29uc3QgY2hhciAqYnVzaWQpCit7CisgICAgZHJtX3VuaXF1ZV90IHU7CisKKyAgICBtZW1jbGVhcih1KTsKKyAgICB1LnVuaXF1ZSAgICAgPSAoY2hhciAqKWJ1c2lkOworICAgIHUudW5pcXVlX2xlbiA9IHN0cmxlbihidXNpZCk7CisKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9TRVRfVU5JUVVFLCAmdSkpIHsKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1HZXRNYWdpYyhpbnQgZmQsIGRybV9tYWdpY190ICogbWFnaWMpCit7CisgICAgZHJtX2F1dGhfdCBhdXRoOworCisgICAgbWVtY2xlYXIoYXV0aCk7CisKKyAgICAqbWFnaWMgPSAwOworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0dFVF9NQUdJQywgJmF1dGgpKQorICAgICAgICByZXR1cm4gLWVycm5vOworICAgICptYWdpYyA9IGF1dGgubWFnaWM7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1BdXRoTWFnaWMoaW50IGZkLCBkcm1fbWFnaWNfdCBtYWdpYykKK3sKKyAgICBkcm1fYXV0aF90IGF1dGg7CisKKyAgICBtZW1jbGVhcihhdXRoKTsKKyAgICBhdXRoLm1hZ2ljID0gbWFnaWM7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfQVVUSF9NQUdJQywgJmF1dGgpKQorICAgICAgICByZXR1cm4gLWVycm5vOworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFNwZWNpZmllcyBhIHJhbmdlIG9mIG1lbW9yeSB0aGF0IGlzIGF2YWlsYWJsZSBmb3IgbWFwcGluZyBieSBhCisgKiBub24tcm9vdCBwcm9jZXNzLgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKiBccGFyYW0gb2Zmc2V0IHVzdWFsbHkgdGhlIHBoeXNpY2FsIGFkZHJlc3MuIFRoZSBhY3R1YWwgbWVhbmluZyBkZXBlbmRzIG9mCisgKiB0aGUgXHAgdHlwZSBwYXJhbWV0ZXIuIFNlZSBiZWxvdy4KKyAqIFxwYXJhbSBzaXplIG9mIHRoZSBtZW1vcnkgaW4gYnl0ZXMuCisgKiBccGFyYW0gdHlwZSB0eXBlIG9mIHRoZSBtZW1vcnkgdG8gYmUgbWFwcGVkLgorICogXHBhcmFtIGZsYWdzIGNvbWJpbmF0aW9uIG9mIHNldmVyYWwgZmxhZ3MgdG8gbW9kaWZ5IHRoZSBmdW5jdGlvbiBhY3Rpb25zLgorICogXHBhcmFtIGhhbmRsZSB3aWxsIGJlIHNldCB0byBhIHZhbHVlIHRoYXQgbWF5IGJlIHVzZWQgYXMgdGhlIG9mZnNldAorICogcGFyYW1ldGVyIGZvciBtbWFwKCkuCisgKgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4KKyAqCisgKiBccGFyIE1hcHBpbmcgdGhlIGZyYW1lIGJ1ZmZlcgorICogRm9yIHRoZSBmcmFtZSBidWZmZXIKKyAqIC0gXHAgb2Zmc2V0IHdpbGwgYmUgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmcmFtZSBidWZmZXIsCisgKiAtIFxwIHNpemUgd2lsbCBiZSB0aGUgc2l6ZSBvZiB0aGUgZnJhbWUgYnVmZmVyIGluIGJ5dGVzLCBhbmQKKyAqIC0gXHAgdHlwZSB3aWxsIGJlIERSTV9GUkFNRV9CVUZGRVIuCisgKgorICogXHBhcgorICogVGhlIGFyZWEgbWFwcGVkIHdpbGwgYmUgdW5jYWNoZWQuIElmIE1UUlIgc3VwcG9ydCBpcyBhdmFpbGFibGUgaW4gdGhlCisgKiBrZXJuZWwsIHRoZSBmcmFtZSBidWZmZXIgYXJlYSB3aWxsIGJlIHNldCB0byB3cml0ZSBjb21iaW5pbmcuCisgKgorICogXHBhciBNYXBwaW5nIHRoZSBNTUlPIHJlZ2lzdGVyIGFyZWEKKyAqIEZvciB0aGUgTU1JTyByZWdpc3RlciBhcmVhLAorICogLSBccCBvZmZzZXQgd2lsbCBiZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHJlZ2lzdGVyIGFyZWEsCisgKiAtIFxwIHNpemUgd2lsbCBiZSB0aGUgc2l6ZSBvZiB0aGUgcmVnaXN0ZXIgYXJlYSBieXRlcywgYW5kCisgKiAtIFxwIHR5cGUgd2lsbCBiZSBEUk1fUkVHSVNURVJTLgorICogXHBhcgorICogVGhlIGFyZWEgbWFwcGVkIHdpbGwgYmUgdW5jYWNoZWQuCisgKgorICogXHBhciBNYXBwaW5nIHRoZSBTQVJFQQorICogRm9yIHRoZSBTQVJFQSwKKyAqIC0gXHAgb2Zmc2V0IHdpbGwgYmUgaWdub3JlZCBhbmQgc2hvdWxkIGJlIHNldCB0byB6ZXJvLAorICogLSBccCBzaXplIHdpbGwgYmUgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgU0FSRUEgaW4gYnl0ZXMsCisgKiAtIFxwIHR5cGUgd2lsbCBiZSBEUk1fU0hNLgorICoKKyAqIFxwYXIKKyAqIEEgc2hhcmVkIG1lbW9yeSBhcmVhIG9mIHRoZSByZXF1ZXN0ZWQgc2l6ZSB3aWxsIGJlIGNyZWF0ZWQgYW5kIGxvY2tlZCBpbgorICoga2VybmVsIG1lbW9yeS4gVGhpcyBhcmVhIG1heSBiZSBtYXBwZWQgaW50byBjbGllbnQtc3BhY2UgYnkgdXNpbmcgdGhlIGhhbmRsZQorICogcmV0dXJuZWQuCisgKgorICogXG5vdGUgTWF5IG9ubHkgYmUgY2FsbGVkIGJ5IHJvb3QuCisgKgorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIERSTV9JT0NUTF9BRERfTUFQIGlvY3RsLCBwYXNzaW5nCisgKiB0aGUgYXJndW1lbnRzIGluIGEgZHJtX21hcCBzdHJ1Y3R1cmUuCisgKi8KK2ludCBkcm1BZGRNYXAoaW50IGZkLCBkcm1faGFuZGxlX3Qgb2Zmc2V0LCBkcm1TaXplIHNpemUsIGRybU1hcFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgZHJtTWFwRmxhZ3MgZmxhZ3MsIGRybV9oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIGRybV9tYXBfdCBtYXA7CisKKyAgICBtZW1jbGVhcihtYXApOworICAgIG1hcC5vZmZzZXQgID0gb2Zmc2V0OworICAgIG1hcC5zaXplICAgID0gc2l6ZTsKKyAgICBtYXAudHlwZSAgICA9IHR5cGU7CisgICAgbWFwLmZsYWdzICAgPSBmbGFnczsKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9BRERfTUFQLCAmbWFwKSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICBpZiAoaGFuZGxlKQorICAgICAgICAqaGFuZGxlID0gKGRybV9oYW5kbGVfdCkodWludHB0cl90KW1hcC5oYW5kbGU7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1SbU1hcChpbnQgZmQsIGRybV9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgZHJtX21hcF90IG1hcDsKKworICAgIG1lbWNsZWFyKG1hcCk7CisgICAgbWFwLmhhbmRsZSA9ICh2b2lkICopKHVpbnRwdHJfdCloYW5kbGU7CisKKyAgICBpZihkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX1JNX01BUCwgJm1hcCkpCisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogTWFrZSBidWZmZXJzIGF2YWlsYWJsZSBmb3IgRE1BIHRyYW5zZmVycy4KKyAqCisgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yLgorICogXHBhcmFtIGNvdW50IG51bWJlciBvZiBidWZmZXJzLgorICogXHBhcmFtIHNpemUgc2l6ZSBvZiBlYWNoIGJ1ZmZlci4KKyAqIFxwYXJhbSBmbGFncyBidWZmZXIgYWxsb2NhdGlvbiBmbGFncy4KKyAqIFxwYXJhbSBhZ3Bfb2Zmc2V0IG9mZnNldCBpbiB0aGUgQUdQIGFwZXJ0dXJlCisgKgorICogXHJldHVybiBudW1iZXIgb2YgYnVmZmVycyBhbGxvY2F0ZWQsIG5lZ2F0aXZlIG9uIGVycm9yLgorICoKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIERSTV9JT0NUTF9BRERfQlVGUyBpb2N0bC4KKyAqCisgKiBcc2EgZHJtX2J1Zl9kZXNjLgorICovCitpbnQgZHJtQWRkQnVmcyhpbnQgZmQsIGludCBjb3VudCwgaW50IHNpemUsIGRybUJ1ZkRlc2NGbGFncyBmbGFncywKKyAgICAgICAgICAgICAgIGludCBhZ3Bfb2Zmc2V0KQoreworICAgIGRybV9idWZfZGVzY190IHJlcXVlc3Q7CisKKyAgICBtZW1jbGVhcihyZXF1ZXN0KTsKKyAgICByZXF1ZXN0LmNvdW50ICAgICA9IGNvdW50OworICAgIHJlcXVlc3Quc2l6ZSAgICAgID0gc2l6ZTsKKyAgICByZXF1ZXN0LmZsYWdzICAgICA9IGZsYWdzOworICAgIHJlcXVlc3QuYWdwX3N0YXJ0ID0gYWdwX29mZnNldDsKKworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0FERF9CVUZTLCAmcmVxdWVzdCkpCisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgcmV0dXJuIHJlcXVlc3QuY291bnQ7Cit9CisKK2ludCBkcm1NYXJrQnVmcyhpbnQgZmQsIGRvdWJsZSBsb3csIGRvdWJsZSBoaWdoKQoreworICAgIGRybV9idWZfaW5mb190IGluZm87CisgICAgaW50ICAgICAgICAgICAgaTsKKworICAgIG1lbWNsZWFyKGluZm8pOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfSU5GT19CVUZTLCAmaW5mbykpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKCFpbmZvLmNvdW50KQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmICghKGluZm8ubGlzdCA9IGRybU1hbGxvYyhpbmZvLmNvdW50ICogc2l6ZW9mKCppbmZvLmxpc3QpKSkpCisgICAgICAgIHJldHVybiAtRU5PTUVNOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfSU5GT19CVUZTLCAmaW5mbykpIHsKKyAgICAgICAgaW50IHJldHZhbCA9IC1lcnJubzsKKyAgICAgICAgZHJtRnJlZShpbmZvLmxpc3QpOworICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvLmNvdW50OyBpKyspIHsKKyAgICAgICAgaW5mby5saXN0W2ldLmxvd19tYXJrICA9IGxvdyAgKiBpbmZvLmxpc3RbaV0uY291bnQ7CisgICAgICAgIGluZm8ubGlzdFtpXS5oaWdoX21hcmsgPSBoaWdoICogaW5mby5saXN0W2ldLmNvdW50OworICAgICAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9NQVJLX0JVRlMsICZpbmZvLmxpc3RbaV0pKSB7CisgICAgICAgICAgICBpbnQgcmV0dmFsID0gLWVycm5vOworICAgICAgICAgICAgZHJtRnJlZShpbmZvLmxpc3QpOworICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBkcm1GcmVlKGluZm8ubGlzdCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBGcmVlIGJ1ZmZlcnMuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSBjb3VudCBudW1iZXIgb2YgYnVmZmVycyB0byBmcmVlLgorICogXHBhcmFtIGxpc3QgbGlzdCBvZiBidWZmZXJzIHRvIGJlIGZyZWVkLgorICoKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBpcyBwcmltYXJpbHkgdXNlZCBmb3IgZGVidWdnaW5nLgorICoKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBEUk1fSU9DVExfRlJFRV9CVUZTIGlvY3RsLCBwYXNzaW5nCisgKiB0aGUgYXJndW1lbnRzIGluIGEgZHJtX2J1Zl9mcmVlIHN0cnVjdHVyZS4KKyAqLworaW50IGRybUZyZWVCdWZzKGludCBmZCwgaW50IGNvdW50LCBpbnQgKmxpc3QpCit7CisgICAgZHJtX2J1Zl9mcmVlX3QgcmVxdWVzdDsKKworICAgIG1lbWNsZWFyKHJlcXVlc3QpOworICAgIHJlcXVlc3QuY291bnQgPSBjb3VudDsKKyAgICByZXF1ZXN0Lmxpc3QgID0gbGlzdDsKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9GUkVFX0JVRlMsICZyZXF1ZXN0KSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gMDsKK30KKworCisvKioKKyAqIENsb3NlIHRoZSBkZXZpY2UuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gY2xvc2VzIHRoZSBmaWxlIGRlc2NyaXB0b3IuCisgKi8KK2ludCBkcm1DbG9zZShpbnQgZmQpCit7CisgICAgdW5zaWduZWQgbG9uZyBrZXkgICAgPSBkcm1HZXRLZXlGcm9tRmQoZmQpOworICAgIGRybUhhc2hFbnRyeSAgKmVudHJ5ID0gZHJtR2V0RW50cnkoZmQpOworCisgICAgZHJtSGFzaERlc3Ryb3koZW50cnktPnRhZ1RhYmxlKTsKKyAgICBlbnRyeS0+ZmQgICAgICAgPSAwOworICAgIGVudHJ5LT5mICAgICAgICA9IE5VTEw7CisgICAgZW50cnktPnRhZ1RhYmxlID0gTlVMTDsKKworICAgIGRybUhhc2hEZWxldGUoZHJtSGFzaFRhYmxlLCBrZXkpOworICAgIGRybUZyZWUoZW50cnkpOworCisgICAgcmV0dXJuIGNsb3NlKGZkKTsKK30KKworCisvKioKKyAqIE1hcCBhIHJlZ2lvbiBvZiBtZW1vcnkuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSBoYW5kbGUgaGFuZGxlIHJldHVybmVkIGJ5IGRybUFkZE1hcCgpLgorICogXHBhcmFtIHNpemUgc2l6ZSBpbiBieXRlcy4gTXVzdCBtYXRjaCB0aGUgc2l6ZSB1c2VkIGJ5IGRybUFkZE1hcCgpLgorICogXHBhcmFtIGFkZHJlc3Mgd2lsbCBjb250YWluIHRoZSB1c2VyLXNwYWNlIHZpcnR1YWwgYWRkcmVzcyB3aGVyZSB0aGUgbWFwcGluZworICogYmVnaW5zLgorICoKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBmb3IgbW1hcCgpLgorICovCitpbnQgZHJtTWFwKGludCBmZCwgZHJtX2hhbmRsZV90IGhhbmRsZSwgZHJtU2l6ZSBzaXplLCBkcm1BZGRyZXNzUHRyIGFkZHJlc3MpCit7CisgICAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZXNpemVfbWFzayA9IDA7CisKKyAgICBpZiAoZmQgPCAwKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmICghcGFnZXNpemVfbWFzaykKKyAgICAgICAgcGFnZXNpemVfbWFzayA9IGdldHBhZ2VzaXplKCkgLSAxOworCisgICAgc2l6ZSA9IChzaXplICsgcGFnZXNpemVfbWFzaykgJiB+cGFnZXNpemVfbWFzazsKKworICAgICphZGRyZXNzID0gZHJtX21tYXAoMCwgc2l6ZSwgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCBoYW5kbGUpOworICAgIGlmICgqYWRkcmVzcyA9PSBNQVBfRkFJTEVEKQorICAgICAgICByZXR1cm4gLWVycm5vOworICAgIHJldHVybiAwOworfQorCisKKy8qKgorICogVW5tYXAgbWFwcGluZ3Mgb2J0YWluZWQgd2l0aCBkcm1NYXAoKS4KKyAqCisgKiBccGFyYW0gYWRkcmVzcyBhZGRyZXNzIGFzIGdpdmVuIGJ5IGRybU1hcCgpLgorICogXHBhcmFtIHNpemUgc2l6ZSBpbiBieXRlcy4gTXVzdCBtYXRjaCB0aGUgc2l6ZSB1c2VkIGJ5IGRybU1hcCgpLgorICoKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBmb3IgbXVubWFwKCkuCisgKi8KK2ludCBkcm1Vbm1hcChkcm1BZGRyZXNzIGFkZHJlc3MsIGRybVNpemUgc2l6ZSkKK3sKKyAgICByZXR1cm4gZHJtX211bm1hcChhZGRyZXNzLCBzaXplKTsKK30KKworZHJtQnVmSW5mb1B0ciBkcm1HZXRCdWZJbmZvKGludCBmZCkKK3sKKyAgICBkcm1fYnVmX2luZm9fdCBpbmZvOworICAgIGRybUJ1ZkluZm9QdHIgIHJldHZhbDsKKyAgICBpbnQgICAgICAgICAgICBpOworCisgICAgbWVtY2xlYXIoaW5mbyk7CisKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9JTkZPX0JVRlMsICZpbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoaW5mby5jb3VudCkgeworICAgICAgICBpZiAoIShpbmZvLmxpc3QgPSBkcm1NYWxsb2MoaW5mby5jb3VudCAqIHNpemVvZigqaW5mby5saXN0KSkpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfSU5GT19CVUZTLCAmaW5mbykpIHsKKyAgICAgICAgICAgIGRybUZyZWUoaW5mby5saXN0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgcmV0dmFsID0gZHJtTWFsbG9jKHNpemVvZigqcmV0dmFsKSk7CisgICAgICAgIHJldHZhbC0+Y291bnQgPSBpbmZvLmNvdW50OworICAgICAgICByZXR2YWwtPmxpc3QgID0gZHJtTWFsbG9jKGluZm8uY291bnQgKiBzaXplb2YoKnJldHZhbC0+bGlzdCkpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5mby5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICByZXR2YWwtPmxpc3RbaV0uY291bnQgICAgID0gaW5mby5saXN0W2ldLmNvdW50OworICAgICAgICAgICAgcmV0dmFsLT5saXN0W2ldLnNpemUgICAgICA9IGluZm8ubGlzdFtpXS5zaXplOworICAgICAgICAgICAgcmV0dmFsLT5saXN0W2ldLmxvd19tYXJrICA9IGluZm8ubGlzdFtpXS5sb3dfbWFyazsKKyAgICAgICAgICAgIHJldHZhbC0+bGlzdFtpXS5oaWdoX21hcmsgPSBpbmZvLmxpc3RbaV0uaGlnaF9tYXJrOworICAgICAgICB9CisgICAgICAgIGRybUZyZWUoaW5mby5saXN0KTsKKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogTWFwIGFsbCBETUEgYnVmZmVycyBpbnRvIGNsaWVudC12aXJ0dWFsIHNwYWNlLgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogXHJldHVybiBhIHBvaW50ZXIgdG8gYSA6OmRybUJ1Zk1hcCBzdHJ1Y3R1cmUuCisgKgorICogXG5vdGUgVGhlIGNsaWVudCBtYXkgbm90IHVzZSB0aGVzZSBidWZmZXJzIHVudGlsIG9idGFpbmluZyBidWZmZXIgaW5kaWNlcworICogd2l0aCBkcm1ETUEoKS4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIERSTV9JT0NUTF9NQVBfQlVGUyBpb2N0bCBhbmQgY29waWVzIHRoZSByZXR1cm5lZAorICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJ1ZmZlcnMgaW4gYSBkcm1fYnVmX21hcCBzdHJ1Y3R1cmUgaW50byB0aGUKKyAqIGNsaWVudC12aXNpYmxlIGRhdGEgc3RydWN0dXJlcy4KKyAqLworZHJtQnVmTWFwUHRyIGRybU1hcEJ1ZnMoaW50IGZkKQoreworICAgIGRybV9idWZfbWFwX3QgYnVmczsKKyAgICBkcm1CdWZNYXBQdHIgIHJldHZhbDsKKyAgICBpbnQgICAgICAgICAgIGk7CisKKyAgICBtZW1jbGVhcihidWZzKTsKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9NQVBfQlVGUywgJmJ1ZnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICghYnVmcy5jb3VudCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoIShidWZzLmxpc3QgPSBkcm1NYWxsb2MoYnVmcy5jb3VudCAqIHNpemVvZigqYnVmcy5saXN0KSkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX01BUF9CVUZTLCAmYnVmcykpIHsKKyAgICAgICAgZHJtRnJlZShidWZzLmxpc3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR2YWwgPSBkcm1NYWxsb2Moc2l6ZW9mKCpyZXR2YWwpKTsKKyAgICByZXR2YWwtPmNvdW50ID0gYnVmcy5jb3VudDsKKyAgICByZXR2YWwtPmxpc3QgID0gZHJtTWFsbG9jKGJ1ZnMuY291bnQgKiBzaXplb2YoKnJldHZhbC0+bGlzdCkpOworICAgIGZvciAoaSA9IDA7IGkgPCBidWZzLmNvdW50OyBpKyspIHsKKyAgICAgICAgcmV0dmFsLT5saXN0W2ldLmlkeCAgICAgPSBidWZzLmxpc3RbaV0uaWR4OworICAgICAgICByZXR2YWwtPmxpc3RbaV0udG90YWwgICA9IGJ1ZnMubGlzdFtpXS50b3RhbDsKKyAgICAgICAgcmV0dmFsLT5saXN0W2ldLnVzZWQgICAgPSAwOworICAgICAgICByZXR2YWwtPmxpc3RbaV0uYWRkcmVzcyA9IGJ1ZnMubGlzdFtpXS5hZGRyZXNzOworICAgIH0KKworICAgIGRybUZyZWUoYnVmcy5saXN0KTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisKKy8qKgorICogVW5tYXAgYnVmZmVycyBhbGxvY2F0ZWQgd2l0aCBkcm1NYXBCdWZzKCkuCisgKgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogXGludGVybmFsCisgKiBDYWxscyBtdW5tYXAoKSBmb3IgZXZlcnkgYnVmZmVyIHN0b3JlZCBpbiBccCBidWZzIGFuZCBmcmVlcyB0aGUKKyAqIG1lbW9yeSBhbGxvY2F0ZWQgYnkgZHJtTWFwQnVmcygpLgorICovCitpbnQgZHJtVW5tYXBCdWZzKGRybUJ1Zk1hcFB0ciBidWZzKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZnMtPmNvdW50OyBpKyspIHsKKyAgICAgICAgZHJtX211bm1hcChidWZzLT5saXN0W2ldLmFkZHJlc3MsIGJ1ZnMtPmxpc3RbaV0udG90YWwpOworICAgIH0KKworICAgIGRybUZyZWUoYnVmcy0+bGlzdCk7CisgICAgZHJtRnJlZShidWZzKTsKKyAgICByZXR1cm4gMDsKK30KKworCisjZGVmaW5lIERSTV9ETUFfUkVUUlkgIDE2CisKKy8qKgorICogUmVzZXJ2ZSBETUEgYnVmZmVycy4KKyAqCisgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yLgorICogXHBhcmFtIHJlcXVlc3QKKyAqCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIFxpbnRlcm5hbAorICogQXNzZW1ibGUgdGhlIGFyZ3VtZW50cyBpbnRvIGEgZHJtX2RtYSBzdHJ1Y3R1cmUgYW5kIGtlZXBzIGlzc3VpbmcgdGhlCisgKiBEUk1fSU9DVExfRE1BIGlvY3RsIHVudGlsIHN1Y2Nlc3Mgb3IgdW50aWwgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcy4KKyAqLworaW50IGRybURNQShpbnQgZmQsIGRybURNQVJlcVB0ciByZXF1ZXN0KQoreworICAgIGRybV9kbWFfdCBkbWE7CisgICAgaW50IHJldCwgaSA9IDA7CisKKyAgICBkbWEuY29udGV4dCAgICAgICAgID0gcmVxdWVzdC0+Y29udGV4dDsKKyAgICBkbWEuc2VuZF9jb3VudCAgICAgID0gcmVxdWVzdC0+c2VuZF9jb3VudDsKKyAgICBkbWEuc2VuZF9pbmRpY2VzICAgID0gcmVxdWVzdC0+c2VuZF9saXN0OworICAgIGRtYS5zZW5kX3NpemVzICAgICAgPSByZXF1ZXN0LT5zZW5kX3NpemVzOworICAgIGRtYS5mbGFncyAgICAgICAgICAgPSByZXF1ZXN0LT5mbGFnczsKKyAgICBkbWEucmVxdWVzdF9jb3VudCAgID0gcmVxdWVzdC0+cmVxdWVzdF9jb3VudDsKKyAgICBkbWEucmVxdWVzdF9zaXplICAgID0gcmVxdWVzdC0+cmVxdWVzdF9zaXplOworICAgIGRtYS5yZXF1ZXN0X2luZGljZXMgPSByZXF1ZXN0LT5yZXF1ZXN0X2xpc3Q7CisgICAgZG1hLnJlcXVlc3Rfc2l6ZXMgICA9IHJlcXVlc3QtPnJlcXVlc3Rfc2l6ZXM7CisgICAgZG1hLmdyYW50ZWRfY291bnQgICA9IDA7CisKKyAgICBkbyB7CisgICAgICAgIHJldCA9IGlvY3RsKCBmZCwgRFJNX0lPQ1RMX0RNQSwgJmRtYSApOworICAgIH0gd2hpbGUgKCByZXQgJiYgZXJybm8gPT0gRUFHQUlOICYmIGkrKyA8IERSTV9ETUFfUkVUUlkgKTsKKworICAgIGlmICggcmV0ID09IDAgKSB7CisgICAgICAgIHJlcXVlc3QtPmdyYW50ZWRfY291bnQgPSBkbWEuZ3JhbnRlZF9jb3VudDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICB9Cit9CisKKworLyoqCisgKiBPYnRhaW4gaGVhdnl3ZWlnaHQgaGFyZHdhcmUgbG9jay4KKyAqCisgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yLgorICogXHBhcmFtIGNvbnRleHQgY29udGV4dC4KKyAqIFxwYXJhbSBmbGFncyBmbGFncyB0aGF0IGRldGVybWluZSB0aGUgc2F0ZSBvZiB0aGUgaGFyZHdhcmUgd2hlbiB0aGUgZnVuY3Rpb24KKyAqIHJldHVybnMuCisgKgorICogXHJldHVybiBhbHdheXMgemVyby4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGUgYXJndW1lbnRzIGludG8gYSBkcm1fbG9jayBzdHJ1Y3R1cmUgYW5kIGlzc3VlCisgKiB0aGUgRFJNX0lPQ1RMX0xPQ0sgaW9jdGwgdW50aWwgdGhlIGxvY2sgaXMgc3VjY2Vzc2Z1bGx5IGFjcXVpcmVkLgorICovCitpbnQgZHJtR2V0TG9jayhpbnQgZmQsIGRybV9jb250ZXh0X3QgY29udGV4dCwgZHJtTG9ja0ZsYWdzIGZsYWdzKQoreworICAgIGRybV9sb2NrX3QgbG9jazsKKworICAgIG1lbWNsZWFyKGxvY2spOworICAgIGxvY2suY29udGV4dCA9IGNvbnRleHQ7CisgICAgbG9jay5mbGFncyAgID0gMDsKKyAgICBpZiAoZmxhZ3MgJiBEUk1fTE9DS19SRUFEWSkgICAgICBsb2NrLmZsYWdzIHw9IF9EUk1fTE9DS19SRUFEWTsKKyAgICBpZiAoZmxhZ3MgJiBEUk1fTE9DS19RVUlFU0NFTlQpICBsb2NrLmZsYWdzIHw9IF9EUk1fTE9DS19RVUlFU0NFTlQ7CisgICAgaWYgKGZsYWdzICYgRFJNX0xPQ0tfRkxVU0gpICAgICAgbG9jay5mbGFncyB8PSBfRFJNX0xPQ0tfRkxVU0g7CisgICAgaWYgKGZsYWdzICYgRFJNX0xPQ0tfRkxVU0hfQUxMKSAgbG9jay5mbGFncyB8PSBfRFJNX0xPQ0tfRkxVU0hfQUxMOworICAgIGlmIChmbGFncyAmIERSTV9IQUxUX0FMTF9RVUVVRVMpIGxvY2suZmxhZ3MgfD0gX0RSTV9IQUxUX0FMTF9RVUVVRVM7CisgICAgaWYgKGZsYWdzICYgRFJNX0hBTFRfQ1VSX1FVRVVFUykgbG9jay5mbGFncyB8PSBfRFJNX0hBTFRfQ1VSX1FVRVVFUzsKKworICAgIHdoaWxlIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0xPQ0ssICZsb2NrKSkKKyAgICAgICAgOworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFJlbGVhc2UgdGhlIGhhcmR3YXJlIGxvY2suCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSBjb250ZXh0IGNvbnRleHQuCisgKgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRFJNX0lPQ1RMX1VOTE9DSyBpb2N0bCwgcGFzc2luZyB0aGUKKyAqIGFyZ3VtZW50IGluIGEgZHJtX2xvY2sgc3RydWN0dXJlLgorICovCitpbnQgZHJtVW5sb2NrKGludCBmZCwgZHJtX2NvbnRleHRfdCBjb250ZXh0KQoreworICAgIGRybV9sb2NrX3QgbG9jazsKKworICAgIG1lbWNsZWFyKGxvY2spOworICAgIGxvY2suY29udGV4dCA9IGNvbnRleHQ7CisgICAgcmV0dXJuIGRybUlvY3RsKGZkLCBEUk1fSU9DVExfVU5MT0NLLCAmbG9jayk7Cit9CisKK2RybV9jb250ZXh0X3QgKmRybUdldFJlc2VydmVkQ29udGV4dExpc3QoaW50IGZkLCBpbnQgKmNvdW50KQoreworICAgIGRybV9jdHhfcmVzX3QgcmVzOworICAgIGRybV9jdHhfdCAgICAgKmxpc3Q7CisgICAgZHJtX2NvbnRleHRfdCAqIHJldHZhbDsKKyAgICBpbnQgICAgICAgICAgIGk7CisKKyAgICBtZW1jbGVhcihyZXMpOworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX1JFU19DVFgsICZyZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICghcmVzLmNvdW50KQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICghKGxpc3QgICA9IGRybU1hbGxvYyhyZXMuY291bnQgKiBzaXplb2YoKmxpc3QpKSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghKHJldHZhbCA9IGRybU1hbGxvYyhyZXMuY291bnQgKiBzaXplb2YoKnJldHZhbCkpKSkKKyAgICAgICAgZ290byBlcnJfZnJlZV9saXN0OworCisgICAgcmVzLmNvbnRleHRzID0gbGlzdDsKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9SRVNfQ1RYLCAmcmVzKSkKKyAgICAgICAgZ290byBlcnJfZnJlZV9jb250ZXh0OworCisgICAgZm9yIChpID0gMDsgaSA8IHJlcy5jb3VudDsgaSsrKQorICAgICAgICByZXR2YWxbaV0gPSBsaXN0W2ldLmhhbmRsZTsKKyAgICBkcm1GcmVlKGxpc3QpOworCisgICAgKmNvdW50ID0gcmVzLmNvdW50OworICAgIHJldHVybiByZXR2YWw7CisKK2Vycl9mcmVlX2xpc3Q6CisgICAgZHJtRnJlZShsaXN0KTsKK2Vycl9mcmVlX2NvbnRleHQ6CisgICAgZHJtRnJlZShyZXR2YWwpOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIGRybUZyZWVSZXNlcnZlZENvbnRleHRMaXN0KGRybV9jb250ZXh0X3QgKnB0KQoreworICAgIGRybUZyZWUocHQpOworfQorCisvKioKKyAqIENyZWF0ZSBjb250ZXh0LgorICoKKyAqIFVzZWQgYnkgdGhlIFggc2VydmVyIGR1cmluZyBHTFhDb250ZXh0IGluaXRpYWxpemF0aW9uLiBUaGlzIGNhdXNlcworICogcGVyLWNvbnRleHQga2VybmVsLWxldmVsIHJlc291cmNlcyB0byBiZSBhbGxvY2F0ZWQuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSBoYW5kbGUgaXMgc2V0IG9uIHN1Y2Nlc3MuIFRvIGJlIHVzZWQgYnkgdGhlIGNsaWVudCB3aGVuIHJlcXVlc3RpbmcgRE1BCisgKiBkaXNwYXRjaCB3aXRoIGRybURNQSgpLgorICoKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogXG5vdGUgTWF5IG9ubHkgYmUgY2FsbGVkIGJ5IHJvb3QuCisgKgorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIERSTV9JT0NUTF9BRERfQ1RYIGlvY3RsLCBwYXNzaW5nIHRoZQorICogYXJndW1lbnQgaW4gYSBkcm1fY3R4IHN0cnVjdHVyZS4KKyAqLworaW50IGRybUNyZWF0ZUNvbnRleHQoaW50IGZkLCBkcm1fY29udGV4dF90ICpoYW5kbGUpCit7CisgICAgZHJtX2N0eF90IGN0eDsKKworICAgIG1lbWNsZWFyKGN0eCk7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfQUREX0NUWCwgJmN0eCkpCisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgKmhhbmRsZSA9IGN0eC5oYW5kbGU7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1Td2l0Y2hUb0NvbnRleHQoaW50IGZkLCBkcm1fY29udGV4dF90IGNvbnRleHQpCit7CisgICAgZHJtX2N0eF90IGN0eDsKKworICAgIG1lbWNsZWFyKGN0eCk7CisgICAgY3R4LmhhbmRsZSA9IGNvbnRleHQ7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfU1dJVENIX0NUWCwgJmN0eCkpCisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1TZXRDb250ZXh0RmxhZ3MoaW50IGZkLCBkcm1fY29udGV4dF90IGNvbnRleHQsIGRybV9jb250ZXh0X3RGbGFncyBmbGFncykKK3sKKyAgICBkcm1fY3R4X3QgY3R4OworCisgICAgLyoKKyAgICAgKiBDb250ZXh0IHByZXNlcnZpbmcgbWVhbnMgdGhhdCBubyBjb250ZXh0IHN3aXRjaGVzIGFyZSBkb25lIGJldHdlZW4gRE1BCisgICAgICogYnVmZmVycyBmcm9tIG9uZSBjb250ZXh0IGFuZCB0aGUgbmV4dC4gIFRoaXMgaXMgc3VpdGFibGUgZm9yIHVzZSBpbiB0aGUKKyAgICAgKiBYIHNlcnZlciAod2hpY2ggcHJvbWlzZXMgdG8gbWFpbnRhaW4gaGFyZHdhcmUgY29udGV4dCksIG9yIGluIHRoZQorICAgICAqIGNsaWVudC1zaWRlIGxpYnJhcnkgd2hlbiBidWZmZXJzIGFyZSBzd2FwcGVkIG9uIGJlaGFsZiBvZiB0d28gdGhyZWFkcy4KKyAgICAgKi8KKyAgICBtZW1jbGVhcihjdHgpOworICAgIGN0eC5oYW5kbGUgPSBjb250ZXh0OworICAgIGlmIChmbGFncyAmIERSTV9DT05URVhUX1BSRVNFUlZFRCkKKyAgICAgICAgY3R4LmZsYWdzIHw9IF9EUk1fQ09OVEVYVF9QUkVTRVJWRUQ7CisgICAgaWYgKGZsYWdzICYgRFJNX0NPTlRFWFRfMkRPTkxZKQorICAgICAgICBjdHguZmxhZ3MgfD0gX0RSTV9DT05URVhUXzJET05MWTsKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9NT0RfQ1RYLCAmY3R4KSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGRybUdldENvbnRleHRGbGFncyhpbnQgZmQsIGRybV9jb250ZXh0X3QgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgZHJtX2NvbnRleHRfdEZsYWdzUHRyIGZsYWdzKQoreworICAgIGRybV9jdHhfdCBjdHg7CisKKyAgICBtZW1jbGVhcihjdHgpOworICAgIGN0eC5oYW5kbGUgPSBjb250ZXh0OworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0dFVF9DVFgsICZjdHgpKQorICAgICAgICByZXR1cm4gLWVycm5vOworICAgICpmbGFncyA9IDA7CisgICAgaWYgKGN0eC5mbGFncyAmIF9EUk1fQ09OVEVYVF9QUkVTRVJWRUQpCisgICAgICAgICpmbGFncyB8PSBEUk1fQ09OVEVYVF9QUkVTRVJWRUQ7CisgICAgaWYgKGN0eC5mbGFncyAmIF9EUk1fQ09OVEVYVF8yRE9OTFkpCisgICAgICAgICpmbGFncyB8PSBEUk1fQ09OVEVYVF8yRE9OTFk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRGVzdHJveSBjb250ZXh0LgorICoKKyAqIEZyZWUgYW55IGtlcm5lbC1sZXZlbCByZXNvdXJjZXMgYWxsb2NhdGVkIHdpdGggZHJtQ3JlYXRlQ29udGV4dCgpIGFzc29jaWF0ZWQKKyAqIHdpdGggdGhlIGNvbnRleHQuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSBoYW5kbGUgaGFuZGxlIGdpdmVuIGJ5IGRybUNyZWF0ZUNvbnRleHQoKS4KKyAqCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIFxub3RlIE1heSBvbmx5IGJlIGNhbGxlZCBieSByb290LgorICoKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBEUk1fSU9DVExfUk1fQ1RYIGlvY3RsLCBwYXNzaW5nIHRoZQorICogYXJndW1lbnQgaW4gYSBkcm1fY3R4IHN0cnVjdHVyZS4KKyAqLworaW50IGRybURlc3Ryb3lDb250ZXh0KGludCBmZCwgZHJtX2NvbnRleHRfdCBoYW5kbGUpCit7CisgICAgZHJtX2N0eF90IGN0eDsKKworICAgIG1lbWNsZWFyKGN0eCk7CisgICAgY3R4LmhhbmRsZSA9IGhhbmRsZTsKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9STV9DVFgsICZjdHgpKQorICAgICAgICByZXR1cm4gLWVycm5vOworICAgIHJldHVybiAwOworfQorCitpbnQgZHJtQ3JlYXRlRHJhd2FibGUoaW50IGZkLCBkcm1fZHJhd2FibGVfdCAqaGFuZGxlKQoreworICAgIGRybV9kcmF3X3QgZHJhdzsKKworICAgIG1lbWNsZWFyKGRyYXcpOworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0FERF9EUkFXLCAmZHJhdykpCisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgKmhhbmRsZSA9IGRyYXcuaGFuZGxlOworICAgIHJldHVybiAwOworfQorCitpbnQgZHJtRGVzdHJveURyYXdhYmxlKGludCBmZCwgZHJtX2RyYXdhYmxlX3QgaGFuZGxlKQoreworICAgIGRybV9kcmF3X3QgZHJhdzsKKworICAgIG1lbWNsZWFyKGRyYXcpOworICAgIGRyYXcuaGFuZGxlID0gaGFuZGxlOworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX1JNX0RSQVcsICZkcmF3KSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGRybVVwZGF0ZURyYXdhYmxlSW5mbyhpbnQgZmQsIGRybV9kcmF3YWJsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHJtX2RyYXdhYmxlX2luZm9fdHlwZV90IHR5cGUsIHVuc2lnbmVkIGludCBudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpCit7CisgICAgZHJtX3VwZGF0ZV9kcmF3X3QgdXBkYXRlOworCisgICAgbWVtY2xlYXIodXBkYXRlKTsKKyAgICB1cGRhdGUuaGFuZGxlID0gaGFuZGxlOworICAgIHVwZGF0ZS50eXBlID0gdHlwZTsKKyAgICB1cGRhdGUubnVtID0gbnVtOworICAgIHVwZGF0ZS5kYXRhID0gKHVuc2lnbmVkIGxvbmcgbG9uZykodW5zaWduZWQgbG9uZylkYXRhOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfVVBEQVRFX0RSQVcsICZ1cGRhdGUpKQorICAgICAgICByZXR1cm4gLWVycm5vOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogQWNxdWlyZSB0aGUgQUdQIGRldmljZS4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG9mIHRoZSBvdGhlciBBR1AgcmVsYXRlZCBjYWxscy4KKyAqCisgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yLgorICoKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIERSTV9JT0NUTF9BR1BfQUNRVUlSRSBpb2N0bC4KKyAqLworaW50IGRybUFncEFjcXVpcmUoaW50IGZkKQoreworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0FHUF9BQ1FVSVJFLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gMDsKK30KKworCisvKioKKyAqIFJlbGVhc2UgdGhlIEFHUCBkZXZpY2UuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBEUk1fSU9DVExfQUdQX1JFTEVBU0UgaW9jdGwuCisgKi8KK2ludCBkcm1BZ3BSZWxlYXNlKGludCBmZCkKK3sKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9BR1BfUkVMRUFTRSwgTlVMTCkpCisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBTZXQgdGhlIEFHUCBtb2RlLgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKiBccGFyYW0gbW9kZSBBR1AgbW9kZS4KKyAqCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBEUk1fSU9DVExfQUdQX0VOQUJMRSBpb2N0bCwgcGFzc2luZyB0aGUKKyAqIGFyZ3VtZW50IGluIGEgZHJtX2FncF9tb2RlIHN0cnVjdHVyZS4KKyAqLworaW50IGRybUFncEVuYWJsZShpbnQgZmQsIHVuc2lnbmVkIGxvbmcgbW9kZSkKK3sKKyAgICBkcm1fYWdwX21vZGVfdCBtOworCisgICAgbWVtY2xlYXIobSk7CisgICAgbS5tb2RlID0gbW9kZTsKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9BR1BfRU5BQkxFLCAmbSkpCisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBBbGxvY2F0ZSBhIGNodW5rIG9mIEFHUCBtZW1vcnkuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSBzaXplIHJlcXVlc3RlZCBtZW1vcnkgc2l6ZSBpbiBieXRlcy4gV2lsbCBiZSByb3VuZGVkIHRvIHBhZ2UgYm91bmRhcnkuCisgKiBccGFyYW0gdHlwZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZS4KKyAqIFxwYXJhbSBhZGRyZXNzIGlmIG5vdCB6ZXJvLCB3aWxsIGJlIHNldCB0byB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUKKyAqIGFsbG9jYXRlZCBtZW1vcnkuCisgKiBccGFyYW0gaGFuZGxlIG9uIHN1Y2Nlc3Mgd2lsbCBiZSBzZXQgdG8gYSBoYW5kbGUgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkuCisgKgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRFJNX0lPQ1RMX0FHUF9BTExPQyBpb2N0bCwgcGFzc2luZyB0aGUKKyAqIGFyZ3VtZW50cyBpbiBhIGRybV9hZ3BfYnVmZmVyIHN0cnVjdHVyZS4KKyAqLworaW50IGRybUFncEFsbG9jKGludCBmZCwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIHR5cGUsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqYWRkcmVzcywgZHJtX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgZHJtX2FncF9idWZmZXJfdCBiOworCisgICAgbWVtY2xlYXIoYik7CisgICAgKmhhbmRsZSA9IERSTV9BR1BfTk9fSEFORExFOworICAgIGIuc2l6ZSAgID0gc2l6ZTsKKyAgICBiLnR5cGUgICA9IHR5cGU7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfQUdQX0FMTE9DLCAmYikpCisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgaWYgKGFkZHJlc3MgIT0gMFVMKQorICAgICAgICAqYWRkcmVzcyA9IGIucGh5c2ljYWw7CisgICAgKmhhbmRsZSA9IGIuaGFuZGxlOworICAgIHJldHVybiAwOworfQorCisKKy8qKgorICogRnJlZSBhIGNodW5rIG9mIEFHUCBtZW1vcnkuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSBoYW5kbGUgaGFuZGxlIHRvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LCBhcyBnaXZlbiBieSBkcm1BZ3BBbGxvY2F0ZSgpLgorICoKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIERSTV9JT0NUTF9BR1BfRlJFRSBpb2N0bCwgcGFzc2luZyB0aGUKKyAqIGFyZ3VtZW50IGluIGEgZHJtX2FncF9idWZmZXIgc3RydWN0dXJlLgorICovCitpbnQgZHJtQWdwRnJlZShpbnQgZmQsIGRybV9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgZHJtX2FncF9idWZmZXJfdCBiOworCisgICAgbWVtY2xlYXIoYik7CisgICAgYi5oYW5kbGUgPSBoYW5kbGU7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfQUdQX0ZSRUUsICZiKSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gMDsKK30KKworCisvKioKKyAqIEJpbmQgYSBjaHVuayBvZiBBR1AgbWVtb3J5LgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKiBccGFyYW0gaGFuZGxlIGhhbmRsZSB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeSwgYXMgZ2l2ZW4gYnkgZHJtQWdwQWxsb2NhdGUoKS4KKyAqIFxwYXJhbSBvZmZzZXQgb2Zmc2V0IGluIGJ5dGVzLiBJdCB3aWxsIHJvdW5kIHRvIHBhZ2UgYm91bmRhcnkuCisgKgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRFJNX0lPQ1RMX0FHUF9CSU5EIGlvY3RsLCBwYXNzaW5nIHRoZQorICogYXJndW1lbnQgaW4gYSBkcm1fYWdwX2JpbmRpbmcgc3RydWN0dXJlLgorICovCitpbnQgZHJtQWdwQmluZChpbnQgZmQsIGRybV9oYW5kbGVfdCBoYW5kbGUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworICAgIGRybV9hZ3BfYmluZGluZ190IGI7CisKKyAgICBtZW1jbGVhcihiKTsKKyAgICBiLmhhbmRsZSA9IGhhbmRsZTsKKyAgICBiLm9mZnNldCA9IG9mZnNldDsKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9BR1BfQklORCwgJmIpKQorICAgICAgICByZXR1cm4gLWVycm5vOworICAgIHJldHVybiAwOworfQorCisKKy8qKgorICogVW5iaW5kIGEgY2h1bmsgb2YgQUdQIG1lbW9yeS4KKyAqCisgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yLgorICogXHBhcmFtIGhhbmRsZSBoYW5kbGUgdG8gdGhlIGFsbG9jYXRlZCBtZW1vcnksIGFzIGdpdmVuIGJ5IGRybUFncEFsbG9jYXRlKCkuCisgKgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRFJNX0lPQ1RMX0FHUF9VTkJJTkQgaW9jdGwsIHBhc3NpbmcKKyAqIHRoZSBhcmd1bWVudCBpbiBhIGRybV9hZ3BfYmluZGluZyBzdHJ1Y3R1cmUuCisgKi8KK2ludCBkcm1BZ3BVbmJpbmQoaW50IGZkLCBkcm1faGFuZGxlX3QgaGFuZGxlKQoreworICAgIGRybV9hZ3BfYmluZGluZ190IGI7CisKKyAgICBtZW1jbGVhcihiKTsKKyAgICBiLmhhbmRsZSA9IGhhbmRsZTsKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9BR1BfVU5CSU5ELCAmYikpCisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBHZXQgQUdQIGRyaXZlciBtYWpvciB2ZXJzaW9uIG51bWJlci4KKyAqCisgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yLgorICoKKyAqIFxyZXR1cm4gbWFqb3IgdmVyc2lvbiBudW1iZXIgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLi4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRFJNX0lPQ1RMX0FHUF9JTkZPIGlvY3RsLCBnZXR0aW5nIHRoZQorICogbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGluIGEgZHJtX2FncF9pbmZvIHN0cnVjdHVyZS4KKyAqLworaW50IGRybUFncFZlcnNpb25NYWpvcihpbnQgZmQpCit7CisgICAgZHJtX2FncF9pbmZvX3QgaTsKKworICAgIG1lbWNsZWFyKGkpOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfQUdQX0lORk8sICZpKSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gaS5hZ3BfdmVyc2lvbl9tYWpvcjsKK30KKworCisvKioKKyAqIEdldCBBR1AgZHJpdmVyIG1pbm9yIHZlcnNpb24gbnVtYmVyLgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogXHJldHVybiBtaW5vciB2ZXJzaW9uIG51bWJlciBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIERSTV9JT0NUTF9BR1BfSU5GTyBpb2N0bCwgZ2V0dGluZyB0aGUKKyAqIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBpbiBhIGRybV9hZ3BfaW5mbyBzdHJ1Y3R1cmUuCisgKi8KK2ludCBkcm1BZ3BWZXJzaW9uTWlub3IoaW50IGZkKQoreworICAgIGRybV9hZ3BfaW5mb190IGk7CisKKyAgICBtZW1jbGVhcihpKTsKKworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0FHUF9JTkZPLCAmaSkpCisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgcmV0dXJuIGkuYWdwX3ZlcnNpb25fbWlub3I7Cit9CisKKworLyoqCisgKiBHZXQgQUdQIG1vZGUuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBccmV0dXJuIG1vZGUgb24gc3VjY2Vzcywgb3IgemVybyBvbiBmYWlsdXJlLgorICoKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBEUk1fSU9DVExfQUdQX0lORk8gaW9jdGwsIGdldHRpbmcgdGhlCisgKiBuZWNlc3NhcnkgaW5mb3JtYXRpb24gaW4gYSBkcm1fYWdwX2luZm8gc3RydWN0dXJlLgorICovCit1bnNpZ25lZCBsb25nIGRybUFncEdldE1vZGUoaW50IGZkKQoreworICAgIGRybV9hZ3BfaW5mb190IGk7CisKKyAgICBtZW1jbGVhcihpKTsKKworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0FHUF9JTkZPLCAmaSkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBpLm1vZGU7Cit9CisKKworLyoqCisgKiBHZXQgQUdQIGFwZXJ0dXJlIGJhc2UuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBccmV0dXJuIGFwZXJ0dXJlIGJhc2Ugb24gc3VjY2VzcywgemVybyBvbiBmYWlsdXJlLgorICoKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBEUk1fSU9DVExfQUdQX0lORk8gaW9jdGwsIGdldHRpbmcgdGhlCisgKiBuZWNlc3NhcnkgaW5mb3JtYXRpb24gaW4gYSBkcm1fYWdwX2luZm8gc3RydWN0dXJlLgorICovCit1bnNpZ25lZCBsb25nIGRybUFncEJhc2UoaW50IGZkKQoreworICAgIGRybV9hZ3BfaW5mb190IGk7CisKKyAgICBtZW1jbGVhcihpKTsKKworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0FHUF9JTkZPLCAmaSkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBpLmFwZXJ0dXJlX2Jhc2U7Cit9CisKKworLyoqCisgKiBHZXQgQUdQIGFwZXJ0dXJlIHNpemUuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBccmV0dXJuIGFwZXJ0dXJlIHNpemUgb24gc3VjY2VzcywgemVybyBvbiBmYWlsdXJlLgorICoKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBEUk1fSU9DVExfQUdQX0lORk8gaW9jdGwsIGdldHRpbmcgdGhlCisgKiBuZWNlc3NhcnkgaW5mb3JtYXRpb24gaW4gYSBkcm1fYWdwX2luZm8gc3RydWN0dXJlLgorICovCit1bnNpZ25lZCBsb25nIGRybUFncFNpemUoaW50IGZkKQoreworICAgIGRybV9hZ3BfaW5mb190IGk7CisKKyAgICBtZW1jbGVhcihpKTsKKworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0FHUF9JTkZPLCAmaSkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBpLmFwZXJ0dXJlX3NpemU7Cit9CisKKworLyoqCisgKiBHZXQgdXNlZCBBR1AgbWVtb3J5LgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogXHJldHVybiBtZW1vcnkgdXNlZCBvbiBzdWNjZXNzLCBvciB6ZXJvIG9uIGZhaWx1cmUuCisgKgorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIERSTV9JT0NUTF9BR1BfSU5GTyBpb2N0bCwgZ2V0dGluZyB0aGUKKyAqIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBpbiBhIGRybV9hZ3BfaW5mbyBzdHJ1Y3R1cmUuCisgKi8KK3Vuc2lnbmVkIGxvbmcgZHJtQWdwTWVtb3J5VXNlZChpbnQgZmQpCit7CisgICAgZHJtX2FncF9pbmZvX3QgaTsKKworICAgIG1lbWNsZWFyKGkpOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfQUdQX0lORk8sICZpKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGkubWVtb3J5X3VzZWQ7Cit9CisKKworLyoqCisgKiBHZXQgYXZhaWxhYmxlIEFHUCBtZW1vcnkuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBccmV0dXJuIG1lbW9yeSBhdmFpbGFibGUgb24gc3VjY2Vzcywgb3IgemVybyBvbiBmYWlsdXJlLgorICoKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBEUk1fSU9DVExfQUdQX0lORk8gaW9jdGwsIGdldHRpbmcgdGhlCisgKiBuZWNlc3NhcnkgaW5mb3JtYXRpb24gaW4gYSBkcm1fYWdwX2luZm8gc3RydWN0dXJlLgorICovCit1bnNpZ25lZCBsb25nIGRybUFncE1lbW9yeUF2YWlsKGludCBmZCkKK3sKKyAgICBkcm1fYWdwX2luZm9fdCBpOworCisgICAgbWVtY2xlYXIoaSk7CisKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9BR1BfSU5GTywgJmkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gaS5tZW1vcnlfYWxsb3dlZDsKK30KKworCisvKioKKyAqIEdldCBoYXJkd2FyZSB2ZW5kb3IgSUQuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBccmV0dXJuIHZlbmRvciBJRCBvbiBzdWNjZXNzLCBvciB6ZXJvIG9uIGZhaWx1cmUuCisgKgorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIERSTV9JT0NUTF9BR1BfSU5GTyBpb2N0bCwgZ2V0dGluZyB0aGUKKyAqIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBpbiBhIGRybV9hZ3BfaW5mbyBzdHJ1Y3R1cmUuCisgKi8KK3Vuc2lnbmVkIGludCBkcm1BZ3BWZW5kb3JJZChpbnQgZmQpCit7CisgICAgZHJtX2FncF9pbmZvX3QgaTsKKworICAgIG1lbWNsZWFyKGkpOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfQUdQX0lORk8sICZpKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGkuaWRfdmVuZG9yOworfQorCisKKy8qKgorICogR2V0IGhhcmR3YXJlIGRldmljZSBJRC4KKyAqCisgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yLgorICoKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvciB6ZXJvIG9uIGZhaWx1cmUuCisgKgorICogXGludGVybmFsCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIERSTV9JT0NUTF9BR1BfSU5GTyBpb2N0bCwgZ2V0dGluZyB0aGUKKyAqIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBpbiBhIGRybV9hZ3BfaW5mbyBzdHJ1Y3R1cmUuCisgKi8KK3Vuc2lnbmVkIGludCBkcm1BZ3BEZXZpY2VJZChpbnQgZmQpCit7CisgICAgZHJtX2FncF9pbmZvX3QgaTsKKworICAgIG1lbWNsZWFyKGkpOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfQUdQX0lORk8sICZpKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGkuaWRfZGV2aWNlOworfQorCitpbnQgZHJtU2NhdHRlckdhdGhlckFsbG9jKGludCBmZCwgdW5zaWduZWQgbG9uZyBzaXplLCBkcm1faGFuZGxlX3QgKmhhbmRsZSkKK3sKKyAgICBkcm1fc2NhdHRlcl9nYXRoZXJfdCBzZzsKKworICAgIG1lbWNsZWFyKHNnKTsKKworICAgICpoYW5kbGUgPSAwOworICAgIHNnLnNpemUgICA9IHNpemU7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfU0dfQUxMT0MsICZzZykpCisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgKmhhbmRsZSA9IHNnLmhhbmRsZTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGRybVNjYXR0ZXJHYXRoZXJGcmVlKGludCBmZCwgZHJtX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBkcm1fc2NhdHRlcl9nYXRoZXJfdCBzZzsKKworICAgIG1lbWNsZWFyKHNnKTsKKyAgICBzZy5oYW5kbGUgPSBoYW5kbGU7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfU0dfRlJFRSwgJnNnKSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBXYWl0IGZvciBWQkxBTksuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSB2YmwgcG9pbnRlciB0byBhIGRybVZCbGFuayBzdHJ1Y3R1cmUuCisgKgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRFJNX0lPQ1RMX1dBSVRfVkJMQU5LIGlvY3RsLgorICovCitpbnQgZHJtV2FpdFZCbGFuayhpbnQgZmQsIGRybVZCbGFua1B0ciB2YmwpCit7CisgICAgc3RydWN0IHRpbWVzcGVjIHRpbWVvdXQsIGN1cjsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0aW1lb3V0KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNsb2NrX2dldHRpbWUgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIHRpbWVvdXQudHZfc2VjKys7CisKKyAgICBkbyB7CisgICAgICAgcmV0ID0gaW9jdGwoZmQsIERSTV9JT0NUTF9XQUlUX1ZCTEFOSywgdmJsKTsKKyAgICAgICB2YmwtPnJlcXVlc3QudHlwZSAmPSB+RFJNX1ZCTEFOS19SRUxBVElWRTsKKyAgICAgICBpZiAocmV0ICYmIGVycm5vID09IEVJTlRSKSB7CisgICAgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmY3VyKTsKKyAgICAgICAgICAgLyogVGltZW91dCBhZnRlciAxcyAqLworICAgICAgICAgICBpZiAoY3VyLnR2X3NlYyA+IHRpbWVvdXQudHZfc2VjICsgMSB8fAorICAgICAgICAgICAgICAgKGN1ci50dl9zZWMgPT0gdGltZW91dC50dl9zZWMgJiYgY3VyLnR2X25zZWMgPj0KKyAgICAgICAgICAgICAgICB0aW1lb3V0LnR2X25zZWMpKSB7CisgICAgICAgICAgICAgICAgICAgZXJybm8gPSBFQlVTWTsKKyAgICAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICB9IHdoaWxlIChyZXQgJiYgZXJybm8gPT0gRUlOVFIpOworCitvdXQ6CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGRybUVycm9yKGludCBlcnIsIGNvbnN0IGNoYXIgKmxhYmVsKQoreworICAgIHN3aXRjaCAoZXJyKSB7CisgICAgY2FzZSBEUk1fRVJSX05PX0RFVklDRToKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogbm8gZGV2aWNlXG4iLCBsYWJlbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJNX0VSUl9OT19BQ0NFU1M6CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG5vIGFjY2Vzc1xuIiwgbGFiZWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSTV9FUlJfTk9UX1JPT1Q6CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG5vdCByb290XG4iLCBsYWJlbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJNX0VSUl9JTlZBTElEOgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBpbnZhbGlkIGFyZ3NcbiIsIGxhYmVsKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICBlcnIgPSAtZXJyOworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIlczogZXJyb3IgJWQgKCVzKVxuIiwgbGFiZWwsIGVyciwgc3RyZXJyb3IoZXJyKSApOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworLyoqCisgKiBJbnN0YWxsIElSUSBoYW5kbGVyLgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKiBccGFyYW0gaXJxIElSUSBudW1iZXIuCisgKgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqCisgKiBcaW50ZXJuYWwKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRFJNX0lPQ1RMX0NPTlRST0wgaW9jdGwsIHBhc3NpbmcgdGhlCisgKiBhcmd1bWVudCBpbiBhIGRybV9jb250cm9sIHN0cnVjdHVyZS4KKyAqLworaW50IGRybUN0bEluc3RIYW5kbGVyKGludCBmZCwgaW50IGlycSkKK3sKKyAgICBkcm1fY29udHJvbF90IGN0bDsKKworICAgIG1lbWNsZWFyKGN0bCk7CisgICAgY3RsLmZ1bmMgID0gRFJNX0lOU1RfSEFORExFUjsKKyAgICBjdGwuaXJxICAgPSBpcnE7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfQ09OVFJPTCwgJmN0bCkpCisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBVbmluc3RhbGwgSVJRIGhhbmRsZXIuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBEUk1fSU9DVExfQ09OVFJPTCBpb2N0bCwgcGFzc2luZyB0aGUKKyAqIGFyZ3VtZW50IGluIGEgZHJtX2NvbnRyb2wgc3RydWN0dXJlLgorICovCitpbnQgZHJtQ3RsVW5pbnN0SGFuZGxlcihpbnQgZmQpCit7CisgICAgZHJtX2NvbnRyb2xfdCBjdGw7CisKKyAgICBtZW1jbGVhcihjdGwpOworICAgIGN0bC5mdW5jICA9IERSTV9VTklOU1RfSEFORExFUjsKKyAgICBjdGwuaXJxICAgPSAwOworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0NPTlRST0wsICZjdGwpKQorICAgICAgICByZXR1cm4gLWVycm5vOworICAgIHJldHVybiAwOworfQorCitpbnQgZHJtRmluaXNoKGludCBmZCwgaW50IGNvbnRleHQsIGRybUxvY2tGbGFncyBmbGFncykKK3sKKyAgICBkcm1fbG9ja190IGxvY2s7CisKKyAgICBtZW1jbGVhcihsb2NrKTsKKyAgICBsb2NrLmNvbnRleHQgPSBjb250ZXh0OworICAgIGlmIChmbGFncyAmIERSTV9MT0NLX1JFQURZKSAgICAgIGxvY2suZmxhZ3MgfD0gX0RSTV9MT0NLX1JFQURZOworICAgIGlmIChmbGFncyAmIERSTV9MT0NLX1FVSUVTQ0VOVCkgIGxvY2suZmxhZ3MgfD0gX0RSTV9MT0NLX1FVSUVTQ0VOVDsKKyAgICBpZiAoZmxhZ3MgJiBEUk1fTE9DS19GTFVTSCkgICAgICBsb2NrLmZsYWdzIHw9IF9EUk1fTE9DS19GTFVTSDsKKyAgICBpZiAoZmxhZ3MgJiBEUk1fTE9DS19GTFVTSF9BTEwpICBsb2NrLmZsYWdzIHw9IF9EUk1fTE9DS19GTFVTSF9BTEw7CisgICAgaWYgKGZsYWdzICYgRFJNX0hBTFRfQUxMX1FVRVVFUykgbG9jay5mbGFncyB8PSBfRFJNX0hBTFRfQUxMX1FVRVVFUzsKKyAgICBpZiAoZmxhZ3MgJiBEUk1fSEFMVF9DVVJfUVVFVUVTKSBsb2NrLmZsYWdzIHw9IF9EUk1fSEFMVF9DVVJfUVVFVUVTOworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0ZJTklTSCwgJmxvY2spKQorICAgICAgICByZXR1cm4gLWVycm5vOworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEdldCBJUlEgZnJvbSBidXMgSUQuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSBidXNudW0gYnVzIG51bWJlci4KKyAqIFxwYXJhbSBkZXZudW0gZGV2aWNlIG51bWJlci4KKyAqIFxwYXJhbSBmdW5jbnVtIGZ1bmN0aW9uIG51bWJlci4KKyAqCisgKiBccmV0dXJuIElSUSBudW1iZXIgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIFxpbnRlcm5hbAorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBEUk1fSU9DVExfSVJRX0JVU0lEIGlvY3RsLCBwYXNzaW5nIHRoZQorICogYXJndW1lbnRzIGluIGEgZHJtX2lycV9idXNpZCBzdHJ1Y3R1cmUuCisgKi8KK2ludCBkcm1HZXRJbnRlcnJ1cHRGcm9tQnVzSUQoaW50IGZkLCBpbnQgYnVzbnVtLCBpbnQgZGV2bnVtLCBpbnQgZnVuY251bSkKK3sKKyAgICBkcm1faXJxX2J1c2lkX3QgcDsKKworICAgIG1lbWNsZWFyKHApOworICAgIHAuYnVzbnVtICA9IGJ1c251bTsKKyAgICBwLmRldm51bSAgPSBkZXZudW07CisgICAgcC5mdW5jbnVtID0gZnVuY251bTsKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9JUlFfQlVTSUQsICZwKSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gcC5pcnE7Cit9CisKK2ludCBkcm1BZGRDb250ZXh0VGFnKGludCBmZCwgZHJtX2NvbnRleHRfdCBjb250ZXh0LCB2b2lkICp0YWcpCit7CisgICAgZHJtSGFzaEVudHJ5ICAqZW50cnkgPSBkcm1HZXRFbnRyeShmZCk7CisKKyAgICBpZiAoZHJtSGFzaEluc2VydChlbnRyeS0+dGFnVGFibGUsIGNvbnRleHQsIHRhZykpIHsKKyAgICAgICAgZHJtSGFzaERlbGV0ZShlbnRyeS0+dGFnVGFibGUsIGNvbnRleHQpOworICAgICAgICBkcm1IYXNoSW5zZXJ0KGVudHJ5LT50YWdUYWJsZSwgY29udGV4dCwgdGFnKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1EZWxDb250ZXh0VGFnKGludCBmZCwgZHJtX2NvbnRleHRfdCBjb250ZXh0KQoreworICAgIGRybUhhc2hFbnRyeSAgKmVudHJ5ID0gZHJtR2V0RW50cnkoZmQpOworCisgICAgcmV0dXJuIGRybUhhc2hEZWxldGUoZW50cnktPnRhZ1RhYmxlLCBjb250ZXh0KTsKK30KKwordm9pZCAqZHJtR2V0Q29udGV4dFRhZyhpbnQgZmQsIGRybV9jb250ZXh0X3QgY29udGV4dCkKK3sKKyAgICBkcm1IYXNoRW50cnkgICplbnRyeSA9IGRybUdldEVudHJ5KGZkKTsKKyAgICB2b2lkICAgICAgICAgICp2YWx1ZTsKKworICAgIGlmIChkcm1IYXNoTG9va3VwKGVudHJ5LT50YWdUYWJsZSwgY29udGV4dCwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK2ludCBkcm1BZGRDb250ZXh0UHJpdmF0ZU1hcHBpbmcoaW50IGZkLCBkcm1fY29udGV4dF90IGN0eF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJtX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBkcm1fY3R4X3ByaXZfbWFwX3QgbWFwOworCisgICAgbWVtY2xlYXIobWFwKTsKKyAgICBtYXAuY3R4X2lkID0gY3R4X2lkOworICAgIG1hcC5oYW5kbGUgPSAodm9pZCAqKSh1aW50cHRyX3QpaGFuZGxlOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfU0VUX1NBUkVBX0NUWCwgJm1hcCkpCisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1HZXRDb250ZXh0UHJpdmF0ZU1hcHBpbmcoaW50IGZkLCBkcm1fY29udGV4dF90IGN0eF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJtX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgZHJtX2N0eF9wcml2X21hcF90IG1hcDsKKworICAgIG1lbWNsZWFyKG1hcCk7CisgICAgbWFwLmN0eF9pZCA9IGN0eF9pZDsKKworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0dFVF9TQVJFQV9DVFgsICZtYXApKQorICAgICAgICByZXR1cm4gLWVycm5vOworICAgIGlmIChoYW5kbGUpCisgICAgICAgICpoYW5kbGUgPSAoZHJtX2hhbmRsZV90KSh1aW50cHRyX3QpbWFwLmhhbmRsZTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZHJtR2V0TWFwKGludCBmZCwgaW50IGlkeCwgZHJtX2hhbmRsZV90ICpvZmZzZXQsIGRybVNpemUgKnNpemUsCisgICAgICAgICAgICAgIGRybU1hcFR5cGUgKnR5cGUsIGRybU1hcEZsYWdzICpmbGFncywgZHJtX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgIGludCAqbXRycikKK3sKKyAgICBkcm1fbWFwX3QgbWFwOworCisgICAgbWVtY2xlYXIobWFwKTsKKyAgICBtYXAub2Zmc2V0ID0gaWR4OworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0dFVF9NQVAsICZtYXApKQorICAgICAgICByZXR1cm4gLWVycm5vOworICAgICpvZmZzZXQgPSBtYXAub2Zmc2V0OworICAgICpzaXplICAgPSBtYXAuc2l6ZTsKKyAgICAqdHlwZSAgID0gbWFwLnR5cGU7CisgICAgKmZsYWdzICA9IG1hcC5mbGFnczsKKyAgICAqaGFuZGxlID0gKHVuc2lnbmVkIGxvbmcpbWFwLmhhbmRsZTsKKyAgICAqbXRyciAgID0gbWFwLm10cnI7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1HZXRDbGllbnQoaW50IGZkLCBpbnQgaWR4LCBpbnQgKmF1dGgsIGludCAqcGlkLCBpbnQgKnVpZCwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqbWFnaWMsIHVuc2lnbmVkIGxvbmcgKmlvY3MpCit7CisgICAgZHJtX2NsaWVudF90IGNsaWVudDsKKworICAgIG1lbWNsZWFyKGNsaWVudCk7CisgICAgY2xpZW50LmlkeCA9IGlkeDsKKyAgICBpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9HRVRfQ0xJRU5ULCAmY2xpZW50KSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICAqYXV0aCAgICAgID0gY2xpZW50LmF1dGg7CisgICAgKnBpZCAgICAgICA9IGNsaWVudC5waWQ7CisgICAgKnVpZCAgICAgICA9IGNsaWVudC51aWQ7CisgICAgKm1hZ2ljICAgICA9IGNsaWVudC5tYWdpYzsKKyAgICAqaW9jcyAgICAgID0gY2xpZW50LmlvY3M7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1HZXRTdGF0cyhpbnQgZmQsIGRybVN0YXRzVCAqc3RhdHMpCit7CisgICAgZHJtX3N0YXRzX3QgczsKKyAgICB1bnNpZ25lZCAgICBpOworCisgICAgbWVtY2xlYXIocyk7CisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfR0VUX1NUQVRTLCAmcykpCisgICAgICAgIHJldHVybiAtZXJybm87CisKKyAgICBzdGF0cy0+Y291bnQgPSAwOworICAgIG1lbXNldChzdGF0cywgMCwgc2l6ZW9mKCpzdGF0cykpOworICAgIGlmIChzLmNvdW50ID4gc2l6ZW9mKHN0YXRzLT5kYXRhKS9zaXplb2Yoc3RhdHMtPmRhdGFbMF0pKQorICAgICAgICByZXR1cm4gLTE7CisKKyNkZWZpbmUgU0VUX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRzLT5kYXRhW2ldLmxvbmdfZm9ybWF0ID0gIiUtMjAuMjBzIjsgICBcCisgICAgc3RhdHMtPmRhdGFbaV0ucmF0ZV9mb3JtYXQgPSAiJTguOHMiOyAgICAgIFwKKyAgICBzdGF0cy0+ZGF0YVtpXS5pc3ZhbHVlICAgICA9IDE7ICAgICAgICAgICAgXAorICAgIHN0YXRzLT5kYXRhW2ldLnZlcmJvc2UgICAgID0gMAorCisjZGVmaW5lIFNFVF9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0cy0+ZGF0YVtpXS5sb25nX2Zvcm1hdCA9ICIlLTIwLjIwcyI7ICAgXAorICAgIHN0YXRzLT5kYXRhW2ldLnJhdGVfZm9ybWF0ID0gIiU1LjVzIjsgICAgICBcCisgICAgc3RhdHMtPmRhdGFbaV0uaXN2YWx1ZSAgICAgPSAwOyAgICAgICAgICAgIFwKKyAgICBzdGF0cy0+ZGF0YVtpXS5tdWx0X25hbWVzICA9ICJrZ20iOyAgICAgICAgXAorICAgIHN0YXRzLT5kYXRhW2ldLm11bHQgICAgICAgID0gMTAwMDsgICAgICAgICBcCisgICAgc3RhdHMtPmRhdGFbaV0udmVyYm9zZSAgICAgPSAwCisKKyNkZWZpbmUgU0VUX0JZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRzLT5kYXRhW2ldLmxvbmdfZm9ybWF0ID0gIiUtMjAuMjBzIjsgICBcCisgICAgc3RhdHMtPmRhdGFbaV0ucmF0ZV9mb3JtYXQgPSAiJTUuNXMiOyAgICAgIFwKKyAgICBzdGF0cy0+ZGF0YVtpXS5pc3ZhbHVlICAgICA9IDA7ICAgICAgICAgICAgXAorICAgIHN0YXRzLT5kYXRhW2ldLm11bHRfbmFtZXMgID0gIktHTSI7ICAgICAgICBcCisgICAgc3RhdHMtPmRhdGFbaV0ubXVsdCAgICAgICAgPSAxMDI0OyAgICAgICAgIFwKKyAgICBzdGF0cy0+ZGF0YVtpXS52ZXJib3NlICAgICA9IDAKKworCisgICAgc3RhdHMtPmNvdW50ID0gcy5jb3VudDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy5jb3VudDsgaSsrKSB7CisgICAgICAgIHN0YXRzLT5kYXRhW2ldLnZhbHVlID0gcy5kYXRhW2ldLnZhbHVlOworICAgICAgICBzd2l0Y2ggKHMuZGF0YVtpXS50eXBlKSB7CisgICAgICAgIGNhc2UgX0RSTV9TVEFUX0xPQ0s6CisgICAgICAgICAgICBzdGF0cy0+ZGF0YVtpXS5sb25nX25hbWUgPSAiTG9jayI7CisgICAgICAgICAgICBzdGF0cy0+ZGF0YVtpXS5yYXRlX25hbWUgPSAiTG9jayI7CisgICAgICAgICAgICBTRVRfVkFMVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBfRFJNX1NUQVRfT1BFTlM6CisgICAgICAgICAgICBzdGF0cy0+ZGF0YVtpXS5sb25nX25hbWUgPSAiT3BlbnMiOworICAgICAgICAgICAgc3RhdHMtPmRhdGFbaV0ucmF0ZV9uYW1lID0gIk8iOworICAgICAgICAgICAgU0VUX0NPVU5UOworICAgICAgICAgICAgc3RhdHMtPmRhdGFbaV0udmVyYm9zZSAgID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIF9EUk1fU1RBVF9DTE9TRVM6CisgICAgICAgICAgICBzdGF0cy0+ZGF0YVtpXS5sb25nX25hbWUgPSAiQ2xvc2VzIjsKKyAgICAgICAgICAgIHN0YXRzLT5kYXRhW2ldLnJhdGVfbmFtZSA9ICJMb2NrIjsKKyAgICAgICAgICAgIFNFVF9DT1VOVDsKKyAgICAgICAgICAgIHN0YXRzLT5kYXRhW2ldLnZlcmJvc2UgICA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBfRFJNX1NUQVRfSU9DVExTOgorICAgICAgICAgICAgc3RhdHMtPmRhdGFbaV0ubG9uZ19uYW1lID0gIklvY3RscyI7CisgICAgICAgICAgICBzdGF0cy0+ZGF0YVtpXS5yYXRlX25hbWUgPSAiSW9jL3MiOworICAgICAgICAgICAgU0VUX0NPVU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgX0RSTV9TVEFUX0xPQ0tTOgorICAgICAgICAgICAgc3RhdHMtPmRhdGFbaV0ubG9uZ19uYW1lID0gIkxvY2tzIjsKKyAgICAgICAgICAgIHN0YXRzLT5kYXRhW2ldLnJhdGVfbmFtZSA9ICJMY2svcyI7CisgICAgICAgICAgICBTRVRfQ09VTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBfRFJNX1NUQVRfVU5MT0NLUzoKKyAgICAgICAgICAgIHN0YXRzLT5kYXRhW2ldLmxvbmdfbmFtZSA9ICJVbmxvY2tzIjsKKyAgICAgICAgICAgIHN0YXRzLT5kYXRhW2ldLnJhdGVfbmFtZSA9ICJVbmwvcyI7CisgICAgICAgICAgICBTRVRfQ09VTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBfRFJNX1NUQVRfSVJROgorICAgICAgICAgICAgc3RhdHMtPmRhdGFbaV0ubG9uZ19uYW1lID0gIklSUXMiOworICAgICAgICAgICAgc3RhdHMtPmRhdGFbaV0ucmF0ZV9uYW1lID0gIklSUS9zIjsKKyAgICAgICAgICAgIFNFVF9DT1VOVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIF9EUk1fU1RBVF9QUklNQVJZOgorICAgICAgICAgICAgc3RhdHMtPmRhdGFbaV0ubG9uZ19uYW1lID0gIlByaW1hcnkgQnl0ZXMiOworICAgICAgICAgICAgc3RhdHMtPmRhdGFbaV0ucmF0ZV9uYW1lID0gIlBCL3MiOworICAgICAgICAgICAgU0VUX0JZVEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBfRFJNX1NUQVRfU0VDT05EQVJZOgorICAgICAgICAgICAgc3RhdHMtPmRhdGFbaV0ubG9uZ19uYW1lID0gIlNlY29uZGFyeSBCeXRlcyI7CisgICAgICAgICAgICBzdGF0cy0+ZGF0YVtpXS5yYXRlX25hbWUgPSAiU0IvcyI7CisgICAgICAgICAgICBTRVRfQllURTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIF9EUk1fU1RBVF9ETUE6CisgICAgICAgICAgICBzdGF0cy0+ZGF0YVtpXS5sb25nX25hbWUgPSAiRE1BIjsKKyAgICAgICAgICAgIHN0YXRzLT5kYXRhW2ldLnJhdGVfbmFtZSA9ICJETUEvcyI7CisgICAgICAgICAgICBTRVRfQ09VTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBfRFJNX1NUQVRfU1BFQ0lBTDoKKyAgICAgICAgICAgIHN0YXRzLT5kYXRhW2ldLmxvbmdfbmFtZSA9ICJTcGVjaWFsIERNQSI7CisgICAgICAgICAgICBzdGF0cy0+ZGF0YVtpXS5yYXRlX25hbWUgPSAiZG1hL3MiOworICAgICAgICAgICAgU0VUX0NPVU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgX0RSTV9TVEFUX01JU1NFRDoKKyAgICAgICAgICAgIHN0YXRzLT5kYXRhW2ldLmxvbmdfbmFtZSA9ICJNaXNzIjsKKyAgICAgICAgICAgIHN0YXRzLT5kYXRhW2ldLnJhdGVfbmFtZSA9ICJNcy9zIjsKKyAgICAgICAgICAgIFNFVF9DT1VOVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIF9EUk1fU1RBVF9WQUxVRToKKyAgICAgICAgICAgIHN0YXRzLT5kYXRhW2ldLmxvbmdfbmFtZSA9ICJWYWx1ZSI7CisgICAgICAgICAgICBzdGF0cy0+ZGF0YVtpXS5yYXRlX25hbWUgPSAiVmFsdWUiOworICAgICAgICAgICAgU0VUX1ZBTFVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgX0RSTV9TVEFUX0JZVEU6CisgICAgICAgICAgICBzdGF0cy0+ZGF0YVtpXS5sb25nX25hbWUgPSAiQnl0ZXMiOworICAgICAgICAgICAgc3RhdHMtPmRhdGFbaV0ucmF0ZV9uYW1lID0gIkIvcyI7CisgICAgICAgICAgICBTRVRfQllURTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIF9EUk1fU1RBVF9DT1VOVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHN0YXRzLT5kYXRhW2ldLmxvbmdfbmFtZSA9ICJDb3VudCI7CisgICAgICAgICAgICBzdGF0cy0+ZGF0YVtpXS5yYXRlX25hbWUgPSAiQ250L3MiOworICAgICAgICAgICAgU0VUX0NPVU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogSXNzdWUgYSBzZXQtdmVyc2lvbiBpb2N0bC4KKyAqCisgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yLgorICogXHBhcmFtIGRybUNvbW1hbmRJbmRleCBjb21tYW5kIGluZGV4CisgKiBccGFyYW0gZGF0YSBzb3VyY2UgcG9pbnRlciBvZiB0aGUgZGF0YSB0byBiZSByZWFkIGFuZCB3cml0dGVuLgorICogXHBhcmFtIHNpemUgc2l6ZSBvZiB0aGUgZGF0YSB0byBiZSByZWFkIGFuZCB3cml0dGVuLgorICoKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogXGludGVybmFsCisgKiBJdCBpc3N1ZXMgYSByZWFkLXdyaXRlIGlvY3RsIGdpdmVuIGJ5CisgKiBcY29kZSBEUk1fQ09NTUFORF9CQVNFICsgZHJtQ29tbWFuZEluZGV4IFxlbmRjb2RlLgorICovCitpbnQgZHJtU2V0SW50ZXJmYWNlVmVyc2lvbihpbnQgZmQsIGRybVNldFZlcnNpb24gKnZlcnNpb24pCit7CisgICAgaW50IHJldGNvZGUgPSAwOworICAgIGRybV9zZXRfdmVyc2lvbl90IHN2OworCisgICAgbWVtY2xlYXIoc3YpOworICAgIHN2LmRybV9kaV9tYWpvciA9IHZlcnNpb24tPmRybV9kaV9tYWpvcjsKKyAgICBzdi5kcm1fZGlfbWlub3IgPSB2ZXJzaW9uLT5kcm1fZGlfbWlub3I7CisgICAgc3YuZHJtX2RkX21ham9yID0gdmVyc2lvbi0+ZHJtX2RkX21ham9yOworICAgIHN2LmRybV9kZF9taW5vciA9IHZlcnNpb24tPmRybV9kZF9taW5vcjsKKworICAgIGlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX1NFVF9WRVJTSU9OLCAmc3YpKSB7CisgICAgICAgIHJldGNvZGUgPSAtZXJybm87CisgICAgfQorCisgICAgdmVyc2lvbi0+ZHJtX2RpX21ham9yID0gc3YuZHJtX2RpX21ham9yOworICAgIHZlcnNpb24tPmRybV9kaV9taW5vciA9IHN2LmRybV9kaV9taW5vcjsKKyAgICB2ZXJzaW9uLT5kcm1fZGRfbWFqb3IgPSBzdi5kcm1fZGRfbWFqb3I7CisgICAgdmVyc2lvbi0+ZHJtX2RkX21pbm9yID0gc3YuZHJtX2RkX21pbm9yOworCisgICAgcmV0dXJuIHJldGNvZGU7Cit9CisKKy8qKgorICogU2VuZCBhIGRldmljZS1zcGVjaWZpYyBjb21tYW5kLgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKiBccGFyYW0gZHJtQ29tbWFuZEluZGV4IGNvbW1hbmQgaW5kZXgKKyAqCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIFxpbnRlcm5hbAorICogSXQgaXNzdWVzIGEgaW9jdGwgZ2l2ZW4gYnkKKyAqIFxjb2RlIERSTV9DT01NQU5EX0JBU0UgKyBkcm1Db21tYW5kSW5kZXggXGVuZGNvZGUuCisgKi8KK2ludCBkcm1Db21tYW5kTm9uZShpbnQgZmQsIHVuc2lnbmVkIGxvbmcgZHJtQ29tbWFuZEluZGV4KQoreworICAgIHVuc2lnbmVkIGxvbmcgcmVxdWVzdDsKKworICAgIHJlcXVlc3QgPSBEUk1fSU8oIERSTV9DT01NQU5EX0JBU0UgKyBkcm1Db21tYW5kSW5kZXgpOworCisgICAgaWYgKGRybUlvY3RsKGZkLCByZXF1ZXN0LCBOVUxMKSkgeworICAgICAgICByZXR1cm4gLWVycm5vOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvKioKKyAqIFNlbmQgYSBkZXZpY2Utc3BlY2lmaWMgcmVhZCBjb21tYW5kLgorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IuCisgKiBccGFyYW0gZHJtQ29tbWFuZEluZGV4IGNvbW1hbmQgaW5kZXgKKyAqIFxwYXJhbSBkYXRhIGRlc3RpbmF0aW9uIHBvaW50ZXIgb2YgdGhlIGRhdGEgdG8gYmUgcmVhZC4KKyAqIFxwYXJhbSBzaXplIHNpemUgb2YgdGhlIGRhdGEgdG8gYmUgcmVhZC4KKyAqCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIFxpbnRlcm5hbAorICogSXQgaXNzdWVzIGEgcmVhZCBpb2N0bCBnaXZlbiBieQorICogXGNvZGUgRFJNX0NPTU1BTkRfQkFTRSArIGRybUNvbW1hbmRJbmRleCBcZW5kY29kZS4KKyAqLworaW50IGRybUNvbW1hbmRSZWFkKGludCBmZCwgdW5zaWduZWQgbG9uZyBkcm1Db21tYW5kSW5kZXgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzaXplKQoreworICAgIHVuc2lnbmVkIGxvbmcgcmVxdWVzdDsKKworICAgIHJlcXVlc3QgPSBEUk1fSU9DKCBEUk1fSU9DX1JFQUQsIERSTV9JT0NUTF9CQVNFLAorICAgICAgICBEUk1fQ09NTUFORF9CQVNFICsgZHJtQ29tbWFuZEluZGV4LCBzaXplKTsKKworICAgIGlmIChkcm1Jb2N0bChmZCwgcmVxdWVzdCwgZGF0YSkpIHsKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBTZW5kIGEgZGV2aWNlLXNwZWNpZmljIHdyaXRlIGNvbW1hbmQuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSBkcm1Db21tYW5kSW5kZXggY29tbWFuZCBpbmRleAorICogXHBhcmFtIGRhdGEgc291cmNlIHBvaW50ZXIgb2YgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi4KKyAqIFxwYXJhbSBzaXplIHNpemUgb2YgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi4KKyAqCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIFxpbnRlcm5hbAorICogSXQgaXNzdWVzIGEgd3JpdGUgaW9jdGwgZ2l2ZW4gYnkKKyAqIFxjb2RlIERSTV9DT01NQU5EX0JBU0UgKyBkcm1Db21tYW5kSW5kZXggXGVuZGNvZGUuCisgKi8KK2ludCBkcm1Db21tYW5kV3JpdGUoaW50IGZkLCB1bnNpZ25lZCBsb25nIGRybUNvbW1hbmRJbmRleCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzaXplKQoreworICAgIHVuc2lnbmVkIGxvbmcgcmVxdWVzdDsKKworICAgIHJlcXVlc3QgPSBEUk1fSU9DKCBEUk1fSU9DX1dSSVRFLCBEUk1fSU9DVExfQkFTRSwKKyAgICAgICAgRFJNX0NPTU1BTkRfQkFTRSArIGRybUNvbW1hbmRJbmRleCwgc2l6ZSk7CisKKyAgICBpZiAoZHJtSW9jdGwoZmQsIHJlcXVlc3QsIGRhdGEpKSB7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKy8qKgorICogU2VuZCBhIGRldmljZS1zcGVjaWZpYyByZWFkLXdyaXRlIGNvbW1hbmQuCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFxwYXJhbSBkcm1Db21tYW5kSW5kZXggY29tbWFuZCBpbmRleAorICogXHBhcmFtIGRhdGEgc291cmNlIHBvaW50ZXIgb2YgdGhlIGRhdGEgdG8gYmUgcmVhZCBhbmQgd3JpdHRlbi4KKyAqIFxwYXJhbSBzaXplIHNpemUgb2YgdGhlIGRhdGEgdG8gYmUgcmVhZCBhbmQgd3JpdHRlbi4KKyAqCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIFxpbnRlcm5hbAorICogSXQgaXNzdWVzIGEgcmVhZC13cml0ZSBpb2N0bCBnaXZlbiBieQorICogXGNvZGUgRFJNX0NPTU1BTkRfQkFTRSArIGRybUNvbW1hbmRJbmRleCBcZW5kY29kZS4KKyAqLworaW50IGRybUNvbW1hbmRXcml0ZVJlYWQoaW50IGZkLCB1bnNpZ25lZCBsb25nIGRybUNvbW1hbmRJbmRleCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBsb25nIHJlcXVlc3Q7CisKKyAgICByZXF1ZXN0ID0gRFJNX0lPQyggRFJNX0lPQ19SRUFEfERSTV9JT0NfV1JJVEUsIERSTV9JT0NUTF9CQVNFLAorICAgICAgICBEUk1fQ09NTUFORF9CQVNFICsgZHJtQ29tbWFuZEluZGV4LCBzaXplKTsKKworICAgIGlmIChkcm1Jb2N0bChmZCwgcmVxdWVzdCwgZGF0YSkpCisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRFJNX01BWF9GRFMgMTYKK3N0YXRpYyBzdHJ1Y3QgeworICAgIGNoYXIgKkJ1c0lEOworICAgIGludCBmZDsKKyAgICBpbnQgcmVmY291bnQ7CisgICAgaW50IHR5cGU7Cit9IGNvbm5lY3Rpb25bRFJNX01BWF9GRFNdOworCitzdGF0aWMgaW50IG5yX2ZkcyA9IDA7CisKK2ludCBkcm1PcGVuT25jZSh2b2lkICp1bnVzZWQsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqQnVzSUQsCisgICAgICAgICAgICAgICAgaW50ICpuZXdseW9wZW5lZCkKK3sKKyAgICByZXR1cm4gZHJtT3Blbk9uY2VXaXRoVHlwZShCdXNJRCwgbmV3bHlvcGVuZWQsIERSTV9OT0RFX1BSSU1BUlkpOworfQorCitpbnQgZHJtT3Blbk9uY2VXaXRoVHlwZShjb25zdCBjaGFyICpCdXNJRCwgaW50ICpuZXdseW9wZW5lZCwgaW50IHR5cGUpCit7CisgICAgaW50IGk7CisgICAgaW50IGZkOworCisgICAgZm9yIChpID0gMDsgaSA8IG5yX2ZkczsgaSsrKQorICAgICAgICBpZiAoKHN0cmNtcChCdXNJRCwgY29ubmVjdGlvbltpXS5CdXNJRCkgPT0gMCkgJiYKKyAgICAgICAgICAgIChjb25uZWN0aW9uW2ldLnR5cGUgPT0gdHlwZSkpIHsKKyAgICAgICAgICAgIGNvbm5lY3Rpb25baV0ucmVmY291bnQrKzsKKyAgICAgICAgICAgICpuZXdseW9wZW5lZCA9IDA7CisgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbltpXS5mZDsKKyAgICAgICAgfQorCisgICAgZmQgPSBkcm1PcGVuV2l0aFR5cGUoTlVMTCwgQnVzSUQsIHR5cGUpOworICAgIGlmIChmZCA8IDAgfHwgbnJfZmRzID09IERSTV9NQVhfRkRTKQorICAgICAgICByZXR1cm4gZmQ7CisKKyAgICBjb25uZWN0aW9uW25yX2Zkc10uQnVzSUQgPSBzdHJkdXAoQnVzSUQpOworICAgIGNvbm5lY3Rpb25bbnJfZmRzXS5mZCA9IGZkOworICAgIGNvbm5lY3Rpb25bbnJfZmRzXS5yZWZjb3VudCA9IDE7CisgICAgY29ubmVjdGlvbltucl9mZHNdLnR5cGUgPSB0eXBlOworICAgICpuZXdseW9wZW5lZCA9IDE7CisKKyAgICBpZiAoMCkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJzYXZlZCBjb25uZWN0aW9uICVkIGZvciAlcyAlZFxuIiwKKyAgICAgICAgICAgICAgICBucl9mZHMsIGNvbm5lY3Rpb25bbnJfZmRzXS5CdXNJRCwKKyAgICAgICAgICAgICAgICBzdHJjbXAoQnVzSUQsIGNvbm5lY3Rpb25bbnJfZmRzXS5CdXNJRCkpOworCisgICAgbnJfZmRzKys7CisKKyAgICByZXR1cm4gZmQ7Cit9CisKK3ZvaWQgZHJtQ2xvc2VPbmNlKGludCBmZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBucl9mZHM7IGkrKykgeworICAgICAgICBpZiAoZmQgPT0gY29ubmVjdGlvbltpXS5mZCkgeworICAgICAgICAgICAgaWYgKC0tY29ubmVjdGlvbltpXS5yZWZjb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgZHJtQ2xvc2UoY29ubmVjdGlvbltpXS5mZCk7CisgICAgICAgICAgICAgICAgZnJlZShjb25uZWN0aW9uW2ldLkJ1c0lEKTsKKworICAgICAgICAgICAgICAgIGlmIChpIDwgLS1ucl9mZHMpCisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25baV0gPSBjb25uZWN0aW9uW25yX2Zkc107CisKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBkcm1TZXRNYXN0ZXIoaW50IGZkKQoreworICAgICAgICByZXR1cm4gZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9TRVRfTUFTVEVSLCBOVUxMKTsKK30KKworaW50IGRybURyb3BNYXN0ZXIoaW50IGZkKQoreworICAgICAgICByZXR1cm4gZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9EUk9QX01BU1RFUiwgTlVMTCk7Cit9CisKK2NoYXIgKmRybUdldERldmljZU5hbWVGcm9tRmQoaW50IGZkKQoreworICAgIGNoYXIgbmFtZVsxMjhdOworICAgIHN0cnVjdCBzdGF0IHNidWY7CisgICAgZGV2X3QgZDsKKyAgICBpbnQgaTsKKworICAgIC8qIFRoZSB3aG9sZSBkcm1PcGVuIHRoaW5nIGlzIGEgZmlhc2NvIGFuZCB3ZSBuZWVkIHRvIGZpbmQgYSB3YXkKKyAgICAgKiBiYWNrIHRvIGp1c3QgdXNpbmcgb3BlbigyKS4gIEZvciBub3csIGhvd2V2ZXIsIGxldHMganVzdCBtYWtlCisgICAgICogdGhpbmdzIHdvcnNlIHdpdGggZXZlbiBtb3JlIGFkIGhvYyBkaXJlY3Rvcnkgd2Fsa2luZyBjb2RlIHRvCisgICAgICogZGlzY292ZXIgdGhlIGRldmljZSBmaWxlIG5hbWUuICovCisKKyAgICBmc3RhdChmZCwgJnNidWYpOworICAgIGQgPSBzYnVmLnN0X3JkZXY7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRFJNX01BWF9NSU5PUjsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZiBuYW1lLCBEUk1fREVWX05BTUUsIERSTV9ESVJfTkFNRSwgaSk7CisgICAgICAgIGlmIChzdGF0KG5hbWUsICZzYnVmKSA9PSAwICYmIHNidWYuc3RfcmRldiA9PSBkKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpID09IERSTV9NQVhfTUlOT1IpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIHN0cmR1cChuYW1lKTsKK30KKworaW50IGRybUdldE5vZGVUeXBlRnJvbUZkKGludCBmZCkKK3sKKyAgICBzdHJ1Y3Qgc3RhdCBzYnVmOworICAgIGludCBtYWosIG1pbiwgdHlwZTsKKworICAgIGlmIChmc3RhdChmZCwgJnNidWYpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBtYWogPSBtYWpvcihzYnVmLnN0X3JkZXYpOworICAgIG1pbiA9IG1pbm9yKHNidWYuc3RfcmRldik7CisKKyAgICBpZiAobWFqICE9IERSTV9NQUpPUiB8fCAhU19JU0NIUihzYnVmLnN0X21vZGUpKSB7CisgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgdHlwZSA9IGRybUdldE1pbm9yVHlwZShtaW4pOworICAgIGlmICh0eXBlID09IC0xKQorICAgICAgICBlcnJubyA9IEVOT0RFVjsKKyAgICByZXR1cm4gdHlwZTsKK30KKworaW50IGRybVByaW1lSGFuZGxlVG9GRChpbnQgZmQsIHVpbnQzMl90IGhhbmRsZSwgdWludDMyX3QgZmxhZ3MsIGludCAqcHJpbWVfZmQpCit7CisgICAgc3RydWN0IGRybV9wcmltZV9oYW5kbGUgYXJnczsKKyAgICBpbnQgcmV0OworCisgICAgbWVtY2xlYXIoYXJncyk7CisgICAgYXJncy5mZCA9IC0xOworICAgIGFyZ3MuaGFuZGxlID0gaGFuZGxlOworICAgIGFyZ3MuZmxhZ3MgPSBmbGFnczsKKyAgICByZXQgPSBkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX1BSSU1FX0hBTkRMRV9UT19GRCwgJmFyZ3MpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAqcHJpbWVfZmQgPSBhcmdzLmZkOworICAgIHJldHVybiAwOworfQorCitpbnQgZHJtUHJpbWVGRFRvSGFuZGxlKGludCBmZCwgaW50IHByaW1lX2ZkLCB1aW50MzJfdCAqaGFuZGxlKQoreworICAgIHN0cnVjdCBkcm1fcHJpbWVfaGFuZGxlIGFyZ3M7CisgICAgaW50IHJldDsKKworICAgIG1lbWNsZWFyKGFyZ3MpOworICAgIGFyZ3MuZmQgPSBwcmltZV9mZDsKKyAgICByZXQgPSBkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX1BSSU1FX0ZEX1RPX0hBTkRMRSwgJmFyZ3MpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAqaGFuZGxlID0gYXJncy5oYW5kbGU7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICpkcm1HZXRNaW5vck5hbWVGb3JGRChpbnQgZmQsIGludCB0eXBlKQoreworI2lmZGVmIF9fbGludXhfXworICAgIERJUiAqc3lzZGlyOworICAgIHN0cnVjdCBkaXJlbnQgKnBlbnQsICplbnQ7CisgICAgc3RydWN0IHN0YXQgc2J1ZjsKKyAgICBjb25zdCBjaGFyICpuYW1lID0gZHJtR2V0TWlub3JOYW1lKHR5cGUpOworICAgIGludCBsZW47CisgICAgY2hhciBkZXZfbmFtZVs2NF0sIGJ1Zls2NF07CisgICAgbG9uZyBuYW1lX21heDsKKyAgICBpbnQgbWFqLCBtaW47CisKKyAgICBpZiAoIW5hbWUpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgbGVuID0gc3RybGVuKG5hbWUpOworCisgICAgaWYgKGZzdGF0KGZkLCAmc2J1ZikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgbWFqID0gbWFqb3Ioc2J1Zi5zdF9yZGV2KTsKKyAgICBtaW4gPSBtaW5vcihzYnVmLnN0X3JkZXYpOworCisgICAgaWYgKG1haiAhPSBEUk1fTUFKT1IgfHwgIVNfSVNDSFIoc2J1Zi5zdF9tb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiL3N5cy9kZXYvY2hhci8lZDolZC9kZXZpY2UvZHJtIiwgbWFqLCBtaW4pOworCisgICAgc3lzZGlyID0gb3BlbmRpcihidWYpOworICAgIGlmICghc3lzZGlyKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG5hbWVfbWF4ID0gZnBhdGhjb25mKGRpcmZkKHN5c2RpciksIF9QQ19OQU1FX01BWCk7CisgICAgaWYgKG5hbWVfbWF4ID09IC0xKQorICAgICAgICBnb3RvIG91dF9jbG9zZV9kaXI7CisKKyAgICBwZW50ID0gbWFsbG9jKG9mZnNldG9mKHN0cnVjdCBkaXJlbnQsIGRfbmFtZSkgKyBuYW1lX21heCArIDEpOworICAgIGlmIChwZW50ID09IE5VTEwpCisgICAgICAgICBnb3RvIG91dF9jbG9zZV9kaXI7CisKKyAgICB3aGlsZSAocmVhZGRpcl9yKHN5c2RpciwgcGVudCwgJmVudCkgPT0gMCAmJiBlbnQgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RybmNtcChlbnQtPmRfbmFtZSwgbmFtZSwgbGVuKSA9PSAwKSB7CisgICAgICAgICAgICBzbnByaW50ZihkZXZfbmFtZSwgc2l6ZW9mKGRldl9uYW1lKSwgRFJNX0RJUl9OQU1FICIvJXMiLAorICAgICAgICAgICAgICAgICBlbnQtPmRfbmFtZSk7CisKKyAgICAgICAgICAgIGZyZWUocGVudCk7CisgICAgICAgICAgICBjbG9zZWRpcihzeXNkaXIpOworCisgICAgICAgICAgICByZXR1cm4gc3RyZHVwKGRldl9uYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZyZWUocGVudCk7CisKK291dF9jbG9zZV9kaXI6CisgICAgY2xvc2VkaXIoc3lzZGlyKTsKKyNlbHNlCisgICAgc3RydWN0IHN0YXQgc2J1ZjsKKyAgICBjaGFyIGJ1ZltQQVRIX01BWCArIDFdOworICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lOworICAgIHVuc2lnbmVkIGludCBtYWosIG1pbjsKKyAgICBpbnQgbiwgYmFzZTsKKworICAgIGlmIChmc3RhdChmZCwgJnNidWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG1haiA9IG1ham9yKHNidWYuc3RfcmRldik7CisgICAgbWluID0gbWlub3Ioc2J1Zi5zdF9yZGV2KTsKKworICAgIGlmIChtYWogIT0gRFJNX01BSk9SIHx8ICFTX0lTQ0hSKHNidWYuc3RfbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBEUk1fTk9ERV9QUklNQVJZOgorICAgICAgICBkZXZfbmFtZSA9IERSTV9ERVZfTkFNRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEUk1fTk9ERV9DT05UUk9MOgorICAgICAgICBkZXZfbmFtZSA9IERSTV9DT05UUk9MX0RFVl9OQU1FOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSTV9OT0RFX1JFTkRFUjoKKyAgICAgICAgZGV2X25hbWUgPSBEUk1fUkVOREVSX0RFVl9OQU1FOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9OworCisgICAgYmFzZSA9IGRybUdldE1pbm9yQmFzZSh0eXBlKTsKKyAgICBpZiAoYmFzZSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGRldl9uYW1lLCBEUk1fRElSX05BTUUsIG1pbiAtIGJhc2UpOworICAgIGlmIChuID09IC0xIHx8IG4gPj0gc2l6ZW9mKGJ1ZikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIHN0cmR1cChidWYpOworI2VuZGlmCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2NoYXIgKmRybUdldFByaW1hcnlEZXZpY2VOYW1lRnJvbUZkKGludCBmZCkKK3sKKyAgICByZXR1cm4gZHJtR2V0TWlub3JOYW1lRm9yRkQoZmQsIERSTV9OT0RFX1BSSU1BUlkpOworfQorCitjaGFyICpkcm1HZXRSZW5kZXJEZXZpY2VOYW1lRnJvbUZkKGludCBmZCkKK3sKKyAgICByZXR1cm4gZHJtR2V0TWlub3JOYW1lRm9yRkQoZmQsIERSTV9OT0RFX1JFTkRFUik7Cit9CisKKyNpZmRlZiBfX2xpbnV4X18KK3N0YXRpYyBjaGFyICogRFJNX1BSSU5URkxJS0UoMiwgMykKK3N5c2ZzX3VldmVudF9nZXQoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgY2hhciBmaWxlbmFtZVtQQVRIX01BWCArIDFdLCAqa2V5LCAqbGluZSA9IE5VTEwsICp2YWx1ZSA9IE5VTEw7CisgICAgc2l6ZV90IHNpemUgPSAwLCBsZW47CisgICAgc3NpemVfdCBudW07CisgICAgdmFfbGlzdCBhcDsKKyAgICBGSUxFICpmcDsKKworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIG51bSA9IHZhc3ByaW50Zigma2V5LCBmbXQsIGFwKTsKKyAgICB2YV9lbmQoYXApOworICAgIGxlbiA9IG51bTsKKworICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMvdWV2ZW50IiwgcGF0aCk7CisKKyAgICBmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworICAgIGlmICghZnApIHsKKyAgICAgICAgZnJlZShrZXkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB3aGlsZSAoKG51bSA9IGdldGxpbmUoJmxpbmUsICZzaXplLCBmcCkpID49IDApIHsKKyAgICAgICAgaWYgKChzdHJuY21wKGxpbmUsIGtleSwgbGVuKSA9PSAwKSAmJiAobGluZVtsZW5dID09ICc9JykpIHsKKyAgICAgICAgICAgIGNoYXIgKnN0YXJ0ID0gbGluZSArIGxlbiArIDEsICplbmQgPSBsaW5lICsgbnVtIC0gMTsKKworICAgICAgICAgICAgaWYgKCplbmQgIT0gJ1xuJykKKyAgICAgICAgICAgICAgICBlbmQrKzsKKworICAgICAgICAgICAgdmFsdWUgPSBzdHJuZHVwKHN0YXJ0LCBlbmQgLSBzdGFydCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZyZWUobGluZSk7CisgICAgZmNsb3NlKGZwKTsKKworICAgIGZyZWUoa2V5KTsKKworICAgIHJldHVybiB2YWx1ZTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGRybVBhcnNlU3Vic3lzdGVtVHlwZShpbnQgbWFqLCBpbnQgbWluKQoreworI2lmZGVmIF9fbGludXhfXworICAgIGNoYXIgcGF0aFtQQVRIX01BWCArIDFdOworICAgIGNoYXIgbGlua1tQQVRIX01BWCArIDFdID0gIiI7CisgICAgY2hhciAqbmFtZTsKKworICAgIHNucHJpbnRmKHBhdGgsIFBBVEhfTUFYLCAiL3N5cy9kZXYvY2hhci8lZDolZC9kZXZpY2Uvc3Vic3lzdGVtIiwKKyAgICAgICAgICAgICBtYWosIG1pbik7CisKKyAgICBpZiAocmVhZGxpbmsocGF0aCwgbGluaywgUEFUSF9NQVgpIDwgMCkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgIG5hbWUgPSBzdHJyY2hyKGxpbmssICcvJyk7CisgICAgaWYgKCFuYW1lKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChzdHJuY21wKG5hbWUsICIvcGNpIiwgNCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIERSTV9CVVNfUENJOworCisgICAgaWYgKHN0cm5jbXAobmFtZSwgIi91c2IiLCA0KSA9PSAwKQorICAgICAgICByZXR1cm4gRFJNX0JVU19VU0I7CisKKyAgICBpZiAoc3RybmNtcChuYW1lLCAiL3BsYXRmb3JtIiwgOSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIERSTV9CVVNfUExBVEZPUk07CisKKyAgICBpZiAoc3RybmNtcChuYW1lLCAiL2hvc3QxeCIsIDcpID09IDApCisgICAgICAgIHJldHVybiBEUk1fQlVTX0hPU1QxWDsKKworICAgIHJldHVybiAtRUlOVkFMOworI2VsaWYgZGVmaW5lZChfX09wZW5CU0RfXykKKyAgICByZXR1cm4gRFJNX0JVU19QQ0k7CisjZWxzZQorI3dhcm5pbmcgIk1pc3NpbmcgaW1wbGVtZW50YXRpb24gb2YgZHJtUGFyc2VTdWJzeXN0ZW1UeXBlIgorICAgIHJldHVybiAtRUlOVkFMOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgZHJtUGFyc2VQY2lCdXNJbmZvKGludCBtYWosIGludCBtaW4sIGRybVBjaUJ1c0luZm9QdHIgaW5mbykKK3sKKyNpZmRlZiBfX2xpbnV4X18KKyAgICB1bnNpZ25lZCBpbnQgZG9tYWluLCBidXMsIGRldiwgZnVuYzsKKyAgICBjaGFyIHBhdGhbUEFUSF9NQVggKyAxXSwgKnZhbHVlOworICAgIGludCBudW07CisKKyAgICBzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIvc3lzL2Rldi9jaGFyLyVkOiVkL2RldmljZSIsIG1haiwgbWluKTsKKworICAgIHZhbHVlID0gc3lzZnNfdWV2ZW50X2dldChwYXRoLCAiUENJX1NMT1RfTkFNRSIpOworICAgIGlmICghdmFsdWUpCisgICAgICAgIHJldHVybiAtRU5PRU5UOworCisgICAgbnVtID0gc3NjYW5mKHZhbHVlLCAiJTA0eDolMDJ4OiUwMnguJTF1IiwgJmRvbWFpbiwgJmJ1cywgJmRldiwgJmZ1bmMpOworICAgIGZyZWUodmFsdWUpOworCisgICAgaWYgKG51bSAhPSA0KQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGluZm8tPmRvbWFpbiA9IGRvbWFpbjsKKyAgICBpbmZvLT5idXMgPSBidXM7CisgICAgaW5mby0+ZGV2ID0gZGV2OworICAgIGluZm8tPmZ1bmMgPSBmdW5jOworCisgICAgcmV0dXJuIDA7CisjZWxpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKQorICAgIHN0cnVjdCBkcm1fcGNpaW5mbyBwaW5mbzsKKyAgICBpbnQgZmQsIHR5cGU7CisKKyAgICB0eXBlID0gZHJtR2V0TWlub3JUeXBlKG1pbik7CisgICAgaWYgKHR5cGUgPT0gLTEpCisgICAgICAgIHJldHVybiAtRU5PREVWOworCisgICAgZmQgPSBkcm1PcGVuTWlub3IobWluLCAwLCB0eXBlKTsKKyAgICBpZiAoZmQgPCAwKQorICAgICAgICByZXR1cm4gLWVycm5vOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfR0VUX1BDSUlORk8sICZwaW5mbykpIHsKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICByZXR1cm4gLWVycm5vOworICAgIH0KKyAgICBjbG9zZShmZCk7CisKKyAgICBpbmZvLT5kb21haW4gPSBwaW5mby5kb21haW47CisgICAgaW5mby0+YnVzID0gcGluZm8uYnVzOworICAgIGluZm8tPmRldiA9IHBpbmZvLmRldjsKKyAgICBpbmZvLT5mdW5jID0gcGluZm8uZnVuYzsKKworICAgIHJldHVybiAwOworI2Vsc2UKKyN3YXJuaW5nICJNaXNzaW5nIGltcGxlbWVudGF0aW9uIG9mIGRybVBhcnNlUGNpQnVzSW5mbyIKKyAgICByZXR1cm4gLUVJTlZBTDsKKyNlbmRpZgorfQorCitpbnQgZHJtRGV2aWNlc0VxdWFsKGRybURldmljZVB0ciBhLCBkcm1EZXZpY2VQdHIgYikKK3sKKyAgICBpZiAoYSA9PSBOVUxMIHx8IGIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoYS0+YnVzdHlwZSAhPSBiLT5idXN0eXBlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN3aXRjaCAoYS0+YnVzdHlwZSkgeworICAgIGNhc2UgRFJNX0JVU19QQ0k6CisgICAgICAgIHJldHVybiBtZW1jbXAoYS0+YnVzaW5mby5wY2ksIGItPmJ1c2luZm8ucGNpLCBzaXplb2YoZHJtUGNpQnVzSW5mbykpID09IDA7CisKKyAgICBjYXNlIERSTV9CVVNfVVNCOgorICAgICAgICByZXR1cm4gbWVtY21wKGEtPmJ1c2luZm8udXNiLCBiLT5idXNpbmZvLnVzYiwgc2l6ZW9mKGRybVVzYkJ1c0luZm8pKSA9PSAwOworCisgICAgY2FzZSBEUk1fQlVTX1BMQVRGT1JNOgorICAgICAgICByZXR1cm4gbWVtY21wKGEtPmJ1c2luZm8ucGxhdGZvcm0sIGItPmJ1c2luZm8ucGxhdGZvcm0sIHNpemVvZihkcm1QbGF0Zm9ybUJ1c0luZm8pKSA9PSAwOworCisgICAgY2FzZSBEUk1fQlVTX0hPU1QxWDoKKyAgICAgICAgcmV0dXJuIG1lbWNtcChhLT5idXNpbmZvLmhvc3QxeCwgYi0+YnVzaW5mby5ob3N0MXgsIHNpemVvZihkcm1Ib3N0MXhCdXNJbmZvKSkgPT0gMDsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRybUdldE5vZGVUeXBlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaWYgKHN0cm5jbXAobmFtZSwgRFJNX1BSSU1BUllfTUlOT1JfTkFNRSwKKyAgICAgICAgc2l6ZW9mKERSTV9QUklNQVJZX01JTk9SX05BTUUpIC0gMSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIERSTV9OT0RFX1BSSU1BUlk7CisKKyAgICBpZiAoc3RybmNtcChuYW1lLCBEUk1fQ09OVFJPTF9NSU5PUl9OQU1FLAorICAgICAgICBzaXplb2YoRFJNX0NPTlRST0xfTUlOT1JfTkFNRSApIC0gMSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIERSTV9OT0RFX0NPTlRST0w7CisKKyAgICBpZiAoc3RybmNtcChuYW1lLCBEUk1fUkVOREVSX01JTk9SX05BTUUsCisgICAgICAgIHNpemVvZihEUk1fUkVOREVSX01JTk9SX05BTUUpIC0gMSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIERSTV9OT0RFX1JFTkRFUjsKKworICAgIHJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGRybUdldE1heE5vZGVOYW1lKHZvaWQpCit7CisgICAgcmV0dXJuIHNpemVvZihEUk1fRElSX05BTUUpICsKKyAgICAgICAgICAgTUFYMyhzaXplb2YoRFJNX1BSSU1BUllfTUlOT1JfTkFNRSksCisgICAgICAgICAgICAgICAgc2l6ZW9mKERSTV9DT05UUk9MX01JTk9SX05BTUUpLAorICAgICAgICAgICAgICAgIHNpemVvZihEUk1fUkVOREVSX01JTk9SX05BTUUpKSArCisgICAgICAgICAgIDMgLyogbGVuZ3RoIG9mIHRoZSBub2RlIG51bWJlciAqLzsKK30KKworI2lmZGVmIF9fbGludXhfXworc3RhdGljIGludCBwYXJzZV9zZXBhcmF0ZV9zeXNmc19maWxlcyhpbnQgbWFqLCBpbnQgbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm1QY2lEZXZpY2VJbmZvUHRyIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpZ25vcmVfcmV2aXNpb24pCit7CisjZGVmaW5lIEFSUkFZX1NJWkUoYSkgKHNpemVvZihhKSAvIHNpemVvZigoYSlbMF0pKQorICAgIHN0YXRpYyBjb25zdCBjaGFyICphdHRyc1tdID0geworICAgICAgInJldmlzaW9uIiwgLyogT2xkZXIga2VybmVscyBhcmUgbWlzc2luZyB0aGUgZmlsZSwgc28gY2hlY2sgZm9yIGl0IGZpcnN0ICovCisgICAgICAidmVuZG9yIiwKKyAgICAgICJkZXZpY2UiLAorICAgICAgInN1YnN5c3RlbV92ZW5kb3IiLAorICAgICAgInN1YnN5c3RlbV9kZXZpY2UiLAorICAgIH07CisgICAgY2hhciBwYXRoW1BBVEhfTUFYICsgMV07CisgICAgdW5zaWduZWQgaW50IGRhdGFbQVJSQVlfU0laRShhdHRycyldOworICAgIEZJTEUgKmZwOworICAgIGludCByZXQ7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBpZ25vcmVfcmV2aXNpb24gPyAxIDogMDsgaSA8IEFSUkFZX1NJWkUoYXR0cnMpOyBpKyspIHsKKyAgICAgICAgc25wcmludGYocGF0aCwgUEFUSF9NQVgsICIvc3lzL2Rldi9jaGFyLyVkOiVkL2RldmljZS8lcyIsIG1haiwgbWluLAorICAgICAgICAgICAgICAgICBhdHRyc1tpXSk7CisgICAgICAgIGZwID0gZm9wZW4ocGF0aCwgInIiKTsKKyAgICAgICAgaWYgKCFmcCkKKyAgICAgICAgICAgIHJldHVybiAtZXJybm87CisKKyAgICAgICAgcmV0ID0gZnNjYW5mKGZwLCAiJXgiLCAmZGF0YVtpXSk7CisgICAgICAgIGZjbG9zZShmcCk7CisgICAgICAgIGlmIChyZXQgIT0gMSkKKyAgICAgICAgICAgIHJldHVybiAtZXJybm87CisKKyAgICB9CisKKyAgICBkZXZpY2UtPnJldmlzaW9uX2lkID0gaWdub3JlX3JldmlzaW9uID8gMHhmZiA6IGRhdGFbMF0gJiAweGZmOworICAgIGRldmljZS0+dmVuZG9yX2lkID0gZGF0YVsxXSAmIDB4ZmZmZjsKKyAgICBkZXZpY2UtPmRldmljZV9pZCA9IGRhdGFbMl0gJiAweGZmZmY7CisgICAgZGV2aWNlLT5zdWJ2ZW5kb3JfaWQgPSBkYXRhWzNdICYgMHhmZmZmOworICAgIGRldmljZS0+c3ViZGV2aWNlX2lkID0gZGF0YVs0XSAmIDB4ZmZmZjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2NvbmZpZ19zeXNmc19maWxlKGludCBtYWosIGludCBtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRybVBjaURldmljZUluZm9QdHIgZGV2aWNlKQoreworICAgIGNoYXIgcGF0aFtQQVRIX01BWCArIDFdOworICAgIHVuc2lnbmVkIGNoYXIgY29uZmlnWzY0XTsKKyAgICBpbnQgZmQsIHJldDsKKworICAgIHNucHJpbnRmKHBhdGgsIFBBVEhfTUFYLCAiL3N5cy9kZXYvY2hhci8lZDolZC9kZXZpY2UvY29uZmlnIiwgbWFqLCBtaW4pOworICAgIGZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgIHJldCA9IHJlYWQoZmQsIGNvbmZpZywgc2l6ZW9mKGNvbmZpZykpOworICAgIGNsb3NlKGZkKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgIGRldmljZS0+dmVuZG9yX2lkID0gY29uZmlnWzBdIHwgKGNvbmZpZ1sxXSA8PCA4KTsKKyAgICBkZXZpY2UtPmRldmljZV9pZCA9IGNvbmZpZ1syXSB8IChjb25maWdbM10gPDwgOCk7CisgICAgZGV2aWNlLT5yZXZpc2lvbl9pZCA9IGNvbmZpZ1s4XTsKKyAgICBkZXZpY2UtPnN1YnZlbmRvcl9pZCA9IGNvbmZpZ1s0NF0gfCAoY29uZmlnWzQ1XSA8PCA4KTsKKyAgICBkZXZpY2UtPnN1YmRldmljZV9pZCA9IGNvbmZpZ1s0Nl0gfCAoY29uZmlnWzQ3XSA8PCA4KTsKKworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZHJtUGFyc2VQY2lEZXZpY2VJbmZvKGludCBtYWosIGludCBtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm1QY2lEZXZpY2VJbmZvUHRyIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKQoreworI2lmZGVmIF9fbGludXhfXworICAgIGlmICghKGZsYWdzICYgRFJNX0RFVklDRV9HRVRfUENJX1JFVklTSU9OKSkKKyAgICAgICAgcmV0dXJuIHBhcnNlX3NlcGFyYXRlX3N5c2ZzX2ZpbGVzKG1haiwgbWluLCBkZXZpY2UsIHRydWUpOworCisgICAgaWYgKHBhcnNlX3NlcGFyYXRlX3N5c2ZzX2ZpbGVzKG1haiwgbWluLCBkZXZpY2UsIGZhbHNlKSkKKyAgICAgICAgcmV0dXJuIHBhcnNlX2NvbmZpZ19zeXNmc19maWxlKG1haiwgbWluLCBkZXZpY2UpOworCisgICAgcmV0dXJuIDA7CisjZWxpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKQorICAgIHN0cnVjdCBkcm1fcGNpaW5mbyBwaW5mbzsKKyAgICBpbnQgZmQsIHR5cGU7CisKKyAgICB0eXBlID0gZHJtR2V0TWlub3JUeXBlKG1pbik7CisgICAgaWYgKHR5cGUgPT0gLTEpCisgICAgICAgIHJldHVybiAtRU5PREVWOworCisgICAgZmQgPSBkcm1PcGVuTWlub3IobWluLCAwLCB0eXBlKTsKKyAgICBpZiAoZmQgPCAwKQorICAgICAgICByZXR1cm4gLWVycm5vOworCisgICAgaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfR0VUX1BDSUlORk8sICZwaW5mbykpIHsKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICByZXR1cm4gLWVycm5vOworICAgIH0KKyAgICBjbG9zZShmZCk7CisKKyAgICBkZXZpY2UtPnZlbmRvcl9pZCA9IHBpbmZvLnZlbmRvcl9pZDsKKyAgICBkZXZpY2UtPmRldmljZV9pZCA9IHBpbmZvLmRldmljZV9pZDsKKyAgICBkZXZpY2UtPnJldmlzaW9uX2lkID0gcGluZm8ucmV2aXNpb25faWQ7CisgICAgZGV2aWNlLT5zdWJ2ZW5kb3JfaWQgPSBwaW5mby5zdWJ2ZW5kb3JfaWQ7CisgICAgZGV2aWNlLT5zdWJkZXZpY2VfaWQgPSBwaW5mby5zdWJkZXZpY2VfaWQ7CisKKyAgICByZXR1cm4gMDsKKyNlbHNlCisjd2FybmluZyAiTWlzc2luZyBpbXBsZW1lbnRhdGlvbiBvZiBkcm1QYXJzZVBjaURldmljZUluZm8iCisgICAgcmV0dXJuIC1FSU5WQUw7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgZHJtRnJlZVBsYXRmb3JtRGV2aWNlKGRybURldmljZVB0ciBkZXZpY2UpCit7CisgICAgaWYgKGRldmljZS0+ZGV2aWNlaW5mby5wbGF0Zm9ybSkgeworICAgICAgICBpZiAoZGV2aWNlLT5kZXZpY2VpbmZvLnBsYXRmb3JtLT5jb21wYXRpYmxlKSB7CisgICAgICAgICAgICBjaGFyICoqY29tcGF0aWJsZSA9IGRldmljZS0+ZGV2aWNlaW5mby5wbGF0Zm9ybS0+Y29tcGF0aWJsZTsKKworICAgICAgICAgICAgd2hpbGUgKCpjb21wYXRpYmxlKSB7CisgICAgICAgICAgICAgICAgZnJlZSgqY29tcGF0aWJsZSk7CisgICAgICAgICAgICAgICAgY29tcGF0aWJsZSsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmcmVlKGRldmljZS0+ZGV2aWNlaW5mby5wbGF0Zm9ybS0+Y29tcGF0aWJsZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRybUZyZWVIb3N0MXhEZXZpY2UoZHJtRGV2aWNlUHRyIGRldmljZSkKK3sKKyAgICBpZiAoZGV2aWNlLT5kZXZpY2VpbmZvLmhvc3QxeCkgeworICAgICAgICBpZiAoZGV2aWNlLT5kZXZpY2VpbmZvLmhvc3QxeC0+Y29tcGF0aWJsZSkgeworICAgICAgICAgICAgY2hhciAqKmNvbXBhdGlibGUgPSBkZXZpY2UtPmRldmljZWluZm8uaG9zdDF4LT5jb21wYXRpYmxlOworCisgICAgICAgICAgICB3aGlsZSAoKmNvbXBhdGlibGUpIHsKKyAgICAgICAgICAgICAgICBmcmVlKCpjb21wYXRpYmxlKTsKKyAgICAgICAgICAgICAgICBjb21wYXRpYmxlKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZyZWUoZGV2aWNlLT5kZXZpY2VpbmZvLmhvc3QxeC0+Y29tcGF0aWJsZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZHJtRnJlZURldmljZShkcm1EZXZpY2VQdHIgKmRldmljZSkKK3sKKyAgICBpZiAoZGV2aWNlID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICgqZGV2aWNlKSB7CisgICAgICAgIHN3aXRjaCAoKCpkZXZpY2UpLT5idXN0eXBlKSB7CisgICAgICAgIGNhc2UgRFJNX0JVU19QTEFURk9STToKKyAgICAgICAgICAgIGRybUZyZWVQbGF0Zm9ybURldmljZSgqZGV2aWNlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRFJNX0JVU19IT1NUMVg6CisgICAgICAgICAgICBkcm1GcmVlSG9zdDF4RGV2aWNlKCpkZXZpY2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcmVlKCpkZXZpY2UpOworICAgICpkZXZpY2UgPSBOVUxMOworfQorCit2b2lkIGRybUZyZWVEZXZpY2VzKGRybURldmljZVB0ciBkZXZpY2VzW10sIGludCBjb3VudCkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChkZXZpY2VzID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBpZiAoZGV2aWNlc1tpXSkKKyAgICAgICAgICAgIGRybUZyZWVEZXZpY2UoJmRldmljZXNbaV0pOworfQorCitzdGF0aWMgZHJtRGV2aWNlUHRyIGRybURldmljZUFsbG9jKHVuc2lnbmVkIGludCB0eXBlLCBjb25zdCBjaGFyICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVzX3NpemUsIHNpemVfdCBkZXZpY2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKnB0cnApCit7CisgICAgc2l6ZV90IG1heF9ub2RlX2xlbmd0aCwgZXh0cmEsIHNpemU7CisgICAgZHJtRGV2aWNlUHRyIGRldmljZTsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBjaGFyICpwdHI7CisKKyAgICBtYXhfbm9kZV9sZW5ndGggPSBBTElHTihkcm1HZXRNYXhOb2RlTmFtZSgpLCBzaXplb2Yodm9pZCAqKSk7CisgICAgZXh0cmEgPSBEUk1fTk9ERV9NQVggKiAoc2l6ZW9mKHZvaWQgKikgKyBtYXhfbm9kZV9sZW5ndGgpOworCisgICAgc2l6ZSA9IHNpemVvZigqZGV2aWNlKSArIGV4dHJhICsgYnVzX3NpemUgKyBkZXZpY2Vfc2l6ZTsKKworICAgIGRldmljZSA9IGNhbGxvYygxLCBzaXplKTsKKyAgICBpZiAoIWRldmljZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBkZXZpY2UtPmF2YWlsYWJsZV9ub2RlcyA9IDEgPDwgdHlwZTsKKworICAgIHB0ciA9IChjaGFyICopZGV2aWNlICsgc2l6ZW9mKCpkZXZpY2UpOworICAgIGRldmljZS0+bm9kZXMgPSAoY2hhciAqKilwdHI7CisKKyAgICBwdHIgKz0gRFJNX05PREVfTUFYICogc2l6ZW9mKHZvaWQgKik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRFJNX05PREVfTUFYOyBpKyspIHsKKyAgICAgICAgZGV2aWNlLT5ub2Rlc1tpXSA9IHB0cjsKKyAgICAgICAgcHRyICs9IG1heF9ub2RlX2xlbmd0aDsKKyAgICB9CisKKyAgICBtZW1jcHkoZGV2aWNlLT5ub2Rlc1t0eXBlXSwgbm9kZSwgbWF4X25vZGVfbGVuZ3RoKTsKKworICAgICpwdHJwID0gcHRyOworCisgICAgcmV0dXJuIGRldmljZTsKK30KKworc3RhdGljIGludCBkcm1Qcm9jZXNzUGNpRGV2aWNlKGRybURldmljZVB0ciAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5vZGUsIGludCBub2RlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1haiwgaW50IG1pbiwgYm9vbCBmZXRjaF9kZXZpY2VpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKQoreworICAgIGRybURldmljZVB0ciBkZXY7CisgICAgY2hhciAqYWRkcjsKKyAgICBpbnQgcmV0OworCisgICAgZGV2ID0gZHJtRGV2aWNlQWxsb2Mobm9kZV90eXBlLCBub2RlLCBzaXplb2YoZHJtUGNpQnVzSW5mbyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRybVBjaURldmljZUluZm8pLCAmYWRkcik7CisgICAgaWYgKCFkZXYpCisgICAgICAgIHJldHVybiAtRU5PTUVNOworCisgICAgZGV2LT5idXN0eXBlID0gRFJNX0JVU19QQ0k7CisKKyAgICBkZXYtPmJ1c2luZm8ucGNpID0gKGRybVBjaUJ1c0luZm9QdHIpYWRkcjsKKworICAgIHJldCA9IGRybVBhcnNlUGNpQnVzSW5mbyhtYWosIG1pbiwgZGV2LT5idXNpbmZvLnBjaSk7CisgICAgaWYgKHJldCkKKyAgICAgICAgZ290byBmcmVlX2RldmljZTsKKworICAgIC8vIEZldGNoIHRoZSBkZXZpY2UgaW5mbyBpZiB0aGUgdXNlciBoYXMgcmVxdWVzdGVkIGl0CisgICAgaWYgKGZldGNoX2RldmljZWluZm8pIHsKKyAgICAgICAgYWRkciArPSBzaXplb2YoZHJtUGNpQnVzSW5mbyk7CisgICAgICAgIGRldi0+ZGV2aWNlaW5mby5wY2kgPSAoZHJtUGNpRGV2aWNlSW5mb1B0cilhZGRyOworCisgICAgICAgIHJldCA9IGRybVBhcnNlUGNpRGV2aWNlSW5mbyhtYWosIG1pbiwgZGV2LT5kZXZpY2VpbmZvLnBjaSwgZmxhZ3MpOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgZ290byBmcmVlX2RldmljZTsKKyAgICB9CisKKyAgICAqZGV2aWNlID0gZGV2OworCisgICAgcmV0dXJuIDA7CisKK2ZyZWVfZGV2aWNlOgorICAgIGZyZWUoZGV2KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRybVBhcnNlVXNiQnVzSW5mbyhpbnQgbWFqLCBpbnQgbWluLCBkcm1Vc2JCdXNJbmZvUHRyIGluZm8pCit7CisjaWZkZWYgX19saW51eF9fCisgICAgY2hhciBwYXRoW1BBVEhfTUFYICsgMV0sICp2YWx1ZTsKKyAgICB1bnNpZ25lZCBpbnQgYnVzLCBkZXY7CisgICAgaW50IHJldDsKKworICAgIHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIi9zeXMvZGV2L2NoYXIvJWQ6JWQvZGV2aWNlIiwgbWFqLCBtaW4pOworCisgICAgdmFsdWUgPSBzeXNmc191ZXZlbnRfZ2V0KHBhdGgsICJCVVNOVU0iKTsKKyAgICBpZiAoIXZhbHVlKQorICAgICAgICByZXR1cm4gLUVOT0VOVDsKKworICAgIHJldCA9IHNzY2FuZih2YWx1ZSwgIiUwM3UiLCAmYnVzKTsKKyAgICBmcmVlKHZhbHVlKTsKKworICAgIGlmIChyZXQgPD0gMCkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgIHZhbHVlID0gc3lzZnNfdWV2ZW50X2dldChwYXRoLCAiREVWTlVNIik7CisgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisKKyAgICByZXQgPSBzc2NhbmYodmFsdWUsICIlMDN1IiwgJmRldik7CisgICAgZnJlZSh2YWx1ZSk7CisKKyAgICBpZiAocmV0IDw9IDApCisgICAgICAgIHJldHVybiAtZXJybm87CisKKyAgICBpbmZvLT5idXMgPSBidXM7CisgICAgaW5mby0+ZGV2ID0gZGV2OworCisgICAgcmV0dXJuIDA7CisjZWxzZQorI3dhcm5pbmcgIk1pc3NpbmcgaW1wbGVtZW50YXRpb24gb2YgZHJtUGFyc2VVc2JCdXNJbmZvIgorICAgIHJldHVybiAtRUlOVkFMOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgZHJtUGFyc2VVc2JEZXZpY2VJbmZvKGludCBtYWosIGludCBtaW4sIGRybVVzYkRldmljZUluZm9QdHIgaW5mbykKK3sKKyNpZmRlZiBfX2xpbnV4X18KKyAgICBjaGFyIHBhdGhbUEFUSF9NQVggKyAxXSwgKnZhbHVlOworICAgIHVuc2lnbmVkIGludCB2ZW5kb3IsIHByb2R1Y3Q7CisgICAgaW50IHJldDsKKworICAgIHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIi9zeXMvZGV2L2NoYXIvJWQ6JWQvZGV2aWNlIiwgbWFqLCBtaW4pOworCisgICAgdmFsdWUgPSBzeXNmc191ZXZlbnRfZ2V0KHBhdGgsICJQUk9EVUNUIik7CisgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisKKyAgICByZXQgPSBzc2NhbmYodmFsdWUsICIleC8leCIsICZ2ZW5kb3IsICZwcm9kdWN0KTsKKyAgICBmcmVlKHZhbHVlKTsKKworICAgIGlmIChyZXQgPD0gMCkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgIGluZm8tPnZlbmRvciA9IHZlbmRvcjsKKyAgICBpbmZvLT5wcm9kdWN0ID0gcHJvZHVjdDsKKworICAgIHJldHVybiAwOworI2Vsc2UKKyN3YXJuaW5nICJNaXNzaW5nIGltcGxlbWVudGF0aW9uIG9mIGRybVBhcnNlVXNiRGV2aWNlSW5mbyIKKyAgICByZXR1cm4gLUVJTlZBTDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGRybVByb2Nlc3NVc2JEZXZpY2UoZHJtRGV2aWNlUHRyICpkZXZpY2UsIGNvbnN0IGNoYXIgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vZGVfdHlwZSwgaW50IG1haiwgaW50IG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZldGNoX2RldmljZWluZm8sIHVpbnQzMl90IGZsYWdzKQoreworICAgIGRybURldmljZVB0ciBkZXY7CisgICAgY2hhciAqcHRyOworICAgIGludCByZXQ7CisKKyAgICBkZXYgPSBkcm1EZXZpY2VBbGxvYyhub2RlX3R5cGUsIG5vZGUsIHNpemVvZihkcm1Vc2JCdXNJbmZvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZHJtVXNiRGV2aWNlSW5mbyksICZwdHIpOworICAgIGlmICghZGV2KQorICAgICAgICByZXR1cm4gLUVOT01FTTsKKworICAgIGRldi0+YnVzdHlwZSA9IERSTV9CVVNfVVNCOworCisgICAgZGV2LT5idXNpbmZvLnVzYiA9IChkcm1Vc2JCdXNJbmZvUHRyKXB0cjsKKworICAgIHJldCA9IGRybVBhcnNlVXNiQnVzSW5mbyhtYWosIG1pbiwgZGV2LT5idXNpbmZvLnVzYik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZnJlZV9kZXZpY2U7CisKKyAgICBpZiAoZmV0Y2hfZGV2aWNlaW5mbykgeworICAgICAgICBwdHIgKz0gc2l6ZW9mKGRybVVzYkJ1c0luZm8pOworICAgICAgICBkZXYtPmRldmljZWluZm8udXNiID0gKGRybVVzYkRldmljZUluZm9QdHIpcHRyOworCisgICAgICAgIHJldCA9IGRybVBhcnNlVXNiRGV2aWNlSW5mbyhtYWosIG1pbiwgZGV2LT5kZXZpY2VpbmZvLnVzYik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmcmVlX2RldmljZTsKKyAgICB9CisKKyAgICAqZGV2aWNlID0gZGV2OworCisgICAgcmV0dXJuIDA7CisKK2ZyZWVfZGV2aWNlOgorICAgIGZyZWUoZGV2KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRybVBhcnNlUGxhdGZvcm1CdXNJbmZvKGludCBtYWosIGludCBtaW4sIGRybVBsYXRmb3JtQnVzSW5mb1B0ciBpbmZvKQoreworI2lmZGVmIF9fbGludXhfXworICAgIGNoYXIgcGF0aFtQQVRIX01BWCArIDFdLCAqbmFtZTsKKworICAgIHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIi9zeXMvZGV2L2NoYXIvJWQ6JWQvZGV2aWNlIiwgbWFqLCBtaW4pOworCisgICAgbmFtZSA9IHN5c2ZzX3VldmVudF9nZXQocGF0aCwgIk9GX0ZVTExOQU1FIik7CisgICAgaWYgKCFuYW1lKQorICAgICAgICByZXR1cm4gLUVOT0VOVDsKKworICAgIHN0cm5jcHkoaW5mby0+ZnVsbG5hbWUsIG5hbWUsIERSTV9QTEFURk9STV9ERVZJQ0VfTkFNRV9MRU4pOworICAgIGluZm8tPmZ1bGxuYW1lW0RSTV9QTEFURk9STV9ERVZJQ0VfTkFNRV9MRU4gLSAxXSA9ICdcMCc7CisgICAgZnJlZShuYW1lKTsKKworICAgIHJldHVybiAwOworI2Vsc2UKKyN3YXJuaW5nICJNaXNzaW5nIGltcGxlbWVudGF0aW9uIG9mIGRybVBhcnNlUGxhdGZvcm1CdXNJbmZvIgorICAgIHJldHVybiAtRUlOVkFMOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgZHJtUGFyc2VQbGF0Zm9ybURldmljZUluZm8oaW50IG1haiwgaW50IG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJtUGxhdGZvcm1EZXZpY2VJbmZvUHRyIGluZm8pCit7CisjaWZkZWYgX19saW51eF9fCisgICAgY2hhciBwYXRoW1BBVEhfTUFYICsgMV0sICp2YWx1ZTsKKyAgICB1bnNpZ25lZCBpbnQgY291bnQsIGk7CisgICAgaW50IGVycjsKKworICAgIHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIi9zeXMvZGV2L2NoYXIvJWQ6JWQvZGV2aWNlIiwgbWFqLCBtaW4pOworCisgICAgdmFsdWUgPSBzeXNmc191ZXZlbnRfZ2V0KHBhdGgsICJPRl9DT01QQVRJQkxFX04iKTsKKyAgICBpZiAoIXZhbHVlKQorICAgICAgICByZXR1cm4gLUVOT0VOVDsKKworICAgIHNzY2FuZih2YWx1ZSwgIiV1IiwgJmNvdW50KTsKKyAgICBmcmVlKHZhbHVlKTsKKworICAgIGluZm8tPmNvbXBhdGlibGUgPSBjYWxsb2MoY291bnQgKyAxLCBzaXplb2YoKmluZm8tPmNvbXBhdGlibGUpKTsKKyAgICBpZiAoIWluZm8tPmNvbXBhdGlibGUpCisgICAgICAgIHJldHVybiAtRU5PTUVNOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgdmFsdWUgPSBzeXNmc191ZXZlbnRfZ2V0KHBhdGgsICJPRl9DT01QQVRJQkxFXyV1IiwgaSk7CisgICAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgICAgIGVyciA9IC1FTk9FTlQ7CisgICAgICAgICAgICBnb3RvIGZyZWU7CisgICAgICAgIH0KKworICAgICAgICBpbmZvLT5jb21wYXRpYmxlW2ldID0gdmFsdWU7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK2ZyZWU6CisgICAgd2hpbGUgKGktLSkKKyAgICAgICAgZnJlZShpbmZvLT5jb21wYXRpYmxlW2ldKTsKKworICAgIGZyZWUoaW5mby0+Y29tcGF0aWJsZSk7CisgICAgcmV0dXJuIGVycjsKKyNlbHNlCisjd2FybmluZyAiTWlzc2luZyBpbXBsZW1lbnRhdGlvbiBvZiBkcm1QYXJzZVBsYXRmb3JtRGV2aWNlSW5mbyIKKyAgICByZXR1cm4gLUVJTlZBTDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGRybVByb2Nlc3NQbGF0Zm9ybURldmljZShkcm1EZXZpY2VQdHIgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5vZGUsIGludCBub2RlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFqLCBpbnQgbWluLCBib29sIGZldGNoX2RldmljZWluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncykKK3sKKyAgICBkcm1EZXZpY2VQdHIgZGV2OworICAgIGNoYXIgKnB0cjsKKyAgICBpbnQgcmV0OworCisgICAgZGV2ID0gZHJtRGV2aWNlQWxsb2Mobm9kZV90eXBlLCBub2RlLCBzaXplb2YoZHJtUGxhdGZvcm1CdXNJbmZvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZHJtUGxhdGZvcm1EZXZpY2VJbmZvKSwgJnB0cik7CisgICAgaWYgKCFkZXYpCisgICAgICAgIHJldHVybiAtRU5PTUVNOworCisgICAgZGV2LT5idXN0eXBlID0gRFJNX0JVU19QTEFURk9STTsKKworICAgIGRldi0+YnVzaW5mby5wbGF0Zm9ybSA9IChkcm1QbGF0Zm9ybUJ1c0luZm9QdHIpcHRyOworCisgICAgcmV0ID0gZHJtUGFyc2VQbGF0Zm9ybUJ1c0luZm8obWFqLCBtaW4sIGRldi0+YnVzaW5mby5wbGF0Zm9ybSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZnJlZV9kZXZpY2U7CisKKyAgICBpZiAoZmV0Y2hfZGV2aWNlaW5mbykgeworICAgICAgICBwdHIgKz0gc2l6ZW9mKGRybVBsYXRmb3JtQnVzSW5mbyk7CisgICAgICAgIGRldi0+ZGV2aWNlaW5mby5wbGF0Zm9ybSA9IChkcm1QbGF0Zm9ybURldmljZUluZm9QdHIpcHRyOworCisgICAgICAgIHJldCA9IGRybVBhcnNlUGxhdGZvcm1EZXZpY2VJbmZvKG1haiwgbWluLCBkZXYtPmRldmljZWluZm8ucGxhdGZvcm0pOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZnJlZV9kZXZpY2U7CisgICAgfQorCisgICAgKmRldmljZSA9IGRldjsKKworICAgIHJldHVybiAwOworCitmcmVlX2RldmljZToKKyAgICBmcmVlKGRldik7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkcm1QYXJzZUhvc3QxeEJ1c0luZm8oaW50IG1haiwgaW50IG1pbiwgZHJtSG9zdDF4QnVzSW5mb1B0ciBpbmZvKQoreworI2lmZGVmIF9fbGludXhfXworICAgIGNoYXIgcGF0aFtQQVRIX01BWCArIDFdLCAqbmFtZTsKKworICAgIHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIi9zeXMvZGV2L2NoYXIvJWQ6JWQvZGV2aWNlIiwgbWFqLCBtaW4pOworCisgICAgbmFtZSA9IHN5c2ZzX3VldmVudF9nZXQocGF0aCwgIk9GX0ZVTExOQU1FIik7CisgICAgaWYgKCFuYW1lKQorICAgICAgICByZXR1cm4gLUVOT0VOVDsKKworICAgIHN0cm5jcHkoaW5mby0+ZnVsbG5hbWUsIG5hbWUsIERSTV9IT1NUMVhfREVWSUNFX05BTUVfTEVOKTsKKyAgICBpbmZvLT5mdWxsbmFtZVtEUk1fSE9TVDFYX0RFVklDRV9OQU1FX0xFTiAtIDFdID0gJ1wwJzsKKyAgICBmcmVlKG5hbWUpOworCisgICAgcmV0dXJuIDA7CisjZWxzZQorI3dhcm5pbmcgIk1pc3NpbmcgaW1wbGVtZW50YXRpb24gb2YgZHJtUGFyc2VIb3N0MXhCdXNJbmZvIgorICAgIHJldHVybiAtRUlOVkFMOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgZHJtUGFyc2VIb3N0MXhEZXZpY2VJbmZvKGludCBtYWosIGludCBtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm1Ib3N0MXhEZXZpY2VJbmZvUHRyIGluZm8pCit7CisjaWZkZWYgX19saW51eF9fCisgICAgY2hhciBwYXRoW1BBVEhfTUFYICsgMV0sICp2YWx1ZTsKKyAgICB1bnNpZ25lZCBpbnQgY291bnQsIGk7CisgICAgaW50IGVycjsKKworICAgIHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIi9zeXMvZGV2L2NoYXIvJWQ6JWQvZGV2aWNlIiwgbWFqLCBtaW4pOworCisgICAgdmFsdWUgPSBzeXNmc191ZXZlbnRfZ2V0KHBhdGgsICJPRl9DT01QQVRJQkxFX04iKTsKKyAgICBpZiAoIXZhbHVlKQorICAgICAgICByZXR1cm4gLUVOT0VOVDsKKworICAgIHNzY2FuZih2YWx1ZSwgIiV1IiwgJmNvdW50KTsKKyAgICBmcmVlKHZhbHVlKTsKKworICAgIGluZm8tPmNvbXBhdGlibGUgPSBjYWxsb2MoY291bnQgKyAxLCBzaXplb2YoKmluZm8tPmNvbXBhdGlibGUpKTsKKyAgICBpZiAoIWluZm8tPmNvbXBhdGlibGUpCisgICAgICAgIHJldHVybiAtRU5PTUVNOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgdmFsdWUgPSBzeXNmc191ZXZlbnRfZ2V0KHBhdGgsICJPRl9DT01QQVRJQkxFXyV1IiwgaSk7CisgICAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgICAgIGVyciA9IC1FTk9FTlQ7CisgICAgICAgICAgICBnb3RvIGZyZWU7CisgICAgICAgIH0KKworICAgICAgICBpbmZvLT5jb21wYXRpYmxlW2ldID0gdmFsdWU7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK2ZyZWU6CisgICAgd2hpbGUgKGktLSkKKyAgICAgICAgZnJlZShpbmZvLT5jb21wYXRpYmxlW2ldKTsKKworICAgIGZyZWUoaW5mby0+Y29tcGF0aWJsZSk7CisgICAgcmV0dXJuIGVycjsKKyNlbHNlCisjd2FybmluZyAiTWlzc2luZyBpbXBsZW1lbnRhdGlvbiBvZiBkcm1QYXJzZUhvc3QxeERldmljZUluZm8iCisgICAgcmV0dXJuIC1FSU5WQUw7CisjZW5kaWYKK30KKworc3RhdGljIGludCBkcm1Qcm9jZXNzSG9zdDF4RGV2aWNlKGRybURldmljZVB0ciAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5vZGUsIGludCBub2RlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1haiwgaW50IG1pbiwgYm9vbCBmZXRjaF9kZXZpY2VpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKQoreworICAgIGRybURldmljZVB0ciBkZXY7CisgICAgY2hhciAqcHRyOworICAgIGludCByZXQ7CisKKyAgICBkZXYgPSBkcm1EZXZpY2VBbGxvYyhub2RlX3R5cGUsIG5vZGUsIHNpemVvZihkcm1Ib3N0MXhCdXNJbmZvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZHJtSG9zdDF4RGV2aWNlSW5mbyksICZwdHIpOworICAgIGlmICghZGV2KQorICAgICAgICByZXR1cm4gLUVOT01FTTsKKworICAgIGRldi0+YnVzdHlwZSA9IERSTV9CVVNfSE9TVDFYOworCisgICAgZGV2LT5idXNpbmZvLmhvc3QxeCA9IChkcm1Ib3N0MXhCdXNJbmZvUHRyKXB0cjsKKworICAgIHJldCA9IGRybVBhcnNlSG9zdDF4QnVzSW5mbyhtYWosIG1pbiwgZGV2LT5idXNpbmZvLmhvc3QxeCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZnJlZV9kZXZpY2U7CisKKyAgICBpZiAoZmV0Y2hfZGV2aWNlaW5mbykgeworICAgICAgICBwdHIgKz0gc2l6ZW9mKGRybUhvc3QxeEJ1c0luZm8pOworICAgICAgICBkZXYtPmRldmljZWluZm8uaG9zdDF4ID0gKGRybUhvc3QxeERldmljZUluZm9QdHIpcHRyOworCisgICAgICAgIHJldCA9IGRybVBhcnNlSG9zdDF4RGV2aWNlSW5mbyhtYWosIG1pbiwgZGV2LT5kZXZpY2VpbmZvLmhvc3QxeCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmcmVlX2RldmljZTsKKyAgICB9CisKKyAgICAqZGV2aWNlID0gZGV2OworCisgICAgcmV0dXJuIDA7CisKK2ZyZWVfZGV2aWNlOgorICAgIGZyZWUoZGV2KTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBDb25zaWRlciBkZXZpY2VzIGxvY2F0ZWQgb24gdGhlIHNhbWUgYnVzIGFzIGR1cGxpY2F0ZSBhbmQgZm9sZCB0aGUgcmVzcGVjdGl2ZQorICogZW50cmllcyBpbnRvIGEgc2luZ2xlIG9uZS4KKyAqCisgKiBOb3RlOiB0aGlzIGxlYXZlcyAiZ2FwcyIgaW4gdGhlIGFycmF5LCB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBsZW5ndGguCisgKi8KK3N0YXRpYyB2b2lkIGRybUZvbGREdXBsaWNhdGVkRGV2aWNlcyhkcm1EZXZpY2VQdHIgbG9jYWxfZGV2aWNlc1tdLCBpbnQgY291bnQpCit7CisgICAgaW50IG5vZGVfdHlwZSwgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgY291bnQ7IGorKykgeworICAgICAgICAgICAgaWYgKGRybURldmljZXNFcXVhbChsb2NhbF9kZXZpY2VzW2ldLCBsb2NhbF9kZXZpY2VzW2pdKSkgeworICAgICAgICAgICAgICAgIGxvY2FsX2RldmljZXNbaV0tPmF2YWlsYWJsZV9ub2RlcyB8PSBsb2NhbF9kZXZpY2VzW2pdLT5hdmFpbGFibGVfbm9kZXM7CisgICAgICAgICAgICAgICAgbm9kZV90eXBlID0gbG9nMihsb2NhbF9kZXZpY2VzW2pdLT5hdmFpbGFibGVfbm9kZXMpOworICAgICAgICAgICAgICAgIG1lbWNweShsb2NhbF9kZXZpY2VzW2ldLT5ub2Rlc1tub2RlX3R5cGVdLAorICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9kZXZpY2VzW2pdLT5ub2Rlc1tub2RlX3R5cGVdLCBkcm1HZXRNYXhOb2RlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBkcm1GcmVlRGV2aWNlKCZsb2NhbF9kZXZpY2VzW2pdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyogQ2hlY2sgdGhhdCB0aGUgZ2l2ZW4gZmxhZ3MgYXJlIHZhbGlkIHJldHVybmluZyAwIG9uIHN1Y2Nlc3MgKi8KK3N0YXRpYyBpbnQKK2RybV9kZXZpY2VfdmFsaWRhdGVfZmxhZ3ModWludDMyX3QgZmxhZ3MpCit7CisgICAgICAgIHJldHVybiAoZmxhZ3MgJiB+RFJNX0RFVklDRV9HRVRfUENJX1JFVklTSU9OKTsKK30KKworLyoqCisgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9wZW5lZCBkcm0gZGV2aWNlCisgKgorICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgZHJtIGRldmljZQorICogXHBhcmFtIGZsYWdzIGZlYXR1cmUvYmVoYXZpb3VyIGJpdG1hc2sKKyAqIFxwYXJhbSBkZXZpY2UgdGhlIGFkZHJlc3Mgb2YgYSBkcm1EZXZpY2VQdHIgd2hlcmUgdGhlIGluZm9ybWF0aW9uCisgKiAgICAgICAgICAgICAgIHdpbGwgYmUgYWxsb2NhdGVkIGluIHN0b3JlZAorICoKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqCisgKiBcbm90ZSBVbmxpa2UgZHJtR2V0RGV2aWNlIGl0IGRvZXMgbm90IHJldHJpZXZlIHRoZSBwY2kgZGV2aWNlIHJldmlzaW9uIGZpZWxkCisgKiB1bmxlc3MgdGhlIERSTV9ERVZJQ0VfR0VUX1BDSV9SRVZJU0lPTiBccCBmbGFnIGlzIHNldC4KKyAqLworaW50IGRybUdldERldmljZTIoaW50IGZkLCB1aW50MzJfdCBmbGFncywgZHJtRGV2aWNlUHRyICpkZXZpY2UpCit7CisjaWZkZWYgX19PcGVuQlNEX18KKyAgICAvKgorICAgICAqIERSSSBkZXZpY2Ugbm9kZXMgb24gT3BlbkJTRCBhcmUgbm90IGluIHRoZWlyIG93biBkaXJlY3RvcnksIHRoZXkgcmVzaWRlCisgICAgICogaW4gL2RldiBhbG9uZyB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIHN0YXRpY2FsbHkgZ2VuZXJhdGVkIC9kZXYgbm9kZXMuCisgICAgICogQXZvaWQgc3RhdCdpbmcgYWxsIG9mIC9kZXYgbmVlZGxlc3NseSBieSBpbXBsZW1lbnRpbmcgdGhpcyBjdXN0b20gcGF0aC4KKyAgICAgKi8KKyAgICBkcm1EZXZpY2VQdHIgICAgIGQ7CisgICAgc3RydWN0IHN0YXQgICAgICBzYnVmOworICAgIGNoYXIgICAgICAgICAgICAgbm9kZVtQQVRIX01BWCArIDFdOworICAgIGNvbnN0IGNoYXIgICAgICAqZGV2X25hbWU7CisgICAgaW50ICAgICAgICAgICAgICBub2RlX3R5cGUsIHN1YnN5c3RlbV90eXBlOworICAgIGludCAgICAgICAgICAgICAgbWFqLCBtaW4sIG4sIHJldCwgYmFzZTsKKworICAgIGlmIChmZCA9PSAtMSB8fCBkZXZpY2UgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoZnN0YXQoZmQsICZzYnVmKSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgIG1haiA9IG1ham9yKHNidWYuc3RfcmRldik7CisgICAgbWluID0gbWlub3Ioc2J1Zi5zdF9yZGV2KTsKKworICAgIGlmIChtYWogIT0gRFJNX01BSk9SIHx8ICFTX0lTQ0hSKHNidWYuc3RfbW9kZSkpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgbm9kZV90eXBlID0gZHJtR2V0TWlub3JUeXBlKG1pbik7CisgICAgaWYgKG5vZGVfdHlwZSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisKKyAgICBzd2l0Y2ggKG5vZGVfdHlwZSkgeworICAgIGNhc2UgRFJNX05PREVfUFJJTUFSWToKKyAgICAgICAgZGV2X25hbWUgPSBEUk1fREVWX05BTUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJNX05PREVfQ09OVFJPTDoKKyAgICAgICAgZGV2X25hbWUgPSBEUk1fQ09OVFJPTF9ERVZfTkFNRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEUk1fTk9ERV9SRU5ERVI6CisgICAgICAgIGRldl9uYW1lID0gRFJNX1JFTkRFUl9ERVZfTkFNRTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfTsKKworICAgIGJhc2UgPSBkcm1HZXRNaW5vckJhc2Uobm9kZV90eXBlKTsKKyAgICBpZiAoYmFzZSA8IDApCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgbiA9IHNucHJpbnRmKG5vZGUsIFBBVEhfTUFYLCBkZXZfbmFtZSwgRFJNX0RJUl9OQU1FLCBtaW4gLSBiYXNlKTsKKyAgICBpZiAobiA9PSAtMSB8fCBuID49IFBBVEhfTUFYKQorICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICBpZiAoc3RhdChub2RlLCAmc2J1ZikpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgc3Vic3lzdGVtX3R5cGUgPSBkcm1QYXJzZVN1YnN5c3RlbVR5cGUobWFqLCBtaW4pOworICAgIGlmIChzdWJzeXN0ZW1fdHlwZSAhPSBEUk1fQlVTX1BDSSkKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisKKyAgICByZXQgPSBkcm1Qcm9jZXNzUGNpRGV2aWNlKCZkLCBub2RlLCBub2RlX3R5cGUsIG1haiwgbWluLCB0cnVlLCBmbGFncyk7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICpkZXZpY2UgPSBkOworCisgICAgcmV0dXJuIDA7CisjZWxzZQorICAgIGRybURldmljZVB0ciAqbG9jYWxfZGV2aWNlczsKKyAgICBkcm1EZXZpY2VQdHIgZDsKKyAgICBESVIgKnN5c2RpcjsKKyAgICBzdHJ1Y3QgZGlyZW50ICpkZW50OworICAgIHN0cnVjdCBzdGF0IHNidWY7CisgICAgY2hhciBub2RlW1BBVEhfTUFYICsgMV07CisgICAgaW50IG5vZGVfdHlwZSwgc3Vic3lzdGVtX3R5cGU7CisgICAgaW50IG1haiwgbWluOworICAgIGludCByZXQsIGksIG5vZGVfY291bnQ7CisgICAgaW50IG1heF9jb3VudCA9IDE2OworICAgIGRldl90IGZpbmRfcmRldjsKKworICAgIGlmIChkcm1fZGV2aWNlX3ZhbGlkYXRlX2ZsYWdzKGZsYWdzKSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoZmQgPT0gLTEgfHwgZGV2aWNlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKGZzdGF0KGZkLCAmc2J1ZikpCisgICAgICAgIHJldHVybiAtZXJybm87CisKKyAgICBmaW5kX3JkZXYgPSBzYnVmLnN0X3JkZXY7CisgICAgbWFqID0gbWFqb3Ioc2J1Zi5zdF9yZGV2KTsKKyAgICBtaW4gPSBtaW5vcihzYnVmLnN0X3JkZXYpOworCisgICAgaWYgKG1haiAhPSBEUk1fTUFKT1IgfHwgIVNfSVNDSFIoc2J1Zi5zdF9tb2RlKSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBzdWJzeXN0ZW1fdHlwZSA9IGRybVBhcnNlU3Vic3lzdGVtVHlwZShtYWosIG1pbik7CisKKyAgICBsb2NhbF9kZXZpY2VzID0gY2FsbG9jKG1heF9jb3VudCwgc2l6ZW9mKGRybURldmljZVB0cikpOworICAgIGlmIChsb2NhbF9kZXZpY2VzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtRU5PTUVNOworCisgICAgc3lzZGlyID0gb3BlbmRpcihEUk1fRElSX05BTUUpOworICAgIGlmICghc3lzZGlyKSB7CisgICAgICAgIHJldCA9IC1lcnJubzsKKyAgICAgICAgZ290byBmcmVlX2xvY2FsczsKKyAgICB9CisKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoKGRlbnQgPSByZWFkZGlyKHN5c2RpcikpKSB7CisgICAgICAgIG5vZGVfdHlwZSA9IGRybUdldE5vZGVUeXBlKGRlbnQtPmRfbmFtZSk7CisgICAgICAgIGlmIChub2RlX3R5cGUgPCAwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgc25wcmludGYobm9kZSwgUEFUSF9NQVgsICIlcy8lcyIsIERSTV9ESVJfTkFNRSwgZGVudC0+ZF9uYW1lKTsKKyAgICAgICAgaWYgKHN0YXQobm9kZSwgJnNidWYpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgbWFqID0gbWFqb3Ioc2J1Zi5zdF9yZGV2KTsKKyAgICAgICAgbWluID0gbWlub3Ioc2J1Zi5zdF9yZGV2KTsKKworICAgICAgICBpZiAobWFqICE9IERSTV9NQUpPUiB8fCAhU19JU0NIUihzYnVmLnN0X21vZGUpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKGRybVBhcnNlU3Vic3lzdGVtVHlwZShtYWosIG1pbikgIT0gc3Vic3lzdGVtX3R5cGUpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBzd2l0Y2ggKHN1YnN5c3RlbV90eXBlKSB7CisgICAgICAgIGNhc2UgRFJNX0JVU19QQ0k6CisgICAgICAgICAgICByZXQgPSBkcm1Qcm9jZXNzUGNpRGV2aWNlKCZkLCBub2RlLCBub2RlX3R5cGUsIG1haiwgbWluLCB0cnVlLCBmbGFncyk7CisgICAgICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERSTV9CVVNfVVNCOgorICAgICAgICAgICAgcmV0ID0gZHJtUHJvY2Vzc1VzYkRldmljZSgmZCwgbm9kZSwgbm9kZV90eXBlLCBtYWosIG1pbiwgdHJ1ZSwgZmxhZ3MpOworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEUk1fQlVTX1BMQVRGT1JNOgorICAgICAgICAgICAgcmV0ID0gZHJtUHJvY2Vzc1BsYXRmb3JtRGV2aWNlKCZkLCBub2RlLCBub2RlX3R5cGUsIG1haiwgbWluLCB0cnVlLCBmbGFncyk7CisgICAgICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERSTV9CVVNfSE9TVDFYOgorICAgICAgICAgICAgcmV0ID0gZHJtUHJvY2Vzc0hvc3QxeERldmljZSgmZCwgbm9kZSwgbm9kZV90eXBlLCBtYWosIG1pbiwgdHJ1ZSwgZmxhZ3MpOworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPj0gbWF4X2NvdW50KSB7CisgICAgICAgICAgICBkcm1EZXZpY2VQdHIgKnRlbXA7CisKKyAgICAgICAgICAgIG1heF9jb3VudCArPSAxNjsKKyAgICAgICAgICAgIHRlbXAgPSByZWFsbG9jKGxvY2FsX2RldmljZXMsIG1heF9jb3VudCAqIHNpemVvZihkcm1EZXZpY2VQdHIpKTsKKyAgICAgICAgICAgIGlmICghdGVtcCkKKyAgICAgICAgICAgICAgICBnb3RvIGZyZWVfZGV2aWNlczsKKyAgICAgICAgICAgIGxvY2FsX2RldmljZXMgPSB0ZW1wOworICAgICAgICB9CisKKyAgICAgICAgLyogc3RvcmUgdGFyZ2V0IGF0IGxvY2FsX2RldmljZXNbMF0gZm9yIGVhc2UgdG8gdXNlIGJlbG93ICovCisgICAgICAgIGlmIChmaW5kX3JkZXYgPT0gc2J1Zi5zdF9yZGV2ICYmIGkpIHsKKyAgICAgICAgICAgIGxvY2FsX2RldmljZXNbaV0gPSBsb2NhbF9kZXZpY2VzWzBdOworICAgICAgICAgICAgbG9jYWxfZGV2aWNlc1swXSA9IGQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbG9jYWxfZGV2aWNlc1tpXSA9IGQ7CisgICAgICAgIGkrKzsKKyAgICB9CisgICAgbm9kZV9jb3VudCA9IGk7CisKKyAgICBkcm1Gb2xkRHVwbGljYXRlZERldmljZXMobG9jYWxfZGV2aWNlcywgbm9kZV9jb3VudCk7CisKKyAgICAqZGV2aWNlID0gbG9jYWxfZGV2aWNlc1swXTsKKyAgICBkcm1GcmVlRGV2aWNlcygmbG9jYWxfZGV2aWNlc1sxXSwgbm9kZV9jb3VudCAtIDEpOworCisgICAgY2xvc2VkaXIoc3lzZGlyKTsKKyAgICBmcmVlKGxvY2FsX2RldmljZXMpOworICAgIGlmICgqZGV2aWNlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIHJldHVybiAwOworCitmcmVlX2RldmljZXM6CisgICAgZHJtRnJlZURldmljZXMobG9jYWxfZGV2aWNlcywgaSk7CisgICAgY2xvc2VkaXIoc3lzZGlyKTsKKworZnJlZV9sb2NhbHM6CisgICAgZnJlZShsb2NhbF9kZXZpY2VzKTsKKyAgICByZXR1cm4gcmV0OworI2VuZGlmCit9CisKKy8qKgorICogR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcGVuZWQgZHJtIGRldmljZQorICoKKyAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGRybSBkZXZpY2UKKyAqIFxwYXJhbSBkZXZpY2UgdGhlIGFkZHJlc3Mgb2YgYSBkcm1EZXZpY2VQdHIgd2hlcmUgdGhlIGluZm9ybWF0aW9uCisgKiAgICAgICAgICAgICAgIHdpbGwgYmUgYWxsb2NhdGVkIGluIHN0b3JlZAorICoKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRybUdldERldmljZShpbnQgZmQsIGRybURldmljZVB0ciAqZGV2aWNlKQoreworICAgIHJldHVybiBkcm1HZXREZXZpY2UyKGZkLCBEUk1fREVWSUNFX0dFVF9QQ0lfUkVWSVNJT04sIGRldmljZSk7Cit9CisKKy8qKgorICogR2V0IGRybSBkZXZpY2VzIG9uIHRoZSBzeXN0ZW0KKyAqCisgKiBccGFyYW0gZmxhZ3MgZmVhdHVyZS9iZWhhdmlvdXIgYml0bWFzaworICogXHBhcmFtIGRldmljZXMgdGhlIGFycmF5IG9mIGRldmljZXMgd2l0aCBkcm1EZXZpY2VQdHIgZWxlbWVudHMKKyAqICAgICAgICAgICAgICAgIGNhbiBiZSBOVUxMIHRvIGdldCB0aGUgZGV2aWNlIG51bWJlciBmaXJzdAorICogXHBhcmFtIG1heF9kZXZpY2VzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBkZXZpY2VzIGZvciB0aGUgYXJyYXkKKyAqCisgKiBccmV0dXJuIG9uIGVycm9yIC0gbmVnYXRpdmUgZXJyb3IgY29kZSwKKyAqICAgICAgICAgaWYgZGV2aWNlcyBpcyBOVUxMIC0gdG90YWwgbnVtYmVyIG9mIGRldmljZXMgYXZhaWxhYmxlIG9uIHRoZSBzeXN0ZW0sCisgKiAgICAgICAgIGFsdGVybmF0aXZlbHkgdGhlIG51bWJlciBvZiBkZXZpY2VzIHN0b3JlZCBpbiBkZXZpY2VzW10sIHdoaWNoIGlzCisgKiAgICAgICAgIGNhcHBlZCBieSB0aGUgbWF4X2RldmljZXMuCisgKgorICogXG5vdGUgVW5saWtlIGRybUdldERldmljZXMgaXQgZG9lcyBub3QgcmV0cmlldmUgdGhlIHBjaSBkZXZpY2UgcmV2aXNpb24gZmllbGQKKyAqIHVubGVzcyB0aGUgRFJNX0RFVklDRV9HRVRfUENJX1JFVklTSU9OIFxwIGZsYWcgaXMgc2V0LgorICovCitpbnQgZHJtR2V0RGV2aWNlczIodWludDMyX3QgZmxhZ3MsIGRybURldmljZVB0ciBkZXZpY2VzW10sIGludCBtYXhfZGV2aWNlcykKK3sKKyAgICBkcm1EZXZpY2VQdHIgKmxvY2FsX2RldmljZXM7CisgICAgZHJtRGV2aWNlUHRyIGRldmljZTsKKyAgICBESVIgKnN5c2RpcjsKKyAgICBzdHJ1Y3QgZGlyZW50ICpkZW50OworICAgIHN0cnVjdCBzdGF0IHNidWY7CisgICAgY2hhciBub2RlW1BBVEhfTUFYICsgMV07CisgICAgaW50IG5vZGVfdHlwZSwgc3Vic3lzdGVtX3R5cGU7CisgICAgaW50IG1haiwgbWluOworICAgIGludCByZXQsIGksIG5vZGVfY291bnQsIGRldmljZV9jb3VudDsKKyAgICBpbnQgbWF4X2NvdW50ID0gMTY7CisKKyAgICBpZiAoZHJtX2RldmljZV92YWxpZGF0ZV9mbGFncyhmbGFncykpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgbG9jYWxfZGV2aWNlcyA9IGNhbGxvYyhtYXhfY291bnQsIHNpemVvZihkcm1EZXZpY2VQdHIpKTsKKyAgICBpZiAobG9jYWxfZGV2aWNlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLUVOT01FTTsKKworICAgIHN5c2RpciA9IG9wZW5kaXIoRFJNX0RJUl9OQU1FKTsKKyAgICBpZiAoIXN5c2RpcikgeworICAgICAgICByZXQgPSAtZXJybm87CisgICAgICAgIGdvdG8gZnJlZV9sb2NhbHM7CisgICAgfQorCisgICAgaSA9IDA7CisgICAgd2hpbGUgKChkZW50ID0gcmVhZGRpcihzeXNkaXIpKSkgeworICAgICAgICBub2RlX3R5cGUgPSBkcm1HZXROb2RlVHlwZShkZW50LT5kX25hbWUpOworICAgICAgICBpZiAobm9kZV90eXBlIDwgMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHNucHJpbnRmKG5vZGUsIFBBVEhfTUFYLCAiJXMvJXMiLCBEUk1fRElSX05BTUUsIGRlbnQtPmRfbmFtZSk7CisgICAgICAgIGlmIChzdGF0KG5vZGUsICZzYnVmKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIG1haiA9IG1ham9yKHNidWYuc3RfcmRldik7CisgICAgICAgIG1pbiA9IG1pbm9yKHNidWYuc3RfcmRldik7CisKKyAgICAgICAgaWYgKG1haiAhPSBEUk1fTUFKT1IgfHwgIVNfSVNDSFIoc2J1Zi5zdF9tb2RlKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHN1YnN5c3RlbV90eXBlID0gZHJtUGFyc2VTdWJzeXN0ZW1UeXBlKG1haiwgbWluKTsKKworICAgICAgICBpZiAoc3Vic3lzdGVtX3R5cGUgPCAwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgc3dpdGNoIChzdWJzeXN0ZW1fdHlwZSkgeworICAgICAgICBjYXNlIERSTV9CVVNfUENJOgorICAgICAgICAgICAgcmV0ID0gZHJtUHJvY2Vzc1BjaURldmljZSgmZGV2aWNlLCBub2RlLCBub2RlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haiwgbWluLCBkZXZpY2VzICE9IE5VTEwsIGZsYWdzKTsKKyAgICAgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRFJNX0JVU19VU0I6CisgICAgICAgICAgICByZXQgPSBkcm1Qcm9jZXNzVXNiRGV2aWNlKCZkZXZpY2UsIG5vZGUsIG5vZGVfdHlwZSwgbWFqLCBtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMgIT0gTlVMTCwgZmxhZ3MpOworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEUk1fQlVTX1BMQVRGT1JNOgorICAgICAgICAgICAgcmV0ID0gZHJtUHJvY2Vzc1BsYXRmb3JtRGV2aWNlKCZkZXZpY2UsIG5vZGUsIG5vZGVfdHlwZSwgbWFqLCBtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcyAhPSBOVUxMLCBmbGFncyk7CisgICAgICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERSTV9CVVNfSE9TVDFYOgorICAgICAgICAgICAgcmV0ID0gZHJtUHJvY2Vzc0hvc3QxeERldmljZSgmZGV2aWNlLCBub2RlLCBub2RlX3R5cGUsIG1haiwgbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzICE9IE5VTEwsIGZsYWdzKTsKKyAgICAgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpID49IG1heF9jb3VudCkgeworICAgICAgICAgICAgZHJtRGV2aWNlUHRyICp0ZW1wOworCisgICAgICAgICAgICBtYXhfY291bnQgKz0gMTY7CisgICAgICAgICAgICB0ZW1wID0gcmVhbGxvYyhsb2NhbF9kZXZpY2VzLCBtYXhfY291bnQgKiBzaXplb2YoZHJtRGV2aWNlUHRyKSk7CisgICAgICAgICAgICBpZiAoIXRlbXApCisgICAgICAgICAgICAgICAgZ290byBmcmVlX2RldmljZXM7CisgICAgICAgICAgICBsb2NhbF9kZXZpY2VzID0gdGVtcDsKKyAgICAgICAgfQorCisgICAgICAgIGxvY2FsX2RldmljZXNbaV0gPSBkZXZpY2U7CisgICAgICAgIGkrKzsKKyAgICB9CisgICAgbm9kZV9jb3VudCA9IGk7CisKKyAgICBkcm1Gb2xkRHVwbGljYXRlZERldmljZXMobG9jYWxfZGV2aWNlcywgbm9kZV9jb3VudCk7CisKKyAgICBkZXZpY2VfY291bnQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBub2RlX2NvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKCFsb2NhbF9kZXZpY2VzW2ldKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKChkZXZpY2VzICE9IE5VTEwpICYmIChkZXZpY2VfY291bnQgPCBtYXhfZGV2aWNlcykpCisgICAgICAgICAgICBkZXZpY2VzW2RldmljZV9jb3VudF0gPSBsb2NhbF9kZXZpY2VzW2ldOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkcm1GcmVlRGV2aWNlKCZsb2NhbF9kZXZpY2VzW2ldKTsKKworICAgICAgICBkZXZpY2VfY291bnQrKzsKKyAgICB9CisKKyAgICBjbG9zZWRpcihzeXNkaXIpOworICAgIGZyZWUobG9jYWxfZGV2aWNlcyk7CisgICAgcmV0dXJuIGRldmljZV9jb3VudDsKKworZnJlZV9kZXZpY2VzOgorICAgIGRybUZyZWVEZXZpY2VzKGxvY2FsX2RldmljZXMsIGkpOworICAgIGNsb3NlZGlyKHN5c2Rpcik7CisKK2ZyZWVfbG9jYWxzOgorICAgIGZyZWUobG9jYWxfZGV2aWNlcyk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBHZXQgZHJtIGRldmljZXMgb24gdGhlIHN5c3RlbQorICoKKyAqIFxwYXJhbSBkZXZpY2VzIHRoZSBhcnJheSBvZiBkZXZpY2VzIHdpdGggZHJtRGV2aWNlUHRyIGVsZW1lbnRzCisgKiAgICAgICAgICAgICAgICBjYW4gYmUgTlVMTCB0byBnZXQgdGhlIGRldmljZSBudW1iZXIgZmlyc3QKKyAqIFxwYXJhbSBtYXhfZGV2aWNlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZGV2aWNlcyBmb3IgdGhlIGFycmF5CisgKgorICogXHJldHVybiBvbiBlcnJvciAtIG5lZ2F0aXZlIGVycm9yIGNvZGUsCisgKiAgICAgICAgIGlmIGRldmljZXMgaXMgTlVMTCAtIHRvdGFsIG51bWJlciBvZiBkZXZpY2VzIGF2YWlsYWJsZSBvbiB0aGUgc3lzdGVtLAorICogICAgICAgICBhbHRlcm5hdGl2ZWx5IHRoZSBudW1iZXIgb2YgZGV2aWNlcyBzdG9yZWQgaW4gZGV2aWNlc1tdLCB3aGljaCBpcworICogICAgICAgICBjYXBwZWQgYnkgdGhlIG1heF9kZXZpY2VzLgorICovCitpbnQgZHJtR2V0RGV2aWNlcyhkcm1EZXZpY2VQdHIgZGV2aWNlc1tdLCBpbnQgbWF4X2RldmljZXMpCit7CisgICAgcmV0dXJuIGRybUdldERldmljZXMyKERSTV9ERVZJQ0VfR0VUX1BDSV9SRVZJU0lPTiwgZGV2aWNlcywgbWF4X2RldmljZXMpOworfQorCitjaGFyICpkcm1HZXREZXZpY2VOYW1lRnJvbUZkMihpbnQgZmQpCit7CisjaWZkZWYgX19saW51eF9fCisgICAgc3RydWN0IHN0YXQgc2J1ZjsKKyAgICBjaGFyIHBhdGhbUEFUSF9NQVggKyAxXSwgKnZhbHVlOworICAgIHVuc2lnbmVkIGludCBtYWosIG1pbjsKKworICAgIGlmIChmc3RhdChmZCwgJnNidWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG1haiA9IG1ham9yKHNidWYuc3RfcmRldik7CisgICAgbWluID0gbWlub3Ioc2J1Zi5zdF9yZGV2KTsKKworICAgIGlmIChtYWogIT0gRFJNX01BSk9SIHx8ICFTX0lTQ0hSKHNidWYuc3RfbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAiL3N5cy9kZXYvY2hhci8lZDolZCIsIG1haiwgbWluKTsKKworICAgIHZhbHVlID0gc3lzZnNfdWV2ZW50X2dldChwYXRoLCAiREVWTkFNRSIpOworICAgIGlmICghdmFsdWUpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAiL2Rldi8lcyIsIHZhbHVlKTsKKyAgICBmcmVlKHZhbHVlKTsKKworICAgIHJldHVybiBzdHJkdXAocGF0aCk7CisjZWxzZQorICAgIHN0cnVjdCBzdGF0ICAgICAgc2J1ZjsKKyAgICBjaGFyICAgICAgICAgICAgIG5vZGVbUEFUSF9NQVggKyAxXTsKKyAgICBjb25zdCBjaGFyICAgICAgKmRldl9uYW1lOworICAgIGludCAgICAgICAgICAgICAgbm9kZV90eXBlOworICAgIGludCAgICAgICAgICAgICAgbWFqLCBtaW4sIG4sIGJhc2U7CisKKyAgICBpZiAoZnN0YXQoZmQsICZzYnVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBtYWogPSBtYWpvcihzYnVmLnN0X3JkZXYpOworICAgIG1pbiA9IG1pbm9yKHNidWYuc3RfcmRldik7CisKKyAgICBpZiAobWFqICE9IERSTV9NQUpPUiB8fCAhU19JU0NIUihzYnVmLnN0X21vZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG5vZGVfdHlwZSA9IGRybUdldE1pbm9yVHlwZShtaW4pOworICAgIGlmIChub2RlX3R5cGUgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgc3dpdGNoIChub2RlX3R5cGUpIHsKKyAgICBjYXNlIERSTV9OT0RFX1BSSU1BUlk6CisgICAgICAgIGRldl9uYW1lID0gRFJNX0RFVl9OQU1FOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSTV9OT0RFX0NPTlRST0w6CisgICAgICAgIGRldl9uYW1lID0gRFJNX0NPTlRST0xfREVWX05BTUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJNX05PREVfUkVOREVSOgorICAgICAgICBkZXZfbmFtZSA9IERSTV9SRU5ERVJfREVWX05BTUU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH07CisKKyAgICBiYXNlID0gZHJtR2V0TWlub3JCYXNlKG5vZGVfdHlwZSk7CisgICAgaWYgKGJhc2UgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG4gPSBzbnByaW50Zihub2RlLCBQQVRIX01BWCwgZGV2X25hbWUsIERSTV9ESVJfTkFNRSwgbWluIC0gYmFzZSk7CisgICAgaWYgKG4gPT0gLTEgfHwgbiA+PSBQQVRIX01BWCkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIHN0cmR1cChub2RlKTsKKyNlbmRpZgorfQorCitpbnQgZHJtU3luY29iakNyZWF0ZShpbnQgZmQsIHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCAqaGFuZGxlKQoreworICAgIHN0cnVjdCBkcm1fc3luY29ial9jcmVhdGUgYXJnczsKKyAgICBpbnQgcmV0OworCisgICAgbWVtY2xlYXIoYXJncyk7CisgICAgYXJncy5mbGFncyA9IGZsYWdzOworICAgIGFyZ3MuaGFuZGxlID0gMDsKKyAgICByZXQgPSBkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX1NZTkNPQkpfQ1JFQVRFLCAmYXJncyk7CisgICAgaWYgKHJldCkKKwlyZXR1cm4gcmV0OworICAgICpoYW5kbGUgPSBhcmdzLmhhbmRsZTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGRybVN5bmNvYmpEZXN0cm95KGludCBmZCwgdWludDMyX3QgaGFuZGxlKQoreworICAgIHN0cnVjdCBkcm1fc3luY29ial9kZXN0cm95IGFyZ3M7CisKKyAgICBtZW1jbGVhcihhcmdzKTsKKyAgICBhcmdzLmhhbmRsZSA9IGhhbmRsZTsKKyAgICByZXR1cm4gZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9TWU5DT0JKX0RFU1RST1ksICZhcmdzKTsKK30KKworaW50IGRybVN5bmNvYmpIYW5kbGVUb0ZEKGludCBmZCwgdWludDMyX3QgaGFuZGxlLCBpbnQgKm9ial9mZCkKK3sKKyAgICBzdHJ1Y3QgZHJtX3N5bmNvYmpfaGFuZGxlIGFyZ3M7CisgICAgaW50IHJldDsKKworICAgIG1lbWNsZWFyKGFyZ3MpOworICAgIGFyZ3MuZmQgPSAtMTsKKyAgICBhcmdzLmhhbmRsZSA9IGhhbmRsZTsKKyAgICByZXQgPSBkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX1NZTkNPQkpfSEFORExFX1RPX0ZELCAmYXJncyk7CisgICAgaWYgKHJldCkKKwlyZXR1cm4gcmV0OworICAgICpvYmpfZmQgPSBhcmdzLmZkOworICAgIHJldHVybiAwOworfQorCitpbnQgZHJtU3luY29iakZEVG9IYW5kbGUoaW50IGZkLCBpbnQgb2JqX2ZkLCB1aW50MzJfdCAqaGFuZGxlKQoreworICAgIHN0cnVjdCBkcm1fc3luY29ial9oYW5kbGUgYXJnczsKKyAgICBpbnQgcmV0OworCisgICAgbWVtY2xlYXIoYXJncyk7CisgICAgYXJncy5mZCA9IG9ial9mZDsKKyAgICBhcmdzLmhhbmRsZSA9IDA7CisgICAgcmV0ID0gZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9TWU5DT0JKX0ZEX1RPX0hBTkRMRSwgJmFyZ3MpOworICAgIGlmIChyZXQpCisJcmV0dXJuIHJldDsKKyAgICAqaGFuZGxlID0gYXJncy5oYW5kbGU7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1TeW5jb2JqSW1wb3J0U3luY0ZpbGUoaW50IGZkLCB1aW50MzJfdCBoYW5kbGUsIGludCBzeW5jX2ZpbGVfZmQpCit7CisgICAgc3RydWN0IGRybV9zeW5jb2JqX2hhbmRsZSBhcmdzOworCisgICAgbWVtY2xlYXIoYXJncyk7CisgICAgYXJncy5mZCA9IHN5bmNfZmlsZV9mZDsKKyAgICBhcmdzLmhhbmRsZSA9IGhhbmRsZTsKKyAgICBhcmdzLmZsYWdzID0gRFJNX1NZTkNPQkpfRkRfVE9fSEFORExFX0ZMQUdTX0lNUE9SVF9TWU5DX0ZJTEU7CisgICAgcmV0dXJuIGRybUlvY3RsKGZkLCBEUk1fSU9DVExfU1lOQ09CSl9GRF9UT19IQU5ETEUsICZhcmdzKTsKK30KKworaW50IGRybVN5bmNvYmpFeHBvcnRTeW5jRmlsZShpbnQgZmQsIHVpbnQzMl90IGhhbmRsZSwgaW50ICpzeW5jX2ZpbGVfZmQpCit7CisgICAgc3RydWN0IGRybV9zeW5jb2JqX2hhbmRsZSBhcmdzOworICAgIGludCByZXQ7CisKKyAgICBtZW1jbGVhcihhcmdzKTsKKyAgICBhcmdzLmZkID0gLTE7CisgICAgYXJncy5oYW5kbGUgPSBoYW5kbGU7CisgICAgYXJncy5mbGFncyA9IERSTV9TWU5DT0JKX0hBTkRMRV9UT19GRF9GTEFHU19FWFBPUlRfU1lOQ19GSUxFOworICAgIHJldCA9IGRybUlvY3RsKGZkLCBEUk1fSU9DVExfU1lOQ09CSl9IQU5ETEVfVE9fRkQsICZhcmdzKTsKKyAgICBpZiAocmV0KQorCXJldHVybiByZXQ7CisgICAgKnN5bmNfZmlsZV9mZCA9IGFyZ3MuZmQ7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1TeW5jb2JqV2FpdChpbnQgZmQsIHVpbnQzMl90ICpoYW5kbGVzLCB1bnNpZ25lZCBudW1faGFuZGxlcywKKwkJICAgaW50NjRfdCB0aW1lb3V0X25zZWMsIHVuc2lnbmVkIGZsYWdzLAorCQkgICB1aW50MzJfdCAqZmlyc3Rfc2lnbmFsZWQpCit7CisJc3RydWN0IGRybV9zeW5jb2JqX3dhaXQgYXJnczsKKwlpbnQgcmV0OworCisJbWVtY2xlYXIoYXJncyk7CisJYXJncy5oYW5kbGVzID0gKGludHB0cl90KWhhbmRsZXM7CisJYXJncy50aW1lb3V0X25zZWMgPSB0aW1lb3V0X25zZWM7CisJYXJncy5jb3VudF9oYW5kbGVzID0gbnVtX2hhbmRsZXM7CisJYXJncy5mbGFncyA9IGZsYWdzOworCisJcmV0ID0gZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9TWU5DT0JKX1dBSVQsICZhcmdzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChmaXJzdF9zaWduYWxlZCkKKwkJKmZpcnN0X3NpZ25hbGVkID0gYXJncy5maXJzdF9zaWduYWxlZDsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEveGY4NmRybS5oIGIveGY4NmRybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNjUwZWYKLS0tIC9kZXYvbnVsbAorKysgYi94Zjg2ZHJtLmgKQEAgLTAsMCArMSw4NzEgQEAKKy8qKgorICogXGZpbGUgeGY4NmRybS5oIAorICogT1MtaW5kZXBlbmRlbnQgaGVhZGVyIGZvciBEUk0gdXNlci1sZXZlbCBsaWJyYXJ5IGludGVyZmFjZS4KKyAqCisgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICovCisgCisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX1hGODZEUk1fSF8KKyNkZWZpbmUgX1hGODZEUk1fSF8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGRybS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZm5kZWYgRFJNX01BWF9NSU5PUgorI2RlZmluZSBEUk1fTUFYX01JTk9SICAgMTYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisKKyNkZWZpbmUgRFJNX0lPQ1RMX05SKG4pCQlfSU9DX05SKG4pCisjZGVmaW5lIERSTV9JT0NfVk9JRAkJX0lPQ19OT05FCisjZGVmaW5lIERSTV9JT0NfUkVBRAkJX0lPQ19SRUFECisjZGVmaW5lIERSTV9JT0NfV1JJVEUJCV9JT0NfV1JJVEUKKyNkZWZpbmUgRFJNX0lPQ19SRUFEV1JJVEUJX0lPQ19SRUFEfF9JT0NfV1JJVEUKKyNkZWZpbmUgRFJNX0lPQyhkaXIsIGdyb3VwLCBuciwgc2l6ZSkgX0lPQyhkaXIsIGdyb3VwLCBuciwgc2l6ZSkKKworI2Vsc2UgLyogT25lIG9mIHRoZSAqQlNEcyAqLworCisjaW5jbHVkZSA8c3lzL2lvY2NvbS5oPgorI2RlZmluZSBEUk1fSU9DVExfTlIobikgICAgICAgICAoKG4pICYgMHhmZikKKyNkZWZpbmUgRFJNX0lPQ19WT0lEICAgICAgICAgICAgSU9DX1ZPSUQKKyNkZWZpbmUgRFJNX0lPQ19SRUFEICAgICAgICAgICAgSU9DX09VVAorI2RlZmluZSBEUk1fSU9DX1dSSVRFICAgICAgICAgICBJT0NfSU4KKyNkZWZpbmUgRFJNX0lPQ19SRUFEV1JJVEUgICAgICAgSU9DX0lOT1VUCisjZGVmaW5lIERSTV9JT0MoZGlyLCBncm91cCwgbnIsIHNpemUpIF9JT0MoZGlyLCBncm91cCwgbnIsIHNpemUpCisKKyNlbmRpZgorCisJCQkJLyogRGVmYXVsdHMsIGlmIG5vdGhpbmcgc2V0IGluIHhmODZjb25maWcgKi8KKyNkZWZpbmUgRFJNX0RFVl9VSUQJIDAKKyNkZWZpbmUgRFJNX0RFVl9HSUQJIDAKKy8qIERlZmF1bHQgL2Rldi9kcmkgZGlyZWN0b3J5IHBlcm1pc3Npb25zIDA3NTUgKi8KKyNkZWZpbmUgRFJNX0RFVl9ESVJNT0RFCSAJXAorCShTX0lSVVNSfFNfSVdVU1J8U19JWFVTUnxTX0lSR1JQfFNfSVhHUlB8U19JUk9USHxTX0lYT1RIKQorI2RlZmluZSBEUk1fREVWX01PREUJIChTX0lSVVNSfFNfSVdVU1J8U19JUkdSUHxTX0lXR1JQKQorCisjaWZkZWYgX19PcGVuQlNEX18KKyNkZWZpbmUgRFJNX0RJUl9OQU1FICAiL2RldiIKKyNkZWZpbmUgRFJNX0RFVl9OQU1FICAiJXMvZHJtJWQiCisjZGVmaW5lIERSTV9DT05UUk9MX0RFVl9OQU1FICAiJXMvZHJtQyVkIgorI2RlZmluZSBEUk1fUkVOREVSX0RFVl9OQU1FICAiJXMvZHJtUiVkIgorI2Vsc2UKKyNkZWZpbmUgRFJNX0RJUl9OQU1FICAiL2Rldi9kcmkiCisjZGVmaW5lIERSTV9ERVZfTkFNRSAgIiVzL2NhcmQlZCIKKyNkZWZpbmUgRFJNX0NPTlRST0xfREVWX05BTUUgICIlcy9jb250cm9sRCVkIgorI2RlZmluZSBEUk1fUkVOREVSX0RFVl9OQU1FICAiJXMvcmVuZGVyRCVkIgorI2RlZmluZSBEUk1fUFJPQ19OQU1FICIvcHJvYy9kcmkvIiAvKiBGb3IgYmFja3dhcmQgTGludXggY29tcGF0aWJpbGl0eSAqLworI2VuZGlmCisKKyNkZWZpbmUgRFJNX0VSUl9OT19ERVZJQ0UgICgtMTAwMSkKKyNkZWZpbmUgRFJNX0VSUl9OT19BQ0NFU1MgICgtMTAwMikKKyNkZWZpbmUgRFJNX0VSUl9OT1RfUk9PVCAgICgtMTAwMykKKyNkZWZpbmUgRFJNX0VSUl9JTlZBTElEICAgICgtMTAwNCkKKyNkZWZpbmUgRFJNX0VSUl9OT19GRCAgICAgICgtMTAwNSkKKworI2RlZmluZSBEUk1fQUdQX05PX0hBTkRMRSAwCisKK3R5cGVkZWYgdW5zaWduZWQgaW50ICBkcm1TaXplLCAgICAgKmRybVNpemVQdHI7CSAgICAvKio8IEZvciBtYXBwZWQgcmVnaW9ucyAqLwordHlwZWRlZiB2b2lkICAgICAgICAgICpkcm1BZGRyZXNzLCAqKmRybUFkZHJlc3NQdHI7IC8qKjwgRm9yIG1hcHBlZCByZWdpb25zICovCisKKyNpZiAoX19HTlVDX18gPj0gMykKKyNkZWZpbmUgRFJNX1BSSU5URkxJS0UoZiwgYSkgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdChfX3ByaW50Zl9fLCBmLCBhKSkpCisjZWxzZQorI2RlZmluZSBEUk1fUFJJTlRGTElLRShmLCBhKQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IF9kcm1TZXJ2ZXJJbmZvIHsKKyAgaW50ICgqZGVidWdfcHJpbnQpKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkgRFJNX1BSSU5URkxJS0UoMSwwKTsKKyAgaW50ICgqbG9hZF9tb2R1bGUpKGNvbnN0IGNoYXIgKm5hbWUpOworICB2b2lkICgqZ2V0X3Blcm1zKShnaWRfdCAqLCBtb2RlX3QgKik7Cit9IGRybVNlcnZlckluZm8sICpkcm1TZXJ2ZXJJbmZvUHRyOworCit0eXBlZGVmIHN0cnVjdCBkcm1IYXNoRW50cnkgeworICAgIGludCAgICAgIGZkOworICAgIHZvaWQgICAgICgqZikoaW50LCB2b2lkICosIHZvaWQgKik7CisgICAgdm9pZCAgICAgKnRhZ1RhYmxlOworfSBkcm1IYXNoRW50cnk7CisKK2V4dGVybiBpbnQgZHJtSW9jdGwoaW50IGZkLCB1bnNpZ25lZCBsb25nIHJlcXVlc3QsIHZvaWQgKmFyZyk7CitleHRlcm4gdm9pZCAqZHJtR2V0SGFzaFRhYmxlKHZvaWQpOworZXh0ZXJuIGRybUhhc2hFbnRyeSAqZHJtR2V0RW50cnkoaW50IGZkKTsKKworLyoqCisgKiBEcml2ZXIgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKyAqCisgKiBcc2EgZHJtR2V0VmVyc2lvbigpIGFuZCBkcm1TZXRWZXJzaW9uKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9kcm1WZXJzaW9uIHsKKyAgICBpbnQgICAgIHZlcnNpb25fbWFqb3I7ICAgICAgICAvKio8IE1ham9yIHZlcnNpb24gKi8KKyAgICBpbnQgICAgIHZlcnNpb25fbWlub3I7ICAgICAgICAvKio8IE1pbm9yIHZlcnNpb24gKi8KKyAgICBpbnQgICAgIHZlcnNpb25fcGF0Y2hsZXZlbDsgICAvKio8IFBhdGNoIGxldmVsICovCisgICAgaW50ICAgICBuYW1lX2xlbjsgCSAgICAgICAgICAvKio8IExlbmd0aCBvZiBuYW1lIGJ1ZmZlciAqLworICAgIGNoYXIgICAgKm5hbWU7CSAgICAgICAgICAvKio8IE5hbWUgb2YgZHJpdmVyICovCisgICAgaW50ICAgICBkYXRlX2xlbjsgICAgICAgICAgICAgLyoqPCBMZW5ndGggb2YgZGF0ZSBidWZmZXIgKi8KKyAgICBjaGFyICAgICpkYXRlOyAgICAgICAgICAgICAgICAvKio8IFVzZXItc3BhY2UgYnVmZmVyIHRvIGhvbGQgZGF0ZSAqLworICAgIGludCAgICAgZGVzY19sZW47CSAgICAgICAgICAvKio8IExlbmd0aCBvZiBkZXNjIGJ1ZmZlciAqLworICAgIGNoYXIgICAgKmRlc2M7ICAgICAgICAgICAgICAgIC8qKjwgVXNlci1zcGFjZSBidWZmZXIgdG8gaG9sZCBkZXNjICovCit9IGRybVZlcnNpb24sICpkcm1WZXJzaW9uUHRyOworCit0eXBlZGVmIHN0cnVjdCBfZHJtU3RhdHMgeworICAgIHVuc2lnbmVkIGxvbmcgY291bnQ7CSAgICAgLyoqPCBOdW1iZXIgb2YgZGF0YSAqLworICAgIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsJICAgICAvKio8IFZhbHVlIGZyb20ga2VybmVsICovCisJY29uc3QgY2hhciAgICAqbG9uZ19mb3JtYXQ7ICAvKio8IFN1Z2dlc3RlZCBmb3JtYXQgZm9yIGxvbmdfbmFtZSAqLworCWNvbnN0IGNoYXIgICAgKmxvbmdfbmFtZTsgICAgLyoqPCBMb25nIG5hbWUgZm9yIHZhbHVlICovCisJY29uc3QgY2hhciAgICAqcmF0ZV9mb3JtYXQ7ICAvKio8IFN1Z2dlc3RlZCBmb3JtYXQgZm9yIHJhdGVfbmFtZSAqLworCWNvbnN0IGNoYXIgICAgKnJhdGVfbmFtZTsgICAgLyoqPCBTaG9ydCBuYW1lIGZvciB2YWx1ZSBwZXIgc2Vjb25kICovCisJaW50ICAgICAgICAgICBpc3ZhbHVlOyAgICAgICAvKio8IFRydWUgaWYgdmFsdWUgKHZzLiBjb3VudGVyKSAqLworCWNvbnN0IGNoYXIgICAgKm11bHRfbmFtZXM7ICAgLyoqPCBNdWx0aXBsaWVyIG5hbWVzIChlLmcuLCAiS0dNIikgKi8KKwlpbnQgICAgICAgICAgIG11bHQ7ICAgICAgICAgIC8qKjwgTXVsdGlwbGllciB2YWx1ZSAoZS5nLiwgMTAyNCkgKi8KKwlpbnQgICAgICAgICAgIHZlcmJvc2U7ICAgICAgIC8qKjwgU3VnZ2VzdCBvbmx5IGluIHZlcmJvc2Ugb3V0cHV0ICovCisgICAgfSBkYXRhWzE1XTsKK30gZHJtU3RhdHNUOworCisKKwkJCQkvKiBBbGwgb2YgdGhlc2UgZW51bXMgKk1VU1QqIG1hdGNoIHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiAtLSBzbyBkbyAqTk9UKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgdGhlbSEgIChUaGUgZHJtbGliIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwganVzdCBjb3B5IHRoZSBmbGFncyBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW5nIHRoZW0uKSAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBEUk1fRlJBTUVfQlVGRkVSICAgID0gMCwgICAgICAvKio8IFdDLCBubyBjYWNoaW5nLCBubyBjb3JlIGR1bXAgKi8KKyAgICBEUk1fUkVHSVNURVJTICAgICAgID0gMSwgICAgICAvKio8IG5vIGNhY2hpbmcsIG5vIGNvcmUgZHVtcCAqLworICAgIERSTV9TSE0gICAgICAgICAgICAgPSAyLCAgICAgIC8qKjwgc2hhcmVkLCBjYWNoZWQgKi8KKyAgICBEUk1fQUdQICAgICAgICAgICAgID0gMywJICAvKio8IEFHUC9HQVJUICovCisgICAgRFJNX1NDQVRURVJfR0FUSEVSICA9IDQsCSAgLyoqPCBQQ0kgc2NhdHRlci9nYXRoZXIgKi8KKyAgICBEUk1fQ09OU0lTVEVOVCAgICAgID0gNQkgIC8qKjwgUENJIGNvbnNpc3RlbnQgKi8KK30gZHJtTWFwVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBEUk1fUkVTVFJJQ1RFRCAgICAgID0gMHgwMDAxLCAvKio8IENhbm5vdCBiZSBtYXBwZWQgdG8gY2xpZW50LXZpcnR1YWwgKi8KKyAgICBEUk1fUkVBRF9PTkxZICAgICAgID0gMHgwMDAyLCAvKio8IFJlYWQtb25seSBpbiBjbGllbnQtdmlydHVhbCAqLworICAgIERSTV9MT0NLRUQgICAgICAgICAgPSAweDAwMDQsIC8qKjwgUGh5c2ljYWwgcGFnZXMgbG9ja2VkICovCisgICAgRFJNX0tFUk5FTCAgICAgICAgICA9IDB4MDAwOCwgLyoqPCBLZXJuZWwgcmVxdWlyZXMgYWNjZXNzICovCisgICAgRFJNX1dSSVRFX0NPTUJJTklORyA9IDB4MDAxMCwgLyoqPCBVc2Ugd3JpdGUtY29tYmluaW5nLCBpZiBhdmFpbGFibGUgKi8KKyAgICBEUk1fQ09OVEFJTlNfTE9DSyAgID0gMHgwMDIwLCAvKio8IFNITSBwYWdlIHRoYXQgY29udGFpbnMgbG9jayAqLworICAgIERSTV9SRU1PVkFCTEUJPSAweDAwNDAgIC8qKjwgUmVtb3ZhYmxlIG1hcHBpbmcgKi8KK30gZHJtTWFwRmxhZ3M7CisKKy8qKgorICogXHdhcm5pbmcgVGhlc2UgdmFsdWVzICpNVVNUKiBtYXRjaCBkcm0uaAorICovCit0eXBlZGVmIGVudW0geworICAgIC8qKiBcbmFtZSBGbGFncyBmb3IgRE1BIGJ1ZmZlciBkaXNwYXRjaCAqLworICAgIC8qQHsqLworICAgIERSTV9ETUFfQkxPQ0sgICAgICAgID0gMHgwMSwgLyoqPCAKKwkJCQkgICogQmxvY2sgdW50aWwgYnVmZmVyIGRpc3BhdGNoZWQuCisJCQkJICAqIAorCQkJCSAgKiBcbm90ZSB0aGUgYnVmZmVyIG1heSBub3QgeWV0IGhhdmUgYmVlbgorCQkJCSAgKiBwcm9jZXNzZWQgYnkgdGhlIGhhcmR3YXJlIC0tIGdldHRpbmcgYQorCQkJCSAgKiBoYXJkd2FyZSBsb2NrIHdpdGggdGhlIGhhcmR3YXJlIHF1aWVzY2VudAorCQkJCSAgKiB3aWxsIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4KKwkJCQkgICogcHJvY2Vzc2VkLgorCQkJCSAgKi8KKyAgICBEUk1fRE1BX1dISUxFX0xPQ0tFRCA9IDB4MDIsIC8qKjwgRGlzcGF0Y2ggd2hpbGUgbG9jayBoZWxkICovCisgICAgRFJNX0RNQV9QUklPUklUWSAgICAgPSAweDA0LCAvKio8IEhpZ2ggcHJpb3JpdHkgZGlzcGF0Y2ggKi8KKyAgICAvKkB9Ki8KKworICAgIC8qKiBcbmFtZSBGbGFncyBmb3IgRE1BIGJ1ZmZlciByZXF1ZXN0ICovCisgICAgLypAeyovCisgICAgRFJNX0RNQV9XQUlUICAgICAgICAgPSAweDEwLCAvKio8IFdhaXQgZm9yIGZyZWUgYnVmZmVycyAqLworICAgIERSTV9ETUFfU01BTExFUl9PSyAgID0gMHgyMCwgLyoqPCBTbWFsbGVyLXRoYW4tcmVxdWVzdGVkIGJ1ZmZlcnMgT0sgKi8KKyAgICBEUk1fRE1BX0xBUkdFUl9PSyAgICA9IDB4NDAgIC8qKjwgTGFyZ2VyLXRoYW4tcmVxdWVzdGVkIGJ1ZmZlcnMgT0sgKi8KKyAgICAvKkB9Ki8KK30gZHJtRE1BRmxhZ3M7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRFJNX1BBR0VfQUxJR04gICAgICAgPSAweDAxLAorICAgIERSTV9BR1BfQlVGRkVSICAgICAgID0gMHgwMiwKKyAgICBEUk1fU0dfQlVGRkVSICAgICAgICA9IDB4MDQsCisgICAgRFJNX0ZCX0JVRkZFUiAgICAgICAgPSAweDA4LAorICAgIERSTV9QQ0lfQlVGRkVSX1JPICAgID0gMHgxMAorfSBkcm1CdWZEZXNjRmxhZ3M7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRFJNX0xPQ0tfUkVBRFkgICAgICA9IDB4MDEsIC8qKjwgV2FpdCB1bnRpbCBoYXJkd2FyZSBpcyByZWFkeSBmb3IgRE1BICovCisgICAgRFJNX0xPQ0tfUVVJRVNDRU5UICA9IDB4MDIsIC8qKjwgV2FpdCB1bnRpbCBoYXJkd2FyZSBxdWllc2NlbnQgKi8KKyAgICBEUk1fTE9DS19GTFVTSCAgICAgID0gMHgwNCwgLyoqPCBGbHVzaCB0aGlzIGNvbnRleHQncyBETUEgcXVldWUgZmlyc3QgKi8KKyAgICBEUk1fTE9DS19GTFVTSF9BTEwgID0gMHgwOCwgLyoqPCBGbHVzaCBhbGwgRE1BIHF1ZXVlcyBmaXJzdCAqLworCQkJCS8qIFRoZXNlICpIQUxUKiBmbGFncyBhcmVuJ3Qgc3VwcG9ydGVkIHlldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB0aGV5IHdpbGwgYmUgdXNlZCB0byBzdXBwb3J0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsLXNjcmVlbiBER0EtbGlrZSBtb2RlLiAqLworICAgIERSTV9IQUxUX0FMTF9RVUVVRVMgPSAweDEwLCAvKio8IEhhbHQgYWxsIGN1cnJlbnQgYW5kIGZ1dHVyZSBxdWV1ZXMgKi8KKyAgICBEUk1fSEFMVF9DVVJfUVVFVUVTID0gMHgyMCAgLyoqPCBIYWx0IGFsbCBjdXJyZW50IHF1ZXVlcyAqLworfSBkcm1Mb2NrRmxhZ3M7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRFJNX0NPTlRFWFRfUFJFU0VSVkVEID0gMHgwMSwgLyoqPCBUaGlzIGNvbnRleHQgaXMgcHJlc2VydmVkIGFuZAorCQkJCSAgICAgbmV2ZXIgc3dhcHBlZC4gKi8KKyAgICBEUk1fQ09OVEVYVF8yRE9OTFkgICAgPSAweDAyICAvKio8IFRoaXMgY29udGV4dCBpcyBmb3IgMkQgcmVuZGVyaW5nIG9ubHkuICovCit9IGRybV9jb250ZXh0X3RGbGFncywgKmRybV9jb250ZXh0X3RGbGFnc1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybUJ1ZkRlc2MgeworICAgIGludCAgICAgICAgICAgICAgY291bnQ7CSAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyBvZiB0aGlzIHNpemUgKi8KKyAgICBpbnQgICAgICAgICAgICAgIHNpemU7CSAgLyoqPCBTaXplIGluIGJ5dGVzICovCisgICAgaW50ICAgICAgICAgICAgICBsb3dfbWFyazsJICAvKio8IExvdyB3YXRlciBtYXJrICovCisgICAgaW50ICAgICAgICAgICAgICBoaWdoX21hcms7CSAgLyoqPCBIaWdoIHdhdGVyIG1hcmsgKi8KK30gZHJtQnVmRGVzYywgKmRybUJ1ZkRlc2NQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1CdWZJbmZvIHsKKyAgICBpbnQgICAgICAgICAgICAgIGNvdW50OwkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgZGVzY3JpYmVkIGluIGxpc3QgKi8KKyAgICBkcm1CdWZEZXNjUHRyICAgIGxpc3Q7CSAgLyoqPCBMaXN0IG9mIGJ1ZmZlciBkZXNjcmlwdGlvbnMgKi8KK30gZHJtQnVmSW5mbywgKmRybUJ1ZkluZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1CdWYgeworICAgIGludCAgICAgICAgICAgICAgaWR4OwkgIC8qKjwgSW5kZXggaW50byB0aGUgbWFzdGVyIGJ1ZmZlciBsaXN0ICovCisgICAgaW50ICAgICAgICAgICAgICB0b3RhbDsJICAvKio8IEJ1ZmZlciBzaXplICovCisgICAgaW50ICAgICAgICAgICAgICB1c2VkOwkgIC8qKjwgQW1vdW50IG9mIGJ1ZmZlciBpbiB1c2UgKGZvciBETUEpICovCisgICAgZHJtQWRkcmVzcyAgICAgICBhZGRyZXNzOwkgIC8qKjwgQWRkcmVzcyAqLworfSBkcm1CdWYsICpkcm1CdWZQdHI7CisKKy8qKgorICogQnVmZmVyIG1hcHBpbmcgaW5mb3JtYXRpb24uCisgKgorICogVXNlZCBieSBkcm1NYXBCdWZzKCkgYW5kIGRybVVubWFwQnVmcygpIHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICogbWFwcGVkIGJ1ZmZlcnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9kcm1CdWZNYXAgeworICAgIGludCAgICAgICAgICAgICAgY291bnQ7CSAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyBtYXBwZWQgKi8KKyAgICBkcm1CdWZQdHIgICAgICAgIGxpc3Q7CSAgLyoqPCBCdWZmZXJzICovCit9IGRybUJ1Zk1hcCwgKmRybUJ1Zk1hcFB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybUxvY2sgeworICAgIHZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ1s2MF07CisgICAgLyogVGhpcyBpcyBiaWcgZW5vdWdoIGZvciBtb3N0IGN1cnJlbnQgKGFuZCBmdXR1cmU/KSBhcmNoaXRlY3R1cmVzOgorICAgICAgIERFQyBBbHBoYTogICAgICAgICAgICAgIDMyIGJ5dGVzCisgICAgICAgSW50ZWwgTWVyY2VkOiAgICAgICAgICAgPworICAgICAgIEludGVsIFA1L1BQcm8vUElJL1BJSUk6IDMyIGJ5dGVzCisgICAgICAgSW50ZWwgU3Ryb25nQVJNOiAgICAgICAgMzIgYnl0ZXMKKyAgICAgICBJbnRlbCBpMzg2L2k0ODY6ICAgICAgICAxNiBieXRlcworICAgICAgIE1JUFM6ICAgICAgICAgICAgICAgICAgIDMyIGJ5dGVzICg/KQorICAgICAgIE1vdG9yb2xhIDY4azogICAgICAgICAgIDE2IGJ5dGVzCisgICAgICAgTW90b3JvbGEgUG93ZXJQQzogICAgICAgMzIgYnl0ZXMKKyAgICAgICBTdW4gU1BBUkM6ICAgICAgICAgICAgICAzMiBieXRlcworICAgICovCit9IGRybUxvY2ssICpkcm1Mb2NrUHRyOworCisvKioKKyAqIEluZGljZXMgaGVyZSByZWZlciB0byB0aGUgb2Zmc2V0IGludG8KKyAqIGxpc3QgaW4gZHJtQnVmSW5mbworICovCit0eXBlZGVmIHN0cnVjdCBfZHJtRE1BUmVxIHsKKyAgICBkcm1fY29udGV4dF90ICAgIGNvbnRleHQ7ICAJICAvKio8IENvbnRleHQgaGFuZGxlICovCisgICAgaW50ICAgICAgICAgICBzZW5kX2NvdW50OyAgICAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyB0byBzZW5kICovCisgICAgaW50ICAgICAgICAgICAqc2VuZF9saXN0OyAgICAgLyoqPCBMaXN0IG9mIGhhbmRsZXMgdG8gYnVmZmVycyAqLworICAgIGludCAgICAgICAgICAgKnNlbmRfc2l6ZXM7ICAgIC8qKjwgTGVuZ3RocyBvZiBkYXRhIHRvIHNlbmQsIGluIGJ5dGVzICovCisgICAgZHJtRE1BRmxhZ3MgICBmbGFnczsgICAgICAgICAgLyoqPCBGbGFncyAqLworICAgIGludCAgICAgICAgICAgcmVxdWVzdF9jb3VudDsgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWVzdGVkICovCisgICAgaW50ICAgICAgICAgICByZXF1ZXN0X3NpemU7CSAgLyoqPCBEZXNpcmVkIHNpemUgb2YgYnVmZmVycyByZXF1ZXN0ZWQgKi8KKyAgICBpbnQgICAgICAgICAgICpyZXF1ZXN0X2xpc3Q7ICAvKio8IEJ1ZmZlciBpbmZvcm1hdGlvbiAqLworICAgIGludCAgICAgICAgICAgKnJlcXVlc3Rfc2l6ZXM7IC8qKjwgTWluaW11bSBhY2NlcHRhYmxlIHNpemVzICovCisgICAgaW50ICAgICAgICAgICBncmFudGVkX2NvdW50OyAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyBncmFudGVkIGF0IHRoaXMgc2l6ZSAqLworfSBkcm1ETUFSZXEsICpkcm1ETUFSZXFQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1SZWdpb24geworICAgIGRybV9oYW5kbGVfdCAgICAgaGFuZGxlOworICAgIHVuc2lnbmVkIGludCAgb2Zmc2V0OworICAgIGRybVNpemUgICAgICAgc2l6ZTsKKyAgICBkcm1BZGRyZXNzICAgIG1hcDsKK30gZHJtUmVnaW9uLCAqZHJtUmVnaW9uUHRyOworCit0eXBlZGVmIHN0cnVjdCBfZHJtVGV4dHVyZVJlZ2lvbiB7CisgICAgdW5zaWduZWQgY2hhciBuZXh0OworICAgIHVuc2lnbmVkIGNoYXIgcHJldjsKKyAgICB1bnNpZ25lZCBjaGFyIGluX3VzZTsKKyAgICB1bnNpZ25lZCBjaGFyIHBhZGRpbmc7CS8qKjwgRXhwbGljaXRseSBwYWQgdGhpcyBvdXQgKi8KKyAgICB1bnNpZ25lZCBpbnQgIGFnZTsKK30gZHJtVGV4dHVyZVJlZ2lvbiwgKmRybVRleHR1cmVSZWdpb25QdHI7CisKKwordHlwZWRlZiBlbnVtIHsKKyAgICBEUk1fVkJMQU5LX0FCU09MVVRFID0gMHgwLAkvKio8IFdhaXQgZm9yIHNwZWNpZmljIHZibGFuayBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICBEUk1fVkJMQU5LX1JFTEFUSVZFID0gMHgxLAkvKio8IFdhaXQgZm9yIGdpdmVuIG51bWJlciBvZiB2YmxhbmtzICovCisgICAgLyogYml0cyAxLTYgYXJlIHJlc2VydmVkIGZvciBoaWdoIGNydGNzICovCisgICAgRFJNX1ZCTEFOS19ISUdIX0NSVENfTUFTSyA9IDB4MDAwMDAwM2UsCisgICAgRFJNX1ZCTEFOS19FVkVOVCA9IDB4NDAwMDAwMCwJLyoqPCBTZW5kIGV2ZW50IGluc3RlYWQgb2YgYmxvY2tpbmcgKi8KKyAgICBEUk1fVkJMQU5LX0ZMSVAgPSAweDgwMDAwMDAsCS8qKjwgU2NoZWR1bGVkIGJ1ZmZlciBzd2FwIHNob3VsZCBmbGlwICovCisgICAgRFJNX1ZCTEFOS19ORVhUT05NSVNTID0gMHgxMDAwMDAwMCwJLyoqPCBJZiBtaXNzZWQsIHdhaXQgZm9yIG5leHQgdmJsYW5rICovCisgICAgRFJNX1ZCTEFOS19TRUNPTkRBUlkgPSAweDIwMDAwMDAwLAkvKio8IFNlY29uZGFyeSBkaXNwbGF5IGNvbnRyb2xsZXIgKi8KKyAgICBEUk1fVkJMQU5LX1NJR05BTCAgID0gMHg0MDAwMDAwMAkvKiBTZW5kIHNpZ25hbCBpbnN0ZWFkIG9mIGJsb2NraW5nICovCit9IGRybVZCbGFua1NlcVR5cGU7CisjZGVmaW5lIERSTV9WQkxBTktfSElHSF9DUlRDX1NISUZUIDEKKwordHlwZWRlZiBzdHJ1Y3QgX2RybVZCbGFua1JlcSB7CisJZHJtVkJsYW5rU2VxVHlwZSB0eXBlOworCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKKwl1bnNpZ25lZCBsb25nIHNpZ25hbDsKK30gZHJtVkJsYW5rUmVxLCAqZHJtVkJsYW5rUmVxUHRyOworCit0eXBlZGVmIHN0cnVjdCBfZHJtVkJsYW5rUmVwbHkgeworCWRybVZCbGFua1NlcVR5cGUgdHlwZTsKKwl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CisJbG9uZyB0dmFsX3NlYzsKKwlsb25nIHR2YWxfdXNlYzsKK30gZHJtVkJsYW5rUmVwbHksICpkcm1WQmxhbmtSZXBseVB0cjsKKwordHlwZWRlZiB1bmlvbiBfZHJtVkJsYW5rIHsKKwlkcm1WQmxhbmtSZXEgcmVxdWVzdDsKKwlkcm1WQmxhbmtSZXBseSByZXBseTsKK30gZHJtVkJsYW5rLCAqZHJtVkJsYW5rUHRyOworCit0eXBlZGVmIHN0cnVjdCBfZHJtU2V0VmVyc2lvbiB7CisJaW50IGRybV9kaV9tYWpvcjsKKwlpbnQgZHJtX2RpX21pbm9yOworCWludCBkcm1fZGRfbWFqb3I7CisJaW50IGRybV9kZF9taW5vcjsKK30gZHJtU2V0VmVyc2lvbiwgKmRybVNldFZlcnNpb25QdHI7CisKKyNkZWZpbmUgX19kcm1fZHVtbXlfbG9jayhsb2NrKSAoKihfX3ZvbGF0aWxlX18gdW5zaWduZWQgaW50ICopbG9jaykKKworI2RlZmluZSBEUk1fTE9DS19IRUxEICAweDgwMDAwMDAwVSAvKio8IEhhcmR3YXJlIGxvY2sgaXMgaGVsZCAqLworI2RlZmluZSBEUk1fTE9DS19DT05UICAweDQwMDAwMDAwVSAvKio8IEhhcmR3YXJlIGxvY2sgaXMgY29udGVuZGVkICovCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPj0gMikKKyMgaWYgZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX19BTUQ2NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19hbWQ2NF9fKQorCQkJCS8qIFJlZmxlY3QgY2hhbmdlcyBoZXJlIHRvIGRybVAuaCAqLworI2RlZmluZSBEUk1fQ0FTKGxvY2ssb2xkLG5ldyxfX3JldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGludCBfX2R1bW15OwkvKiBDYW4ndCBtYXJrIGVheCBhcyBjbG9iYmVyZWQgKi8gICAgICBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkibG9jayA7IGNtcHhjaGcgJTQsJTFcblx0IiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZXRueiAlMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJOiAiPWQiIChfX3JldCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAJCQkgICI9bSIgKF9fZHJtX2R1bW15X2xvY2sobG9jaykpLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIj1hIiAoX19kdW1teSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJOiAiMiIgKG9sZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkgICJyIiAobmV3KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9IHdoaWxlICgwKQorCisjZWxpZiBkZWZpbmVkKF9fYWxwaGFfXykKKworI2RlZmluZQlEUk1fQ0FTKGxvY2ssIG9sZCwgbmV3LCByZXQpCQlcCisJZG8gewkJCQkJXAorCQlpbnQgdG1wLCBvbGQzMjsJCQlcCisJCV9fYXNtX18gX192b2xhdGlsZV9fKAkJXAorCQkiCWFkZGwJJDMxLCAlNSwgJTNcbiIJXAorCQkiMToJbGRsX2wJJTAsICUyXG4iCVwKKwkJIgljbXBlcQklMCwgJTMsICUxXG4iCVwKKwkJIgliZXEJJTEsIDJmXG4iCVwKKwkJIgltb3YJJTQsICUwXG4iCVwKKwkJIglzdGxfYwklMCwgJTJcbiIJXAorCQkiCWJlcQklMCwgM2ZcbiIJXAorCQkiCW1iXG4iCQkJXAorCQkiMjoJY21wZXEJJTEsIDAsICUxXG4iCVwKKwkJIi5zdWJzZWN0aW9uIDJcbiIJCVwKKwkJIjM6CWJyCTFiXG4iCQlcCisJCSIucHJldmlvdXMiCQkJXAorCQk6ICI9JnIiKHRtcCksICI9JnIiKHJldCksCVwKKwkJICAiPW0iKF9fZHJtX2R1bW15X2xvY2sobG9jaykpLAlcCisJCSAgIj0mciIob2xkMzIpCQkJXAorCQk6ICJyIihuZXcpLCAiciIob2xkKQkJXAorCQk6ICJtZW1vcnkiKTsJCQlcCisJfSB3aGlsZSAoMCkKKworI2VsaWYgZGVmaW5lZChfX3NwYXJjX18pCisKKyNkZWZpbmUgRFJNX0NBUyhsb2NrLG9sZCxuZXcsX19yZXQpCQkJCVwKK2RvIHsJcmVnaXN0ZXIgdW5zaWduZWQgaW50IF9fb2xkIF9fYXNtKCJvMCIpOwkJXAorCXJlZ2lzdGVyIHVuc2lnbmVkIGludCBfX25ldyBfX2FzbSgibzEiKTsJCVwKKwlyZWdpc3RlciB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKl9fbG9jayBfX2FzbSgibzIiKTsJXAorCV9fb2xkID0gb2xkOwkJCQkJCVwKKwlfX25ldyA9IG5ldzsJCQkJCQlcCisJX19sb2NrID0gKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKWxvY2s7CQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAorCQkvKiJjYXMgWyUyXSwgJTMsICUwIiovCQkJCVwKKwkJIi53b3JkIDB4ZDNlMjkwMDhcblx0IgkJCQlcCisJCS8qIm1lbWJhciAjU3RvcmVTdG9yZSB8ICNTdG9yZUxvYWQiKi8JCVwKKwkJIi53b3JkIDB4ODE0M2UwMGEiCQkJCVwKKwkJOiAiPSZyIiAoX19uZXcpCQkJCQlcCisJCTogIjAiIChfX25ldyksCQkJCQlcCisJCSAgInIiIChfX2xvY2spLAkJCQkJXAorCQkgICJyIiAoX19vbGQpCQkJCQlcCisJCTogIm1lbW9yeSIpOwkJCQkJXAorCV9fcmV0ID0gKF9fbmV3ICE9IF9fb2xkKTsJCQkJXAorfSB3aGlsZSgwKQorCisjZWxpZiBkZWZpbmVkKF9faWE2NF9fKQorCisjaWZkZWYgX19JTlRFTF9DT01QSUxFUgorLyogdGhpcyBjdXJyZW50bHkgZ2VuZXJhdGVzIGJhZCBjb2RlIChtaXNzaW5nIHN0b3AgYml0cykuLi4gKi8KKyNpbmNsdWRlIDxpYTY0aW50cmluLmg+CisKKyNkZWZpbmUgRFJNX0NBUyhsb2NrLG9sZCxuZXcsX19yZXQpCQkJCQkgICAgICBcCisJZG8gewkJCQkJCQkJICAgICAgXAorCQl1bnNpZ25lZCBsb25nIF9fcmVzdWx0LCBfX29sZCA9IChvbGQpICYgMHhmZmZmZmZmZjsJCVwKKwkJX19tZigpOwkJCQkJCQkgICAgICAJXAorCQlfX3Jlc3VsdCA9IF9JbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZV9hY3EoJl9fZHJtX2R1bW15X2xvY2sobG9jayksIChuZXcpLCBfX29sZCk7XAorCQlfX3JldCA9IChfX3Jlc3VsdCkgIT0gKF9fb2xkKTsJCQkJCVwKKy8qCQlfX3JldCA9IChfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoJl9fZHJtX2R1bW15X2xvY2sobG9jayksIFwKKwkJCQkJCSAgICAgKG9sZCksIChuZXcpKQkgICAgICBcCisJCQkgIT0gKG9sZCkpOwkJCQkJICAgICAgKi9cCisJfSB3aGlsZSAoMCkKKworI2Vsc2UKKyNkZWZpbmUgRFJNX0NBUyhsb2NrLG9sZCxuZXcsX19yZXQpCQkJCQkgIFwKKwlkbyB7CQkJCQkJCQkgIFwKKwkJdW5zaWduZWQgaW50IF9fcmVzdWx0LCBfX29sZCA9IChvbGQpOwkJCSAgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCSAgXAorCQkJIm1mXG4iCQkJCQkJICBcCisJCQkibW92IGFyLmNjdj0lMlxuIgkJCQkgIFwKKwkJCSI7O1xuIgkJCQkJCSAgXAorCQkJImNtcHhjaGc0LmFjcSAlMD0lMSwlMyxhci5jY3YiCQkJICBcCisJCQk6ICI9ciIgKF9fcmVzdWx0KSwgIj1tIiAoX19kcm1fZHVtbXlfbG9jayhsb2NrKSkgIFwKKwkJCTogInIiICgodW5zaWduZWQgbG9uZylfX29sZCksICJyIiAobmV3KQkJCSAgXAorCQkJOiAibWVtb3J5Iik7CQkJCQkgIFwKKwkJX19yZXQgPSAoX19yZXN1bHQpICE9IChfX29sZCk7CQkJCSAgXAorCX0gd2hpbGUgKDApCisKKyNlbmRpZgorCisjZWxpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQorCisjZGVmaW5lIERSTV9DQVMobG9jayxvbGQsbmV3LF9fcmV0KQkJCVwKKwlkbyB7CQkJCQkJXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQlcCisJCQkic3luYzsiCQkJCVwKKwkJCSIwOiAgICBsd2FyeCAlMCwwLCUxOyIJCVwKKwkJCSIgICAgICB4b3IuICUwLCUzLCUwOyIJCVwKKwkJCSIgICAgICBibmUgMWY7IgkJCVwKKwkJCSIgICAgICBzdHdjeC4gJTIsMCwlMTsiCQlcCisJCQkiICAgICAgYm5lLSAwYjsiCQlcCisJCQkiMTogICAgIgkJCVwKKwkJCSJzeW5jOyIJCQkJXAorCQk6ICI9JnIiKF9fcmV0KQkJCQlcCisJCTogInIiKGxvY2spLCAiciIobmV3KSwgInIiKG9sZCkJCVwKKwkJOiAiY3IwIiwgIm1lbW9yeSIpOwkJCVwKKwl9IHdoaWxlICgwKQorCisjZW5kaWYgLyogYXJjaGl0ZWN0dXJlICovCisjZW5kaWYgLyogX19HTlVDX18gPj0gMiAqLworCisjaWZuZGVmIERSTV9DQVMKKyNkZWZpbmUgRFJNX0NBUyhsb2NrLG9sZCxuZXcscmV0KSBkbyB7IHJldD0xOyB9IHdoaWxlICgwKSAvKiBGQVNUIExPQ0sgRkFJTFMgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2FscGhhX18pCisjZGVmaW5lIERSTV9DQVNfUkVTVUxUKF9yZXN1bHQpCQlsb25nIF9yZXN1bHQKKyNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pCisjZGVmaW5lIERSTV9DQVNfUkVTVUxUKF9yZXN1bHQpCQlpbnQgX3Jlc3VsdAorI2Vsc2UKKyNkZWZpbmUgRFJNX0NBU19SRVNVTFQoX3Jlc3VsdCkJCWNoYXIgX3Jlc3VsdAorI2VuZGlmCisKKyNkZWZpbmUgRFJNX0xJR0hUX0xPQ0soZmQsbG9jayxjb250ZXh0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBEUk1fQ0FTX1JFU1VMVChfX3JldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlEUk1fQ0FTKGxvY2ssY29udGV4dCxEUk1fTE9DS19IRUxEfGNvbnRleHQsX19yZXQpOyAgICAgXAorICAgICAgICAgICAgICAgIGlmIChfX3JldCkgZHJtR2V0TG9jayhmZCxjb250ZXh0LDApOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gd2hpbGUoMCkKKworCQkJCS8qIFRoaXMgb25lIGNvdW50cyBmYXN0IGxvY2tzIC0tIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZW5jaG1hcmtpbmcgb25seS4gKi8KKyNkZWZpbmUgRFJNX0xJR0hUX0xPQ0tfQ09VTlQoZmQsbG9jayxjb250ZXh0LGNvdW50KSAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBEUk1fQ0FTX1JFU1VMVChfX3JldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlEUk1fQ0FTKGxvY2ssY29udGV4dCxEUk1fTE9DS19IRUxEfGNvbnRleHQsX19yZXQpOyAgICAgXAorICAgICAgICAgICAgICAgIGlmIChfX3JldCkgZHJtR2V0TG9jayhmZCxjb250ZXh0LDApOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZWxzZSAgICAgICArK2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIERSTV9MT0NLKGZkLGxvY2ssY29udGV4dCxmbGFncykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmIChmbGFncykgZHJtR2V0TG9jayhmZCxjb250ZXh0LGZsYWdzKTsgICAgICAgICAgICAgICBcCisJCWVsc2UgICAgICAgRFJNX0xJR0hUX0xPQ0soZmQsbG9jayxjb250ZXh0KTsgICAgICAgICAgICBcCisJfSB3aGlsZSgwKQorCisjZGVmaW5lIERSTV9VTkxPQ0soZmQsbG9jayxjb250ZXh0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgRFJNX0NBU19SRVNVTFQoX19yZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJRFJNX0NBUyhsb2NrLERSTV9MT0NLX0hFTER8Y29udGV4dCxjb250ZXh0LF9fcmV0KTsgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoX19yZXQpIGRybVVubG9jayhmZCxjb250ZXh0KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IHdoaWxlKDApCisKKwkJCQkvKiBTaW1wbGUgc3BpbiBsb2NrcyAqLworI2RlZmluZSBEUk1fU1BJTkxPQ0soc3Bpbix2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgRFJNX0NBU19SRVNVTFQoX19yZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlEUk1fQ0FTKHNwaW4sMCx2YWwsX19yZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoX19yZXQpIHdoaWxlICgoc3BpbiktPmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICB9IHdoaWxlIChfX3JldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9IHdoaWxlKDApCisKKyNkZWZpbmUgRFJNX1NQSU5MT0NLX1RBS0Uoc3Bpbix2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIERSTV9DQVNfUkVTVUxUKF9fcmV0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50ICBjdXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGN1ciA9ICgqc3BpbikubG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCURSTV9DQVMoc3BpbixjdXIsdmFsLF9fcmV0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgIH0gd2hpbGUgKF9fcmV0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gd2hpbGUoMCkKKworI2RlZmluZSBEUk1fU1BJTkxPQ0tfQ09VTlQoc3Bpbix2YWwsY291bnQsX19yZXQpICAgICAgICAgICAgICAgICAgICAgICBcCisJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50ICBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX3JldCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoX19pID0gMDsgX19yZXQgJiYgX19pIDwgY291bnQ7IF9faSsrKSB7ICAgICAgICAgICAgICAgXAorCQlEUk1fQ0FTKHNwaW4sMCx2YWwsX19yZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoX19yZXQpIGZvciAoO19faSA8IGNvdW50ICYmIChzcGluKS0+bG9jazsgX19pKyspOyAgXAorCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9IHdoaWxlKDApCisKKyNkZWZpbmUgRFJNX1NQSU5VTkxPQ0soc3Bpbix2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIERSTV9DQVNfUkVTVUxUKF9fcmV0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCgqc3BpbikubG9jayA9PSB2YWwpIHsgLyogZWxzZSBzZXJ2ZXIgc3RvbGUgbG9jayAqLyAgICBcCisJICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkgICAgRFJNX0NBUyhzcGluLHZhbCwwLF9fcmV0KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAgfSB3aGlsZSAoX19yZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gd2hpbGUoMCkKKworCisKKy8qIEdlbmVyYWwgdXNlci1sZXZlbCBwcm9ncmFtbWVyJ3MgQVBJOiB1bnByaXZpbGVnZWQgKi8KK2V4dGVybiBpbnQgICAgICAgICAgIGRybUF2YWlsYWJsZSh2b2lkKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybU9wZW4oY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqYnVzaWQpOworCisjZGVmaW5lIERSTV9OT0RFX1BSSU1BUlkgMAorI2RlZmluZSBEUk1fTk9ERV9DT05UUk9MIDEKKyNkZWZpbmUgRFJNX05PREVfUkVOREVSICAyCisjZGVmaW5lIERSTV9OT0RFX01BWCAgICAgMworCitleHRlcm4gaW50ICAgICAgICAgICBkcm1PcGVuV2l0aFR5cGUoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqYnVzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUpOworCitleHRlcm4gaW50ICAgICAgICAgICBkcm1PcGVuQ29udHJvbChpbnQgbWlub3IpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtT3BlblJlbmRlcihpbnQgbWlub3IpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtQ2xvc2UoaW50IGZkKTsKK2V4dGVybiBkcm1WZXJzaW9uUHRyIGRybUdldFZlcnNpb24oaW50IGZkKTsKK2V4dGVybiBkcm1WZXJzaW9uUHRyIGRybUdldExpYlZlcnNpb24oaW50IGZkKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUdldENhcChpbnQgZmQsIHVpbnQ2NF90IGNhcGFiaWxpdHksIHVpbnQ2NF90ICp2YWx1ZSk7CitleHRlcm4gdm9pZCAgICAgICAgICBkcm1GcmVlVmVyc2lvbihkcm1WZXJzaW9uUHRyKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUdldE1hZ2ljKGludCBmZCwgZHJtX21hZ2ljX3QgKiBtYWdpYyk7CitleHRlcm4gY2hhciAgICAgICAgICAqZHJtR2V0QnVzaWQoaW50IGZkKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUdldEludGVycnVwdEZyb21CdXNJRChpbnQgZmQsIGludCBidXNudW0sIGludCBkZXZudW0sCisJCQkJCSAgICAgIGludCBmdW5jbnVtKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUdldE1hcChpbnQgZmQsIGludCBpZHgsIGRybV9oYW5kbGVfdCAqb2Zmc2V0LAorCQkJICAgICAgIGRybVNpemUgKnNpemUsIGRybU1hcFR5cGUgKnR5cGUsCisJCQkgICAgICAgZHJtTWFwRmxhZ3MgKmZsYWdzLCBkcm1faGFuZGxlX3QgKmhhbmRsZSwKKwkJCSAgICAgICBpbnQgKm10cnIpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtR2V0Q2xpZW50KGludCBmZCwgaW50IGlkeCwgaW50ICphdXRoLCBpbnQgKnBpZCwKKwkJCQkgIGludCAqdWlkLCB1bnNpZ25lZCBsb25nICptYWdpYywKKwkJCQkgIHVuc2lnbmVkIGxvbmcgKmlvY3MpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtR2V0U3RhdHMoaW50IGZkLCBkcm1TdGF0c1QgKnN0YXRzKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybVNldEludGVyZmFjZVZlcnNpb24oaW50IGZkLCBkcm1TZXRWZXJzaW9uICp2ZXJzaW9uKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUNvbW1hbmROb25lKGludCBmZCwgdW5zaWduZWQgbG9uZyBkcm1Db21tYW5kSW5kZXgpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtQ29tbWFuZFJlYWQoaW50IGZkLCB1bnNpZ25lZCBsb25nIGRybUNvbW1hbmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1Db21tYW5kV3JpdGUoaW50IGZkLCB1bnNpZ25lZCBsb25nIGRybUNvbW1hbmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtQ29tbWFuZFdyaXRlUmVhZChpbnQgZmQsIHVuc2lnbmVkIGxvbmcgZHJtQ29tbWFuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUpOworCisvKiBHZW5lcmFsIHVzZXItbGV2ZWwgcHJvZ3JhbW1lcidzIEFQSTogWCBzZXJ2ZXIgKHJvb3QpIG9ubHkgICovCitleHRlcm4gdm9pZCAgICAgICAgICBkcm1GcmVlQnVzaWQoY29uc3QgY2hhciAqYnVzaWQpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtU2V0QnVzaWQoaW50IGZkLCBjb25zdCBjaGFyICpidXNpZCk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1BdXRoTWFnaWMoaW50IGZkLCBkcm1fbWFnaWNfdCBtYWdpYyk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1BZGRNYXAoaW50IGZkLAorCQkJICAgICAgIGRybV9oYW5kbGVfdCBvZmZzZXQsCisJCQkgICAgICAgZHJtU2l6ZSBzaXplLAorCQkJICAgICAgIGRybU1hcFR5cGUgdHlwZSwKKwkJCSAgICAgICBkcm1NYXBGbGFncyBmbGFncywKKwkJCSAgICAgICBkcm1faGFuZGxlX3QgKiBoYW5kbGUpOworZXh0ZXJuIGludAkgICAgIGRybVJtTWFwKGludCBmZCwgZHJtX2hhbmRsZV90IGhhbmRsZSk7CitleHRlcm4gaW50CSAgICAgZHJtQWRkQ29udGV4dFByaXZhdGVNYXBwaW5nKGludCBmZCwgZHJtX2NvbnRleHRfdCBjdHhfaWQsCisJCQkJCQkgZHJtX2hhbmRsZV90IGhhbmRsZSk7CisKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUFkZEJ1ZnMoaW50IGZkLCBpbnQgY291bnQsIGludCBzaXplLAorCQkJCWRybUJ1ZkRlc2NGbGFncyBmbGFncywKKwkJCQlpbnQgYWdwX29mZnNldCk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1NYXJrQnVmcyhpbnQgZmQsIGRvdWJsZSBsb3csIGRvdWJsZSBoaWdoKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUNyZWF0ZUNvbnRleHQoaW50IGZkLCBkcm1fY29udGV4dF90ICogaGFuZGxlKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybVNldENvbnRleHRGbGFncyhpbnQgZmQsIGRybV9jb250ZXh0X3QgY29udGV4dCwKKwkJCQkJZHJtX2NvbnRleHRfdEZsYWdzIGZsYWdzKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUdldENvbnRleHRGbGFncyhpbnQgZmQsIGRybV9jb250ZXh0X3QgY29udGV4dCwKKwkJCQkJZHJtX2NvbnRleHRfdEZsYWdzUHRyIGZsYWdzKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUFkZENvbnRleHRUYWcoaW50IGZkLCBkcm1fY29udGV4dF90IGNvbnRleHQsIHZvaWQgKnRhZyk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1EZWxDb250ZXh0VGFnKGludCBmZCwgZHJtX2NvbnRleHRfdCBjb250ZXh0KTsKK2V4dGVybiB2b2lkICAgICAgICAgICpkcm1HZXRDb250ZXh0VGFnKGludCBmZCwgZHJtX2NvbnRleHRfdCBjb250ZXh0KTsKK2V4dGVybiBkcm1fY29udGV4dF90ICogZHJtR2V0UmVzZXJ2ZWRDb250ZXh0TGlzdChpbnQgZmQsIGludCAqY291bnQpOworZXh0ZXJuIHZvaWQgICAgICAgICAgZHJtRnJlZVJlc2VydmVkQ29udGV4dExpc3QoZHJtX2NvbnRleHRfdCAqKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybVN3aXRjaFRvQ29udGV4dChpbnQgZmQsIGRybV9jb250ZXh0X3QgY29udGV4dCk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1EZXN0cm95Q29udGV4dChpbnQgZmQsIGRybV9jb250ZXh0X3QgaGFuZGxlKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUNyZWF0ZURyYXdhYmxlKGludCBmZCwgZHJtX2RyYXdhYmxlX3QgKiBoYW5kbGUpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtRGVzdHJveURyYXdhYmxlKGludCBmZCwgZHJtX2RyYXdhYmxlX3QgaGFuZGxlKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybVVwZGF0ZURyYXdhYmxlSW5mbyhpbnQgZmQsIGRybV9kcmF3YWJsZV90IGhhbmRsZSwKKwkJCQkJICAgZHJtX2RyYXdhYmxlX2luZm9fdHlwZV90IHR5cGUsCisJCQkJCSAgIHVuc2lnbmVkIGludCBudW0sIHZvaWQgKmRhdGEpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtQ3RsSW5zdEhhbmRsZXIoaW50IGZkLCBpbnQgaXJxKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUN0bFVuaW5zdEhhbmRsZXIoaW50IGZkKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybVNldENsaWVudENhcChpbnQgZmQsIHVpbnQ2NF90IGNhcGFiaWxpdHksCisJCQkJICAgICB1aW50NjRfdCB2YWx1ZSk7CisKKy8qIEdlbmVyYWwgdXNlci1sZXZlbCBwcm9ncmFtbWVyJ3MgQVBJOiBhdXRoZW50aWNhdGVkIGNsaWVudCBhbmQvb3IgWCAqLworZXh0ZXJuIGludCAgICAgICAgICAgZHJtTWFwKGludCBmZCwKKwkJCSAgICBkcm1faGFuZGxlX3QgaGFuZGxlLAorCQkJICAgIGRybVNpemUgc2l6ZSwKKwkJCSAgICBkcm1BZGRyZXNzUHRyIGFkZHJlc3MpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtVW5tYXAoZHJtQWRkcmVzcyBhZGRyZXNzLCBkcm1TaXplIHNpemUpOworZXh0ZXJuIGRybUJ1ZkluZm9QdHIgZHJtR2V0QnVmSW5mbyhpbnQgZmQpOworZXh0ZXJuIGRybUJ1Zk1hcFB0ciAgZHJtTWFwQnVmcyhpbnQgZmQpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtVW5tYXBCdWZzKGRybUJ1Zk1hcFB0ciBidWZzKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybURNQShpbnQgZmQsIGRybURNQVJlcVB0ciByZXF1ZXN0KTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUZyZWVCdWZzKGludCBmZCwgaW50IGNvdW50LCBpbnQgKmxpc3QpOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtR2V0TG9jayhpbnQgZmQsCisJCQkgICAgICAgIGRybV9jb250ZXh0X3QgY29udGV4dCwKKwkJCSAgICAgICAgZHJtTG9ja0ZsYWdzIGZsYWdzKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybVVubG9jayhpbnQgZmQsIGRybV9jb250ZXh0X3QgY29udGV4dCk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1GaW5pc2goaW50IGZkLCBpbnQgY29udGV4dCwgZHJtTG9ja0ZsYWdzIGZsYWdzKTsKK2V4dGVybiBpbnQJICAgICBkcm1HZXRDb250ZXh0UHJpdmF0ZU1hcHBpbmcoaW50IGZkLCBkcm1fY29udGV4dF90IGN0eF9pZCwgCisJCQkJCQkgZHJtX2hhbmRsZV90ICogaGFuZGxlKTsKKworLyogQUdQL0dBUlQgc3VwcG9ydDogWCBzZXJ2ZXIgKHJvb3QpIG9ubHkgKi8KK2V4dGVybiBpbnQgICAgICAgICAgIGRybUFncEFjcXVpcmUoaW50IGZkKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUFncFJlbGVhc2UoaW50IGZkKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUFncEVuYWJsZShpbnQgZmQsIHVuc2lnbmVkIGxvbmcgbW9kZSk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1BZ3BBbGxvYyhpbnQgZmQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkgdW5zaWduZWQgbG9uZyB0eXBlLCB1bnNpZ25lZCBsb25nICphZGRyZXNzLAorCQkJCSBkcm1faGFuZGxlX3QgKmhhbmRsZSk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1BZ3BGcmVlKGludCBmZCwgZHJtX2hhbmRsZV90IGhhbmRsZSk7CitleHRlcm4gaW50IAkgICAgIGRybUFncEJpbmQoaW50IGZkLCBkcm1faGFuZGxlX3QgaGFuZGxlLAorCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybUFncFVuYmluZChpbnQgZmQsIGRybV9oYW5kbGVfdCBoYW5kbGUpOworCisvKiBBR1AvR0FSVCBpbmZvOiBhdXRoZW50aWNhdGVkIGNsaWVudCBhbmQvb3IgWCAqLworZXh0ZXJuIGludCAgICAgICAgICAgZHJtQWdwVmVyc2lvbk1ham9yKGludCBmZCk7CitleHRlcm4gaW50ICAgICAgICAgICBkcm1BZ3BWZXJzaW9uTWlub3IoaW50IGZkKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRybUFncEdldE1vZGUoaW50IGZkKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRybUFncEJhc2UoaW50IGZkKTsgLyogUGh5c2ljYWwgbG9jYXRpb24gKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIGRybUFncFNpemUoaW50IGZkKTsgLyogQnl0ZXMgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIGRybUFncE1lbW9yeVVzZWQoaW50IGZkKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRybUFncE1lbW9yeUF2YWlsKGludCBmZCk7CitleHRlcm4gdW5zaWduZWQgaW50ICBkcm1BZ3BWZW5kb3JJZChpbnQgZmQpOworZXh0ZXJuIHVuc2lnbmVkIGludCAgZHJtQWdwRGV2aWNlSWQoaW50IGZkKTsKKworLyogUENJIHNjYXR0ZXIvZ2F0aGVyIHN1cHBvcnQ6IFggc2VydmVyIChyb290KSBvbmx5ICovCitleHRlcm4gaW50ICAgICAgICAgICBkcm1TY2F0dGVyR2F0aGVyQWxsb2MoaW50IGZkLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJCSAgIGRybV9oYW5kbGVfdCAqaGFuZGxlKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybVNjYXR0ZXJHYXRoZXJGcmVlKGludCBmZCwgZHJtX2hhbmRsZV90IGhhbmRsZSk7CisKK2V4dGVybiBpbnQgICAgICAgICAgIGRybVdhaXRWQmxhbmsoaW50IGZkLCBkcm1WQmxhbmtQdHIgdmJsKTsKKworLyogU3VwcG9ydCByb3V0aW5lcyAqLworZXh0ZXJuIHZvaWQgICAgICAgICAgZHJtU2V0U2VydmVySW5mbyhkcm1TZXJ2ZXJJbmZvUHRyIGluZm8pOworZXh0ZXJuIGludCAgICAgICAgICAgZHJtRXJyb3IoaW50IGVyciwgY29uc3QgY2hhciAqbGFiZWwpOworZXh0ZXJuIHZvaWQgICAgICAgICAgKmRybU1hbGxvYyhpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCAgICAgICAgICBkcm1GcmVlKHZvaWQgKnB0KTsKKworLyogSGFzaCB0YWJsZSByb3V0aW5lcyAqLworZXh0ZXJuIHZvaWQgKmRybUhhc2hDcmVhdGUodm9pZCk7CitleHRlcm4gaW50ICBkcm1IYXNoRGVzdHJveSh2b2lkICp0KTsKK2V4dGVybiBpbnQgIGRybUhhc2hMb29rdXAodm9pZCAqdCwgdW5zaWduZWQgbG9uZyBrZXksIHZvaWQgKip2YWx1ZSk7CitleHRlcm4gaW50ICBkcm1IYXNoSW5zZXJ0KHZvaWQgKnQsIHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICp2YWx1ZSk7CitleHRlcm4gaW50ICBkcm1IYXNoRGVsZXRlKHZvaWQgKnQsIHVuc2lnbmVkIGxvbmcga2V5KTsKK2V4dGVybiBpbnQgIGRybUhhc2hGaXJzdCh2b2lkICp0LCB1bnNpZ25lZCBsb25nICprZXksIHZvaWQgKip2YWx1ZSk7CitleHRlcm4gaW50ICBkcm1IYXNoTmV4dCh2b2lkICp0LCB1bnNpZ25lZCBsb25nICprZXksIHZvaWQgKip2YWx1ZSk7CisKKy8qIFBSTkcgcm91dGluZXMgKi8KK2V4dGVybiB2b2lkICAgICAgICAgICpkcm1SYW5kb21DcmVhdGUodW5zaWduZWQgbG9uZyBzZWVkKTsKK2V4dGVybiBpbnQgICAgICAgICAgIGRybVJhbmRvbURlc3Ryb3kodm9pZCAqc3RhdGUpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtUmFuZG9tKHZvaWQgKnN0YXRlKTsKK2V4dGVybiBkb3VibGUgICAgICAgIGRybVJhbmRvbURvdWJsZSh2b2lkICpzdGF0ZSk7CisKKy8qIFNraXAgbGlzdCByb3V0aW5lcyAqLworCitleHRlcm4gdm9pZCAqZHJtU0xDcmVhdGUodm9pZCk7CitleHRlcm4gaW50ICBkcm1TTERlc3Ryb3kodm9pZCAqbCk7CitleHRlcm4gaW50ICBkcm1TTExvb2t1cCh2b2lkICpsLCB1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqKnZhbHVlKTsKK2V4dGVybiBpbnQgIGRybVNMSW5zZXJ0KHZvaWQgKmwsIHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICp2YWx1ZSk7CitleHRlcm4gaW50ICBkcm1TTERlbGV0ZSh2b2lkICpsLCB1bnNpZ25lZCBsb25nIGtleSk7CitleHRlcm4gaW50ICBkcm1TTE5leHQodm9pZCAqbCwgdW5zaWduZWQgbG9uZyAqa2V5LCB2b2lkICoqdmFsdWUpOworZXh0ZXJuIGludCAgZHJtU0xGaXJzdCh2b2lkICpsLCB1bnNpZ25lZCBsb25nICprZXksIHZvaWQgKip2YWx1ZSk7CitleHRlcm4gdm9pZCBkcm1TTER1bXAodm9pZCAqbCk7CitleHRlcm4gaW50ICBkcm1TTExvb2t1cE5laWdoYm9ycyh2b2lkICpsLCB1bnNpZ25lZCBsb25nIGtleSwKKwkJCQkgdW5zaWduZWQgbG9uZyAqcHJldl9rZXksIHZvaWQgKipwcmV2X3ZhbHVlLAorCQkJCSB1bnNpZ25lZCBsb25nICpuZXh0X2tleSwgdm9pZCAqKm5leHRfdmFsdWUpOworCitleHRlcm4gaW50IGRybU9wZW5PbmNlKHZvaWQgKnVudXNlZCwgY29uc3QgY2hhciAqQnVzSUQsIGludCAqbmV3bHlvcGVuZWQpOworZXh0ZXJuIGludCBkcm1PcGVuT25jZVdpdGhUeXBlKGNvbnN0IGNoYXIgKkJ1c0lELCBpbnQgKm5ld2x5b3BlbmVkLCBpbnQgdHlwZSk7CitleHRlcm4gdm9pZCBkcm1DbG9zZU9uY2UoaW50IGZkKTsKK2V4dGVybiB2b2lkIGRybU1zZyhjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgRFJNX1BSSU5URkxJS0UoMSwgMik7CisKK2V4dGVybiBpbnQgZHJtU2V0TWFzdGVyKGludCBmZCk7CitleHRlcm4gaW50IGRybURyb3BNYXN0ZXIoaW50IGZkKTsKKworI2RlZmluZSBEUk1fRVZFTlRfQ09OVEVYVF9WRVJTSU9OIDMKKwordHlwZWRlZiBzdHJ1Y3QgX2RybUV2ZW50Q29udGV4dCB7CisKKwkvKiBUaGlzIHN0cnVjdCBpcyB2ZXJzaW9uZWQgc28gd2UgY2FuIGFkZCBtb3JlIHBvaW50ZXJzIGlmIHdlCisJICogYWRkIG1vcmUgZXZlbnRzLiAqLworCWludCB2ZXJzaW9uOworCisJdm9pZCAoKnZibGFua19oYW5kbGVyKShpbnQgZmQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlLCAKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgdHZfc2VjLAorCQkJICAgICAgIHVuc2lnbmVkIGludCB0dl91c2VjLAorCQkJICAgICAgIHZvaWQgKnVzZXJfZGF0YSk7CisKKwl2b2lkICgqcGFnZV9mbGlwX2hhbmRsZXIpKGludCBmZCwKKwkJCQkgIHVuc2lnbmVkIGludCBzZXF1ZW5jZSwKKwkJCQkgIHVuc2lnbmVkIGludCB0dl9zZWMsCisJCQkJICB1bnNpZ25lZCBpbnQgdHZfdXNlYywKKwkJCQkgIHZvaWQgKnVzZXJfZGF0YSk7CisKKwl2b2lkICgqcGFnZV9mbGlwX2hhbmRsZXIyKShpbnQgZmQsCisJCQkJICAgdW5zaWduZWQgaW50IHNlcXVlbmNlLAorCQkJCSAgIHVuc2lnbmVkIGludCB0dl9zZWMsCisJCQkJICAgdW5zaWduZWQgaW50IHR2X3VzZWMsCisJCQkJICAgdW5zaWduZWQgaW50IGNydGNfaWQsCisJCQkJICAgdm9pZCAqdXNlcl9kYXRhKTsKKworfSBkcm1FdmVudENvbnRleHQsICpkcm1FdmVudENvbnRleHRQdHI7CisKK2V4dGVybiBpbnQgZHJtSGFuZGxlRXZlbnQoaW50IGZkLCBkcm1FdmVudENvbnRleHRQdHIgZXZjdHgpOworCitleHRlcm4gY2hhciAqZHJtR2V0RGV2aWNlTmFtZUZyb21GZChpbnQgZmQpOworCisvKiBJbXByb3ZlZCB2ZXJzaW9uIG9mIGRybUdldERldmljZU5hbWVGcm9tRmQgd2hpY2ggYXR0cmlidXRlcyBmb3IgYW55IHR5cGUgb2YKKyAqIGRldmljZS9ub2RlIC0gY2FyZCwgY29udHJvbCBvciByZW5kZXJELgorICovCitleHRlcm4gY2hhciAqZHJtR2V0RGV2aWNlTmFtZUZyb21GZDIoaW50IGZkKTsKK2V4dGVybiBpbnQgZHJtR2V0Tm9kZVR5cGVGcm9tRmQoaW50IGZkKTsKKworZXh0ZXJuIGludCBkcm1QcmltZUhhbmRsZVRvRkQoaW50IGZkLCB1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IGZsYWdzLCBpbnQgKnByaW1lX2ZkKTsKK2V4dGVybiBpbnQgZHJtUHJpbWVGRFRvSGFuZGxlKGludCBmZCwgaW50IHByaW1lX2ZkLCB1aW50MzJfdCAqaGFuZGxlKTsKKworZXh0ZXJuIGNoYXIgKmRybUdldFByaW1hcnlEZXZpY2VOYW1lRnJvbUZkKGludCBmZCk7CitleHRlcm4gY2hhciAqZHJtR2V0UmVuZGVyRGV2aWNlTmFtZUZyb21GZChpbnQgZmQpOworCisjZGVmaW5lIERSTV9CVVNfUENJICAgICAgIDAKKyNkZWZpbmUgRFJNX0JVU19VU0IgICAgICAgMQorI2RlZmluZSBEUk1fQlVTX1BMQVRGT1JNICAyCisjZGVmaW5lIERSTV9CVVNfSE9TVDFYICAgIDMKKwordHlwZWRlZiBzdHJ1Y3QgX2RybVBjaUJ1c0luZm8geworICAgIHVpbnQxNl90IGRvbWFpbjsKKyAgICB1aW50OF90IGJ1czsKKyAgICB1aW50OF90IGRldjsKKyAgICB1aW50OF90IGZ1bmM7Cit9IGRybVBjaUJ1c0luZm8sICpkcm1QY2lCdXNJbmZvUHRyOworCit0eXBlZGVmIHN0cnVjdCBfZHJtUGNpRGV2aWNlSW5mbyB7CisgICAgdWludDE2X3QgdmVuZG9yX2lkOworICAgIHVpbnQxNl90IGRldmljZV9pZDsKKyAgICB1aW50MTZfdCBzdWJ2ZW5kb3JfaWQ7CisgICAgdWludDE2X3Qgc3ViZGV2aWNlX2lkOworICAgIHVpbnQ4X3QgcmV2aXNpb25faWQ7Cit9IGRybVBjaURldmljZUluZm8sICpkcm1QY2lEZXZpY2VJbmZvUHRyOworCit0eXBlZGVmIHN0cnVjdCBfZHJtVXNiQnVzSW5mbyB7CisgICAgdWludDhfdCBidXM7CisgICAgdWludDhfdCBkZXY7Cit9IGRybVVzYkJ1c0luZm8sICpkcm1Vc2JCdXNJbmZvUHRyOworCit0eXBlZGVmIHN0cnVjdCBfZHJtVXNiRGV2aWNlSW5mbyB7CisgICAgdWludDE2X3QgdmVuZG9yOworICAgIHVpbnQxNl90IHByb2R1Y3Q7Cit9IGRybVVzYkRldmljZUluZm8sICpkcm1Vc2JEZXZpY2VJbmZvUHRyOworCisjZGVmaW5lIERSTV9QTEFURk9STV9ERVZJQ0VfTkFNRV9MRU4gNTEyCisKK3R5cGVkZWYgc3RydWN0IF9kcm1QbGF0Zm9ybUJ1c0luZm8geworICAgIGNoYXIgZnVsbG5hbWVbRFJNX1BMQVRGT1JNX0RFVklDRV9OQU1FX0xFTl07Cit9IGRybVBsYXRmb3JtQnVzSW5mbywgKmRybVBsYXRmb3JtQnVzSW5mb1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybVBsYXRmb3JtRGV2aWNlSW5mbyB7CisgICAgY2hhciAqKmNvbXBhdGlibGU7IC8qIE5VTEwgdGVybWluYXRlZCBsaXN0IG9mIGNvbXBhdGlibGUgc3RyaW5ncyAqLworfSBkcm1QbGF0Zm9ybURldmljZUluZm8sICpkcm1QbGF0Zm9ybURldmljZUluZm9QdHI7CisKKyNkZWZpbmUgRFJNX0hPU1QxWF9ERVZJQ0VfTkFNRV9MRU4gNTEyCisKK3R5cGVkZWYgc3RydWN0IF9kcm1Ib3N0MXhCdXNJbmZvIHsKKyAgICBjaGFyIGZ1bGxuYW1lW0RSTV9IT1NUMVhfREVWSUNFX05BTUVfTEVOXTsKK30gZHJtSG9zdDF4QnVzSW5mbywgKmRybUhvc3QxeEJ1c0luZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1Ib3N0MXhEZXZpY2VJbmZvIHsKKyAgICBjaGFyICoqY29tcGF0aWJsZTsgLyogTlVMTCB0ZXJtaW5hdGVkIGxpc3Qgb2YgY29tcGF0aWJsZSBzdHJpbmdzICovCit9IGRybUhvc3QxeERldmljZUluZm8sICpkcm1Ib3N0MXhEZXZpY2VJbmZvUHRyOworCit0eXBlZGVmIHN0cnVjdCBfZHJtRGV2aWNlIHsKKyAgICBjaGFyICoqbm9kZXM7IC8qIERSTV9OT0RFX01BWCBzaXplZCBhcnJheSAqLworICAgIGludCBhdmFpbGFibGVfbm9kZXM7IC8qIERSTV9OT0RFXyogYml0bWFzayAqLworICAgIGludCBidXN0eXBlOworICAgIHVuaW9uIHsKKyAgICAgICAgZHJtUGNpQnVzSW5mb1B0ciBwY2k7CisgICAgICAgIGRybVVzYkJ1c0luZm9QdHIgdXNiOworICAgICAgICBkcm1QbGF0Zm9ybUJ1c0luZm9QdHIgcGxhdGZvcm07CisgICAgICAgIGRybUhvc3QxeEJ1c0luZm9QdHIgaG9zdDF4OworICAgIH0gYnVzaW5mbzsKKyAgICB1bmlvbiB7CisgICAgICAgIGRybVBjaURldmljZUluZm9QdHIgcGNpOworICAgICAgICBkcm1Vc2JEZXZpY2VJbmZvUHRyIHVzYjsKKyAgICAgICAgZHJtUGxhdGZvcm1EZXZpY2VJbmZvUHRyIHBsYXRmb3JtOworICAgICAgICBkcm1Ib3N0MXhEZXZpY2VJbmZvUHRyIGhvc3QxeDsKKyAgICB9IGRldmljZWluZm87Cit9IGRybURldmljZSwgKmRybURldmljZVB0cjsKKworZXh0ZXJuIGludCBkcm1HZXREZXZpY2UoaW50IGZkLCBkcm1EZXZpY2VQdHIgKmRldmljZSk7CitleHRlcm4gdm9pZCBkcm1GcmVlRGV2aWNlKGRybURldmljZVB0ciAqZGV2aWNlKTsKKworZXh0ZXJuIGludCBkcm1HZXREZXZpY2VzKGRybURldmljZVB0ciBkZXZpY2VzW10sIGludCBtYXhfZGV2aWNlcyk7CitleHRlcm4gdm9pZCBkcm1GcmVlRGV2aWNlcyhkcm1EZXZpY2VQdHIgZGV2aWNlc1tdLCBpbnQgY291bnQpOworCisjZGVmaW5lIERSTV9ERVZJQ0VfR0VUX1BDSV9SRVZJU0lPTiAoMSA8PCAwKQorZXh0ZXJuIGludCBkcm1HZXREZXZpY2UyKGludCBmZCwgdWludDMyX3QgZmxhZ3MsIGRybURldmljZVB0ciAqZGV2aWNlKTsKK2V4dGVybiBpbnQgZHJtR2V0RGV2aWNlczIodWludDMyX3QgZmxhZ3MsIGRybURldmljZVB0ciBkZXZpY2VzW10sIGludCBtYXhfZGV2aWNlcyk7CisKK2V4dGVybiBpbnQgZHJtRGV2aWNlc0VxdWFsKGRybURldmljZVB0ciBhLCBkcm1EZXZpY2VQdHIgYik7CisKK2V4dGVybiBpbnQgZHJtU3luY29iakNyZWF0ZShpbnQgZmQsIHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCAqaGFuZGxlKTsKK2V4dGVybiBpbnQgZHJtU3luY29iakRlc3Ryb3koaW50IGZkLCB1aW50MzJfdCBoYW5kbGUpOworZXh0ZXJuIGludCBkcm1TeW5jb2JqSGFuZGxlVG9GRChpbnQgZmQsIHVpbnQzMl90IGhhbmRsZSwgaW50ICpvYmpfZmQpOworZXh0ZXJuIGludCBkcm1TeW5jb2JqRkRUb0hhbmRsZShpbnQgZmQsIGludCBvYmpfZmQsIHVpbnQzMl90ICpoYW5kbGUpOworCitleHRlcm4gaW50IGRybVN5bmNvYmpJbXBvcnRTeW5jRmlsZShpbnQgZmQsIHVpbnQzMl90IGhhbmRsZSwgaW50IHN5bmNfZmlsZV9mZCk7CitleHRlcm4gaW50IGRybVN5bmNvYmpFeHBvcnRTeW5jRmlsZShpbnQgZmQsIHVpbnQzMl90IGhhbmRsZSwgaW50ICpzeW5jX2ZpbGVfZmQpOworZXh0ZXJuIGludCBkcm1TeW5jb2JqV2FpdChpbnQgZmQsIHVpbnQzMl90ICpoYW5kbGVzLCB1bnNpZ25lZCBudW1faGFuZGxlcywKKwkJCSAgaW50NjRfdCB0aW1lb3V0X25zZWMsIHVuc2lnbmVkIGZsYWdzLAorCQkJICB1aW50MzJfdCAqZmlyc3Rfc2lnbmFsZWQpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3hmODZkcm1IYXNoLmMgYi94Zjg2ZHJtSGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyODdlNjEKLS0tIC9kZXYvbnVsbAorKysgYi94Zjg2ZHJtSGFzaC5jCkBAIC0wLDAgKzEsMjUzIEBACisvKiB4Zjg2ZHJtSGFzaC5jIC0tIFNtYWxsIGhhc2ggdGFibGUgc3VwcG9ydCBmb3IgaW50ZWdlciAtPiBpbnRlZ2VyIG1hcHBpbmcKKyAqIENyZWF0ZWQ6IFN1biBBcHIgMTggMDk6MzU6NDUgMTk5OSBieSBmYWl0aEBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICoKKyAqIERFU0NSSVBUSU9OCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgc3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIGEgZml4ZWQtc2l6ZWQKKyAqIGhhc2ggdGFibGUgdXNpbmcgc2VsZi1vcmdhbml6aW5nIGxpbmtlZCBsaXN0cyBbS251dGg3MywgcHAuIDM5OC0zOTldIGZvcgorICogY29sbGlzaW9uIHJlc29sdXRpb24uICBUaGVyZSBhcmUgdHdvIHBvdGVudGlhbGx5IGludGVyZXN0aW5nIHRoaW5ncworICogYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbjoKKyAqCisgKiAxKSBUaGUgdGFibGUgaXMgcG93ZXItb2YtdHdvIHNpemVkLiAgUHJpbWUgc2l6ZWQgdGFibGVzIGFyZSBtb3JlCisgKiB0cmFkaXRpb25hbCwgYnV0IGRvIG5vdCBoYXZlIGEgc2lnbmlmaWNhbnQgYWR2YW50YWdlIG92ZXIgcG93ZXItb2YtdHdvCisgKiBzaXplZCB0YWJsZSwgZXNwZWNpYWxseSB3aGVuIGRvdWJsZSBoYXNoaW5nIGlzIG5vdCB1c2VkIGZvciBjb2xsaXNpb24KKyAqIHJlc29sdXRpb24uCisgKgorICogMikgVGhlIGhhc2ggY29tcHV0YXRpb24gdXNlcyBhIHRhYmxlIG9mIHJhbmRvbSBpbnRlZ2VycyBbSGFuc29uOTcsCisgKiBwcC4gMzktNDFdLgorICoKKyAqIEZVVFVSRSBFTkhBTkNFTUVOVFMKKyAqCisgKiBXaXRoIGEgdGFibGUgc2l6ZSBvZiA1MTIsIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIHN1ZmZpY2llbnQgZm9yIGEKKyAqIGZldyBodW5kcmVkIGtleXMuICBTaW5jZSB0aGlzIGlzIHdlbGwgYWJvdmUgdGhlIGV4cGVjdGVkIHNpemUgb2YgdGhlCisgKiB0YWJsZXMgZm9yIHdoaWNoIHRoaXMgaW1wbGVtZW50YXRpb24gd2FzIGRlc2lnbmVkLCB0aGUgaW1wbGVtZW50YXRpb24gb2YKKyAqIGR5bmFtaWMgaGFzaCB0YWJsZXMgd2FzIHBvc3Rwb25lZCB1bnRpbCB0aGUgbmVlZCBhcmlzZXMuICBBIGNvbW1vbiAoYW5kCisgKiBuYWl2ZSkgYXBwcm9hY2ggdG8gZHluYW1pYyBoYXNoIHRhYmxlIGltcGxlbWVudGF0aW9uIHNpbXBseSBjcmVhdGVzIGEKKyAqIG5ldyBoYXNoIHRhYmxlIHdoZW4gbmVjZXNzYXJ5LCByZWhhc2hlcyBhbGwgdGhlIGRhdGEgaW50byB0aGUgbmV3IHRhYmxlLAorICogYW5kIGRlc3Ryb3lzIHRoZSBvbGQgdGFibGUuICBUaGUgYXBwcm9hY2ggaW4gW0xhcnNvbjg4XSBpcyBzdXBlcmlvciBpbgorICogdHdvIHdheXM6IDEpIG9ubHkgYSBwb3J0aW9uIG9mIHRoZSB0YWJsZSBpcyBleHBhbmRlZCB3aGVuIG5lZWRlZCwKKyAqIGRpc3RyaWJ1dGluZyB0aGUgZXhwYW5zaW9uIGNvc3Qgb3ZlciBzZXZlcmFsIGluc2VydGlvbnMsIGFuZCAyKSBwb3J0aW9ucworICogb2YgdGhlIHRhYmxlIGNhbiBiZSBsb2NrZWQsIGVuYWJsaW5nIGEgc2NhbGFibGUgdGhyZWFkLXNhZmUKKyAqIGltcGxlbWVudGF0aW9uLgorICoKKyAqIFJFRkVSRU5DRVMKKyAqCisgKiBbSGFuc29uOTddIERhdmlkIFIuIEhhbnNvbi4gIEMgSW50ZXJmYWNlcyBhbmQgSW1wbGVtZW50YXRpb25zOgorICogVGVjaG5pcXVlcyBmb3IgQ3JlYXRpbmcgUmV1c2FibGUgU29mdHdhcmUuICBSZWFkaW5nLCBNYXNzYWNodXNldHRzOgorICogQWRkaXNvbi1XZXNsZXksIDE5OTcuCisgKgorICogW0tudXRoNzNdIERvbmFsZCBFLiBLbnV0aC4gVGhlIEFydCBvZiBDb21wdXRlciBQcm9ncmFtbWluZy4gIFZvbHVtZSAzOgorICogU29ydGluZyBhbmQgU2VhcmNoaW5nLiAgUmVhZGluZywgTWFzc2FjaHVzZXR0czogQWRkaXNvbi1XZXNsZXksIDE5NzMuCisgKgorICogW0xhcnNvbjg4XSBQZXItQWtlIExhcnNvbi4gIkR5bmFtaWMgSGFzaCBUYWJsZXMiLiAgQ0FDTSAzMSg0KSwgQXByaWwKKyAqIDE5ODgsIHBwLiA0NDYtNDU3LgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgInhmODZkcm0uaCIKKyNpbmNsdWRlICJ4Zjg2ZHJtSGFzaC5oIgorCisjZGVmaW5lIEhBU0hfTUFHSUMgMHhkZWFkYmVlZgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBIYXNoSGFzaCh1bnNpZ25lZCBsb25nIGtleSkKK3sKKyAgICB1bnNpZ25lZCBsb25nICAgICAgICBoYXNoID0gMDsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgICB0bXAgID0ga2V5OworICAgIHN0YXRpYyBpbnQgICAgICAgICAgIGluaXQgPSAwOworICAgIHN0YXRpYyB1bnNpZ25lZCBsb25nIHNjYXR0ZXJbMjU2XTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBpOworCisgICAgaWYgKCFpbml0KSB7CisJdm9pZCAqc3RhdGU7CisJc3RhdGUgPSBkcm1SYW5kb21DcmVhdGUoMzcpOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgc2NhdHRlcltpXSA9IGRybVJhbmRvbShzdGF0ZSk7CisJZHJtUmFuZG9tRGVzdHJveShzdGF0ZSk7CisJKytpbml0OworICAgIH0KKworICAgIHdoaWxlICh0bXApIHsKKwloYXNoID0gKGhhc2ggPDwgMSkgKyBzY2F0dGVyW3RtcCAmIDB4ZmZdOworCXRtcCA+Pj0gODsKKyAgICB9CisKKyAgICBoYXNoICU9IEhBU0hfU0laRTsKKyNpZiBERUJVRworICAgIHByaW50ZiggIkhhc2goJWx1KSA9ICVsdVxuIiwga2V5LCBoYXNoKTsKKyNlbmRpZgorICAgIHJldHVybiBoYXNoOworfQorCit2b2lkICpkcm1IYXNoQ3JlYXRlKHZvaWQpCit7CisgICAgSGFzaFRhYmxlUHRyIHRhYmxlOworICAgIGludCAgICAgICAgICBpOworCisgICAgdGFibGUgICAgICAgICAgID0gZHJtTWFsbG9jKHNpemVvZigqdGFibGUpKTsKKyAgICBpZiAoIXRhYmxlKSByZXR1cm4gTlVMTDsKKyAgICB0YWJsZS0+bWFnaWMgICAgPSBIQVNIX01BR0lDOworICAgIHRhYmxlLT5lbnRyaWVzICA9IDA7CisgICAgdGFibGUtPmhpdHMgICAgID0gMDsKKyAgICB0YWJsZS0+cGFydGlhbHMgPSAwOworICAgIHRhYmxlLT5taXNzZXMgICA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgSEFTSF9TSVpFOyBpKyspIHRhYmxlLT5idWNrZXRzW2ldID0gTlVMTDsKKyAgICByZXR1cm4gdGFibGU7Cit9CisKK2ludCBkcm1IYXNoRGVzdHJveSh2b2lkICp0KQoreworICAgIEhhc2hUYWJsZVB0ciAgdGFibGUgPSAoSGFzaFRhYmxlUHRyKXQ7CisgICAgSGFzaEJ1Y2tldFB0ciBidWNrZXQ7CisgICAgSGFzaEJ1Y2tldFB0ciBuZXh0OworICAgIGludCAgICAgICAgICAgaTsKKworICAgIGlmICh0YWJsZS0+bWFnaWMgIT0gSEFTSF9NQUdJQykgcmV0dXJuIC0xOyAvKiBCYWQgbWFnaWMgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBIQVNIX1NJWkU7IGkrKykgeworCWZvciAoYnVja2V0ID0gdGFibGUtPmJ1Y2tldHNbaV07IGJ1Y2tldDspIHsKKwkgICAgbmV4dCA9IGJ1Y2tldC0+bmV4dDsKKwkgICAgZHJtRnJlZShidWNrZXQpOworCSAgICBidWNrZXQgPSBuZXh0OworCX0KKyAgICB9CisgICAgZHJtRnJlZSh0YWJsZSk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEZpbmQgdGhlIGJ1Y2tldCBhbmQgb3JnYW5pemUgdGhlIGxpc3Qgc28gdGhhdCB0aGlzIGJ1Y2tldCBpcyBhdCB0aGUKKyAgIHRvcC4gKi8KKworc3RhdGljIEhhc2hCdWNrZXRQdHIgSGFzaEZpbmQoSGFzaFRhYmxlUHRyIHRhYmxlLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBrZXksIHVuc2lnbmVkIGxvbmcgKmgpCit7CisgICAgdW5zaWduZWQgbG9uZyBoYXNoID0gSGFzaEhhc2goa2V5KTsKKyAgICBIYXNoQnVja2V0UHRyIHByZXYgPSBOVUxMOworICAgIEhhc2hCdWNrZXRQdHIgYnVja2V0OworCisgICAgaWYgKGgpICpoID0gaGFzaDsKKworICAgIGZvciAoYnVja2V0ID0gdGFibGUtPmJ1Y2tldHNbaGFzaF07IGJ1Y2tldDsgYnVja2V0ID0gYnVja2V0LT5uZXh0KSB7CisJaWYgKGJ1Y2tldC0+a2V5ID09IGtleSkgeworCSAgICBpZiAocHJldikgeworCQkJCS8qIE9yZ2FuaXplICovCisJCXByZXYtPm5leHQgICAgICAgICAgID0gYnVja2V0LT5uZXh0OworCQlidWNrZXQtPm5leHQgICAgICAgICA9IHRhYmxlLT5idWNrZXRzW2hhc2hdOworCQl0YWJsZS0+YnVja2V0c1toYXNoXSA9IGJ1Y2tldDsKKwkJKyt0YWJsZS0+cGFydGlhbHM7CisJICAgIH0gZWxzZSB7CisJCSsrdGFibGUtPmhpdHM7CisJICAgIH0KKwkgICAgcmV0dXJuIGJ1Y2tldDsKKwl9CisJcHJldiA9IGJ1Y2tldDsKKyAgICB9CisgICAgKyt0YWJsZS0+bWlzc2VzOworICAgIHJldHVybiBOVUxMOworfQorCitpbnQgZHJtSGFzaExvb2t1cCh2b2lkICp0LCB1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqKnZhbHVlKQoreworICAgIEhhc2hUYWJsZVB0ciAgdGFibGUgPSAoSGFzaFRhYmxlUHRyKXQ7CisgICAgSGFzaEJ1Y2tldFB0ciBidWNrZXQ7CisKKyAgICBpZiAoIXRhYmxlIHx8IHRhYmxlLT5tYWdpYyAhPSBIQVNIX01BR0lDKSByZXR1cm4gLTE7IC8qIEJhZCBtYWdpYyAqLworCisgICAgYnVja2V0ID0gSGFzaEZpbmQodGFibGUsIGtleSwgTlVMTCk7CisgICAgaWYgKCFidWNrZXQpIHJldHVybiAxOwkvKiBOb3QgZm91bmQgKi8KKyAgICAqdmFsdWUgPSBidWNrZXQtPnZhbHVlOworICAgIHJldHVybiAwOwkJCS8qIEZvdW5kICovCit9CisKK2ludCBkcm1IYXNoSW5zZXJ0KHZvaWQgKnQsIHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICp2YWx1ZSkKK3sKKyAgICBIYXNoVGFibGVQdHIgIHRhYmxlID0gKEhhc2hUYWJsZVB0cil0OworICAgIEhhc2hCdWNrZXRQdHIgYnVja2V0OworICAgIHVuc2lnbmVkIGxvbmcgaGFzaDsKKworICAgIGlmICh0YWJsZS0+bWFnaWMgIT0gSEFTSF9NQUdJQykgcmV0dXJuIC0xOyAvKiBCYWQgbWFnaWMgKi8KKworICAgIGlmIChIYXNoRmluZCh0YWJsZSwga2V5LCAmaGFzaCkpIHJldHVybiAxOyAvKiBBbHJlYWR5IGluIHRhYmxlICovCisKKyAgICBidWNrZXQgICAgICAgICAgICAgICA9IGRybU1hbGxvYyhzaXplb2YoKmJ1Y2tldCkpOworICAgIGlmICghYnVja2V0KSByZXR1cm4gLTE7CS8qIEVycm9yICovCisgICAgYnVja2V0LT5rZXkgICAgICAgICAgPSBrZXk7CisgICAgYnVja2V0LT52YWx1ZSAgICAgICAgPSB2YWx1ZTsKKyAgICBidWNrZXQtPm5leHQgICAgICAgICA9IHRhYmxlLT5idWNrZXRzW2hhc2hdOworICAgIHRhYmxlLT5idWNrZXRzW2hhc2hdID0gYnVja2V0OworI2lmIERFQlVHCisgICAgcHJpbnRmKCJJbnNlcnRlZCAlbHUgYXQgJWx1LyVwXG4iLCBrZXksIGhhc2gsIGJ1Y2tldCk7CisjZW5kaWYKKyAgICByZXR1cm4gMDsJCQkvKiBBZGRlZCB0byB0YWJsZSAqLworfQorCitpbnQgZHJtSGFzaERlbGV0ZSh2b2lkICp0LCB1bnNpZ25lZCBsb25nIGtleSkKK3sKKyAgICBIYXNoVGFibGVQdHIgIHRhYmxlID0gKEhhc2hUYWJsZVB0cil0OworICAgIHVuc2lnbmVkIGxvbmcgaGFzaDsKKyAgICBIYXNoQnVja2V0UHRyIGJ1Y2tldDsKKworICAgIGlmICh0YWJsZS0+bWFnaWMgIT0gSEFTSF9NQUdJQykgcmV0dXJuIC0xOyAvKiBCYWQgbWFnaWMgKi8KKworICAgIGJ1Y2tldCA9IEhhc2hGaW5kKHRhYmxlLCBrZXksICZoYXNoKTsKKworICAgIGlmICghYnVja2V0KSByZXR1cm4gMTsJLyogTm90IGZvdW5kICovCisKKyAgICB0YWJsZS0+YnVja2V0c1toYXNoXSA9IGJ1Y2tldC0+bmV4dDsKKyAgICBkcm1GcmVlKGJ1Y2tldCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1IYXNoTmV4dCh2b2lkICp0LCB1bnNpZ25lZCBsb25nICprZXksIHZvaWQgKip2YWx1ZSkKK3sKKyAgICBIYXNoVGFibGVQdHIgIHRhYmxlID0gKEhhc2hUYWJsZVB0cil0OworCisgICAgd2hpbGUgKHRhYmxlLT5wMCA8IEhBU0hfU0laRSkgeworCWlmICh0YWJsZS0+cDEpIHsKKwkgICAgKmtleSAgICAgICA9IHRhYmxlLT5wMS0+a2V5OworCSAgICAqdmFsdWUgICAgID0gdGFibGUtPnAxLT52YWx1ZTsKKwkgICAgdGFibGUtPnAxICA9IHRhYmxlLT5wMS0+bmV4dDsKKwkgICAgcmV0dXJuIDE7CisJfQorCXRhYmxlLT5wMSA9IHRhYmxlLT5idWNrZXRzW3RhYmxlLT5wMF07CisJKyt0YWJsZS0+cDA7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgZHJtSGFzaEZpcnN0KHZvaWQgKnQsIHVuc2lnbmVkIGxvbmcgKmtleSwgdm9pZCAqKnZhbHVlKQoreworICAgIEhhc2hUYWJsZVB0ciAgdGFibGUgPSAoSGFzaFRhYmxlUHRyKXQ7CisKKyAgICBpZiAodGFibGUtPm1hZ2ljICE9IEhBU0hfTUFHSUMpIHJldHVybiAtMTsgLyogQmFkIG1hZ2ljICovCisKKyAgICB0YWJsZS0+cDAgPSAwOworICAgIHRhYmxlLT5wMSA9IHRhYmxlLT5idWNrZXRzWzBdOworICAgIHJldHVybiBkcm1IYXNoTmV4dCh0YWJsZSwga2V5LCB2YWx1ZSk7Cit9CmRpZmYgLS1naXQgYS94Zjg2ZHJtSGFzaC5oIGIveGY4NmRybUhhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGZkODRiCi0tLSAvZGV2L251bGwKKysrIGIveGY4NmRybUhhc2guaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKi8KKworI2RlZmluZSBIQVNIX1NJWkUgIDUxMgkJLyogR29vZCBmb3IgYWJvdXQgMTAwIGVudHJpZXMgKi8KKwkJCQkvKiBJZiB5b3UgY2hhbmdlIHRoaXMgdmFsdWUsIHlvdSBwcm9iYWJseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHRvIGNoYW5nZSB0aGUgSGFzaEhhc2ggaGFzaGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiEgKi8KKwordHlwZWRlZiBzdHJ1Y3QgSGFzaEJ1Y2tldCB7CisgICAgdW5zaWduZWQgbG9uZyAgICAga2V5OworICAgIHZvaWQgICAgICAgICAgICAgICp2YWx1ZTsKKyAgICBzdHJ1Y3QgSGFzaEJ1Y2tldCAqbmV4dDsKK30gSGFzaEJ1Y2tldCwgKkhhc2hCdWNrZXRQdHI7CisKK3R5cGVkZWYgc3RydWN0IEhhc2hUYWJsZSB7CisgICAgdW5zaWduZWQgbG9uZyAgICBtYWdpYzsKKyAgICB1bnNpZ25lZCBsb25nICAgIGVudHJpZXM7CisgICAgdW5zaWduZWQgbG9uZyAgICBoaXRzOwkvKiBBdCB0b3Agb2YgbGlua2VkIGxpc3QgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgIHBhcnRpYWxzOwkvKiBOb3QgYXQgdG9wIG9mIGxpbmtlZCBsaXN0ICovCisgICAgdW5zaWduZWQgbG9uZyAgICBtaXNzZXM7CS8qIE5vdCBpbiB0YWJsZSAqLworICAgIEhhc2hCdWNrZXRQdHIgICAgYnVja2V0c1tIQVNIX1NJWkVdOworICAgIGludCAgICAgICAgICAgICAgcDA7CisgICAgSGFzaEJ1Y2tldFB0ciAgICBwMTsKK30gSGFzaFRhYmxlLCAqSGFzaFRhYmxlUHRyOwpkaWZmIC0tZ2l0IGEveGY4NmRybU1vZGUuYyBiL3hmODZkcm1Nb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNhZTI3ZAotLS0gL2Rldi9udWxsCisrKyBiL3hmODZkcm1Nb2RlLmMKQEAgLTAsMCArMSwxNTc3IEBACisvKgorICogXGZpbGUgeGY4NmRybU1vZGUuYworICogSGVhZGVyIGZvciBEUk0gbW9kZXNldHRpbmcgaW50ZXJmYWNlLgorICoKKyAqIFxhdXRob3IgSmFrb2IgQm9ybmVjcmFudHogPHdhbGxicmFrZXJAZ21haWwuY29tPgorICoKKyAqIFxwYXIgQWNrbm93bGVkZ2VtZW50czoKKyAqIEZlYiAyMDA3LCBEYXZlIEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4KKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggRGF2ZSBBaXJsaWUgPGFpcmxpZWRAbGludXguaWU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBKYWtvYiBCb3JuZWNyYW50eiA8d2FsbGJyYWtlckBnbWFpbC5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisvKgorICogVE9ETyB0aGUgdHlwZXMgd2UgYXJlIGFmdGVyIGFyZSBkZWZpbmVkIGluIGRpZmZlcmVudCBoZWFkZXJzIG9uIGRpZmZlcmVudAorICogcGxhdGZvcm1zIGZpbmQgd2hpY2ggaGVhZGVycyB0byBpbmNsdWRlIHRvIGdldCB1aW50MzJfdAorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2lmZGVmIEhBVkVfU1lTX1NZU0NUTF9ICisjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNpbmNsdWRlICJ4Zjg2ZHJtTW9kZS5oIgorI2luY2x1ZGUgInhmODZkcm0uaCIKKyNpbmNsdWRlIDxkcm0uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjZGVmaW5lIG1lbWNsZWFyKHMpIG1lbXNldCgmcywgMCwgc2l6ZW9mKHMpKQorCisjZGVmaW5lIFU2NDJWT0lEKHgpICgodm9pZCAqKSh1bnNpZ25lZCBsb25nKSh4KSkKKyNkZWZpbmUgVk9JRDJVNjQoeCkgKCh1aW50NjRfdCkodW5zaWduZWQgbG9uZykoeCkpCisKK3N0YXRpYyBpbmxpbmUgaW50IERSTV9JT0NUTChpbnQgZmQsIHVuc2lnbmVkIGxvbmcgY21kLCB2b2lkICphcmcpCit7CisJaW50IHJldCA9IGRybUlvY3RsKGZkLCBjbWQsIGFyZyk7CisJcmV0dXJuIHJldCA8IDAgPyAtZXJybm8gOiByZXQ7Cit9CisKKy8qCisgKiBVdGlsIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkKiBkcm1BbGxvY0NweShjaGFyICphcnJheSwgaW50IGNvdW50LCBpbnQgZW50cnlfc2l6ZSkKK3sKKwljaGFyICpyOworCWludCBpOworCisJaWYgKCFjb3VudCB8fCAhYXJyYXkgfHwgIWVudHJ5X3NpemUpCisJCXJldHVybiAwOworCisJaWYgKCEociA9IGRybU1hbGxvYyhjb3VudCplbnRyeV9zaXplKSkpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCW1lbWNweShyKyhlbnRyeV9zaXplKmkpLCBhcnJheSsoZW50cnlfc2l6ZSppKSwgZW50cnlfc2l6ZSk7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIEEgY291cGxlIG9mIGZyZWUgZnVuY3Rpb25zLgorICovCisKK3ZvaWQgZHJtTW9kZUZyZWVNb2RlSW5mbyhkcm1Nb2RlTW9kZUluZm9QdHIgcHRyKQoreworCWlmICghcHRyKQorCQlyZXR1cm47CisKKwlkcm1GcmVlKHB0cik7Cit9CisKK3ZvaWQgZHJtTW9kZUZyZWVSZXNvdXJjZXMoZHJtTW9kZVJlc1B0ciBwdHIpCit7CisJaWYgKCFwdHIpCisJCXJldHVybjsKKworCWRybUZyZWUocHRyLT5mYnMpOworCWRybUZyZWUocHRyLT5jcnRjcyk7CisJZHJtRnJlZShwdHItPmNvbm5lY3RvcnMpOworCWRybUZyZWUocHRyLT5lbmNvZGVycyk7CisJZHJtRnJlZShwdHIpOworfQorCit2b2lkIGRybU1vZGVGcmVlRkIoZHJtTW9kZUZCUHRyIHB0cikKK3sKKwlpZiAoIXB0cikKKwkJcmV0dXJuOworCisJLyogd2UgbWlnaHQgYWRkIG1vcmUgZnJlZXMgbGF0ZXIuICovCisJZHJtRnJlZShwdHIpOworfQorCit2b2lkIGRybU1vZGVGcmVlQ3J0Yyhkcm1Nb2RlQ3J0Y1B0ciBwdHIpCit7CisJaWYgKCFwdHIpCisJCXJldHVybjsKKworCWRybUZyZWUocHRyKTsKK30KKwordm9pZCBkcm1Nb2RlRnJlZUNvbm5lY3Rvcihkcm1Nb2RlQ29ubmVjdG9yUHRyIHB0cikKK3sKKwlpZiAoIXB0cikKKwkJcmV0dXJuOworCisJZHJtRnJlZShwdHItPmVuY29kZXJzKTsKKwlkcm1GcmVlKHB0ci0+cHJvcF92YWx1ZXMpOworCWRybUZyZWUocHRyLT5wcm9wcyk7CisJZHJtRnJlZShwdHItPm1vZGVzKTsKKwlkcm1GcmVlKHB0cik7Cit9CisKK3ZvaWQgZHJtTW9kZUZyZWVFbmNvZGVyKGRybU1vZGVFbmNvZGVyUHRyIHB0cikKK3sKKwlkcm1GcmVlKHB0cik7Cit9CisKKy8qCisgKiBNb2RlU2V0dGluZyBmdW5jdGlvbnMuCisgKi8KKworZHJtTW9kZVJlc1B0ciBkcm1Nb2RlR2V0UmVzb3VyY2VzKGludCBmZCkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfY2FyZF9yZXMgcmVzLCBjb3VudHM7CisJZHJtTW9kZVJlc1B0ciByID0gMDsKKworcmV0cnk6CisJbWVtY2xlYXIocmVzKTsKKwlpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9NT0RFX0dFVFJFU09VUkNFUywgJnJlcykpCisJCXJldHVybiAwOworCisJY291bnRzID0gcmVzOworCisJaWYgKHJlcy5jb3VudF9mYnMpIHsKKwkJcmVzLmZiX2lkX3B0ciA9IFZPSUQyVTY0KGRybU1hbGxvYyhyZXMuY291bnRfZmJzKnNpemVvZih1aW50MzJfdCkpKTsKKwkJaWYgKCFyZXMuZmJfaWRfcHRyKQorCQkJZ290byBlcnJfYWxsb2NzOworCX0KKwlpZiAocmVzLmNvdW50X2NydGNzKSB7CisJCXJlcy5jcnRjX2lkX3B0ciA9IFZPSUQyVTY0KGRybU1hbGxvYyhyZXMuY291bnRfY3J0Y3Mqc2l6ZW9mKHVpbnQzMl90KSkpOworCQlpZiAoIXJlcy5jcnRjX2lkX3B0cikKKwkJCWdvdG8gZXJyX2FsbG9jczsKKwl9CisJaWYgKHJlcy5jb3VudF9jb25uZWN0b3JzKSB7CisJCXJlcy5jb25uZWN0b3JfaWRfcHRyID0gVk9JRDJVNjQoZHJtTWFsbG9jKHJlcy5jb3VudF9jb25uZWN0b3JzKnNpemVvZih1aW50MzJfdCkpKTsKKwkJaWYgKCFyZXMuY29ubmVjdG9yX2lkX3B0cikKKwkJCWdvdG8gZXJyX2FsbG9jczsKKwl9CisJaWYgKHJlcy5jb3VudF9lbmNvZGVycykgeworCQlyZXMuZW5jb2Rlcl9pZF9wdHIgPSBWT0lEMlU2NChkcm1NYWxsb2MocmVzLmNvdW50X2VuY29kZXJzKnNpemVvZih1aW50MzJfdCkpKTsKKwkJaWYgKCFyZXMuZW5jb2Rlcl9pZF9wdHIpCisJCQlnb3RvIGVycl9hbGxvY3M7CisJfQorCisJaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfTU9ERV9HRVRSRVNPVVJDRVMsICZyZXMpKQorCQlnb3RvIGVycl9hbGxvY3M7CisKKwkvKiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb25uZWN0b3JzIGFuZCBldGMgbWF5IGhhdmUgY2hhbmdlZCB3aXRoIGEKKwkgKiBob3RwbHVnIGV2ZW50IGluIGJldHdlZW4gdGhlIGlvY3RscywgaW4gd2hpY2ggY2FzZSB0aGUgZmllbGQgaXMKKwkgKiBzaWxlbnRseSBpZ25vcmVkIGJ5IHRoZSBrZXJuZWwuCisJICovCisJaWYgKGNvdW50cy5jb3VudF9mYnMgPCByZXMuY291bnRfZmJzIHx8CisJICAgIGNvdW50cy5jb3VudF9jcnRjcyA8IHJlcy5jb3VudF9jcnRjcyB8fAorCSAgICBjb3VudHMuY291bnRfY29ubmVjdG9ycyA8IHJlcy5jb3VudF9jb25uZWN0b3JzIHx8CisJICAgIGNvdW50cy5jb3VudF9lbmNvZGVycyA8IHJlcy5jb3VudF9lbmNvZGVycykKKwl7CisJCWRybUZyZWUoVTY0MlZPSUQocmVzLmZiX2lkX3B0cikpOworCQlkcm1GcmVlKFU2NDJWT0lEKHJlcy5jcnRjX2lkX3B0cikpOworCQlkcm1GcmVlKFU2NDJWT0lEKHJlcy5jb25uZWN0b3JfaWRfcHRyKSk7CisJCWRybUZyZWUoVTY0MlZPSUQocmVzLmVuY29kZXJfaWRfcHRyKSk7CisKKwkJZ290byByZXRyeTsKKwl9CisKKwkvKgorCSAqIHJldHVybgorCSAqLworCWlmICghKHIgPSBkcm1NYWxsb2Moc2l6ZW9mKCpyKSkpKQorCQlnb3RvIGVycl9hbGxvY3M7CisKKwlyLT5taW5fd2lkdGggICAgID0gcmVzLm1pbl93aWR0aDsKKwlyLT5tYXhfd2lkdGggICAgID0gcmVzLm1heF93aWR0aDsKKwlyLT5taW5faGVpZ2h0ICAgID0gcmVzLm1pbl9oZWlnaHQ7CisJci0+bWF4X2hlaWdodCAgICA9IHJlcy5tYXhfaGVpZ2h0OworCXItPmNvdW50X2ZicyAgICAgPSByZXMuY291bnRfZmJzOworCXItPmNvdW50X2NydGNzICAgPSByZXMuY291bnRfY3J0Y3M7CisJci0+Y291bnRfY29ubmVjdG9ycyA9IHJlcy5jb3VudF9jb25uZWN0b3JzOworCXItPmNvdW50X2VuY29kZXJzID0gcmVzLmNvdW50X2VuY29kZXJzOworCisJci0+ZmJzICAgICAgICA9IGRybUFsbG9jQ3B5KFU2NDJWT0lEKHJlcy5mYl9pZF9wdHIpLCByZXMuY291bnRfZmJzLCBzaXplb2YodWludDMyX3QpKTsKKwlyLT5jcnRjcyAgICAgID0gZHJtQWxsb2NDcHkoVTY0MlZPSUQocmVzLmNydGNfaWRfcHRyKSwgcmVzLmNvdW50X2NydGNzLCBzaXplb2YodWludDMyX3QpKTsKKwlyLT5jb25uZWN0b3JzID0gZHJtQWxsb2NDcHkoVTY0MlZPSUQocmVzLmNvbm5lY3Rvcl9pZF9wdHIpLCByZXMuY291bnRfY29ubmVjdG9ycywgc2l6ZW9mKHVpbnQzMl90KSk7CisJci0+ZW5jb2RlcnMgICA9IGRybUFsbG9jQ3B5KFU2NDJWT0lEKHJlcy5lbmNvZGVyX2lkX3B0ciksIHJlcy5jb3VudF9lbmNvZGVycywgc2l6ZW9mKHVpbnQzMl90KSk7CisJaWYgKChyZXMuY291bnRfZmJzICYmICFyLT5mYnMpIHx8CisJICAgIChyZXMuY291bnRfY3J0Y3MgJiYgIXItPmNydGNzKSB8fAorCSAgICAocmVzLmNvdW50X2Nvbm5lY3RvcnMgJiYgIXItPmNvbm5lY3RvcnMpIHx8CisJICAgIChyZXMuY291bnRfZW5jb2RlcnMgJiYgIXItPmVuY29kZXJzKSkKKwl7CisJCWRybUZyZWUoci0+ZmJzKTsKKwkJZHJtRnJlZShyLT5jcnRjcyk7CisJCWRybUZyZWUoci0+Y29ubmVjdG9ycyk7CisJCWRybUZyZWUoci0+ZW5jb2RlcnMpOworCQlkcm1GcmVlKHIpOworCQlyID0gMDsKKwl9CisKK2Vycl9hbGxvY3M6CisJZHJtRnJlZShVNjQyVk9JRChyZXMuZmJfaWRfcHRyKSk7CisJZHJtRnJlZShVNjQyVk9JRChyZXMuY3J0Y19pZF9wdHIpKTsKKwlkcm1GcmVlKFU2NDJWT0lEKHJlcy5jb25uZWN0b3JfaWRfcHRyKSk7CisJZHJtRnJlZShVNjQyVk9JRChyZXMuZW5jb2Rlcl9pZF9wdHIpKTsKKworCXJldHVybiByOworfQorCitpbnQgZHJtTW9kZUFkZEZCKGludCBmZCwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDhfdCBkZXB0aCwKKwkJIHVpbnQ4X3QgYnBwLCB1aW50MzJfdCBwaXRjaCwgdWludDMyX3QgYm9faGFuZGxlLAorCQkgdWludDMyX3QgKmJ1Zl9pZCkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfZmJfY21kIGY7CisJaW50IHJldDsKKworCW1lbWNsZWFyKGYpOworCWYud2lkdGggID0gd2lkdGg7CisJZi5oZWlnaHQgPSBoZWlnaHQ7CisJZi5waXRjaCAgPSBwaXRjaDsKKwlmLmJwcCAgICA9IGJwcDsKKwlmLmRlcHRoICA9IGRlcHRoOworCWYuaGFuZGxlID0gYm9faGFuZGxlOworCisJaWYgKChyZXQgPSBEUk1fSU9DVEwoZmQsIERSTV9JT0NUTF9NT0RFX0FEREZCLCAmZikpKQorCQlyZXR1cm4gcmV0OworCisJKmJ1Zl9pZCA9IGYuZmJfaWQ7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkcm1Nb2RlQWRkRkIyV2l0aE1vZGlmaWVycyhpbnQgZmQsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGl4ZWxfZm9ybWF0LCB1aW50MzJfdCBib19oYW5kbGVzWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBpdGNoZXNbNF0sIHVpbnQzMl90IG9mZnNldHNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgbW9kaWZpZXJbNF0sIHVpbnQzMl90ICpidWZfaWQsIHVpbnQzMl90IGZsYWdzKQoreworCXN0cnVjdCBkcm1fbW9kZV9mYl9jbWQyIGY7CisJaW50IHJldDsKKworCW1lbWNsZWFyKGYpOworCWYud2lkdGggID0gd2lkdGg7CisJZi5oZWlnaHQgPSBoZWlnaHQ7CisJZi5waXhlbF9mb3JtYXQgPSBwaXhlbF9mb3JtYXQ7CisJZi5mbGFncyA9IGZsYWdzOworCW1lbWNweShmLmhhbmRsZXMsIGJvX2hhbmRsZXMsIDQgKiBzaXplb2YoYm9faGFuZGxlc1swXSkpOworCW1lbWNweShmLnBpdGNoZXMsIHBpdGNoZXMsIDQgKiBzaXplb2YocGl0Y2hlc1swXSkpOworCW1lbWNweShmLm9mZnNldHMsIG9mZnNldHMsIDQgKiBzaXplb2Yob2Zmc2V0c1swXSkpOworCWlmIChtb2RpZmllcikKKwkJbWVtY3B5KGYubW9kaWZpZXIsIG1vZGlmaWVyLCA0ICogc2l6ZW9mKG1vZGlmaWVyWzBdKSk7CisKKwlpZiAoKHJldCA9IERSTV9JT0NUTChmZCwgRFJNX0lPQ1RMX01PREVfQURERkIyLCAmZikpKQorCQlyZXR1cm4gcmV0OworCisJKmJ1Zl9pZCA9IGYuZmJfaWQ7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkcm1Nb2RlQWRkRkIyKGludCBmZCwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBpeGVsX2Zvcm1hdCwgdWludDMyX3QgYm9faGFuZGxlc1s0XSwKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBpdGNoZXNbNF0sIHVpbnQzMl90IG9mZnNldHNbNF0sCisgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqYnVmX2lkLCB1aW50MzJfdCBmbGFncykKK3sKKwlyZXR1cm4gZHJtTW9kZUFkZEZCMldpdGhNb2RpZmllcnMoZmQsIHdpZHRoLCBoZWlnaHQsCisJCQkJCSAgcGl4ZWxfZm9ybWF0LCBib19oYW5kbGVzLAorCQkJCQkgIHBpdGNoZXMsIG9mZnNldHMsIE5VTEwsCisJCQkJCSAgYnVmX2lkLCBmbGFncyk7Cit9CisKK2ludCBkcm1Nb2RlUm1GQihpbnQgZmQsIHVpbnQzMl90IGJ1ZmZlcklkKQoreworCXJldHVybiBEUk1fSU9DVEwoZmQsIERSTV9JT0NUTF9NT0RFX1JNRkIsICZidWZmZXJJZCk7Cit9CisKK2RybU1vZGVGQlB0ciBkcm1Nb2RlR2V0RkIoaW50IGZkLCB1aW50MzJfdCBidWYpCit7CisJc3RydWN0IGRybV9tb2RlX2ZiX2NtZCBpbmZvOworCWRybU1vZGVGQlB0ciByOworCisJbWVtY2xlYXIoaW5mbyk7CisJaW5mby5mYl9pZCA9IGJ1ZjsKKworCWlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX01PREVfR0VURkIsICZpbmZvKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIShyID0gZHJtTWFsbG9jKHNpemVvZigqcikpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyLT5mYl9pZCA9IGluZm8uZmJfaWQ7CisJci0+d2lkdGggPSBpbmZvLndpZHRoOworCXItPmhlaWdodCA9IGluZm8uaGVpZ2h0OworCXItPnBpdGNoID0gaW5mby5waXRjaDsKKwlyLT5icHAgPSBpbmZvLmJwcDsKKwlyLT5oYW5kbGUgPSBpbmZvLmhhbmRsZTsKKwlyLT5kZXB0aCA9IGluZm8uZGVwdGg7CisKKwlyZXR1cm4gcjsKK30KKworaW50IGRybU1vZGVEaXJ0eUZCKGludCBmZCwgdWludDMyX3QgYnVmZmVySWQsCisJCSAgIGRybU1vZGVDbGlwUHRyIGNsaXBzLCB1aW50MzJfdCBudW1fY2xpcHMpCit7CisJc3RydWN0IGRybV9tb2RlX2ZiX2RpcnR5X2NtZCBkaXJ0eTsKKworCW1lbWNsZWFyKGRpcnR5KTsKKwlkaXJ0eS5mYl9pZCA9IGJ1ZmZlcklkOworCWRpcnR5LmNsaXBzX3B0ciA9IFZPSUQyVTY0KGNsaXBzKTsKKwlkaXJ0eS5udW1fY2xpcHMgPSBudW1fY2xpcHM7CisKKwlyZXR1cm4gRFJNX0lPQ1RMKGZkLCBEUk1fSU9DVExfTU9ERV9ESVJUWUZCLCAmZGlydHkpOworfQorCisvKgorICogQ3J0YyBmdW5jdGlvbnMKKyAqLworCitkcm1Nb2RlQ3J0Y1B0ciBkcm1Nb2RlR2V0Q3J0YyhpbnQgZmQsIHVpbnQzMl90IGNydGNJZCkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfY3J0YyBjcnRjOworCWRybU1vZGVDcnRjUHRyIHI7CisKKwltZW1jbGVhcihjcnRjKTsKKwljcnRjLmNydGNfaWQgPSBjcnRjSWQ7CisKKwlpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9NT0RFX0dFVENSVEMsICZjcnRjKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIHJldHVybgorCSAqLworCisJaWYgKCEociA9IGRybU1hbGxvYyhzaXplb2YoKnIpKSkpCisJCXJldHVybiAwOworCisJci0+Y3J0Y19pZCAgICAgICAgID0gY3J0Yy5jcnRjX2lkOworCXItPnggICAgICAgICAgICAgICA9IGNydGMueDsKKwlyLT55ICAgICAgICAgICAgICAgPSBjcnRjLnk7CisJci0+bW9kZV92YWxpZCAgICAgID0gY3J0Yy5tb2RlX3ZhbGlkOworCWlmIChyLT5tb2RlX3ZhbGlkKSB7CisJCW1lbWNweSgmci0+bW9kZSwgJmNydGMubW9kZSwgc2l6ZW9mKHN0cnVjdCBkcm1fbW9kZV9tb2RlaW5mbykpOworCQlyLT53aWR0aCA9IGNydGMubW9kZS5oZGlzcGxheTsKKwkJci0+aGVpZ2h0ID0gY3J0Yy5tb2RlLnZkaXNwbGF5OworCX0KKwlyLT5idWZmZXJfaWQgICAgICAgPSBjcnRjLmZiX2lkOworCXItPmdhbW1hX3NpemUgICAgICA9IGNydGMuZ2FtbWFfc2l6ZTsKKwlyZXR1cm4gcjsKK30KKworaW50IGRybU1vZGVTZXRDcnRjKGludCBmZCwgdWludDMyX3QgY3J0Y0lkLCB1aW50MzJfdCBidWZmZXJJZCwKKwkJICAgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgKmNvbm5lY3RvcnMsIGludCBjb3VudCwKKwkJICAgZHJtTW9kZU1vZGVJbmZvUHRyIG1vZGUpCit7CisJc3RydWN0IGRybV9tb2RlX2NydGMgY3J0YzsKKworCW1lbWNsZWFyKGNydGMpOworCWNydGMueCAgICAgICAgICAgICA9IHg7CisJY3J0Yy55ICAgICAgICAgICAgID0geTsKKwljcnRjLmNydGNfaWQgICAgICAgPSBjcnRjSWQ7CisJY3J0Yy5mYl9pZCAgICAgICAgID0gYnVmZmVySWQ7CisJY3J0Yy5zZXRfY29ubmVjdG9yc19wdHIgPSBWT0lEMlU2NChjb25uZWN0b3JzKTsKKwljcnRjLmNvdW50X2Nvbm5lY3RvcnMgPSBjb3VudDsKKwlpZiAobW9kZSkgeworCSAgbWVtY3B5KCZjcnRjLm1vZGUsIG1vZGUsIHNpemVvZihzdHJ1Y3QgZHJtX21vZGVfbW9kZWluZm8pKTsKKwkgIGNydGMubW9kZV92YWxpZCA9IDE7CisJfQorCisJcmV0dXJuIERSTV9JT0NUTChmZCwgRFJNX0lPQ1RMX01PREVfU0VUQ1JUQywgJmNydGMpOworfQorCisvKgorICogQ3Vyc29yIG1hbmlwdWxhdGlvbgorICovCisKK2ludCBkcm1Nb2RlU2V0Q3Vyc29yKGludCBmZCwgdWludDMyX3QgY3J0Y0lkLCB1aW50MzJfdCBib19oYW5kbGUsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpCit7CisJc3RydWN0IGRybV9tb2RlX2N1cnNvciBhcmc7CisKKwltZW1jbGVhcihhcmcpOworCWFyZy5mbGFncyA9IERSTV9NT0RFX0NVUlNPUl9CTzsKKwlhcmcuY3J0Y19pZCA9IGNydGNJZDsKKwlhcmcud2lkdGggPSB3aWR0aDsKKwlhcmcuaGVpZ2h0ID0gaGVpZ2h0OworCWFyZy5oYW5kbGUgPSBib19oYW5kbGU7CisKKwlyZXR1cm4gRFJNX0lPQ1RMKGZkLCBEUk1fSU9DVExfTU9ERV9DVVJTT1IsICZhcmcpOworfQorCitpbnQgZHJtTW9kZVNldEN1cnNvcjIoaW50IGZkLCB1aW50MzJfdCBjcnRjSWQsIHVpbnQzMl90IGJvX2hhbmRsZSwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50MzJfdCBob3RfeCwgaW50MzJfdCBob3RfeSkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfY3Vyc29yMiBhcmc7CisKKwltZW1jbGVhcihhcmcpOworCWFyZy5mbGFncyA9IERSTV9NT0RFX0NVUlNPUl9CTzsKKwlhcmcuY3J0Y19pZCA9IGNydGNJZDsKKwlhcmcud2lkdGggPSB3aWR0aDsKKwlhcmcuaGVpZ2h0ID0gaGVpZ2h0OworCWFyZy5oYW5kbGUgPSBib19oYW5kbGU7CisJYXJnLmhvdF94ID0gaG90X3g7CisJYXJnLmhvdF95ID0gaG90X3k7CisKKwlyZXR1cm4gRFJNX0lPQ1RMKGZkLCBEUk1fSU9DVExfTU9ERV9DVVJTT1IyLCAmYXJnKTsKK30KKworaW50IGRybU1vZGVNb3ZlQ3Vyc29yKGludCBmZCwgdWludDMyX3QgY3J0Y0lkLCBpbnQgeCwgaW50IHkpCit7CisJc3RydWN0IGRybV9tb2RlX2N1cnNvciBhcmc7CisKKwltZW1jbGVhcihhcmcpOworCWFyZy5mbGFncyA9IERSTV9NT0RFX0NVUlNPUl9NT1ZFOworCWFyZy5jcnRjX2lkID0gY3J0Y0lkOworCWFyZy54ID0geDsKKwlhcmcueSA9IHk7CisKKwlyZXR1cm4gRFJNX0lPQ1RMKGZkLCBEUk1fSU9DVExfTU9ERV9DVVJTT1IsICZhcmcpOworfQorCisvKgorICogRW5jb2RlciBnZXQKKyAqLworZHJtTW9kZUVuY29kZXJQdHIgZHJtTW9kZUdldEVuY29kZXIoaW50IGZkLCB1aW50MzJfdCBlbmNvZGVyX2lkKQoreworCXN0cnVjdCBkcm1fbW9kZV9nZXRfZW5jb2RlciBlbmM7CisJZHJtTW9kZUVuY29kZXJQdHIgciA9IE5VTEw7CisKKwltZW1jbGVhcihlbmMpOworCWVuYy5lbmNvZGVyX2lkID0gZW5jb2Rlcl9pZDsKKworCWlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX01PREVfR0VURU5DT0RFUiwgJmVuYykpCisJCXJldHVybiAwOworCisJaWYgKCEociA9IGRybU1hbGxvYyhzaXplb2YoKnIpKSkpCisJCXJldHVybiAwOworCisJci0+ZW5jb2Rlcl9pZCA9IGVuYy5lbmNvZGVyX2lkOworCXItPmNydGNfaWQgPSBlbmMuY3J0Y19pZDsKKwlyLT5lbmNvZGVyX3R5cGUgPSBlbmMuZW5jb2Rlcl90eXBlOworCXItPnBvc3NpYmxlX2NydGNzID0gZW5jLnBvc3NpYmxlX2NydGNzOworCXItPnBvc3NpYmxlX2Nsb25lcyA9IGVuYy5wb3NzaWJsZV9jbG9uZXM7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIENvbm5lY3RvciBtYW5pcHVsYXRpb24KKyAqLworc3RhdGljIGRybU1vZGVDb25uZWN0b3JQdHIKK19kcm1Nb2RlR2V0Q29ubmVjdG9yKGludCBmZCwgdWludDMyX3QgY29ubmVjdG9yX2lkLCBpbnQgcHJvYmUpCit7CisJc3RydWN0IGRybV9tb2RlX2dldF9jb25uZWN0b3IgY29ubiwgY291bnRzOworCWRybU1vZGVDb25uZWN0b3JQdHIgciA9IE5VTEw7CisJc3RydWN0IGRybV9tb2RlX21vZGVpbmZvIHN0YWNrX21vZGU7CisKKwltZW1jbGVhcihjb25uKTsKKwljb25uLmNvbm5lY3Rvcl9pZCA9IGNvbm5lY3Rvcl9pZDsKKwlpZiAoIXByb2JlKSB7CisJCWNvbm4uY291bnRfbW9kZXMgPSAxOworCQljb25uLm1vZGVzX3B0ciA9IFZPSUQyVTY0KCZzdGFja19tb2RlKTsKKwl9CisKKwlpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9NT0RFX0dFVENPTk5FQ1RPUiwgJmNvbm4pKQorCQlyZXR1cm4gMDsKKworcmV0cnk6CisJY291bnRzID0gY29ubjsKKworCWlmIChjb25uLmNvdW50X3Byb3BzKSB7CisJCWNvbm4ucHJvcHNfcHRyID0gVk9JRDJVNjQoZHJtTWFsbG9jKGNvbm4uY291bnRfcHJvcHMqc2l6ZW9mKHVpbnQzMl90KSkpOworCQlpZiAoIWNvbm4ucHJvcHNfcHRyKQorCQkJZ290byBlcnJfYWxsb2NzOworCQljb25uLnByb3BfdmFsdWVzX3B0ciA9IFZPSUQyVTY0KGRybU1hbGxvYyhjb25uLmNvdW50X3Byb3BzKnNpemVvZih1aW50NjRfdCkpKTsKKwkJaWYgKCFjb25uLnByb3BfdmFsdWVzX3B0cikKKwkJCWdvdG8gZXJyX2FsbG9jczsKKwl9CisKKwlpZiAoY29ubi5jb3VudF9tb2RlcykgeworCQljb25uLm1vZGVzX3B0ciA9IFZPSUQyVTY0KGRybU1hbGxvYyhjb25uLmNvdW50X21vZGVzKnNpemVvZihzdHJ1Y3QgZHJtX21vZGVfbW9kZWluZm8pKSk7CisJCWlmICghY29ubi5tb2Rlc19wdHIpCisJCQlnb3RvIGVycl9hbGxvY3M7CisJfSBlbHNlIHsKKwkJY29ubi5jb3VudF9tb2RlcyA9IDE7CisJCWNvbm4ubW9kZXNfcHRyID0gVk9JRDJVNjQoJnN0YWNrX21vZGUpOworCX0KKworCWlmIChjb25uLmNvdW50X2VuY29kZXJzKSB7CisJCWNvbm4uZW5jb2RlcnNfcHRyID0gVk9JRDJVNjQoZHJtTWFsbG9jKGNvbm4uY291bnRfZW5jb2RlcnMqc2l6ZW9mKHVpbnQzMl90KSkpOworCQlpZiAoIWNvbm4uZW5jb2RlcnNfcHRyKQorCQkJZ290byBlcnJfYWxsb2NzOworCX0KKworCWlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX01PREVfR0VUQ09OTkVDVE9SLCAmY29ubikpCisJCWdvdG8gZXJyX2FsbG9jczsKKworCS8qIFRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNvbm5lY3RvcnMgYW5kIGV0YyBtYXkgaGF2ZSBjaGFuZ2VkIHdpdGggYQorCSAqIGhvdHBsdWcgZXZlbnQgaW4gYmV0d2VlbiB0aGUgaW9jdGxzLCBpbiB3aGljaCBjYXNlIHRoZSBmaWVsZCBpcworCSAqIHNpbGVudGx5IGlnbm9yZWQgYnkgdGhlIGtlcm5lbC4KKwkgKi8KKwlpZiAoY291bnRzLmNvdW50X3Byb3BzIDwgY29ubi5jb3VudF9wcm9wcyB8fAorCSAgICBjb3VudHMuY291bnRfbW9kZXMgPCBjb25uLmNvdW50X21vZGVzIHx8CisJICAgIGNvdW50cy5jb3VudF9lbmNvZGVycyA8IGNvbm4uY291bnRfZW5jb2RlcnMpIHsKKwkJZHJtRnJlZShVNjQyVk9JRChjb25uLnByb3BzX3B0cikpOworCQlkcm1GcmVlKFU2NDJWT0lEKGNvbm4ucHJvcF92YWx1ZXNfcHRyKSk7CisJCWlmIChVNjQyVk9JRChjb25uLm1vZGVzX3B0cikgIT0gJnN0YWNrX21vZGUpCisJCQlkcm1GcmVlKFU2NDJWT0lEKGNvbm4ubW9kZXNfcHRyKSk7CisJCWRybUZyZWUoVTY0MlZPSUQoY29ubi5lbmNvZGVyc19wdHIpKTsKKworCQlnb3RvIHJldHJ5OworCX0KKworCWlmKCEociA9IGRybU1hbGxvYyhzaXplb2YoKnIpKSkpIHsKKwkJZ290byBlcnJfYWxsb2NzOworCX0KKworCXItPmNvbm5lY3Rvcl9pZCA9IGNvbm4uY29ubmVjdG9yX2lkOworCXItPmVuY29kZXJfaWQgPSBjb25uLmVuY29kZXJfaWQ7CisJci0+Y29ubmVjdGlvbiAgID0gY29ubi5jb25uZWN0aW9uOworCXItPm1tV2lkdGggICAgICA9IGNvbm4ubW1fd2lkdGg7CisJci0+bW1IZWlnaHQgICAgID0gY29ubi5tbV9oZWlnaHQ7CisJLyogY29udmVydCBzdWJwaXhlbCBmcm9tIGtlcm5lbCB0byB1c2Vyc3BhY2UgKi8KKwlyLT5zdWJwaXhlbCAgICAgPSBjb25uLnN1YnBpeGVsICsgMTsKKwlyLT5jb3VudF9tb2RlcyAgPSBjb25uLmNvdW50X21vZGVzOworCXItPmNvdW50X3Byb3BzICA9IGNvbm4uY291bnRfcHJvcHM7CisJci0+cHJvcHMgICAgICAgID0gZHJtQWxsb2NDcHkoVTY0MlZPSUQoY29ubi5wcm9wc19wdHIpLCBjb25uLmNvdW50X3Byb3BzLCBzaXplb2YodWludDMyX3QpKTsKKwlyLT5wcm9wX3ZhbHVlcyAgPSBkcm1BbGxvY0NweShVNjQyVk9JRChjb25uLnByb3BfdmFsdWVzX3B0ciksIGNvbm4uY291bnRfcHJvcHMsIHNpemVvZih1aW50NjRfdCkpOworCXItPm1vZGVzICAgICAgICA9IGRybUFsbG9jQ3B5KFU2NDJWT0lEKGNvbm4ubW9kZXNfcHRyKSwgY29ubi5jb3VudF9tb2Rlcywgc2l6ZW9mKHN0cnVjdCBkcm1fbW9kZV9tb2RlaW5mbykpOworCXItPmNvdW50X2VuY29kZXJzID0gY29ubi5jb3VudF9lbmNvZGVyczsKKwlyLT5lbmNvZGVycyAgICAgPSBkcm1BbGxvY0NweShVNjQyVk9JRChjb25uLmVuY29kZXJzX3B0ciksIGNvbm4uY291bnRfZW5jb2RlcnMsIHNpemVvZih1aW50MzJfdCkpOworCXItPmNvbm5lY3Rvcl90eXBlICA9IGNvbm4uY29ubmVjdG9yX3R5cGU7CisJci0+Y29ubmVjdG9yX3R5cGVfaWQgPSBjb25uLmNvbm5lY3Rvcl90eXBlX2lkOworCisJaWYgKChyLT5jb3VudF9wcm9wcyAmJiAhci0+cHJvcHMpIHx8CisJICAgIChyLT5jb3VudF9wcm9wcyAmJiAhci0+cHJvcF92YWx1ZXMpIHx8CisJICAgIChyLT5jb3VudF9tb2RlcyAmJiAhci0+bW9kZXMpIHx8CisJICAgIChyLT5jb3VudF9lbmNvZGVycyAmJiAhci0+ZW5jb2RlcnMpKSB7CisJCWRybUZyZWUoci0+cHJvcHMpOworCQlkcm1GcmVlKHItPnByb3BfdmFsdWVzKTsKKwkJZHJtRnJlZShyLT5tb2Rlcyk7CisJCWRybUZyZWUoci0+ZW5jb2RlcnMpOworCQlkcm1GcmVlKHIpOworCQlyID0gMDsKKwl9CisKK2Vycl9hbGxvY3M6CisJZHJtRnJlZShVNjQyVk9JRChjb25uLnByb3BfdmFsdWVzX3B0cikpOworCWRybUZyZWUoVTY0MlZPSUQoY29ubi5wcm9wc19wdHIpKTsKKwlpZiAoVTY0MlZPSUQoY29ubi5tb2Rlc19wdHIpICE9ICZzdGFja19tb2RlKQorCQlkcm1GcmVlKFU2NDJWT0lEKGNvbm4ubW9kZXNfcHRyKSk7CisJZHJtRnJlZShVNjQyVk9JRChjb25uLmVuY29kZXJzX3B0cikpOworCisJcmV0dXJuIHI7Cit9CisKK2RybU1vZGVDb25uZWN0b3JQdHIgZHJtTW9kZUdldENvbm5lY3RvcihpbnQgZmQsIHVpbnQzMl90IGNvbm5lY3Rvcl9pZCkKK3sKKwlyZXR1cm4gX2RybU1vZGVHZXRDb25uZWN0b3IoZmQsIGNvbm5lY3Rvcl9pZCwgMSk7Cit9CisKK2RybU1vZGVDb25uZWN0b3JQdHIgZHJtTW9kZUdldENvbm5lY3RvckN1cnJlbnQoaW50IGZkLCB1aW50MzJfdCBjb25uZWN0b3JfaWQpCit7CisJcmV0dXJuIF9kcm1Nb2RlR2V0Q29ubmVjdG9yKGZkLCBjb25uZWN0b3JfaWQsIDApOworfQorCitpbnQgZHJtTW9kZUF0dGFjaE1vZGUoaW50IGZkLCB1aW50MzJfdCBjb25uZWN0b3JfaWQsIGRybU1vZGVNb2RlSW5mb1B0ciBtb2RlX2luZm8pCit7CisJc3RydWN0IGRybV9tb2RlX21vZGVfY21kIHJlczsKKworCW1lbWNsZWFyKHJlcyk7CisJbWVtY3B5KCZyZXMubW9kZSwgbW9kZV9pbmZvLCBzaXplb2Yoc3RydWN0IGRybV9tb2RlX21vZGVpbmZvKSk7CisJcmVzLmNvbm5lY3Rvcl9pZCA9IGNvbm5lY3Rvcl9pZDsKKworCXJldHVybiBEUk1fSU9DVEwoZmQsIERSTV9JT0NUTF9NT0RFX0FUVEFDSE1PREUsICZyZXMpOworfQorCitpbnQgZHJtTW9kZURldGFjaE1vZGUoaW50IGZkLCB1aW50MzJfdCBjb25uZWN0b3JfaWQsIGRybU1vZGVNb2RlSW5mb1B0ciBtb2RlX2luZm8pCit7CisJc3RydWN0IGRybV9tb2RlX21vZGVfY21kIHJlczsKKworCW1lbWNsZWFyKHJlcyk7CisJbWVtY3B5KCZyZXMubW9kZSwgbW9kZV9pbmZvLCBzaXplb2Yoc3RydWN0IGRybV9tb2RlX21vZGVpbmZvKSk7CisJcmVzLmNvbm5lY3Rvcl9pZCA9IGNvbm5lY3Rvcl9pZDsKKworCXJldHVybiBEUk1fSU9DVEwoZmQsIERSTV9JT0NUTF9NT0RFX0RFVEFDSE1PREUsICZyZXMpOworfQorCitkcm1Nb2RlUHJvcGVydHlQdHIgZHJtTW9kZUdldFByb3BlcnR5KGludCBmZCwgdWludDMyX3QgcHJvcGVydHlfaWQpCit7CisJc3RydWN0IGRybV9tb2RlX2dldF9wcm9wZXJ0eSBwcm9wOworCWRybU1vZGVQcm9wZXJ0eVB0ciByOworCisJbWVtY2xlYXIocHJvcCk7CisJcHJvcC5wcm9wX2lkID0gcHJvcGVydHlfaWQ7CisKKwlpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9NT0RFX0dFVFBST1BFUlRZLCAmcHJvcCkpCisJCXJldHVybiAwOworCisJaWYgKHByb3AuY291bnRfdmFsdWVzKQorCQlwcm9wLnZhbHVlc19wdHIgPSBWT0lEMlU2NChkcm1NYWxsb2MocHJvcC5jb3VudF92YWx1ZXMgKiBzaXplb2YodWludDY0X3QpKSk7CisKKwlpZiAocHJvcC5jb3VudF9lbnVtX2Jsb2JzICYmIChwcm9wLmZsYWdzICYgKERSTV9NT0RFX1BST1BfRU5VTSB8IERSTV9NT0RFX1BST1BfQklUTUFTSykpKQorCQlwcm9wLmVudW1fYmxvYl9wdHIgPSBWT0lEMlU2NChkcm1NYWxsb2MocHJvcC5jb3VudF9lbnVtX2Jsb2JzICogc2l6ZW9mKHN0cnVjdCBkcm1fbW9kZV9wcm9wZXJ0eV9lbnVtKSkpOworCisJaWYgKHByb3AuY291bnRfZW51bV9ibG9icyAmJiAocHJvcC5mbGFncyAmIERSTV9NT0RFX1BST1BfQkxPQikpIHsKKwkJcHJvcC52YWx1ZXNfcHRyID0gVk9JRDJVNjQoZHJtTWFsbG9jKHByb3AuY291bnRfZW51bV9ibG9icyAqIHNpemVvZih1aW50MzJfdCkpKTsKKwkJcHJvcC5lbnVtX2Jsb2JfcHRyID0gVk9JRDJVNjQoZHJtTWFsbG9jKHByb3AuY291bnRfZW51bV9ibG9icyAqIHNpemVvZih1aW50MzJfdCkpKTsKKwl9CisKKwlpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9NT0RFX0dFVFBST1BFUlRZLCAmcHJvcCkpIHsKKwkJciA9IE5VTEw7CisJCWdvdG8gZXJyX2FsbG9jczsKKwl9CisKKwlpZiAoIShyID0gZHJtTWFsbG9jKHNpemVvZigqcikpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyLT5wcm9wX2lkID0gcHJvcC5wcm9wX2lkOworCXItPmNvdW50X3ZhbHVlcyA9IHByb3AuY291bnRfdmFsdWVzOworCisJci0+ZmxhZ3MgPSBwcm9wLmZsYWdzOworCWlmIChwcm9wLmNvdW50X3ZhbHVlcykKKwkJci0+dmFsdWVzID0gZHJtQWxsb2NDcHkoVTY0MlZPSUQocHJvcC52YWx1ZXNfcHRyKSwgcHJvcC5jb3VudF92YWx1ZXMsIHNpemVvZih1aW50NjRfdCkpOworCWlmIChwcm9wLmZsYWdzICYgKERSTV9NT0RFX1BST1BfRU5VTSB8IERSTV9NT0RFX1BST1BfQklUTUFTSykpIHsKKwkJci0+Y291bnRfZW51bXMgPSBwcm9wLmNvdW50X2VudW1fYmxvYnM7CisJCXItPmVudW1zID0gZHJtQWxsb2NDcHkoVTY0MlZPSUQocHJvcC5lbnVtX2Jsb2JfcHRyKSwgcHJvcC5jb3VudF9lbnVtX2Jsb2JzLCBzaXplb2Yoc3RydWN0IGRybV9tb2RlX3Byb3BlcnR5X2VudW0pKTsKKwl9IGVsc2UgaWYgKHByb3AuZmxhZ3MgJiBEUk1fTU9ERV9QUk9QX0JMT0IpIHsKKwkJci0+dmFsdWVzID0gZHJtQWxsb2NDcHkoVTY0MlZPSUQocHJvcC52YWx1ZXNfcHRyKSwgcHJvcC5jb3VudF9lbnVtX2Jsb2JzLCBzaXplb2YodWludDMyX3QpKTsKKwkJci0+YmxvYl9pZHMgPSBkcm1BbGxvY0NweShVNjQyVk9JRChwcm9wLmVudW1fYmxvYl9wdHIpLCBwcm9wLmNvdW50X2VudW1fYmxvYnMsIHNpemVvZih1aW50MzJfdCkpOworCQlyLT5jb3VudF9ibG9icyA9IHByb3AuY291bnRfZW51bV9ibG9iczsKKwl9CisJc3RybmNweShyLT5uYW1lLCBwcm9wLm5hbWUsIERSTV9QUk9QX05BTUVfTEVOKTsKKwlyLT5uYW1lW0RSTV9QUk9QX05BTUVfTEVOLTFdID0gMDsKKworZXJyX2FsbG9jczoKKwlkcm1GcmVlKFU2NDJWT0lEKHByb3AudmFsdWVzX3B0cikpOworCWRybUZyZWUoVTY0MlZPSUQocHJvcC5lbnVtX2Jsb2JfcHRyKSk7CisKKwlyZXR1cm4gcjsKK30KKwordm9pZCBkcm1Nb2RlRnJlZVByb3BlcnR5KGRybU1vZGVQcm9wZXJ0eVB0ciBwdHIpCit7CisJaWYgKCFwdHIpCisJCXJldHVybjsKKworCWRybUZyZWUocHRyLT52YWx1ZXMpOworCWRybUZyZWUocHRyLT5lbnVtcyk7CisJZHJtRnJlZShwdHIpOworfQorCitkcm1Nb2RlUHJvcGVydHlCbG9iUHRyIGRybU1vZGVHZXRQcm9wZXJ0eUJsb2IoaW50IGZkLCB1aW50MzJfdCBibG9iX2lkKQoreworCXN0cnVjdCBkcm1fbW9kZV9nZXRfYmxvYiBibG9iOworCWRybU1vZGVQcm9wZXJ0eUJsb2JQdHIgcjsKKworCW1lbWNsZWFyKGJsb2IpOworCWJsb2IuYmxvYl9pZCA9IGJsb2JfaWQ7CisKKwlpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9NT0RFX0dFVFBST1BCTE9CLCAmYmxvYikpCisJCXJldHVybiBOVUxMOworCisJaWYgKGJsb2IubGVuZ3RoKQorCQlibG9iLmRhdGEgPSBWT0lEMlU2NChkcm1NYWxsb2MoYmxvYi5sZW5ndGgpKTsKKworCWlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX01PREVfR0VUUFJPUEJMT0IsICZibG9iKSkgeworCQlyID0gTlVMTDsKKwkJZ290byBlcnJfYWxsb2NzOworCX0KKworCWlmICghKHIgPSBkcm1NYWxsb2Moc2l6ZW9mKCpyKSkpKQorCQlnb3RvIGVycl9hbGxvY3M7CisKKwlyLT5pZCA9IGJsb2IuYmxvYl9pZDsKKwlyLT5sZW5ndGggPSBibG9iLmxlbmd0aDsKKwlyLT5kYXRhID0gZHJtQWxsb2NDcHkoVTY0MlZPSUQoYmxvYi5kYXRhKSwgMSwgYmxvYi5sZW5ndGgpOworCitlcnJfYWxsb2NzOgorCWRybUZyZWUoVTY0MlZPSUQoYmxvYi5kYXRhKSk7CisJcmV0dXJuIHI7Cit9CisKK3ZvaWQgZHJtTW9kZUZyZWVQcm9wZXJ0eUJsb2IoZHJtTW9kZVByb3BlcnR5QmxvYlB0ciBwdHIpCit7CisJaWYgKCFwdHIpCisJCXJldHVybjsKKworCWRybUZyZWUocHRyLT5kYXRhKTsKKwlkcm1GcmVlKHB0cik7Cit9CisKK2ludCBkcm1Nb2RlQ29ubmVjdG9yU2V0UHJvcGVydHkoaW50IGZkLCB1aW50MzJfdCBjb25uZWN0b3JfaWQsIHVpbnQzMl90IHByb3BlcnR5X2lkLAorCQkJICAgICB1aW50NjRfdCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfY29ubmVjdG9yX3NldF9wcm9wZXJ0eSBvc3A7CisKKwltZW1jbGVhcihvc3ApOworCW9zcC5jb25uZWN0b3JfaWQgPSBjb25uZWN0b3JfaWQ7CisJb3NwLnByb3BfaWQgPSBwcm9wZXJ0eV9pZDsKKwlvc3AudmFsdWUgPSB2YWx1ZTsKKworCXJldHVybiBEUk1fSU9DVEwoZmQsIERSTV9JT0NUTF9NT0RFX1NFVFBST1BFUlRZLCAmb3NwKTsKK30KKworLyoKKyAqIGNoZWNrcyBpZiBhIG1vZGVzZXR0aW5nIGNhcGFibGUgZHJpdmVyIGhhcyBhdHRhY2hlZCB0byB0aGUgcGNpIGlkCisgKiByZXR1cm5zIDAgaWYgbW9kZXNldHRpbmcgc3VwcG9ydGVkLgorICogIC1FSU5WQUwgb3IgaW52YWxpZCBidXMgaWQKKyAqICAtRU5PU1lTIGlmIG5vIG1vZGVzZXR0aW5nIHN1cHBvcnQKKyovCitpbnQgZHJtQ2hlY2tNb2Rlc2V0dGluZ1N1cHBvcnRlZChjb25zdCBjaGFyICpidXNpZCkKK3sKKyNpZiBkZWZpbmVkIChfX2xpbnV4X18pCisJY2hhciBwY2lfZGV2X2RpclsxMDI0XTsKKwlpbnQgZG9tYWluLCBidXMsIGRldiwgZnVuYzsKKwlESVIgKnN5c2RpcjsKKwlzdHJ1Y3QgZGlyZW50ICpkZW50OworCWludCBmb3VuZCA9IDAsIHJldDsKKworCXJldCA9IHNzY2FuZihidXNpZCwgInBjaTolMDR4OiUwMng6JTAyeC4lZCIsICZkb21haW4sICZidXMsICZkZXYsICZmdW5jKTsKKwlpZiAocmV0ICE9IDQpCisJCXJldHVybiAtRUlOVkFMOworCisJc3ByaW50ZihwY2lfZGV2X2RpciwgIi9zeXMvYnVzL3BjaS9kZXZpY2VzLyUwNHg6JTAyeDolMDJ4LiVkL2RybSIsCisJCWRvbWFpbiwgYnVzLCBkZXYsIGZ1bmMpOworCisJc3lzZGlyID0gb3BlbmRpcihwY2lfZGV2X2Rpcik7CisJaWYgKHN5c2RpcikgeworCQlkZW50ID0gcmVhZGRpcihzeXNkaXIpOworCQl3aGlsZSAoZGVudCkgeworCQkJaWYgKCFzdHJuY21wKGRlbnQtPmRfbmFtZSwgImNvbnRyb2xEIiwgOCkpIHsKKwkJCQlmb3VuZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRlbnQgPSByZWFkZGlyKHN5c2Rpcik7CisJCX0KKwkJY2xvc2VkaXIoc3lzZGlyKTsKKwkJaWYgKGZvdW5kKQorCQkJcmV0dXJuIDA7CisJfQorCisJc3ByaW50ZihwY2lfZGV2X2RpciwgIi9zeXMvYnVzL3BjaS9kZXZpY2VzLyUwNHg6JTAyeDolMDJ4LiVkLyIsCisJCWRvbWFpbiwgYnVzLCBkZXYsIGZ1bmMpOworCisJc3lzZGlyID0gb3BlbmRpcihwY2lfZGV2X2Rpcik7CisJaWYgKCFzeXNkaXIpCisJCXJldHVybiAtRUlOVkFMOworCisJZGVudCA9IHJlYWRkaXIoc3lzZGlyKTsKKwl3aGlsZSAoZGVudCkgeworCQlpZiAoIXN0cm5jbXAoZGVudC0+ZF9uYW1lLCAiZHJtOmNvbnRyb2xEIiwgMTIpKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCWRlbnQgPSByZWFkZGlyKHN5c2Rpcik7CisJfQorCisJY2xvc2VkaXIoc3lzZGlyKTsKKwlpZiAoZm91bmQpCisJCXJldHVybiAwOworI2VsaWYgZGVmaW5lZCAoX19GcmVlQlNEX18pIHx8IGRlZmluZWQgKF9fRnJlZUJTRF9rZXJuZWxfXykKKwljaGFyIGtidXNpZFsxMDI0XSwgc2J1c2lkWzEwMjRdOworCWNoYXIgb2lkWzEyOF07CisJaW50IGRvbWFpbiwgYnVzLCBkZXYsIGZ1bmM7CisJaW50IGksIG1vZGVzZXR0aW5nLCByZXQ7CisJc2l6ZV90IGxlbjsKKworCXJldCA9IHNzY2FuZihidXNpZCwgInBjaTolMDR4OiUwMng6JTAyeC4lZCIsICZkb21haW4sICZidXMsICZkZXYsCisJICAgICZmdW5jKTsKKwlpZiAocmV0ICE9IDQpCisJCXJldHVybiAtRUlOVkFMOworCXNucHJpbnRmKGtidXNpZCwgc2l6ZW9mKGtidXNpZCksICJwY2k6JTA0eDolMDJ4OiUwMnguJWQiLCBkb21haW4sIGJ1cywKKwkgICAgZGV2LCBmdW5jKTsKKworCS8qIEhvdyBtYW55IEdQVXMgZG8gd2UgZXhwZWN0IGluIHRoZSBtYWNoaW5lID8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlzbnByaW50ZihvaWQsIHNpemVvZihvaWQpLCAiaHcuZHJpLiVkLmJ1c2lkIiwgaSk7CisJCWxlbiA9IHNpemVvZihzYnVzaWQpOworCQlyZXQgPSBzeXNjdGxieW5hbWUob2lkLCBzYnVzaWQsICZsZW4sIE5VTEwsIDApOworCQlpZiAocmV0ID09IC0xKSB7CisJCQlpZiAoZXJybm8gPT0gRU5PRU5UKQorCQkJCWNvbnRpbnVlOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHN0cmNtcChzYnVzaWQsIGtidXNpZCkgIT0gMCkKKwkJCWNvbnRpbnVlOworCQlzbnByaW50ZihvaWQsIHNpemVvZihvaWQpLCAiaHcuZHJpLiVkLm1vZGVzZXR0aW5nIiwgaSk7CisJCWxlbiA9IHNpemVvZihtb2Rlc2V0dGluZyk7CisJCXJldCA9IHN5c2N0bGJ5bmFtZShvaWQsICZtb2Rlc2V0dGluZywgJmxlbiwgTlVMTCwgMCk7CisJCWlmIChyZXQgPT0gLTEgfHwgbGVuICE9IHNpemVvZihtb2Rlc2V0dGluZykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIChtb2Rlc2V0dGluZyA/IDAgOiAtRU5PU1lTKTsKKwl9CisjZWxpZiBkZWZpbmVkKF9fRHJhZ29uRmx5X18pCisJcmV0dXJuIDA7CisjZW5kaWYKKyNpZmRlZiBfX09wZW5CU0RfXworCWludAlmZDsKKwlzdHJ1Y3QgZHJtX21vZGVfY2FyZF9yZXMgcmVzOworCWRybU1vZGVSZXNQdHIgciA9IDA7CisKKwlpZiAoKGZkID0gZHJtT3BlbihOVUxMLCBidXNpZCkpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoJnJlcywgMCwgc2l6ZW9mKHN0cnVjdCBkcm1fbW9kZV9jYXJkX3JlcykpOworCisJaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfTU9ERV9HRVRSRVNPVVJDRVMsICZyZXMpKSB7CisJCWRybUNsb3NlKGZkKTsKKwkJcmV0dXJuIC1lcnJubzsKKwl9CisKKwlkcm1DbG9zZShmZCk7CisJcmV0dXJuIDA7CisjZW5kaWYKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworaW50IGRybU1vZGVDcnRjR2V0R2FtbWEoaW50IGZkLCB1aW50MzJfdCBjcnRjX2lkLCB1aW50MzJfdCBzaXplLAorCQkJdWludDE2X3QgKnJlZCwgdWludDE2X3QgKmdyZWVuLCB1aW50MTZfdCAqYmx1ZSkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfY3J0Y19sdXQgbDsKKworCW1lbWNsZWFyKGwpOworCWwuY3J0Y19pZCA9IGNydGNfaWQ7CisJbC5nYW1tYV9zaXplID0gc2l6ZTsKKwlsLnJlZCA9IFZPSUQyVTY0KHJlZCk7CisJbC5ncmVlbiA9IFZPSUQyVTY0KGdyZWVuKTsKKwlsLmJsdWUgPSBWT0lEMlU2NChibHVlKTsKKworCXJldHVybiBEUk1fSU9DVEwoZmQsIERSTV9JT0NUTF9NT0RFX0dFVEdBTU1BLCAmbCk7Cit9CisKK2ludCBkcm1Nb2RlQ3J0Y1NldEdhbW1hKGludCBmZCwgdWludDMyX3QgY3J0Y19pZCwgdWludDMyX3Qgc2l6ZSwKKwkJCXVpbnQxNl90ICpyZWQsIHVpbnQxNl90ICpncmVlbiwgdWludDE2X3QgKmJsdWUpCit7CisJc3RydWN0IGRybV9tb2RlX2NydGNfbHV0IGw7CisKKwltZW1jbGVhcihsKTsKKwlsLmNydGNfaWQgPSBjcnRjX2lkOworCWwuZ2FtbWFfc2l6ZSA9IHNpemU7CisJbC5yZWQgPSBWT0lEMlU2NChyZWQpOworCWwuZ3JlZW4gPSBWT0lEMlU2NChncmVlbik7CisJbC5ibHVlID0gVk9JRDJVNjQoYmx1ZSk7CisKKwlyZXR1cm4gRFJNX0lPQ1RMKGZkLCBEUk1fSU9DVExfTU9ERV9TRVRHQU1NQSwgJmwpOworfQorCitpbnQgZHJtSGFuZGxlRXZlbnQoaW50IGZkLCBkcm1FdmVudENvbnRleHRQdHIgZXZjdHgpCit7CisJY2hhciBidWZmZXJbMTAyNF07CisJaW50IGxlbiwgaTsKKwlzdHJ1Y3QgZHJtX2V2ZW50ICplOworCXN0cnVjdCBkcm1fZXZlbnRfdmJsYW5rICp2Ymxhbms7CisJdm9pZCAqdXNlcl9kYXRhOworCisJLyogVGhlIERSTSByZWFkIHNlbWFudGljcyBndWFyYW50ZWVzIHRoYXQgd2UgYWx3YXlzIGdldCBvbmx5CisJICogY29tcGxldGUgZXZlbnRzLiAqLworCisJbGVuID0gcmVhZChmZCwgYnVmZmVyLCBzaXplb2YgYnVmZmVyKTsKKwlpZiAobGVuID09IDApCisJCXJldHVybiAwOworCWlmIChsZW4gPCAoaW50KXNpemVvZiAqZSkKKwkJcmV0dXJuIC0xOworCisJaSA9IDA7CisJd2hpbGUgKGkgPCBsZW4pIHsKKwkJZSA9IChzdHJ1Y3QgZHJtX2V2ZW50ICopKGJ1ZmZlciArIGkpOworCQlzd2l0Y2ggKGUtPnR5cGUpIHsKKwkJY2FzZSBEUk1fRVZFTlRfVkJMQU5LOgorCQkJaWYgKGV2Y3R4LT52ZXJzaW9uIDwgMSB8fAorCQkJICAgIGV2Y3R4LT52YmxhbmtfaGFuZGxlciA9PSBOVUxMKQorCQkJCWJyZWFrOworCQkJdmJsYW5rID0gKHN0cnVjdCBkcm1fZXZlbnRfdmJsYW5rICopIGU7CisJCQlldmN0eC0+dmJsYW5rX2hhbmRsZXIoZmQsCisJCQkJCSAgICAgIHZibGFuay0+c2VxdWVuY2UsCisJCQkJCSAgICAgIHZibGFuay0+dHZfc2VjLAorCQkJCQkgICAgICB2YmxhbmstPnR2X3VzZWMsCisJCQkJCSAgICAgIFU2NDJWT0lEICh2YmxhbmstPnVzZXJfZGF0YSkpOworCQkJYnJlYWs7CisJCWNhc2UgRFJNX0VWRU5UX0ZMSVBfQ09NUExFVEU6CisJCQl2YmxhbmsgPSAoc3RydWN0IGRybV9ldmVudF92YmxhbmsgKikgZTsKKwkJCXVzZXJfZGF0YSA9IFU2NDJWT0lEICh2YmxhbmstPnVzZXJfZGF0YSk7CisKKwkJCWlmIChldmN0eC0+dmVyc2lvbiA+PSAzICYmIGV2Y3R4LT5wYWdlX2ZsaXBfaGFuZGxlcjIpCisJCQkJZXZjdHgtPnBhZ2VfZmxpcF9oYW5kbGVyMihmZCwKKwkJCQkJCQkgdmJsYW5rLT5zZXF1ZW5jZSwKKwkJCQkJCQkgdmJsYW5rLT50dl9zZWMsCisJCQkJCQkJIHZibGFuay0+dHZfdXNlYywKKwkJCQkJCQkgdmJsYW5rLT5jcnRjX2lkLAorCQkJCQkJCSB1c2VyX2RhdGEpOworCQkJZWxzZSBpZiAoZXZjdHgtPnZlcnNpb24gPj0gMiAmJiBldmN0eC0+cGFnZV9mbGlwX2hhbmRsZXIpCisJCQkJZXZjdHgtPnBhZ2VfZmxpcF9oYW5kbGVyKGZkLAorCQkJCQkJCSB2YmxhbmstPnNlcXVlbmNlLAorCQkJCQkJCSB2YmxhbmstPnR2X3NlYywKKwkJCQkJCQkgdmJsYW5rLT50dl91c2VjLAorCQkJCQkJCSB1c2VyX2RhdGEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlpICs9IGUtPmxlbmd0aDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRybU1vZGVQYWdlRmxpcChpbnQgZmQsIHVpbnQzMl90IGNydGNfaWQsIHVpbnQzMl90IGZiX2lkLAorCQkgICAgdWludDMyX3QgZmxhZ3MsIHZvaWQgKnVzZXJfZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfY3J0Y19wYWdlX2ZsaXAgZmxpcDsKKworCW1lbWNsZWFyKGZsaXApOworCWZsaXAuZmJfaWQgPSBmYl9pZDsKKwlmbGlwLmNydGNfaWQgPSBjcnRjX2lkOworCWZsaXAudXNlcl9kYXRhID0gVk9JRDJVNjQodXNlcl9kYXRhKTsKKwlmbGlwLmZsYWdzID0gZmxhZ3M7CisKKwlyZXR1cm4gRFJNX0lPQ1RMKGZkLCBEUk1fSU9DVExfTU9ERV9QQUdFX0ZMSVAsICZmbGlwKTsKK30KKworaW50IGRybU1vZGVQYWdlRmxpcFRhcmdldChpbnQgZmQsIHVpbnQzMl90IGNydGNfaWQsIHVpbnQzMl90IGZiX2lkLAorCQkJICB1aW50MzJfdCBmbGFncywgdm9pZCAqdXNlcl9kYXRhLAorCQkJICB1aW50MzJfdCB0YXJnZXRfdmJsYW5rKQoreworCXN0cnVjdCBkcm1fbW9kZV9jcnRjX3BhZ2VfZmxpcF90YXJnZXQgZmxpcF90YXJnZXQ7CisKKwltZW1jbGVhcihmbGlwX3RhcmdldCk7CisJZmxpcF90YXJnZXQuZmJfaWQgPSBmYl9pZDsKKwlmbGlwX3RhcmdldC5jcnRjX2lkID0gY3J0Y19pZDsKKwlmbGlwX3RhcmdldC51c2VyX2RhdGEgPSBWT0lEMlU2NCh1c2VyX2RhdGEpOworCWZsaXBfdGFyZ2V0LmZsYWdzID0gZmxhZ3M7CisJZmxpcF90YXJnZXQuc2VxdWVuY2UgPSB0YXJnZXRfdmJsYW5rOworCisJcmV0dXJuIERSTV9JT0NUTChmZCwgRFJNX0lPQ1RMX01PREVfUEFHRV9GTElQLCAmZmxpcF90YXJnZXQpOworfQorCitpbnQgZHJtTW9kZVNldFBsYW5lKGludCBmZCwgdWludDMyX3QgcGxhbmVfaWQsIHVpbnQzMl90IGNydGNfaWQsCisJCSAgICB1aW50MzJfdCBmYl9pZCwgdWludDMyX3QgZmxhZ3MsCisJCSAgICBpbnQzMl90IGNydGNfeCwgaW50MzJfdCBjcnRjX3ksCisJCSAgICB1aW50MzJfdCBjcnRjX3csIHVpbnQzMl90IGNydGNfaCwKKwkJICAgIHVpbnQzMl90IHNyY194LCB1aW50MzJfdCBzcmNfeSwKKwkJICAgIHVpbnQzMl90IHNyY193LCB1aW50MzJfdCBzcmNfaCkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfc2V0X3BsYW5lIHM7CisKKwltZW1jbGVhcihzKTsKKwlzLnBsYW5lX2lkID0gcGxhbmVfaWQ7CisJcy5jcnRjX2lkID0gY3J0Y19pZDsKKwlzLmZiX2lkID0gZmJfaWQ7CisJcy5mbGFncyA9IGZsYWdzOworCXMuY3J0Y194ID0gY3J0Y194OworCXMuY3J0Y195ID0gY3J0Y195OworCXMuY3J0Y193ID0gY3J0Y193OworCXMuY3J0Y19oID0gY3J0Y19oOworCXMuc3JjX3ggPSBzcmNfeDsKKwlzLnNyY195ID0gc3JjX3k7CisJcy5zcmNfdyA9IHNyY193OworCXMuc3JjX2ggPSBzcmNfaDsKKworCXJldHVybiBEUk1fSU9DVEwoZmQsIERSTV9JT0NUTF9NT0RFX1NFVFBMQU5FLCAmcyk7Cit9CisKK2RybU1vZGVQbGFuZVB0ciBkcm1Nb2RlR2V0UGxhbmUoaW50IGZkLCB1aW50MzJfdCBwbGFuZV9pZCkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfZ2V0X3BsYW5lIG92ciwgY291bnRzOworCWRybU1vZGVQbGFuZVB0ciByID0gMDsKKworcmV0cnk6CisJbWVtY2xlYXIob3ZyKTsKKwlvdnIucGxhbmVfaWQgPSBwbGFuZV9pZDsKKwlpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9NT0RFX0dFVFBMQU5FLCAmb3ZyKSkKKwkJcmV0dXJuIDA7CisKKwljb3VudHMgPSBvdnI7CisKKwlpZiAob3ZyLmNvdW50X2Zvcm1hdF90eXBlcykgeworCQlvdnIuZm9ybWF0X3R5cGVfcHRyID0gVk9JRDJVNjQoZHJtTWFsbG9jKG92ci5jb3VudF9mb3JtYXRfdHlwZXMgKgorCQkJCQkJCSBzaXplb2YodWludDMyX3QpKSk7CisJCWlmICghb3ZyLmZvcm1hdF90eXBlX3B0cikKKwkJCWdvdG8gZXJyX2FsbG9jczsKKwl9CisKKwlpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9NT0RFX0dFVFBMQU5FLCAmb3ZyKSkKKwkJZ290byBlcnJfYWxsb2NzOworCisJaWYgKGNvdW50cy5jb3VudF9mb3JtYXRfdHlwZXMgPCBvdnIuY291bnRfZm9ybWF0X3R5cGVzKSB7CisJCWRybUZyZWUoVTY0MlZPSUQob3ZyLmZvcm1hdF90eXBlX3B0cikpOworCQlnb3RvIHJldHJ5OworCX0KKworCWlmICghKHIgPSBkcm1NYWxsb2Moc2l6ZW9mKCpyKSkpKQorCQlnb3RvIGVycl9hbGxvY3M7CisKKwlyLT5jb3VudF9mb3JtYXRzID0gb3ZyLmNvdW50X2Zvcm1hdF90eXBlczsKKwlyLT5wbGFuZV9pZCA9IG92ci5wbGFuZV9pZDsKKwlyLT5jcnRjX2lkID0gb3ZyLmNydGNfaWQ7CisJci0+ZmJfaWQgPSBvdnIuZmJfaWQ7CisJci0+cG9zc2libGVfY3J0Y3MgPSBvdnIucG9zc2libGVfY3J0Y3M7CisJci0+Z2FtbWFfc2l6ZSA9IG92ci5nYW1tYV9zaXplOworCXItPmZvcm1hdHMgPSBkcm1BbGxvY0NweShVNjQyVk9JRChvdnIuZm9ybWF0X3R5cGVfcHRyKSwKKwkJCQkgb3ZyLmNvdW50X2Zvcm1hdF90eXBlcywgc2l6ZW9mKHVpbnQzMl90KSk7CisJaWYgKG92ci5jb3VudF9mb3JtYXRfdHlwZXMgJiYgIXItPmZvcm1hdHMpIHsKKwkJZHJtRnJlZShyLT5mb3JtYXRzKTsKKwkJZHJtRnJlZShyKTsKKwkJciA9IDA7CisJfQorCitlcnJfYWxsb2NzOgorCWRybUZyZWUoVTY0MlZPSUQob3ZyLmZvcm1hdF90eXBlX3B0cikpOworCisJcmV0dXJuIHI7Cit9CisKK3ZvaWQgZHJtTW9kZUZyZWVQbGFuZShkcm1Nb2RlUGxhbmVQdHIgcHRyKQoreworCWlmICghcHRyKQorCQlyZXR1cm47CisKKwlkcm1GcmVlKHB0ci0+Zm9ybWF0cyk7CisJZHJtRnJlZShwdHIpOworfQorCitkcm1Nb2RlUGxhbmVSZXNQdHIgZHJtTW9kZUdldFBsYW5lUmVzb3VyY2VzKGludCBmZCkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfZ2V0X3BsYW5lX3JlcyByZXMsIGNvdW50czsKKwlkcm1Nb2RlUGxhbmVSZXNQdHIgciA9IDA7CisKK3JldHJ5OgorCW1lbWNsZWFyKHJlcyk7CisJaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfTU9ERV9HRVRQTEFORVJFU09VUkNFUywgJnJlcykpCisJCXJldHVybiAwOworCisJY291bnRzID0gcmVzOworCisJaWYgKHJlcy5jb3VudF9wbGFuZXMpIHsKKwkJcmVzLnBsYW5lX2lkX3B0ciA9IFZPSUQyVTY0KGRybU1hbGxvYyhyZXMuY291bnRfcGxhbmVzICoKKwkJCQkJCQlzaXplb2YodWludDMyX3QpKSk7CisJCWlmICghcmVzLnBsYW5lX2lkX3B0cikKKwkJCWdvdG8gZXJyX2FsbG9jczsKKwl9CisKKwlpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9NT0RFX0dFVFBMQU5FUkVTT1VSQ0VTLCAmcmVzKSkKKwkJZ290byBlcnJfYWxsb2NzOworCisJaWYgKGNvdW50cy5jb3VudF9wbGFuZXMgPCByZXMuY291bnRfcGxhbmVzKSB7CisJCWRybUZyZWUoVTY0MlZPSUQocmVzLnBsYW5lX2lkX3B0cikpOworCQlnb3RvIHJldHJ5OworCX0KKworCWlmICghKHIgPSBkcm1NYWxsb2Moc2l6ZW9mKCpyKSkpKQorCQlnb3RvIGVycl9hbGxvY3M7CisKKwlyLT5jb3VudF9wbGFuZXMgPSByZXMuY291bnRfcGxhbmVzOworCXItPnBsYW5lcyA9IGRybUFsbG9jQ3B5KFU2NDJWT0lEKHJlcy5wbGFuZV9pZF9wdHIpLAorCQkJCSAgcmVzLmNvdW50X3BsYW5lcywgc2l6ZW9mKHVpbnQzMl90KSk7CisJaWYgKHJlcy5jb3VudF9wbGFuZXMgJiYgIXItPnBsYW5lcykgeworCQlkcm1GcmVlKHItPnBsYW5lcyk7CisJCWRybUZyZWUocik7CisJCXIgPSAwOworCX0KKworZXJyX2FsbG9jczoKKwlkcm1GcmVlKFU2NDJWT0lEKHJlcy5wbGFuZV9pZF9wdHIpKTsKKworCXJldHVybiByOworfQorCit2b2lkIGRybU1vZGVGcmVlUGxhbmVSZXNvdXJjZXMoZHJtTW9kZVBsYW5lUmVzUHRyIHB0cikKK3sKKwlpZiAoIXB0cikKKwkJcmV0dXJuOworCisJZHJtRnJlZShwdHItPnBsYW5lcyk7CisJZHJtRnJlZShwdHIpOworfQorCitkcm1Nb2RlT2JqZWN0UHJvcGVydGllc1B0ciBkcm1Nb2RlT2JqZWN0R2V0UHJvcGVydGllcyhpbnQgZmQsCisJCQkJCQkgICAgICB1aW50MzJfdCBvYmplY3RfaWQsCisJCQkJCQkgICAgICB1aW50MzJfdCBvYmplY3RfdHlwZSkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfb2JqX2dldF9wcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisJZHJtTW9kZU9iamVjdFByb3BlcnRpZXNQdHIgcmV0ID0gTlVMTDsKKwl1aW50MzJfdCBjb3VudDsKKworcmV0cnk6CisJbWVtY2xlYXIocHJvcGVydGllcyk7CisJcHJvcGVydGllcy5vYmpfaWQgPSBvYmplY3RfaWQ7CisJcHJvcGVydGllcy5vYmpfdHlwZSA9IG9iamVjdF90eXBlOworCisJaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfTU9ERV9PQkpfR0VUUFJPUEVSVElFUywgJnByb3BlcnRpZXMpKQorCQlyZXR1cm4gMDsKKworCWNvdW50ID0gcHJvcGVydGllcy5jb3VudF9wcm9wczsKKworCWlmIChjb3VudCkgeworCQlwcm9wZXJ0aWVzLnByb3BzX3B0ciA9IFZPSUQyVTY0KGRybU1hbGxvYyhjb3VudCAqCisJCQkJCQkJICBzaXplb2YodWludDMyX3QpKSk7CisJCWlmICghcHJvcGVydGllcy5wcm9wc19wdHIpCisJCQlnb3RvIGVycl9hbGxvY3M7CisJCXByb3BlcnRpZXMucHJvcF92YWx1ZXNfcHRyID0gVk9JRDJVNjQoZHJtTWFsbG9jKGNvdW50ICoKKwkJCQkJCSAgICAgIHNpemVvZih1aW50NjRfdCkpKTsKKwkJaWYgKCFwcm9wZXJ0aWVzLnByb3BfdmFsdWVzX3B0cikKKwkJCWdvdG8gZXJyX2FsbG9jczsKKwl9CisKKwlpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9NT0RFX09CSl9HRVRQUk9QRVJUSUVTLCAmcHJvcGVydGllcykpCisJCWdvdG8gZXJyX2FsbG9jczsKKworCWlmIChjb3VudCA8IHByb3BlcnRpZXMuY291bnRfcHJvcHMpIHsKKwkJZHJtRnJlZShVNjQyVk9JRChwcm9wZXJ0aWVzLnByb3BzX3B0cikpOworCQlkcm1GcmVlKFU2NDJWT0lEKHByb3BlcnRpZXMucHJvcF92YWx1ZXNfcHRyKSk7CisJCWdvdG8gcmV0cnk7CisJfQorCWNvdW50ID0gcHJvcGVydGllcy5jb3VudF9wcm9wczsKKworCXJldCA9IGRybU1hbGxvYyhzaXplb2YoKnJldCkpOworCWlmICghcmV0KQorCQlnb3RvIGVycl9hbGxvY3M7CisKKwlyZXQtPmNvdW50X3Byb3BzID0gY291bnQ7CisJcmV0LT5wcm9wcyA9IGRybUFsbG9jQ3B5KFU2NDJWT0lEKHByb3BlcnRpZXMucHJvcHNfcHRyKSwKKwkJCQkgY291bnQsIHNpemVvZih1aW50MzJfdCkpOworCXJldC0+cHJvcF92YWx1ZXMgPSBkcm1BbGxvY0NweShVNjQyVk9JRChwcm9wZXJ0aWVzLnByb3BfdmFsdWVzX3B0ciksCisJCQkJICAgICAgIGNvdW50LCBzaXplb2YodWludDY0X3QpKTsKKwlpZiAocmV0LT5jb3VudF9wcm9wcyAmJiAoIXJldC0+cHJvcHMgfHwgIXJldC0+cHJvcF92YWx1ZXMpKSB7CisJCWRybUZyZWUocmV0LT5wcm9wcyk7CisJCWRybUZyZWUocmV0LT5wcm9wX3ZhbHVlcyk7CisJCWRybUZyZWUocmV0KTsKKwkJcmV0ID0gTlVMTDsKKwl9CisKK2Vycl9hbGxvY3M6CisJZHJtRnJlZShVNjQyVk9JRChwcm9wZXJ0aWVzLnByb3BzX3B0cikpOworCWRybUZyZWUoVTY0MlZPSUQocHJvcGVydGllcy5wcm9wX3ZhbHVlc19wdHIpKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGRybU1vZGVGcmVlT2JqZWN0UHJvcGVydGllcyhkcm1Nb2RlT2JqZWN0UHJvcGVydGllc1B0ciBwdHIpCit7CisJaWYgKCFwdHIpCisJCXJldHVybjsKKwlkcm1GcmVlKHB0ci0+cHJvcHMpOworCWRybUZyZWUocHRyLT5wcm9wX3ZhbHVlcyk7CisJZHJtRnJlZShwdHIpOworfQorCitpbnQgZHJtTW9kZU9iamVjdFNldFByb3BlcnR5KGludCBmZCwgdWludDMyX3Qgb2JqZWN0X2lkLCB1aW50MzJfdCBvYmplY3RfdHlwZSwKKwkJCSAgICAgdWludDMyX3QgcHJvcGVydHlfaWQsIHVpbnQ2NF90IHZhbHVlKQoreworCXN0cnVjdCBkcm1fbW9kZV9vYmpfc2V0X3Byb3BlcnR5IHByb3A7CisKKwltZW1jbGVhcihwcm9wKTsKKwlwcm9wLnZhbHVlID0gdmFsdWU7CisJcHJvcC5wcm9wX2lkID0gcHJvcGVydHlfaWQ7CisJcHJvcC5vYmpfaWQgPSBvYmplY3RfaWQ7CisJcHJvcC5vYmpfdHlwZSA9IG9iamVjdF90eXBlOworCisJcmV0dXJuIERSTV9JT0NUTChmZCwgRFJNX0lPQ1RMX01PREVfT0JKX1NFVFBST1BFUlRZLCAmcHJvcCk7Cit9CisKK3R5cGVkZWYgc3RydWN0IF9kcm1Nb2RlQXRvbWljUmVxSXRlbSBkcm1Nb2RlQXRvbWljUmVxSXRlbSwgKmRybU1vZGVBdG9taWNSZXFJdGVtUHRyOworCitzdHJ1Y3QgX2RybU1vZGVBdG9taWNSZXFJdGVtIHsKKwl1aW50MzJfdCBvYmplY3RfaWQ7CisJdWludDMyX3QgcHJvcGVydHlfaWQ7CisJdWludDY0X3QgdmFsdWU7Cit9OworCitzdHJ1Y3QgX2RybU1vZGVBdG9taWNSZXEgeworCXVpbnQzMl90IGN1cnNvcjsKKwl1aW50MzJfdCBzaXplX2l0ZW1zOworCWRybU1vZGVBdG9taWNSZXFJdGVtUHRyIGl0ZW1zOworfTsKKworZHJtTW9kZUF0b21pY1JlcVB0ciBkcm1Nb2RlQXRvbWljQWxsb2Modm9pZCkKK3sKKwlkcm1Nb2RlQXRvbWljUmVxUHRyIHJlcTsKKworCXJlcSA9IGRybU1hbGxvYyhzaXplb2YgKnJlcSk7CisJaWYgKCFyZXEpCisJCXJldHVybiBOVUxMOworCisJcmVxLT5pdGVtcyA9IE5VTEw7CisJcmVxLT5jdXJzb3IgPSAwOworCXJlcS0+c2l6ZV9pdGVtcyA9IDA7CisKKwlyZXR1cm4gcmVxOworfQorCitkcm1Nb2RlQXRvbWljUmVxUHRyIGRybU1vZGVBdG9taWNEdXBsaWNhdGUoZHJtTW9kZUF0b21pY1JlcVB0ciBvbGQpCit7CisJZHJtTW9kZUF0b21pY1JlcVB0ciBuZXc7CisKKwlpZiAoIW9sZCkKKwkJcmV0dXJuIE5VTEw7CisKKwluZXcgPSBkcm1NYWxsb2Moc2l6ZW9mICpuZXcpOworCWlmICghbmV3KQorCQlyZXR1cm4gTlVMTDsKKworCW5ldy0+Y3Vyc29yID0gb2xkLT5jdXJzb3I7CisJbmV3LT5zaXplX2l0ZW1zID0gb2xkLT5zaXplX2l0ZW1zOworCisJaWYgKG9sZC0+c2l6ZV9pdGVtcykgeworCQluZXctPml0ZW1zID0gZHJtTWFsbG9jKG9sZC0+c2l6ZV9pdGVtcyAqIHNpemVvZigqbmV3LT5pdGVtcykpOworCQlpZiAoIW5ldy0+aXRlbXMpIHsKKwkJCWZyZWUobmV3KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCW1lbWNweShuZXctPml0ZW1zLCBvbGQtPml0ZW1zLAorCQkgICAgICAgb2xkLT5zaXplX2l0ZW1zICogc2l6ZW9mKCpuZXctPml0ZW1zKSk7CisJfSBlbHNlIHsKKwkJbmV3LT5pdGVtcyA9IE5VTEw7CisJfQorCisJcmV0dXJuIG5ldzsKK30KKworaW50IGRybU1vZGVBdG9taWNNZXJnZShkcm1Nb2RlQXRvbWljUmVxUHRyIGJhc2UsIGRybU1vZGVBdG9taWNSZXFQdHIgYXVnbWVudCkKK3sKKwlpZiAoIWJhc2UpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFhdWdtZW50IHx8IGF1Z21lbnQtPmN1cnNvciA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChiYXNlLT5jdXJzb3IgKyBhdWdtZW50LT5jdXJzb3IgPj0gYmFzZS0+c2l6ZV9pdGVtcykgeworCQlkcm1Nb2RlQXRvbWljUmVxSXRlbVB0ciBuZXc7CisJCWludCBzYXZlZF9zaXplID0gYmFzZS0+c2l6ZV9pdGVtczsKKworCQliYXNlLT5zaXplX2l0ZW1zID0gYmFzZS0+Y3Vyc29yICsgYXVnbWVudC0+Y3Vyc29yOworCQluZXcgPSByZWFsbG9jKGJhc2UtPml0ZW1zLAorCQkJICAgICAgYmFzZS0+c2l6ZV9pdGVtcyAqIHNpemVvZigqYmFzZS0+aXRlbXMpKTsKKwkJaWYgKCFuZXcpIHsKKwkJCWJhc2UtPnNpemVfaXRlbXMgPSBzYXZlZF9zaXplOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJYmFzZS0+aXRlbXMgPSBuZXc7CisJfQorCisJbWVtY3B5KCZiYXNlLT5pdGVtc1tiYXNlLT5jdXJzb3JdLCBhdWdtZW50LT5pdGVtcywKKwkgICAgICAgYXVnbWVudC0+Y3Vyc29yICogc2l6ZW9mKCphdWdtZW50LT5pdGVtcykpOworCWJhc2UtPmN1cnNvciArPSBhdWdtZW50LT5jdXJzb3I7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRybU1vZGVBdG9taWNHZXRDdXJzb3IoZHJtTW9kZUF0b21pY1JlcVB0ciByZXEpCit7CisJaWYgKCFyZXEpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiByZXEtPmN1cnNvcjsKK30KKwordm9pZCBkcm1Nb2RlQXRvbWljU2V0Q3Vyc29yKGRybU1vZGVBdG9taWNSZXFQdHIgcmVxLCBpbnQgY3Vyc29yKQoreworCWlmIChyZXEpCisJCXJlcS0+Y3Vyc29yID0gY3Vyc29yOworfQorCitpbnQgZHJtTW9kZUF0b21pY0FkZFByb3BlcnR5KGRybU1vZGVBdG9taWNSZXFQdHIgcmVxLAorCQkJICAgICB1aW50MzJfdCBvYmplY3RfaWQsCisJCQkgICAgIHVpbnQzMl90IHByb3BlcnR5X2lkLAorCQkJICAgICB1aW50NjRfdCB2YWx1ZSkKK3sKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocmVxLT5jdXJzb3IgPj0gcmVxLT5zaXplX2l0ZW1zKSB7CisJCWRybU1vZGVBdG9taWNSZXFJdGVtUHRyIG5ldzsKKworCQlyZXEtPnNpemVfaXRlbXMgKz0gMTY7CisJCW5ldyA9IHJlYWxsb2MocmVxLT5pdGVtcywgcmVxLT5zaXplX2l0ZW1zICogc2l6ZW9mKCpyZXEtPml0ZW1zKSk7CisJCWlmICghbmV3KSB7CisJCQlyZXEtPnNpemVfaXRlbXMgLT0gMTY7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlyZXEtPml0ZW1zID0gbmV3OworCX0KKworCXJlcS0+aXRlbXNbcmVxLT5jdXJzb3JdLm9iamVjdF9pZCA9IG9iamVjdF9pZDsKKwlyZXEtPml0ZW1zW3JlcS0+Y3Vyc29yXS5wcm9wZXJ0eV9pZCA9IHByb3BlcnR5X2lkOworCXJlcS0+aXRlbXNbcmVxLT5jdXJzb3JdLnZhbHVlID0gdmFsdWU7CisJcmVxLT5jdXJzb3IrKzsKKworCXJldHVybiByZXEtPmN1cnNvcjsKK30KKwordm9pZCBkcm1Nb2RlQXRvbWljRnJlZShkcm1Nb2RlQXRvbWljUmVxUHRyIHJlcSkKK3sKKwlpZiAoIXJlcSkKKwkJcmV0dXJuOworCisJaWYgKHJlcS0+aXRlbXMpCisJCWRybUZyZWUocmVxLT5pdGVtcyk7CisJZHJtRnJlZShyZXEpOworfQorCitzdGF0aWMgaW50IHNvcnRfcmVxX2xpc3QoY29uc3Qgdm9pZCAqbWlzYywgY29uc3Qgdm9pZCAqb3RoZXIpCit7CisJY29uc3QgZHJtTW9kZUF0b21pY1JlcUl0ZW0gKmZpcnN0ID0gbWlzYzsKKwljb25zdCBkcm1Nb2RlQXRvbWljUmVxSXRlbSAqc2Vjb25kID0gb3RoZXI7CisKKwlpZiAoZmlyc3QtPm9iamVjdF9pZCA8IHNlY29uZC0+b2JqZWN0X2lkKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAoZmlyc3QtPm9iamVjdF9pZCA+IHNlY29uZC0+b2JqZWN0X2lkKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiBzZWNvbmQtPnByb3BlcnR5X2lkIC0gZmlyc3QtPnByb3BlcnR5X2lkOworfQorCitpbnQgZHJtTW9kZUF0b21pY0NvbW1pdChpbnQgZmQsIGRybU1vZGVBdG9taWNSZXFQdHIgcmVxLCB1aW50MzJfdCBmbGFncywKKwkJCXZvaWQgKnVzZXJfZGF0YSkKK3sKKwlkcm1Nb2RlQXRvbWljUmVxUHRyIHNvcnRlZDsKKwlzdHJ1Y3QgZHJtX21vZGVfYXRvbWljIGF0b21pYzsKKwl1aW50MzJfdCAqb2Jqc19wdHIgPSBOVUxMOworCXVpbnQzMl90ICpjb3VudF9wcm9wc19wdHIgPSBOVUxMOworCXVpbnQzMl90ICpwcm9wc19wdHIgPSBOVUxMOworCXVpbnQ2NF90ICpwcm9wX3ZhbHVlc19wdHIgPSBOVUxMOworCXVpbnQzMl90IGxhc3Rfb2JqX2lkID0gMDsKKwl1aW50MzJfdCBpOworCWludCBvYmpfaWR4ID0gLTE7CisJaW50IHJldCA9IC0xOworCisJaWYgKCFyZXEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJlcS0+Y3Vyc29yID09IDApCisJCXJldHVybiAwOworCisJc29ydGVkID0gZHJtTW9kZUF0b21pY0R1cGxpY2F0ZShyZXEpOworCWlmIChzb3J0ZWQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1jbGVhcihhdG9taWMpOworCisJLyogU29ydCB0aGUgbGlzdCBieSBvYmplY3QgSUQsIHRoZW4gYnkgcHJvcGVydHkgSUQuICovCisJcXNvcnQoc29ydGVkLT5pdGVtcywgc29ydGVkLT5jdXJzb3IsIHNpemVvZigqc29ydGVkLT5pdGVtcyksCisJICAgICAgc29ydF9yZXFfbGlzdCk7CisKKwkvKiBOb3cgdGhlIGxpc3QgaXMgc29ydGVkLCBlbGltaW5hdGUgZHVwbGljYXRlIHByb3BlcnR5IHNldHMuICovCisJZm9yIChpID0gMDsgaSA8IHNvcnRlZC0+Y3Vyc29yOyBpKyspIHsKKwkJaWYgKHNvcnRlZC0+aXRlbXNbaV0ub2JqZWN0X2lkICE9IGxhc3Rfb2JqX2lkKSB7CisJCQlhdG9taWMuY291bnRfb2JqcysrOworCQkJbGFzdF9vYmpfaWQgPSBzb3J0ZWQtPml0ZW1zW2ldLm9iamVjdF9pZDsKKwkJfQorCisJCWlmIChpID09IHNvcnRlZC0+Y3Vyc29yIC0gMSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzb3J0ZWQtPml0ZW1zW2ldLm9iamVjdF9pZCAhPSBzb3J0ZWQtPml0ZW1zW2kgKyAxXS5vYmplY3RfaWQgfHwKKwkJICAgIHNvcnRlZC0+aXRlbXNbaV0ucHJvcGVydHlfaWQgIT0gc29ydGVkLT5pdGVtc1tpICsgMV0ucHJvcGVydHlfaWQpCisJCQljb250aW51ZTsKKworCQltZW1tb3ZlKCZzb3J0ZWQtPml0ZW1zW2ldLCAmc29ydGVkLT5pdGVtc1tpICsgMV0sCisJCQkoc29ydGVkLT5jdXJzb3IgLSBpIC0gMSkgKiBzaXplb2YoKnNvcnRlZC0+aXRlbXMpKTsKKwkJc29ydGVkLT5jdXJzb3ItLTsKKwl9CisKKwlvYmpzX3B0ciA9IGRybU1hbGxvYyhhdG9taWMuY291bnRfb2JqcyAqIHNpemVvZiBvYmpzX3B0clswXSk7CisJaWYgKCFvYmpzX3B0cikgeworCQllcnJubyA9IEVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJY291bnRfcHJvcHNfcHRyID0gZHJtTWFsbG9jKGF0b21pYy5jb3VudF9vYmpzICogc2l6ZW9mIGNvdW50X3Byb3BzX3B0clswXSk7CisJaWYgKCFjb3VudF9wcm9wc19wdHIpIHsKKwkJZXJybm8gPSBFTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXByb3BzX3B0ciA9IGRybU1hbGxvYyhzb3J0ZWQtPmN1cnNvciAqIHNpemVvZiBwcm9wc19wdHJbMF0pOworCWlmICghcHJvcHNfcHRyKSB7CisJCWVycm5vID0gRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlwcm9wX3ZhbHVlc19wdHIgPSBkcm1NYWxsb2Moc29ydGVkLT5jdXJzb3IgKiBzaXplb2YgcHJvcF92YWx1ZXNfcHRyWzBdKTsKKwlpZiAoIXByb3BfdmFsdWVzX3B0cikgeworCQllcnJubyA9IEVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMCwgbGFzdF9vYmpfaWQgPSAwOyBpIDwgc29ydGVkLT5jdXJzb3I7IGkrKykgeworCQlpZiAoc29ydGVkLT5pdGVtc1tpXS5vYmplY3RfaWQgIT0gbGFzdF9vYmpfaWQpIHsKKwkJCW9ial9pZHgrKzsKKwkJCW9ianNfcHRyW29ial9pZHhdID0gc29ydGVkLT5pdGVtc1tpXS5vYmplY3RfaWQ7CisJCQlsYXN0X29ial9pZCA9IG9ianNfcHRyW29ial9pZHhdOworCQl9CisKKwkJY291bnRfcHJvcHNfcHRyW29ial9pZHhdKys7CisJCXByb3BzX3B0cltpXSA9IHNvcnRlZC0+aXRlbXNbaV0ucHJvcGVydHlfaWQ7CisJCXByb3BfdmFsdWVzX3B0cltpXSA9IHNvcnRlZC0+aXRlbXNbaV0udmFsdWU7CisKKwl9CisKKwlhdG9taWMuZmxhZ3MgPSBmbGFnczsKKwlhdG9taWMub2Jqc19wdHIgPSBWT0lEMlU2NChvYmpzX3B0cik7CisJYXRvbWljLmNvdW50X3Byb3BzX3B0ciA9IFZPSUQyVTY0KGNvdW50X3Byb3BzX3B0cik7CisJYXRvbWljLnByb3BzX3B0ciA9IFZPSUQyVTY0KHByb3BzX3B0cik7CisJYXRvbWljLnByb3BfdmFsdWVzX3B0ciA9IFZPSUQyVTY0KHByb3BfdmFsdWVzX3B0cik7CisJYXRvbWljLnVzZXJfZGF0YSA9IFZPSUQyVTY0KHVzZXJfZGF0YSk7CisKKwlyZXQgPSBEUk1fSU9DVEwoZmQsIERSTV9JT0NUTF9NT0RFX0FUT01JQywgJmF0b21pYyk7CisKK291dDoKKwlkcm1GcmVlKG9ianNfcHRyKTsKKwlkcm1GcmVlKGNvdW50X3Byb3BzX3B0cik7CisJZHJtRnJlZShwcm9wc19wdHIpOworCWRybUZyZWUocHJvcF92YWx1ZXNfcHRyKTsKKwlkcm1Nb2RlQXRvbWljRnJlZShzb3J0ZWQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50Citkcm1Nb2RlQ3JlYXRlUHJvcGVydHlCbG9iKGludCBmZCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCwgdWludDMyX3QgKmlkKQoreworCXN0cnVjdCBkcm1fbW9kZV9jcmVhdGVfYmxvYiBjcmVhdGU7CisJaW50IHJldDsKKworCWlmIChsZW5ndGggPj0gMHhmZmZmZmZmZikKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwltZW1jbGVhcihjcmVhdGUpOworCisJY3JlYXRlLmxlbmd0aCA9IGxlbmd0aDsKKwljcmVhdGUuZGF0YSA9ICh1aW50cHRyX3QpIGRhdGE7CisJY3JlYXRlLmJsb2JfaWQgPSAwOworCSppZCA9IDA7CisKKwlyZXQgPSBEUk1fSU9DVEwoZmQsIERSTV9JT0NUTF9NT0RFX0NSRUFURVBST1BCTE9CLCAmY3JlYXRlKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwkqaWQgPSBjcmVhdGUuYmxvYl9pZDsKKwlyZXR1cm4gMDsKK30KKworaW50Citkcm1Nb2RlRGVzdHJveVByb3BlcnR5QmxvYihpbnQgZmQsIHVpbnQzMl90IGlkKQoreworCXN0cnVjdCBkcm1fbW9kZV9kZXN0cm95X2Jsb2IgZGVzdHJveTsKKworCW1lbWNsZWFyKGRlc3Ryb3kpOworCWRlc3Ryb3kuYmxvYl9pZCA9IGlkOworCXJldHVybiBEUk1fSU9DVEwoZmQsIERSTV9JT0NUTF9NT0RFX0RFU1RST1lQUk9QQkxPQiwgJmRlc3Ryb3kpOworfQorCitpbnQKK2RybU1vZGVDcmVhdGVMZWFzZShpbnQgZmQsIGNvbnN0IHVpbnQzMl90ICpvYmplY3RzLCBpbnQgbnVtX29iamVjdHMsIGludCBmbGFncywgdWludDMyX3QgKmxlc3NlZV9pZCkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfY3JlYXRlX2xlYXNlIGNyZWF0ZTsKKwlpbnQgcmV0OworCisJbWVtY2xlYXIoY3JlYXRlKTsKKwljcmVhdGUub2JqZWN0X2lkcyA9ICh1aW50cHRyX3QpIG9iamVjdHM7CisJY3JlYXRlLm9iamVjdF9jb3VudCA9IG51bV9vYmplY3RzOworCWNyZWF0ZS5mbGFncyA9IGZsYWdzOworCisJcmV0ID0gRFJNX0lPQ1RMKGZkLCBEUk1fSU9DVExfTU9ERV9DUkVBVEVfTEVBU0UsICZjcmVhdGUpOworCWlmIChyZXQgPT0gMCkgeworCQkqbGVzc2VlX2lkID0gY3JlYXRlLmxlc3NlZV9pZDsKKwkJcmV0dXJuIGNyZWF0ZS5mZDsKKwl9CisJcmV0dXJuIC1lcnJubzsKK30KKworZHJtTW9kZUxlc3NlZUxpc3RQdHIKK2RybU1vZGVMaXN0TGVzc2VlcyhpbnQgZmQpCit7CisJc3RydWN0IGRybV9tb2RlX2xpc3RfbGVzc2VlcyBsaXN0OworCXVpbnQzMl90IGNvdW50OworCWRybU1vZGVMZXNzZWVMaXN0UHRyIHJldDsKKworCW1lbWNsZWFyKGxpc3QpOworCisJaWYgKERSTV9JT0NUTChmZCwgRFJNX0lPQ1RMX01PREVfTElTVF9MRVNTRUVTLCAmbGlzdCkpCisJCXJldHVybiBOVUxMOworCisJY291bnQgPSBsaXN0LmNvdW50X2xlc3NlZXM7CisJcmV0ID0gZHJtTWFsbG9jKHNpemVvZiAoZHJtTW9kZUxlc3NlZUxpc3RSZXMpICsgY291bnQgKiBzaXplb2YgKHJldC0+bGVzc2Vlc1swXSkpOworCWlmICghcmV0KQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3QubGVzc2Vlc19wdHIgPSBWT0lEMlU2NCgmcmV0LT5sZXNzZWVzWzBdKTsKKwlpZiAoRFJNX0lPQ1RMKGZkLCBEUk1fSU9DVExfTU9ERV9MSVNUX0xFU1NFRVMsICZsaXN0KSkgeworCQlkcm1GcmVlKHJldCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldC0+Y291bnQgPSBjb3VudDsKKwlyZXR1cm4gcmV0OworfQorCitkcm1Nb2RlT2JqZWN0TGlzdFB0cgorZHJtTW9kZUdldExlYXNlKGludCBmZCkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfZ2V0X2xlYXNlIGdldDsKKwl1aW50MzJfdCBjb3VudDsKKwlkcm1Nb2RlT2JqZWN0TGlzdFB0ciByZXQ7CisKKwltZW1jbGVhcihnZXQpOworCisJaWYgKERSTV9JT0NUTChmZCwgRFJNX0lPQ1RMX01PREVfR0VUX0xFQVNFLCAmZ2V0KSkKKwkJcmV0dXJuIE5VTEw7CisKKwljb3VudCA9IGdldC5jb3VudF9vYmplY3RzOworCXJldCA9IGRybU1hbGxvYyhzaXplb2YgKGRybU1vZGVPYmplY3RMaXN0UmVzKSArIGNvdW50ICogc2l6ZW9mIChyZXQtPm9iamVjdHNbMF0pKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIE5VTEw7CisKKwlnZXQub2JqZWN0c19wdHIgPSBWT0lEMlU2NCgmcmV0LT5vYmplY3RzWzBdKTsKKwlpZiAoRFJNX0lPQ1RMKGZkLCBEUk1fSU9DVExfTU9ERV9HRVRfTEVBU0UsICZnZXQpKSB7CisJCWRybUZyZWUocmV0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0LT5jb3VudCA9IGNvdW50OworCXJldHVybiByZXQ7Cit9CisKK2ludAorZHJtTW9kZVJldm9rZUxlYXNlKGludCBmZCwgdWludDMyX3QgbGVzc2VlX2lkKQoreworCXN0cnVjdCBkcm1fbW9kZV9yZXZva2VfbGVhc2UgcmV2b2tlOworCWludCByZXQ7CisKKwltZW1jbGVhcihyZXZva2UpOworCisJcmV2b2tlLmxlc3NlZV9pZCA9IGxlc3NlZV9pZDsKKworCXJldCA9IERSTV9JT0NUTChmZCwgRFJNX0lPQ1RMX01PREVfUkVWT0tFX0xFQVNFLCAmcmV2b2tlKTsKKwlpZiAocmV0ID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtZXJybm87Cit9CisKZGlmZiAtLWdpdCBhL3hmODZkcm1Nb2RlLmggYi94Zjg2ZHJtTW9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNmRmNDkKLS0tIC9kZXYvbnVsbAorKysgYi94Zjg2ZHJtTW9kZS5oCkBAIC0wLDAgKzEsNTUyIEBACisvKgorICogXGZpbGUgeGY4NmRybU1vZGUuaAorICogSGVhZGVyIGZvciBEUk0gbW9kZXNldHRpbmcgaW50ZXJmYWNlLgorICoKKyAqIFxhdXRob3IgSmFrb2IgQm9ybmVjcmFudHogPHdhbGxicmFrZXJAZ21haWwuY29tPgorICoKKyAqIFxwYXIgQWNrbm93bGVkZ2VtZW50czoKKyAqIEZlYiAyMDA3LCBEYXZlIEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4KKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggRGF2ZSBBaXJsaWUgPGFpcmxpZWRAbGludXguaWU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBKYWtvYiBCb3JuZWNyYW50eiA8d2FsbGJyYWtlckBnbWFpbC5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9YRjg2RFJNTU9ERV9IXworI2RlZmluZSBfWEY4NkRSTU1PREVfSF8KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8ZHJtLmg+CisKKy8qCisgKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIG1vZGVzZXR0aW5nIGZvciBkcm0uCisgKgorICogSW4gb3JkZXIgdG8gdXNlIHRoaXMgaW50ZXJmYWNlIHlvdSBtdXN0IGluY2x1ZGUgZWl0aGVyIDxzdGRpbnQuaD4gb3IgYW5vdGhlcgorICogaGVhZGVyIGRlZmluaW5nIHVpbnQzMl90LCBpbnQzMl90IGFuZCB1aW50MTZfdC4KKyAqCisgKiBJdCBhaW1zIHRvIHByb3ZpZGUgYSByYW5kcjEuMiBjb21wYXRpYmxlIGludGVyZmFjZSBmb3IgbW9kZXNldHRpbmdzIGluIHRoZQorICoga2VybmVsLCB0aGUgaW50ZXJmYWNlIGlzIGFsc28gbWVudCB0byBiZSB1c2VkIGJ5IGxpYnJhcmllcyBsaWtlIEVHTC4KKyAqCisgKiBNb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiByYW5kcnByb3RvLnR4dCB3aGljaCBjYW4gYmUgZm91bmQgaGVyZToKKyAqIGh0dHA6Ly9naXR3ZWIuZnJlZWRlc2t0b3Aub3JnLz9wPXhvcmcvcHJvdG8vcmFuZHJwcm90by5naXQKKyAqCisgKiBUaGVyZSBhcmUgc29tZSBtYWpvciBkaWZmcmVuY2VzIHRvIGJlIG5vdGVkLiBVbmxpa2UgdGhlIHJhbmRyMS4yIHByb3RvIHlvdQorICogbmVlZCB0byBjcmVhdGUgdGhlIG1lbW9yeSBvYmplY3Qgb2YgdGhlIGZyYW1lYnVmZmVyIHlvdXJzZWxmIHdpdGggdGhlIHR0bQorICogYnVmZmVyIG9iamVjdCBpbnRlcmZhY2UuIFRoaXMgb2JqZWN0IG5lZWRzIHRvIGJlIHBpbm5lZC4KKyAqLworCisvKgorICogSWYgd2UgcGlja3VwIGFuIG9sZCB2ZXJzaW9uIG9mIGRybS5oIHdoaWNoIGRvZXNuJ3QgaW5jbHVkZSBkcm1fbW9kZS5oCisgKiB3ZSBzaG91bGQgcmVkZWZpbmUgZGVmaW5lcy4gVGhpcyBpcyBzbyB0aGF0IGJ1aWxkcyBkb2Vzbid0IGJyZWFrcyB3aXRoCisgKiBuZXcgbGliZHJtIG9uIG9sZCBrZXJuZWxzLgorICovCisjaWZuZGVmIF9EUk1fTU9ERV9ICisKKyNkZWZpbmUgRFJNX0RJU1BMQVlfSU5GT19MRU4gICAgMzIKKyNkZWZpbmUgRFJNX0NPTk5FQ1RPUl9OQU1FX0xFTiAgMzIKKyNkZWZpbmUgRFJNX0RJU1BMQVlfTU9ERV9MRU4gICAgMzIKKyNkZWZpbmUgRFJNX1BST1BfTkFNRV9MRU4gICAgICAgMzIKKworI2RlZmluZSBEUk1fTU9ERV9UWVBFX0JVSUxUSU4gICAoMTw8MCkKKyNkZWZpbmUgRFJNX01PREVfVFlQRV9DTE9DS19DICAgKCgxPDwxKSB8IERSTV9NT0RFX1RZUEVfQlVJTFRJTikKKyNkZWZpbmUgRFJNX01PREVfVFlQRV9DUlRDX0MgICAgKCgxPDwyKSB8IERSTV9NT0RFX1RZUEVfQlVJTFRJTikKKyNkZWZpbmUgRFJNX01PREVfVFlQRV9QUkVGRVJSRUQgKDE8PDMpCisjZGVmaW5lIERSTV9NT0RFX1RZUEVfREVGQVVMVCAgICgxPDw0KQorI2RlZmluZSBEUk1fTU9ERV9UWVBFX1VTRVJERUYgICAoMTw8NSkKKyNkZWZpbmUgRFJNX01PREVfVFlQRV9EUklWRVIgICAgKDE8PDYpCisKKy8qIFZpZGVvIG1vZGUgZmxhZ3MgKi8KKy8qIGJpdCBjb21wYXRpYmxlIHdpdGggdGhlIHhvcmcgZGVmaW5pdGlvbnMuICovCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfUEhTWU5DCQkJKDE8PDApCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfTkhTWU5DCQkJKDE8PDEpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfUFZTWU5DCQkJKDE8PDIpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfTlZTWU5DCQkJKDE8PDMpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFCQkJKDE8PDQpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfREJMU0NBTgkJCSgxPDw1KQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX0NTWU5DCQkJKDE8PDYpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfUENTWU5DCQkJKDE8PDcpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfTkNTWU5DCQkJKDE8PDgpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfSFNLRVcJCQkoMTw8OSkgLyogaHNrZXcgcHJvdmlkZWQgKi8KKyNkZWZpbmUgRFJNX01PREVfRkxBR19CQ0FTVAkJCSgxPDwxMCkKKyNkZWZpbmUgRFJNX01PREVfRkxBR19QSVhNVVgJCQkoMTw8MTEpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfREJMQ0xLCQkJKDE8PDEyKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX0NMS0RJVjIJCQkoMTw8MTMpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfM0RfTUFTSwkJCSgweDFmPDwxNCkKKyNkZWZpbmUgIERSTV9NT0RFX0ZMQUdfM0RfTk9ORQkJCSgwPDwxNCkKKyNkZWZpbmUgIERSTV9NT0RFX0ZMQUdfM0RfRlJBTUVfUEFDS0lORwkJKDE8PDE0KQorI2RlZmluZSAgRFJNX01PREVfRkxBR18zRF9GSUVMRF9BTFRFUk5BVElWRQkoMjw8MTQpCisjZGVmaW5lICBEUk1fTU9ERV9GTEFHXzNEX0xJTkVfQUxURVJOQVRJVkUJKDM8PDE0KQorI2RlZmluZSAgRFJNX01PREVfRkxBR18zRF9TSURFX0JZX1NJREVfRlVMTAkoNDw8MTQpCisjZGVmaW5lICBEUk1fTU9ERV9GTEFHXzNEX0xfREVQVEgJCSg1PDwxNCkKKyNkZWZpbmUgIERSTV9NT0RFX0ZMQUdfM0RfTF9ERVBUSF9HRlhfR0ZYX0RFUFRICSg2PDwxNCkKKyNkZWZpbmUgIERSTV9NT0RFX0ZMQUdfM0RfVE9QX0FORF9CT1RUT00JKDc8PDE0KQorI2RlZmluZSAgRFJNX01PREVfRkxBR18zRF9TSURFX0JZX1NJREVfSEFMRgkoODw8MTQpCisKKy8qIERQTVMgZmxhZ3MgKi8KKy8qIGJpdCBjb21wYXRpYmxlIHdpdGggdGhlIHhvcmcgZGVmaW5pdGlvbnMuICovCisjZGVmaW5lIERSTV9NT0RFX0RQTVNfT04gICAgICAgIDAKKyNkZWZpbmUgRFJNX01PREVfRFBNU19TVEFOREJZICAgMQorI2RlZmluZSBEUk1fTU9ERV9EUE1TX1NVU1BFTkQgICAyCisjZGVmaW5lIERSTV9NT0RFX0RQTVNfT0ZGICAgICAgIDMKKworLyogU2NhbGluZyBtb2RlIG9wdGlvbnMgKi8KKyNkZWZpbmUgRFJNX01PREVfU0NBTEVfTk9OX0dQVSAgICAgICAgICAwCisjZGVmaW5lIERSTV9NT0RFX1NDQUxFX0ZVTExTQ1JFRU4gICAgICAgMQorI2RlZmluZSBEUk1fTU9ERV9TQ0FMRV9OT19TQ0FMRSAgICAgICAgIDIKKyNkZWZpbmUgRFJNX01PREVfU0NBTEVfQVNQRUNUICAgICAgICAgICAzCisKKy8qIERpdGhlcmluZyBtb2RlIG9wdGlvbnMgKi8KKyNkZWZpbmUgRFJNX01PREVfRElUSEVSSU5HX09GRiAgMAorI2RlZmluZSBEUk1fTU9ERV9ESVRIRVJJTkdfT04gICAxCisKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9OT05FICAgIDAKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9EQUMgICAgIDEKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9UTURTICAgIDIKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9MVkRTICAgIDMKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9UVkRBQyAgIDQKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9WSVJUVUFMIDUKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9EU0kgICAgIDYKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9EUE1TVCAgIDcKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9EUEkgICAgIDgKKworI2RlZmluZSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfQXV0b21hdGljIDAKKyNkZWZpbmUgRFJNX01PREVfU1VCQ09OTkVDVE9SX1Vua25vd24gICAwCisjZGVmaW5lIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9EVklEICAgICAgMworI2RlZmluZSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfRFZJQSAgICAgIDQKKyNkZWZpbmUgRFJNX01PREVfU1VCQ09OTkVDVE9SX0NvbXBvc2l0ZSA1CisjZGVmaW5lIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9TVklERU8gICAgNgorI2RlZmluZSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfQ29tcG9uZW50IDgKKyNkZWZpbmUgRFJNX01PREVfU1VCQ09OTkVDVE9SX1NDQVJUICAgICA5CisKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX1Vua25vd24gICAgICAwCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9WR0EgICAgICAgICAgMQorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSSAgICAgICAgIDIKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0RWSUQgICAgICAgICAzCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklBICAgICAgICAgNAorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfQ29tcG9zaXRlICAgIDUKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX1NWSURFTyAgICAgICA2CisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTICAgICAgICAgNworI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfQ29tcG9uZW50ICAgIDgKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SXzlQaW5ESU4gICAgICA5CisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9EaXNwbGF5UG9ydCAgMTAKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0hETUlBICAgICAgICAxMQorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUIgICAgICAgIDEyCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9UViAgICAgICAgICAgMTMKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX2VEUCAgICAgICAgICAxNAorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfVklSVFVBTCAgICAgIDE1CisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9EU0kgICAgICAgICAgMTYKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0RQSSAgICAgICAgICAxNworCisjZGVmaW5lIERSTV9NT0RFX1BST1BfUEVORElORyAgICgxPDwwKQorI2RlZmluZSBEUk1fTU9ERV9QUk9QX1JBTkdFICAgICAoMTw8MSkKKyNkZWZpbmUgRFJNX01PREVfUFJPUF9JTU1VVEFCTEUgKDE8PDIpCisjZGVmaW5lIERSTV9NT0RFX1BST1BfRU5VTSAgICAgICgxPDwzKSAvKiBlbnVtZXJhdGVkIHR5cGUgd2l0aCB0ZXh0IHN0cmluZ3MgKi8KKyNkZWZpbmUgRFJNX01PREVfUFJPUF9CTE9CICAgICAgKDE8PDQpCisKKyNkZWZpbmUgRFJNX01PREVfQ1VSU09SX0JPICAgICAgKDE8PDApCisjZGVmaW5lIERSTV9NT0RFX0NVUlNPUl9NT1ZFICAgICgxPDwxKQorCisjZW5kaWYgLyogX0RSTV9NT0RFX0ggKi8KKworCisvKgorICogRmVhdHVyZSBkZWZpbmVzCisgKgorICogSnVzdCBiZWNhdXNlIHRoZXNlIGFyZSBkZWZpbmVkIGRvZXNuJ3QgbWVhbiB0aGF0IHRoZSBrZXJuZWwKKyAqIGNhbiBkbyB0aGF0IGZlYXR1cmUsIGl0cyBqdXN0IGZvciBuZXcgY29kZSB2cyBvbGQgbGliZHJtLgorICovCisjZGVmaW5lIERSTV9NT0RFX0ZFQVRVUkVfS01TCQkxCisjZGVmaW5lIERSTV9NT0RFX0ZFQVRVUkVfRElSVFlGQgkxCisKKwordHlwZWRlZiBzdHJ1Y3QgX2RybU1vZGVSZXMgeworCisJaW50IGNvdW50X2ZiczsKKwl1aW50MzJfdCAqZmJzOworCisJaW50IGNvdW50X2NydGNzOworCXVpbnQzMl90ICpjcnRjczsKKworCWludCBjb3VudF9jb25uZWN0b3JzOworCXVpbnQzMl90ICpjb25uZWN0b3JzOworCisJaW50IGNvdW50X2VuY29kZXJzOworCXVpbnQzMl90ICplbmNvZGVyczsKKworCXVpbnQzMl90IG1pbl93aWR0aCwgbWF4X3dpZHRoOworCXVpbnQzMl90IG1pbl9oZWlnaHQsIG1heF9oZWlnaHQ7Cit9IGRybU1vZGVSZXMsICpkcm1Nb2RlUmVzUHRyOworCit0eXBlZGVmIHN0cnVjdCBfZHJtTW9kZU1vZGVJbmZvIHsKKwl1aW50MzJfdCBjbG9jazsKKwl1aW50MTZfdCBoZGlzcGxheSwgaHN5bmNfc3RhcnQsIGhzeW5jX2VuZCwgaHRvdGFsLCBoc2tldzsKKwl1aW50MTZfdCB2ZGlzcGxheSwgdnN5bmNfc3RhcnQsIHZzeW5jX2VuZCwgdnRvdGFsLCB2c2NhbjsKKworCXVpbnQzMl90IHZyZWZyZXNoOworCisJdWludDMyX3QgZmxhZ3M7CisJdWludDMyX3QgdHlwZTsKKwljaGFyIG5hbWVbRFJNX0RJU1BMQVlfTU9ERV9MRU5dOworfSBkcm1Nb2RlTW9kZUluZm8sICpkcm1Nb2RlTW9kZUluZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1Nb2RlRkIgeworCXVpbnQzMl90IGZiX2lkOworCXVpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisJdWludDMyX3QgcGl0Y2g7CisJdWludDMyX3QgYnBwOworCXVpbnQzMl90IGRlcHRoOworCS8qIGRyaXZlciBzcGVjaWZpYyBoYW5kbGUgKi8KKwl1aW50MzJfdCBoYW5kbGU7Cit9IGRybU1vZGVGQiwgKmRybU1vZGVGQlB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBkcm1Nb2RlQ2xpcCwgKmRybU1vZGVDbGlwUHRyOworCit0eXBlZGVmIHN0cnVjdCBfZHJtTW9kZVByb3BlcnR5QmxvYiB7CisJdWludDMyX3QgaWQ7CisJdWludDMyX3QgbGVuZ3RoOworCXZvaWQgKmRhdGE7Cit9IGRybU1vZGVQcm9wZXJ0eUJsb2JSZXMsICpkcm1Nb2RlUHJvcGVydHlCbG9iUHRyOworCit0eXBlZGVmIHN0cnVjdCBfZHJtTW9kZVByb3BlcnR5IHsKKwl1aW50MzJfdCBwcm9wX2lkOworCXVpbnQzMl90IGZsYWdzOworCWNoYXIgbmFtZVtEUk1fUFJPUF9OQU1FX0xFTl07CisJaW50IGNvdW50X3ZhbHVlczsKKwl1aW50NjRfdCAqdmFsdWVzOyAvKiBzdG9yZSB0aGUgYmxvYiBsZW5ndGhzICovCisJaW50IGNvdW50X2VudW1zOworCXN0cnVjdCBkcm1fbW9kZV9wcm9wZXJ0eV9lbnVtICplbnVtczsKKwlpbnQgY291bnRfYmxvYnM7CisJdWludDMyX3QgKmJsb2JfaWRzOyAvKiBzdG9yZSB0aGUgYmxvYiBJRHMgKi8KK30gZHJtTW9kZVByb3BlcnR5UmVzLCAqZHJtTW9kZVByb3BlcnR5UHRyOworCitzdGF0aWMgX19pbmxpbmUgaW50IGRybV9wcm9wZXJ0eV90eXBlX2lzKGRybU1vZGVQcm9wZXJ0eVB0ciBwcm9wZXJ0eSwKKwkJdWludDMyX3QgdHlwZSkKK3sKKwkvKiBpbnN0YW5jZW9mIGZvciBwcm9wcy4uIGhhbmRsZXMgZXh0ZW5kZWQgdHlwZSB2cyBvcmlnaW5hbCB0eXBlczogKi8KKwlpZiAocHJvcGVydHktPmZsYWdzICYgRFJNX01PREVfUFJPUF9FWFRFTkRFRF9UWVBFKQorCQlyZXR1cm4gKHByb3BlcnR5LT5mbGFncyAmIERSTV9NT0RFX1BST1BfRVhURU5ERURfVFlQRSkgPT0gdHlwZTsKKwlyZXR1cm4gcHJvcGVydHktPmZsYWdzICYgdHlwZTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgX2RybU1vZGVDcnRjIHsKKwl1aW50MzJfdCBjcnRjX2lkOworCXVpbnQzMl90IGJ1ZmZlcl9pZDsgLyoqPCBGQiBpZCB0byBjb25uZWN0IHRvIDAgPSBkaXNjb25uZWN0ICovCisKKwl1aW50MzJfdCB4LCB5OyAvKio8IFBvc2l0aW9uIG9uIHRoZSBmcmFtZWJ1ZmZlciAqLworCXVpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisJaW50IG1vZGVfdmFsaWQ7CisJZHJtTW9kZU1vZGVJbmZvIG1vZGU7CisKKwlpbnQgZ2FtbWFfc2l6ZTsgLyoqPCBOdW1iZXIgb2YgZ2FtbWEgc3RvcHMgKi8KKworfSBkcm1Nb2RlQ3J0YywgKmRybU1vZGVDcnRjUHRyOworCit0eXBlZGVmIHN0cnVjdCBfZHJtTW9kZUVuY29kZXIgeworCXVpbnQzMl90IGVuY29kZXJfaWQ7CisJdWludDMyX3QgZW5jb2Rlcl90eXBlOworCXVpbnQzMl90IGNydGNfaWQ7CisJdWludDMyX3QgcG9zc2libGVfY3J0Y3M7CisJdWludDMyX3QgcG9zc2libGVfY2xvbmVzOworfSBkcm1Nb2RlRW5jb2RlciwgKmRybU1vZGVFbmNvZGVyUHRyOworCit0eXBlZGVmIGVudW0geworCURSTV9NT0RFX0NPTk5FQ1RFRCAgICAgICAgID0gMSwKKwlEUk1fTU9ERV9ESVNDT05ORUNURUQgICAgICA9IDIsCisJRFJNX01PREVfVU5LTk9XTkNPTk5FQ1RJT04gPSAzCit9IGRybU1vZGVDb25uZWN0aW9uOworCit0eXBlZGVmIGVudW0geworCURSTV9NT0RFX1NVQlBJWEVMX1VOS05PV04gICAgICAgID0gMSwKKwlEUk1fTU9ERV9TVUJQSVhFTF9IT1JJWk9OVEFMX1JHQiA9IDIsCisJRFJNX01PREVfU1VCUElYRUxfSE9SSVpPTlRBTF9CR1IgPSAzLAorCURSTV9NT0RFX1NVQlBJWEVMX1ZFUlRJQ0FMX1JHQiAgID0gNCwKKwlEUk1fTU9ERV9TVUJQSVhFTF9WRVJUSUNBTF9CR1IgICA9IDUsCisJRFJNX01PREVfU1VCUElYRUxfTk9ORSAgICAgICAgICAgPSA2Cit9IGRybU1vZGVTdWJQaXhlbDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybU1vZGVDb25uZWN0b3IgeworCXVpbnQzMl90IGNvbm5lY3Rvcl9pZDsKKwl1aW50MzJfdCBlbmNvZGVyX2lkOyAvKio8IEVuY29kZXIgY3VycmVudGx5IGNvbm5lY3RlZCB0byAqLworCXVpbnQzMl90IGNvbm5lY3Rvcl90eXBlOworCXVpbnQzMl90IGNvbm5lY3Rvcl90eXBlX2lkOworCWRybU1vZGVDb25uZWN0aW9uIGNvbm5lY3Rpb247CisJdWludDMyX3QgbW1XaWR0aCwgbW1IZWlnaHQ7IC8qKjwgSHhXIGluIG1pbGxpbWV0ZXJzICovCisJZHJtTW9kZVN1YlBpeGVsIHN1YnBpeGVsOworCisJaW50IGNvdW50X21vZGVzOworCWRybU1vZGVNb2RlSW5mb1B0ciBtb2RlczsKKworCWludCBjb3VudF9wcm9wczsKKwl1aW50MzJfdCAqcHJvcHM7IC8qKjwgTGlzdCBvZiBwcm9wZXJ0eSBpZHMgKi8KKwl1aW50NjRfdCAqcHJvcF92YWx1ZXM7IC8qKjwgTGlzdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgKi8KKworCWludCBjb3VudF9lbmNvZGVyczsKKwl1aW50MzJfdCAqZW5jb2RlcnM7IC8qKjwgTGlzdCBvZiBlbmNvZGVyIGlkcyAqLworfSBkcm1Nb2RlQ29ubmVjdG9yLCAqZHJtTW9kZUNvbm5lY3RvclB0cjsKKworI2RlZmluZSBEUk1fUExBTkVfVFlQRV9PVkVSTEFZIDAKKyNkZWZpbmUgRFJNX1BMQU5FX1RZUEVfUFJJTUFSWSAxCisjZGVmaW5lIERSTV9QTEFORV9UWVBFX0NVUlNPUiAgMgorCit0eXBlZGVmIHN0cnVjdCBfZHJtTW9kZU9iamVjdFByb3BlcnRpZXMgeworCXVpbnQzMl90IGNvdW50X3Byb3BzOworCXVpbnQzMl90ICpwcm9wczsKKwl1aW50NjRfdCAqcHJvcF92YWx1ZXM7Cit9IGRybU1vZGVPYmplY3RQcm9wZXJ0aWVzLCAqZHJtTW9kZU9iamVjdFByb3BlcnRpZXNQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1Nb2RlUGxhbmUgeworCXVpbnQzMl90IGNvdW50X2Zvcm1hdHM7CisJdWludDMyX3QgKmZvcm1hdHM7CisJdWludDMyX3QgcGxhbmVfaWQ7CisKKwl1aW50MzJfdCBjcnRjX2lkOworCXVpbnQzMl90IGZiX2lkOworCisJdWludDMyX3QgY3J0Y194LCBjcnRjX3k7CisJdWludDMyX3QgeCwgeTsKKworCXVpbnQzMl90IHBvc3NpYmxlX2NydGNzOworCXVpbnQzMl90IGdhbW1hX3NpemU7Cit9IGRybU1vZGVQbGFuZSwgKmRybU1vZGVQbGFuZVB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybU1vZGVQbGFuZVJlcyB7CisJdWludDMyX3QgY291bnRfcGxhbmVzOworCXVpbnQzMl90ICpwbGFuZXM7Cit9IGRybU1vZGVQbGFuZVJlcywgKmRybU1vZGVQbGFuZVJlc1B0cjsKKworZXh0ZXJuIHZvaWQgZHJtTW9kZUZyZWVNb2RlSW5mbyggZHJtTW9kZU1vZGVJbmZvUHRyIHB0ciApOworZXh0ZXJuIHZvaWQgZHJtTW9kZUZyZWVSZXNvdXJjZXMoIGRybU1vZGVSZXNQdHIgcHRyICk7CitleHRlcm4gdm9pZCBkcm1Nb2RlRnJlZUZCKCBkcm1Nb2RlRkJQdHIgcHRyICk7CitleHRlcm4gdm9pZCBkcm1Nb2RlRnJlZUNydGMoIGRybU1vZGVDcnRjUHRyIHB0ciApOworZXh0ZXJuIHZvaWQgZHJtTW9kZUZyZWVDb25uZWN0b3IoIGRybU1vZGVDb25uZWN0b3JQdHIgcHRyICk7CitleHRlcm4gdm9pZCBkcm1Nb2RlRnJlZUVuY29kZXIoIGRybU1vZGVFbmNvZGVyUHRyIHB0ciApOworZXh0ZXJuIHZvaWQgZHJtTW9kZUZyZWVQbGFuZSggZHJtTW9kZVBsYW5lUHRyIHB0ciApOworZXh0ZXJuIHZvaWQgZHJtTW9kZUZyZWVQbGFuZVJlc291cmNlcyhkcm1Nb2RlUGxhbmVSZXNQdHIgcHRyKTsKKworLyoqCisgKiBSZXRyaXZlcyBhbGwgb2YgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBjYXJkLgorICovCitleHRlcm4gZHJtTW9kZVJlc1B0ciBkcm1Nb2RlR2V0UmVzb3VyY2VzKGludCBmZCk7CisKKy8qCisgKiBGcmFtZUJ1ZmZlciBtYW5pcHVsYXRpb24uCisgKi8KKworLyoqCisgKiBSZXRyaXZlIGluZm9ybWF0aW9uIGFib3V0IGZyYW1lYnVmZmVyIGJ1ZmZlcklkCisgKi8KK2V4dGVybiBkcm1Nb2RlRkJQdHIgZHJtTW9kZUdldEZCKGludCBmZCwgdWludDMyX3QgYnVmZmVySWQpOworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgZnJhbWVidWZmZXIgd2l0aCBhbiBidWZmZXIgb2JqZWN0IGFzIGl0cyBzY2Fub3V0IGJ1ZmZlci4KKyAqLworZXh0ZXJuIGludCBkcm1Nb2RlQWRkRkIoaW50IGZkLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50OF90IGRlcHRoLAorCQkJdWludDhfdCBicHAsIHVpbnQzMl90IHBpdGNoLCB1aW50MzJfdCBib19oYW5kbGUsCisJCQl1aW50MzJfdCAqYnVmX2lkKTsKKy8qIC4uLndpdGggYSBzcGVjaWZpYyBwaXhlbCBmb3JtYXQgKi8KK2V4dGVybiBpbnQgZHJtTW9kZUFkZEZCMihpbnQgZmQsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisJCQkgdWludDMyX3QgcGl4ZWxfZm9ybWF0LCB1aW50MzJfdCBib19oYW5kbGVzWzRdLAorCQkJIHVpbnQzMl90IHBpdGNoZXNbNF0sIHVpbnQzMl90IG9mZnNldHNbNF0sCisJCQkgdWludDMyX3QgKmJ1Zl9pZCwgdWludDMyX3QgZmxhZ3MpOworCisvKiAuLi53aXRoIGZvcm1hdCBtb2RpZmllcnMgKi8KK2ludCBkcm1Nb2RlQWRkRkIyV2l0aE1vZGlmaWVycyhpbnQgZmQsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisJCQkgICAgICAgdWludDMyX3QgcGl4ZWxfZm9ybWF0LCB1aW50MzJfdCBib19oYW5kbGVzWzRdLAorCQkJICAgICAgIHVpbnQzMl90IHBpdGNoZXNbNF0sIHVpbnQzMl90IG9mZnNldHNbNF0sCisJCQkgICAgICAgdWludDY0X3QgbW9kaWZpZXJbNF0sIHVpbnQzMl90ICpidWZfaWQsIHVpbnQzMl90IGZsYWdzKTsKKworLyoqCisgKiBEZXN0cm9pZXMgdGhlIGdpdmVuIGZyYW1lYnVmZmVyLgorICovCitleHRlcm4gaW50IGRybU1vZGVSbUZCKGludCBmZCwgdWludDMyX3QgYnVmZmVySWQpOworCisvKioKKyAqIE1hcmsgYSByZWdpb24gb2YgYSBmcmFtZWJ1ZmZlciBhcyBkaXJ0eS4KKyAqLworZXh0ZXJuIGludCBkcm1Nb2RlRGlydHlGQihpbnQgZmQsIHVpbnQzMl90IGJ1ZmZlcklkLAorCQkJICBkcm1Nb2RlQ2xpcFB0ciBjbGlwcywgdWludDMyX3QgbnVtX2NsaXBzKTsKKworCisvKgorICogQ3J0YyBmdW5jdGlvbnMKKyAqLworCisvKioKKyAqIFJldHJpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN0cnQgY3J0Y0lkCisgKi8KK2V4dGVybiBkcm1Nb2RlQ3J0Y1B0ciBkcm1Nb2RlR2V0Q3J0YyhpbnQgZmQsIHVpbnQzMl90IGNydGNJZCk7CisKKy8qKgorICogU2V0IHRoZSBtb2RlIG9uIGEgY3J0YyBjcnRjSWQgd2l0aCB0aGUgZ2l2ZW4gbW9kZSBtb2RlSWQuCisgKi8KK2ludCBkcm1Nb2RlU2V0Q3J0YyhpbnQgZmQsIHVpbnQzMl90IGNydGNJZCwgdWludDMyX3QgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgKmNvbm5lY3RvcnMsIGludCBjb3VudCwKKwkJICAgZHJtTW9kZU1vZGVJbmZvUHRyIG1vZGUpOworCisvKgorICogQ3Vyc29yIGZ1bmN0aW9ucworICovCisKKy8qKgorICogU2V0IHRoZSBjdXJzb3Igb24gY3J0YworICovCitpbnQgZHJtTW9kZVNldEN1cnNvcihpbnQgZmQsIHVpbnQzMl90IGNydGNJZCwgdWludDMyX3QgYm9faGFuZGxlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KTsKKworaW50IGRybU1vZGVTZXRDdXJzb3IyKGludCBmZCwgdWludDMyX3QgY3J0Y0lkLCB1aW50MzJfdCBib19oYW5kbGUsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludDMyX3QgaG90X3gsIGludDMyX3QgaG90X3kpOworLyoqCisgKiBNb3ZlIHRoZSBjdXJzb3Igb24gY3J0YworICovCitpbnQgZHJtTW9kZU1vdmVDdXJzb3IoaW50IGZkLCB1aW50MzJfdCBjcnRjSWQsIGludCB4LCBpbnQgeSk7CisKKy8qKgorICogRW5jb2RlciBmdW5jdGlvbnMKKyAqLworZHJtTW9kZUVuY29kZXJQdHIgZHJtTW9kZUdldEVuY29kZXIoaW50IGZkLCB1aW50MzJfdCBlbmNvZGVyX2lkKTsKKworLyoKKyAqIENvbm5lY3RvciBtYW5pcHVsYXRpb24KKyAqLworCisvKioKKyAqIFJldHJpZXZlIGFsbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29ubmVjdG9yIGNvbm5lY3RvcklkLiBUaGlzIHdpbGwgZG8gYQorICogZm9yY2VkIHByb2JlIG9uIHRoZSBjb25uZWN0b3IgdG8gcmV0cmlldmUgcmVtb3RlIGluZm9ybWF0aW9uIHN1Y2ggYXMgRURJRHMKKyAqIGZyb20gdGhlIGRpc3BsYXkgZGV2aWNlLgorICovCitleHRlcm4gZHJtTW9kZUNvbm5lY3RvclB0ciBkcm1Nb2RlR2V0Q29ubmVjdG9yKGludCBmZCwKKwkJCQkJICAgICAgIHVpbnQzMl90IGNvbm5lY3RvcklkKTsKKworLyoqCisgKiBSZXRyaWV2ZSBjdXJyZW50IGluZm9ybWF0aW9uLCBpLmUgdGhlIGN1cnJlbnRseSBhY3RpdmUgbW9kZSBhbmQgZW5jb2RlciwKKyAqIGFib3V0IHRoZSBjb25uZWN0b3IgY29ubmVjdG9ySWQuIFRoaXMgd2lsbCBub3QgZG8gYW55IHByb2Jpbmcgb24gdGhlCisgKiBjb25uZWN0b3Igb3IgcmVtb3RlIGRldmljZSwgYW5kIG9ubHkgcmVwb3J0cyB3aGF0IGlzIGN1cnJlbnRseSBrbm93bi4KKyAqIEZvciB0aGUgY29tcGxldGUgc2V0IG9mIG1vZGVzIGFuZCBlbmNvZGVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbm5lY3RvcgorICogdXNlIGRybU1vZGVHZXRDb25uZWN0b3IoKSB3aGljaCB3aWxsIGRvIGEgcHJvYmUgdG8gZGV0ZXJtaW5lIGFueSBkaXNwbGF5CisgKiBsaW5rIGNoYW5nZXMgZmlyc3QuCisgKi8KK2V4dGVybiBkcm1Nb2RlQ29ubmVjdG9yUHRyIGRybU1vZGVHZXRDb25uZWN0b3JDdXJyZW50KGludCBmZCwKKwkJCQkJCSAgICAgIHVpbnQzMl90IGNvbm5lY3Rvcl9pZCk7CisKKy8qKgorICogQXR0YWNoZXMgdGhlIGdpdmVuIG1vZGUgdG8gYW4gY29ubmVjdG9yLgorICovCitleHRlcm4gaW50IGRybU1vZGVBdHRhY2hNb2RlKGludCBmZCwgdWludDMyX3QgY29ubmVjdG9ySWQsIGRybU1vZGVNb2RlSW5mb1B0ciBtb2RlX2luZm8pOworCisvKioKKyAqIERldGFjaGVzIGEgbW9kZSBmcm9tIHRoZSBjb25uZWN0b3IKKyAqIG11c3QgYmUgdW51c2VkLCBieSB0aGUgZ2l2ZW4gbW9kZS4KKyAqLworZXh0ZXJuIGludCBkcm1Nb2RlRGV0YWNoTW9kZShpbnQgZmQsIHVpbnQzMl90IGNvbm5lY3RvcklkLCBkcm1Nb2RlTW9kZUluZm9QdHIgbW9kZV9pbmZvKTsKKworZXh0ZXJuIGRybU1vZGVQcm9wZXJ0eVB0ciBkcm1Nb2RlR2V0UHJvcGVydHkoaW50IGZkLCB1aW50MzJfdCBwcm9wZXJ0eUlkKTsKK2V4dGVybiB2b2lkIGRybU1vZGVGcmVlUHJvcGVydHkoZHJtTW9kZVByb3BlcnR5UHRyIHB0cik7CisKK2V4dGVybiBkcm1Nb2RlUHJvcGVydHlCbG9iUHRyIGRybU1vZGVHZXRQcm9wZXJ0eUJsb2IoaW50IGZkLCB1aW50MzJfdCBibG9iX2lkKTsKK2V4dGVybiB2b2lkIGRybU1vZGVGcmVlUHJvcGVydHlCbG9iKGRybU1vZGVQcm9wZXJ0eUJsb2JQdHIgcHRyKTsKK2V4dGVybiBpbnQgZHJtTW9kZUNvbm5lY3RvclNldFByb3BlcnR5KGludCBmZCwgdWludDMyX3QgY29ubmVjdG9yX2lkLCB1aW50MzJfdCBwcm9wZXJ0eV9pZCwKKwkJCQkgICAgdWludDY0X3QgdmFsdWUpOworZXh0ZXJuIGludCBkcm1DaGVja01vZGVzZXR0aW5nU3VwcG9ydGVkKGNvbnN0IGNoYXIgKmJ1c2lkKTsKKworZXh0ZXJuIGludCBkcm1Nb2RlQ3J0Y1NldEdhbW1hKGludCBmZCwgdWludDMyX3QgY3J0Y19pZCwgdWludDMyX3Qgc2l6ZSwKKwkJCSAgICAgICB1aW50MTZfdCAqcmVkLCB1aW50MTZfdCAqZ3JlZW4sIHVpbnQxNl90ICpibHVlKTsKK2V4dGVybiBpbnQgZHJtTW9kZUNydGNHZXRHYW1tYShpbnQgZmQsIHVpbnQzMl90IGNydGNfaWQsIHVpbnQzMl90IHNpemUsCisJCQkgICAgICAgdWludDE2X3QgKnJlZCwgdWludDE2X3QgKmdyZWVuLCB1aW50MTZfdCAqYmx1ZSk7CitleHRlcm4gaW50IGRybU1vZGVQYWdlRmxpcChpbnQgZmQsIHVpbnQzMl90IGNydGNfaWQsIHVpbnQzMl90IGZiX2lkLAorCQkJICAgdWludDMyX3QgZmxhZ3MsIHZvaWQgKnVzZXJfZGF0YSk7CitleHRlcm4gaW50IGRybU1vZGVQYWdlRmxpcFRhcmdldChpbnQgZmQsIHVpbnQzMl90IGNydGNfaWQsIHVpbnQzMl90IGZiX2lkLAorCQkJCSB1aW50MzJfdCBmbGFncywgdm9pZCAqdXNlcl9kYXRhLAorCQkJCSB1aW50MzJfdCB0YXJnZXRfdmJsYW5rKTsKKworZXh0ZXJuIGRybU1vZGVQbGFuZVJlc1B0ciBkcm1Nb2RlR2V0UGxhbmVSZXNvdXJjZXMoaW50IGZkKTsKK2V4dGVybiBkcm1Nb2RlUGxhbmVQdHIgZHJtTW9kZUdldFBsYW5lKGludCBmZCwgdWludDMyX3QgcGxhbmVfaWQpOworZXh0ZXJuIGludCBkcm1Nb2RlU2V0UGxhbmUoaW50IGZkLCB1aW50MzJfdCBwbGFuZV9pZCwgdWludDMyX3QgY3J0Y19pZCwKKwkJCSAgIHVpbnQzMl90IGZiX2lkLCB1aW50MzJfdCBmbGFncywKKwkJCSAgIGludDMyX3QgY3J0Y194LCBpbnQzMl90IGNydGNfeSwKKwkJCSAgIHVpbnQzMl90IGNydGNfdywgdWludDMyX3QgY3J0Y19oLAorCQkJICAgdWludDMyX3Qgc3JjX3gsIHVpbnQzMl90IHNyY195LAorCQkJICAgdWludDMyX3Qgc3JjX3csIHVpbnQzMl90IHNyY19oKTsKKworZXh0ZXJuIGRybU1vZGVPYmplY3RQcm9wZXJ0aWVzUHRyIGRybU1vZGVPYmplY3RHZXRQcm9wZXJ0aWVzKGludCBmZCwKKwkJCQkJCQl1aW50MzJfdCBvYmplY3RfaWQsCisJCQkJCQkJdWludDMyX3Qgb2JqZWN0X3R5cGUpOworZXh0ZXJuIHZvaWQgZHJtTW9kZUZyZWVPYmplY3RQcm9wZXJ0aWVzKGRybU1vZGVPYmplY3RQcm9wZXJ0aWVzUHRyIHB0cik7CitleHRlcm4gaW50IGRybU1vZGVPYmplY3RTZXRQcm9wZXJ0eShpbnQgZmQsIHVpbnQzMl90IG9iamVjdF9pZCwKKwkJCQkgICAgdWludDMyX3Qgb2JqZWN0X3R5cGUsIHVpbnQzMl90IHByb3BlcnR5X2lkLAorCQkJCSAgICB1aW50NjRfdCB2YWx1ZSk7CisKKwordHlwZWRlZiBzdHJ1Y3QgX2RybU1vZGVBdG9taWNSZXEgZHJtTW9kZUF0b21pY1JlcSwgKmRybU1vZGVBdG9taWNSZXFQdHI7CisKK2V4dGVybiBkcm1Nb2RlQXRvbWljUmVxUHRyIGRybU1vZGVBdG9taWNBbGxvYyh2b2lkKTsKK2V4dGVybiBkcm1Nb2RlQXRvbWljUmVxUHRyIGRybU1vZGVBdG9taWNEdXBsaWNhdGUoZHJtTW9kZUF0b21pY1JlcVB0ciByZXEpOworZXh0ZXJuIGludCBkcm1Nb2RlQXRvbWljTWVyZ2UoZHJtTW9kZUF0b21pY1JlcVB0ciBiYXNlLAorCQkJICAgICAgZHJtTW9kZUF0b21pY1JlcVB0ciBhdWdtZW50KTsKK2V4dGVybiB2b2lkIGRybU1vZGVBdG9taWNGcmVlKGRybU1vZGVBdG9taWNSZXFQdHIgcmVxKTsKK2V4dGVybiBpbnQgZHJtTW9kZUF0b21pY0dldEN1cnNvcihkcm1Nb2RlQXRvbWljUmVxUHRyIHJlcSk7CitleHRlcm4gdm9pZCBkcm1Nb2RlQXRvbWljU2V0Q3Vyc29yKGRybU1vZGVBdG9taWNSZXFQdHIgcmVxLCBpbnQgY3Vyc29yKTsKK2V4dGVybiBpbnQgZHJtTW9kZUF0b21pY0FkZFByb3BlcnR5KGRybU1vZGVBdG9taWNSZXFQdHIgcmVxLAorCQkJCSAgICB1aW50MzJfdCBvYmplY3RfaWQsCisJCQkJICAgIHVpbnQzMl90IHByb3BlcnR5X2lkLAorCQkJCSAgICB1aW50NjRfdCB2YWx1ZSk7CitleHRlcm4gaW50IGRybU1vZGVBdG9taWNDb21taXQoaW50IGZkLAorCQkJICAgICAgIGRybU1vZGVBdG9taWNSZXFQdHIgcmVxLAorCQkJICAgICAgIHVpbnQzMl90IGZsYWdzLAorCQkJICAgICAgIHZvaWQgKnVzZXJfZGF0YSk7CisKK2V4dGVybiBpbnQgZHJtTW9kZUNyZWF0ZVByb3BlcnR5QmxvYihpbnQgZmQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAorCQkJCSAgICAgdWludDMyX3QgKmlkKTsKK2V4dGVybiBpbnQgZHJtTW9kZURlc3Ryb3lQcm9wZXJ0eUJsb2IoaW50IGZkLCB1aW50MzJfdCBpZCk7CisKKy8qCisgKiBEUk0gbW9kZSBsZWFzZSBBUElzLiBUaGVzZSBjcmVhdGUgYW5kIG1hbmFnZSBuZXcgZHJtX21hc3RlcnMgd2l0aAorICogYWNjZXNzIHRvIGEgc3Vic2V0IG9mIHRoZSBhdmFpbGFibGUgRFJNIHJlc291cmNlcworICovCisKK2V4dGVybiBpbnQgZHJtTW9kZUNyZWF0ZUxlYXNlKGludCBmZCwgY29uc3QgdWludDMyX3QgKm9iamVjdHMsIGludCBudW1fb2JqZWN0cywgaW50IGZsYWdzLCB1aW50MzJfdCAqbGVzc2VlX2lkKTsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtTW9kZUxlc3NlZUxpc3QgeworCXVpbnQzMl90IGNvdW50OworCXVpbnQzMl90IGxlc3NlZXNbMF07Cit9IGRybU1vZGVMZXNzZWVMaXN0UmVzLCAqZHJtTW9kZUxlc3NlZUxpc3RQdHI7CisKK2V4dGVybiBkcm1Nb2RlTGVzc2VlTGlzdFB0ciBkcm1Nb2RlTGlzdExlc3NlZXMoaW50IGZkKTsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtTW9kZU9iamVjdExpc3QgeworCXVpbnQzMl90IGNvdW50OworCXVpbnQzMl90IG9iamVjdHNbMF07Cit9IGRybU1vZGVPYmplY3RMaXN0UmVzLCAqZHJtTW9kZU9iamVjdExpc3RQdHI7CisKK2V4dGVybiBkcm1Nb2RlT2JqZWN0TGlzdFB0ciBkcm1Nb2RlR2V0TGVhc2UoaW50IGZkKTsKKworZXh0ZXJuIGludCBkcm1Nb2RlUmV2b2tlTGVhc2UoaW50IGZkLCB1aW50MzJfdCBsZXNzZWVfaWQpOworCisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94Zjg2ZHJtUmFuZG9tLmMgYi94Zjg2ZHJtUmFuZG9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmMDMwMQotLS0gL2Rldi9udWxsCisrKyBiL3hmODZkcm1SYW5kb20uYwpAQCAtMCwwICsxLDEzNyBAQAorLyogeGY4NmRybVJhbmRvbS5jIC0tICJNaW5pbWFsIFN0YW5kYXJkIiBQUk5HIEltcGxlbWVudGF0aW9uCisgKiBDcmVhdGVkOiBNb24gQXByIDE5IDA4OjI4OjEzIDE5OTkgYnkgZmFpdGhAcHJlY2lzaW9uaW5zaWdodC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICogCisgKiBBdXRob3JzOiBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqCisgKiBERVNDUklQVElPTgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhIHNpbXBsZSwgc3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBQYXJrCisgKiAmIE1pbGxlciAiTWluaW1hbCBTdGFuZGFyZCIgUFJORyBbUE04OCwgUE1TOTNdLCB3aGljaCBpcyBhIExlaG1lcgorICogbXVsdGlwbGljYXRpdmUgbGluZWFyIGNvbmdydWVudGlhbCBnZW5lcmF0b3IgKE1MQ0cpIHdpdGggYSBwZXJpb2Qgb2YKKyAqIDJeMzEtMS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGludGVuZGVkIHRvIHByb3ZpZGUgYSByZWxpYWJsZSwgcG9ydGFibGUgUFJORworICogdGhhdCBpcyBzdWl0YWJsZSBmb3IgdGVzdGluZyBhIGhhc2ggdGFibGUgaW1wbGVtZW50YXRpb24gYW5kIGZvcgorICogaW1wbGVtZW50aW5nIHNraXAgbGlzdHMuCisgKgorICogRlVUVVJFIEVOSEFOQ0VNRU5UUworICoKKyAqIElmIGluaXRpYWwgc2VlZHMgYXJlIG5vdCBzZWxlY3RlZCByYW5kb21seSwgdHdvIGluc3RhbmNlcyBvZiB0aGUgUFJORworICogY2FuIGJlIGNvcnJlbGF0ZWQuICBbS251dGg4MSwgcHAuIDMyLTMzXSBkZXNjcmliZXMgYSBzaHVmZmxpbmcgdGVjaG5pcXVlCisgKiB0aGF0IGNhbiBlbGltaW5hdGUgdGhpcyBwcm9ibGVtLgorICoKKyAqIElmIFBSTkdzIGFyZSB1c2VkIGZvciBzaW11bGF0aW9uLCB0aGUgcGVyaW9kIG9mIHRoZSBjdXJyZW50CisgKiBpbXBsZW1lbnRhdGlvbiBtYXkgYmUgdG9vIHNob3J0LiAgW0xFODhdIGRpc2N1c3NlcyBtZXRob2RzIG9mIGNvbWJpbmluZworICogTUxDR3MgdG8gcHJvZHVjZSBtdWNoIGxvbmdlciBwZXJpb2RzLCBhbmQgc3VnZ2VzdHMgc29tZSBhbHRlcm5hdGl2ZQorICogdmFsdWVzIGZvciBBIGFuZCBNLiAgW0xFOTAgYW5kIFNjaDkyXSBhbHNvIHByb3ZpZGUgaW5mb3JtYXRpb24gb24KKyAqIGxvbmctcGVyaW9kIFBSTkdzLgorICoKKyAqIFJFRkVSRU5DRVMKKyAqCisgKiBbS251dGg4MV0gRG9uYWxkIEUuIEtudXRoLiBUaGUgQXJ0IG9mIENvbXB1dGVyIFByb2dyYW1taW5nLiAgVm9sdW1lIDI6CisgKiBTZW1pbnVtZXJpY2FsIEFsZ29yaXRobXMuICBSZWFkaW5nLCBNYXNzYWNodXNldHRzOiBBZGRpc29uLVdlc2xleSwgMTk4MS4KKyAqCisgKiBbTEU4OF0gUGllcnJlIEwnRWN1eWVyLiAiRWZmaWNpZW50IGFuZCBQb3J0YWJsZSBDb21iaW5lZCBSYW5kb20gTnVtYmVyCisgKiBHZW5lcmF0b3JzIi4gIENBQ00gMzEoNiksIEp1bmUgMTk4OCwgcHAuIDc0Mi03NzQuCisgKgorICogW0xFOTBdIFBpZXJyZSBMJ0VjdXllci4gIlJhbmRvbSBOdW1iZXJzIGZvciBTaW11bGF0aW9uIi4gQ0FDTSAzMygxMCwKKyAqIE9jdG9iZXIgMTk5MCwgcHAuIDg1LTk3LgorICoKKyAqIFtQTTg4XSBTdGVwaGVuIEsuIFBhcmsgYW5kIEtlaXRoIFcuIE1pbGxlci4gIlJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yczoKKyAqIEdvb2QgT25lcyBhcmUgSGFyZCB0byBGaW5kIi4gQ0FDTSAzMSgxMCksIE9jdG9iZXIgMTk4OCwgcHAuIDExOTItMTIwMS4KKyAqCisgKiBbU2NoOTJdIEJydWNlIFNjaG5laWVyLiAiUHNldWRvLVJhbnNvbSBTZXF1ZW5jZSBHZW5lcmF0b3IgZm9yIDMyLUJpdAorICogQ1BVcyIuICBEci4gRG9iYidzIEpvdXJuYWwgMTcoMiksIEZlYnJ1YXJ5IDE5OTIsIHBwLiAzNCwgMzctMzgsIDQwLgorICoKKyAqIFtQTVM5M10gU3RlcGhlbiBLLiBQYXJrLCBLZWl0aCBXLiBNaWxsZXIsIGFuZCBQYXVsIEsuIFN0b2NrbWV5ZXIuICBJbgorICogIlRlY2huaWNhbCBDb3JyZXNwb25kZW5jZTogUmVtYXJrcyBvbiBDaG9vc2luZyBhbmQgSW1wbGVtZW50aW5nIFJhbmRvbQorICogTnVtYmVyIEdlbmVyYXRvcnMiLiBDQUNNIDM2KDcpLCBKdWx5IDE5OTMsIHBwLiAxMDUtMTEwLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgInhmODZkcm0uaCIKKyNpbmNsdWRlICJ4Zjg2ZHJtUmFuZG9tLmgiCisKKyNkZWZpbmUgUkFORE9NX01BR0lDIDB4ZmVlZGJlZWYKKwordm9pZCAqZHJtUmFuZG9tQ3JlYXRlKHVuc2lnbmVkIGxvbmcgc2VlZCkKK3sKKyAgICBSYW5kb21TdGF0ZSAgKnN0YXRlOworCisgICAgc3RhdGUgICAgICAgICAgID0gZHJtTWFsbG9jKHNpemVvZigqc3RhdGUpKTsKKyAgICBpZiAoIXN0YXRlKSByZXR1cm4gTlVMTDsKKyAgICBzdGF0ZS0+bWFnaWMgICAgPSBSQU5ET01fTUFHSUM7CisjaWYgMAorCQkJCS8qIFBhcmsgJiBNaWxsZXIsIE9jdG9iZXIgMTk4OCAqLworICAgIHN0YXRlLT5hICAgICAgICA9IDE2ODA3OworICAgIHN0YXRlLT5tICAgICAgICA9IDIxNDc0ODM2NDc7CisgICAgc3RhdGUtPmNoZWNrICAgID0gMTA0MzYxODA2NTsgLyogQWZ0ZXIgMTAwMDAgaXRlcmF0aW9ucyAqLworI2Vsc2UKKwkJCQkvKiBQYXJrLCBNaWxsZXIsIGFuZCBTdG9ja21leWVyLCBKdWx5IDE5OTMgKi8KKyAgICBzdGF0ZS0+YSAgICAgICAgPSA0ODI3MTsKKyAgICBzdGF0ZS0+bSAgICAgICAgPSAyMTQ3NDgzNjQ3OworICAgIHN0YXRlLT5jaGVjayAgICA9IDM5OTI2ODUzNzsgLyogQWZ0ZXIgMTAwMDAgaXRlcmF0aW9ucyAqLworI2VuZGlmCisgICAgc3RhdGUtPnEgICAgICAgID0gc3RhdGUtPm0gLyBzdGF0ZS0+YTsKKyAgICBzdGF0ZS0+ciAgICAgICAgPSBzdGF0ZS0+bSAlIHN0YXRlLT5hOworCisgICAgc3RhdGUtPnNlZWQgICAgID0gc2VlZDsKKwkJCQkvKiBDaGVjayBmb3IgaWxsZWdhbCBib3VuZGFyeSBjb25kaXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgY2hvb3NlIGNsb3Nlc3QgbGVnYWwgdmFsdWUuICovCisgICAgaWYgKHN0YXRlLT5zZWVkIDw9IDApICAgICAgICBzdGF0ZS0+c2VlZCA9IDE7CisgICAgaWYgKHN0YXRlLT5zZWVkID49IHN0YXRlLT5tKSBzdGF0ZS0+c2VlZCA9IHN0YXRlLT5tIC0gMTsKKworICAgIHJldHVybiBzdGF0ZTsKK30KKworaW50IGRybVJhbmRvbURlc3Ryb3kodm9pZCAqc3RhdGUpCit7CisgICAgZHJtRnJlZShzdGF0ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgZHJtUmFuZG9tKHZvaWQgKnN0YXRlKQoreworICAgIFJhbmRvbVN0YXRlICAgKnMgPSAoUmFuZG9tU3RhdGUgKilzdGF0ZTsKKyAgICB1bnNpZ25lZCBsb25nIGhpOworICAgIHVuc2lnbmVkIGxvbmcgbG87CisKKyAgICBoaSAgICAgID0gcy0+c2VlZCAvIHMtPnE7CisgICAgbG8gICAgICA9IHMtPnNlZWQgJSBzLT5xOworICAgIHMtPnNlZWQgPSBzLT5hICogbG8gLSBzLT5yICogaGk7CisgICAgaWYgKChzLT5hICogbG8pIDw9IChzLT5yICogaGkpKSBzLT5zZWVkICs9IHMtPm07CisKKyAgICByZXR1cm4gcy0+c2VlZDsKK30KKworZG91YmxlIGRybVJhbmRvbURvdWJsZSh2b2lkICpzdGF0ZSkKK3sKKyAgICBSYW5kb21TdGF0ZSAqcyA9IChSYW5kb21TdGF0ZSAqKXN0YXRlOworICAgIAorICAgIHJldHVybiAoZG91YmxlKWRybVJhbmRvbShzdGF0ZSkvKGRvdWJsZSlzLT5tOworfQpkaWZmIC0tZ2l0IGEveGY4NmRybVJhbmRvbS5oIGIveGY4NmRybVJhbmRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYjczMGMKLS0tIC9kZXYvbnVsbAorKysgYi94Zjg2ZHJtUmFuZG9tLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICovCisKK3R5cGVkZWYgc3RydWN0IFJhbmRvbVN0YXRlIHsKKyAgICB1bnNpZ25lZCBsb25nIG1hZ2ljOworICAgIHVuc2lnbmVkIGxvbmcgYTsKKyAgICB1bnNpZ25lZCBsb25nIG07CisgICAgdW5zaWduZWQgbG9uZyBxOwkJLyogbSBkaXYgYSAqLworICAgIHVuc2lnbmVkIGxvbmcgcjsJCS8qIG0gbW9kIGEgKi8KKyAgICB1bnNpZ25lZCBsb25nIGNoZWNrOworICAgIHVuc2lnbmVkIGxvbmcgc2VlZDsKK30gUmFuZG9tU3RhdGU7CmRpZmYgLS1naXQgYS94Zjg2ZHJtU0wuYyBiL3hmODZkcm1TTC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMmZhMWQKLS0tIC9kZXYvbnVsbAorKysgYi94Zjg2ZHJtU0wuYwpAQCAtMCwwICsxLDMxOCBAQAorLyogeGY4NmRybVNMLmMgLS0gU2tpcCBsaXN0IHN1cHBvcnQKKyAqIENyZWF0ZWQ6IE1vbiBNYXkgMTAgMDk6Mjg6MTMgMTk5OSBieSBmYWl0aEBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKiAKKyAqIEF1dGhvcnM6IFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICoKKyAqIERFU0NSSVBUSU9OCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgc3RyYWlnaHRmb3J3YXJkIHNraXAgbGlzdCBpbXBsZW1lbnRhdGlvbi5uCisgKgorICogRlVUVVJFIEVOSEFOQ0VNRU5UUworICoKKyAqIFJFRkVSRU5DRVMKKyAqCisgKiBbUHVnaDkwXSBXaWxsaWFtIFB1Z2guICBTa2lwIExpc3RzOiBBIFByb2JhYmlsaXN0aWMgQWx0ZXJuYXRpdmUgdG8KKyAqIEJhbGFuY2VkIFRyZWVzLiBDQUNNIDMzKDYpLCBKdW5lIDE5OTAsIHBwLiA2NjgtNjc2LgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgInhmODZkcm0uaCIKKworI2RlZmluZSBTTF9MSVNUX01BR0lDICAweGZhY2FkZTAwTFUKKyNkZWZpbmUgU0xfRU5UUllfTUFHSUMgMHgwMGZhYjFlZExVCisjZGVmaW5lIFNMX0ZSRUVEX01BR0lDIDB4ZGVjZWE1ZWRMVQorI2RlZmluZSBTTF9NQVhfTEVWRUwgICAxNgorI2RlZmluZSBTTF9SQU5ET01fU0VFRCAweGMwMTA1NWExTFUKKworI2RlZmluZSBTTF9SQU5ET01fREVDTCAgICAgICAgc3RhdGljIHZvaWQgKnN0YXRlID0gTlVMTAorI2RlZmluZSBTTF9SQU5ET01fSU5JVChzZWVkKSAgaWYgKCFzdGF0ZSkgc3RhdGUgPSBkcm1SYW5kb21DcmVhdGUoc2VlZCkKKyNkZWZpbmUgU0xfUkFORE9NICAgICAgICAgICAgIGRybVJhbmRvbShzdGF0ZSkKKwordHlwZWRlZiBzdHJ1Y3QgU0xFbnRyeSB7CisgICAgdW5zaWduZWQgbG9uZyAgICAgbWFnaWM7CSAgIC8qIFNMX0VOVFJZX01BR0lDICovCisgICAgdW5zaWduZWQgbG9uZyAgICAga2V5OworICAgIHZvaWQgICAgICAgICAgICAgICp2YWx1ZTsKKyAgICBpbnQgICAgICAgICAgICAgICBsZXZlbHM7CisgICAgc3RydWN0IFNMRW50cnkgICAgKmZvcndhcmRbMV07IC8qIHZhcmlhYmxlIHNpemVkIGFycmF5ICovCit9IFNMRW50cnksICpTTEVudHJ5UHRyOworCit0eXBlZGVmIHN0cnVjdCBTa2lwTGlzdCB7CisgICAgdW5zaWduZWQgbG9uZyAgICBtYWdpYzsJLyogU0xfTElTVF9NQUdJQyAqLworICAgIGludCAgICAgICAgICAgICAgbGV2ZWw7CisgICAgaW50ICAgICAgICAgICAgICBjb3VudDsKKyAgICBTTEVudHJ5UHRyICAgICAgIGhlYWQ7CisgICAgU0xFbnRyeVB0ciAgICAgICBwMDsJLyogUG9zaXRpb24gZm9yIGl0ZXJhdGlvbiAqLworfSBTa2lwTGlzdCwgKlNraXBMaXN0UHRyOworCitzdGF0aWMgU0xFbnRyeVB0ciBTTENyZWF0ZUVudHJ5KGludCBtYXhfbGV2ZWwsIHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICp2YWx1ZSkKK3sKKyAgICBTTEVudHJ5UHRyIGVudHJ5OworICAgIAorICAgIGlmIChtYXhfbGV2ZWwgPCAwIHx8IG1heF9sZXZlbCA+IFNMX01BWF9MRVZFTCkgbWF4X2xldmVsID0gU0xfTUFYX0xFVkVMOworCisgICAgZW50cnkgICAgICAgICA9IGRybU1hbGxvYyhzaXplb2YoKmVudHJ5KQorCQkJICAgICArIChtYXhfbGV2ZWwgKyAxKSAqIHNpemVvZihlbnRyeS0+Zm9yd2FyZFswXSkpOworICAgIGlmICghZW50cnkpIHJldHVybiBOVUxMOworICAgIGVudHJ5LT5tYWdpYyAgPSBTTF9FTlRSWV9NQUdJQzsKKyAgICBlbnRyeS0+a2V5ICAgID0ga2V5OworICAgIGVudHJ5LT52YWx1ZSAgPSB2YWx1ZTsKKyAgICBlbnRyeS0+bGV2ZWxzID0gbWF4X2xldmVsICsgMTsKKworICAgIHJldHVybiBlbnRyeTsKK30KKworc3RhdGljIGludCBTTFJhbmRvbUxldmVsKHZvaWQpCit7CisgICAgaW50IGxldmVsID0gMTsKKyAgICBTTF9SQU5ET01fREVDTDsKKworICAgIFNMX1JBTkRPTV9JTklUKFNMX1JBTkRPTV9TRUVEKTsKKyAgICAKKyAgICB3aGlsZSAoKFNMX1JBTkRPTSAmIDB4MDEpICYmIGxldmVsIDwgU0xfTUFYX0xFVkVMKSArK2xldmVsOworICAgIHJldHVybiBsZXZlbDsKK30KKwordm9pZCAqZHJtU0xDcmVhdGUodm9pZCkKK3sKKyAgICBTa2lwTGlzdFB0ciAgbGlzdDsKKyAgICBpbnQgICAgICAgICAgaTsKKworICAgIGxpc3QgICAgICAgICAgID0gZHJtTWFsbG9jKHNpemVvZigqbGlzdCkpOworICAgIGlmICghbGlzdCkgcmV0dXJuIE5VTEw7CisgICAgbGlzdC0+bWFnaWMgICAgPSBTTF9MSVNUX01BR0lDOworICAgIGxpc3QtPmxldmVsICAgID0gMDsKKyAgICBsaXN0LT5oZWFkICAgICA9IFNMQ3JlYXRlRW50cnkoU0xfTUFYX0xFVkVMLCAwLCBOVUxMKTsKKyAgICBsaXN0LT5jb3VudCAgICA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IFNMX01BWF9MRVZFTDsgaSsrKSBsaXN0LT5oZWFkLT5mb3J3YXJkW2ldID0gTlVMTDsKKyAgICAKKyAgICByZXR1cm4gbGlzdDsKK30KKworaW50IGRybVNMRGVzdHJveSh2b2lkICpsKQoreworICAgIFNraXBMaXN0UHRyICAgbGlzdCAgPSAoU2tpcExpc3RQdHIpbDsKKyAgICBTTEVudHJ5UHRyICAgIGVudHJ5OworICAgIFNMRW50cnlQdHIgICAgbmV4dDsKKworICAgIGlmIChsaXN0LT5tYWdpYyAhPSBTTF9MSVNUX01BR0lDKSByZXR1cm4gLTE7IC8qIEJhZCBtYWdpYyAqLworCisgICAgZm9yIChlbnRyeSA9IGxpc3QtPmhlYWQ7IGVudHJ5OyBlbnRyeSA9IG5leHQpIHsKKwlpZiAoZW50cnktPm1hZ2ljICE9IFNMX0VOVFJZX01BR0lDKSByZXR1cm4gLTE7IC8qIEJhZCBtYWdpYyAqLworCW5leHQgICAgICAgICA9IGVudHJ5LT5mb3J3YXJkWzBdOworCWVudHJ5LT5tYWdpYyA9IFNMX0ZSRUVEX01BR0lDOworCWRybUZyZWUoZW50cnkpOworICAgIH0KKworICAgIGxpc3QtPm1hZ2ljID0gU0xfRlJFRURfTUFHSUM7CisgICAgZHJtRnJlZShsaXN0KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIFNMRW50cnlQdHIgU0xMb2NhdGUodm9pZCAqbCwgdW5zaWduZWQgbG9uZyBrZXksIFNMRW50cnlQdHIgKnVwZGF0ZSkKK3sKKyAgICBTa2lwTGlzdFB0ciAgIGxpc3QgID0gKFNraXBMaXN0UHRyKWw7CisgICAgU0xFbnRyeVB0ciAgICBlbnRyeTsKKyAgICBpbnQgICAgICAgICAgIGk7CisKKyAgICBpZiAobGlzdC0+bWFnaWMgIT0gU0xfTElTVF9NQUdJQykgcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKGkgPSBsaXN0LT5sZXZlbCwgZW50cnkgPSBsaXN0LT5oZWFkOyBpID49IDA7IGktLSkgeworCXdoaWxlIChlbnRyeS0+Zm9yd2FyZFtpXSAmJiBlbnRyeS0+Zm9yd2FyZFtpXS0+a2V5IDwga2V5KQorCSAgICBlbnRyeSA9IGVudHJ5LT5mb3J3YXJkW2ldOworCXVwZGF0ZVtpXSA9IGVudHJ5OworICAgIH0KKworICAgIHJldHVybiBlbnRyeS0+Zm9yd2FyZFswXTsKK30KKworaW50IGRybVNMSW5zZXJ0KHZvaWQgKmwsIHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICp2YWx1ZSkKK3sKKyAgICBTa2lwTGlzdFB0ciAgIGxpc3QgID0gKFNraXBMaXN0UHRyKWw7CisgICAgU0xFbnRyeVB0ciAgICBlbnRyeTsKKyAgICBTTEVudHJ5UHRyICAgIHVwZGF0ZVtTTF9NQVhfTEVWRUwgKyAxXTsKKyAgICBpbnQgICAgICAgICAgIGxldmVsOworICAgIGludCAgICAgICAgICAgaTsKKworICAgIGlmIChsaXN0LT5tYWdpYyAhPSBTTF9MSVNUX01BR0lDKSByZXR1cm4gLTE7IC8qIEJhZCBtYWdpYyAqLworCisgICAgZW50cnkgPSBTTExvY2F0ZShsaXN0LCBrZXksIHVwZGF0ZSk7CisKKyAgICBpZiAoZW50cnkgJiYgZW50cnktPmtleSA9PSBrZXkpIHJldHVybiAxOyAvKiBBbHJlYWR5IGluIGxpc3QgKi8KKworCisgICAgbGV2ZWwgPSBTTFJhbmRvbUxldmVsKCk7CisgICAgaWYgKGxldmVsID4gbGlzdC0+bGV2ZWwpIHsKKwlsZXZlbCA9ICsrbGlzdC0+bGV2ZWw7CisJdXBkYXRlW2xldmVsXSA9IGxpc3QtPmhlYWQ7CisgICAgfQorCisgICAgZW50cnkgPSBTTENyZWF0ZUVudHJ5KGxldmVsLCBrZXksIHZhbHVlKTsKKworCQkJCS8qIEZpeCB1cCBmb3J3YXJkIHBvaW50ZXJzICovCisgICAgZm9yIChpID0gMDsgaSA8PSBsZXZlbDsgaSsrKSB7CisJZW50cnktPmZvcndhcmRbaV0gICAgID0gdXBkYXRlW2ldLT5mb3J3YXJkW2ldOworCXVwZGF0ZVtpXS0+Zm9yd2FyZFtpXSA9IGVudHJ5OworICAgIH0KKworICAgICsrbGlzdC0+Y291bnQ7CisgICAgcmV0dXJuIDA7CQkJLyogQWRkZWQgdG8gdGFibGUgKi8KK30KKworaW50IGRybVNMRGVsZXRlKHZvaWQgKmwsIHVuc2lnbmVkIGxvbmcga2V5KQoreworICAgIFNraXBMaXN0UHRyICAgbGlzdCA9IChTa2lwTGlzdFB0cilsOworICAgIFNMRW50cnlQdHIgICAgdXBkYXRlW1NMX01BWF9MRVZFTCArIDFdOworICAgIFNMRW50cnlQdHIgICAgZW50cnk7CisgICAgaW50ICAgICAgICAgICBpOworCisgICAgaWYgKGxpc3QtPm1hZ2ljICE9IFNMX0xJU1RfTUFHSUMpIHJldHVybiAtMTsgLyogQmFkIG1hZ2ljICovCisKKyAgICBlbnRyeSA9IFNMTG9jYXRlKGxpc3QsIGtleSwgdXBkYXRlKTsKKworICAgIGlmICghZW50cnkgfHwgZW50cnktPmtleSAhPSBrZXkpIHJldHVybiAxOyAvKiBOb3QgZm91bmQgKi8KKworCQkJCS8qIEZpeCB1cCBmb3J3YXJkIHBvaW50ZXJzICovCisgICAgZm9yIChpID0gMDsgaSA8PSBsaXN0LT5sZXZlbDsgaSsrKSB7CisJaWYgKHVwZGF0ZVtpXS0+Zm9yd2FyZFtpXSA9PSBlbnRyeSkKKwkgICAgdXBkYXRlW2ldLT5mb3J3YXJkW2ldID0gZW50cnktPmZvcndhcmRbaV07CisgICAgfQorCisgICAgZW50cnktPm1hZ2ljID0gU0xfRlJFRURfTUFHSUM7CisgICAgZHJtRnJlZShlbnRyeSk7CisKKyAgICB3aGlsZSAobGlzdC0+bGV2ZWwgJiYgIWxpc3QtPmhlYWQtPmZvcndhcmRbbGlzdC0+bGV2ZWxdKSAtLWxpc3QtPmxldmVsOworICAgIC0tbGlzdC0+Y291bnQ7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1TTExvb2t1cCh2b2lkICpsLCB1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqKnZhbHVlKQoreworICAgIFNraXBMaXN0UHRyICAgbGlzdCA9IChTa2lwTGlzdFB0cilsOworICAgIFNMRW50cnlQdHIgICAgdXBkYXRlW1NMX01BWF9MRVZFTCArIDFdOworICAgIFNMRW50cnlQdHIgICAgZW50cnk7CisKKyAgICBlbnRyeSA9IFNMTG9jYXRlKGxpc3QsIGtleSwgdXBkYXRlKTsKKworICAgIGlmIChlbnRyeSAmJiBlbnRyeS0+a2V5ID09IGtleSkgeworCSp2YWx1ZSA9IGVudHJ5OworCXJldHVybiAwOworICAgIH0KKyAgICAqdmFsdWUgPSBOVUxMOworICAgIHJldHVybiAtMTsKK30KKworaW50IGRybVNMTG9va3VwTmVpZ2hib3JzKHZvaWQgKmwsIHVuc2lnbmVkIGxvbmcga2V5LAorCQkJIHVuc2lnbmVkIGxvbmcgKnByZXZfa2V5LCB2b2lkICoqcHJldl92YWx1ZSwKKwkJCSB1bnNpZ25lZCBsb25nICpuZXh0X2tleSwgdm9pZCAqKm5leHRfdmFsdWUpCit7CisgICAgU2tpcExpc3RQdHIgICBsaXN0ID0gKFNraXBMaXN0UHRyKWw7CisgICAgU0xFbnRyeVB0ciAgICB1cGRhdGVbU0xfTUFYX0xFVkVMICsgMV0gPSB7MH07CisgICAgaW50ICAgICAgICAgICByZXRjb2RlID0gMDsKKworICAgIFNMTG9jYXRlKGxpc3QsIGtleSwgdXBkYXRlKTsKKworICAgICpwcmV2X2tleSAgID0gKm5leHRfa2V5ICAgPSBrZXk7CisgICAgKnByZXZfdmFsdWUgPSAqbmV4dF92YWx1ZSA9IE5VTEw7CisKKyAgICBpZiAodXBkYXRlWzBdKSB7CisJKnByZXZfa2V5ICAgPSB1cGRhdGVbMF0tPmtleTsKKwkqcHJldl92YWx1ZSA9IHVwZGF0ZVswXS0+dmFsdWU7CisJKytyZXRjb2RlOworCWlmICh1cGRhdGVbMF0tPmZvcndhcmRbMF0pIHsKKwkgICAgKm5leHRfa2V5ICAgPSB1cGRhdGVbMF0tPmZvcndhcmRbMF0tPmtleTsKKwkgICAgKm5leHRfdmFsdWUgPSB1cGRhdGVbMF0tPmZvcndhcmRbMF0tPnZhbHVlOworCSAgICArK3JldGNvZGU7CisJfQorICAgIH0KKyAgICByZXR1cm4gcmV0Y29kZTsKK30KKworaW50IGRybVNMTmV4dCh2b2lkICpsLCB1bnNpZ25lZCBsb25nICprZXksIHZvaWQgKip2YWx1ZSkKK3sKKyAgICBTa2lwTGlzdFB0ciAgIGxpc3QgPSAoU2tpcExpc3RQdHIpbDsKKyAgICBTTEVudHJ5UHRyICAgIGVudHJ5OworICAgIAorICAgIGlmIChsaXN0LT5tYWdpYyAhPSBTTF9MSVNUX01BR0lDKSByZXR1cm4gLTE7IC8qIEJhZCBtYWdpYyAqLworCisgICAgZW50cnkgICAgPSBsaXN0LT5wMDsKKworICAgIGlmIChlbnRyeSkgeworCWxpc3QtPnAwID0gZW50cnktPmZvcndhcmRbMF07CisJKmtleSAgICAgPSBlbnRyeS0+a2V5OworCSp2YWx1ZSAgID0gZW50cnktPnZhbHVlOworCXJldHVybiAxOworICAgIH0KKyAgICBsaXN0LT5wMCA9IE5VTEw7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkcm1TTEZpcnN0KHZvaWQgKmwsIHVuc2lnbmVkIGxvbmcgKmtleSwgdm9pZCAqKnZhbHVlKQoreworICAgIFNraXBMaXN0UHRyICAgbGlzdCA9IChTa2lwTGlzdFB0cilsOworICAgIAorICAgIGlmIChsaXN0LT5tYWdpYyAhPSBTTF9MSVNUX01BR0lDKSByZXR1cm4gLTE7IC8qIEJhZCBtYWdpYyAqLworICAgIAorICAgIGxpc3QtPnAwID0gbGlzdC0+aGVhZC0+Zm9yd2FyZFswXTsKKyAgICByZXR1cm4gZHJtU0xOZXh0KGxpc3QsIGtleSwgdmFsdWUpOworfQorCisvKiBEdW1wIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyBmb3IgZGVidWdnaW5nLiAqLwordm9pZCBkcm1TTER1bXAodm9pZCAqbCkKK3sKKyAgICBTa2lwTGlzdFB0ciAgIGxpc3QgPSAoU2tpcExpc3RQdHIpbDsKKyAgICBTTEVudHJ5UHRyICAgIGVudHJ5OworICAgIGludCAgICAgICAgICAgaTsKKyAgICAKKyAgICBpZiAobGlzdC0+bWFnaWMgIT0gU0xfTElTVF9NQUdJQykgeworCXByaW50ZigiQmFkIG1hZ2ljOiAweCUwOGx4IChleHBlY3RlZCAweCUwOGx4KVxuIiwKKwkgICAgICAgbGlzdC0+bWFnaWMsIFNMX0xJU1RfTUFHSUMpOworCXJldHVybjsKKyAgICB9CisKKyAgICBwcmludGYoIkxldmVsID0gJWQsIGNvdW50ID0gJWRcbiIsIGxpc3QtPmxldmVsLCBsaXN0LT5jb3VudCk7CisgICAgZm9yIChlbnRyeSA9IGxpc3QtPmhlYWQ7IGVudHJ5OyBlbnRyeSA9IGVudHJ5LT5mb3J3YXJkWzBdKSB7CisJaWYgKGVudHJ5LT5tYWdpYyAhPSBTTF9FTlRSWV9NQUdJQykgeworCSAgICBwcmludGYoIkJhZCBtYWdpYzogMHglMDhseCAoZXhwZWN0ZWQgMHglMDhseClcbiIsCisJCSAgIGxpc3QtPm1hZ2ljLCBTTF9FTlRSWV9NQUdJQyk7CisJfQorCXByaW50ZigiXG5FbnRyeSAlcCA8MHglMDhseCwgJXA+IGhhcyAlMmQgbGV2ZWxzXG4iLAorCSAgICAgICBlbnRyeSwgZW50cnktPmtleSwgZW50cnktPnZhbHVlLCBlbnRyeS0+bGV2ZWxzKTsKKwlmb3IgKGkgPSAwOyBpIDwgZW50cnktPmxldmVsczsgaSsrKSB7CisJICAgIGlmIChlbnRyeS0+Zm9yd2FyZFtpXSkgeworCQlwcmludGYoIiAgICUyZDogJXAgPDB4JTA4bHgsICVwPlxuIiwKKwkJICAgICAgIGksCisJCSAgICAgICBlbnRyeS0+Zm9yd2FyZFtpXSwKKwkJICAgICAgIGVudHJ5LT5mb3J3YXJkW2ldLT5rZXksCisJCSAgICAgICBlbnRyeS0+Zm9yd2FyZFtpXS0+dmFsdWUpOworCSAgICB9IGVsc2UgeworCQlwcmludGYoIiAgICUyZDogJXBcbiIsIGksIGVudHJ5LT5mb3J3YXJkW2ldKTsKKwkgICAgfQorCX0KKyAgICB9Cit9Cg==