LyoKICogc25tcGQuYwogKi8KLyoqIEBkZWZncm91cCBhZ2VudCBUaGUgTmV0LVNOTVAgYWdlbnQKICogVGhlIHNubXAgYWdlbnQgcmVzcG9uZHMgdG8gU05NUCBxdWVyaWVzIGZyb20gbWFuYWdlbWVudCBzdGF0aW9ucwogKi8KLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cy4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qCiAqIENvcHlyaWdodCAxOTg4LCAxOTg5IGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CiAqIAogKiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqIAogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCiAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKICogYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAogKiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIENNVSBub3QgYmUKICogdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCiAqIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIAogKiAKICogQ01VIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKICogQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCiAqIENNVSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKICogQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAogKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCiAqIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKICogU09GVFdBUkUuCiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwovKgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgojaW5jbHVkZSA8bmV0LXNubXAvdHlwZXMuaD4KCiNpZiBIQVZFX0lPX0gKI2luY2x1ZGUgPGlvLmg+CiNlbmRpZgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2Vsc2UKI2luY2x1ZGUgPHN0cmluZ3MuaD4KI2VuZGlmCiNpZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCiNpZiBIQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9BUlBBX0lORVRfSAojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiNlbmRpZgojaWYgVElNRV9XSVRIX1NZU19USU1FCiMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBpbmNsdWRlIDx0aW1lLmg+CiNlbHNlCiMgaWYgSEFWRV9TWVNfVElNRV9ICiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZWxzZQojICBpbmNsdWRlIDx0aW1lLmg+CiMgZW5kaWYKI2VuZGlmCiNpZiBIQVZFX1NZU19TRUxFQ1RfSAojaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NPQ0tFVF9ICiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgojaWYgSEFWRV9ORVRfSUZfSAojaW5jbHVkZSA8bmV0L2lmLmg+CiNlbmRpZgojaWYgSEFWRV9JTkVUX01JQjJfSAojaW5jbHVkZSA8aW5ldC9taWIyLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfSU9DVExfSAojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfRklMRV9ICiNpbmNsdWRlIDxzeXMvZmlsZS5oPgojZW5kaWYKI2lmZGVmIEhBVkVfRkNOVExfSAojaW5jbHVkZSA8ZmNudGwuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19XQUlUX0gKI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiNlbmRpZgojaW5jbHVkZSA8c2lnbmFsLmg+CiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpZiBIQVZFX1BST0NFU1NfSCAgICAgICAgICAgICAgLyogV2luMzItZ2V0cGlkICovCiNpbmNsdWRlIDxwcm9jZXNzLmg+CiNlbmRpZgojaWYgSEFWRV9MSU1JVFNfSAojaW5jbHVkZSA8bGltaXRzLmg+CiNlbmRpZgojaWYgSEFWRV9QV0RfSAojaW5jbHVkZSA8cHdkLmg+CiNlbmRpZgojaWYgSEFWRV9HUlBfSAojaW5jbHVkZSA8Z3JwLmg+CiNlbmRpZgoKI2lmbmRlZiBQQVRIX01BWAojIGlmZGVmIF9QT1NJWF9QQVRIX01BWAojICBkZWZpbmUgUEFUSF9NQVggX1BPU0lYX1BBVEhfTUFYCiMgZWxzZQojICBkZWZpbmUgUEFUSF9NQVggMjU1CiMgZW5kaWYKI2VuZGlmCgojaWZuZGVmIEZEX1NFVAp0eXBlZGVmIGxvbmcgICAgZmRfbWFzazsKI2RlZmluZSBORkRCSVRTIChzaXplb2YoZmRfbWFzaykgKiBOQkJZKSAgICAgICAgLyogYml0cyBwZXIgbWFzayAqLwojZGVmaW5lIEZEX1NFVChuLCBwKSAgICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gfD0gKDEgPDwgKChuKSAlIE5GREJJVFMpKSkKI2RlZmluZSBGRF9DTFIobiwgcCkgICAgKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdICY9IH4oMSA8PCAoKG4pICUgTkZEQklUUykpKQojZGVmaW5lIEZEX0lTU0VUKG4sIHApICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gJiAoMSA8PCAoKG4pICUgTkZEQklUUykpKQojZGVmaW5lIEZEX1pFUk8ocCkgICAgICBtZW1zZXQoKHApLCAwLCBzaXplb2YoKihwKSkpCiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgoKI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvZmRfZXZlbnRfbWFuYWdlci5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9sYXJnZV9mZF9zZXQuaD4KCiNpbmNsdWRlICJtMm0uaCIKI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L21pYl9tb2R1bGVfY29uZmlnLmg+CgojaW5jbHVkZSAic25tcGQuaCIKI2luY2x1ZGUgIm1pYmdyb3VwL3N0cnVjdC5oIgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbWliX21vZHVsZXMuaD4KCiNpbmNsdWRlICJtaWJncm91cC91dGlsX2Z1bmNzLmgiCgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYWdlbnRfdHJhcC5oPgoKI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L3RhYmxlLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC90YWJsZV9pdGVyYXRvci5oPgojaW5jbHVkZSAibWliX21vZHVsZV9pbmNsdWRlcy5oIgoKLyoKICogSW5jbHVkZSB3aW5zZXJ2aWNlLmggdG8gc3VwcG9ydCBXaW5kb3dzIFNlcnZpY2UKICovCiNpZmRlZiBXSU4zMgojaW5jbHVkZSA8d2luZG93cy5oPgojaW5jbHVkZSA8dGNoYXIuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvd2luc2VydmljZS5oPgoKI2RlZmluZSBXSU4zMlNFUlZJQ0UKCiNlbmRpZgoKLyoKICogR2xvYmFscy4KICovCiNpZmRlZiBORVRTTk1QX1VTRV9MSUJXUkFQCiNpbmNsdWRlIDx0Y3BkLmg+CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9VU0VfTElCV1JBUCAqLwoKI2RlZmluZSBUSU1FVElDSyAgICAgICAgIDUwMDAwMEwKCmludCAgICAgICAgICAgICBzbm1wX2R1bXBfcGFja2V0OwpzdGF0aWMgaW50ICAgICAgcmVjb25maWcgPSAwOwppbnQgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfREFFTU9OOwoKI2lmZGVmIFdJTjMyU0VSVklDRQovKgogKiBTTk1QIEFnZW50IFN0YXR1cyAKICovCiNkZWZpbmUgQUdFTlRfUlVOTklORyAxCiNkZWZpbmUgQUdFTlRfU1RPUFBFRCAwCmludCAgICAgICAgICAgICBhZ2VudF9zdGF0dXMgPSBBR0VOVF9TVE9QUEVEOwovKiBhcHBfbmFtZV9sb25nIHVzZWQgZm9yIEV2ZW50IExvZyAoc3lzbG9nKSwgU0NNLCByZWdpc3RyeSBldGMgKi8KTFBDVFNUUiAgICAgICAgIGFwcF9uYW1lX2xvbmcgPSBfVCgiTmV0LVNOTVAgQWdlbnQiKTsgICAgIC8qIEFwcGxpY2F0aW9uIE5hbWUgKi8KI2VuZGlmCgpjb25zdCBjaGFyICAgICAqYXBwX25hbWUgPSAic25tcGQiOwoKZXh0ZXJuIGludCAgICAgIG5ldHNubXBfcnVubmluZzsKZXh0ZXJuIGNoYXIgICAqKmFyZ3ZyZXN0YXJ0cDsKZXh0ZXJuIGNoYXIgICAgKmFyZ3ZyZXN0YXJ0OwpleHRlcm4gY2hhciAgICAqYXJndnJlc3RhcnRuYW1lOwoKI2lmZGVmIFVTSU5HX1NNVVhfTU9EVUxFCiNpbmNsdWRlIDxtaWJncm91cC9zbXV4L3NtdXguaD4KI2VuZGlmIC8qIFVTSU5HX1NNVVhfTU9EVUxFICovCgovKgogKiBQcm90b3R5cGVzLgogKi8KaW50ICAgICAgICAgICAgIHNubXBfcmVhZF9wYWNrZXQoaW50KTsKaW50ICAgICAgICAgICAgIHNubXBfaW5wdXQoaW50LCBuZXRzbm1wX3Nlc3Npb24gKiwgaW50LCBuZXRzbm1wX3BkdSAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopOwpzdGF0aWMgdm9pZCAgICAgdXNhZ2UoY2hhciAqKTsKc3RhdGljIHZvaWQgICAgIFNubXBUcmFwTm9kZURvd24odm9pZCk7CnN0YXRpYyBpbnQgICAgICByZWNlaXZlKHZvaWQpOwojaWZkZWYgV0lOMzJTRVJWSUNFCnZvaWQgICAgICAgICAgICBTdG9wU25tcEFnZW50KHZvaWQpOwppbnQgICAgICAgICAgICAgU25tcERhZW1vbk1haW4oaW50IGFyZ2MsIFRDSEFSICogYXJndltdKTsKaW50IF9fY2RlY2wgICAgIF90bWFpbihpbnQgYXJnYywgVENIQVIgKiBhcmd2W10pOwojZWxzZQppbnQgICAgICAgICAgICAgbWFpbihpbnQsIGNoYXIgKiopOwojZW5kaWYKCi8qCiAqIFRoZXNlIGRlZmluaXRpb25zIGhhbmRsZSA0LjIgc3lzdGVtcyB3aXRob3V0IGFkZGl0aW9uYWwgc3lzbG9nIGZhY2lsaXRpZXMuCiAqLwojaWZuZGVmIExPR19DT05TCiNkZWZpbmUgTE9HX0NPTlMJMCAgICAgICAvKiBEb24ndCBib3RoZXIgaWYgbm90IGRlZmluZWQuLi4gKi8KI2VuZGlmCiNpZm5kZWYgTE9HX1BJRAojZGVmaW5lIExPR19QSUQJCTAgICAgICAgLyogRG9uJ3QgYm90aGVyIGlmIG5vdCBkZWZpbmVkLi4uICovCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDAKI2RlZmluZSBMT0dfTE9DQUwwCTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMMQojZGVmaW5lIExPR19MT0NBTDEJMAojZW5kaWYKI2lmbmRlZiBMT0dfTE9DQUwyCiNkZWZpbmUgTE9HX0xPQ0FMMgkwCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDMKI2RlZmluZSBMT0dfTE9DQUwzCTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMNAojZGVmaW5lIExPR19MT0NBTDQJMAojZW5kaWYKI2lmbmRlZiBMT0dfTE9DQUw1CiNkZWZpbmUgTE9HX0xPQ0FMNQkwCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDYKI2RlZmluZSBMT0dfTE9DQUw2CTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMNwojZGVmaW5lIExPR19MT0NBTDcJMAojZW5kaWYKI2lmbmRlZiBMT0dfREFFTU9OCiNkZWZpbmUgTE9HX0RBRU1PTgkwCiNlbmRpZgoKCnN0YXRpYyB2b2lkCnVzYWdlKGNoYXIgKnByb2cpCnsKI2lmZGVmIFdJTjMyU0VSVklDRQogICAgcHJpbnRmKCJcblVzYWdlOiAgJXMgWy1yZWdpc3Rlcl0gWy1xdWlldF0gW09QVElPTlNdIFtMSVNURU5JTkcgQUREUkVTU0VTXSIKICAgICAgICAgICAiXG4gICAgICAgICVzIFstdW5yZWdpc3Rlcl0gWy1xdWlldF0iLCBwcm9nLCBwcm9nKTsKI2Vsc2UKICAgIHByaW50ZigiXG5Vc2FnZTogICVzIFtPUFRJT05TXSBbTElTVEVOSU5HIEFERFJFU1NFU10iLCBwcm9nKTsKI2VuZGlmCiAgICBwcmludGYoIlxuIgogICAgICAgICAgICJcblx0VmVyc2lvbjogICVzXG4lcyIKICAgICAgICAgICAiXHRcdFx0ICAoY29uZmlnIHNlYXJjaCBwYXRoOiAlcylcbiVzJXMiLAogICAgICAgICAgIG5ldHNubXBfZ2V0X3ZlcnNpb24oKSwKICAgICAgICAgICAiXHRXZWI6ICAgICAgaHR0cDovL3d3dy5uZXQtc25tcC5vcmcvXG4iCiAgICAgICAgICAgIlx0RW1haWw6ICAgIG5ldC1zbm1wLWNvZGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXRcbiIKICAgICAgICAgICAiXG4gIC1hXHRcdFx0bG9nIGFkZHJlc3Nlc1xuIgogICAgICAgICAgICIgIC1BXHRcdFx0YXBwZW5kIHRvIHRoZSBsb2dmaWxlIHJhdGhlciB0aGFuIHRydW5jYXRpbmcgaXRcbiIKICAgICAgICAgICAiICAtYyBGSUxFWywuLi5dXHRcdHJlYWQgRklMRShzKSBhcyBjb25maWd1cmF0aW9uIGZpbGUocylcbiIKICAgICAgICAgICAiICAtQ1x0XHRcdGRvIG5vdCByZWFkIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlsZXNcbiIsCiAgICAgICAgICAgZ2V0X2NvbmZpZ3VyYXRpb25fZGlyZWN0b3J5KCksCiAgICAgICAgICAgIiAgLWRcdFx0XHRkdW1wIHNlbnQgYW5kIHJlY2VpdmVkIFNOTVAgcGFja2V0c1xuIgogICAgICAgICAgICIgIC1EW1RPS0VOWywuLi5dXVx0dHVybiBvbiBkZWJ1Z2dpbmcgb3V0cHV0IGZvciB0aGUgZ2l2ZW4gVE9LRU4ocylcbiIKCSAgICJcdFx0XHQgICh0cnkgQUxMIGZvciBleHRyZW1lbHkgdmVyYm9zZSBvdXRwdXQpXG4iCgkgICAiXHRcdFx0ICBEb24ndCBwdXQgc3BhY2UocykgYmV0d2VlbiAtRCBhbmQgVE9LRU4ocykuXG4iCiAgICAgICAgICAgIiAgLWZcdFx0XHRkbyBub3QgZm9yayBmcm9tIHRoZSBzaGVsbFxuIiwKI2lmIEhBVkVfVU5JU1REX0gKICAgICAgICAgICAiICAtZyBHSURcdFx0Y2hhbmdlIHRvIHRoaXMgbnVtZXJpYyBnaWQgYWZ0ZXIgb3BlbmluZ1xuIgoJICAgIlx0XHRcdCAgdHJhbnNwb3J0IGVuZHBvaW50c1xuIgojZW5kaWYKICAgICAgICAgICAiICAtaCwgLS1oZWxwXHRcdGRpc3BsYXkgdGhpcyB1c2FnZSBtZXNzYWdlXG4iCiAgICAgICAgICAgIiAgLUhcdFx0XHRkaXNwbGF5IGNvbmZpZ3VyYXRpb24gZmlsZSBkaXJlY3RpdmVzIHVuZGVyc3Rvb2RcbiIKICAgICAgICAgICAiICAtSSBbLV1JTklUTElTVFx0bGlzdCBvZiBtaWIgbW9kdWxlcyB0byBpbml0aWFsaXplIChvciBub3QpXG4iCiAgICAgICAgICAgIlx0XHRcdCAgKHJ1biBzbm1wZCB3aXRoIC1EbWliX2luaXQgZm9yIGEgbGlzdClcbiIKICAgICAgICAgICAiICAtTCA8TE9HT1BUUz5cdFx0dG9nZ2xlIG9wdGlvbnMgY29udHJvbGxpbmcgd2hlcmUgdG8gbG9nIHRvXG4iKTsKICAgIHNubXBfbG9nX29wdGlvbnNfdXNhZ2UoIlx0Iiwgc3Rkb3V0KTsKICAgIHByaW50ZigiICAtbSBNSUJMSVNUXHRcdHVzZSBNSUJMSVNUIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgTUlCIGxpc3RcbiIKICAgICAgICAgICAiICAtTSBESVJMSVNUXHRcdHVzZSBESVJMSVNUIGFzIHRoZSBsaXN0IG9mIGxvY2F0aW9ucyB0byBsb29rIGZvciBNSUJzXG4iCiAgICAgICAgICAgIlx0XHRcdCAgKGRlZmF1bHQgJXMpXG4lcyVzIiwKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgICAgICAgICBuZXRzbm1wX2dldF9taWJfZGlyZWN0b3J5KCksCiNlbHNlCiAgICAgICAgICAgIk1JQnMgbm90IGxvYWRlZCIsCiNlbmRpZgogICAgICAgICAgICIgIC1wIEZJTEVcdFx0c3RvcmUgcHJvY2VzcyBpZCBpbiBGSUxFXG4iCiAgICAgICAgICAgIiAgLXFcdFx0XHRwcmludCBpbmZvcm1hdGlvbiBpbiBhIG1vcmUgcGFyc2FibGUgZm9ybWF0XG4iCiAgICAgICAgICAgIiAgLXJcdFx0XHRkbyBub3QgZXhpdCBpZiBmaWxlcyBvbmx5IGFjY2Vzc2libGUgdG8gcm9vdFxuIgoJICAgIlx0XHRcdCAgY2Fubm90IGJlIG9wZW5lZFxuIgojaWZkZWYgV0lOMzJTRVJWSUNFCiAgICAgICAgICAgIiAgLXJlZ2lzdGVyXHRcdHJlZ2lzdGVyIGFzIGEgV2luZG93cyBzZXJ2aWNlXG4iCiAgICAgICAgICAgIiAgXHRcdFx0ICAoZm9sbG93ZWQgYnkgLXF1aWV0IHRvIHByZXZlbnQgbWVzc2FnZSBwb3B1cHMpXG4iCiAgICAgICAgICAgIiAgXHRcdFx0ICAoZm9sbG93ZWQgYnkgdGhlIHN0YXJ0dXAgcGFyYW1ldGVyIGxpc3QpXG4iCiAgICAgICAgICAgIiAgXHRcdFx0ICBOb3RlIHRoYXQgc29tZSBwYXJhbWV0ZXJzIGFyZSBub3QgcmVsZXZhbnQgd2hlbiBydW5uaW5nIGFzIGEgc2VydmljZVxuIgojZW5kaWYKI2lmIEhBVkVfVU5JU1REX0gKICAgICAgICAgICAiICAtdSBVSURcdFx0Y2hhbmdlIHRvIHRoaXMgdWlkIChudW1lcmljIG9yIHRleHR1YWwpIGFmdGVyXG4iCgkgICAiXHRcdFx0ICBvcGVuaW5nIHRyYW5zcG9ydCBlbmRwb2ludHNcbiIKI2VuZGlmCiNpZmRlZiBXSU4zMlNFUlZJQ0UKICAgICAgICAgICAiICAtdW5yZWdpc3Rlclx0XHR1bnJlZ2lzdGVyIGFzIGEgV2luZG93cyBzZXJ2aWNlXG4iCiAgICAgICAgICAgIiAgXHRcdFx0ICAoZm9sbG93ZWQgLXF1aWV0IHRvIHByZXZlbnQgbWVzc2FnZSBwb3B1cHMpXG4iCiNlbmRpZgogICAgICAgICAgICIgIC12LCAtLXZlcnNpb25cdFx0ZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uXG4iCiAgICAgICAgICAgIiAgLVZcdFx0XHR2ZXJib3NlIGRpc3BsYXlcbiIKI2lmIGRlZmluZWQoVVNJTkdfQUdFTlRYX1NVQkFHRU5UX01PRFVMRSl8fCBkZWZpbmVkKFVTSU5HX0FHRU5UWF9NQVNURVJfTU9EVUxFKQogICAgICAgICAgICIgIC14IEFERFJFU1NcdFx0dXNlIEFERFJFU1MgYXMgQWdlbnRYIGFkZHJlc3NcbiIKI2VuZGlmCiNpZmRlZiBVU0lOR19BR0VOVFhfU1VCQUdFTlRfTU9EVUxFCiAgICAgICAgICAgIiAgLVhcdFx0XHRydW4gYXMgYW4gQWdlbnRYIHN1YmFnZW50IHJhdGhlciB0aGFuIGFzIGFuXG4iCgkgICAiXHRcdFx0ICBTTk1QIG1hc3RlciBhZ2VudFxuIgojZW5kaWYKICAgICAgICAgICAsCiAgICAgICAgICAgIlxuRGVwcmVjYXRlZCBvcHRpb25zOlxuIgogICAgICAgICAgICIgIC1sIEZJTEVcdFx0dXNlIC1MZiA8RklMRT4gaW5zdGVhZFxuIgogICAgICAgICAgICIgIC1QXHRcdFx0dXNlIC1wIGluc3RlYWRcbiIKICAgICAgICAgICAiICAtc1x0XHRcdHVzZSAtTHNkIGluc3RlYWRcbiIKICAgICAgICAgICAiICAtUyBkfGl8MC03XHRcdHVzZSAtTHMgPGZhY2lsaXR5PiBpbnN0ZWFkXG4iCiAgICAgICAgICAgIlxuIgogICAgICAgICAgICk7CiAgICBleGl0KDEpOwp9CgpzdGF0aWMgdm9pZAp2ZXJzaW9uKHZvaWQpCnsKICAgIHByaW50ZigiXG5ORVQtU05NUCB2ZXJzaW9uOiAgJXNcbiIKICAgICAgICAgICAiV2ViOiAgICAgICAgICAgICAgIGh0dHA6Ly93d3cubmV0LXNubXAub3JnL1xuIgogICAgICAgICAgICJFbWFpbDogICAgICAgICAgICAgbmV0LXNubXAtY29kZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldFxuXG4iLAogICAgICAgICAgIG5ldHNubXBfZ2V0X3ZlcnNpb24oKSk7CiAgICBleGl0KDApOwp9CgpSRVRTSUdUWVBFClNubXBkU2h1dERvd24oaW50IGEpCnsKI2lmZGVmIFdJTjMyU0VSVklDRQogICAgZXh0ZXJuIG5ldHNubXBfc2Vzc2lvbiAqbWFpbl9zZXNzaW9uOwojZW5kaWYKICAgIG5ldHNubXBfcnVubmluZyA9IDA7CiNpZmRlZiBXSU4zMlNFUlZJQ0UKICAgIC8qCiAgICAgKiBJbiBjYXNlIG9mIHdpbmRvd3MsIHNlbGVjdCgpIGluIHJlY2VpdmUoKSBmdW5jdGlvbiB3aWxsIG5vdCByZXR1cm4gCiAgICAgKiBvbiBzaWduYWwuIFRoYXRzIHdoeSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgY2FsbGVkLCB3aGljaCBjbG9zZXMgdGhlIAogICAgICogc29ja2V0IGRlc2NyaXB0b3JzIGFuZCBjYXVzZXMgdGhlIHNlbGVjdCgpIHRvIHJldHVybgogICAgICovCiAgICBzbm1wX2Nsb3NlKG1haW5fc2Vzc2lvbik7CiNlbmRpZgp9CgojaWZkZWYgU0lHSFVQClJFVFNJR1RZUEUKU25tcGRSZWNvbmZpZyhpbnQgYSkKewogICAgcmVjb25maWcgPSAxOwogICAgc2lnbmFsKFNJR0hVUCwgU25tcGRSZWNvbmZpZyk7Cn0KI2VuZGlmCgojaWZkZWYgU0lHVVNSMQpleHRlcm4gdm9pZCAgICAgZHVtcF9yZWdpc3RyeSh2b2lkKTsKUkVUU0lHVFlQRQpTbm1wZER1bXAoaW50IGEpCnsKICAgIGR1bXBfcmVnaXN0cnkoKTsKICAgIHNpZ25hbChTSUdVU1IxLCBTbm1wZER1bXApOwp9CiNlbmRpZgoKUkVUU0lHVFlQRQpTbm1wZENhdGNoUmFuZG9tU2lnbmFsKGludCBhKQp7CiAgICAvKiBEaXNhYmxlIGFsbCBsb2dzIGFuZCBsb2cgdGhlIGVycm9yIHZpYSBzeXNsb2cgKi8KICAgIHNubXBfZGlzYWJsZV9sb2coKTsKICAgIHNubXBfZW5hYmxlX3N5c2xvZygpOwogICAgc25tcF9sb2coTE9HX0VSUiwgIkV4aXRpbmcgb24gc2lnbmFsICVkXG4iLCBhKTsKICAgIHNubXBfZGlzYWJsZV9zeXNsb2coKTsKICAgIGV4aXQoMSk7Cn0KCnN0YXRpYyB2b2lkClNubXBUcmFwTm9kZURvd24odm9pZCkKewogICAgc2VuZF9lYXN5X3RyYXAoU05NUF9UUkFQX0VOVEVSUFJJU0VTUEVDSUZJQywgMik7CiAgICAvKgogICAgICogWFhYICAyIC0gTm9kZSBEb3duICNkZWZpbmUgaXQgYXMgTk9ERV9ET1dOX1RSQVAgCiAgICAgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotby0qKioqKioKICogbWFpbiAtIE5vbiBXaW5kb3dzCiAqIFNubXBEYWVtb25NYWluIC0gV2luZG93cyB0byBzdXBwb3J0IHdpbmRvd3Mgc2VydmljZQogKgogKiBQYXJhbWV0ZXJzOgogKgkgYXJnYwogKgkqYXJndltdCiAqICAgICAgCiAqIFJldHVybnM6CiAqCTAJQWx3YXlzIHN1Y2NlZWRzLiAgKD8pCiAqCiAqCiAqIFNldHVwIGFuZCBzdGFydCB0aGUgYWdlbnQgZGFlbW9uLgogKgogKiBBbHNvIHN1Y2Nlc3NmdWxseSBFWElUcyB3aXRoIHplcm8gZm9yIHNvbWUgb3B0aW9ucy4KICovCmludAojaWZkZWYgV0lOMzJTRVJWSUNFClNubXBEYWVtb25NYWluKGludCBhcmdjLCBUQ0hBUiAqIGFyZ3ZbXSkKI2Vsc2UKbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQojZW5kaWYKewogICAgY2hhciAgICAgICAgICAgIG9wdGlvbnNbMTI4XSA9ICJhQWM6Q2REOjpmaEhJOmw6TDptOk06bjpwOlA6cXJzUzpVdlYtOlk6IjsKICAgIGludCAgICAgICAgICAgICBhcmcsIGksIHJldDsKICAgIGludCAgICAgICAgICAgICBkb250X2ZvcmsgPSAwLCBkb19oZWxwID0gMDsKICAgIGludCAgICAgICAgICAgICBsb2dfc2V0ID0gMDsKICAgIGludCAgICAgICAgICAgICBhZ2VudF9tb2RlID0gLTE7CiAgICBjaGFyICAgICAgICAgICAqY3B0ciwgKiphcmd2cHRyOwogICAgY2hhciAgICAgICAgICAgKnBpZF9maWxlID0gTlVMTDsKICAgIGNoYXIgICAgICAgICAgICBvcHRpb25fY29tcGF0YWJpbGl0eVtdID0gIi1MZSI7CiNpZiBIQVZFX0dFVFBJRAogICAgaW50IGZkOwogICAgRklMRSAgICAgICAgICAgKlBJRDsKI2VuZGlmCiNpZiBIQVZFX0dFVFBXTkFNICYmIEhBVkVfUFdEX0gKICAgIHN0cnVjdCBwYXNzd2QgICppbmZvOwojZW5kaWYKCiNpZm5kZWYgV0lOMzIKICAgIC8qCiAgICAgKiBjbG9zZSBhbGwgbm9uLXN0YW5kYXJkIGZpbGUgZGVzY3JpcHRvcnMgd2UgbWF5IGhhdmUKICAgICAqIGluaGVyaXRlZCBmcm9tIHRoZSBzaGVsbC4KICAgICAqLwogICAgZm9yIChpID0gZ2V0ZHRhYmxlc2l6ZSgpIC0gMTsgaSA+IDI7IC0taSkgewogICAgICAgICh2b2lkKSBjbG9zZShpKTsKICAgIH0KI2VuZGlmIC8qICNXSU4zMiAqLwogICAgCiAgICAvKgogICAgICogcmVnaXN0ZXIgc2lnbmFscyBBU0FQIHRvIHByZXZlbnQgZGVmYXVsdCBhY3Rpb24gKHVzdWFsbHkgY29yZSkKICAgICAqIGZvciBzaWduYWxzIGR1cmluZyBzdGFydHVwLi4uCiAgICAgKi8KI2lmZGVmIFNJR1RFUk0KICAgIERFQlVHTVNHVEwoKCJzaWduYWwiLCAicmVnaXN0ZXJpbmcgU0lHVEVSTSBzaWduYWwgaGFuZGxlclxuIikpOwogICAgc2lnbmFsKFNJR1RFUk0sIFNubXBkU2h1dERvd24pOwojZW5kaWYKI2lmZGVmIFNJR0lOVAogICAgREVCVUdNU0dUTCgoInNpZ25hbCIsICJyZWdpc3RlcmluZyBTSUdJTlQgc2lnbmFsIGhhbmRsZXJcbiIpKTsKICAgIHNpZ25hbChTSUdJTlQsIFNubXBkU2h1dERvd24pOwojZW5kaWYKI2lmZGVmIFNJR0hVUAogICAgc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7ICAgLyogZG8gbm90IHRlcm1pbmF0ZSBvbiBlYXJseSBTSUdIVVAgKi8KI2VuZGlmCiNpZmRlZiBTSUdVU1IxCiAgICBERUJVR01TR1RMKCgic2lnbmFsIiwgInJlZ2lzdGVyaW5nIFNJR1VTUjEgc2lnbmFsIGhhbmRsZXJcbiIpKTsKICAgIHNpZ25hbChTSUdVU1IxLCBTbm1wZER1bXApOwojZW5kaWYKI2lmZGVmIFNJR1BJUEUKICAgIERFQlVHTVNHVEwoKCJzaWduYWwiLCAicmVnaXN0ZXJpbmcgU0lHUElQRSBzaWduYWwgaGFuZGxlclxuIikpOwogICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOyAgIC8qICdJbmxpbmUnIGZhaWx1cmUgb2Ygd2F5d2FyZCByZWFkZXJzICovCiNlbmRpZgojaWZkZWYgU0lHWEZTWgogICAgc2lnbmFsKFNJR1hGU1osIFNubXBkQ2F0Y2hSYW5kb21TaWduYWwpOwojZW5kaWYKCiNpZmRlZiBORVRTTk1QX05PX1JPT1RfQUNDRVNTCiAgICAvKgogICAgICogRGVmYXVsdCB0byBuby4gIAogICAgICovCiAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkgICBORVRTTk1QX0RTX0FHRU5UX05PX1JPT1RfQUNDRVNTLCAxKTsKI2VuZGlmCiAgICAvKgogICAgICogRGVmYXVsdCB0byBOT1QgcnVubmluZyBhbiBBZ2VudFggbWFzdGVyLiAgCiAgICAgKi8KICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCSAgIE5FVFNOTVBfRFNfQUdFTlRfQUdFTlRYX01BU1RFUiwgMCk7CiAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0FHRU5UX0FHRU5UWF9USU1FT1VULCAtMSk7CiAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0FHRU5UX0FHRU5UWF9SRVRSSUVTLCAtMSk7CgogICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19BR0VOVF9DQUNIRV9USU1FT1VULCA1KTsKICAgIC8qCiAgICAgKiBBZGQgc29tZSBvcHRpb25zIGlmIHRoZXkgYXJlIGF2YWlsYWJsZS4gIAogICAgICovCiNpZiBIQVZFX1VOSVNURF9ICiAgICBzdHJjYXQob3B0aW9ucywgImc6dToiKTsKI2VuZGlmCiNpZiBkZWZpbmVkKFVTSU5HX0FHRU5UWF9TVUJBR0VOVF9NT0RVTEUpfHwgZGVmaW5lZChVU0lOR19BR0VOVFhfTUFTVEVSX01PRFVMRSkKICAgIHN0cmNhdChvcHRpb25zLCAieDoiKTsKI2VuZGlmCiNpZmRlZiBVU0lOR19BR0VOVFhfU1VCQUdFTlRfTU9EVUxFCiAgICBzdHJjYXQob3B0aW9ucywgIlgiKTsKI2VuZGlmCgogICAgLyoKICAgICAqIFRoaXMgaXMgaW5jcmVkaWJseSB1Z2x5LCBidXQgaXQncyBwcm9iYWJseSB0aGUgc2ltcGxlc3Qgd2F5CiAgICAgKiAgdG8gaGFuZGxlIHRoZSBvbGQgJy1MJyBvcHRpb24gYXMgd2VsbCBhcyB0aGUgbmV3ICctTHgnIHN0eWxlCiAgICAgKi8KICAgIGZvciAoaT0wOyBpPGFyZ2M7IGkrKykgewogICAgICAgIGlmICghc3RyY21wKGFyZ3ZbaV0sICItTCIpKQogICAgICAgICAgICBhcmd2W2ldID0gb3B0aW9uX2NvbXBhdGFiaWxpdHk7ICAgICAgICAgICAgCiAgICB9CgojaWZkZWYgV0lOMzIKICAgIHNubXBfbG9nX3N5c2xvZ25hbWUoYXBwX25hbWVfbG9uZyk7CiNlbHNlCiAgICBzbm1wX2xvZ19zeXNsb2duYW1lKGFwcF9uYW1lKTsKI2VuZGlmCiAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0FQUFRZUEUsIGFwcF9uYW1lKTsKCiAgICAvKgogICAgICogTm93IHByb2Nlc3Mgb3B0aW9ucyBub3JtYWxseS4gIAogICAgICovCiAgICB3aGlsZSAoKGFyZyA9IGdldG9wdChhcmdjLCBhcmd2LCBvcHRpb25zKSkgIT0gRU9GKSB7CiAgICAgICAgc3dpdGNoIChhcmcpIHsKICAgICAgICBjYXNlICctJzoKICAgICAgICAgICAgaWYgKHN0cmNhc2VjbXAob3B0YXJnLCAiaGVscCIpID09IDApIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJjYXNlY21wKG9wdGFyZywgInZlcnNpb24iKSA9PSAwKSB7CiAgICAgICAgICAgICAgICB2ZXJzaW9uKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGhhbmRsZV9sb25nX29wdChvcHRhcmcpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgIGxvZ19hZGRyZXNzZXMrKzsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ0EnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9BUFBFTkRfTE9HRklMRVMsIDEpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnYyc6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkgICAgICBORVRTTk1QX0RTX0xJQl9PUFRJT05BTENPTkZJRywgb3B0YXJnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdDJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJICAgTkVUU05NUF9EU19MSUJfRE9OVF9SRUFEX0NPTkZJR1MsIDEpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgIHNubXBfc2V0X2R1bXBfcGFja2V0KCsrc25tcF9kdW1wX3BhY2tldCk7CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICBORVRTTk1QX0RTX0FHRU5UX1ZFUkJPU0UsIDEpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnRCc6CiAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyX3Rva2VucyhvcHRhcmcpOwogICAgICAgICAgICBzbm1wX3NldF9kb19kZWJ1Z2dpbmcoMSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdmJzoKICAgICAgICAgICAgZG9udF9mb3JrID0gMTsKICAgICAgICAgICAgYnJlYWs7CgojaWYgSEFWRV9VTklTVERfSAogICAgICAgIGNhc2UgJ2cnOgogICAgICAgICAgICBpZiAob3B0YXJnICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICplY3A7CiAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgZ2lkOwoKICAgICAgICAgICAgICAgIGdpZCA9IHN0cnRvdWwob3B0YXJnLCAmZWNwLCAxMCk7CiAgICAgICAgICAgICAgICBpZiAoKmVjcCkgewojaWYgSEFWRV9HRVRQV05BTSAmJiBIQVZFX1BXRF9ICiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdyb3VwICAqaW5mbzsKICAgICAgICAgICAgICAgICAgICBpbmZvID0gZ2V0Z3JuYW0ob3B0YXJnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbykgewogICAgICAgICAgICAgICAgICAgICAgICBnaWQgPSBpbmZvLT5ncl9naWQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQmFkIGdyb3VwIGlkOiAlc1xuIiwgb3B0YXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKI2lmIEhBVkVfR0VUUFdOQU0gJiYgSEFWRV9QV0RfSAogICAgICAgICAgICAgICAgICAgIH0KI2VuZGlmCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICBORVRTTk1QX0RTX0FHRU5UX0dST1VQSUQsIGdpZCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKI2VuZGlmCgogICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ0gnOgogICAgICAgICAgICBkb19oZWxwID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ0knOgogICAgICAgICAgICBpZiAob3B0YXJnICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIGFkZF90b19pbml0X2xpc3Qob3B0YXJnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdsJzoKICAgICAgICAgICAgcHJpbnRmKCJXYXJuaW5nOiAtbCBvcHRpb24gaXMgZGVwcmVjYXRlZCwgdXNlIC1MZiA8ZmlsZT4gaW5zdGVhZFxuIik7CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgaWYgKHN0cmxlbihvcHRhcmcpID4gUEFUSF9NQVgpIHsKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogbG9nZmlsZSBwYXRoIHRvbyBsb25nIChsaW1pdCAlZCBjaGFycylcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2WzBdLCBQQVRIX01BWCk7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNubXBfZW5hYmxlX2ZpbGVsb2cob3B0YXJnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9BUFBFTkRfTE9HRklMRVMpKTsKICAgICAgICAgICAgICAgIGxvZ19zZXQgPSAxOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ0wnOgoJICAgIGlmICAoc25tcF9sb2dfb3B0aW9ucyggb3B0YXJnLCBhcmdjLCBhcmd2ICkgPCAwICkgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbG9nX3NldCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgaWYgKG9wdGFyZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBzZXRlbnYoIk1JQlMiLCBvcHRhcmcsIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ00nOgogICAgICAgICAgICBpZiAob3B0YXJnICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIHNldGVudigiTUlCRElSUyIsIG9wdGFyZywgMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnbic6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgYXBwX25hbWUgPSBvcHRhcmc7CiAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0FQUFRZUEUsIGFwcF9uYW1lKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdQJzoKICAgICAgICAgICAgcHJpbnRmKCJXYXJuaW5nOiAtUCBvcHRpb24gaXMgZGVwcmVjYXRlZCwgdXNlIC1wIGluc3RlYWRcbiIpOwogICAgICAgIGNhc2UgJ3AnOgogICAgICAgICAgICBpZiAob3B0YXJnICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIHBpZF9maWxlID0gb3B0YXJnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ3EnOgogICAgICAgICAgICBzbm1wX3NldF9xdWlja19wcmludCgxKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ3InOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgICAgTkVUU05NUF9EU19BR0VOVF9OT19ST09UX0FDQ0VTUyk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgcHJpbnRmKCJXYXJuaW5nOiAtcyBvcHRpb24gaXMgZGVwcmVjYXRlZCwgdXNlIC1Mc2QgaW5zdGVhZFxuIik7CiAgICAgICAgICAgIHNubXBfZW5hYmxlX3N5c2xvZygpOwogICAgICAgICAgICBsb2dfc2V0ID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ1MnOgogICAgICAgICAgICBwcmludGYoIldhcm5pbmc6IC1TIG9wdGlvbiBpcyBkZXByZWNhdGVkLCB1c2UgLUxzIDxmYWNpbGl0eT4gaW5zdGVhZFxuIik7CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgc3dpdGNoICgqb3B0YXJnKSB7CiAgICAgICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICAgIGNhc2UgJ0QnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0RBRU1PTjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2knOgogICAgICAgICAgICAgICAgY2FzZSAnSSc6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfSU5GTzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzAnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMMDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzEnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMMTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzInOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMMjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzMnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMMzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzQnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMNDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzUnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMNTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzYnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMNjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzcnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMNzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIHN5c2xvZyBmYWNpbGl0eTogLVMlY1xuIiwqb3B0YXJnKTsKICAgICAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNubXBfZW5hYmxlX3N5c2xvZ19pZGVudChzbm1wX2xvZ19zeXNsb2duYW1lKE5VTEwpLCBGYWNpbGl0eSk7CiAgICAgICAgICAgICAgICBsb2dfc2V0ID0gMTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibm8gc3lzbG9nIGZhY2lsaXR5IHNwZWNpZmllZFxuIik7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnVSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICAgICBORVRTTk1QX0RTX0FHRU5UX0xFQVZFX1BJREZJTEUpOwogICAgICAgICAgICBicmVhazsKCiNpZiBIQVZFX1VOSVNURF9ICiAgICAgICAgY2FzZSAndSc6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgKmVjcDsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICB1aWQ7CgogICAgICAgICAgICAgICAgdWlkID0gc3RydG91bChvcHRhcmcsICZlY3AsIDEwKTsKICAgICAgICAgICAgICAgIGlmICgqZWNwKSB7CiNpZiBIQVZFX0dFVFBXTkFNICYmIEhBVkVfUFdEX0gKICAgICAgICAgICAgICAgICAgICBpbmZvID0gZ2V0cHduYW0ob3B0YXJnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbykgewogICAgICAgICAgICAgICAgICAgICAgICB1aWQgPSBpbmZvLT5wd191aWQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQmFkIHVzZXIgaWQ6ICVzXG4iLCBvcHRhcmcpOwogICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwojaWYgSEFWRV9HRVRQV05BTSAmJiBIQVZFX1BXRF9ICiAgICAgICAgICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgIE5FVFNOTVBfRFNfQUdFTlRfVVNFUklELCB1aWQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiNlbmRpZgoKICAgICAgICBjYXNlICd2JzoKICAgICAgICAgICAgdmVyc2lvbigpOwoKICAgICAgICBjYXNlICdWJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgIE5FVFNOTVBfRFNfQUdFTlRfVkVSQk9TRSwgMSk7CiAgICAgICAgICAgIGJyZWFrOwoKI2lmIGRlZmluZWQoVVNJTkdfQUdFTlRYX1NVQkFHRU5UX01PRFVMRSl8fCBkZWZpbmVkKFVTSU5HX0FHRU5UWF9NQVNURVJfTU9EVUxFKQogICAgICAgIGNhc2UgJ3gnOgogICAgICAgICAgICBpZiAob3B0YXJnICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X3N0cmluZyhORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgICAgIE5FVFNOTVBfRFNfQUdFTlRfWF9TT0NLRVQsIG9wdGFyZyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgTkVUU05NUF9EU19BR0VOVF9BR0VOVFhfTUFTVEVSLCAxKTsKICAgICAgICAgICAgYnJlYWs7CiNlbmRpZgoKICAgICAgICBjYXNlICdYJzoKI2lmIGRlZmluZWQoVVNJTkdfQUdFTlRYX1NVQkFHRU5UX01PRFVMRSkKICAgICAgICAgICAgYWdlbnRfbW9kZSA9IFNVQl9BR0VOVDsKI2Vsc2UKICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogSWxsZWdhbCBhcmd1bWVudCAtWDoiCgkJICAgICAgICAgICAgIkFnZW50WCBzdXBwb3J0IG5vdCBjb21waWxlZCBpbi5cbiIsIGFyZ3ZbMF0pOwogICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgZXhpdCgxKTsKI2VuZGlmCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdZJzoKICAgICAgICAgICAgbmV0c25tcF9jb25maWdfcmVtZW1iZXIob3B0YXJnKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgaWYgKGRvX2hlbHApIHsKICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19BR0VOVF9OT19ST09UX0FDQ0VTUywgMSk7CiAgICAgICAgaW5pdF9hZ2VudChhcHBfbmFtZSk7ICAgICAgICAvKiByZWdpc3RlciBvdXIgLmNvbmYgaGFuZGxlcnMgKi8KICAgICAgICBpbml0X21pYl9tb2R1bGVzKCk7CiAgICAgICAgaW5pdF9zbm1wKGFwcF9uYW1lKTsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcyB1bmRlcnN0b29kOlxuIik7CiAgICAgICAgcmVhZF9jb25maWdfcHJpbnRfdXNhZ2UoIiAgIik7CiAgICAgICAgZXhpdCgwKTsKICAgIH0KCiAgICBpZiAob3B0aW5kIDwgYXJnYykgewogICAgICAgIC8qCiAgICAgICAgICogVGhlcmUgYXJlIG9wdGlvbmFsIHRyYW5zcG9ydCBhZGRyZXNzZXMgb24gdGhlIGNvbW1hbmQgbGluZS4gIAogICAgICAgICAqLwogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZC9tYWluIiwgIm9wdGluZCAlZCwgYXJnYyAlZFxuIiwgb3B0aW5kLCBhcmdjKSk7CiAgICAgICAgZm9yIChpID0gb3B0aW5kOyBpIDwgYXJnYzsgaSsrKSB7CiAgICAgICAgICAgIGNoYXIgKmMsICphc3RyaW5nOwogICAgICAgICAgICBpZiAoKGMgPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkJICAgTkVUU05NUF9EU19BR0VOVF9QT1JUUykpKSB7CiAgICAgICAgICAgICAgICBhc3RyaW5nID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4oYykgKyAyICsgc3RybGVuKGFyZ3ZbaV0pKTsKICAgICAgICAgICAgICAgIGlmIChhc3RyaW5nID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1hbGxvYyBmYWlsdXJlIHByb2Nlc3NpbmcgYXJndlslZF1cbiIsIGkpOwogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzcHJpbnRmKGFzdHJpbmcsICIlcywlcyIsIGMsIGFyZ3ZbaV0pOwogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgICAgTkVUU05NUF9EU19BR0VOVF9QT1JUUywgYXN0cmluZyk7CiAgICAgICAgICAgICAgICBTTk1QX0ZSRUUoYXN0cmluZyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICAgICBORVRTTk1QX0RTX0FHRU5UX1BPUlRTLCBhcmd2W2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBERUJVR01TR1RMKCgic25tcGQvbWFpbiIsICJwb3J0IHNwZWM6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCQkgIE5FVFNOTVBfRFNfQUdFTlRfUE9SVFMpKSk7CiAgICB9CgojaWZkZWYgTkVUU05NUF9MT0dGSUxFCiAgICBpZiAoMCA9PSBsb2dfc2V0KQogICAgICAgIHNubXBfZW5hYmxlX2ZpbGVsb2coTkVUU05NUF9MT0dGSUxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0FQUEVORF9MT0dGSUxFUykpOwojZW5kaWYKCiAgICAvKgogICAgICogSW5pdGlhbGl6ZSBhIGFyZ3Ygc2V0IHRvIHRoZSBjdXJyZW50IGZvciByZXN0YXJ0aW5nIHRoZSBhZ2VudC4gICAKICAgICAqLwogICAgYXJndnJlc3RhcnRwID0gKGNoYXIgKiopbWFsbG9jKChhcmdjICsgMikgKiBzaXplb2YoY2hhciAqKSk7CiAgICBhcmd2cHRyID0gYXJndnJlc3RhcnRwOwogICAgZm9yIChpID0gMCwgcmV0ID0gMTsgaSA8IGFyZ2M7IGkrKykgewogICAgICAgIHJldCArPSBzdHJsZW4oYXJndltpXSkgKyAxOwogICAgfQogICAgYXJndnJlc3RhcnQgPSAoY2hhciAqKSBtYWxsb2MocmV0KTsKICAgIGFyZ3ZyZXN0YXJ0bmFtZSA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oYXJndlswXSkgKyAxKTsKICAgIGlmICghYXJndnJlc3RhcnRwIHx8ICFhcmd2cmVzdGFydCB8fCAhYXJndnJlc3RhcnRuYW1lKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWxsb2MgZmFpbHVyZSBwcm9jZXNzaW5nIGFyZ3ZyZXN0YXJ0XG4iKTsKICAgICAgICBleGl0KDEpOwogICAgfQogICAgc3RyY3B5KGFyZ3ZyZXN0YXJ0bmFtZSwgYXJndlswXSk7CiAgICBpZiAoYWdlbnRfbW9kZSA9PSAtMSkgewogICAgICAgIGlmIChzdHJzdHIoYXJndnJlc3RhcnRuYW1lLCAiYWdlbnR4ZCIpICE9IE5VTEwpIHsKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgIE5FVFNOTVBfRFNfQUdFTlRfUk9MRSwgU1VCX0FHRU5UKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgTkVUU05NUF9EU19BR0VOVF9ST0xFLCBNQVNURVJfQUdFTlQpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJICAgICAgIE5FVFNOTVBfRFNfQUdFTlRfUk9MRSwgYWdlbnRfbW9kZSk7CiAgICB9CgogICAgZm9yIChjcHRyID0gYXJndnJlc3RhcnQsIGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CiAgICAgICAgc3RyY3B5KGNwdHIsIGFyZ3ZbaV0pOwogICAgICAgICooYXJndnB0cisrKSA9IGNwdHI7CiAgICAgICAgY3B0ciArPSBzdHJsZW4oYXJndltpXSkgKyAxOwogICAgfQogICAgKmNwdHIgPSAwOwogICAgKmFyZ3ZwdHIgPSBOVUxMOwoKICAgIFNPQ0tfU1RBUlRVUDsKICAgIGlmIChpbml0X2FnZW50KGFwcF9uYW1lKSAhPSAwKSB7CiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIkFnZW50IGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIGluaXRfbWliX21vZHVsZXMoKTsKCiAgICAvKgogICAgICogc3RhcnQgbGlicmFyeSAKICAgICAqLwogICAgaW5pdF9zbm1wKGFwcF9uYW1lKTsKCiAgICBpZiAoKHJldCA9IGluaXRfbWFzdGVyX2FnZW50KCkpICE9IDApIHsKICAgICAgICAvKgogICAgICAgICAqIFNvbWUgZXJyb3Igb3BlbmluZyBvbmUgb2YgdGhlIHNwZWNpZmllZCBhZ2VudCB0cmFuc3BvcnRzLiAgCiAgICAgICAgICovCiAgICAgICAgRXhpdCgxKTsgICAgICAgICAgICAgICAgLyogIEV4aXQgbG9ncyBleGl0IHZhbCBmb3IgdXMgICovCiAgICB9CgogICAgLyoKICAgICAqIEluaXRpYWxpemUgdGhlIHdvcmxkLiAgRGV0YWNoIGZyb20gdGhlIHNoZWxsLiAgQ3JlYXRlIGluaXRpYWwgdXNlci4gIAogICAgICovCiAgICBpZighZG9udF9mb3JrKSB7CiAgICAgICAgaW50IHF1aXQgPSAhIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0FHRU5UX1FVSVRfSU1NRURJQVRFTFkpOwogICAgICAgIHJldCA9IG5ldHNubXBfZGFlbW9uaXplKHF1aXQsIHNubXBfc3RkZXJybG9nX3N0YXR1cygpKTsKICAgICAgICAvKgogICAgICAgICAqIHh4eC1ya3M6IGRvIHdlIGNhcmUgaWYgZm9yayBmYWlscz8gSSB0aGluayB3ZSBzaG91bGQuLi4KICAgICAgICAgKi8KICAgICAgICBpZihyZXQgIT0gMCkKICAgICAgICAgICAgRXhpdCgxKTsgICAgICAgICAgICAgICAgLyogIEV4aXQgbG9ncyBleGl0IHZhbCBmb3IgdXMgICovCiAgICB9CgojaWYgSEFWRV9HRVRQSUQKICAgIGlmIChwaWRfZmlsZSAhPSBOVUxMKSB7CiAgICAgICAgLyoKICAgICAgICAgKiB1bmxpbmsgdGhlIHBpZF9maWxlLCBpZiBpdCBleGlzdHMsIHByaW9yIHRvIG9wZW4uICBXaXRob3V0CiAgICAgICAgICogZG9pbmcgdGhpcyB0aGUgb3BlbiB3aWxsIGZhaWwgaWYgdGhlIHVzZXIgc3BlY2lmaWVkIHBpZF9maWxlCiAgICAgICAgICogYWxyZWFkeSBleGlzdHMuCiAgICAgICAgICovCiAgICAgICAgdW5saW5rKHBpZF9maWxlKTsKICAgICAgICBmZCA9IG9wZW4ocGlkX2ZpbGUsIE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX1dST05MWSwgMDYwMCk7CiAgICAgICAgaWYgKGZkID09IC0xKSB7CiAgICAgICAgICAgIHNubXBfbG9nX3BlcnJvcihwaWRfZmlsZSk7CiAgICAgICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfQUdFTlRfTk9fUk9PVF9BQ0NFU1MpKSB7CiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKChQSUQgPSBmZG9wZW4oZmQsICJ3IikpID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nX3BlcnJvcihwaWRfZmlsZSk7CiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZnByaW50ZihQSUQsICIlZFxuIiwgKGludCkgZ2V0cGlkKCkpOwogICAgICAgICAgICAgICAgZmNsb3NlKFBJRCk7CiAgICAgICAgICAgIH0KI2lmbmRlZiBfTVNDX1ZFUgogICAgICAgICAgICAvKiBUaGUgc2VxdWVuY2Ugb3BlbigpL2Zkb3BlbigpL2ZjbG9zZSgpL2Nsb3NlKCkgbWFrZXMgTVNWQyBjcmFzaCwKICAgICAgICAgICAgICAgaGVuY2Ugc2tpcCB0aGUgY2xvc2UoKSBjYWxsIHdoZW4gdXNpbmcgdGhlIE1TVkMgcnVudGltZS4gKi8KICAgICAgICAgICAgY2xvc2UoZmQpOwojZW5kaWYKICAgICAgICB9CiAgICB9CiNlbmRpZgoKI2lmIGRlZmluZWQoSEFWRV9VTklTVERfSCkgJiYgKGRlZmluZWQoSEFWRV9DSE9XTikgfHwgZGVmaW5lZChIQVZFX1NFVEdJRCkgfHwgZGVmaW5lZChIQVZFX1NFVFVJRCkpCiAgICB7CiAgICBjb25zdCBjaGFyICAgICAqcGVyc2lzdGVudF9kaXI7CiAgICBpbnQgICAgICAgICAgICAgdWlkLCBnaWQ7CgogICAgcGVyc2lzdGVudF9kaXIgPSBnZXRfcGVyc2lzdGVudF9kaXJlY3RvcnkoKTsKICAgIG1rZGlyaGllciggcGVyc2lzdGVudF9kaXIsIE5FVFNOTVBfQUdFTlRfRElSRUNUT1JZX01PREUsIDAgKTsKICAgCiAgICB1aWQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCSAgICAgTkVUU05NUF9EU19BR0VOVF9VU0VSSUQpOwogICAgZ2lkID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkgICAgIE5FVFNOTVBfRFNfQUdFTlRfR1JPVVBJRCk7CiAgICAKI2lmZGVmIEhBVkVfQ0hPV04KICAgIGlmICggdWlkICE9IDAgfHwgZ2lkICE9IDAgKQogICAgICAgIGNob3duKCBwZXJzaXN0ZW50X2RpciwgdWlkLCBnaWQgKTsKI2VuZGlmCgojaWZkZWYgSEFWRV9TRVRHSUQKICAgIGlmICgoZ2lkID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICBORVRTTk1QX0RTX0FHRU5UX0dST1VQSUQpKSA+IDApIHsKICAgICAgICBERUJVR01TR1RMKCgic25tcGQvbWFpbiIsICJDaGFuZ2luZyBnaWQgdG8gJWQuXG4iLCBnaWQpKTsKICAgICAgICBpZiAoc2V0Z2lkKGdpZCkgPT0gLTEKI2lmZGVmIEhBVkVfU0VUR1JPVVBTCiAgICAgICAgICAgIHx8IHNldGdyb3VwcygxLCAoZ2lkX3QgKikmZ2lkKSA9PSAtMQojZW5kaWYKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgIHNubXBfbG9nX3BlcnJvcigic2V0Z2lkIGZhaWxlZCIpOwogICAgICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkJTkVUU05NUF9EU19BR0VOVF9OT19ST09UX0FDQ0VTUykpIHsKICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiNlbmRpZgojaWZkZWYgSEFWRV9TRVRVSUQKICAgIGlmICgodWlkID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICBORVRTTk1QX0RTX0FHRU5UX1VTRVJJRCkpID4gMCkgewojaWYgSEFWRV9HRVRQV05BTSAmJiBIQVZFX1BXRF9IICYmIEhBVkVfSU5JVEdST1VQUwogICAgICAgIC8qCiAgICAgICAgICogU2V0IHN1cHBsZW1lbnRhcnkgZ3JvdXBzIGJlZm9yZSBjaGFuZ2luZyBVSUQKICAgICAgICAgKiAgICh3aGljaCBwcm9iYWJseSBpbnZvbHZlcyBnaXZpbmcgdXAgcHJpdmlsZWdlcykKICAgICAgICAgKi8KICAgICAgICBpbmZvID0gZ2V0cHd1aWQodWlkKTsKICAgICAgICBpZiAoaW5mbykgewogICAgICAgICAgICBERUJVR01TR1RMKCgic25tcGQvbWFpbiIsICJTdXBwbGVtZW50YXJ5IGdyb3VwcyBmb3IgJXMuXG4iLCBpbmZvLT5wd19uYW1lKSk7CiAgICAgICAgICAgIGlmIChpbml0Z3JvdXBzKGluZm8tPnB3X25hbWUsIChnaWQgIT0gMCA/IChnaWRfdClnaWQgOiBpbmZvLT5wd19naWQpKSA9PSAtMSkgewogICAgICAgICAgICAgICAgc25tcF9sb2dfcGVycm9yKCJpbml0Z3JvdXBzIGZhaWxlZCIpOwogICAgICAgICAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfQUdFTlRfTk9fUk9PVF9BQ0NFU1MpKSB7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KI2VuZGlmCiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkL21haW4iLCAiQ2hhbmdpbmcgdWlkIHRvICVkLlxuIiwgdWlkKSk7CiAgICAgICAgaWYgKHNldHVpZCh1aWQpID09IC0xKSB7CiAgICAgICAgICAgIHNubXBfbG9nX3BlcnJvcigic2V0dWlkIGZhaWxlZCIpOwogICAgICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkJTkVUU05NUF9EU19BR0VOVF9OT19ST09UX0FDQ0VTUykpIHsKICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiNlbmRpZgogICAgfQojZW5kaWYKCiAgICAvKgogICAgICogU3RvcmUgcGVyc2lzdGVudCBkYXRhIGltbWVkaWF0ZWx5IGluIGNhc2Ugd2UgY3Jhc2ggbGF0ZXIuICAKICAgICAqLwogICAgc25tcF9zdG9yZShhcHBfbmFtZSk7CgojaWZkZWYgU0lHSFVQCiAgICBERUJVR01TR1RMKCgic2lnbmFsIiwgInJlZ2lzdGVyaW5nIFNJR0hVUCBzaWduYWwgaGFuZGxlclxuIikpOwogICAgc2lnbmFsKFNJR0hVUCwgU25tcGRSZWNvbmZpZyk7CiNlbmRpZgoKICAgIC8qCiAgICAgKiBTZW5kIGNvbGRzdGFydCB0cmFwIGlmIHBvc3NpYmxlLiAgCiAgICAgKi8KICAgIHNlbmRfZWFzeV90cmFwKDAsIDApOwoKICAgIC8qCiAgICAgKiBXZSdyZSB1cCwgbG9nIG91ciB2ZXJzaW9uIG51bWJlci4gIAogICAgICovCiAgICBzbm1wX2xvZyhMT0dfSU5GTywgIk5FVC1TTk1QIHZlcnNpb24gJXNcbiIsIG5ldHNubXBfZ2V0X3ZlcnNpb24oKSk7CiNpZmRlZiBXSU4zMlNFUlZJQ0UKICAgIGFnZW50X3N0YXR1cyA9IEFHRU5UX1JVTk5JTkc7CiNlbmRpZgogICAgbmV0c25tcF9hZGRyY2FjaGVfaW5pdGlhbGlzZSgpOwoKICAgIC8qCiAgICAgKiBGb3JldmVyIG1vbml0b3IgdGhlIGRlc3RfcG9ydCBmb3IgaW5jb21pbmcgUERVcy4gIAogICAgICovCiAgICBERUJVR01TR1RMKCgic25tcGQvbWFpbiIsICJXZSdyZSB1cC4gIFN0YXJ0aW5nIHRvIHByb2Nlc3MgZGF0YS5cbiIpKTsKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCU5FVFNOTVBfRFNfQUdFTlRfUVVJVF9JTU1FRElBVEVMWSkpCiAgICAgICAgcmVjZWl2ZSgpOwogICAgREVCVUdNU0dUTCgoInNubXBkL21haW4iLCAic2VuZGluZyBzaHV0ZG93biB0cmFwXG4iKSk7CiAgICBTbm1wVHJhcE5vZGVEb3duKCk7CiAgICBERUJVR01TR1RMKCgic25tcGQvbWFpbiIsICJCeWUuLi5cbiIpKTsKICAgIHNubXBfc2h1dGRvd24oYXBwX25hbWUpOwogICAgc2h1dGRvd25fbWFzdGVyX2FnZW50KCk7CiAgICBzaHV0ZG93bl9hZ2VudCgpOwoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCU5FVFNOTVBfRFNfQUdFTlRfTEVBVkVfUElERklMRSkgJiYKCShwaWRfZmlsZSAhPSBOVUxMKSkgewogICAgICAgIHVubGluayhwaWRfZmlsZSk7CiAgICB9CiNpZmRlZiBXSU4zMlNFUlZJQ0UKICAgIGFnZW50X3N0YXR1cyA9IEFHRU5UX1NUT1BQRUQ7CiNlbmRpZgoKICAgIFNOTVBfRlJFRShhcmd2cmVzdGFydG5hbWUpOwogICAgU05NUF9GUkVFKGFyZ3ZyZXN0YXJ0KTsKICAgIFNOTVBfRlJFRShhcmd2cmVzdGFydHApOwogICAgU09DS19DTEVBTlVQOwogICAgcmV0dXJuIDA7Cn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG1haW4oKSAtLSBzbm1wZCAqLwoKI2lmIGRlZmluZWQoV0lOMzIpCgojaW5jbHVkZSA8cHJvY2Vzcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wX2Fzc2VydC5oPgoKc3RhdGljIHVuc2lnbmVkIHNfdGhyZWFkaWQ7CkhBTkRMRSBzX3RocmVhZF9oYW5kbGU7CgpzdGF0aWMgdW5zaWduZWQgX19zdGRjYWxsIHdhaXRfZm9yX3N0ZGluKHZvaWQqIGFyZykKewogICAgaWYgKGdldGMoc3RkaW4pICE9IEVPRikKICAgICAgICBuZXRzbm1wX3J1bm5pbmcgPSAwOwogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIGNyZWF0ZV9zdGRpbl93YWl0ZXJfdGhyZWFkKHZvaWQpCnsKICAgIG5ldHNubXBfYXNzZXJ0KHNfdGhyZWFkX2hhbmRsZSA9PSAwKTsKICAgIHNfdGhyZWFkX2hhbmRsZSA9IChIQU5ETEUpX2JlZ2ludGhyZWFkZXgoMCwgMCwgd2FpdF9mb3Jfc3RkaW4sIDAsIDAsICZzX3RocmVhZGlkKTsKICAgIG5ldHNubXBfYXNzZXJ0KHNfdGhyZWFkX2hhbmRsZSAhPSAwKTsKfQoKc3RhdGljIHZvaWQgam9pbl9zdGRpbl93YWl0ZXJfdGhyZWFkKHZvaWQpCnsKICAgIGludCByZXN1bHQ7CgogICAgbmV0c25tcF9hc3NlcnQoc190aHJlYWRfaGFuZGxlICE9IDApOwogICAgcmVzdWx0ID0gV2FpdEZvclNpbmdsZU9iamVjdChzX3RocmVhZF9oYW5kbGUsIDEwMDApOwogICAgbmV0c25tcF9hc3NlcnQocmVzdWx0ICE9IFdBSVRfVElNRU9VVCk7CiAgICBDbG9zZUhhbmRsZShzX3RocmVhZF9oYW5kbGUpOwogICAgc190aHJlYWRfaGFuZGxlID0gMDsKfQojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHJlY2VpdmUKICoKICogUGFyYW1ldGVyczoKICogICAgICAKICogUmV0dXJuczoKICoJMAlPbiBzdWNjZXNzLgogKgktMQlTeXN0ZW0gZXJyb3IuCiAqCiAqIEluZmluaXRlIHdoaWxlLWxvb3Agd2hpY2ggbW9uaXRvcnMgaW5jb21pbmcgbWVzc2FnZXMgZm9yIHRoZSBhZ2VudC4KICogSW52b2tlIHRoZSBlc3RhYmxpc2hlZCBtZXNzYWdlIGhhbmRsZXJzIGZvciBpbmNvbWluZyBtZXNzYWdlcyBvbiBhIHBlcgogKiBwb3J0IGJhc2lzLiAgSGFuZGxlIHRpbWVvdXRzLgogKi8Kc3RhdGljIGludApyZWNlaXZlKHZvaWQpCnsKICAgIGludCAgICAgICAgICAgICBudW1mZHM7CiAgICBuZXRzbm1wX2xhcmdlX2ZkX3NldCByZWFkZmRzLCB3cml0ZWZkcywgZXhjZXB0ZmRzOwogICAgc3RydWN0IHRpbWV2YWwgIHRpbWVvdXQsICp0dnAgPSAmdGltZW91dDsKICAgIGludCAgICAgICAgICAgICBjb3VudCwgYmxvY2ssIGk7CiNpZmRlZglVU0lOR19TTVVYX01PRFVMRQogICAgaW50ICAgICAgICAgICAgIHNkOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVTSU5HX1NNVVhfTU9EVUxFICovCgogICAgbmV0c25tcF9sYXJnZV9mZF9zZXRfaW5pdCgmcmVhZGZkcywgRkRfU0VUU0laRSk7CiAgICBuZXRzbm1wX2xhcmdlX2ZkX3NldF9pbml0KCZ3cml0ZWZkcywgRkRfU0VUU0laRSk7CiAgICBuZXRzbm1wX2xhcmdlX2ZkX3NldF9pbml0KCZleGNlcHRmZHMsIEZEX1NFVFNJWkUpOwoKICAgIC8qCiAgICAgKiBpZ25vcmUgZWFybHkgc2lnaHVwIGR1cmluZyBzdGFydHVwCiAgICAgKi8KICAgIHJlY29uZmlnID0gMDsKCiNpZiBkZWZpbmVkKFdJTjMyKQogICAgY3JlYXRlX3N0ZGluX3dhaXRlcl90aHJlYWQoKTsKI2VuZGlmCgogICAgLyoKICAgICAqIExvb3AtZm9yZXZlcjogZXhlY3V0ZSBtZXNzYWdlIGhhbmRsZXJzIGZvciBzb2NrZXRzIHdpdGggZGF0YQogICAgICovCiAgICB3aGlsZSAobmV0c25tcF9ydW5uaW5nKSB7CiAgICAgICAgaWYgKHJlY29uZmlnKSB7CiNpZiBIQVZFX1NJR0hPTEQKICAgICAgICAgICAgc2lnaG9sZChTSUdIVVApOwojZW5kaWYKICAgICAgICAgICAgcmVjb25maWcgPSAwOwogICAgICAgICAgICBzbm1wX2xvZyhMT0dfSU5GTywgIlJlY29uZmlndXJpbmcgZGFlbW9uXG4iKTsKCSAgICAvKiAgU3RvcCBhbmQgcmVzdGFydCBsb2dnaW5nLiAgVGhpcyBhbGxvd3MgbG9nZmlsZXMgdG8gYmUKCQlyb3RhdGVkIGV0Yy4gICovCgkgICAgbmV0c25tcF9sb2dnaW5nX3Jlc3RhcnQoKTsKCSAgICBzbm1wX2xvZyhMT0dfSU5GTywgIk5FVC1TTk1QIHZlcnNpb24gJXMgcmVzdGFydGVkXG4iLAoJCSAgICAgbmV0c25tcF9nZXRfdmVyc2lvbigpKTsKICAgICAgICAgICAgdXBkYXRlX2NvbmZpZygpOwogICAgICAgICAgICBzZW5kX2Vhc3lfdHJhcChTTk1QX1RSQVBfRU5URVJQUklTRVNQRUNJRklDLCAzKTsKI2lmIEhBVkVfU0lHSE9MRAogICAgICAgICAgICBzaWdyZWxzZShTSUdIVVApOwojZW5kaWYKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogZGVmYXVsdCB0byBzbGVlcGluZyBmb3IgYSByZWFsbHkgbG9uZyB0aW1lLiBJTlRfTUFYCiAgICAgICAgICogc2hvdWxkIGJlIHN1ZmZpY2llbnQgKGVnIHdlIGRvbid0IGNhcmUgaWYgdGltZV90IGlzCiAgICAgICAgICogYSBsb25nIHRoYXQncyBiaWdnZXIgdGhhbiBhbiBpbnQpLgogICAgICAgICAqLwogICAgICAgIHR2cCA9ICZ0aW1lb3V0OwogICAgICAgIHR2cC0+dHZfc2VjID0gSU5UX01BWDsKICAgICAgICB0dnAtPnR2X3VzZWMgPSAwOwoKICAgICAgICBudW1mZHMgPSAwOwogICAgICAgIE5FVFNOTVBfTEFSR0VfRkRfWkVSTygmcmVhZGZkcyk7CiAgICAgICAgTkVUU05NUF9MQVJHRV9GRF9aRVJPKCZ3cml0ZWZkcyk7CiAgICAgICAgTkVUU05NUF9MQVJHRV9GRF9aRVJPKCZleGNlcHRmZHMpOwogICAgICAgIGJsb2NrID0gMDsKICAgICAgICBzbm1wX3NlbGVjdF9pbmZvMigmbnVtZmRzLCAmcmVhZGZkcywgdHZwLCAmYmxvY2spOwogICAgICAgIGlmIChibG9jayA9PSAxKSB7CiAgICAgICAgICAgIHR2cCA9IE5VTEw7ICAgICAgICAgLyogYmxvY2sgd2l0aG91dCB0aW1lb3V0ICovCgl9CgojaWZkZWYJVVNJTkdfU01VWF9NT0RVTEUKICAgICAgICBpZiAoc211eF9saXN0ZW5fc2QgPj0gMCkgewogICAgICAgICAgICBORVRTTk1QX0xBUkdFX0ZEX1NFVChzbXV4X2xpc3Rlbl9zZCwgJnJlYWRmZHMpOwogICAgICAgICAgICBudW1mZHMgPQogICAgICAgICAgICAgICAgc211eF9saXN0ZW5fc2QgPj0gbnVtZmRzID8gc211eF9saXN0ZW5fc2QgKyAxIDogbnVtZmRzOwoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNtdXhfc25tcF9zZWxlY3RfbGlzdF9nZXRfbGVuZ3RoKCk7IGkrKykgewogICAgICAgICAgICAgICAgc2QgPSBzbXV4X3NubXBfc2VsZWN0X2xpc3RfZ2V0X1NEX2Zyb21fTGlzdChpKTsKICAgICAgICAgICAgICAgIGlmIChzZCAhPSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgTkVUU05NUF9MQVJHRV9GRF9TRVQoc2QsICZyZWFkZmRzKTsKICAgICAgICAgICAgICAgICAgIG51bWZkcyA9IHNkID49IG51bWZkcyA/IHNkICsgMSA6IG51bWZkczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVU0lOR19TTVVYX01PRFVMRSAqLwoKICAgICAgICBuZXRzbm1wX2V4dGVybmFsX2V2ZW50X2luZm8yKCZudW1mZHMsICZyZWFkZmRzLCAmd3JpdGVmZHMsICZleGNlcHRmZHMpOwoKICAgIHJlc2VsZWN0OgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fRVhURVJOQUxfU0lHUzsgaSsrKSB7CiAgICAgICAgICAgIGlmIChleHRlcm5hbF9zaWduYWxfc2NoZWR1bGVkW2ldKSB7CiAgICAgICAgICAgICAgICBleHRlcm5hbF9zaWduYWxfc2NoZWR1bGVkW2ldLS07CiAgICAgICAgICAgICAgICBleHRlcm5hbF9zaWduYWxfaGFuZGxlcltpXShpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkL3NlbGVjdCIsICJzZWxlY3QoIG51bWZkcz0lZCwgLi4uLCB0dnA9JXApXG4iLAogICAgICAgICAgICAgICAgICAgIG51bWZkcywgdHZwKSk7CiAgICAgICAgaWYodHZwKQogICAgICAgICAgICBERUJVR01TR1RMKCgidGltZXIiLCAidHZwICVsZC4lbGRcbiIsIHR2cC0+dHZfc2VjLCB0dnAtPnR2X3VzZWMpKTsKICAgICAgICBjb3VudCA9IG5ldF9zbm1wX2xhcmdlX2ZkX3NldF9zZWxlY3QobnVtZmRzLCAmcmVhZGZkcywgJndyaXRlZmRzLCAmZXhjZXB0ZmRzLAoJCQkJICAgICAgdHZwKTsKICAgICAgICBERUJVR01TR1RMKCgic25tcGQvc2VsZWN0IiwgInJldHVybmVkLCBjb3VudCA9ICVkXG4iLCBjb3VudCkpOwoKICAgICAgICBpZiAoY291bnQgPiAwKSB7CgojaWZkZWYgVVNJTkdfU01VWF9NT0RVTEUKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogaGFuZGxlIHRoZSBTTVVYIHNkJ3MgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc211eF9saXN0ZW5fc2QgPj0gMCkgewogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNtdXhfc25tcF9zZWxlY3RfbGlzdF9nZXRfbGVuZ3RoKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHNkID0gc211eF9zbm1wX3NlbGVjdF9saXN0X2dldF9TRF9mcm9tX0xpc3QoaSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKE5FVFNOTVBfTEFSR0VfRkRfSVNTRVQoc2QsICZyZWFkZmRzKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc211eF9wcm9jZXNzKHNkKSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtdXhfc25tcF9zZWxlY3RfbGlzdF9kZWwoc2QpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIG5ldyBjb25uZWN0aW9uIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAoTkVUU05NUF9MQVJHRV9GRF9JU1NFVChzbXV4X2xpc3Rlbl9zZCwgJnJlYWRmZHMpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKChzZCA9IHNtdXhfYWNjZXB0KHNtdXhfbGlzdGVuX3NkKSkgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBzbXV4X3NubXBfc2VsZWN0X2xpc3RfYWRkKHNkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVVNJTkdfU01VWF9NT0RVTEUgKi8KICAgICAgICAgICAgbmV0c25tcF9kaXNwYXRjaF9leHRlcm5hbF9ldmVudHMyKCZjb3VudCwgJnJlYWRmZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVmZHMsICZleGNlcHRmZHMpOwogICAgICAgICAgICAvKiBJZiB0aGVyZSBhcmUgc3RpbGwgZXZlbnRzIGxlZnRvdmVyLCBwcm9jZXNzIHRoZW0gKi8KICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgewogICAgICAgICAgICAgIHNubXBfcmVhZDIoJnJlYWRmZHMpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHN3aXRjaCAoY291bnQpIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgc25tcF90aW1lb3V0KCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAtMToKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZC9zZWxlY3QiLCAiICBlcnJubyA9ICVkXG4iLCBlcnJubykpOwogICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKSB7CiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiBsaWtlbHkgdGhhdCB3ZSBnb3QgYSBzaWduYWwuIENoZWNrIG91ciBzcGVjaWFsIHNpZ25hbAogICAgICAgICAgICAgICAgICAgICAqIGZsYWdzIGJlZm9yZSByZXRyeWluZyBzZWxlY3QuCiAgICAgICAgICAgICAgICAgICAgICovCgkJICAgIGlmIChuZXRzbm1wX3J1bm5pbmcgJiYgIXJlY29uZmlnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVzZWxlY3Q7CgkJICAgIH0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc25tcF9sb2dfcGVycm9yKCJzZWxlY3QiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJzZWxlY3QgcmV0dXJuZWQgJWRcbiIsIGNvdW50KTsKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBlbmRpZiAtLSBjb3VudD4wICovCgogICAgICAgIC8qCiAgICAgICAgICogc2VlIGlmIHBlcnNpc3RlbnQgc3RvcmUgbmVlZHMgdG8gYmUgc2F2ZWQKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX2lmX25lZWRlZCgpOwoKICAgICAgICAvKgogICAgICAgICAqIHJ1biByZXF1ZXN0ZWQgYWxhcm1zIAogICAgICAgICAqLwogICAgICAgIHJ1bl9hbGFybXMoKTsKCiAgICAgICAgbmV0c25tcF9jaGVja19vdXRzdGFuZGluZ19hZ2VudF9yZXF1ZXN0cygpOwoKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmR3aGlsZSAqLwoKICAgIG5ldHNubXBfbGFyZ2VfZmRfc2V0X2NsZWFudXAoJnJlYWRmZHMpOwogICAgbmV0c25tcF9sYXJnZV9mZF9zZXRfY2xlYW51cCgmd3JpdGVmZHMpOwogICAgbmV0c25tcF9sYXJnZV9mZF9zZXRfY2xlYW51cCgmZXhjZXB0ZmRzKTsKCiNpZiBkZWZpbmVkKFdJTjMyKQogICAgam9pbl9zdGRpbl93YWl0ZXJfdGhyZWFkKCk7CiNlbmRpZgoKICAgIHNubXBfbG9nKExPR19JTkZPLCAiUmVjZWl2ZWQgVEVSTSBvciBTVE9QIHNpZ25hbC4uLiAgc2h1dHRpbmcgZG93bi4uLlxuIik7CiAgICByZXR1cm4gMDsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHJlY2VpdmUoKSAqLwoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiBzbm1wX2lucHV0CiAqCiAqIFBhcmFtZXRlcnM6CiAqCSBvcAogKgkqc2Vzc2lvbgogKgkgcmVxdWlkCiAqCSpwZHUKICoJKm1hZ2ljCiAqICAgICAgCiAqIFJldHVybnM6CiAqCTEJCU9uIHN1Y2Nlc3MJLU9SLQogKglQYXNzZXMgdGhyb3VnaAlSZXR1cm4gZnJvbSBhbGFybUdldFJlc3BvbnNlKCkgd2hlbiAKICoJICAJCSAgVVNJTkdfVjJQQVJUWV9BTEFSTV9NT0RVTEUgaXMgZGVmaW5lZC4KICoKICogQ2FsbC1iYWNrIGZ1bmN0aW9uIHRvIG1hbmFnZSByZXNwb25zZXMgdG8gdHJhcHMgKGluZm9ybXMpIGFuZCBhbGFybXMuCiAqIE5vdCB1c2VkIGJ5IHRoZSBhZ2VudCB0byBwcm9jZXNzIG90aGVyIFJlc3BvbnNlIFBEVXMuCiAqLwppbnQKc25tcF9pbnB1dChpbnQgb3AsCiAgICAgICAgICAgbmV0c25tcF9zZXNzaW9uICogc2Vzc2lvbiwKICAgICAgICAgICBpbnQgcmVxaWQsIG5ldHNubXBfcGR1ICpwZHUsIHZvaWQgKm1hZ2ljKQp7CiAgICBzdHJ1Y3QgZ2V0X3JlcV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGdldF9yZXFfc3RhdGUgKikgbWFnaWM7CgogICAgaWYgKG9wID09IE5FVFNOTVBfQ0FMTEJBQ0tfT1BfUkVDRUlWRURfTUVTU0FHRSkgewogICAgICAgIGlmIChwZHUtPmNvbW1hbmQgPT0gU05NUF9NU0dfR0VUKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS0+dHlwZSA9PSBFVkVOVF9HRVRfUkVRKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogdGhpcyBpcyBqdXN0IHRoZSBhY2sgdG8gb3VyIGluZm9ybSBwZHUgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChvcCA9PSBORVRTTk1QX0NBTExCQUNLX09QX1RJTUVEX09VVCkgewogICAgICAgIGlmIChzdGF0ZS0+dHlwZSA9PSBBTEFSTV9HRVRfUkVRKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIE5lZWQgYSBtZWNoYW5pc20gdG8gcmVwbGFjZSBvYnNvbGV0ZSBTTk1QdjJwIGFsYXJtIAogICAgICAgICAgICAgKi8KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHNubXBfaW5wdXQoKSAqLwoKCgovKgogKiBXaW5kb3dzIFNlcnZpY2UgUmVsYXRlZCBmdW5jdGlvbnMgCiAqLwojaWZkZWYgV0lOMzJTRVJWSUNFCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBtYWluIGZ1bmN0aW9uIGZvciBXaW5kb3dzCiogUGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3Igc3RhcnR1cCBvcHRpb25zLAoqIHRvIHN0YXJ0IGFzIHNlcnZpY2Ugb3IgY29uc29sZSBtb2RlIGFwcGxpY2F0aW9uIGluIHdpbmRvd3MuCiogSW52b2tlcyBhcHByb3ByaWF0ZSBzdGFydHVwIGZ1bmN0aW9ucyBkZXBlbmRpbmcgb24gdGhlIAoqIHBhcmFtZXRlcnMgcGFzc2VkCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludAogICAgX19jZGVjbApfdG1haW4oaW50IGFyZ2MsIFRDSEFSICogYXJndltdKQp7CiAgICAvKgogICAgICogRGVmaW5lIFNlcnZpY2UgTmFtZSBhbmQgRGVzY3JpcHRpb24sIHdoaWNoIGFwcGVhcnMgaW4gd2luZG93cyBTQ00gCiAgICAgKi8KICAgIExQQ1RTVFIgICAgICAgICBscHN6U2VydmljZU5hbWUgPSBhcHBfbmFtZV9sb25nOyAgICAgIC8qIFNlcnZpY2UgUmVnaXN0cnkgTmFtZSAqLwogICAgTFBDVFNUUiAgICAgICAgIGxwc3pTZXJ2aWNlRGlzcGxheU5hbWUgPSBfVCgiTmV0LVNOTVAgQWdlbnQiKTsgICAgICAgLyogRGlzcGxheSBOYW1lICovCiAgICBMUENUU1RSICAgICAgICAgbHBzelNlcnZpY2VEZXNjcmlwdGlvbiA9CiNpZmRlZiBJRkRFU0NSCiAgICAgICAgX1QoIlNOTVB2MmMgLyBTTk1QdjMgY29tbWFuZCByZXNwb25kZXIgZnJvbSBOZXQtU05NUC4gU3VwcG9ydHMgTUlCIG9iamVjdHMgZm9yIElQLElDTVAsVENQLFVEUCwgYW5kIG5ldHdvcmsgaW50ZXJmYWNlIHN1Yi1sYXllcnMuIik7CiNlbHNlCiAgICAgICAgX1QoIlNOTVB2MmMgLyBTTk1QdjMgY29tbWFuZCByZXNwb25kZXIgZnJvbSBOZXQtU05NUCIpOwojZW5kaWYKICAgIElucHV0UGFyYW1zICAgICBJbnB1dE9wdGlvbnM7CgoKICAgIGludCAgICAgICAgICAgICBuUnVuVHlwZSA9IFJVTl9BU19DT05TT0xFOwogICAgaW50ICAgICAgICAgICAgIHF1aWV0ID0gMDsKICAgIAogICAgblJ1blR5cGUgPSBQYXJzZUNtZExpbmVGb3JTZXJ2aWNlT3B0aW9uKGFyZ2MsIGFyZ3YsICZxdWlldCk7CgogICAgc3dpdGNoIChuUnVuVHlwZSkgewogICAgY2FzZSBSRUdJU1RFUl9TRVJWSUNFOgogICAgICAgIC8qCiAgICAgICAgICogUmVnaXN0ZXIgQXMgc2VydmljZSAKICAgICAgICAgKi8KICAgICAgICBJbnB1dE9wdGlvbnMuQXJnYyA9IGFyZ2M7CiAgICAgICAgSW5wdXRPcHRpb25zLkFyZ3YgPSBhcmd2OwogICAgICAgIGV4aXQgKFJlZ2lzdGVyU2VydmljZShscHN6U2VydmljZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGxwc3pTZXJ2aWNlRGlzcGxheU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGxwc3pTZXJ2aWNlRGVzY3JpcHRpb24sICZJbnB1dE9wdGlvbnMsIHF1aWV0KSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFVOX1JFR0lTVEVSX1NFUlZJQ0U6CiAgICAgICAgLyoKICAgICAgICAgKiBVbnJlZ2lzdGVyIHNlcnZpY2UgCiAgICAgICAgICovCiAgICAgICAgZXhpdCAoVW5yZWdpc3RlclNlcnZpY2UobHBzelNlcnZpY2VOYW1lLCBxdWlldCkpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBSVU5fQVNfU0VSVklDRToKICAgICAgICAvKgogICAgICAgICAqIFJ1biBhcyBzZXJ2aWNlIAogICAgICAgICAqLwogICAgICAgIC8qCiAgICAgICAgICogUmVnaXN0ZXIgU3RvcCBGdW5jdGlvbiAKICAgICAgICAgKi8KICAgICAgICBSZWdpc3RlclN0b3BGdW5jdGlvbihTdG9wU25tcEFnZW50KTsKICAgICAgICByZXR1cm4gUnVuQXNTZXJ2aWNlKFNubXBEYWVtb25NYWluKTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgLyoKICAgICAgICAgKiBSdW4gaW4gY29uc29sZSBtb2RlIAogICAgICAgICAqLwogICAgICAgIHJldHVybiBTbm1wRGFlbW9uTWFpbihhcmdjLCBhcmd2KTsKICAgICAgICBicmVhazsKICAgIH0KfQoKLyoKICogVG8gc3RvcCBTbm1wIEFnZW50IGRhZW1vbgogKiBUaGlzIHBvcnRpb24gaXMgc3RpbGwgbm90IHdvcmtpbmcKICovCnZvaWQKU3RvcFNubXBBZ2VudCh2b2lkKQp7CiAgICAvKgogICAgICogU2h1dCBEb3duIEFnZW50IAogICAgICovCiAgICBTbm1wZFNodXREb3duKDEpOwoKICAgIC8qCiAgICAgKiBXYWl0IHRpbGwgYWdlbnQgaXMgY29tcGxldGVseSBzdG9wcGVkIAogICAgICovCgogICAgd2hpbGUgKGFnZW50X3N0YXR1cyAhPSBBR0VOVF9TVE9QUEVEKSB7CiAgICAgICAgU2xlZXAoMTAwKTsKICAgIH0KfQoKI2VuZGlmIC8qV0lOMzJTRVJWSUNFKi8K