IyBjVVJML2xpYmN1cmwgQ01ha2Ugc2NyaXB0CiMgYnkgVGV0ZXRlc3QgYW5kIFN1a2VuZGVyIChCZW5vaXQgTmVpbCkKCiMgVE9ETzoKIyBUaGUgb3V0cHV0IC5zbyBmaWxlIGxhY2tzIHRoZSBzb25hbWUgbnVtYmVyIHdoaWNoIHdlIGN1cnJlbnRseSBoYXZlIHdpdGhpbiB0aGUgbGliL01ha2VmaWxlLmFtIGZpbGUKIyBBZGQgZnVsbCAoNCBvciA1IGxpYnMpIFNTTCBzdXBwb3J0CiMgQWRkIElOU1RBTEwgdGFyZ2V0IChFWFRSQV9ESVNUIHZhcmlhYmxlcyBpbiBNYWtlZmlsZS5hbSBtYXkgYmUgbW92ZWQgdG8gTWFrZWZpbGUuaW5jIHNvIHRoYXQgQ01ha2UvQ1BhY2sgaXMgYXdhcmUgb2Ygd2hhdCdzIHRvIGluY2x1ZGUpLgojIEFkZCBDVGVzdHMoPykKIyBDaGVjayBvbiBhbGwgcG9zc2libGUgcGxhdGZvcm1zCiMgVGVzdCB3aXRoIGFzIG1hbnkgY29uZmlndXJhdGlvbnMgcG9zc2libGUgKFdpdGggb3Igd2l0aG91dCBhbnkgb3B0aW9uKQojIENyZWF0ZSBzY3JpcHRzIHRoYXQgaGVscCBrZWVwaW5nIHRoZSBDTWFrZSBidWlsZCBzeXN0ZW0gdXAgdG8gZGF0ZSAodG8gcmVkdWNlIG1haW50ZW5hbmNlKS4gQWNjb3JkaW5nIHRvIFRldGV0ZXN0OgojICAtIGxpc3RzIG9mIGhlYWRlcnMgdGhhdCAnY29uZmlndXJlJyBjaGVja3MgZm9yOwojICAtIGN1cmwtc3BlY2lmaWMgdGVzdHMgKHRoZSBvbmVzIHRoYXQgYXJlIGluIG00L2N1cmwtKi5tNCBmaWxlcyk7CiMgIC0gKG1vc3Qgb2J2aW91cyB0aGluZzopIGN1cmwgdmVyc2lvbiBudW1iZXJzLgojIEFkZCBkb2N1bWVudGF0aW9uIHN1YnByb2plY3QKIwojIFRvIGNoZWNrOgojIChGcm9tIERhbmllbCBTdGVuYmVyZykgVGhlIGNtYWtlIGJ1aWxkIHNlbGVjdGVkIHRvIHJ1biBnY2Mgd2l0aCAtZlBJQyBvbiBteSBib3ggd2hpbGUgdGhlIHBsYWluIGNvbmZpZ3VyZSBzY3JpcHQgZGlkIG5vdC4KIyAoRnJvbSBEYW5pZWwgU3RlbmJlcmcpIFRoZSBnY2MgY29tbWFuZCBsaW5lIHVzZSBuZWl0aGVyIC1nIG5vciBhbnkgLU8gb3B0aW9ucy4gQXMgYSBkZXZlbG9wZXIsIEkgYWxzbyB0cmVhc3VyZSBvdXIgY29uZmlndXJlIHNjcmlwdHMncyAtLWVuYWJsZS1kZWJ1ZyBvcHRpb24gdGhhdCBzZXRzIGEgbG9uZyByYW5nZSBvZiAicGlja3kiIGNvbXBpbGVyIG9wdGlvbnMuCmNtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjYuMiBGQVRBTF9FUlJPUikKc2V0KENNQUtFX01PRFVMRV9QQVRIICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vQ01ha2U7JHtDTUFLRV9NT0RVTEVfUEFUSH0iKQppbmNsdWRlKFV0aWxpdGllcykKCnByb2plY3QoIENVUkwgQyApCgpmaWxlIChSRUFEICR7Q1VSTF9TT1VSQ0VfRElSfS9pbmNsdWRlL2N1cmwvY3VybHZlci5oIENVUkxfVkVSU0lPTl9IX0NPTlRFTlRTKQpzdHJpbmcgKFJFR0VYIE1BVENIICJMSUJDVVJMX1ZFUlNJT05fTUFKT1JbIFx0XSsoWzAtOV0rKSIKICBMSUJDVVJMX1ZFUlNJT05fTUogJHtDVVJMX1ZFUlNJT05fSF9DT05URU5UU30pCnN0cmluZyAoUkVHRVggTUFUQ0ggIihbMC05XSspIgogIExJQkNVUkxfVkVSU0lPTl9NSiAke0xJQkNVUkxfVkVSU0lPTl9NSn0pCnN0cmluZyAoUkVHRVggTUFUQ0gKICAiTElCQ1VSTF9WRVJTSU9OX01JTk9SWyBcdF0rKFswLTldKykiCiAgTElCQ1VSTF9WRVJTSU9OX01JICR7Q1VSTF9WRVJTSU9OX0hfQ09OVEVOVFN9KQpzdHJpbmcgKFJFR0VYIE1BVENIICIoWzAtOV0rKSIgTElCQ1VSTF9WRVJTSU9OX01JICR7TElCQ1VSTF9WRVJTSU9OX01JfSkKc3RyaW5nIChSRUdFWCBNQVRDSAogICJMSUJDVVJMX1ZFUlNJT05fUEFUQ0hbIFx0XSsoWzAtOV0rKSIKICBMSUJDVVJMX1ZFUlNJT05fUFQgJHtDVVJMX1ZFUlNJT05fSF9DT05URU5UU30pCnN0cmluZyAoUkVHRVggTUFUQ0ggIihbMC05XSspIiBMSUJDVVJMX1ZFUlNJT05fUFQgJHtMSUJDVVJMX1ZFUlNJT05fUFR9KQpzZXQgKENVUkxfTUFKT1JfVkVSU0lPTiAke0xJQkNVUkxfVkVSU0lPTl9NSn0pCnNldCAoQ1VSTF9NSU5PUl9WRVJTSU9OICR7TElCQ1VSTF9WRVJTSU9OX01JfSkKc2V0IChDVVJMX1BBVENIX1ZFUlNJT04gJHtMSUJDVVJMX1ZFUlNJT05fUFR9KQoKaW5jbHVkZV9yZWd1bGFyX2V4cHJlc3Npb24oIl4uKiQiKSAgICAjIFN1a2VuZGVyOiBJcyBpdCBuZWNlc3Nhcnk/CgojIFNldHVwIHBhY2thZ2UgbWV0YS1kYXRhCiMgU0VUKFBBQ0tBR0UgImN1cmwiKQpzZXQoQ1VSTF9WRVJTSU9OICR7Q1VSTF9NQUpPUl9WRVJTSU9OfS4ke0NVUkxfTUlOT1JfVkVSU0lPTn0uJHtDVVJMX1BBVENIX1ZFUlNJT059KQptZXNzYWdlKFNUQVRVUyAiY3VybCB2ZXJzaW9uPVske0NVUkxfVkVSU0lPTn1dIikKIyBTRVQoUEFDS0FHRV9UQVJOQU1FICJjdXJsIikKIyBTRVQoUEFDS0FHRV9OQU1FICJjdXJsIikKIyBTRVQoUEFDS0FHRV9WRVJTSU9OICItIikKIyBTRVQoUEFDS0FHRV9TVFJJTkcgImN1cmwtIikKIyBTRVQoUEFDS0FHRV9CVUdSRVBPUlQgImEgc3VpdGFibGUgY3VybCBtYWlsaW5nIGxpc3QgPT4gaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsLyIpCnNldChPUEVSQVRJTkdfU1lTVEVNICIke0NNQUtFX1NZU1RFTV9OQU1FfSIpCnNldChPUyAiXCIke0NNQUtFX1NZU1RFTV9OQU1FfVwiIikKCmluY2x1ZGVfZGlyZWN0b3JpZXMoJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2luY2x1ZGUvY3VybCkKaW5jbHVkZV9kaXJlY3RvcmllcyggJHtDVVJMX1NPVVJDRV9ESVJ9L2luY2x1ZGUgKQoKaWYoV0lOMzIpCiAgc2V0KE5BVElWRV9XSU5ET1dTIE9OKQplbmRpZigpCgpvcHRpb24oQlVJTERfQ1VSTF9FWEUgIlNldCB0byBPTiB0byBidWlsZCBjVVJMIGV4ZWN1dGFibGUuIiBPTikKb3B0aW9uKEJVSUxEX0NVUkxfVEVTVFMgIlNldCB0byBPTiB0byBidWlsZCBjVVJMIHRlc3RzLiIgT04pCm9wdGlvbihDVVJMX1NUQVRJQ0xJQiAiU2V0IHRvIE9OIHRvIGJ1aWxkIGxpYmN1cmwgd2l0aCBzdGF0aWMgbGlua2luZy4iIE9GRikKb3B0aW9uKENVUkxfVVNFX0FSRVMgIlNldCB0byBPTiB0byBlbmFibGUgYy1hcmVzIHN1cHBvcnQiIE9GRikKIyBpbml0aWFsaXplIENVUkxfTElCUwpzZXQoQ1VSTF9MSUJTICIiKQoKaWYoQ1VSTF9VU0VfQVJFUykKICBzZXQoVVNFX0FSRVMgJHtDVVJMX1VTRV9BUkVTfSkKICBmaW5kX3BhY2thZ2UoQ0FSRVMgUkVRVUlSRUQpCiAgbGlzdChBUFBFTkQgQ1VSTF9MSUJTICR7Q0FSRVNfTElCUkFSWX0gKQogIHNldChDVVJMX0xJQlMgJHtDVVJMX0xJQlN9ICR7Q0FSRVNfTElCUkFSWX0pCmVuZGlmKCkKCm9wdGlvbihCVUlMRF9EQVNIQk9BUkRfUkVQT1JUUyAiU2V0IHRvIE9OIHRvIGFjdGl2YXRlIHJlcG9ydGluZyBvZiBjVVJMIGJ1aWxkcyBoZXJlIGh0dHA6Ly93d3cuY2Rhc2gub3JnL0NEYXNoUHVibGljL2luZGV4LnBocD9wcm9qZWN0PUNVUkwiIE9GRikKaWYoQlVJTERfREFTSEJPQVJEX1JFUE9SVFMpCiAgI0lOQ0xVREUoRGFydCkKICBpbmNsdWRlKENUZXN0KQplbmRpZihCVUlMRF9EQVNIQk9BUkRfUkVQT1JUUykKCmlmKE1TVkMpCiAgb3B0aW9uKEJVSUxEX1JFTEVBU0VfREVCVUdfRElSUyAiU2V0IE9GRiB0byBidWlsZCBlYWNoIGNvbmZpZ3VyYXRpb24gdG8gYSBzZXBhcmF0ZSBkaXJlY3RvcnkiIE9GRikKICBtYXJrX2FzX2FkdmFuY2VkKEJVSUxEX1JFTEVBU0VfREVCVUdfRElSUykKZW5kaWYoKQoKb3B0aW9uKENVUkxfSElEREVOX1NZTUJPTFMgIlNldCB0byBPTiB0byBoaWRlIGxpYmN1cmwgaW50ZXJuYWwgc3ltYm9scyAoPWhpZGUgYWxsIHN5bWJvbHMgdGhhdCBhcmVuJ3Qgb2ZmaWNpYWxseSBleHRlcm5hbCkuIiBPTikKbWFya19hc19hZHZhbmNlZChDVVJMX0hJRERFTl9TWU1CT0xTKQoKIyBJRihXSU4zMikKIyBPUFRJT04oQ1VSTF9XSU5ET1dTX1NTUEkgIlVzZSB3aW5kb3dzIGxpYnJhcmllcyB0byBhbGxvdyBOVExNIGF1dGhlbnRpY2F0aW9uIHdpdGhvdXQgb3BlbnNzbCIgT04pCiMgTUFSS19BU19BRFZBTkNFRChDVVJMX1dJTkRPV1NfU1NQSSkKIyBFTkRJRigpCgpvcHRpb24oSFRUUF9PTkxZICJkaXNhYmxlcyBhbGwgcHJvdG9jb2xzIGV4Y2VwdCBIVFRQIChUaGlzIG92ZXJyaWRlcyBhbGwgQ1VSTF9ESVNBQkxFXyogb3B0aW9ucykiIE9GRikKbWFya19hc19hZHZhbmNlZChIVFRQX09OTFkpCm9wdGlvbihDVVJMX0RJU0FCTEVfRlRQICJkaXNhYmxlcyBGVFAiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfRlRQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0xEQVAgImRpc2FibGVzIExEQVAiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfTERBUCkKb3B0aW9uKENVUkxfRElTQUJMRV9URUxORVQgImRpc2FibGVzIFRlbG5ldCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9URUxORVQpCm9wdGlvbihDVVJMX0RJU0FCTEVfRElDVCAiZGlzYWJsZXMgRElDVCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9ESUNUKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0ZJTEUgImRpc2FibGVzIEZJTEUiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfRklMRSkKb3B0aW9uKENVUkxfRElTQUJMRV9URlRQICJkaXNhYmxlcyBURlRQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX1RGVFApCm9wdGlvbihDVVJMX0RJU0FCTEVfSFRUUCAiZGlzYWJsZXMgSFRUUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9IVFRQKQoKb3B0aW9uKENVUkxfRElTQUJMRV9MREFQUyAidG8gZGlzYWJsZSBMREFQUyIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9MREFQUykKaWYoV0lOMzIpCiAgc2V0KENVUkxfREVGQVVMVF9ESVNBQkxFX0xEQVAgT0ZGKQogICMgc29tZSB3aW5kb3dzIGNvbXBpbGVycyBkbyBub3QgaGF2ZSB3bGRhcDMyCiAgaWYoIE5PVCBIQVZFX1dMREFQMzIpCiAgICBzZXQoQ1VSTF9ESVNBQkxFX0xEQVAgT04gQ0FDSEUgQk9PTCAiIiBGT1JDRSkKICAgIG1lc3NhZ2UoU1RBVFVTICJ3bGRhcDMyIG5vdCBmb3VuZCBDVVJMX0RJU0FCTEVfTERBUCBzZXQgT04iKQogICAgb3B0aW9uKENVUkxfTERBUF9XSU4gIlVzZSBXaW5kb3dzIExEQVAgaW1wbGVtZW50YXRpb24iIE9GRikKICBlbHNlKCkKICAgIG9wdGlvbihDVVJMX0xEQVBfV0lOICJVc2UgV2luZG93cyBMREFQIGltcGxlbWVudGF0aW9uIiBPTikKICBlbmRpZigpCiAgbWFya19hc19hZHZhbmNlZChDVVJMX0xEQVBfV0lOKQplbmRpZigpCgppZihIVFRQX09OTFkpCiAgc2V0KENVUkxfRElTQUJMRV9GVFAgT04pCiAgc2V0KENVUkxfRElTQUJMRV9MREFQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfVEVMTkVUIE9OKQogIHNldChDVVJMX0RJU0FCTEVfRElDVCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0ZJTEUgT04pCiAgc2V0KENVUkxfRElTQUJMRV9URlRQIE9OKQplbmRpZigpCgpvcHRpb24oQ1VSTF9ESVNBQkxFX0NPT0tJRVMgInRvIGRpc2FibGUgY29va2llcyBzdXBwb3J0IiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0NPT0tJRVMpCgpvcHRpb24oQ1VSTF9ESVNBQkxFX0NSWVBUT19BVVRIICJ0byBkaXNhYmxlIGNyeXB0b2dyYXBoaWMgYXV0aGVudGljYXRpb24iIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfQ1JZUFRPX0FVVEgpCm9wdGlvbihDVVJMX0RJU0FCTEVfVkVSQk9TRV9TVFJJTkdTICJ0byBkaXNhYmxlIHZlcmJvc2Ugc3RyaW5ncyIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9WRVJCT1NFX1NUUklOR1MpCm9wdGlvbihESVNBQkxFRF9USFJFQURTQUZFICJTZXQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHdlIGRvbid0IHdhbnQgdG8gdXNlIHRocmVhZC1zYWZlIGZ1bmN0aW9ucyIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKERJU0FCTEVEX1RIUkVBRFNBRkUpCm9wdGlvbihFTkFCTEVfSVBWNiAiRGVmaW5lIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBJUHY2IHN1cHBvcnQiIE9GRikKbWFya19hc19hZHZhbmNlZChFTkFCTEVfSVBWNikKCmlmKFdJTjMyKQogIGZpbmRfbGlicmFyeShXU09DSzMyX0xJQlJBUlkgd3NvY2szMikKICBmaW5kX2xpYnJhcnkoV1MyXzMyX0xJQlJBUlkgd3MyXzMyKQogIGxpc3Rfc3BhY2VzX2FwcGVuZF9vbmNlKENNQUtFX0NfU1RBTkRBUkRfTElCUkFSSUVTICR7V1NPQ0szMl9MSUJSQVJZfSAke1dTMl8zMl9MSUJSQVJZfSkgICMgYnVmZmVyb3ZlcmZsb3d1LmxpYgogIGlmKENVUkxfRElTQUJMRV9MREFQKQogICAgIyBSZW1vdmUgd2xkYXAzMi5saWIgZnJvbSBzcGFjZS1zZXBhcmF0ZWQgbGlzdAogICAgc3RyaW5nKFJFUExBQ0UgIiAiICI7IiBfTElTVCAke0NNQUtFX0NfU1RBTkRBUkRfTElCUkFSSUVTfSkKICAgIGxpc3QoUkVNT1ZFX0lURU0gX0xJU1QgIndsZGFwMzIubGliIikKICAgIHRvX2xpc3Rfc3BhY2VzKF9MSVNUIENNQUtFX0NfU1RBTkRBUkRfTElCUkFSSUVTKQogIGVsc2UoKQogICAgIyBBcHBlbmQgd2xkYXAzMi5saWIKICAgIGxpc3Rfc3BhY2VzX2FwcGVuZF9vbmNlKENNQUtFX0NfU1RBTkRBUkRfTElCUkFSSUVTIHdsZGFwMzIubGliKQogIGVuZGlmKCkKICBzZXQoQ01BS0VfQ19TVEFOREFSRF9MSUJSQVJJRVMgIiR7Q01BS0VfQ19TVEFOREFSRF9MSUJSQVJJRVN9IiAgIENBQ0hFIFNUUklORyAiIiBGT1JDRSkKZW5kaWYoKQoKCiMgV2UgbmVlZCBhbnNpIGMtZmxhZ3MsIGVzcGVjaWFsbHkgb24gSFAKc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQU5TSV9DRkxBR1N9ICR7Q01BS0VfQ19GTEFHU30iKQpzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgJHtDTUFLRV9BTlNJX0NGTEFHU30pCgojIERpc2FibGUgd2FybmluZ3Mgb24gQm9ybGFuZCB0byBhdm9pZCBjaGFuZ2luZyAzcmQgcGFydHkgY29kZS4KaWYoQk9STEFORCkKICBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAtdy0iKQplbmRpZihCT1JMQU5EKQoKIyBJZiB3ZSBhcmUgb24gQUlYLCBkbyB0aGUgX0FMTF9TT1VSQ0UgbWFnaWMKaWYoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyBBSVgpCiAgc2V0KF9BTExfU09VUkNFIDEpCmVuZGlmKCR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgQUlYKQoKIyBJbmNsdWRlIGFsbCB0aGUgbmVjZXNzYXJ5IGZpbGVzIGZvciBtYWNyb3MKaW5jbHVkZSAoQ2hlY2tGdW5jdGlvbkV4aXN0cykKaW5jbHVkZSAoQ2hlY2tJbmNsdWRlRmlsZSkKaW5jbHVkZSAoQ2hlY2tJbmNsdWRlRmlsZXMpCmluY2x1ZGUgKENoZWNrTGlicmFyeUV4aXN0cykKaW5jbHVkZSAoQ2hlY2tTeW1ib2xFeGlzdHMpCmluY2x1ZGUgKENoZWNrVHlwZVNpemUpCgojIE9uIHdpbmRvd3MgcHJlbG9hZCBzZXR0aW5ncwppZihXSU4zMikKICBpbmNsdWRlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9DTWFrZS9QbGF0Zm9ybXMvV2luZG93c0NhY2hlLmNtYWtlKQplbmRpZihXSU4zMikKCiMgVGhpcyBtYWNybyBjaGVja3MgaWYgdGhlIHN5bWJvbCBleGlzdHMgaW4gdGhlIGxpYnJhcnkgYW5kIGlmIGl0CiMgZG9lcywgaXQgcHJlcGVuZHMgbGlicmFyeSB0byB0aGUgbGlzdC4KbWFjcm8oQ0hFQ0tfTElCUkFSWV9FWElTVFNfQ09OQ0FUIExJQlJBUlkgU1lNQk9MIFZBUklBQkxFKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzKCIke0xJQlJBUll9OyR7Q1VSTF9MSUJTfSIgJHtTWU1CT0x9ICIke0NNQUtFX0xJQlJBUllfUEFUSH0iCiAgICAke1ZBUklBQkxFfSkKICBpZigke1ZBUklBQkxFfSkKICAgIHNldChDVVJMX0xJQlMgJHtMSUJSQVJZfSAke0NVUkxfTElCU30pCiAgZW5kaWYoJHtWQVJJQUJMRX0pCmVuZG1hY3JvKENIRUNLX0xJQlJBUllfRVhJU1RTX0NPTkNBVCkKCiMgQ2hlY2sgZm9yIGFsbCBuZWVkZWQgbGlicmFyaWVzCmNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiZGwiICAgICBkbG9wZW4gICAgICAgSEFWRV9MSUJETCkKY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJzb2NrZXQiIGNvbm5lY3QgICAgICBIQVZFX0xJQlNPQ0tFVCkKY2hlY2tfbGlicmFyeV9leGlzdHMoImMiIGdldGhvc3RieW5hbWUgIiIgTk9UX05FRURfTElCTlNMKQoKIyBZZWxsb3d0YWIgWmV0YSBuZWVkcyBkaWZmZXJlbnQgbGlicmFyaWVzIHRoYW4gQmVPUyA1LgppZihCRU9TKQogIHNldChOT1RfTkVFRF9MSUJOU0wgMSkKICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoImJpbmQiIGdldGhvc3RieW5hbWUgSEFWRV9MSUJCSU5EKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiYm5ldGFwaSIgY2xvc2Vzb2NrZXQgSEFWRV9MSUJCTkVUQVBJKQplbmRpZihCRU9TKQoKaWYoTk9UIE5PVF9ORUVEX0xJQk5TTCkKICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoIm5zbCIgICAgZ2V0aG9zdGJ5bmFtZSAgSEFWRV9MSUJOU0wpCmVuZGlmKE5PVCBOT1RfTkVFRF9MSUJOU0wpCgpjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoIndzMl8zMiIgZ2V0Y2ggICAgICAgIEhBVkVfTElCV1MyXzMyKQpjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoIndpbm1tIiAgZ2V0Y2ggICAgICAgIEhBVkVfTElCV0lOTU0pCmNoZWNrX2xpYnJhcnlfZXhpc3RzKCJ3bGRhcDMyIiBjbGRhcF9vcGVuICIiIEhBVkVfV0xEQVAzMikKCiMgSUYoTk9UIENVUkxfU1BFQ0lBTF9MSUJaKQojICBDSEVDS19MSUJSQVJZX0VYSVNUU19DT05DQVQoInoiICAgICAgaW5mbGF0ZUVuZCAgIEhBVkVfTElCWikKIyBFTkRJRihOT1QgQ1VSTF9TUEVDSUFMX0xJQlopCgojIENoZWNrIGZvciBpZG4KY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJpZG4iIGlkbmFfdG9fYXNjaWlfbHogSEFWRV9MSUJJRE4pCgojIENoZWNrIGZvciBMREFQCmNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgibGRhcCIgbGRhcF9pbml0IEhBVkVfTElCTERBUCkKIyBpZihOT1QgSEFWRV9MSUJMREFQKQojIFNFVChDVVJMX0RJU0FCTEVfTERBUCBPTikKIyBlbmRpZihOT1QgSEFWRV9MSUJMREFQKQoKIyBDaGVjayBmb3Igc3ltYm9sIGRsb3BlbiAoc2FtZSBhcyBIQVZFX0xJQkRMKQpjaGVja19saWJyYXJ5X2V4aXN0cygiJHtDVVJMX0xJQlN9IiBkbG9wZW4gIiIgSEFWRV9ETE9QRU4pCgojIEZvciBvdGhlciB0ZXN0cyB0byB1c2UgdGhlIHNhbWUgbGlicmFyaWVzCnNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgJHtDVVJMX0xJQlN9KQoKb3B0aW9uKENVUkxfWkxJQiAiU2V0IHRvIE9OIHRvIGVuYWJsZSBidWlsZGluZyBjVVJMIHdpdGggemxpYiBzdXBwb3J0LiIgT04pCnNldChIQVZFX0xJQlogT0ZGKQpzZXQoSEFWRV9aTElCX0ggT0ZGKQpzZXQoSEFWRV9aTElCIE9GRikKaWYoQ1VSTF9aTElCKSAgIyBBTkQgQ1VSTF9DT05GSUdfSEFTX0JFRU5fUlVOX0JFRk9SRQogIGZpbmRfcGFja2FnZShaTElCIFFVSUVUKQogIGlmKFpMSUJfRk9VTkQpCiAgICBzZXQoSEFWRV9aTElCX0ggT04pCiAgICBzZXQoSEFWRV9aTElCIE9OKQogICAgc2V0KEhBVkVfTElCWiBPTikKICBlbmRpZigpCmVuZGlmKCkKCm9wdGlvbihDTUFLRV9VU0VfT1BFTlNTTCAiVXNlIE9wZW5TU0wgY29kZS4gRXhwZXJpbWVudGFsIiBPTikKbWFya19hc19hZHZhbmNlZChDTUFLRV9VU0VfT1BFTlNTTCkKaWYoQ01BS0VfVVNFX09QRU5TU0wpCiAgaWYoV0lOMzIpCiAgICBmaW5kX3BhY2thZ2UoT3BlblNTTCkKICAgIGlmKE9QRU5TU0xfRk9VTkQpCiAgICAgIHNldChVU0VfU1NMRUFZIFRSVUUpCiAgICAgIHNldChVU0VfT1BFTlNTTCBUUlVFKQogICAgICBsaXN0KEFQUEVORCBDVVJMX0xJQlMgJHtPUEVOU1NMX0xJQlJBUklFU30gKQogICAgZWxzZSgpCiAgICAgIHNldChDTUFLRV9VU0VfT1BFTlNTTCBGQUxTRSkKICAgICAgbWVzc2FnZShTVEFUVVMgIk9wZW5TU0wgTk9UIEZvdW5kLCBkaXNhYmxpbmcgQ01BS0VfVVNFX09QRU5TU0wiKQogICAgZW5kaWYoKQogIGVsc2UoV0lOMzIpCiAgICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoImNyeXB0byIgQ1JZUFRPX2xvY2sgIEhBVkVfTElCQ1JZUFRPKQogICAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJzc2wiICAgIFNTTF9jb25uZWN0ICBIQVZFX0xJQlNTTCkKICBlbmRpZihXSU4zMikKZW5kaWYoQ01BS0VfVVNFX09QRU5TU0wpCgojIElmIHdlIGhhdmUgZmVhdHVyZXMuaCwgdGhlbiBkbyB0aGUgX0JTRF9TT1VSQ0UgbWFnaWMKY2hlY2tfaW5jbHVkZV9maWxlKCJmZWF0dXJlcy5oIiAgICAgICBIQVZFX0ZFQVRVUkVTX0gpCgojIENoZWNrIGlmIGhlYWRlciBmaWxlIGV4aXN0cyBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0LgptYWNybyhDSEVDS19JTkNMVURFX0ZJTEVfQ09OQ0FUIEZJTEUgVkFSSUFCTEUpCiAgY2hlY2tfaW5jbHVkZV9maWxlcygiJHtDVVJMX0lOQ0xVREVTfTske0ZJTEV9IiAke1ZBUklBQkxFfSkKICBpZigke1ZBUklBQkxFfSkKICAgIHNldChDVVJMX0lOQ0xVREVTICR7Q1VSTF9JTkNMVURFU30gJHtGSUxFfSkKICAgIHNldChDVVJMX1RFU1RfREVGSU5FUyAiJHtDVVJMX1RFU1RfREVGSU5FU30gLUQke1ZBUklBQkxFfSIpCiAgZW5kaWYoJHtWQVJJQUJMRX0pCmVuZG1hY3JvKENIRUNLX0lOQ0xVREVfRklMRV9DT05DQVQpCgoKIyBDaGVjayBmb3IgaGVhZGVyIGZpbGVzCmlmKE5PVCBVTklYKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndzMnRjcGlwLmgiICAgICBIQVZFX1dTMlRDUElQX0gpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgid2luc29jazIuaCIgICAgIEhBVkVfV0lOU09DSzJfSCkKZW5kaWYoTk9UIFVOSVgpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGlvLmgiICAgICAgICAgIEhBVkVfU1RESU9fSCkKaWYoTk9UIFVOSVgpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgid2luZG93cy5oIiAgICAgIEhBVkVfV0lORE9XU19IKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbnNvY2suaCIgICAgICBIQVZFX1dJTlNPQ0tfSCkKZW5kaWYoTk9UIFVOSVgpCgpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJpbnR0eXBlcy5oIiAgICAgICBIQVZFX0lOVFRZUEVTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9maWxpby5oIiAgICAgIEhBVkVfU1lTX0ZJTElPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9pb2N0bC5oIiAgICAgIEhBVkVfU1lTX0lPQ1RMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9wYXJhbS5oIiAgICAgIEhBVkVfU1lTX1BBUkFNX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9wb2xsLmgiICAgICAgIEhBVkVfU1lTX1BPTExfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3Jlc291cmNlLmgiICAgSEFWRV9TWVNfUkVTT1VSQ0VfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3NlbGVjdC5oIiAgICAgSEFWRV9TWVNfU0VMRUNUX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9zb2NrZXQuaCIgICAgIEhBVkVfU1lTX1NPQ0tFVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvc29ja2lvLmgiICAgICBIQVZFX1NZU19TT0NLSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3N0YXQuaCIgICAgICAgSEFWRV9TWVNfU1RBVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdGltZS5oIiAgICAgICBIQVZFX1NZU19USU1FX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy90eXBlcy5oIiAgICAgIEhBVkVfU1lTX1RZUEVTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy91aW8uaCIgICAgICAgIEhBVkVfU1lTX1VJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdW4uaCIgICAgICAgICBIQVZFX1NZU19VTl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdXRpbWUuaCIgICAgICBIQVZFX1NZU19VVElNRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhbGxvY2EuaCIgICAgICAgICBIQVZFX0FMTE9DQV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhcnBhL2luZXQuaCIgICAgICBIQVZFX0FSUEFfSU5FVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhcnBhL3RmdHAuaCIgICAgICBIQVZFX0FSUEFfVEZUUF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhc3NlcnQuaCIgICAgICAgICBIQVZFX0FTU0VSVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJjcnlwdG8uaCIgICAgICAgICBIQVZFX0NSWVBUT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJkZXMuaCIgICAgICAgICAgICBIQVZFX0RFU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJlcnIuaCIgICAgICAgICAgICBIQVZFX0VSUl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJlcnJuby5oIiAgICAgICAgICBIQVZFX0VSUk5PX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImZjbnRsLmgiICAgICAgICAgIEhBVkVfRkNOVExfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZ3NzYXBpL2dzc2FwaS5oIiAgSEFWRV9HU1NBUElfR1NTQVBJX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImdzc2FwaS9nc3NhcGlfZ2VuZXJpYy5oIiBIQVZFX0dTU0FQSV9HU1NBUElfR0VORVJJQ19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJnc3NhcGkvZ3NzYXBpX2tyYjUuaCIgSEFWRV9HU1NBUElfR1NTQVBJX0tSQjVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaWRuLWZyZWUuaCIgICAgICAgSEFWRV9JRE5fRlJFRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJpZmFkZHJzLmgiICAgICAgICBIQVZFX0lGQUREUlNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaW8uaCIgICAgICAgICAgICAgSEFWRV9JT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJrcmIuaCIgICAgICAgICAgICBIQVZFX0tSQl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsaWJnZW4uaCIgICAgICAgICBIQVZFX0xJQkdFTl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsaWJzc2gyLmgiICAgICAgICBIQVZFX0xJQlNTSDJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGltaXRzLmgiICAgICAgICAgSEFWRV9MSU1JVFNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibG9jYWxlLmgiICAgICAgICAgSEFWRV9MT0NBTEVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0L2lmLmgiICAgICAgICAgSEFWRV9ORVRfSUZfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0ZGIuaCIgICAgICAgICAgSEFWRV9ORVREQl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJuZXRpbmV0L2luLmgiICAgICBIQVZFX05FVElORVRfSU5fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0aW5ldC90Y3AuaCIgICAgSEFWRV9ORVRJTkVUX1RDUF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJvcGVuc3NsL2NyeXB0by5oIiBIQVZFX09QRU5TU0xfQ1JZUFRPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm9wZW5zc2wvZW5naW5lLmgiIEhBVkVfT1BFTlNTTF9FTkdJTkVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgib3BlbnNzbC9lcnIuaCIgICAgSEFWRV9PUEVOU1NMX0VSUl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJvcGVuc3NsL3BlbS5oIiAgICBIQVZFX09QRU5TU0xfUEVNX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm9wZW5zc2wvcGtjczEyLmgiIEhBVkVfT1BFTlNTTF9QS0NTMTJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgib3BlbnNzbC9yc2EuaCIgICAgSEFWRV9PUEVOU1NMX1JTQV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJvcGVuc3NsL3NzbC5oIiAgICBIQVZFX09QRU5TU0xfU1NMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm9wZW5zc2wveDUwOS5oIiAgIEhBVkVfT1BFTlNTTF9YNTA5X0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInBlbS5oIiAgICAgICAgICAgIEhBVkVfUEVNX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInBvbGwuaCIgICAgICAgICAgIEhBVkVfUE9MTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJwd2QuaCIgICAgICAgICAgICBIQVZFX1BXRF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJyc2EuaCIgICAgICAgICAgICBIQVZFX1JTQV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzZXRqbXAuaCIgICAgICAgICBIQVZFX1NFVEpNUF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzZ3R0eS5oIiAgICAgICAgICBIQVZFX1NHVFRZX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNpZ25hbC5oIiAgICAgICAgIEhBVkVfU0lHTkFMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNzbC5oIiAgICAgICAgICAgIEhBVkVfU1NMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGJvb2wuaCIgICAgICAgIEhBVkVfU1REQk9PTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRpbnQuaCIgICAgICAgICBIQVZFX1NURElOVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRpby5oIiAgICAgICAgICBIQVZFX1NURElPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGxpYi5oIiAgICAgICAgIEhBVkVfU1RETElCX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0cmluZy5oIiAgICAgICAgIEhBVkVfU1RSSU5HX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0cmluZ3MuaCIgICAgICAgIEhBVkVfU1RSSU5HU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdHJvcHRzLmgiICAgICAgICBIQVZFX1NUUk9QVFNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidGVybWlvLmgiICAgICAgICAgSEFWRV9URVJNSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidGVybWlvcy5oIiAgICAgICAgSEFWRV9URVJNSU9TX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInRpbWUuaCIgICAgICAgICAgIEhBVkVfVElNRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ0bGQuaCIgICAgICAgICAgICBIQVZFX1RMRF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ1bmlzdGQuaCIgICAgICAgICBIQVZFX1VOSVNURF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ1dGltZS5oIiAgICAgICAgICBIQVZFX1VUSU1FX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIng1MDkuaCIgICAgICAgICAgIEhBVkVfWDUwOV9IKQoKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicHJvY2Vzcy5oIiAgICAgICAgSEFWRV9QUk9DRVNTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGRlZi5oIiAgICAgICAgIEhBVkVfU1REREVGX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImRsZmNuLmgiICAgICAgICAgIEhBVkVfRExGQ05fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibWFsbG9jLmgiICAgICAgICAgSEFWRV9NQUxMT0NfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibWVtb3J5LmgiICAgICAgICAgSEFWRV9NRU1PUllfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGRhcC5oIiAgICAgICAgICAgSEFWRV9MREFQX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm5ldGluZXQvaWZfZXRoZXIuaCIgSEFWRV9ORVRJTkVUX0lGX0VUSEVSX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGludC5oIiAgICAgICAgSEFWRV9TVERJTlRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic29ja2lvLmgiICAgICAgICBIQVZFX1NPQ0tJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdXRzbmFtZS5oIiAgIEhBVkVfU1lTX1VUU05BTUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaWRuYS5oIiAgICAgICAgICBIQVZFX0lETkFfSCkKCmlmKENNQUtFX1VTRV9PUEVOU1NMKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm9wZW5zc2wvcmFuZC5oIiAgIEhBVkVfT1BFTlNTTF9SQU5EX0gpCmVuZGlmKENNQUtFX1VTRV9PUEVOU1NMKQoKaWYoTk9UIEhBVkVfTERBUF9IKQogIG1lc3NhZ2UoU1RBVFVTICJMREFQX0ggbm90IGZvdW5kIENVUkxfRElTQUJMRV9MREFQIHNldCBPTiIpCiAgc2V0KENVUkxfRElTQUJMRV9MREFQIE9OIENBQ0hFIEJPT0wgIiIgRk9SQ0UpCmVuZGlmKCkKCgpjaGVja190eXBlX3NpemUoc2l6ZV90ICBTSVpFT0ZfU0laRV9UKQpjaGVja190eXBlX3NpemUoc3NpemVfdCAgU0laRU9GX1NTSVpFX1QpCmNoZWNrX3R5cGVfc2l6ZSgibG9uZyBsb25nIiAgU0laRU9GX0xPTkdfTE9ORykKY2hlY2tfdHlwZV9zaXplKCJsb25nIiAgU0laRU9GX0xPTkcpCmNoZWNrX3R5cGVfc2l6ZSgic2hvcnQiICBTSVpFT0ZfU0hPUlQpCmNoZWNrX3R5cGVfc2l6ZSgiaW50IiAgU0laRU9GX0lOVCkKY2hlY2tfdHlwZV9zaXplKCJfX2ludDY0IiAgU0laRU9GX19fSU5UNjQpCmNoZWNrX3R5cGVfc2l6ZSgibG9uZyBkb3VibGUiICBTSVpFT0ZfTE9OR19ET1VCTEUpCmNoZWNrX3R5cGVfc2l6ZSgidGltZV90IiAgU0laRU9GX1RJTUVfVCkKaWYoTk9UIEhBVkVfU0laRU9GX1NTSVpFX1QpCiAgaWYoU0laRU9GX0xPTkcgRVFVQUwgU0laRU9GX1NJWkVfVCkKICAgIHNldChzc2l6ZV90IGxvbmcpCiAgZW5kaWYoU0laRU9GX0xPTkcgRVFVQUwgU0laRU9GX1NJWkVfVCkKICBpZihOT1Qgc3NpemVfdCBBTkQgU0laRU9GX19fSU5UNjQgRVFVQUwgU0laRU9GX1NJWkVfVCkKICAgIHNldChzc2l6ZV90IF9faW50NjQpCiAgZW5kaWYoTk9UIHNzaXplX3QgQU5EIFNJWkVPRl9fX0lOVDY0IEVRVUFMIFNJWkVPRl9TSVpFX1QpCmVuZGlmKE5PVCBIQVZFX1NJWkVPRl9TU0laRV9UKQoKIyBEaWZmZXJlbnQgc2l6ZW9mcywgZXRjLgoKIyAgICBkZWZpbmUgQ1VSTF9TSVpFT0ZfTE9ORyAgICAgICAgNAojICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICBsb25nIGxvbmcKIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgImxsZCIKIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgImxsdSIKIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfT0ZGX1QgICAgICAgIiVsbGQiCiMgICAgZGVmaW5lIENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgIDgKIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgTEwKIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgVUxMCgpzZXQoQ1VSTF9TSVpFT0ZfTE9ORyAke1NJWkVPRl9MT05HfSkKCmlmKFNJWkVPRl9MT05HIEVRVUFMIDgpCiAgc2V0KENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgbG9uZykKICBzZXQoQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCA4KQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICJsZCIpCiAgc2V0KENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICJsdSIpCiAgc2V0KENVUkxfRk9STUFUX09GRl9UICIlbGQiKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UIEwpCiAgc2V0KENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVIExVKQplbmRpZihTSVpFT0ZfTE9ORyBFUVVBTCA4KQoKaWYoU0laRU9GX0xPTkdfTE9ORyBFUVVBTCA4KQogIHNldChDVVJMX1RZUEVPRl9DVVJMX09GRl9UICJsb25nIGxvbmciKQogIHNldChDVVJMX1NJWkVPRl9DVVJMX09GRl9UIDgpCiAgc2V0KENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgImxsZCIpCiAgc2V0KENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICJsbHUiKQogIHNldChDVVJMX0ZPUk1BVF9PRkZfVCAiJWxsZCIpCiAgc2V0KENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgTEwpCiAgc2V0KENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVIExMVSkKZW5kaWYoU0laRU9GX0xPTkdfTE9ORyBFUVVBTCA4KQoKaWYoTk9UIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QpCiAgc2V0KENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgJHtzc2l6ZV90fSkKICBzZXQoQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCAke1NJWkVPRl9TU0laRV9UfSkKICAjIFRPRE86IG5lZWQgYWRqdXN0bWVudCBoZXJlLgogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICJsZCIpCiAgc2V0KENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICJsdSIpCiAgc2V0KENVUkxfRk9STUFUX09GRl9UICIlbGQiKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UIEwpCiAgc2V0KENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVIExVKQplbmRpZihOT1QgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCkKCmlmKEhBVkVfU0laRU9GX0xPTkdfTE9ORykKICBzZXQoSEFWRV9MT05HTE9ORyAxKQogIHNldChIQVZFX0xMIDEpCmVuZGlmKEhBVkVfU0laRU9GX0xPTkdfTE9ORykKCmZpbmRfZmlsZShSQU5ET01fRklMRSB1cmFuZG9tIC9kZXYpCm1hcmtfYXNfYWR2YW5jZWQoUkFORE9NX0ZJTEUpCgojIENoZWNrIGZvciBzb21lIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkCmNoZWNrX3N5bWJvbF9leGlzdHMoYmFzZW5hbWUgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9CQVNFTkFNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzb2NrZXQgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NPQ0tFVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhwb2xsICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1BPTEwpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2VsZWN0ICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TRUxFQ1QpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyZHVwICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJEVVApCmNoZWNrX3N5bWJvbF9leGlzdHMoc3Ryc3RyICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJTVFIpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RydG9rX3IgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJUT0tfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJmdGltZSAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkZUSU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKHVuYW1lICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVU5BTUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyY2FzZWNtcCAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJDQVNFQ01QKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmljbXAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSSUNNUCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJjbXBpICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkNNUEkpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RybmNtcGkgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJOQ01QSSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhhbGFybSAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0FMQVJNKQppZihOT1QgSEFWRV9TVFJOQ01QSSkKICBzZXQoSEFWRV9TVFJDTVBJKQplbmRpZihOT1QgSEFWRV9TVFJOQ01QSSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRob3N0YnlhZGRyICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVEhPU1RCWUFERFIpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0aG9zdGJ5YWRkcl9yICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVEhPU1RCWUFERFJfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXR0aW1lb2ZkYXkgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVFRJTUVPRkRBWSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhpbmV0X2FkZHIgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0lORVRfQUREUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhpbmV0X250b2EgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0lORVRfTlRPQSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhpbmV0X250b2FfciAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0lORVRfTlRPQV9SKQpjaGVja19zeW1ib2xfZXhpc3RzKHRjc2V0YXR0ciAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVENTRVRBVFRSKQpjaGVja19zeW1ib2xfZXhpc3RzKHRjZ2V0YXR0ciAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVENHRVRBVFRSKQpjaGVja19zeW1ib2xfZXhpc3RzKHBlcnJvciAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUEVSUk9SKQpjaGVja19zeW1ib2xfZXhpc3RzKGNsb3Nlc29ja2V0ICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfQ0xPU0VTT0NLRVQpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2V0dmJ1ZiAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TRVRWQlVGKQpjaGVja19zeW1ib2xfZXhpc3RzKHNpZ3NldGptcCAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0lHU0VUSk1QKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHBhc3NfciAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUUEFTU19SKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmxjYXQgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSTENBVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRwd3VpZCAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVFBXVUlEKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldGV1aWQgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VURVVJRCkKY2hlY2tfc3ltYm9sX2V4aXN0cyh1dGltZSAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1VUSU1FKQppZihDTUFLRV9VU0VfT1BFTlNTTCkKICBjaGVja19zeW1ib2xfZXhpc3RzKFJBTkRfc3RhdHVzICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUkFORF9TVEFUVVMpCiAgY2hlY2tfc3ltYm9sX2V4aXN0cyhSQU5EX3NjcmVlbiAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1JBTkRfU0NSRUVOKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoUkFORF9lZ2QgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9SQU5EX0VHRCkKICBjaGVja19zeW1ib2xfZXhpc3RzKENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhICIke0NVUkxfSU5DTFVERVN9IgogICAgSEFWRV9DUllQVE9fQ0xFQU5VUF9BTExfRVhfREFUQSkKICBpZihIQVZFX0xJQkNSWVBUTyBBTkQgSEFWRV9MSUJTU0wpCiAgICBzZXQoVVNFX09QRU5TU0wgMSkKICAgIHNldChVU0VfU1NMRUFZIDEpCiAgZW5kaWYoSEFWRV9MSUJDUllQVE8gQU5EIEhBVkVfTElCU1NMKQplbmRpZihDTUFLRV9VU0VfT1BFTlNTTCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnbXRpbWVfciAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dNVElNRV9SKQpjaGVja19zeW1ib2xfZXhpc3RzKGxvY2FsdGltZV9yICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfTE9DQUxUSU1FX1IpCgpjaGVja19zeW1ib2xfZXhpc3RzKGdldGhvc3RieW5hbWUgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRIT1NUQllOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldGhvc3RieW5hbWVfciAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRIT1NUQllOQU1FX1IpCgpjaGVja19zeW1ib2xfZXhpc3RzKHNpZ25hbCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0lHTkFMX0ZVTkMpCmNoZWNrX3N5bWJvbF9leGlzdHMoU0lHQUxSTSAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TSUdOQUxfTUFDUk8pCmlmKEhBVkVfU0lHTkFMX0ZVTkMgQU5EIEhBVkVfU0lHTkFMX01BQ1JPKQogIHNldChIQVZFX1NJR05BTCAxKQplbmRpZihIQVZFX1NJR05BTF9GVU5DIEFORCBIQVZFX1NJR05BTF9NQUNSTykKY2hlY2tfc3ltYm9sX2V4aXN0cyh1bmFtZSAgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9VTkFNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJ0b2xsICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJUT0xMKQpjaGVja19zeW1ib2xfZXhpc3RzKF9zdHJ0b2k2NCAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX19TVFJUT0k2NCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJlcnJvcl9yICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJFUlJPUl9SKQpjaGVja19zeW1ib2xfZXhpc3RzKHNpZ2ludGVycnVwdCAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NJR0lOVEVSUlVQVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhwZXJyb3IgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9QRVJST1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoZm9yayAgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRk9SSykKY2hlY2tfc3ltYm9sX2V4aXN0cyhmcmVlYWRkcmluZm8gICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9GUkVFQUREUklORk8pCmNoZWNrX3N5bWJvbF9leGlzdHMoZnJlZWlmYWRkcnMgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRlJFRUlGQUREUlMpCmNoZWNrX3N5bWJvbF9leGlzdHMocGlwZSAgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUElQRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhmdHJ1bmNhdGUgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9GVFJVTkNBVEUpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0cHJvdG9ieW5hbWUgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUUFJPVE9CWU5BTUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0cmxpbWl0ICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUUkxJTUlUKQpjaGVja19zeW1ib2xfZXhpc3RzKGlkbl9mcmVlICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0lETl9GUkVFKQpjaGVja19zeW1ib2xfZXhpc3RzKGlkbmFfc3RyZXJyb3IgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0lETkFfU1RSRVJST1IpCmNoZWNrX3N5bWJvbF9leGlzdHModGxkX3N0cmVycm9yICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVExEX1NUUkVSUk9SKQpjaGVja19zeW1ib2xfZXhpc3RzKHNldGxvY2FsZSAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFVExPQ0FMRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZXRybGltaXQgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TRVRSTElNSVQpCmNoZWNrX3N5bWJvbF9leGlzdHMoZmNudGwgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRkNOVEwpCmNoZWNrX3N5bWJvbF9leGlzdHMoaW9jdGwgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU9DVEwpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2V0c29ja29wdCAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VUU09DS09QVCkKCiMgc3ltYm9sIGV4aXN0cyBpbiB3aW4zMiwgYnV0IGZ1bmN0aW9uIGRvZXMgbm90LgpjaGVja19mdW5jdGlvbl9leGlzdHMoaW5ldF9wdG9uIEhBVkVfSU5FVF9QVE9OKQoKIyBzaWdhY3Rpb24gYW5kIHNpZ3NldGptcCBhcmUgc3BlY2lhbC4gVXNlIHNwZWNpYWwgbWVjaGFuaXNtIGZvcgojIGRldGVjdGluZyB0aG9zZSwgYnV0IG9ubHkgaWYgcHJldmlvdXMgYXR0ZW1wdCBmYWlsZWQuCmlmKEhBVkVfU0lHTkFMX0gpCiAgY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWdhY3Rpb24gInNpZ25hbC5oIiBIQVZFX1NJR0FDVElPTikKZW5kaWYoSEFWRV9TSUdOQUxfSCkKCmlmKE5PVCBIQVZFX1NJR1NFVEpNUCkKICBpZihIQVZFX1NFVEpNUF9IKQogICAgY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWdzZXRqbXAgInNldGptcC5oIiBIQVZFX01BQ1JPX1NJR1NFVEpNUCkKICAgIGlmKEhBVkVfTUFDUk9fU0lHU0VUSk1QKQogICAgICBzZXQoSEFWRV9TSUdTRVRKTVAgMSkKICAgIGVuZGlmKEhBVkVfTUFDUk9fU0lHU0VUSk1QKQogIGVuZGlmKEhBVkVfU0VUSk1QX0gpCmVuZGlmKE5PVCBIQVZFX1NJR1NFVEpNUCkKCiMgSWYgdGhlcmUgaXMgbm8gc3RyaWNtcCgpLCBkbyBub3QgYWxsb3cgTERBUCB0byBwYXJzZSBVUkxzCmlmKE5PVCBIQVZFX1NUUklDTVApCiAgc2V0KEhBVkVfTERBUF9VUkxfUEFSU0UgMSkKZW5kaWYoTk9UIEhBVkVfU1RSSUNNUCkKCiMgRm9yIG90aGVyIGN1cmwgc3BlY2lmaWMgdGVzdHMsIHVzZSB0aGlzIG1hY3JvLgptYWNybyhDVVJMX0lOVEVSTkFMX1RFU1QgQ1VSTF9URVNUKQogIGlmKCIke0NVUkxfVEVTVH0iIE1BVENIRVMgIl4ke0NVUkxfVEVTVH0kIikKICAgIHNldChNQUNST19DSEVDS19GVU5DVElPTl9ERUZJTklUSU9OUwogICAgICAiLUQke0NVUkxfVEVTVH0gJHtDVVJMX1RFU1RfREVGSU5FU30gJHtDTUFLRV9SRVFVSVJFRF9GTEFHU30iKQogICAgaWYoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTKQogICAgICBzZXQoQ1VSTF9URVNUX0FERF9MSUJSQVJJRVMKICAgICAgICAiLURMSU5LX0xJQlJBUklFUzpTVFJJTkc9JHtDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVN9IikKICAgIGVuZGlmKENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUykKCiAgICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBDdXJsIFRlc3QgJHtDVVJMX1RFU1R9IikKICAgIHRyeV9jb21waWxlKCR7Q1VSTF9URVNUfQogICAgICAke0NNQUtFX0JJTkFSWV9ESVJ9CiAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9DTWFrZS9DdXJsVGVzdHMuYwogICAgICBDTUFLRV9GTEFHUyAtRENPTVBJTEVfREVGSU5JVElPTlM6U1RSSU5HPSR7TUFDUk9fQ0hFQ0tfRlVOQ1RJT05fREVGSU5JVElPTlN9CiAgICAgICIke0NVUkxfVEVTVF9BRERfTElCUkFSSUVTfSIKICAgICAgT1VUUFVUX1ZBUklBQkxFIE9VVFBVVCkKICAgIGlmKCR7Q1VSTF9URVNUfSkKICAgICAgc2V0KCR7Q1VSTF9URVNUfSAxIENBQ0hFIElOVEVSTkFMICJDdXJsIHRlc3QgJHtGVU5DVElPTn0iKQogICAgICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBDdXJsIFRlc3QgJHtDVVJMX1RFU1R9IC0gU3VjY2VzcyIpCiAgICAgIGZpbGUoQVBQRU5EICR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VPdXRwdXQubG9nCiAgICAgICAgIlBlcmZvcm1pbmcgQ3VybCBUZXN0ICR7Q1VSTF9URVNUfSBwYXNzZWQgd2l0aCB0aGUgZm9sbG93aW5nIG91dHB1dDpcbiIKICAgICAgICAiJHtPVVRQVVR9XG4iKQogICAgZWxzZSgke0NVUkxfVEVTVH0pCiAgICAgIG1lc3NhZ2UoU1RBVFVTICJQZXJmb3JtaW5nIEN1cmwgVGVzdCAke0NVUkxfVEVTVH0gLSBGYWlsZWQiKQogICAgICBzZXQoJHtDVVJMX1RFU1R9ICIiIENBQ0hFIElOVEVSTkFMICJDdXJsIHRlc3QgJHtGVU5DVElPTn0iKQogICAgICBmaWxlKEFQUEVORCAke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlRXJyb3IubG9nCiAgICAgICAgIlBlcmZvcm1pbmcgQ3VybCBUZXN0ICR7Q1VSTF9URVNUfSBmYWlsZWQgd2l0aCB0aGUgZm9sbG93aW5nIG91dHB1dDpcbiIKICAgICAgICAiJHtPVVRQVVR9XG4iKQogICAgZW5kaWYoJHtDVVJMX1RFU1R9KQogIGVuZGlmKCIke0NVUkxfVEVTVH0iIE1BVENIRVMgIl4ke0NVUkxfVEVTVH0kIikKZW5kbWFjcm8oQ1VSTF9JTlRFUk5BTF9URVNUKQoKbWFjcm8oQ1VSTF9JTlRFUk5BTF9URVNUX1JVTiBDVVJMX1RFU1QpCiAgaWYoIiR7Q1VSTF9URVNUfV9DT01QSUxFIiBNQVRDSEVTICJeJHtDVVJMX1RFU1R9X0NPTVBJTEUkIikKICAgIHNldChNQUNST19DSEVDS19GVU5DVElPTl9ERUZJTklUSU9OUwogICAgICAiLUQke0NVUkxfVEVTVH0gJHtDTUFLRV9SRVFVSVJFRF9GTEFHU30iKQogICAgaWYoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTKQogICAgICBzZXQoQ1VSTF9URVNUX0FERF9MSUJSQVJJRVMKICAgICAgICAiLURMSU5LX0xJQlJBUklFUzpTVFJJTkc9JHtDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVN9IikKICAgIGVuZGlmKENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUykKCiAgICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBDdXJsIFRlc3QgJHtDVVJMX1RFU1R9IikKICAgIHRyeV9ydW4oJHtDVVJMX1RFU1R9ICR7Q1VSTF9URVNUfV9DT01QSUxFCiAgICAgICR7Q01BS0VfQklOQVJZX0RJUn0KICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0NNYWtlL0N1cmxUZXN0cy5jCiAgICAgIENNQUtFX0ZMQUdTIC1EQ09NUElMRV9ERUZJTklUSU9OUzpTVFJJTkc9JHtNQUNST19DSEVDS19GVU5DVElPTl9ERUZJTklUSU9OU30KICAgICAgIiR7Q1VSTF9URVNUX0FERF9MSUJSQVJJRVN9IgogICAgICBPVVRQVVRfVkFSSUFCTEUgT1VUUFVUKQogICAgaWYoJHtDVVJMX1RFU1R9X0NPTVBJTEUgQU5EIE5PVCAke0NVUkxfVEVTVH0pCiAgICAgIHNldCgke0NVUkxfVEVTVH0gMSBDQUNIRSBJTlRFUk5BTCAiQ3VybCB0ZXN0ICR7RlVOQ1RJT059IikKICAgICAgbWVzc2FnZShTVEFUVVMgIlBlcmZvcm1pbmcgQ3VybCBUZXN0ICR7Q1VSTF9URVNUfSAtIFN1Y2Nlc3MiKQogICAgZWxzZSgke0NVUkxfVEVTVH1fQ09NUElMRSBBTkQgTk9UICR7Q1VSTF9URVNUfSkKICAgICAgbWVzc2FnZShTVEFUVVMgIlBlcmZvcm1pbmcgQ3VybCBUZXN0ICR7Q1VSTF9URVNUfSAtIEZhaWxlZCIpCiAgICAgIHNldCgke0NVUkxfVEVTVH0gIiIgQ0FDSEUgSU5URVJOQUwgIkN1cmwgdGVzdCAke0ZVTkNUSU9OfSIpCiAgICAgIGZpbGUoQVBQRU5EICIke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlRXJyb3IubG9nIgogICAgICAgICJQZXJmb3JtaW5nIEN1cmwgVGVzdCAke0NVUkxfVEVTVH0gZmFpbGVkIHdpdGggdGhlIGZvbGxvd2luZyBvdXRwdXQ6XG4iCiAgICAgICAgIiR7T1VUUFVUfSIpCiAgICAgIGlmKCR7Q1VSTF9URVNUfV9DT01QSUxFKQogICAgICAgIGZpbGUoQVBQRU5ECiAgICAgICAgICAiJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZUVycm9yLmxvZyIKICAgICAgICAgICJUaGVyZSB3YXMgYSBwcm9ibGVtIHJ1bm5pbmcgdGhpcyB0ZXN0XG4iKQogICAgICBlbmRpZigke0NVUkxfVEVTVH1fQ09NUElMRSkKICAgICAgZmlsZShBUFBFTkQgIiR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VFcnJvci5sb2ciCiAgICAgICAgIlxuXG4iKQogICAgZW5kaWYoJHtDVVJMX1RFU1R9X0NPTVBJTEUgQU5EIE5PVCAke0NVUkxfVEVTVH0pCiAgZW5kaWYoIiR7Q1VSTF9URVNUfV9DT01QSUxFIiBNQVRDSEVTICJeJHtDVVJMX1RFU1R9X0NPTVBJTEUkIikKZW5kbWFjcm8oQ1VSTF9JTlRFUk5BTF9URVNUX1JVTikKCiMgRG8gY3VybCBzcGVjaWZpYyB0ZXN0cwpmb3JlYWNoKENVUkxfVEVTVAogICAgSEFWRV9GQ05UTF9PX05PTkJMT0NLCiAgICBIQVZFX0lPQ1RMU09DS0VUCiAgICBIQVZFX0lPQ1RMU09DS0VUX0NBTUVMCiAgICBIQVZFX0lPQ1RMU09DS0VUX0NBTUVMX0ZJT05CSU8KICAgIEhBVkVfSU9DVExTT0NLRVRfRklPTkJJTwogICAgSEFWRV9JT0NUTF9GSU9OQklPCiAgICBIQVZFX0lPQ1RMX1NJT0NHSUZBRERSCiAgICBIQVZFX1NFVFNPQ0tPUFRfU09fTk9OQkxPQ0sKICAgIEhBVkVfU09DS0FERFJfSU42X1NJTjZfU0NPUEVfSUQKICAgIFRJTUVfV0lUSF9TWVNfVElNRQogICAgSEFWRV9PX05PTkJMT0NLCiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl81CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl83CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl84CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl81X1JFRU5UUkFOVAogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfN19SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzhfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl81CiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl82CiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zX1JFRU5UUkFOVAogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNV9SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzZfUkVFTlRSQU5UCiAgICBIQVZFX1NPQ0tMRU5fVAogICAgSEFWRV9JTl9BRERSX1QKICAgIEhBVkVfQk9PTF9UCiAgICBTVERDX0hFQURFUlMKICAgIFJFVFNJR1RZUEVfVEVTVAogICAgSEFWRV9JTkVUX05UT0FfUl9ERUNMCiAgICBIQVZFX0lORVRfTlRPQV9SX0RFQ0xfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEFERFJJTkZPCiAgICBIQVZFX0ZJTEVfT0ZGU0VUX0JJVFMKICAgICkKICBjdXJsX2ludGVybmFsX3Rlc3QoJHtDVVJMX1RFU1R9KQplbmRmb3JlYWNoKENVUkxfVEVTVCkKaWYoSEFWRV9GSUxFX09GRlNFVF9CSVRTKQogIHNldChfRklMRV9PRkZTRVRfQklUUyA2NCkKZW5kaWYoSEFWRV9GSUxFX09GRlNFVF9CSVRTKQpmb3JlYWNoKENVUkxfVEVTVAogICAgSEFWRV9HTElCQ19TVFJFUlJPUl9SCiAgICBIQVZFX1BPU0lYX1NUUkVSUk9SX1IKICAgICkKICBjdXJsX2ludGVybmFsX3Rlc3RfcnVuKCR7Q1VSTF9URVNUfSkKZW5kZm9yZWFjaChDVVJMX1RFU1QpCgojIENoZWNrIGZvciByZWVudHJhbnQKZm9yZWFjaChDVVJMX1RFU1QKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzUKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzcKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzgKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzMKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzUKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzYKICAgIEhBVkVfSU5FVF9OVE9BX1JfREVDTF9SRUVOVFJBTlQpCiAgaWYoTk9UICR7Q1VSTF9URVNUfSkKICAgIGlmKCR7Q1VSTF9URVNUfV9SRUVOVFJBTlQpCiAgICAgIHNldChORUVEX1JFRU5UUkFOVCAxKQogICAgZW5kaWYoJHtDVVJMX1RFU1R9X1JFRU5UUkFOVCkKICBlbmRpZihOT1QgJHtDVVJMX1RFU1R9KQplbmRmb3JlYWNoKENVUkxfVEVTVCkKCmlmKE5FRURfUkVFTlRSQU5UKQogIGZvcmVhY2goQ1VSTF9URVNUCiAgICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzUKICAgICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNwogICAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl84CiAgICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzMKICAgICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNQogICAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl82KQogICAgc2V0KCR7Q1VSTF9URVNUfSAwKQogICAgaWYoJHtDVVJMX1RFU1R9X1JFRU5UUkFOVCkKICAgICAgc2V0KCR7Q1VSTF9URVNUfSAxKQogICAgZW5kaWYoJHtDVVJMX1RFU1R9X1JFRU5UUkFOVCkKICBlbmRmb3JlYWNoKENVUkxfVEVTVCkKZW5kaWYoTkVFRF9SRUVOVFJBTlQpCgppZihIQVZFX0lORVRfTlRPQV9SX0RFQ0xfUkVFTlRSQU5UKQogIHNldChIQVZFX0lORVRfTlRPQV9SX0RFQ0wgMSkKICBzZXQoTkVFRF9SRUVOVFJBTlQgMSkKZW5kaWYoSEFWRV9JTkVUX05UT0FfUl9ERUNMX1JFRU5UUkFOVCkKCiMgU29tZSBvdGhlciBtaW5vciB0ZXN0cwoKaWYoTk9UIEhBVkVfSU5fQUREUl9UKQogIHNldChpbl9hZGRyX3QgInVuc2lnbmVkIGxvbmciKQplbmRpZihOT1QgSEFWRV9JTl9BRERSX1QpCgojIEZpeCBsaWJ6IC8gemxpYi5oCgppZihOT1QgQ1VSTF9TUEVDSUFMX0xJQlopCiAgaWYoTk9UIEhBVkVfTElCWikKICAgIHNldChIQVZFX1pMSUJfSCAwKQogIGVuZGlmKE5PVCBIQVZFX0xJQlopCgogIGlmKE5PVCBIQVZFX1pMSUJfSCkKICAgIHNldChIQVZFX0xJQlogMCkKICBlbmRpZihOT1QgSEFWRV9aTElCX0gpCmVuZGlmKE5PVCBDVVJMX1NQRUNJQUxfTElCWikKCmlmKF9GSUxFX09GRlNFVF9CSVRTKQogIHNldChfRklMRV9PRkZTRVRfQklUUyA2NCkKZW5kaWYoX0ZJTEVfT0ZGU0VUX0JJVFMpCnNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAiLURfRklMRV9PRkZTRVRfQklUUz02NCIpCnNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY3VybC9jdXJsLmgiKQpjaGVja190eXBlX3NpemUoImN1cmxfb2ZmX3QiIFNJWkVPRl9DVVJMX09GRl9UKQpzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUykKc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTKQoKCiMgQ2hlY2sgZm9yIG5vbmJsb2NraW5nCnNldChIQVZFX0RJU0FCTEVEX05PTkJMT0NLSU5HIDEpCmlmKEhBVkVfRklPTkJJTyBPUgogICAgSEFWRV9JT0NUTFNPQ0tFVCBPUgogICAgSEFWRV9JT0NUTFNPQ0tFVF9DQVNFIE9SCiAgICBIQVZFX09fTk9OQkxPQ0spCiAgc2V0KEhBVkVfRElTQUJMRURfTk9OQkxPQ0tJTkcpCmVuZGlmKEhBVkVfRklPTkJJTyBPUgogIEhBVkVfSU9DVExTT0NLRVQgT1IKICBIQVZFX0lPQ1RMU09DS0VUX0NBU0UgT1IKICBIQVZFX09fTk9OQkxPQ0spCgppZihSRVRTSUdUWVBFX1RFU1QpCiAgc2V0KFJFVFNJR1RZUEUgdm9pZCkKZWxzZShSRVRTSUdUWVBFX1RFU1QpCiAgc2V0KFJFVFNJR1RZUEUgaW50KQplbmRpZihSRVRTSUdUWVBFX1RFU1QpCgppZihDTUFLRV9DT01QSUxFUl9JU19HTlVDQyBBTkQgQVBQTEUpCiAgaW5jbHVkZShDaGVja0NDb21waWxlckZsYWcpCiAgY2hlY2tfY19jb21waWxlcl9mbGFnKC1Xbm8tbG9uZy1kb3VibGUgSEFWRV9DX0ZMQUdfV25vX2xvbmdfZG91YmxlKQogIGlmKEhBVkVfQ19GTEFHX1dub19sb25nX2RvdWJsZSkKICAgICMgVGhlIE1hYyB2ZXJzaW9uIG9mIEdDQyB3YXJucyBhYm91dCB1c2Ugb2YgbG9uZyBkb3VibGUuICBEaXNhYmxlIGl0LgogICAgZ2V0X3NvdXJjZV9maWxlX3Byb3BlcnR5KE1QUklOVEZfQ09NUElMRV9GTEFHUyBtcHJpbnRmLmMgQ09NUElMRV9GTEFHUykKICAgIGlmKE1QUklOVEZfQ09NUElMRV9GTEFHUykKICAgICAgc2V0KE1QUklOVEZfQ09NUElMRV9GTEFHUyAiJHtNUFJJTlRGX0NPTVBJTEVfRkxBR1N9IC1Xbm8tbG9uZy1kb3VibGUiKQogICAgZWxzZShNUFJJTlRGX0NPTVBJTEVfRkxBR1MpCiAgICAgIHNldChNUFJJTlRGX0NPTVBJTEVfRkxBR1MgIi1Xbm8tbG9uZy1kb3VibGUiKQogICAgZW5kaWYoTVBSSU5URl9DT01QSUxFX0ZMQUdTKQogICAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKG1wcmludGYuYyBQUk9QRVJUSUVTCiAgICAgIENPTVBJTEVfRkxBR1MgJHtNUFJJTlRGX0NPTVBJTEVfRkxBR1N9KQogIGVuZGlmKEhBVkVfQ19GTEFHX1dub19sb25nX2RvdWJsZSkKZW5kaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ0MgQU5EIEFQUExFKQoKaWYoSEFWRV9TT0NLTEVOX1QpCiAgc2V0KENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UICJzb2NrbGVuX3QiKQogIGlmKFdJTjMyKQogICAgc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMgIndpbnNvY2syLmg7d3MydGNwaXAuaCIpCiAgZWxzZWlmKEhBVkVfU1lTX1NPQ0tFVF9IKQogICAgc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMgInN5cy9zb2NrZXQuaCIpCiAgZW5kaWYoKQogIGNoZWNrX3R5cGVfc2l6ZSgic29ja2xlbl90IiBDVVJMX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCkKICBzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUykKICBpZihOT1QgSEFWRV9DVVJMX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCkKICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IKICAgICAiQ2hlY2sgZm9yIHNpemVvZiBzb2NrbGVuX3QgZmFpbGVkLCBzZWUgQ01ha2VGaWxlcy9DTWFrZXJyb3IubG9nIikKICBlbmRpZigpCmVsc2UoKQogIHNldChDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQpCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfU09DS0xFTl9UICR7U0laRU9GX0lOVH0pCmVuZGlmKCkKCmluY2x1ZGUoQ01ha2UvT3RoZXJUZXN0cy5jbWFrZSkKCmFkZF9kZWZpbml0aW9ucygtREhBVkVfQ09ORklHX0gpCgojIEZvciB3aW5kb3dzLCBkbyBub3QgYWxsb3cgdGhlIGNvbXBpbGVyIHRvIHVzZSBkZWZhdWx0IHRhcmdldCAoVmlzdGEpLgppZihXSU4zMikKICBhZGRfZGVmaW5pdGlvbnMoLURfV0lOMzJfV0lOTlQ9MHgwNTAxKQplbmRpZihXSU4zMikKCmlmKE1TVkMpCiAgYWRkX2RlZmluaXRpb25zKC1EX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIC1EX0NSVF9OT05TVERDX05PX0RFUFJFQ0FURSkKZW5kaWYoTVNWQykKCiMgU2V0cyB1cCB0aGUgZGVwZW5kZW5jaWVzICh6bGliLCBPcGVuU1NMLCBldGMuKSBvZiBhIGNVUkwgc3VicHJvamVjdCBhY2NvcmRpbmcgdG8gb3B0aW9ucy4KIyBUT0RPIFRoaXMgaXMgZmFyIHRvIGJlIGNvbXBsZXRlIQpmdW5jdGlvbihTRVRVUF9DVVJMX0RFUEVOREVOQ0lFUyBUQVJHRVRfTkFNRSkKICBpZihDVVJMX1pMSUIgQU5EIFpMSUJfRk9VTkQpCiAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7WkxJQl9JTkNMVURFX0RJUn0pCiAgZW5kaWYoKQogIGlmKENVUkxfWkxJQiBBTkQgWkxJQl9GT1VORCkKICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke1RBUkdFVF9OQU1FfSAke1pMSUJfTElCUkFSSUVTfSkKICAgICNBRERfREVGSU5JVElPTlMoIC1ESEFWRV9aTElCX0ggLURIQVZFX1pMSUIgLURIQVZFX0xJQlogKQogIGVuZGlmKCkKCiAgaWYoQ01BS0VfVVNFX09QRU5TU0wgQU5EIE9QRU5TU0xfRk9VTkQpCiAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7T1BFTlNTTF9JTkNMVURFX0RJUn0pCiAgZW5kaWYoKQogIGlmKENNQUtFX1VTRV9PUEVOU1NMIEFORCBDVVJMX0NPTkZJR19IQVNfQkVFTl9SVU5fQkVGT1JFKQogICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7VEFSR0VUX05BTUV9ICR7T1BFTlNTTF9MSUJSQVJJRVN9KQogICAgI0FERF9ERUZJTklUSU9OUyggLURVU0VfU1NMRUFZICkKICBlbmRpZigpCmVuZGZ1bmN0aW9uKCkKCiMgVWdseSAoYnV0IGZ1bmN0aW9uYWwpIHdheSB0byBpbmNsdWRlICJNYWtlZmlsZS5pbmMiIGJ5IHRyYW5zZm9ybWluZyBpdCAoPSByZWdlbmVyYXRlIGl0KS4KZnVuY3Rpb24oVFJBTlNGT1JNX01BS0VGSUxFX0lOQyBJTlBVVF9GSUxFIE9VVFBVVF9GSUxFKQogIGZpbGUoUkVBRCAke0lOUFVUX0ZJTEV9IE1BS0VGSUxFX0lOQ19URVhUKQogIHN0cmluZyhSRVBMQUNFICIkKHRvcF9zcmNkaXIpIiAgICJcJHtDVVJMX1NPVVJDRV9ESVJ9IiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkKICBzdHJpbmcoUkVQTEFDRSAiJCh0b3BfYnVpbGRkaXIpIiAiXCR7Q1VSTF9CSU5BUllfRElSfSIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pCgogIHN0cmluZyhSRUdFWCBSRVBMQUNFICJcXFxcXG4iICKnIaciIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KQogIHN0cmluZyhSRUdFWCBSRVBMQUNFICIoW2EtekEtWl9dW2EtekEtWjAtOV9dKilbXHQgXSo9W1x0IF0qKFteXG5dKikiICJTRVQoXFwxIFxcMikiIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KQogIHN0cmluZyhSRVBMQUNFICKnIaciICJcbiIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pCgogIHN0cmluZyhSRUdFWCBSRVBMQUNFICJcXCRcXCgoW2EtekEtWl9dW2EtekEtWjAtOV9dKilcXCkiICJcJHtcXDF9IiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkgICAgIyBSZXBsYWNlICQoKSB3aXRoICR7fQogIHN0cmluZyhSRUdFWCBSRVBMQUNFICJAKFthLXpBLVpfXVthLXpBLVowLTlfXSopQCIgIlwke1xcMX0iIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KSAgICAjIFJlcGxhY2UgQEAgd2l0aCAke30sIGV2ZW4gaWYgdGhhdCBtYXkgbm90IGJlIHJlYWQgYnkgQ01ha2Ugc2NyaXB0cy4KICBmaWxlKFdSSVRFICR7T1VUUFVUX0ZJTEV9ICR7TUFLRUZJTEVfSU5DX1RFWFR9KQoKZW5kZnVuY3Rpb24oKQoKYWRkX3N1YmRpcmVjdG9yeShsaWIpCmlmKEJVSUxEX0NVUkxfRVhFKQogIGFkZF9zdWJkaXJlY3Rvcnkoc3JjKQplbmRpZigpCmlmKEJVSUxEX0NVUkxfVEVTVFMpCiAgYWRkX3N1YmRpcmVjdG9yeSh0ZXN0cykKZW5kaWYoKQoKIyBUaGlzIG5lZWRzIHRvIGJlIHJ1biB2ZXJ5IGxhc3Qgc28gb3RoZXIgcGFydHMgb2YgdGhlIHNjcmlwdHMgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoaXMuCmlmKE5PVCBDVVJMX0NPTkZJR19IQVNfQkVFTl9SVU5fQkVGT1JFKQogIHNldChDVVJMX0NPTkZJR19IQVNfQkVFTl9SVU5fQkVGT1JFIDEgQ0FDSEUgSU5URVJOQUwgIkZsYWcgdG8gdHJhY2sgd2hldGhlciB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHJ1bm5pbmcgQ01ha2Ugb3IgaWYgQ01ha2UgaGFzIGJlZW4gY29uZmlndXJlZCBiZWZvcmUiKQplbmRpZigpCgojIEluc3RhbGxhdGlvbi4KIyBGaXJzdCwgaW5zdGFsbCBnZW5lcmF0ZWQgY3VybGJ1aWxkLmgKaW5zdGFsbChGSUxFUyAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2luY2x1ZGUvY3VybC9jdXJsYnVpbGQuaCIKICAgIERFU1RJTkFUSU9OIGluY2x1ZGUvY3VybCApCiMgTmV4dCwgaW5zdGFsbCBvdGhlciBoZWFkZXJzIGV4Y2x1ZGluZyBjdXJsYnVpbGQuaAppbnN0YWxsKERJUkVDVE9SWSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2luY2x1ZGUvY3VybCIKICAgIERFU1RJTkFUSU9OIGluY2x1ZGUKICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouaCIKICAgIFBBVFRFUk4gImN1cmxidWlsZC5oIiBFWENMVURFKQo=