LyoKICogc25tcGQuYwogKi8KLyoqIEBkZWZncm91cCBhZ2VudCBUaGUgTmV0LVNOTVAgYWdlbnQKICogVGhlIHNubXAgYWdlbnQgcmVzcG9uZHMgdG8gU05NUCBxdWVyaWVzIGZyb20gbWFuYWdlbWVudCBzdGF0aW9ucwogKi8KLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cy4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qCiAqIENvcHlyaWdodCAxOTg4LCAxOTg5IGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CiAqIAogKiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqIAogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCiAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKICogYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAogKiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIENNVSBub3QgYmUKICogdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCiAqIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIAogKiAKICogQ01VIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKICogQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCiAqIENNVSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKICogQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAogKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCiAqIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKICogU09GVFdBUkUuCiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwovKgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtZmVhdHVyZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL3R5cGVzLmg+CgojaWYgSEFWRV9JT19ICiNpbmNsdWRlIDxpby5oPgojZW5kaWYKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaWYgSEFWRV9TVFJJTkdfSAojaW5jbHVkZSA8c3RyaW5nLmg+CiNlbHNlCiNpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgojaWYgSEFWRV9TVERMSUJfSAojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgojaWYgSEFWRV9VTklTVERfSAojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfQVJQQV9JTkVUX0gKI2luY2x1ZGUgPGFycGEvaW5ldC5oPgojZW5kaWYKI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgojaWYgSEFWRV9TWVNfU0VMRUNUX0gKI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19TT0NLRVRfSAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojZW5kaWYKI2lmIEhBVkVfTkVUX0lGX0gKI2luY2x1ZGUgPG5ldC9pZi5oPgojZW5kaWYKI2lmIEhBVkVfSU5FVF9NSUIyX0gKI2luY2x1ZGUgPGluZXQvbWliMi5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX0lPQ1RMX0gKI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX0ZJTEVfSAojaW5jbHVkZSA8c3lzL2ZpbGUuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX0ZDTlRMX0gKI2luY2x1ZGUgPGZjbnRsLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfV0FJVF9ICiNpbmNsdWRlIDxzeXMvd2FpdC5oPgojZW5kaWYKI2luY2x1ZGUgPHNpZ25hbC5oPgojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaWYgSEFWRV9QUk9DRVNTX0ggICAgICAgICAgICAgIC8qIFdpbjMyLWdldHBpZCAqLwojaW5jbHVkZSA8cHJvY2Vzcy5oPgojZW5kaWYKI2lmIEhBVkVfTElNSVRTX0gKI2luY2x1ZGUgPGxpbWl0cy5oPgojZW5kaWYKI2lmIEhBVkVfUFdEX0gKI2luY2x1ZGUgPHB3ZC5oPgojZW5kaWYKI2lmIEhBVkVfR1JQX0gKI2luY2x1ZGUgPGdycC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfQ1JUREJHX0gKI2luY2x1ZGUgPGNydGRiZy5oPgojZW5kaWYKCiNpZm5kZWYgUEFUSF9NQVgKIyBpZmRlZiBfUE9TSVhfUEFUSF9NQVgKIyAgZGVmaW5lIFBBVEhfTUFYIF9QT1NJWF9QQVRIX01BWAojIGVsc2UKIyAgZGVmaW5lIFBBVEhfTUFYIDI1NQojIGVuZGlmCiNlbmRpZgoKI2lmbmRlZiBGRF9TRVQKdHlwZWRlZiBsb25nICAgIGZkX21hc2s7CiNkZWZpbmUgTkZEQklUUyAoc2l6ZW9mKGZkX21hc2spICogTkJCWSkgICAgICAgIC8qIGJpdHMgcGVyIG1hc2sgKi8KI2RlZmluZSBGRF9TRVQobiwgcCkgICAgKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdIHw9ICgxIDw8ICgobikgJSBORkRCSVRTKSkpCiNkZWZpbmUgRkRfQ0xSKG4sIHApICAgICgocCktPmZkc19iaXRzWyhuKS9ORkRCSVRTXSAmPSB+KDEgPDwgKChuKSAlIE5GREJJVFMpKSkKI2RlZmluZSBGRF9JU1NFVChuLCBwKSAgKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdICYgKDEgPDwgKChuKSAlIE5GREJJVFMpKSkKI2RlZmluZSBGRF9aRVJPKHApICAgICAgbWVtc2V0KChwKSwgMCwgc2l6ZW9mKCoocCkpKQojZW5kaWYKCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbmV0LXNubXAtYWdlbnQtaW5jbHVkZXMuaD4KCiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2ZkX2V2ZW50X21hbmFnZXIuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvbGFyZ2VfZmRfc2V0Lmg+CgojaW5jbHVkZSAibTJtLmgiCiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9hZ2VudF9tb2R1bGVfY29uZmlnLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9taWJfbW9kdWxlX2NvbmZpZy5oPgoKI2luY2x1ZGUgInNubXBkLmgiCgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbWliX21vZHVsZXMuaD4KCiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9hZ2VudF90cmFwLmg+CgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvdGFibGUuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L3RhYmxlX2l0ZXJhdG9yLmg+CgovKgogKiBJbmNsdWRlIHdpbnNlcnZpY2UuaCB0byBzdXBwb3J0IFdpbmRvd3MgU2VydmljZQogKi8KI2lmZGVmIFdJTjMyCiNpbmNsdWRlIDx3aW5kb3dzLmg+CiNpbmNsdWRlIDx0Y2hhci5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS93aW5zZXJ2aWNlLmg+CgojZGVmaW5lIFdJTjMyU0VSVklDRQoKI2VuZGlmCgpuZXRzbm1wX2ZlYXR1cmVfd2FudChsb2dnaW5nX2ZpbGUpCm5ldHNubXBfZmVhdHVyZV93YW50KGxvZ2dpbmdfc3RkaW8pCm5ldHNubXBfZmVhdHVyZV93YW50KGxvZ2dpbmdfc3lzbG9nKQoKLyoKICogR2xvYmFscy4KICovCiNpZmRlZiBORVRTTk1QX1VTRV9MSUJXUkFQCiNpbmNsdWRlIDx0Y3BkLmg+CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9VU0VfTElCV1JBUCAqLwoKI2RlZmluZSBUSU1FVElDSyAgICAgICAgIDUwMDAwMEwKCmludCAgICAgICAgICAgICBzbm1wX2R1bXBfcGFja2V0OwpzdGF0aWMgaW50ICAgICAgcmVjb25maWcgPSAwOwppbnQgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfREFFTU9OOwoKI2lmZGVmIFdJTjMyU0VSVklDRQovKgogKiBTTk1QIEFnZW50IFN0YXR1cyAKICovCiNkZWZpbmUgQUdFTlRfUlVOTklORyAxCiNkZWZpbmUgQUdFTlRfU1RPUFBFRCAwCmludCAgICAgICAgICAgICBhZ2VudF9zdGF0dXMgPSBBR0VOVF9TVE9QUEVEOwovKiBhcHBfbmFtZV9sb25nIHVzZWQgZm9yIEV2ZW50IExvZyAoc3lzbG9nKSwgU0NNLCByZWdpc3RyeSBldGMgKi8KTFBDVFNUUiAgICAgICAgIGFwcF9uYW1lX2xvbmcgPSBfVCgiTmV0LVNOTVAgQWdlbnQiKTsgICAgIC8qIEFwcGxpY2F0aW9uIE5hbWUgKi8KI2VuZGlmCgpjb25zdCBjaGFyICAgICAqYXBwX25hbWUgPSAic25tcGQiOwoKZXh0ZXJuIGludCAgICAgIG5ldHNubXBfcnVubmluZzsKI2lmZGVmIFVTSU5HX1VUSUxfRlVOQ1NfUkVTVEFSVF9NT0RVTEUKZXh0ZXJuIGNoYXIgICAqKmFyZ3ZyZXN0YXJ0cDsKZXh0ZXJuIGNoYXIgICAgKmFyZ3ZyZXN0YXJ0OwpleHRlcm4gY2hhciAgICAqYXJndnJlc3RhcnRuYW1lOwojZW5kaWYgLyogVVNJTkdfVVRJTF9GVU5DU19SRVNUQVJUX01PRFVMRSAqLwoKI2lmZGVmIFVTSU5HX1NNVVhfTU9EVUxFCiNpbmNsdWRlIDxtaWJncm91cC9zbXV4L3NtdXguaD4KI2VuZGlmIC8qIFVTSU5HX1NNVVhfTU9EVUxFICovCgovKgogKiBQcm90b3R5cGVzLgogKi8KaW50ICAgICAgICAgICAgIHNubXBfcmVhZF9wYWNrZXQoaW50KTsKaW50ICAgICAgICAgICAgIHNubXBfaW5wdXQoaW50LCBuZXRzbm1wX3Nlc3Npb24gKiwgaW50LCBuZXRzbm1wX3BkdSAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopOwpzdGF0aWMgdm9pZCAgICAgdXNhZ2UoY2hhciAqKTsKc3RhdGljIHZvaWQgICAgIFNubXBUcmFwTm9kZURvd24odm9pZCk7CnN0YXRpYyBpbnQgICAgICByZWNlaXZlKHZvaWQpOwojaWZkZWYgV0lOMzJTRVJWSUNFCnZvaWQgICAgICAgICAgICBTdG9wU25tcEFnZW50KHZvaWQpOwppbnQgICAgICAgICAgICAgU25tcERhZW1vbk1haW4oaW50IGFyZ2MsIFRDSEFSICogYXJndltdKTsKaW50IF9fY2RlY2wgICAgIF90bWFpbihpbnQgYXJnYywgVENIQVIgKiBhcmd2W10pOwojZWxzZQppbnQgICAgICAgICAgICAgbWFpbihpbnQsIGNoYXIgKiopOwojZW5kaWYKCi8qCiAqIFRoZXNlIGRlZmluaXRpb25zIGhhbmRsZSA0LjIgc3lzdGVtcyB3aXRob3V0IGFkZGl0aW9uYWwgc3lzbG9nIGZhY2lsaXRpZXMuCiAqLwojaWZuZGVmIExPR19DT05TCiNkZWZpbmUgTE9HX0NPTlMJMCAgICAgICAvKiBEb24ndCBib3RoZXIgaWYgbm90IGRlZmluZWQuLi4gKi8KI2VuZGlmCiNpZm5kZWYgTE9HX1BJRAojZGVmaW5lIExPR19QSUQJCTAgICAgICAgLyogRG9uJ3QgYm90aGVyIGlmIG5vdCBkZWZpbmVkLi4uICovCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDAKI2RlZmluZSBMT0dfTE9DQUwwCTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMMQojZGVmaW5lIExPR19MT0NBTDEJMAojZW5kaWYKI2lmbmRlZiBMT0dfTE9DQUwyCiNkZWZpbmUgTE9HX0xPQ0FMMgkwCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDMKI2RlZmluZSBMT0dfTE9DQUwzCTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMNAojZGVmaW5lIExPR19MT0NBTDQJMAojZW5kaWYKI2lmbmRlZiBMT0dfTE9DQUw1CiNkZWZpbmUgTE9HX0xPQ0FMNQkwCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDYKI2RlZmluZSBMT0dfTE9DQUw2CTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMNwojZGVmaW5lIExPR19MT0NBTDcJMAojZW5kaWYKI2lmbmRlZiBMT0dfREFFTU9OCiNkZWZpbmUgTE9HX0RBRU1PTgkwCiNlbmRpZgoKCnN0YXRpYyB2b2lkCnVzYWdlKGNoYXIgKnByb2cpCnsKI2lmZGVmIFdJTjMyU0VSVklDRQogICAgcHJpbnRmKCJcblVzYWdlOiAgJXMgWy1yZWdpc3Rlcl0gWy1xdWlldF0gW09QVElPTlNdIFtMSVNURU5JTkcgQUREUkVTU0VTXSIKICAgICAgICAgICAiXG4gICAgICAgICVzIFstdW5yZWdpc3Rlcl0gWy1xdWlldF0iLCBwcm9nLCBwcm9nKTsKI2Vsc2UKICAgIHByaW50ZigiXG5Vc2FnZTogICVzIFtPUFRJT05TXSBbTElTVEVOSU5HIEFERFJFU1NFU10iLCBwcm9nKTsKI2VuZGlmCiAgICBwcmludGYoIlxuIgogICAgICAgICAgICJcblx0VmVyc2lvbjogICVzXG4lcyIKICAgICAgICAgICAiXHRcdFx0ICAoY29uZmlnIHNlYXJjaCBwYXRoOiAlcylcbiVzJXMiLAogICAgICAgICAgIG5ldHNubXBfZ2V0X3ZlcnNpb24oKSwKICAgICAgICAgICAiXHRXZWI6ICAgICAgaHR0cDovL3d3dy5uZXQtc25tcC5vcmcvXG4iCiAgICAgICAgICAgIlx0RW1haWw6ICAgIG5ldC1zbm1wLWNvZGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXRcbiIKICAgICAgICAgICAiXG4gIC1hXHRcdFx0bG9nIGFkZHJlc3Nlc1xuIgogICAgICAgICAgICIgIC1BXHRcdFx0YXBwZW5kIHRvIHRoZSBsb2dmaWxlIHJhdGhlciB0aGFuIHRydW5jYXRpbmcgaXRcbiIKICAgICAgICAgICAiICAtYyBGSUxFWywuLi5dXHRcdHJlYWQgRklMRShzKSBhcyBjb25maWd1cmF0aW9uIGZpbGUocylcbiIKICAgICAgICAgICAiICAtQ1x0XHRcdGRvIG5vdCByZWFkIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlsZXNcbiIsCiAgICAgICAgICAgZ2V0X2NvbmZpZ3VyYXRpb25fZGlyZWN0b3J5KCksCiAgICAgICAgICAgIiAgLWRcdFx0XHRkdW1wIHNlbnQgYW5kIHJlY2VpdmVkIFNOTVAgcGFja2V0c1xuIgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9ERUJVR0dJTkcKICAgICAgICAgICAiICAtRFtUT0tFTlssLi4uXV1cdHR1cm4gb24gZGVidWdnaW5nIG91dHB1dCBmb3IgdGhlIGdpdmVuIFRPS0VOKHMpXG4iCgkgICAiXHRcdFx0ICAodHJ5IEFMTCBmb3IgZXh0cmVtZWx5IHZlcmJvc2Ugb3V0cHV0KVxuIgoJICAgIlx0XHRcdCAgRG9uJ3QgcHV0IHNwYWNlKHMpIGJldHdlZW4gLUQgYW5kIFRPS0VOKHMpLlxuIgojZW5kaWYKICAgICAgICAgICAiICAtZlx0XHRcdGRvIG5vdCBmb3JrIGZyb20gdGhlIHNoZWxsXG4iLAojaWYgSEFWRV9VTklTVERfSAogICAgICAgICAgICIgIC1nIEdJRFx0XHRjaGFuZ2UgdG8gdGhpcyBudW1lcmljIGdpZCBhZnRlciBvcGVuaW5nXG4iCgkgICAiXHRcdFx0ICB0cmFuc3BvcnQgZW5kcG9pbnRzXG4iCiNlbmRpZgogICAgICAgICAgICIgIC1oLCAtLWhlbHBcdFx0ZGlzcGxheSB0aGlzIHVzYWdlIG1lc3NhZ2VcbiIKICAgICAgICAgICAiICAtSFx0XHRcdGRpc3BsYXkgY29uZmlndXJhdGlvbiBmaWxlIGRpcmVjdGl2ZXMgdW5kZXJzdG9vZFxuIgogICAgICAgICAgICIgIC1JIFstXUlOSVRMSVNUXHRsaXN0IG9mIG1pYiBtb2R1bGVzIHRvIGluaXRpYWxpemUgKG9yIG5vdClcbiIKICAgICAgICAgICAiXHRcdFx0ICAocnVuIHNubXBkIHdpdGggLURtaWJfaW5pdCBmb3IgYSBsaXN0KVxuIgogICAgICAgICAgICIgIC1MIDxMT0dPUFRTPlx0XHR0b2dnbGUgb3B0aW9ucyBjb250cm9sbGluZyB3aGVyZSB0byBsb2cgdG9cbiIpOwogICAgc25tcF9sb2dfb3B0aW9uc191c2FnZSgiXHQiLCBzdGRvdXQpOwogICAgcHJpbnRmKCIgIC1tIE1JQkxJU1RcdFx0dXNlIE1JQkxJU1QgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBNSUIgbGlzdFxuIgogICAgICAgICAgICIgIC1NIERJUkxJU1RcdFx0dXNlIERJUkxJU1QgYXMgdGhlIGxpc3Qgb2YgbG9jYXRpb25zIHRvIGxvb2sgZm9yIE1JQnNcbiIKICAgICAgICAgICAiXHRcdFx0ICAoZGVmYXVsdCAlcylcbiVzJXMiLAojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgICAgICAgIG5ldHNubXBfZ2V0X21pYl9kaXJlY3RvcnkoKSwKI2Vsc2UKICAgICAgICAgICAiTUlCcyBub3QgbG9hZGVkIiwKI2VuZGlmCiAgICAgICAgICAgIiAgLXAgRklMRVx0XHRzdG9yZSBwcm9jZXNzIGlkIGluIEZJTEVcbiIKICAgICAgICAgICAiICAtcVx0XHRcdHByaW50IGluZm9ybWF0aW9uIGluIGEgbW9yZSBwYXJzYWJsZSBmb3JtYXRcbiIKICAgICAgICAgICAiICAtclx0XHRcdGRvIG5vdCBleGl0IGlmIGZpbGVzIG9ubHkgYWNjZXNzaWJsZSB0byByb290XG4iCgkgICAiXHRcdFx0ICBjYW5ub3QgYmUgb3BlbmVkXG4iCiNpZmRlZiBXSU4zMlNFUlZJQ0UKICAgICAgICAgICAiICAtcmVnaXN0ZXJcdFx0cmVnaXN0ZXIgYXMgYSBXaW5kb3dzIHNlcnZpY2VcbiIKICAgICAgICAgICAiICBcdFx0XHQgIChmb2xsb3dlZCBieSAtcXVpZXQgdG8gcHJldmVudCBtZXNzYWdlIHBvcHVwcylcbiIKICAgICAgICAgICAiICBcdFx0XHQgIChmb2xsb3dlZCBieSB0aGUgc3RhcnR1cCBwYXJhbWV0ZXIgbGlzdClcbiIKICAgICAgICAgICAiICBcdFx0XHQgIE5vdGUgdGhhdCBzb21lIHBhcmFtZXRlcnMgYXJlIG5vdCByZWxldmFudCB3aGVuIHJ1bm5pbmcgYXMgYSBzZXJ2aWNlXG4iCiNlbmRpZgojaWYgSEFWRV9VTklTVERfSAogICAgICAgICAgICIgIC11IFVJRFx0XHRjaGFuZ2UgdG8gdGhpcyB1aWQgKG51bWVyaWMgb3IgdGV4dHVhbCkgYWZ0ZXJcbiIKCSAgICJcdFx0XHQgIG9wZW5pbmcgdHJhbnNwb3J0IGVuZHBvaW50c1xuIgojZW5kaWYKI2lmZGVmIFdJTjMyU0VSVklDRQogICAgICAgICAgICIgIC11bnJlZ2lzdGVyXHRcdHVucmVnaXN0ZXIgYXMgYSBXaW5kb3dzIHNlcnZpY2VcbiIKICAgICAgICAgICAiICBcdFx0XHQgIChmb2xsb3dlZCAtcXVpZXQgdG8gcHJldmVudCBtZXNzYWdlIHBvcHVwcylcbiIKI2VuZGlmCiAgICAgICAgICAgIiAgLXYsIC0tdmVyc2lvblx0XHRkaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb25cbiIKICAgICAgICAgICAiICAtVlx0XHRcdHZlcmJvc2UgZGlzcGxheVxuIgojaWYgZGVmaW5lZChVU0lOR19BR0VOVFhfU1VCQUdFTlRfTU9EVUxFKXx8IGRlZmluZWQoVVNJTkdfQUdFTlRYX01BU1RFUl9NT0RVTEUpCiAgICAgICAgICAgIiAgLXggQUREUkVTU1x0XHR1c2UgQUREUkVTUyBhcyBBZ2VudFggYWRkcmVzc1xuIgojZW5kaWYKI2lmZGVmIFVTSU5HX0FHRU5UWF9TVUJBR0VOVF9NT0RVTEUKICAgICAgICAgICAiICAtWFx0XHRcdHJ1biBhcyBhbiBBZ2VudFggc3ViYWdlbnQgcmF0aGVyIHRoYW4gYXMgYW5cbiIKCSAgICJcdFx0XHQgIFNOTVAgbWFzdGVyIGFnZW50XG4iCiNlbmRpZgogICAgICAgICAgICwKICAgICAgICAgICAiXG5EZXByZWNhdGVkIG9wdGlvbnM6XG4iCiAgICAgICAgICAgIiAgLWwgRklMRVx0XHR1c2UgLUxmIDxGSUxFPiBpbnN0ZWFkXG4iCiAgICAgICAgICAgIiAgLVBcdFx0XHR1c2UgLXAgaW5zdGVhZFxuIgogICAgICAgICAgICIgIC1zXHRcdFx0dXNlIC1Mc2QgaW5zdGVhZFxuIgogICAgICAgICAgICIgIC1TIGR8aXwwLTdcdFx0dXNlIC1McyA8ZmFjaWxpdHk+IGluc3RlYWRcbiIKICAgICAgICAgICAiXG4iCiAgICAgICAgICAgKTsKICAgIGV4aXQoMSk7Cn0KCnN0YXRpYyB2b2lkCnZlcnNpb24odm9pZCkKewogICAgcHJpbnRmKCJcbk5FVC1TTk1QIHZlcnNpb246ICAlc1xuIgogICAgICAgICAgICJXZWI6ICAgICAgICAgICAgICAgaHR0cDovL3d3dy5uZXQtc25tcC5vcmcvXG4iCiAgICAgICAgICAgIkVtYWlsOiAgICAgICAgICAgICBuZXQtc25tcC1jb2RlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0XG5cbiIsCiAgICAgICAgICAgbmV0c25tcF9nZXRfdmVyc2lvbigpKTsKICAgIGV4aXQoMCk7Cn0KClJFVFNJR1RZUEUKU25tcGRTaHV0RG93bihpbnQgYSkKewojaWZkZWYgV0lOMzJTRVJWSUNFCiAgICBleHRlcm4gbmV0c25tcF9zZXNzaW9uICptYWluX3Nlc3Npb247CiNlbmRpZgogICAgbmV0c25tcF9ydW5uaW5nID0gMDsKI2lmZGVmIFdJTjMyU0VSVklDRQogICAgLyoKICAgICAqIEluIGNhc2Ugb2Ygd2luZG93cywgc2VsZWN0KCkgaW4gcmVjZWl2ZSgpIGZ1bmN0aW9uIHdpbGwgbm90IHJldHVybiAKICAgICAqIG9uIHNpZ25hbC4gVGhhdHMgd2h5IGZvbGxvd2luZyBmdW5jdGlvbiBpcyBjYWxsZWQsIHdoaWNoIGNsb3NlcyB0aGUgCiAgICAgKiBzb2NrZXQgZGVzY3JpcHRvcnMgYW5kIGNhdXNlcyB0aGUgc2VsZWN0KCkgdG8gcmV0dXJuCiAgICAgKi8KICAgIHNubXBfY2xvc2UobWFpbl9zZXNzaW9uKTsKI2VuZGlmCn0KCiNpZmRlZiBTSUdIVVAKUkVUU0lHVFlQRQpTbm1wZFJlY29uZmlnKGludCBhKQp7CiAgICByZWNvbmZpZyA9IDE7CiAgICBzaWduYWwoU0lHSFVQLCBTbm1wZFJlY29uZmlnKTsKfQojZW5kaWYKCiNpZmRlZiBTSUdVU1IxCmV4dGVybiB2b2lkICAgICBkdW1wX3JlZ2lzdHJ5KHZvaWQpOwpSRVRTSUdUWVBFClNubXBkRHVtcChpbnQgYSkKewogICAgZHVtcF9yZWdpc3RyeSgpOwogICAgc2lnbmFsKFNJR1VTUjEsIFNubXBkRHVtcCk7Cn0KI2VuZGlmCgpSRVRTSUdUWVBFClNubXBkQ2F0Y2hSYW5kb21TaWduYWwoaW50IGEpCnsKICAgIC8qIERpc2FibGUgYWxsIGxvZ3MgYW5kIGxvZyB0aGUgZXJyb3IgdmlhIHN5c2xvZyAqLwogICAgc25tcF9kaXNhYmxlX2xvZygpOwojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19TWVNMT0cKICAgIHNubXBfZW5hYmxlX3N5c2xvZygpOwojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX1NZU0xPRyAqLwogICAgc25tcF9sb2coTE9HX0VSUiwgIkV4aXRpbmcgb24gc2lnbmFsICVkXG4iLCBhKTsKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1lTTE9HCiAgICBzbm1wX2Rpc2FibGVfc3lzbG9nKCk7CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1lTTE9HICovCiAgICBleGl0KDEpOwp9CgpzdGF0aWMgdm9pZApTbm1wVHJhcE5vZGVEb3duKHZvaWQpCnsKICAgIHNlbmRfZWFzeV90cmFwKFNOTVBfVFJBUF9FTlRFUlBSSVNFU1BFQ0lGSUMsIDIpOwogICAgLyoKICAgICAqIFhYWCAgMiAtIE5vZGUgRG93biAjZGVmaW5lIGl0IGFzIE5PREVfRE9XTl9UUkFQIAogICAgICovCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIG1haW4gLSBOb24gV2luZG93cwogKiBTbm1wRGFlbW9uTWFpbiAtIFdpbmRvd3MgdG8gc3VwcG9ydCB3aW5kb3dzIHNlcnZpY2UKICoKICogUGFyYW1ldGVyczoKICoJIGFyZ2MKICoJKmFyZ3ZbXQogKiAgICAgIAogKiBSZXR1cm5zOgogKgkwCUFsd2F5cyBzdWNjZWVkcy4gICg/KQogKgogKgogKiBTZXR1cCBhbmQgc3RhcnQgdGhlIGFnZW50IGRhZW1vbi4KICoKICogQWxzbyBzdWNjZXNzZnVsbHkgRVhJVHMgd2l0aCB6ZXJvIGZvciBzb21lIG9wdGlvbnMuCiAqLwppbnQKI2lmZGVmIFdJTjMyU0VSVklDRQpTbm1wRGFlbW9uTWFpbihpbnQgYXJnYywgVENIQVIgKiBhcmd2W10pCiNlbHNlCm1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKI2VuZGlmCnsKICAgIGNoYXIgICAgICAgICAgICBvcHRpb25zWzEyOF0gPSAiYUFjOkNkRDo6ZmhISTpsOkw6bTpNOm46cDpQOnFyc1M6VXZWLTpZOiI7CiAgICBpbnQgICAgICAgICAgICAgYXJnLCBpLCByZXQ7CiAgICBpbnQgICAgICAgICAgICAgZG9udF9mb3JrID0gMCwgZG9faGVscCA9IDA7CiAgICBpbnQgICAgICAgICAgICAgbG9nX3NldCA9IDA7CiAgICBpbnQgICAgICAgICAgICAgYWdlbnRfbW9kZSA9IC0xOwogICAgY2hhciAgICAgICAgICAgKnBpZF9maWxlID0gTlVMTDsKICAgIGNoYXIgICAgICAgICAgICBvcHRpb25fY29tcGF0YWJpbGl0eVtdID0gIi1MZSI7CiNpZiBIQVZFX0dFVFBJRAogICAgaW50IGZkOwogICAgRklMRSAgICAgICAgICAgKlBJRDsKI2VuZGlmCgojaWZuZGVmIFdJTjMyCiAgICAvKgogICAgICogY2xvc2UgYWxsIG5vbi1zdGFuZGFyZCBmaWxlIGRlc2NyaXB0b3JzIHdlIG1heSBoYXZlCiAgICAgKiBpbmhlcml0ZWQgZnJvbSB0aGUgc2hlbGwuCiAgICAgKi8KICAgIGZvciAoaSA9IGdldGR0YWJsZXNpemUoKSAtIDE7IGkgPiAyOyAtLWkpIHsKICAgICAgICAodm9pZCkgY2xvc2UoaSk7CiAgICB9CiNlbmRpZiAvKiAjV0lOMzIgKi8KICAgIAogICAgLyoKICAgICAqIHJlZ2lzdGVyIHNpZ25hbHMgQVNBUCB0byBwcmV2ZW50IGRlZmF1bHQgYWN0aW9uICh1c3VhbGx5IGNvcmUpCiAgICAgKiBmb3Igc2lnbmFscyBkdXJpbmcgc3RhcnR1cC4uLgogICAgICovCiNpZmRlZiBTSUdURVJNCiAgICBERUJVR01TR1RMKCgic2lnbmFsIiwgInJlZ2lzdGVyaW5nIFNJR1RFUk0gc2lnbmFsIGhhbmRsZXJcbiIpKTsKICAgIHNpZ25hbChTSUdURVJNLCBTbm1wZFNodXREb3duKTsKI2VuZGlmCiNpZmRlZiBTSUdJTlQKICAgIERFQlVHTVNHVEwoKCJzaWduYWwiLCAicmVnaXN0ZXJpbmcgU0lHSU5UIHNpZ25hbCBoYW5kbGVyXG4iKSk7CiAgICBzaWduYWwoU0lHSU5ULCBTbm1wZFNodXREb3duKTsKI2VuZGlmCiNpZmRlZiBTSUdIVVAKICAgIHNpZ25hbChTSUdIVVAsIFNJR19JR04pOyAgIC8qIGRvIG5vdCB0ZXJtaW5hdGUgb24gZWFybHkgU0lHSFVQICovCiNlbmRpZgojaWZkZWYgU0lHVVNSMQogICAgREVCVUdNU0dUTCgoInNpZ25hbCIsICJyZWdpc3RlcmluZyBTSUdVU1IxIHNpZ25hbCBoYW5kbGVyXG4iKSk7CiAgICBzaWduYWwoU0lHVVNSMSwgU25tcGREdW1wKTsKI2VuZGlmCiNpZmRlZiBTSUdQSVBFCiAgICBERUJVR01TR1RMKCgic2lnbmFsIiwgInJlZ2lzdGVyaW5nIFNJR1BJUEUgc2lnbmFsIGhhbmRsZXJcbiIpKTsKICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsgICAvKiAnSW5saW5lJyBmYWlsdXJlIG9mIHdheXdhcmQgcmVhZGVycyAqLwojZW5kaWYKI2lmZGVmIFNJR1hGU1oKICAgIHNpZ25hbChTSUdYRlNaLCBTbm1wZENhdGNoUmFuZG9tU2lnbmFsKTsKI2VuZGlmCgojaWZkZWYgTkVUU05NUF9OT19ST09UX0FDQ0VTUwogICAgLyoKICAgICAqIERlZmF1bHQgdG8gbm8uICAKICAgICAqLwogICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJICAgTkVUU05NUF9EU19BR0VOVF9OT19ST09UX0FDQ0VTUywgMSk7CiNlbmRpZgogICAgLyoKICAgICAqIERlZmF1bHQgdG8gTk9UIHJ1bm5pbmcgYW4gQWdlbnRYIG1hc3Rlci4gIAogICAgICovCiAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkgICBORVRTTk1QX0RTX0FHRU5UX0FHRU5UWF9NQVNURVIsIDApOwogICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19BR0VOVF9BR0VOVFhfVElNRU9VVCwgLTEpOwogICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19BR0VOVF9BR0VOVFhfUkVUUklFUywgLTEpOwoKICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfQUdFTlRfQ0FDSEVfVElNRU9VVCwgNSk7CiAgICAvKgogICAgICogQWRkIHNvbWUgb3B0aW9ucyBpZiB0aGV5IGFyZSBhdmFpbGFibGUuICAKICAgICAqLwojaWYgSEFWRV9VTklTVERfSAogICAgc3RyY2F0KG9wdGlvbnMsICJnOnU6Iik7CiNlbmRpZgojaWYgZGVmaW5lZChVU0lOR19BR0VOVFhfU1VCQUdFTlRfTU9EVUxFKXx8IGRlZmluZWQoVVNJTkdfQUdFTlRYX01BU1RFUl9NT0RVTEUpCiAgICBzdHJjYXQob3B0aW9ucywgIng6Iik7CiNlbmRpZgojaWZkZWYgVVNJTkdfQUdFTlRYX1NVQkFHRU5UX01PRFVMRQogICAgc3RyY2F0KG9wdGlvbnMsICJYIik7CiNlbmRpZgoKICAgIC8qCiAgICAgKiBUaGlzIGlzIGluY3JlZGlibHkgdWdseSwgYnV0IGl0J3MgcHJvYmFibHkgdGhlIHNpbXBsZXN0IHdheQogICAgICogIHRvIGhhbmRsZSB0aGUgb2xkICctTCcgb3B0aW9uIGFzIHdlbGwgYXMgdGhlIG5ldyAnLUx4JyBzdHlsZQogICAgICovCiAgICBmb3IgKGk9MDsgaTxhcmdjOyBpKyspIHsKICAgICAgICBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLUwiKSkKICAgICAgICAgICAgYXJndltpXSA9IG9wdGlvbl9jb21wYXRhYmlsaXR5OyAgICAgICAgICAgIAogICAgfQoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1lTTE9HCiNpZmRlZiBXSU4zMgogICAgc25tcF9sb2dfc3lzbG9nbmFtZShhcHBfbmFtZV9sb25nKTsKI2Vsc2UKICAgIHNubXBfbG9nX3N5c2xvZ25hbWUoYXBwX25hbWUpOwojZW5kaWYKI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19TWVNMT0cgKi8KICAgIG5ldHNubXBfZHNfc2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfQVBQVFlQRSwgYXBwX25hbWUpOwoKICAgIC8qCiAgICAgKiBOb3cgcHJvY2VzcyBvcHRpb25zIG5vcm1hbGx5LiAgCiAgICAgKi8KICAgIHdoaWxlICgoYXJnID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIG9wdGlvbnMpKSAhPSBFT0YpIHsKICAgICAgICBzd2l0Y2ggKGFyZykgewogICAgICAgIGNhc2UgJy0nOgogICAgICAgICAgICBpZiAoc3RyY2FzZWNtcChvcHRhcmcsICJoZWxwIikgPT0gMCkgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cmNhc2VjbXAob3B0YXJnLCAidmVyc2lvbiIpID09IDApIHsKICAgICAgICAgICAgICAgIHZlcnNpb24oKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaGFuZGxlX2xvbmdfb3B0KG9wdGFyZyk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgbG9nX2FkZHJlc3NlcysrOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnQSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0FQUEVORF9MT0dGSUxFUywgMSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdjJzoKICAgICAgICAgICAgaWYgKG9wdGFyZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCSAgICAgIE5FVFNOTVBfRFNfTElCX09QVElPTkFMQ09ORklHLCBvcHRhcmcpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ0MnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkgICBORVRTTk1QX0RTX0xJQl9ET05UX1JFQURfQ09ORklHUywgMSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfRFVNUF9QQUNLRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytzbm1wX2R1bXBfcGFja2V0KTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ0QnOgojaWZkZWYgTkVUU05NUF9ESVNBQkxFX0RFQlVHR0lORwogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRlYnVnZ2luZyBub3QgY29uZmlndXJlZFxuIik7CiAgICAgICAgICAgIGV4aXQoMSk7CiNlbHNlCiAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyX3Rva2VucyhvcHRhcmcpOwogICAgICAgICAgICBzbm1wX3NldF9kb19kZWJ1Z2dpbmcoMSk7CiNlbmRpZgogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnZic6CiAgICAgICAgICAgIGRvbnRfZm9yayA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKI2lmIEhBVkVfVU5JU1REX0gKICAgICAgICBjYXNlICdnJzoKICAgICAgICAgICAgaWYgKG9wdGFyZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAqZWNwOwogICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGdpZDsKCiAgICAgICAgICAgICAgICBnaWQgPSBzdHJ0b3VsKG9wdGFyZywgJmVjcCwgMTApOwojaWYgSEFWRV9HRVRHUk5BTSAmJiBIQVZFX1BXRF9ICiAgICAgICAgICAgICAgICBpZiAoKmVjcCkgewogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBncm91cCAgKmluZm87CgogICAgICAgICAgICAgICAgICAgIGluZm8gPSBnZXRncm5hbShvcHRhcmcpOwogICAgICAgICAgICAgICAgICAgIGdpZCA9IGluZm8gPyBpbmZvLT5ncl9naWQgOiAtMTsKICAgICAgICAgICAgICAgICAgICBlbmRncmVudCgpOwogICAgICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICAgICAgICAgIGlmIChnaWQgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJCYWQgZ3JvdXAgaWQ6ICVzXG4iLCBvcHRhcmcpOwogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICBORVRTTk1QX0RTX0FHRU5UX0dST1VQSUQsIGdpZCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKI2VuZGlmCgogICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ0gnOgogICAgICAgICAgICBkb19oZWxwID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ0knOgogICAgICAgICAgICBpZiAob3B0YXJnICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIGFkZF90b19pbml0X2xpc3Qob3B0YXJnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfRklMRQogICAgICAgIGNhc2UgJ2wnOgogICAgICAgICAgICBwcmludGYoIldhcm5pbmc6IC1sIG9wdGlvbiBpcyBkZXByZWNhdGVkLCB1c2UgLUxmIDxmaWxlPiBpbnN0ZWFkXG4iKTsKICAgICAgICAgICAgaWYgKG9wdGFyZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBpZiAoc3RybGVuKG9wdGFyZykgPiBQQVRIX01BWCkgewogICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBsb2dmaWxlIHBhdGggdG9vIGxvbmcgKGxpbWl0ICVkIGNoYXJzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbMF0sIFBBVEhfTUFYKTsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc25tcF9lbmFibGVfZmlsZWxvZyhvcHRhcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0FQUEVORF9MT0dGSUxFUykpOwogICAgICAgICAgICAgICAgbG9nX3NldCA9IDE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19GSUxFICovCgogICAgICAgIGNhc2UgJ0wnOgoJICAgIGlmICAoc25tcF9sb2dfb3B0aW9ucyggb3B0YXJnLCBhcmdjLCBhcmd2ICkgPCAwICkgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbG9nX3NldCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgaWYgKG9wdGFyZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBzZXRlbnYoIk1JQlMiLCBvcHRhcmcsIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ00nOgogICAgICAgICAgICBpZiAob3B0YXJnICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIHNldGVudigiTUlCRElSUyIsIG9wdGFyZywgMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnbic6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgYXBwX25hbWUgPSBvcHRhcmc7CiAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0FQUFRZUEUsIGFwcF9uYW1lKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdQJzoKICAgICAgICAgICAgcHJpbnRmKCJXYXJuaW5nOiAtUCBvcHRpb24gaXMgZGVwcmVjYXRlZCwgdXNlIC1wIGluc3RlYWRcbiIpOwogICAgICAgIGNhc2UgJ3AnOgogICAgICAgICAgICBpZiAob3B0YXJnICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIHBpZF9maWxlID0gb3B0YXJnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ3EnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQsIDEpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAncic6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICAgICBORVRTTk1QX0RTX0FHRU5UX05PX1JPT1RfQUNDRVNTKTsKICAgICAgICAgICAgYnJlYWs7CgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19TWVNMT0cKICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgcHJpbnRmKCJXYXJuaW5nOiAtcyBvcHRpb24gaXMgZGVwcmVjYXRlZCwgdXNlIC1Mc2QgaW5zdGVhZFxuIik7CiAgICAgICAgICAgIHNubXBfZW5hYmxlX3N5c2xvZygpOwogICAgICAgICAgICBsb2dfc2V0ID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ1MnOgogICAgICAgICAgICBwcmludGYoIldhcm5pbmc6IC1TIG9wdGlvbiBpcyBkZXByZWNhdGVkLCB1c2UgLUxzIDxmYWNpbGl0eT4gaW5zdGVhZFxuIik7CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgc3dpdGNoICgqb3B0YXJnKSB7CiAgICAgICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICAgIGNhc2UgJ0QnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0RBRU1PTjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2knOgogICAgICAgICAgICAgICAgY2FzZSAnSSc6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfSU5GTzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzAnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMMDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzEnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMMTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzInOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMMjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzMnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMMzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzQnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMNDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzUnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMNTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzYnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMNjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzcnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMNzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIHN5c2xvZyBmYWNpbGl0eTogLVMlY1xuIiwqb3B0YXJnKTsKICAgICAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNubXBfZW5hYmxlX3N5c2xvZ19pZGVudChzbm1wX2xvZ19zeXNsb2duYW1lKE5VTEwpLCBGYWNpbGl0eSk7CiAgICAgICAgICAgICAgICBsb2dfc2V0ID0gMTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibm8gc3lzbG9nIGZhY2lsaXR5IHNwZWNpZmllZFxuIik7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19TWVNMT0cgKi8KCiAgICAgICAgY2FzZSAnVSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICAgICBORVRTTk1QX0RTX0FHRU5UX0xFQVZFX1BJREZJTEUpOwogICAgICAgICAgICBicmVhazsKCiNpZiBIQVZFX1VOSVNURF9ICiAgICAgICAgY2FzZSAndSc6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgKmVjcDsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICB1aWQ7CgogICAgICAgICAgICAgICAgdWlkID0gc3RydG91bChvcHRhcmcsICZlY3AsIDEwKTsKI2lmIEhBVkVfR0VUUFdOQU0gJiYgSEFWRV9QV0RfSAogICAgICAgICAgICAgICAgaWYgKCplY3ApIHsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGFzc3dkICAqaW5mbzsKCiAgICAgICAgICAgICAgICAgICAgaW5mbyA9IGdldHB3bmFtKG9wdGFyZyk7CiAgICAgICAgICAgICAgICAgICAgdWlkID0gaW5mbyA/IGluZm8tPnB3X3VpZCA6IC0xOwogICAgICAgICAgICAgICAgICAgIGVuZHB3ZW50KCk7CiAgICAgICAgICAgICAgICB9CiNlbmRpZgogICAgICAgICAgICAgICAgaWYgKHVpZCA8IDApIHsKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkJhZCB1c2VyIGlkOiAlc1xuIiwgb3B0YXJnKTsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgTkVUU05NUF9EU19BR0VOVF9VU0VSSUQsIHVpZCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKI2VuZGlmCgogICAgICAgIGNhc2UgJ3YnOgogICAgICAgICAgICB2ZXJzaW9uKCk7CgogICAgICAgIGNhc2UgJ1YnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgTkVUU05NUF9EU19BR0VOVF9WRVJCT1NFLCAxKTsKICAgICAgICAgICAgYnJlYWs7CgojaWYgZGVmaW5lZChVU0lOR19BR0VOVFhfU1VCQUdFTlRfTU9EVUxFKXx8IGRlZmluZWQoVVNJTkdfQUdFTlRYX01BU1RFUl9NT0RVTEUpCiAgICAgICAgY2FzZSAneCc6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgICAgTkVUU05NUF9EU19BR0VOVF9YX1NPQ0tFVCwgb3B0YXJnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICBORVRTTk1QX0RTX0FHRU5UX0FHRU5UWF9NQVNURVIsIDEpOwogICAgICAgICAgICBicmVhazsKI2VuZGlmCgogICAgICAgIGNhc2UgJ1gnOgojaWYgZGVmaW5lZChVU0lOR19BR0VOVFhfU1VCQUdFTlRfTU9EVUxFKQogICAgICAgICAgICBhZ2VudF9tb2RlID0gU1VCX0FHRU5UOwojZWxzZQogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBJbGxlZ2FsIGFyZ3VtZW50IC1YOiIKCQkgICAgICAgICAgICAiQWdlbnRYIHN1cHBvcnQgbm90IGNvbXBpbGVkIGluLlxuIiwgYXJndlswXSk7CiAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICBleGl0KDEpOwojZW5kaWYKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ1knOgogICAgICAgICAgICBuZXRzbm1wX2NvbmZpZ19yZW1lbWJlcihvcHRhcmcpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoZG9faGVscCkgewogICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0FHRU5UX05PX1JPT1RfQUNDRVNTLCAxKTsKICAgICAgICBpbml0X2FnZW50KGFwcF9uYW1lKTsgICAgICAgIC8qIHJlZ2lzdGVyIG91ciAuY29uZiBoYW5kbGVycyAqLwogICAgICAgIGluaXRfbWliX21vZHVsZXMoKTsKICAgICAgICBpbml0X3NubXAoYXBwX25hbWUpOwogICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIHVuZGVyc3Rvb2Q6XG4iKTsKICAgICAgICByZWFkX2NvbmZpZ19wcmludF91c2FnZSgiICAiKTsKICAgICAgICBleGl0KDApOwogICAgfQoKICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CiNpZm5kZWYgTkVUU05NUF9OT19MSVNURU5fU1VQUE9SVAogICAgICAgIC8qCiAgICAgICAgICogVGhlcmUgYXJlIG9wdGlvbmFsIHRyYW5zcG9ydCBhZGRyZXNzZXMgb24gdGhlIGNvbW1hbmQgbGluZS4gIAogICAgICAgICAqLwogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZC9tYWluIiwgIm9wdGluZCAlZCwgYXJnYyAlZFxuIiwgb3B0aW5kLCBhcmdjKSk7CiAgICAgICAgZm9yIChpID0gb3B0aW5kOyBpIDwgYXJnYzsgaSsrKSB7CiAgICAgICAgICAgIGNoYXIgKmMsICphc3RyaW5nOwogICAgICAgICAgICBpZiAoKGMgPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkJICAgTkVUU05NUF9EU19BR0VOVF9QT1JUUykpKSB7CiAgICAgICAgICAgICAgICBhc3RyaW5nID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4oYykgKyAyICsgc3RybGVuKGFyZ3ZbaV0pKTsKICAgICAgICAgICAgICAgIGlmIChhc3RyaW5nID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1hbGxvYyBmYWlsdXJlIHByb2Nlc3NpbmcgYXJndlslZF1cbiIsIGkpOwogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzcHJpbnRmKGFzdHJpbmcsICIlcywlcyIsIGMsIGFyZ3ZbaV0pOwogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgICAgTkVUU05NUF9EU19BR0VOVF9QT1JUUywgYXN0cmluZyk7CiAgICAgICAgICAgICAgICBTTk1QX0ZSRUUoYXN0cmluZyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICAgICBORVRTTk1QX0RTX0FHRU5UX1BPUlRTLCBhcmd2W2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBERUJVR01TR1RMKCgic25tcGQvbWFpbiIsICJwb3J0IHNwZWM6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCQkgIE5FVFNOTVBfRFNfQUdFTlRfUE9SVFMpKSk7CiNlbHNlIC8qIE5FVFNOTVBfTk9fTElTVEVOX1NVUFBPUlQgKi8KICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIllvdSBzcGVjaWZpZWQgcG9ydHMgdG8gb3BlbjsgdGhpcyBhZ2VudCB3YXMgYnVpbHQgdG8gb25seSBzZW5kIG5vdGlmaWNhdGlvbnNcbiIpOwogICAgICAgIGV4aXQoMSk7CiNlbmRpZiAvKiBORVRTTk1QX05PX0xJU1RFTl9TVVBQT1JUICovCiAgICB9CgojaWZkZWYgTkVUU05NUF9MT0dGSUxFCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX0ZJTEUKICAgIGlmICgwID09IGxvZ19zZXQpCiAgICAgICAgc25tcF9lbmFibGVfZmlsZWxvZyhORVRTTk1QX0xPR0ZJTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfQVBQRU5EX0xPR0ZJTEVTKSk7CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfRklMRSAqLwojZW5kaWYKCiNpZmRlZiBVU0lOR19VVElMX0ZVTkNTX1JFU1RBUlRfTU9EVUxFCiAgICB7CiAgICAgICAgLyoKICAgICAgICAgKiBJbml0aWFsaXplIGEgYXJndiBzZXQgdG8gdGhlIGN1cnJlbnQgZm9yIHJlc3RhcnRpbmcgdGhlIGFnZW50LgogICAgICAgICAqLwogICAgICAgIGNoYXIgKmNwdHIsICoqYXJndnB0cjsKCiAgICAgICAgYXJndnJlc3RhcnRwID0gKGNoYXIgKiopbWFsbG9jKChhcmdjICsgMikgKiBzaXplb2YoY2hhciAqKSk7CiAgICAgICAgYXJndnB0ciA9IGFyZ3ZyZXN0YXJ0cDsKICAgICAgICBmb3IgKGkgPSAwLCByZXQgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CiAgICAgICAgICAgIHJldCArPSBzdHJsZW4oYXJndltpXSkgKyAxOwogICAgICAgIH0KICAgICAgICBhcmd2cmVzdGFydCA9IChjaGFyICopIG1hbGxvYyhyZXQpOwogICAgICAgIGFyZ3ZyZXN0YXJ0bmFtZSA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oYXJndlswXSkgKyAxKTsKICAgICAgICBpZiAoIWFyZ3ZyZXN0YXJ0cCB8fCAhYXJndnJlc3RhcnQgfHwgIWFyZ3ZyZXN0YXJ0bmFtZSkgewogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1hbGxvYyBmYWlsdXJlIHByb2Nlc3NpbmcgYXJndnJlc3RhcnRcbiIpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBzdHJjcHkoYXJndnJlc3RhcnRuYW1lLCBhcmd2WzBdKTsKCiAgICAgICAgZm9yIChjcHRyID0gYXJndnJlc3RhcnQsIGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CiAgICAgICAgICAgIHN0cmNweShjcHRyLCBhcmd2W2ldKTsKICAgICAgICAgICAgKihhcmd2cHRyKyspID0gY3B0cjsKICAgICAgICAgICAgY3B0ciArPSBzdHJsZW4oYXJndltpXSkgKyAxOwogICAgICAgIH0KICAgIH0KI2VuZGlmIC8qIFVTSU5HX1VUSUxfRlVOQ1NfUkVTVEFSVF9NT0RVTEUgKi8KCiAgICBpZiAoYWdlbnRfbW9kZSA9PSAtMSkgewogICAgICAgIGlmIChzdHJzdHIoYXJndlswXSwgImFnZW50eGQiKSAhPSBOVUxMKSB7CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwKCQkJCSAgIE5FVFNOTVBfRFNfQUdFTlRfUk9MRSwgU1VCX0FHRU5UKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsCgkJCQkgICBORVRTTk1QX0RTX0FHRU5UX1JPTEUsIE1BU1RFUl9BR0VOVCk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsCgkJCSAgICAgICBORVRTTk1QX0RTX0FHRU5UX1JPTEUsIGFnZW50X21vZGUpOwogICAgfQoKICAgIFNPQ0tfU1RBUlRVUDsKICAgIGlmIChpbml0X2FnZW50KGFwcF9uYW1lKSAhPSAwKSB7CiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIkFnZW50IGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIGluaXRfbWliX21vZHVsZXMoKTsKCiAgICAvKgogICAgICogc3RhcnQgbGlicmFyeSAKICAgICAqLwogICAgaW5pdF9zbm1wKGFwcF9uYW1lKTsKCiAgICBpZiAoKHJldCA9IGluaXRfbWFzdGVyX2FnZW50KCkpICE9IDApIHsKICAgICAgICAvKgogICAgICAgICAqIFNvbWUgZXJyb3Igb3BlbmluZyBvbmUgb2YgdGhlIHNwZWNpZmllZCBhZ2VudCB0cmFuc3BvcnRzLiAgCiAgICAgICAgICovCiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIlNlcnZlciBFeGl0aW5nIHdpdGggY29kZSAxXG4iKTsKICAgICAgICBleGl0KDEpOwogICAgfQoKICAgIC8qCiAgICAgKiBJbml0aWFsaXplIHRoZSB3b3JsZC4gIERldGFjaCBmcm9tIHRoZSBzaGVsbC4gIENyZWF0ZSBpbml0aWFsIHVzZXIuICAKICAgICAqLwogICAgaWYoIWRvbnRfZm9yaykgewogICAgICAgIGludCBxdWl0ID0gISBuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19BR0VOVF9RVUlUX0lNTUVESUFURUxZKTsKICAgICAgICByZXQgPSBuZXRzbm1wX2RhZW1vbml6ZShxdWl0LAojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19TVERJTwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNubXBfc3RkZXJybG9nX3N0YXR1cygpCiNlbHNlIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19TVERJTyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19TVERJTyAqLwogICAgICAgICAgICApOwogICAgICAgIC8qCiAgICAgICAgICogeHh4LXJrczogZG8gd2UgY2FyZSBpZiBmb3JrIGZhaWxzPyBJIHRoaW5rIHdlIHNob3VsZC4uLgogICAgICAgICAqLwogICAgICAgIGlmKHJldCAhPSAwKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJTZXJ2ZXIgRXhpdGluZyB3aXRoIGNvZGUgMVxuIik7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQogICAgfQoKI2lmIEhBVkVfR0VUUElECiAgICBpZiAocGlkX2ZpbGUgIT0gTlVMTCkgewogICAgICAgIC8qCiAgICAgICAgICogdW5saW5rIHRoZSBwaWRfZmlsZSwgaWYgaXQgZXhpc3RzLCBwcmlvciB0byBvcGVuLiAgV2l0aG91dAogICAgICAgICAqIGRvaW5nIHRoaXMgdGhlIG9wZW4gd2lsbCBmYWlsIGlmIHRoZSB1c2VyIHNwZWNpZmllZCBwaWRfZmlsZQogICAgICAgICAqIGFscmVhZHkgZXhpc3RzLgogICAgICAgICAqLwogICAgICAgIHVubGluayhwaWRfZmlsZSk7CiAgICAgICAgZmQgPSBvcGVuKHBpZF9maWxlLCBPX0NSRUFUIHwgT19FWENMIHwgT19XUk9OTFksIDA2MDApOwogICAgICAgIGlmIChmZCA9PSAtMSkgewogICAgICAgICAgICBzbm1wX2xvZ19wZXJyb3IocGlkX2ZpbGUpOwogICAgICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0FHRU5UX05PX1JPT1RfQUNDRVNTKSkgewogICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgoUElEID0gZmRvcGVuKGZkLCAidyIpKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZ19wZXJyb3IocGlkX2ZpbGUpOwogICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZwcmludGYoUElELCAiJWRcbiIsIChpbnQpIGdldHBpZCgpKTsKICAgICAgICAgICAgICAgIGZjbG9zZShQSUQpOwogICAgICAgICAgICB9CiNpZm5kZWYgX01TQ19WRVIKICAgICAgICAgICAgLyogVGhlIHNlcXVlbmNlIG9wZW4oKS9mZG9wZW4oKS9mY2xvc2UoKS9jbG9zZSgpIG1ha2VzIE1TVkMgY3Jhc2gsCiAgICAgICAgICAgICAgIGhlbmNlIHNraXAgdGhlIGNsb3NlKCkgY2FsbCB3aGVuIHVzaW5nIHRoZSBNU1ZDIHJ1bnRpbWUuICovCiAgICAgICAgICAgIGNsb3NlKGZkKTsKI2VuZGlmCiAgICAgICAgfQogICAgfQojZW5kaWYKCiNpZiBkZWZpbmVkKEhBVkVfVU5JU1REX0gpICYmIChkZWZpbmVkKEhBVkVfQ0hPV04pIHx8IGRlZmluZWQoSEFWRV9TRVRHSUQpIHx8IGRlZmluZWQoSEFWRV9TRVRVSUQpKQogICAgewogICAgY29uc3QgY2hhciAgICAgKnBlcnNpc3RlbnRfZGlyOwogICAgaW50ICAgICAgICAgICAgIHVpZCwgZ2lkOwoKICAgIHBlcnNpc3RlbnRfZGlyID0gZ2V0X3BlcnNpc3RlbnRfZGlyZWN0b3J5KCk7CiAgICBta2RpcmhpZXIoIHBlcnNpc3RlbnRfZGlyLCBORVRTTk1QX0FHRU5UX0RJUkVDVE9SWV9NT0RFLCAwICk7CiAgIAogICAgdWlkID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkgICAgIE5FVFNOTVBfRFNfQUdFTlRfVVNFUklEKTsKICAgIGdpZCA9IG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJICAgICBORVRTTk1QX0RTX0FHRU5UX0dST1VQSUQpOwogICAgCiNpZmRlZiBIQVZFX0NIT1dOCiAgICBpZiAoIHVpZCAhPSAwIHx8IGdpZCAhPSAwICkKICAgICAgICBjaG93biggcGVyc2lzdGVudF9kaXIsIHVpZCwgZ2lkICk7CiNlbmRpZgoKI2lmZGVmIEhBVkVfU0VUR0lECiAgICBpZiAoKGdpZCA9IG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgTkVUU05NUF9EU19BR0VOVF9HUk9VUElEKSkgPiAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkL21haW4iLCAiQ2hhbmdpbmcgZ2lkIHRvICVkLlxuIiwgZ2lkKSk7CiAgICAgICAgaWYgKHNldGdpZChnaWQpID09IC0xCiNpZmRlZiBIQVZFX1NFVEdST1VQUwogICAgICAgICAgICB8fCBzZXRncm91cHMoMSwgKGdpZF90ICopJmdpZCkgPT0gLTEKI2VuZGlmCiAgICAgICAgICAgICkgewogICAgICAgICAgICBzbm1wX2xvZ19wZXJyb3IoInNldGdpZCBmYWlsZWQiKTsKICAgICAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJCU5FVFNOTVBfRFNfQUdFTlRfTk9fUk9PVF9BQ0NFU1MpKSB7CiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojZW5kaWYKI2lmZGVmIEhBVkVfU0VUVUlECiAgICBpZiAoKHVpZCA9IG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgTkVUU05NUF9EU19BR0VOVF9VU0VSSUQpKSA+IDApIHsKI2lmIEhBVkVfR0VUUFdOQU0gJiYgSEFWRV9QV0RfSCAmJiBIQVZFX0lOSVRHUk9VUFMKICAgICAgICBzdHJ1Y3QgcGFzc3dkICppbmZvOwoKICAgICAgICAvKgogICAgICAgICAqIFNldCBzdXBwbGVtZW50YXJ5IGdyb3VwcyBiZWZvcmUgY2hhbmdpbmcgVUlECiAgICAgICAgICogICAod2hpY2ggcHJvYmFibHkgaW52b2x2ZXMgZ2l2aW5nIHVwIHByaXZpbGVnZXMpCiAgICAgICAgICovCiAgICAgICAgaW5mbyA9IGdldHB3dWlkKHVpZCk7CiAgICAgICAgaWYgKGluZm8pIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInNubXBkL21haW4iLCAiU3VwcGxlbWVudGFyeSBncm91cHMgZm9yICVzLlxuIiwgaW5mby0+cHdfbmFtZSkpOwogICAgICAgICAgICBpZiAoaW5pdGdyb3VwcyhpbmZvLT5wd19uYW1lLCAoZ2lkICE9IDAgPyAoZ2lkX3QpZ2lkIDogaW5mby0+cHdfZ2lkKSkgPT0gLTEpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nX3BlcnJvcigiaW5pdGdyb3VwcyBmYWlsZWQiKTsKICAgICAgICAgICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0FHRU5UX05PX1JPT1RfQUNDRVNTKSkgewogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZW5kcHdlbnQoKTsKI2VuZGlmCiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkL21haW4iLCAiQ2hhbmdpbmcgdWlkIHRvICVkLlxuIiwgdWlkKSk7CiAgICAgICAgaWYgKHNldHVpZCh1aWQpID09IC0xKSB7CiAgICAgICAgICAgIHNubXBfbG9nX3BlcnJvcigic2V0dWlkIGZhaWxlZCIpOwogICAgICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkJTkVUU05NUF9EU19BR0VOVF9OT19ST09UX0FDQ0VTUykpIHsKICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiNlbmRpZgogICAgfQojZW5kaWYKCiAgICAvKgogICAgICogU3RvcmUgcGVyc2lzdGVudCBkYXRhIGltbWVkaWF0ZWx5IGluIGNhc2Ugd2UgY3Jhc2ggbGF0ZXIuICAKICAgICAqLwogICAgc25tcF9zdG9yZShhcHBfbmFtZSk7CgojaWZkZWYgU0lHSFVQCiAgICBERUJVR01TR1RMKCgic2lnbmFsIiwgInJlZ2lzdGVyaW5nIFNJR0hVUCBzaWduYWwgaGFuZGxlclxuIikpOwogICAgc2lnbmFsKFNJR0hVUCwgU25tcGRSZWNvbmZpZyk7CiNlbmRpZgoKICAgIC8qCiAgICAgKiBTZW5kIGNvbGRzdGFydCB0cmFwIGlmIHBvc3NpYmxlLiAgCiAgICAgKi8KICAgIHNlbmRfZWFzeV90cmFwKDAsIDApOwoKICAgIC8qCiAgICAgKiBXZSdyZSB1cCwgbG9nIG91ciB2ZXJzaW9uIG51bWJlci4gIAogICAgICovCiAgICBzbm1wX2xvZyhMT0dfSU5GTywgIk5FVC1TTk1QIHZlcnNpb24gJXNcbiIsIG5ldHNubXBfZ2V0X3ZlcnNpb24oKSk7CiNpZmRlZiBXSU4zMlNFUlZJQ0UKICAgIGFnZW50X3N0YXR1cyA9IEFHRU5UX1JVTk5JTkc7CiNlbmRpZgogICAgbmV0c25tcF9hZGRyY2FjaGVfaW5pdGlhbGlzZSgpOwoKICAgIC8qCiAgICAgKiBGb3JldmVyIG1vbml0b3IgdGhlIGRlc3RfcG9ydCBmb3IgaW5jb21pbmcgUERVcy4gIAogICAgICovCiAgICBERUJVR01TR1RMKCgic25tcGQvbWFpbiIsICJXZSdyZSB1cC4gIFN0YXJ0aW5nIHRvIHByb2Nlc3MgZGF0YS5cbiIpKTsKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCU5FVFNOTVBfRFNfQUdFTlRfUVVJVF9JTU1FRElBVEVMWSkpCiAgICAgICAgcmVjZWl2ZSgpOwogICAgREVCVUdNU0dUTCgoInNubXBkL21haW4iLCAic2VuZGluZyBzaHV0ZG93biB0cmFwXG4iKSk7CiAgICBTbm1wVHJhcE5vZGVEb3duKCk7CiAgICBERUJVR01TR1RMKCgic25tcGQvbWFpbiIsICJCeWUuLi5cbiIpKTsKICAgIHNubXBfc2h1dGRvd24oYXBwX25hbWUpOwogICAgc2h1dGRvd25fbWFzdGVyX2FnZW50KCk7CiAgICBzaHV0ZG93bl9hZ2VudCgpOwoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCU5FVFNOTVBfRFNfQUdFTlRfTEVBVkVfUElERklMRSkgJiYKCShwaWRfZmlsZSAhPSBOVUxMKSkgewogICAgICAgIHVubGluayhwaWRfZmlsZSk7CiAgICB9CiNpZmRlZiBXSU4zMlNFUlZJQ0UKICAgIGFnZW50X3N0YXR1cyA9IEFHRU5UX1NUT1BQRUQ7CiNlbmRpZgoKI2lmZGVmIFVTSU5HX1VUSUxfRlVOQ1NfUkVTVEFSVF9NT0RVTEUKICAgIFNOTVBfRlJFRShhcmd2cmVzdGFydG5hbWUpOwogICAgU05NUF9GUkVFKGFyZ3ZyZXN0YXJ0KTsKICAgIFNOTVBfRlJFRShhcmd2cmVzdGFydHApOwojZW5kaWYgLyogVVNJTkdfVVRJTF9GVU5DU19SRVNUQVJUX01PRFVMRSAqLwoKICAgIFNPQ0tfQ0xFQU5VUDsKICAgIHJldHVybiAwOwp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBtYWluKCkgLS0gc25tcGQgKi8KCiNpZiBkZWZpbmVkKFdJTjMyKQoKI2luY2x1ZGUgPHByb2Nlc3MuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9hc3NlcnQuaD4KCnN0YXRpYyB1bnNpZ25lZCBzX3RocmVhZGlkOwpIQU5ETEUgc190aHJlYWRfaGFuZGxlOwoKc3RhdGljIHVuc2lnbmVkIF9fc3RkY2FsbCB3YWl0X2Zvcl9zdGRpbih2b2lkKiBhcmcpCnsKICAgIGlmIChnZXRjKHN0ZGluKSAhPSBFT0YpCiAgICAgICAgbmV0c25tcF9ydW5uaW5nID0gMDsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBjcmVhdGVfc3RkaW5fd2FpdGVyX3RocmVhZCh2b2lkKQp7CiAgICBuZXRzbm1wX2Fzc2VydChzX3RocmVhZF9oYW5kbGUgPT0gMCk7CiAgICBzX3RocmVhZF9oYW5kbGUgPSAoSEFORExFKV9iZWdpbnRocmVhZGV4KDAsIDAsIHdhaXRfZm9yX3N0ZGluLCAwLCAwLCAmc190aHJlYWRpZCk7CiAgICBuZXRzbm1wX2Fzc2VydChzX3RocmVhZF9oYW5kbGUgIT0gMCk7Cn0KCnN0YXRpYyB2b2lkIGpvaW5fc3RkaW5fd2FpdGVyX3RocmVhZCh2b2lkKQp7CiAgICBpbnQgcmVzdWx0OwoKICAgIG5ldHNubXBfYXNzZXJ0KHNfdGhyZWFkX2hhbmRsZSAhPSAwKTsKICAgIHJlc3VsdCA9IFdhaXRGb3JTaW5nbGVPYmplY3Qoc190aHJlYWRfaGFuZGxlLCAxMDAwKTsKICAgIG5ldHNubXBfYXNzZXJ0KHJlc3VsdCAhPSBXQUlUX1RJTUVPVVQpOwogICAgQ2xvc2VIYW5kbGUoc190aHJlYWRfaGFuZGxlKTsKICAgIHNfdGhyZWFkX2hhbmRsZSA9IDA7Cn0KI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiByZWNlaXZlCiAqCiAqIFBhcmFtZXRlcnM6CiAqICAgICAgCiAqIFJldHVybnM6CiAqCTAJT24gc3VjY2Vzcy4KICoJLTEJU3lzdGVtIGVycm9yLgogKgogKiBJbmZpbml0ZSB3aGlsZS1sb29wIHdoaWNoIG1vbml0b3JzIGluY29taW5nIG1lc3NhZ2VzIGZvciB0aGUgYWdlbnQuCiAqIEludm9rZSB0aGUgZXN0YWJsaXNoZWQgbWVzc2FnZSBoYW5kbGVycyBmb3IgaW5jb21pbmcgbWVzc2FnZXMgb24gYSBwZXIKICogcG9ydCBiYXNpcy4gIEhhbmRsZSB0aW1lb3V0cy4KICovCnN0YXRpYyBpbnQKcmVjZWl2ZSh2b2lkKQp7CiAgICBpbnQgICAgICAgICAgICAgbnVtZmRzOwogICAgbmV0c25tcF9sYXJnZV9mZF9zZXQgcmVhZGZkcywgd3JpdGVmZHMsIGV4Y2VwdGZkczsKICAgIHN0cnVjdCB0aW1ldmFsICB0aW1lb3V0LCAqdHZwID0gJnRpbWVvdXQ7CiAgICBpbnQgICAgICAgICAgICAgY291bnQsIGJsb2NrLCBpOwojaWZkZWYJVVNJTkdfU01VWF9NT0RVTEUKICAgIGludCAgICAgICAgICAgICBzZDsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVU0lOR19TTVVYX01PRFVMRSAqLwoKICAgIG5ldHNubXBfbGFyZ2VfZmRfc2V0X2luaXQoJnJlYWRmZHMsIEZEX1NFVFNJWkUpOwogICAgbmV0c25tcF9sYXJnZV9mZF9zZXRfaW5pdCgmd3JpdGVmZHMsIEZEX1NFVFNJWkUpOwogICAgbmV0c25tcF9sYXJnZV9mZF9zZXRfaW5pdCgmZXhjZXB0ZmRzLCBGRF9TRVRTSVpFKTsKCiAgICAvKgogICAgICogaWdub3JlIGVhcmx5IHNpZ2h1cCBkdXJpbmcgc3RhcnR1cAogICAgICovCiAgICByZWNvbmZpZyA9IDA7CgojaWYgZGVmaW5lZChXSU4zMikKICAgIGNyZWF0ZV9zdGRpbl93YWl0ZXJfdGhyZWFkKCk7CiNlbmRpZgoKICAgIC8qCiAgICAgKiBMb29wLWZvcmV2ZXI6IGV4ZWN1dGUgbWVzc2FnZSBoYW5kbGVycyBmb3Igc29ja2V0cyB3aXRoIGRhdGEKICAgICAqLwogICAgd2hpbGUgKG5ldHNubXBfcnVubmluZykgewogICAgICAgIGlmIChyZWNvbmZpZykgewojaWYgSEFWRV9TSUdIT0xECiAgICAgICAgICAgIHNpZ2hvbGQoU0lHSFVQKTsKI2VuZGlmCiAgICAgICAgICAgIHJlY29uZmlnID0gMDsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0lORk8sICJSZWNvbmZpZ3VyaW5nIGRhZW1vblxuIik7CgkgICAgLyogIFN0b3AgYW5kIHJlc3RhcnQgbG9nZ2luZy4gIFRoaXMgYWxsb3dzIGxvZ2ZpbGVzIHRvIGJlCgkJcm90YXRlZCBldGMuICAqLwoJICAgIG5ldHNubXBfbG9nZ2luZ19yZXN0YXJ0KCk7CgkgICAgc25tcF9sb2coTE9HX0lORk8sICJORVQtU05NUCB2ZXJzaW9uICVzIHJlc3RhcnRlZFxuIiwKCQkgICAgIG5ldHNubXBfZ2V0X3ZlcnNpb24oKSk7CiAgICAgICAgICAgIHVwZGF0ZV9jb25maWcoKTsKICAgICAgICAgICAgc2VuZF9lYXN5X3RyYXAoU05NUF9UUkFQX0VOVEVSUFJJU0VTUEVDSUZJQywgMyk7CiNpZiBIQVZFX1NJR0hPTEQKICAgICAgICAgICAgc2lncmVsc2UoU0lHSFVQKTsKI2VuZGlmCiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIGRlZmF1bHQgdG8gc2xlZXBpbmcgZm9yIGEgcmVhbGx5IGxvbmcgdGltZS4gSU5UX01BWAogICAgICAgICAqIHNob3VsZCBiZSBzdWZmaWNpZW50IChlZyB3ZSBkb24ndCBjYXJlIGlmIHRpbWVfdCBpcwogICAgICAgICAqIGEgbG9uZyB0aGF0J3MgYmlnZ2VyIHRoYW4gYW4gaW50KS4KICAgICAgICAgKi8KICAgICAgICB0dnAgPSAmdGltZW91dDsKICAgICAgICB0dnAtPnR2X3NlYyA9IElOVF9NQVg7CiAgICAgICAgdHZwLT50dl91c2VjID0gMDsKCiAgICAgICAgbnVtZmRzID0gMDsKICAgICAgICBORVRTTk1QX0xBUkdFX0ZEX1pFUk8oJnJlYWRmZHMpOwogICAgICAgIE5FVFNOTVBfTEFSR0VfRkRfWkVSTygmd3JpdGVmZHMpOwogICAgICAgIE5FVFNOTVBfTEFSR0VfRkRfWkVSTygmZXhjZXB0ZmRzKTsKICAgICAgICBibG9jayA9IDA7CiAgICAgICAgc25tcF9zZWxlY3RfaW5mbzIoJm51bWZkcywgJnJlYWRmZHMsIHR2cCwgJmJsb2NrKTsKICAgICAgICBpZiAoYmxvY2sgPT0gMSkgewogICAgICAgICAgICB0dnAgPSBOVUxMOyAgICAgICAgIC8qIGJsb2NrIHdpdGhvdXQgdGltZW91dCAqLwoJfQoKI2lmZGVmCVVTSU5HX1NNVVhfTU9EVUxFCiAgICAgICAgaWYgKHNtdXhfbGlzdGVuX3NkID49IDApIHsKICAgICAgICAgICAgTkVUU05NUF9MQVJHRV9GRF9TRVQoc211eF9saXN0ZW5fc2QsICZyZWFkZmRzKTsKICAgICAgICAgICAgbnVtZmRzID0KICAgICAgICAgICAgICAgIHNtdXhfbGlzdGVuX3NkID49IG51bWZkcyA/IHNtdXhfbGlzdGVuX3NkICsgMSA6IG51bWZkczsKCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzbXV4X3NubXBfc2VsZWN0X2xpc3RfZ2V0X2xlbmd0aCgpOyBpKyspIHsKICAgICAgICAgICAgICAgIHNkID0gc211eF9zbm1wX3NlbGVjdF9saXN0X2dldF9TRF9mcm9tX0xpc3QoaSk7CiAgICAgICAgICAgICAgICBpZiAoc2QgIT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfTEFSR0VfRkRfU0VUKHNkLCAmcmVhZGZkcyk7CiAgICAgICAgICAgICAgICAgICBudW1mZHMgPSBzZCA+PSBudW1mZHMgPyBzZCArIDEgOiBudW1mZHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVVNJTkdfU01VWF9NT0RVTEUgKi8KCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9GRF9FVkVOVF9NQU5BR0VSCiAgICAgICAgbmV0c25tcF9leHRlcm5hbF9ldmVudF9pbmZvMigmbnVtZmRzLCAmcmVhZGZkcywgJndyaXRlZmRzLCAmZXhjZXB0ZmRzKTsKI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfRkRfRVZFTlRfTUFOQUdFUiAqLwoKICAgIHJlc2VsZWN0OgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfUkVHSVNURVJfU0lHTkFMCiAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9FWFRFUk5BTF9TSUdTOyBpKyspIHsKICAgICAgICAgICAgaWYgKGV4dGVybmFsX3NpZ25hbF9zY2hlZHVsZWRbaV0pIHsKICAgICAgICAgICAgICAgIGV4dGVybmFsX3NpZ25hbF9zY2hlZHVsZWRbaV0tLTsKICAgICAgICAgICAgICAgIGV4dGVybmFsX3NpZ25hbF9oYW5kbGVyW2ldKGkpOwogICAgICAgICAgICB9CiAgICAgICAgfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9SRUdJU1RFUl9TSUdOQUwgKi8KCiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkL3NlbGVjdCIsICJzZWxlY3QoIG51bWZkcz0lZCwgLi4uLCB0dnA9JXApXG4iLAogICAgICAgICAgICAgICAgICAgIG51bWZkcywgdHZwKSk7CiAgICAgICAgaWYgKHR2cCkKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRpbWVyIiwgInR2cCAlbGQuJWxkXG4iLCAobG9uZykgdHZwLT50dl9zZWMsCiAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSB0dnAtPnR2X3VzZWMpKTsKICAgICAgICBjb3VudCA9IG5ldHNubXBfbGFyZ2VfZmRfc2V0X3NlbGVjdChudW1mZHMsICZyZWFkZmRzLCAmd3JpdGVmZHMsICZleGNlcHRmZHMsCgkJCQkgICAgIHR2cCk7CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkL3NlbGVjdCIsICJyZXR1cm5lZCwgY291bnQgPSAlZFxuIiwgY291bnQpKTsKCiAgICAgICAgaWYgKGNvdW50ID4gMCkgewoKI2lmZGVmIFVTSU5HX1NNVVhfTU9EVUxFCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGhhbmRsZSB0aGUgU01VWCBzZCdzIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHNtdXhfbGlzdGVuX3NkID49IDApIHsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzbXV4X3NubXBfc2VsZWN0X2xpc3RfZ2V0X2xlbmd0aCgpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBzZCA9IHNtdXhfc25tcF9zZWxlY3RfbGlzdF9nZXRfU0RfZnJvbV9MaXN0KGkpOwogICAgICAgICAgICAgICAgICAgIGlmIChORVRTTk1QX0xBUkdFX0ZEX0lTU0VUKHNkLCAmcmVhZGZkcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNtdXhfcHJvY2VzcyhzZCkgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbXV4X3NubXBfc2VsZWN0X2xpc3RfZGVsKHNkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBuZXcgY29ubmVjdGlvbiAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKE5FVFNOTVBfTEFSR0VfRkRfSVNTRVQoc211eF9saXN0ZW5fc2QsICZyZWFkZmRzKSkgewogICAgICAgICAgICAgICAgICAgIGlmICgoc2QgPSBzbXV4X2FjY2VwdChzbXV4X2xpc3Rlbl9zZCkpID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgc211eF9zbm1wX3NlbGVjdF9saXN0X2FkZChzZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVTSU5HX1NNVVhfTU9EVUxFICovCgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfRkRfRVZFTlRfTUFOQUdFUgogICAgICAgICAgICBuZXRzbm1wX2Rpc3BhdGNoX2V4dGVybmFsX2V2ZW50czIoJmNvdW50LCAmcmVhZGZkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3cml0ZWZkcywgJmV4Y2VwdGZkcyk7CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0ZEX0VWRU5UX01BTkFHRVIgKi8KCiAgICAgICAgICAgIC8qIElmIHRoZXJlIGFyZSBzdGlsbCBldmVudHMgbGVmdG92ZXIsIHByb2Nlc3MgdGhlbSAqLwogICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CiAgICAgICAgICAgICAgc25tcF9yZWFkMigmcmVhZGZkcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UKICAgICAgICAgICAgc3dpdGNoIChjb3VudCkgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBzbm1wX3RpbWVvdXQoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIC0xOgogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInNubXBkL3NlbGVjdCIsICIgIGVycm5vID0gJWRcbiIsIGVycm5vKSk7CiAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIGxpa2VseSB0aGF0IHdlIGdvdCBhIHNpZ25hbC4gQ2hlY2sgb3VyIHNwZWNpYWwgc2lnbmFsCiAgICAgICAgICAgICAgICAgICAgICogZmxhZ3MgYmVmb3JlIHJldHJ5aW5nIHNlbGVjdC4KICAgICAgICAgICAgICAgICAgICAgKi8KCQkgICAgaWYgKG5ldHNubXBfcnVubmluZyAmJiAhcmVjb25maWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXNlbGVjdDsKCQkgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzbm1wX2xvZ19wZXJyb3IoInNlbGVjdCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgInNlbGVjdCByZXR1cm5lZCAlZFxuIiwgY291bnQpOwogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGVuZGlmIC0tIGNvdW50PjAgKi8KCiAgICAgICAgLyoKICAgICAgICAgKiBzZWUgaWYgcGVyc2lzdGVudCBzdG9yZSBuZWVkcyB0byBiZSBzYXZlZAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfaWZfbmVlZGVkKCk7CgogICAgICAgIC8qCiAgICAgICAgICogcnVuIHJlcXVlc3RlZCBhbGFybXMgCiAgICAgICAgICovCiAgICAgICAgcnVuX2FsYXJtcygpOwoKICAgICAgICBuZXRzbm1wX2NoZWNrX291dHN0YW5kaW5nX2FnZW50X3JlcXVlc3RzKCk7CgogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZHdoaWxlICovCgogICAgbmV0c25tcF9sYXJnZV9mZF9zZXRfY2xlYW51cCgmcmVhZGZkcyk7CiAgICBuZXRzbm1wX2xhcmdlX2ZkX3NldF9jbGVhbnVwKCZ3cml0ZWZkcyk7CiAgICBuZXRzbm1wX2xhcmdlX2ZkX3NldF9jbGVhbnVwKCZleGNlcHRmZHMpOwoKI2lmIGRlZmluZWQoV0lOMzIpCiAgICBqb2luX3N0ZGluX3dhaXRlcl90aHJlYWQoKTsKI2VuZGlmCgogICAgc25tcF9sb2coTE9HX0lORk8sICJSZWNlaXZlZCBURVJNIG9yIFNUT1Agc2lnbmFsLi4uICBzaHV0dGluZyBkb3duLi4uXG4iKTsKICAgIHJldHVybiAwOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgcmVjZWl2ZSgpICovCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHNubXBfaW5wdXQKICoKICogUGFyYW1ldGVyczoKICoJIG9wCiAqCSpzZXNzaW9uCiAqCSByZXF1aWQKICoJKnBkdQogKgkqbWFnaWMKICogICAgICAKICogUmV0dXJuczoKICoJMQkJT24gc3VjY2VzcwktT1ItCiAqCVBhc3NlcyB0aHJvdWdoCVJldHVybiBmcm9tIGFsYXJtR2V0UmVzcG9uc2UoKSB3aGVuIAogKgkgIAkJICBVU0lOR19WMlBBUlRZX0FMQVJNX01PRFVMRSBpcyBkZWZpbmVkLgogKgogKiBDYWxsLWJhY2sgZnVuY3Rpb24gdG8gbWFuYWdlIHJlc3BvbnNlcyB0byB0cmFwcyAoaW5mb3JtcykgYW5kIGFsYXJtcy4KICogTm90IHVzZWQgYnkgdGhlIGFnZW50IHRvIHByb2Nlc3Mgb3RoZXIgUmVzcG9uc2UgUERVcy4KICovCmludApzbm1wX2lucHV0KGludCBvcCwKICAgICAgICAgICBuZXRzbm1wX3Nlc3Npb24gKiBzZXNzaW9uLAogICAgICAgICAgIGludCByZXFpZCwgbmV0c25tcF9wZHUgKnBkdSwgdm9pZCAqbWFnaWMpCnsKICAgIHN0cnVjdCBnZXRfcmVxX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgZ2V0X3JlcV9zdGF0ZSAqKSBtYWdpYzsKCiAgICBpZiAob3AgPT0gTkVUU05NUF9DQUxMQkFDS19PUF9SRUNFSVZFRF9NRVNTQUdFKSB7CiAgICAgICAgaWYgKHBkdS0+Y29tbWFuZCA9PSBTTk1QX01TR19HRVQpIHsKICAgICAgICAgICAgaWYgKHN0YXRlLT50eXBlID09IEVWRU5UX0dFVF9SRVEpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiB0aGlzIGlzIGp1c3QgdGhlIGFjayB0byBvdXIgaW5mb3JtIHBkdSAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKG9wID09IE5FVFNOTVBfQ0FMTEJBQ0tfT1BfVElNRURfT1VUKSB7CiAgICAgICAgaWYgKHN0YXRlLT50eXBlID09IEFMQVJNX0dFVF9SRVEpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogTmVlZCBhIG1lY2hhbmlzbSB0byByZXBsYWNlIG9ic29sZXRlIFNOTVB2MnAgYWxhcm0gCiAgICAgICAgICAgICAqLwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgc25tcF9pbnB1dCgpICovCgoKCi8qCiAqIFdpbmRvd3MgU2VydmljZSBSZWxhdGVkIGZ1bmN0aW9ucyAKICovCiNpZmRlZiBXSU4zMlNFUlZJQ0UKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG1haW4gZnVuY3Rpb24gZm9yIFdpbmRvd3MKKiBQYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciBzdGFydHVwIG9wdGlvbnMsCiogdG8gc3RhcnQgYXMgc2VydmljZSBvciBjb25zb2xlIG1vZGUgYXBwbGljYXRpb24gaW4gd2luZG93cy4KKiBJbnZva2VzIGFwcHJvcHJpYXRlIHN0YXJ0dXAgZnVuY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgCiogcGFyYW1ldGVycyBwYXNzZWQKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50CiAgICBfX2NkZWNsCl90bWFpbihpbnQgYXJnYywgVENIQVIgKiBhcmd2W10pCnsKICAgIC8qCiAgICAgKiBEZWZpbmUgU2VydmljZSBOYW1lIGFuZCBEZXNjcmlwdGlvbiwgd2hpY2ggYXBwZWFycyBpbiB3aW5kb3dzIFNDTSAKICAgICAqLwogICAgTFBDVFNUUiAgICAgICAgIGxwc3pTZXJ2aWNlTmFtZSA9IGFwcF9uYW1lX2xvbmc7ICAgICAgLyogU2VydmljZSBSZWdpc3RyeSBOYW1lICovCiAgICBMUENUU1RSICAgICAgICAgbHBzelNlcnZpY2VEaXNwbGF5TmFtZSA9IF9UKCJOZXQtU05NUCBBZ2VudCIpOyAgICAgICAvKiBEaXNwbGF5IE5hbWUgKi8KICAgIExQQ1RTVFIgICAgICAgICBscHN6U2VydmljZURlc2NyaXB0aW9uID0KI2lmZGVmIElGREVTQ1IKICAgICAgICBfVCgiU05NUHYyYyAvIFNOTVB2MyBjb21tYW5kIHJlc3BvbmRlciBmcm9tIE5ldC1TTk1QLiBTdXBwb3J0cyBNSUIgb2JqZWN0cyBmb3IgSVAsSUNNUCxUQ1AsVURQLCBhbmQgbmV0d29yayBpbnRlcmZhY2Ugc3ViLWxheWVycy4iKTsKI2Vsc2UKICAgICAgICBfVCgiU05NUHYyYyAvIFNOTVB2MyBjb21tYW5kIHJlc3BvbmRlciBmcm9tIE5ldC1TTk1QIik7CiNlbmRpZgogICAgSW5wdXRQYXJhbXMgICAgIElucHV0T3B0aW9uczsKCgogICAgaW50ICAgICAgICAgICAgIG5SdW5UeXBlID0gUlVOX0FTX0NPTlNPTEU7CiAgICBpbnQgICAgICAgICAgICAgcXVpZXQgPSAwOwogICAgCiNpZiAwCiAgICBfQ3J0U2V0RGJnRmxhZyhfQ1JUREJHX0FMTE9DX01FTV9ERiB8IF9DUlREQkdfTEVBS19DSEVDS19ERiAvKnwgX0NSVERCR19DSEVDS19BTFdBWVNfREYqLyk7CiNlbmRpZgoKICAgIG5SdW5UeXBlID0gUGFyc2VDbWRMaW5lRm9yU2VydmljZU9wdGlvbihhcmdjLCBhcmd2LCAmcXVpZXQpOwoKICAgIHN3aXRjaCAoblJ1blR5cGUpIHsKICAgIGNhc2UgUkVHSVNURVJfU0VSVklDRToKICAgICAgICAvKgogICAgICAgICAqIFJlZ2lzdGVyIEFzIHNlcnZpY2UgCiAgICAgICAgICovCiAgICAgICAgSW5wdXRPcHRpb25zLkFyZ2MgPSBhcmdjOwogICAgICAgIElucHV0T3B0aW9ucy5Bcmd2ID0gYXJndjsKICAgICAgICBleGl0IChSZWdpc3RlclNlcnZpY2UobHBzelNlcnZpY2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBscHN6U2VydmljZURpc3BsYXlOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBscHN6U2VydmljZURlc2NyaXB0aW9uLCAmSW5wdXRPcHRpb25zLCBxdWlldCkpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBVTl9SRUdJU1RFUl9TRVJWSUNFOgogICAgICAgIC8qCiAgICAgICAgICogVW5yZWdpc3RlciBzZXJ2aWNlIAogICAgICAgICAqLwogICAgICAgIGV4aXQgKFVucmVnaXN0ZXJTZXJ2aWNlKGxwc3pTZXJ2aWNlTmFtZSwgcXVpZXQpKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgUlVOX0FTX1NFUlZJQ0U6CiAgICAgICAgLyoKICAgICAgICAgKiBSdW4gYXMgc2VydmljZSAKICAgICAgICAgKi8KICAgICAgICAvKgogICAgICAgICAqIFJlZ2lzdGVyIFN0b3AgRnVuY3Rpb24gCiAgICAgICAgICovCiAgICAgICAgUmVnaXN0ZXJTdG9wRnVuY3Rpb24oU3RvcFNubXBBZ2VudCk7CiAgICAgICAgcmV0dXJuIFJ1bkFzU2VydmljZShTbm1wRGFlbW9uTWFpbik7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIC8qCiAgICAgICAgICogUnVuIGluIGNvbnNvbGUgbW9kZSAKICAgICAgICAgKi8KICAgICAgICByZXR1cm4gU25tcERhZW1vbk1haW4oYXJnYywgYXJndik7CiAgICAgICAgYnJlYWs7CiAgICB9Cn0KCi8qCiAqIFRvIHN0b3AgU25tcCBBZ2VudCBkYWVtb24KICogVGhpcyBwb3J0aW9uIGlzIHN0aWxsIG5vdCB3b3JraW5nCiAqLwp2b2lkClN0b3BTbm1wQWdlbnQodm9pZCkKewogICAgLyoKICAgICAqIFNodXQgRG93biBBZ2VudCAKICAgICAqLwogICAgU25tcGRTaHV0RG93bigxKTsKCiAgICAvKgogICAgICogV2FpdCB0aWxsIGFnZW50IGlzIGNvbXBsZXRlbHkgc3RvcHBlZCAKICAgICAqLwoKICAgIHdoaWxlIChhZ2VudF9zdGF0dXMgIT0gQUdFTlRfU1RPUFBFRCkgewogICAgICAgIFNsZWVwKDEwMCk7CiAgICB9Cn0KCiNlbmRpZiAvKldJTjMyU0VSVklDRSovCg==