IyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KIyAgUHJvamVjdCAgICAgICAgICAgICAgICAgICAgIF9fX3wgfCB8IHwgIF8gXHwgfAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKIwojIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTUsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAojIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKIyBhcmUgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL2N1cmwuaGF4eC5zZS9kb2NzL2NvcHlyaWdodC5odG1sLgojCiMgWW91IG1heSBvcHQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlIGFuZC9vciBzZWxsCiMgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiMgZnVybmlzaGVkIHRvIGRvIHNvLCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENPUFlJTkcgZmlsZS4KIwojIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgojCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGNVUkwvbGliY3VybCBDTWFrZSBzY3JpcHQKIyBieSBUZXRldGVzdCBhbmQgU3VrZW5kZXIgKEJlbm9pdCBOZWlsKQoKIyBUT0RPOgojIFRoZSBvdXRwdXQgLnNvIGZpbGUgbGFja3MgdGhlIHNvbmFtZSBudW1iZXIgd2hpY2ggd2UgY3VycmVudGx5IGhhdmUgd2l0aGluIHRoZSBsaWIvTWFrZWZpbGUuYW0gZmlsZQojIEFkZCBmdWxsICg0IG9yIDUgbGlicykgU1NMIHN1cHBvcnQKIyBBZGQgSU5TVEFMTCB0YXJnZXQgKEVYVFJBX0RJU1QgdmFyaWFibGVzIGluIE1ha2VmaWxlLmFtIG1heSBiZSBtb3ZlZCB0byBNYWtlZmlsZS5pbmMgc28gdGhhdCBDTWFrZS9DUGFjayBpcyBhd2FyZSBvZiB3aGF0J3MgdG8gaW5jbHVkZSkuCiMgQWRkIENUZXN0cyg/KQojIENoZWNrIG9uIGFsbCBwb3NzaWJsZSBwbGF0Zm9ybXMKIyBUZXN0IHdpdGggYXMgbWFueSBjb25maWd1cmF0aW9ucyBwb3NzaWJsZSAoV2l0aCBvciB3aXRob3V0IGFueSBvcHRpb24pCiMgQ3JlYXRlIHNjcmlwdHMgdGhhdCBoZWxwIGtlZXBpbmcgdGhlIENNYWtlIGJ1aWxkIHN5c3RlbSB1cCB0byBkYXRlICh0byByZWR1Y2UgbWFpbnRlbmFuY2UpLiBBY2NvcmRpbmcgdG8gVGV0ZXRlc3Q6CiMgIC0gbGlzdHMgb2YgaGVhZGVycyB0aGF0ICdjb25maWd1cmUnIGNoZWNrcyBmb3I7CiMgIC0gY3VybC1zcGVjaWZpYyB0ZXN0cyAodGhlIG9uZXMgdGhhdCBhcmUgaW4gbTQvY3VybC0qLm00IGZpbGVzKTsKIyAgLSAobW9zdCBvYnZpb3VzIHRoaW5nOikgY3VybCB2ZXJzaW9uIG51bWJlcnMuCiMgQWRkIGRvY3VtZW50YXRpb24gc3VicHJvamVjdAojCiMgVG8gY2hlY2s6CiMgKEZyb20gRGFuaWVsIFN0ZW5iZXJnKSBUaGUgY21ha2UgYnVpbGQgc2VsZWN0ZWQgdG8gcnVuIGdjYyB3aXRoIC1mUElDIG9uIG15IGJveCB3aGlsZSB0aGUgcGxhaW4gY29uZmlndXJlIHNjcmlwdCBkaWQgbm90LgojIChGcm9tIERhbmllbCBTdGVuYmVyZykgVGhlIGdjYyBjb21tYW5kIGxpbmUgdXNlIG5laXRoZXIgLWcgbm9yIGFueSAtTyBvcHRpb25zLiBBcyBhIGRldmVsb3BlciwgSSBhbHNvIHRyZWFzdXJlIG91ciBjb25maWd1cmUgc2NyaXB0cydzIC0tZW5hYmxlLWRlYnVnIG9wdGlvbiB0aGF0IHNldHMgYSBsb25nIHJhbmdlIG9mICJwaWNreSIgY29tcGlsZXIgb3B0aW9ucy4KY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCBGQVRBTF9FUlJPUikKc2V0KENNQUtFX01PRFVMRV9QQVRIICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vQ01ha2U7JHtDTUFLRV9NT0RVTEVfUEFUSH0iKQppbmNsdWRlKFV0aWxpdGllcykKaW5jbHVkZShNYWNyb3MpCgpwcm9qZWN0KCBDVVJMIEMgKQoKbWVzc2FnZShXQVJOSU5HICJ0aGUgY3VybCBjbWFrZSBidWlsZCBzeXN0ZW0gaXMgcG9vcmx5IG1haW50YWluZWQuIEJlIGF3YXJlIikKCmZpbGUgKFJFQUQgJHtDVVJMX1NPVVJDRV9ESVJ9L2luY2x1ZGUvY3VybC9jdXJsdmVyLmggQ1VSTF9WRVJTSU9OX0hfQ09OVEVOVFMpCnN0cmluZyAoUkVHRVggTUFUQ0ggIiNkZWZpbmUgTElCQ1VSTF9WRVJTSU9OIFwiW15cIl0qIgogIENVUkxfVkVSU0lPTiAke0NVUkxfVkVSU0lPTl9IX0NPTlRFTlRTfSkKc3RyaW5nIChSRUdFWCBSRVBMQUNFICJbXlwiXStcIiIgIiIgQ1VSTF9WRVJTSU9OICR7Q1VSTF9WRVJTSU9OfSkKc3RyaW5nIChSRUdFWCBNQVRDSCAiI2RlZmluZSBMSUJDVVJMX1ZFUlNJT05fTlVNIDB4WzAtOWEtZkEtRl0rIgogIENVUkxfVkVSU0lPTl9OVU0gJHtDVVJMX1ZFUlNJT05fSF9DT05URU5UU30pCnN0cmluZyAoUkVHRVggUkVQTEFDRSAiW14wXSsweCIgIiIgQ1VSTF9WRVJTSU9OX05VTSAke0NVUkxfVkVSU0lPTl9OVU19KQoKaW5jbHVkZV9yZWd1bGFyX2V4cHJlc3Npb24oIl4uKiQiKSAgICAjIFN1a2VuZGVyOiBJcyBpdCBuZWNlc3Nhcnk/CgojIFNldHVwIHBhY2thZ2UgbWV0YS1kYXRhCiMgU0VUKFBBQ0tBR0UgImN1cmwiKQptZXNzYWdlKFNUQVRVUyAiY3VybCB2ZXJzaW9uPVske0NVUkxfVkVSU0lPTn1dIikKIyBTRVQoUEFDS0FHRV9UQVJOQU1FICJjdXJsIikKIyBTRVQoUEFDS0FHRV9OQU1FICJjdXJsIikKIyBTRVQoUEFDS0FHRV9WRVJTSU9OICItIikKIyBTRVQoUEFDS0FHRV9TVFJJTkcgImN1cmwtIikKIyBTRVQoUEFDS0FHRV9CVUdSRVBPUlQgImEgc3VpdGFibGUgY3VybCBtYWlsaW5nIGxpc3QgPT4gaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsLyIpCnNldChPUEVSQVRJTkdfU1lTVEVNICIke0NNQUtFX1NZU1RFTV9OQU1FfSIpCnNldChPUyAiXCIke0NNQUtFX1NZU1RFTV9OQU1FfVwiIikKCmluY2x1ZGVfZGlyZWN0b3JpZXMoJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2luY2x1ZGUvY3VybCkKaW5jbHVkZV9kaXJlY3RvcmllcyggJHtDVVJMX1NPVVJDRV9ESVJ9L2luY2x1ZGUgKQoKb3B0aW9uKEJVSUxEX0NVUkxfRVhFICJTZXQgdG8gT04gdG8gYnVpbGQgY1VSTCBleGVjdXRhYmxlLiIgT04pCm9wdGlvbihCVUlMRF9DVVJMX1RFU1RTICJTZXQgdG8gT04gdG8gYnVpbGQgY1VSTCB0ZXN0cy4iIE9OKQpvcHRpb24oQ1VSTF9TVEFUSUNMSUIgIlNldCB0byBPTiB0byBidWlsZCBsaWJjdXJsIHdpdGggc3RhdGljIGxpbmtpbmcuIiBPRkYpCm9wdGlvbihFTkFCTEVfQVJFUyAiU2V0IHRvIE9OIHRvIGVuYWJsZSBjLWFyZXMgc3VwcG9ydCIgT0ZGKQpvcHRpb24oRU5BQkxFX1RIUkVBREVEX1JFU09MVkVSICJTZXQgdG8gT04gdG8gZW5hYmxlIFBPU0lYIHRocmVhZGVkIEROUyBsb29rdXAiIE9GRikKCm9wdGlvbihFTkFCTEVfREVCVUcgIlNldCB0byBPTiB0byBlbmFibGUgY3VybCBkZWJ1ZyBmZWF0dXJlcyIgT0ZGKQpvcHRpb24oRU5BQkxFX0NVUkxERUJVRyAiU2V0IHRvIE9OIHRvIGJ1aWxkIHdpdGggVHJhY2tNZW1vcnkgZmVhdHVyZSBlbmFibGVkIiBPRkYpCgppZiAoRU5BQkxFX0RFQlVHKQogICMgREVCVUdCVUlMRCB3aWxsIGJlIGRlZmluZWQgb25seSBmb3IgRGVidWcgYnVpbGRzCiAgaWYoTk9UIENNQUtFX1ZFUlNJT04gVkVSU0lPTl9MRVNTIDMuMCkKICAgIHNldF9wcm9wZXJ0eShESVJFQ1RPUlkgQVBQRU5EIFBST1BFUlRZIENPTVBJTEVfREVGSU5JVElPTlMgJDwkPENPTkZJRzpEZWJ1Zz46REVCVUdCVUlMRD4pCiAgZWxzZSgpCiAgICBzZXRfcHJvcGVydHkoRElSRUNUT1JZIEFQUEVORCBQUk9QRVJUWSBDT01QSUxFX0RFRklOSVRJT05TX0RFQlVHIERFQlVHQlVJTEQpCiAgZW5kaWYoKQogIHNldChFTkFCTEVfQ1VSTERFQlVHIE9OKQplbmRpZigpCgppZiAoRU5BQkxFX0NVUkxERUJVRykKICBzZXRfcHJvcGVydHkoRElSRUNUT1JZIEFQUEVORCBQUk9QRVJUWSBDT01QSUxFX0RFRklOSVRJT05TIENVUkxERUJVRykKZW5kaWYoKQoKIyBpbml0aWFsaXplIENVUkxfTElCUwpzZXQoQ1VSTF9MSUJTICIiKQoKaWYoRU5BQkxFX1RIUkVBREVEX1JFU09MVkVSIEFORCBFTkFCTEVfQVJFUykKICBtZXNzYWdlKEZBVEFMX0VSUk9SICJPcHRpb25zIEVOQUJMRV9USFJFQURFRF9SRVNPTFZFUiBhbmQgRU5BQkxFX0FSRVMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSIpCmVuZGlmKCkKCmlmKEVOQUJMRV9BUkVTKQogIHNldChVU0VfQVJFUyAxKQogIGZpbmRfcGFja2FnZShDQVJFUyBSRVFVSVJFRCkKICBsaXN0KEFQUEVORCBDVVJMX0xJQlMgJHtDQVJFU19MSUJSQVJZfSApCiAgc2V0KENVUkxfTElCUyAke0NVUkxfTElCU30gJHtDQVJFU19MSUJSQVJZfSkKZW5kaWYoKQoKb3B0aW9uKEJVSUxEX0RBU0hCT0FSRF9SRVBPUlRTICJTZXQgdG8gT04gdG8gYWN0aXZhdGUgcmVwb3J0aW5nIG9mIGNVUkwgYnVpbGRzIGhlcmUgaHR0cDovL3d3dy5jZGFzaC5vcmcvQ0Rhc2hQdWJsaWMvaW5kZXgucGhwP3Byb2plY3Q9Q1VSTCIgT0ZGKQppZihCVUlMRF9EQVNIQk9BUkRfUkVQT1JUUykKICAjSU5DTFVERShEYXJ0KQogIGluY2x1ZGUoQ1Rlc3QpCmVuZGlmKEJVSUxEX0RBU0hCT0FSRF9SRVBPUlRTKQoKaWYoTVNWQykKICBvcHRpb24oQlVJTERfUkVMRUFTRV9ERUJVR19ESVJTICJTZXQgT0ZGIHRvIGJ1aWxkIGVhY2ggY29uZmlndXJhdGlvbiB0byBhIHNlcGFyYXRlIGRpcmVjdG9yeSIgT0ZGKQogIG1hcmtfYXNfYWR2YW5jZWQoQlVJTERfUkVMRUFTRV9ERUJVR19ESVJTKQplbmRpZigpCgpvcHRpb24oQ1VSTF9ISURERU5fU1lNQk9MUyAiU2V0IHRvIE9OIHRvIGhpZGUgbGliY3VybCBpbnRlcm5hbCBzeW1ib2xzICg9aGlkZSBhbGwgc3ltYm9scyB0aGF0IGFyZW4ndCBvZmZpY2lhbGx5IGV4dGVybmFsKS4iIE9OKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfSElEREVOX1NZTUJPTFMpCgpJRihXSU4zMikKICBPUFRJT04oQ1VSTF9XSU5ET1dTX1NTUEkgIlVzZSB3aW5kb3dzIGxpYnJhcmllcyB0byBhbGxvdyBOVExNIGF1dGhlbnRpY2F0aW9uIHdpdGhvdXQgb3BlbnNzbCIgT04pCiAgTUFSS19BU19BRFZBTkNFRChDVVJMX1dJTkRPV1NfU1NQSSkKRU5ESUYoKQoKb3B0aW9uKEhUVFBfT05MWSAiZGlzYWJsZXMgYWxsIHByb3RvY29scyBleGNlcHQgSFRUUCAoVGhpcyBvdmVycmlkZXMgYWxsIENVUkxfRElTQUJMRV8qIG9wdGlvbnMpIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoSFRUUF9PTkxZKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0ZUUCAiZGlzYWJsZXMgRlRQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0ZUUCkKb3B0aW9uKENVUkxfRElTQUJMRV9MREFQICJkaXNhYmxlcyBMREFQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0xEQVApCm9wdGlvbihDVVJMX0RJU0FCTEVfVEVMTkVUICJkaXNhYmxlcyBUZWxuZXQiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfVEVMTkVUKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0RJQ1QgImRpc2FibGVzIERJQ1QiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfRElDVCkKb3B0aW9uKENVUkxfRElTQUJMRV9GSUxFICJkaXNhYmxlcyBGSUxFIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0ZJTEUpCm9wdGlvbihDVVJMX0RJU0FCTEVfVEZUUCAiZGlzYWJsZXMgVEZUUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9URlRQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0hUVFAgImRpc2FibGVzIEhUVFAiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfSFRUUCkKCm9wdGlvbihDVVJMX0RJU0FCTEVfTERBUFMgInRvIGRpc2FibGUgTERBUFMiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfTERBUFMpCgpvcHRpb24oQ1VSTF9ESVNBQkxFX1JUU1AgInRvIGRpc2FibGUgUlRTUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9SVFNQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1BST1hZICJ0byBkaXNhYmxlIHByb3h5IiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX1BST1hZKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1BPUDMgInRvIGRpc2FibGUgUE9QMyIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9QT1AzKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0lNQVAgInRvIGRpc2FibGUgSU1BUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9JTUFQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1NNVFAgInRvIGRpc2FibGUgU01UUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9TTVRQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0dPUEhFUiAidG8gZGlzYWJsZSBHb3BoZXIiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfR09QSEVSKQoKaWYoSFRUUF9PTkxZKQogIHNldChDVVJMX0RJU0FCTEVfRlRQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfTERBUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0xEQVBTIE9OKQogIHNldChDVVJMX0RJU0FCTEVfVEVMTkVUIE9OKQogIHNldChDVVJMX0RJU0FCTEVfRElDVCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0ZJTEUgT04pCiAgc2V0KENVUkxfRElTQUJMRV9URlRQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfUlRTUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX1BPUDMgT04pCiAgc2V0KENVUkxfRElTQUJMRV9JTUFQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfU01UUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0dPUEhFUiBPTikKZW5kaWYoKQoKb3B0aW9uKENVUkxfRElTQUJMRV9DT09LSUVTICJ0byBkaXNhYmxlIGNvb2tpZXMgc3VwcG9ydCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9DT09LSUVTKQoKb3B0aW9uKENVUkxfRElTQUJMRV9DUllQVE9fQVVUSCAidG8gZGlzYWJsZSBjcnlwdG9ncmFwaGljIGF1dGhlbnRpY2F0aW9uIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0NSWVBUT19BVVRIKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1ZFUkJPU0VfU1RSSU5HUyAidG8gZGlzYWJsZSB2ZXJib3NlIHN0cmluZ3MiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfVkVSQk9TRV9TVFJJTkdTKQpvcHRpb24oRElTQUJMRURfVEhSRUFEU0FGRSAiU2V0IHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aHJlYWQtc2FmZSBmdW5jdGlvbnMiIE9GRikKbWFya19hc19hZHZhbmNlZChESVNBQkxFRF9USFJFQURTQUZFKQpvcHRpb24oRU5BQkxFX0lQVjYgIkRlZmluZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgSVB2NiBzdXBwb3J0IiBPTikKbWFya19hc19hZHZhbmNlZChFTkFCTEVfSVBWNikKaWYoRU5BQkxFX0lQVjYgQU5EIE5PVCBXSU4zMikKICBpbmNsdWRlKENoZWNrU3RydWN0SGFzTWVtYmVyKQogIGNoZWNrX3N0cnVjdF9oYXNfbWVtYmVyKCJzdHJ1Y3Qgc29ja2FkZHJfaW42IiBzaW42X2FkZHIgIm5ldGluZXQvaW4uaCIKICAgICAgICAgICAgICAgICAgICAgICAgICBIQVZFX1NPQ0tBRERSX0lONl9TSU42X0FERFIpCiAgY2hlY2tfc3RydWN0X2hhc19tZW1iZXIoInN0cnVjdCBzb2NrYWRkcl9pbjYiIHNpbjZfc2NvcGVfaWQgIm5ldGluZXQvaW4uaCIKICAgICAgICAgICAgICAgICAgICAgICAgICBIQVZFX1NPQ0tBRERSX0lONl9TSU42X1NDT1BFX0lEKQogIGlmKE5PVCBIQVZFX1NPQ0tBRERSX0lONl9TSU42X0FERFIpCiAgICBtZXNzYWdlKFdBUk5JTkcgInN0cnVjdCBzb2NrYWRkcl9pbjYgbm90IGF2YWlsYWJsZSwgZGlzYWJsaW5nIElQdjYgc3VwcG9ydCIpCiAgICAjIEZvcmNlIHRoZSBmZWF0dXJlIG9mZiBhcyB0aGlzIG5hbWUgaXMgdXNlZCBhcyBndWFyZCBtYWNyby4uLgogICAgc2V0KEVOQUJMRV9JUFY2IE9GRgogICAgICAgIENBQ0hFIEJPT0wgIkRlZmluZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgSVB2NiBzdXBwb3J0IiBGT1JDRSkKICBlbmRpZigpCmVuZGlmKCkKCm9wdGlvbihFTkFCTEVfTUFOVUFMICJ0byBwcm92aWRlIHRoZSBidWlsdC1pbiBtYW51YWwiIE9OKQp1bnNldChVU0VfTUFOVUFMIENBQ0hFKSAjIFRPRE86IGNhY2hlIE5ST0ZGL05ST0ZGX01BTk9QVC9VU0VfTUFOVUFMIHZhcnM/CmlmKEVOQUJMRV9NQU5VQUwpCiAgZmluZF9wcm9ncmFtKE5ST0ZGIE5BTUVTIGducm9mZiBucm9mZikKICBpZihOUk9GRikKICAgICMgTmVlZCBhIHdheSB0byB3cml0ZSB0byBzdGRpbiwgdGhpcyB3aWxsIGRvCiAgICBmaWxlKFdSSVRFICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbnJvZmYtaW5wdXQudHh0IiAidGVzdCIpCiAgICAjIFRlc3RzIGZvciBhIHZhbGlkIG5yb2ZmIG9wdGlvbiB0byBnZW5lcmF0ZSBhIG1hbnBhZ2UKICAgIGZvcmVhY2goX01BTk9QVCAiLW1hbiIgIi1tYW5kb2MiKQogICAgICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAiJHtOUk9GRn0iICR7X01BTk9QVH0KICAgICAgICBPVVRQVVRfVkFSSUFCTEUgTlJPRkZfTUFOT1BUX09VVFBVVAogICAgICAgIElOUFVUX0ZJTEUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9ucm9mZi1pbnB1dC50eHQiCiAgICAgICAgRVJST1JfUVVJRVQpCiAgICAgICMgU2F2ZSB0aGUgb3B0aW9uIGlmIGl0IHdhcyB2YWxpZAogICAgICBpZihOUk9GRl9NQU5PUFRfT1VUUFVUKQogICAgICAgIG1lc3NhZ2UoIkZvdW5kICpucm9mZiBvcHRpb246IC0tICR7X01BTk9QVH0iKQogICAgICAgIHNldChOUk9GRl9NQU5PUFQgJHtfTUFOT1BUfSkKICAgICAgICBzZXQoVVNFX01BTlVBTCAxKQogICAgICAgIGJyZWFrKCkKICAgICAgZW5kaWYoKQogICAgZW5kZm9yZWFjaCgpCiAgICAjIE5vIG5lZWQgZm9yIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgZmlsZShSRU1PVkUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9ucm9mZi1pbnB1dC50eHQiKQogICAgaWYoTk9UIFVTRV9NQU5VQUwpCiAgICAgIG1lc3NhZ2UoV0FSTklORyAiRm91bmQgbm8gKm5yb2ZmIG9wdGlvbiB0byBnZXQgcGxhaW50ZXh0IGZyb20gbWFuIHBhZ2VzIikKICAgIGVuZGlmKCkKICBlbHNlKCkKICAgIG1lc3NhZ2UoV0FSTklORyAiRm91bmQgbm8gKm5yb2ZmIHByb2dyYW0iKQogIGVuZGlmKCkKZW5kaWYoKQoKIyBXZSBuZWVkIGFuc2kgYy1mbGFncywgZXNwZWNpYWxseSBvbiBIUApzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9BTlNJX0NGTEFHU30gJHtDTUFLRV9DX0ZMQUdTfSIpCnNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAke0NNQUtFX0FOU0lfQ0ZMQUdTfSkKCiMgRGlzYWJsZSB3YXJuaW5ncyBvbiBCb3JsYW5kIHRvIGF2b2lkIGNoYW5naW5nIDNyZCBwYXJ0eSBjb2RlLgppZihCT1JMQU5EKQogIHNldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9IC13LSIpCmVuZGlmKEJPUkxBTkQpCgojIElmIHdlIGFyZSBvbiBBSVgsIGRvIHRoZSBfQUxMX1NPVVJDRSBtYWdpYwppZigke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTIEFJWCkKICBzZXQoX0FMTF9TT1VSQ0UgMSkKZW5kaWYoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyBBSVgpCgojIEluY2x1ZGUgYWxsIHRoZSBuZWNlc3NhcnkgZmlsZXMgZm9yIG1hY3JvcwppbmNsdWRlIChDaGVja0Z1bmN0aW9uRXhpc3RzKQppbmNsdWRlIChDaGVja0luY2x1ZGVGaWxlKQppbmNsdWRlIChDaGVja0luY2x1ZGVGaWxlcykKaW5jbHVkZSAoQ2hlY2tMaWJyYXJ5RXhpc3RzKQppbmNsdWRlIChDaGVja1N5bWJvbEV4aXN0cykKaW5jbHVkZSAoQ2hlY2tUeXBlU2l6ZSkKaW5jbHVkZSAoQ2hlY2tDU291cmNlQ29tcGlsZXMpCgojIE9uIHdpbmRvd3MgcHJlbG9hZCBzZXR0aW5ncwppZihXSU4zMikKICBzZXQoQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgIiR7Q01BS0VfUkVRVUlSRURfREVGSU5JVElPTlN9IC1EX1dJTlNPQ0tBUElfIikKICBpbmNsdWRlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9DTWFrZS9QbGF0Zm9ybXMvV2luZG93c0NhY2hlLmNtYWtlKQplbmRpZihXSU4zMikKCmlmKEVOQUJMRV9USFJFQURFRF9SRVNPTFZFUikKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJwdGhyZWFkLmgiIEhBVkVfUFRIUkVBRF9IKQogIGlmKEhBVkVfUFRIUkVBRF9IKQogICAgc2V0KENNQUtFX1RIUkVBRF9QUkVGRVJfUFRIUkVBRCAxKQogICAgZmluZF9wYWNrYWdlKFRocmVhZHMpCiAgICBpZihDTUFLRV9VU0VfUFRIUkVBRFNfSU5JVCkKICAgICAgc2V0KENVUkxfTElCUyAke0NVUkxfTElCU30gJHtDTUFLRV9USFJFQURfTElCU19JTklUfSkKICAgICAgc2V0KFVTRV9USFJFQURTX1BPU0lYIDEpCiAgICBlbmRpZigpCiAgZW5kaWYoKQplbmRpZigpCgojIENoZWNrIGZvciBhbGwgbmVlZGVkIGxpYnJhcmllcwpjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoImRsIiAgICAgZGxvcGVuICAgICAgIEhBVkVfTElCREwpCmNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgic29ja2V0IiBjb25uZWN0ICAgICAgSEFWRV9MSUJTT0NLRVQpCmNoZWNrX2xpYnJhcnlfZXhpc3RzKCJjIiBnZXRob3N0YnluYW1lICIiIE5PVF9ORUVEX0xJQk5TTCkKCiMgWWVsbG93dGFiIFpldGEgbmVlZHMgZGlmZmVyZW50IGxpYnJhcmllcyB0aGFuIEJlT1MgNS4KaWYoQkVPUykKICBzZXQoTk9UX05FRURfTElCTlNMIDEpCiAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJiaW5kIiBnZXRob3N0YnluYW1lIEhBVkVfTElCQklORCkKICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoImJuZXRhcGkiIGNsb3Nlc29ja2V0IEhBVkVfTElCQk5FVEFQSSkKZW5kaWYoQkVPUykKCmlmKE5PVCBOT1RfTkVFRF9MSUJOU0wpCiAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJuc2wiICAgIGdldGhvc3RieW5hbWUgIEhBVkVfTElCTlNMKQplbmRpZihOT1QgTk9UX05FRURfTElCTlNMKQoKY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGdldGhvc3RuYW1lIEhBVkVfR0VUSE9TVE5BTUUpCgppZihXSU4zMikKICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoIndzMl8zMiIgZ2V0Y2ggICAgICAgIEhBVkVfTElCV1MyXzMyKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgid2lubW0iICBnZXRjaCAgICAgICAgSEFWRV9MSUJXSU5NTSkKZW5kaWYoKQoKb3B0aW9uKENNQUtFX1VTRV9PUEVOU1NMICJVc2UgT3BlblNTTCBjb2RlLiBFeHBlcmltZW50YWwiIE9OKQptYXJrX2FzX2FkdmFuY2VkKENNQUtFX1VTRV9PUEVOU1NMKQoKc2V0KFVTRV9PUEVOU1NMIE9GRikKc2V0KEhBVkVfTElCQ1JZUFRPIE9GRikKc2V0KEhBVkVfTElCU1NMIE9GRikKCmlmKENNQUtFX1VTRV9PUEVOU1NMKQogIGZpbmRfcGFja2FnZShPcGVuU1NMKQogIGlmKE9QRU5TU0xfRk9VTkQpCiAgICBsaXN0KEFQUEVORCBDVVJMX0xJQlMgJHtPUEVOU1NMX0xJQlJBUklFU30pCiAgICBzZXQoVVNFX09QRU5TU0wgT04pCiAgICBzZXQoSEFWRV9MSUJDUllQVE8gT04pCiAgICBzZXQoSEFWRV9MSUJTU0wgT04pCiAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7T1BFTlNTTF9JTkNMVURFX0RJUn0pCiAgICBzZXQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtPUEVOU1NMX0lOQ0xVREVfRElSfSkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC9jcnlwdG8uaCIgSEFWRV9PUEVOU1NMX0NSWVBUT19IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlKCJvcGVuc3NsL2VuZ2luZS5oIiBIQVZFX09QRU5TU0xfRU5HSU5FX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wvZXJyLmgiICAgIEhBVkVfT1BFTlNTTF9FUlJfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC9wZW0uaCIgICAgSEFWRV9PUEVOU1NMX1BFTV9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlKCJvcGVuc3NsL3BrY3MxMi5oIiBIQVZFX09QRU5TU0xfUEtDUzEyX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wvcnNhLmgiICAgIEhBVkVfT1BFTlNTTF9SU0FfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC9zc2wuaCIgICAgSEFWRV9PUEVOU1NMX1NTTF9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlKCJvcGVuc3NsL3g1MDkuaCIgICBIQVZFX09QRU5TU0xfWDUwOV9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlKCJvcGVuc3NsL3JhbmQuaCIgICBIQVZFX09QRU5TU0xfUkFORF9IKQogIGVuZGlmKCkKZW5kaWYoKQoKaWYoTk9UIENVUkxfRElTQUJMRV9MREFQKQoKICBpZihXSU4zMikKICAgIG9wdGlvbihVU0VfV0lOMzJfTERBUCAiVXNlIFdpbmRvd3MgTERBUCBpbXBsZW1lbnRhdGlvbiIgT04pCiAgICBpZihVU0VfV0lOMzJfTERBUCkKICAgICAgY2hlY2tfbGlicmFyeV9leGlzdHMoIndsZGFwMzIiIGNsZGFwX29wZW4gIiIgSEFWRV9XTERBUDMyKQogICAgICBpZihOT1QgSEFWRV9XTERBUDMyKQogICAgICAgIHNldChVU0VfV0lOMzJfTERBUCBPRkYpCiAgICAgIGVuZGlmKCkKICAgIGVuZGlmKCkKICBlbmRpZigpCgogIG9wdGlvbihDTUFLRV9VU0VfT1BFTkxEQVAgIlVzZSBPcGVuTERBUCBjb2RlLiIgT0ZGKQogIG1hcmtfYXNfYWR2YW5jZWQoQ01BS0VfVVNFX09QRU5MREFQKQogIHNldChDTUFLRV9MREFQX0xJQiAibGRhcCIgQ0FDSEUgU1RSSU5HICJOYW1lIG9yIGZ1bGwgcGF0aCB0byBsZGFwIGxpYnJhcnkiKQogIHNldChDTUFLRV9MQkVSX0xJQiAibGJlciIgQ0FDSEUgU1RSSU5HICJOYW1lIG9yIGZ1bGwgcGF0aCB0byBsYmVyIGxpYnJhcnkiKQoKICBpZihDTUFLRV9VU0VfT1BFTkxEQVAgQU5EIFVTRV9XSU4zMl9MREFQKQogICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiQ2Fubm90IHVzZSBVU0VfV0lOMzJfTERBUCBhbmQgQ01BS0VfVVNFX09QRU5MREFQIGF0IHRoZSBzYW1lIHRpbWUiKQogIGVuZGlmKCkKICAKICAjIE5vdyB0aGF0IHdlIGtub3csIHdlJ3JlIG5vdCB1c2luZyB3aW5kb3dzIExEQVAuLi4KICBpZihOT1QgVVNFX1dJTjMyX0xEQVApCiAgICAjIENoZWNrIGZvciBMREFQCiAgICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICR7T1BFTlNTTF9MSUJSQVJJRVN9KQogICAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCR7Q01BS0VfTERBUF9MSUJ9IGxkYXBfaW5pdCBIQVZFX0xJQkxEQVApCiAgICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoJHtDTUFLRV9MQkVSX0xJQn0gYmVyX2luaXQgSEFWRV9MSUJMQkVSKQogIGVsc2UoKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgid2lubGRhcC5oIiBIQVZFX1dJTkxEQVBfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbmJlci5oIiAgSEFWRV9XSU5CRVJfSCkKICBlbmRpZigpCiAgCiAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTX0JBSyAke0NNQUtFX1JFUVVJUkVEX0lOQ0xVREVTfSkKICBzZXQoQ01BS0VfTERBUF9JTkNMVURFX0RJUiAiIiBDQUNIRSBTVFJJTkcgIlBhdGggdG8gTERBUCBpbmNsdWRlIGRpcmVjdG9yeSIpCiAgaWYoQ01BS0VfTERBUF9JTkNMVURFX0RJUikKICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7Q01BS0VfTERBUF9JTkNMVURFX0RJUn0pCiAgZW5kaWYoKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImxkYXAuaCIgICAgICAgICAgIEhBVkVfTERBUF9IKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImxiZXIuaCIgICAgICAgICAgIEhBVkVfTEJFUl9IKQoKICBpZihOT1QgSEFWRV9MREFQX0gpCiAgICBtZXNzYWdlKFNUQVRVUyAiTERBUF9IIG5vdCBmb3VuZCBDVVJMX0RJU0FCTEVfTERBUCBzZXQgT04iKQogICAgc2V0KENVUkxfRElTQUJMRV9MREFQIE9OIENBQ0hFIEJPT0wgIiIgRk9SQ0UpCiAgICBzZXQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtDTUFLRV9SRVFVSVJFRF9JTkNMVURFU19CQUt9KSAjTERBUCBpbmNsdWRlcyB3b24ndCBiZSB1c2VkCiAgZWxzZWlmKE5PVCBIQVZFX0xJQkxEQVApCiAgICBtZXNzYWdlKFNUQVRVUyAiTERBUCBsaWJyYXJ5ICcke0NNQUtFX0xEQVBfTElCfScgbm90IGZvdW5kIENVUkxfRElTQUJMRV9MREFQIHNldCBPTiIpCiAgICBzZXQoQ1VSTF9ESVNBQkxFX0xEQVAgT04gQ0FDSEUgQk9PTCAiIiBGT1JDRSkKICAgIHNldChDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke0NNQUtFX1JFUVVJUkVEX0lOQ0xVREVTX0JBS30pICNMREFQIGluY2x1ZGVzIHdvbid0IGJlIHVzZWQKICBlbHNlKCkKICAgIGlmKENNQUtFX1VTRV9PUEVOTERBUCkKICAgICAgc2V0KFVTRV9PUEVOTERBUCBPTikKICAgIGVuZGlmKCkKICAgIGlmKENNQUtFX0xEQVBfSU5DTFVERV9ESVIpCiAgICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtDTUFLRV9MREFQX0lOQ0xVREVfRElSfSkKICAgIGVuZGlmKCkKICAgIHNldChORUVEX0xCRVJfSCBPTikKICAgIHNldChfSEVBREVSX0xJU1QpCiAgICBpZihIQVZFX1dJTkRPV1NfSCkKICAgICAgbGlzdChBUFBFTkQgX0hFQURFUl9MSVNUICJ3aW5kb3dzLmgiKQogICAgZW5kaWYoKQogICAgaWYoSEFWRV9TWVNfVFlQRVNfSCkKICAgICAgbGlzdChBUFBFTkQgX0hFQURFUl9MSVNUICJzeXMvdHlwZXMuaCIpCiAgICBlbmRpZigpCiAgICBsaXN0KEFQUEVORCBfSEVBREVSX0xJU1QgImxkYXAuaCIpCgogICAgc2V0KF9TUkNfU1RSSU5HICIiKQogICAgZm9yZWFjaChfSEVBREVSICR7X0hFQURFUl9MSVNUfSkKICAgICAgc2V0KF9JTkNMVURFX1NUUklORyAiJHtfSU5DTFVERV9TVFJJTkd9I2luY2x1ZGUgPCR7X0hFQURFUn0+XG4iKQogICAgZW5kZm9yZWFjaCgpCgogICAgc2V0KF9TUkNfU1RSSU5HCiAgICAgICIKICAgICAgJHtfSU5DTFVERV9TVFJJTkd9CiAgICAgIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCiAgICAgIHsKICAgICAgICBCZXJWYWx1ZSAqYnZwID0gTlVMTDsKICAgICAgICBCZXJFbGVtZW50ICpiZXAgPSBiZXJfaW5pdChidnApOwogICAgICAgIGJlcl9mcmVlKGJlcCwgMSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0iCiAgICApCiAgICBzZXQoQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgIiR7Q01BS0VfUkVRVUlSRURfREVGSU5JVElPTlN9IC1ETERBUF9ERVBSRUNBVEVEPTEiKQogICAgbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICR7Q01BS0VfTERBUF9MSUJ9KQogICAgaWYoSEFWRV9MSUJMQkVSKQogICAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgJHtDTUFLRV9MQkVSX0xJQn0pCiAgICBlbmRpZigpCiAgICBjaGVja19jX3NvdXJjZV9jb21waWxlcygiJHtfU1JDX1NUUklOR30iIE5PVF9ORUVEX0xCRVJfSCkKCiAgICBpZihOT1RfTkVFRF9MQkVSX0gpCiAgICAgIHNldChORUVEX0xCRVJfSCBPRkYpCiAgICBlbHNlKCkKICAgICAgc2V0KENVUkxfVEVTVF9ERUZJTkVTICIke0NVUkxfVEVTVF9ERUZJTkVTfSAtRE5FRURfTEJFUl9IIikKICAgIGVuZGlmKCkKICBlbmRpZigpCgplbmRpZigpCgojIE5vIGxkYXAsIG5vIGxkYXBzLgppZihDVVJMX0RJU0FCTEVfTERBUCkKICBpZihOT1QgQ1VSTF9ESVNBQkxFX0xEQVBTKQogICAgbWVzc2FnZShTVEFUVVMgIkxEQVAgbmVlZHMgdG8gYmUgZW5hYmxlZCB0byBzdXBwb3J0IExEQVBTIikKICAgIHNldChDVVJMX0RJU0FCTEVfTERBUFMgT04gQ0FDSEUgQk9PTCAiIiBGT1JDRSkKICBlbmRpZigpCmVuZGlmKCkKCmlmKE5PVCBDVVJMX0RJU0FCTEVfTERBUFMpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGRhcF9zc2wuaCIgSEFWRV9MREFQX1NTTF9IKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImxkYXBzc2wuaCIgIEhBVkVfTERBUFNTTF9IKQplbmRpZigpCgojIENoZWNrIGZvciBpZG4KY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJpZG4iIGlkbmFfdG9fYXNjaWlfbHogSEFWRV9MSUJJRE4pCgojIENoZWNrIGZvciBzeW1ib2wgZGxvcGVuIChzYW1lIGFzIEhBVkVfTElCREwpCmNoZWNrX2xpYnJhcnlfZXhpc3RzKCIke0NVUkxfTElCU30iIGRsb3BlbiAiIiBIQVZFX0RMT1BFTikKCm9wdGlvbihDVVJMX1pMSUIgIlNldCB0byBPTiB0byBlbmFibGUgYnVpbGRpbmcgY1VSTCB3aXRoIHpsaWIgc3VwcG9ydC4iIE9OKQpzZXQoSEFWRV9MSUJaIE9GRikKc2V0KEhBVkVfWkxJQl9IIE9GRikKc2V0KEhBVkVfWkxJQiBPRkYpCmlmKENVUkxfWkxJQikKICBmaW5kX3BhY2thZ2UoWkxJQiBRVUlFVCkKICBpZihaTElCX0ZPVU5EKQogICAgc2V0KEhBVkVfWkxJQl9IIE9OKQogICAgc2V0KEhBVkVfWkxJQiBPTikKICAgIHNldChIQVZFX0xJQlogT04pCiAgICBsaXN0KEFQUEVORCBDVVJMX0xJQlMgJHtaTElCX0xJQlJBUklFU30pCiAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7WkxJQl9JTkNMVURFX0RJUlN9KQogICAgbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtaTElCX0lOQ0xVREVfRElSU30pCiAgZW5kaWYoKQplbmRpZigpCgojbGliU1NIMgpvcHRpb24oQ01BS0VfVVNFX0xJQlNTSDIgIlVzZSBsaWJTU0gyIiBPTikKbWFya19hc19hZHZhbmNlZChDTUFLRV9VU0VfTElCU1NIMikKc2V0KFVTRV9MSUJTU0gyIE9GRikKc2V0KEhBVkVfTElCU1NIMiBPRkYpCnNldChIQVZFX0xJQlNTSDJfSCBPRkYpCgppZihDTUFLRV9VU0VfTElCU1NIMikKICBmaW5kX3BhY2thZ2UoTGliU1NIMikKICBpZihMSUJTU0gyX0ZPVU5EKQogICAgbGlzdChBUFBFTkQgQ1VSTF9MSUJTICR7TElCU1NIMl9MSUJSQVJZfSkKICAgIHNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgJHtMSUJTU0gyX0xJQlJBUll9KQogICAgbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgIiR7TElCU1NIMl9JTkNMVURFX0RJUn0iKQogICAgaW5jbHVkZV9kaXJlY3RvcmllcygiJHtMSUJTU0gyX0lOQ0xVREVfRElSfSIpCiAgICBzZXQoSEFWRV9MSUJTU0gyIE9OKQogICAgc2V0KFVTRV9MSUJTU0gyIE9OKQoKICAgICMgZmluZF9wYWNrYWdlIGhhcyBhbHJlYWR5IGZvdW5kIHRoZSBoZWFkZXJzCiAgICBzZXQoSEFWRV9MSUJTU0gyX0ggT04pCiAgICBzZXQoQ1VSTF9JTkNMVURFUyAke0NVUkxfSU5DTFVERVN9ICIke0xJQlNTSDJfSU5DTFVERV9ESVJ9L2xpYnNzaDIuaCIpCiAgICBzZXQoQ1VSTF9URVNUX0RFRklORVMgIiR7Q1VSTF9URVNUX0RFRklORVN9IC1ESEFWRV9MSUJTU0gyX0giKQoKICAgICMgbm93IGNoZWNrIGZvciBzcGVjaWZpYyBsaWJzc2gyIHN5bWJvbHMgYXMgdGhleSB3ZXJlIGFkZGVkIGluIGRpZmZlcmVudCB2ZXJzaW9ucwogICAgc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMgImxpYnNzaDIuaCIpCiAgICBjaGVja19mdW5jdGlvbl9leGlzdHMobGlic3NoMl92ZXJzaW9uICAgICAgICAgICBIQVZFX0xJQlNTSDJfVkVSU0lPTikKICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhsaWJzc2gyX2luaXQgICAgICAgICAgICAgIEhBVkVfTElCU1NIMl9JTklUKQogICAgY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGxpYnNzaDJfZXhpdCAgICAgICAgICAgICAgSEFWRV9MSUJTU0gyX0VYSVQpCiAgICBjaGVja19mdW5jdGlvbl9leGlzdHMobGlic3NoMl9zY3Bfc2VuZDY0ICAgICAgICBIQVZFX0xJQlNTSDJfU0NQX1NFTkQ2NCkKICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhsaWJzc2gyX3Nlc3Npb25faGFuZHNoYWtlIEhBVkVfTElCU1NIMl9TRVNTSU9OX0hBTkRTSEFLRSkKICAgIHNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTICIiKQoKICBlbmRpZihMSUJTU0gyX0ZPVU5EKQplbmRpZihDTUFLRV9VU0VfTElCU1NIMikKCm9wdGlvbihDTUFLRV9VU0VfR1NTQVBJICJVc2UgR1NTQVBJIGltcGxlbWVudGF0aW9uIChyaWdodCBub3cgb25seSBIZWltZGFsIGlzIHN1cHBvcnRlZCB3aXRoIENNYWtlIGJ1aWxkKSIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENNQUtFX1VTRV9HU1NBUEkpCgppZihDTUFLRV9VU0VfR1NTQVBJKQogIGZpbmRfcGFja2FnZShHU1MpCgogIHNldChIQVZFX0dTU0FQSSAke0dTU19GT1VORH0pCiAgaWYoR1NTX0ZPVU5EKQoKICAgIG1lc3NhZ2UoU1RBVFVTICJGb3VuZCAke0dTU19GTEFWT1VSfSBHU1NBUEkgdmVyc2lvbjogXCIke0dTU19WRVJTSU9OfVwiIikKCiAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke0dTU19JTkNMVURFX0RJUkVDVE9SSUVTfSkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImdzc2FwaS9nc3NhcGkuaCIgIEhBVkVfR1NTQVBJX0dTU0FQSV9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZ3NzYXBpL2dzc2FwaV9nZW5lcmljLmgiIEhBVkVfR1NTQVBJX0dTU0FQSV9HRU5FUklDX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJnc3NhcGkvZ3NzYXBpX2tyYjUuaCIgSEFWRV9HU1NBUElfR1NTQVBJX0tSQjVfSCkKCiAgICBpZihHU1NfRkxBVk9VUiBTVFJFUVVBTCAiSGVpbWRhbCIpCiAgICAgIHNldChIQVZFX0dTU0hFSU1EQUwgT04pCiAgICBlbHNlKCkgIyBNSVQKICAgICAgc2V0KEhBVkVfR1NTTUlUIE9OKQogICAgICBzZXQoX0lOQ0xVREVfTElTVCAiIikKICAgICAgaWYoSEFWRV9HU1NBUElfR1NTQVBJX0gpCiAgICAgICAgbGlzdChBUFBFTkQgX0lOQ0xVREVfTElTVCAiZ3NzYXBpL2dzc2FwaS5oIikKICAgICAgZW5kaWYoKQogICAgICBpZihIQVZFX0dTU0FQSV9HU1NBUElfR0VORVJJQ19IKQogICAgICAgIGxpc3QoQVBQRU5EIF9JTkNMVURFX0xJU1QgImdzc2FwaS9nc3NhcGlfZ2VuZXJpYy5oIikKICAgICAgZW5kaWYoKQogICAgICBpZihIQVZFX0dTU0FQSV9HU1NBUElfS1JCNV9IKQogICAgICAgIGxpc3QoQVBQRU5EIF9JTkNMVURFX0xJU1QgImdzc2FwaS9nc3NhcGlfa3JiNS5oIikKICAgICAgZW5kaWYoKQoKICAgICAgc3RyaW5nKFJFUExBQ0UgIjsiICIgIiBfQ09NUElMRVJfRkxBR1NfU1RSICIke0dTU19DT01QSUxFUl9GTEFHU30iKQogICAgICBzdHJpbmcoUkVQTEFDRSAiOyIgIiAiIF9MSU5LRVJfRkxBR1NfU1RSICIke0dTU19MSU5LRVJfRkxBR1N9IikKCiAgICAgIGZvcmVhY2goX2RpciAke0dTU19MSU5LX0RJUkVDVE9SSUVTfSkKICAgICAgICBzZXQoX0xJTktFUl9GTEFHU19TVFIgIiR7X0xJTktFUl9GTEFHU19TVFJ9IC1MXCIke19kaXJ9XCIiKQogICAgICBlbmRmb3JlYWNoKCkKCiAgICAgIHNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAiJHtfQ09NUElMRVJfRkxBR1NfU1RSfSAke19MSU5LRVJfRkxBR1NfU1RSfSIpCiAgICAgIHNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgJHtHU1NfTElCUkFSSUVTfSkKICAgICAgY2hlY2tfc3ltYm9sX2V4aXN0cygiR1NTX0NfTlRfSE9TVEJBU0VEX1NFUlZJQ0UiICR7X0lOQ0xVREVfTElTVH0gSEFWRV9HU1NfQ19OVF9IT1NUQkFTRURfU0VSVklDRSkKICAgICAgaWYoTk9UIEhBVkVfR1NTX0NfTlRfSE9TVEJBU0VEX1NFUlZJQ0UpCiAgICAgICAgc2V0KEhBVkVfT0xEX0dTU01JVCBPTikKICAgICAgZW5kaWYoKQoKICAgIGVuZGlmKCkKCiAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7R1NTX0lOQ0xVREVfRElSRUNUT1JJRVN9KQogICAgbGlua19kaXJlY3Rvcmllcygke0dTU19MSU5LX0RJUkVDVE9SSUVTfSkKICAgIHNldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9ICR7R1NTX0NPTVBJTEVSX0ZMQUdTfSIpCiAgICBzZXQoQ01BS0VfU0hBUkVEX0xJTktFUl9GTEFHUyAiJHtDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTfSAke0dTU19MSU5LRVJfRkxBR1N9IikKICAgIHNldChDTUFLRV9FWEVfTElOS0VSX0ZMQUdTICIke0NNQUtFX0VYRV9MSU5LRVJfRkxBR1N9ICR7R1NTX0xJTktFUl9GTEFHU30iKQogICAgbGlzdChBUFBFTkQgQ1VSTF9MSUJTICR7R1NTX0xJQlJBUklFU30pCgogIGVsc2UoKQogICAgbWVzc2FnZShXQVJOSU5HICJHU1NBUEkgc3VwcG9ydCBoYXMgYmVlbiByZXF1ZXN0ZWQgYnV0IG5vIHN1cHBvcnRpbmcgbGlicmFyaWVzIGZvdW5kLiBTa2lwcGluZy4iKQogIGVuZGlmKCkKZW5kaWYoKQoKb3B0aW9uKEVOQUJMRV9VTklYX1NPQ0tFVFMgIkRlZmluZSBpZiB5b3Ugd2FudCBVbml4IGRvbWFpbiBzb2NrZXRzIHN1cHBvcnQiIE9OKQppZihFTkFCTEVfVU5JWF9TT0NLRVRTKQogIGluY2x1ZGUoQ2hlY2tTdHJ1Y3RIYXNNZW1iZXIpCiAgY2hlY2tfc3RydWN0X2hhc19tZW1iZXIoInN0cnVjdCBzb2NrYWRkcl91biIgc3VuX3BhdGggInN5cy91bi5oIiBVU0VfVU5JWF9TT0NLRVRTKQplbHNlKCkKICB1bnNldChVU0VfVU5JWF9TT0NLRVRTIENBQ0hFKQplbmRpZigpCgoKIyBDaGVjayBmb3IgaGVhZGVyIGZpbGVzCmlmKE5PVCBVTklYKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbmRvd3MuaCIgICAgICBIQVZFX1dJTkRPV1NfSCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ3aW5zb2NrLmgiICAgICAgSEFWRV9XSU5TT0NLX0gpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgid3MydGNwaXAuaCIgICAgIEhBVkVfV1MyVENQSVBfSCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ3aW5zb2NrMi5oIiAgICAgSEFWRV9XSU5TT0NLMl9IKQogIGlmKENVUkxfV0lORE9XU19TU1BJKQogICAgc2V0KENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TICIke0NNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TfSAtRFNFQ1VSSVRZX1dJTjMyIikKICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNzcGkuaCIgICAgICAgSEFWRV9TU1BJX0gpCiAgICBpZihIQVZFX1NTUElfSCkKICAgICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic2NoYW5uZWwuaCIgSEFWRV9TQ0hBTk5FTF9IKQogICAgICBzZXQoVVNFX1dJTkRPV1NfU1NQSSBPTikKICAgICAgaWYoSEFWRV9TQ0hBTk5FTF9IKQogICAgICAgIHNldChVU0VfU0NIQU5ORUwgT04pCiAgICAgICAgc2V0KFNTTF9FTkFCTEVEIE9OKQogICAgICBlbmRpZigpCiAgICBlbmRpZigpCiAgZW5kaWYoKQplbmRpZihOT1QgVU5JWCkKCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGlvLmgiICAgICAgICAgIEhBVkVfU1RESU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaW50dHlwZXMuaCIgICAgICAgSEFWRV9JTlRUWVBFU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvZmlsaW8uaCIgICAgICBIQVZFX1NZU19GSUxJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvaW9jdGwuaCIgICAgICBIQVZFX1NZU19JT0NUTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvcGFyYW0uaCIgICAgICBIQVZFX1NZU19QQVJBTV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvcG9sbC5oIiAgICAgICBIQVZFX1NZU19QT0xMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9yZXNvdXJjZS5oIiAgIEhBVkVfU1lTX1JFU09VUkNFX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9zZWxlY3QuaCIgICAgIEhBVkVfU1lTX1NFTEVDVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvc29ja2V0LmgiICAgICBIQVZFX1NZU19TT0NLRVRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3NvY2tpby5oIiAgICAgSEFWRV9TWVNfU09DS0lPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9zdGF0LmgiICAgICAgIEhBVkVfU1lTX1NUQVRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3RpbWUuaCIgICAgICAgSEFWRV9TWVNfVElNRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdHlwZXMuaCIgICAgICBIQVZFX1NZU19UWVBFU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdWlvLmgiICAgICAgICBIQVZFX1NZU19VSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3VuLmgiICAgICAgICAgSEFWRV9TWVNfVU5fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3V0aW1lLmgiICAgICAgSEFWRV9TWVNfVVRJTUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiYWxsb2NhLmgiICAgICAgICAgSEFWRV9BTExPQ0FfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiYXJwYS9pbmV0LmgiICAgICAgSEFWRV9BUlBBX0lORVRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiYXJwYS90ZnRwLmgiICAgICAgSEFWRV9BUlBBX1RGVFBfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiYXNzZXJ0LmgiICAgICAgICAgSEFWRV9BU1NFUlRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiY3J5cHRvLmgiICAgICAgICAgSEFWRV9DUllQVE9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZGVzLmgiICAgICAgICAgICAgSEFWRV9ERVNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZXJyLmgiICAgICAgICAgICAgSEFWRV9FUlJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZXJybm8uaCIgICAgICAgICAgSEFWRV9FUlJOT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJmY250bC5oIiAgICAgICAgICBIQVZFX0ZDTlRMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImlkbi1mcmVlLmgiICAgICAgIEhBVkVfSUROX0ZSRUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaWZhZGRycy5oIiAgICAgICAgSEFWRV9JRkFERFJTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImlvLmgiICAgICAgICAgICAgIEhBVkVfSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgia3JiLmgiICAgICAgICAgICAgSEFWRV9LUkJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGliZ2VuLmgiICAgICAgICAgSEFWRV9MSUJHRU5fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGltaXRzLmgiICAgICAgICAgSEFWRV9MSU1JVFNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibG9jYWxlLmgiICAgICAgICAgSEFWRV9MT0NBTEVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0L2lmLmgiICAgICAgICAgSEFWRV9ORVRfSUZfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0ZGIuaCIgICAgICAgICAgSEFWRV9ORVREQl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJuZXRpbmV0L2luLmgiICAgICBIQVZFX05FVElORVRfSU5fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0aW5ldC90Y3AuaCIgICAgSEFWRV9ORVRJTkVUX1RDUF9IKQoKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicGVtLmgiICAgICAgICAgICAgSEFWRV9QRU1fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicG9sbC5oIiAgICAgICAgICAgSEFWRV9QT0xMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInB3ZC5oIiAgICAgICAgICAgIEhBVkVfUFdEX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInJzYS5oIiAgICAgICAgICAgIEhBVkVfUlNBX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNldGptcC5oIiAgICAgICAgIEhBVkVfU0VUSk1QX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNndHR5LmgiICAgICAgICAgIEhBVkVfU0dUVFlfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic2lnbmFsLmgiICAgICAgICAgSEFWRV9TSUdOQUxfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3NsLmgiICAgICAgICAgICAgSEFWRV9TU0xfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkYm9vbC5oIiAgICAgICAgSEFWRV9TVERCT09MX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGludC5oIiAgICAgICAgIEhBVkVfU1RESU5UX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGlvLmgiICAgICAgICAgIEhBVkVfU1RESU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkbGliLmgiICAgICAgICAgSEFWRV9TVERMSUJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RyaW5nLmgiICAgICAgICAgSEFWRV9TVFJJTkdfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RyaW5ncy5oIiAgICAgICAgSEFWRV9TVFJJTkdTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0cm9wdHMuaCIgICAgICAgIEhBVkVfU1RST1BUU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ0ZXJtaW8uaCIgICAgICAgICBIQVZFX1RFUk1JT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ0ZXJtaW9zLmgiICAgICAgICBIQVZFX1RFUk1JT1NfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidGltZS5oIiAgICAgICAgICAgSEFWRV9USU1FX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInRsZC5oIiAgICAgICAgICAgIEhBVkVfVExEX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInVuaXN0ZC5oIiAgICAgICAgIEhBVkVfVU5JU1REX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInV0aW1lLmgiICAgICAgICAgIEhBVkVfVVRJTUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgieDUwOS5oIiAgICAgICAgICAgSEFWRV9YNTA5X0gpCgpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJwcm9jZXNzLmgiICAgICAgICBIQVZFX1BST0NFU1NfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkZGVmLmgiICAgICAgICAgSEFWRV9TVERERUZfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZGxmY24uaCIgICAgICAgICAgSEFWRV9ETEZDTl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJtYWxsb2MuaCIgICAgICAgICBIQVZFX01BTExPQ19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJtZW1vcnkuaCIgICAgICAgICBIQVZFX01FTU9SWV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJuZXRpbmV0L2lmX2V0aGVyLmgiIEhBVkVfTkVUSU5FVF9JRl9FVEhFUl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRpbnQuaCIgICAgICAgIEhBVkVfU1RESU5UX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNvY2tpby5oIiAgICAgICAgSEFWRV9TT0NLSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3V0c25hbWUuaCIgICBIQVZFX1NZU19VVFNOQU1FX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImlkbmEuaCIgICAgICAgICAgSEFWRV9JRE5BX0gpCgoKCmNoZWNrX3R5cGVfc2l6ZShzaXplX3QgIFNJWkVPRl9TSVpFX1QpCmNoZWNrX3R5cGVfc2l6ZShzc2l6ZV90ICBTSVpFT0ZfU1NJWkVfVCkKY2hlY2tfdHlwZV9zaXplKCJsb25nIGxvbmciICBTSVpFT0ZfTE9OR19MT05HKQpjaGVja190eXBlX3NpemUoImxvbmciICBTSVpFT0ZfTE9ORykKY2hlY2tfdHlwZV9zaXplKCJzaG9ydCIgIFNJWkVPRl9TSE9SVCkKY2hlY2tfdHlwZV9zaXplKCJpbnQiICBTSVpFT0ZfSU5UKQpjaGVja190eXBlX3NpemUoIl9faW50NjQiICBTSVpFT0ZfX19JTlQ2NCkKY2hlY2tfdHlwZV9zaXplKCJsb25nIGRvdWJsZSIgIFNJWkVPRl9MT05HX0RPVUJMRSkKY2hlY2tfdHlwZV9zaXplKCJ0aW1lX3QiICBTSVpFT0ZfVElNRV9UKQppZihOT1QgSEFWRV9TSVpFT0ZfU1NJWkVfVCkKICBpZihTSVpFT0ZfTE9ORyBFUVVBTCBTSVpFT0ZfU0laRV9UKQogICAgc2V0KHNzaXplX3QgbG9uZykKICBlbmRpZihTSVpFT0ZfTE9ORyBFUVVBTCBTSVpFT0ZfU0laRV9UKQogIGlmKE5PVCBzc2l6ZV90IEFORCBTSVpFT0ZfX19JTlQ2NCBFUVVBTCBTSVpFT0ZfU0laRV9UKQogICAgc2V0KHNzaXplX3QgX19pbnQ2NCkKICBlbmRpZihOT1Qgc3NpemVfdCBBTkQgU0laRU9GX19fSU5UNjQgRVFVQUwgU0laRU9GX1NJWkVfVCkKZW5kaWYoTk9UIEhBVkVfU0laRU9GX1NTSVpFX1QpCgojIERpZmZlcmVudCBzaXplb2ZzLCBldGMuCgojICAgIGRlZmluZSBDVVJMX1NJWkVPRl9MT05HICAgICAgICA0CiMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgIGxvbmcgbG9uZwojICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAibGxkIgojICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibGx1IgojICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9PRkZfVCAgICAgICAiJWxsZCIKIyAgICBkZWZpbmUgQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCAgOAojICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICBMTAojICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBVTEwKCnNldChDVVJMX1NJWkVPRl9MT05HICR7U0laRU9GX0xPTkd9KQoKaWYoU0laRU9GX0xPTkcgRVFVQUwgOCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCBsb25nKQogIHNldChDVVJMX1NJWkVPRl9DVVJMX09GRl9UIDgpCiAgc2V0KENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgImxkIikKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgImx1IikKICBzZXQoQ1VSTF9GT1JNQVRfT0ZGX1QgIiVsZCIpCiAgc2V0KENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgTCkKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgVUwpCmVuZGlmKFNJWkVPRl9MT05HIEVRVUFMIDgpCgppZihTSVpFT0ZfTE9OR19MT05HIEVRVUFMIDgpCiAgc2V0KENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgImxvbmcgbG9uZyIpCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgOCkKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAibGxkIikKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgImxsdSIpCiAgc2V0KENVUkxfRk9STUFUX09GRl9UICIlbGxkIikKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCBMTCkKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgVUxMKQplbmRpZihTSVpFT0ZfTE9OR19MT05HIEVRVUFMIDgpCgppZihOT1QgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAke3NzaXplX3R9KQogIHNldChDVVJMX1NJWkVPRl9DVVJMX09GRl9UICR7U0laRU9GX1NTSVpFX1R9KQogICMgVE9ETzogbmVlZCBhZGp1c3RtZW50IGhlcmUuCiAgc2V0KENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgImxkIikKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgImx1IikKICBzZXQoQ1VSTF9GT1JNQVRfT0ZGX1QgIiVsZCIpCiAgc2V0KENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgTCkKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgTFUpCmVuZGlmKE5PVCBDVVJMX1RZUEVPRl9DVVJMX09GRl9UKQoKaWYoSEFWRV9TSVpFT0ZfTE9OR19MT05HKQogIHNldChIQVZFX0xPTkdMT05HIDEpCiAgc2V0KEhBVkVfTEwgMSkKZW5kaWYoSEFWRV9TSVpFT0ZfTE9OR19MT05HKQoKZmluZF9maWxlKFJBTkRPTV9GSUxFIHVyYW5kb20gL2RldikKbWFya19hc19hZHZhbmNlZChSQU5ET01fRklMRSkKCiMgQ2hlY2sgZm9yIHNvbWUgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWQKaWYoSEFWRV9MSUJXUzJfMzIpCiAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyB3czJfMzIpCmVsc2VpZihIQVZFX0xJQlNPQ0tFVCkKICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTIHNvY2tldCkKZW5kaWYoKQoKY2hlY2tfc3ltYm9sX2V4aXN0cyhiYXNlbmFtZSAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0JBU0VOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKHNvY2tldCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU09DS0VUKQpjaGVja19zeW1ib2xfZXhpc3RzKHBvbGwgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUE9MTCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZWxlY3QgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFTEVDVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJkdXAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkRVUCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJzdHIgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUlNUUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJ0b2tfciAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUlRPS19SKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmZ0aW1lICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSRlRJTUUpCmNoZWNrX3N5bWJvbF9leGlzdHModW5hbWUgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9VTkFNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJjYXNlY21wICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkNBU0VDTVApCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyaWNtcCAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJJQ01QKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmNtcGkgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSQ01QSSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJuY21waSAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUk5DTVBJKQpjaGVja19zeW1ib2xfZXhpc3RzKGFsYXJtICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfQUxBUk0pCmlmKE5PVCBIQVZFX1NUUk5DTVBJKQogIHNldChIQVZFX1NUUkNNUEkpCmVuZGlmKE5PVCBIQVZFX1NUUk5DTVBJKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldGhvc3RieWFkZHIgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZQUREUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRob3N0YnlhZGRyX3IgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZQUREUl9SKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHRpbWVvZmRheSAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUVElNRU9GREFZKQpjaGVja19zeW1ib2xfZXhpc3RzKGluZXRfYWRkciAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU5FVF9BRERSKQpjaGVja19zeW1ib2xfZXhpc3RzKGluZXRfbnRvYSAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU5FVF9OVE9BKQpjaGVja19zeW1ib2xfZXhpc3RzKGluZXRfbnRvYV9yICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU5FVF9OVE9BX1IpCmNoZWNrX3N5bWJvbF9leGlzdHModGNzZXRhdHRyICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9UQ1NFVEFUVFIpCmNoZWNrX3N5bWJvbF9leGlzdHModGNnZXRhdHRyICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9UQ0dFVEFUVFIpCmNoZWNrX3N5bWJvbF9leGlzdHMocGVycm9yICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9QRVJST1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoY2xvc2Vzb2NrZXQgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9DTE9TRVNPQ0tFVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZXR2YnVmICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFVFZCVUYpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2lnc2V0am1wICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TSUdTRVRKTVApCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0cGFzc19yICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRQQVNTX1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RybGNhdCAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJMQ0FUKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHB3dWlkICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUUFdVSUQpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0ZXVpZCAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRFVUlEKQpjaGVja19zeW1ib2xfZXhpc3RzKHV0aW1lICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVVRJTUUpCmlmKENNQUtFX1VTRV9PUEVOU1NMKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoUkFORF9zdGF0dXMgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9SQU5EX1NUQVRVUykKICBjaGVja19zeW1ib2xfZXhpc3RzKFJBTkRfc2NyZWVuICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUkFORF9TQ1JFRU4pCiAgY2hlY2tfc3ltYm9sX2V4aXN0cyhSQU5EX2VnZCAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1JBTkRfRUdEKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEgIiR7Q1VSTF9JTkNMVURFU30iCiAgICBIQVZFX0NSWVBUT19DTEVBTlVQX0FMTF9FWF9EQVRBKQogIGlmKEhBVkVfTElCQ1JZUFRPIEFORCBIQVZFX0xJQlNTTCkKICAgIHNldChVU0VfT1BFTlNTTCAxKQogIGVuZGlmKEhBVkVfTElCQ1JZUFRPIEFORCBIQVZFX0xJQlNTTCkKZW5kaWYoQ01BS0VfVVNFX09QRU5TU0wpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ210aW1lX3IgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HTVRJTUVfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhsb2NhbHRpbWVfciAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0xPQ0FMVElNRV9SKQoKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRob3N0YnluYW1lICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZTkFNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRob3N0YnluYW1lX3IgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZTkFNRV9SKQoKY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWduYWwgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NJR05BTF9GVU5DKQpjaGVja19zeW1ib2xfZXhpc3RzKFNJR0FMUk0gICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0lHTkFMX01BQ1JPKQppZihIQVZFX1NJR05BTF9GVU5DIEFORCBIQVZFX1NJR05BTF9NQUNSTykKICBzZXQoSEFWRV9TSUdOQUwgMSkKZW5kaWYoSEFWRV9TSUdOQUxfRlVOQyBBTkQgSEFWRV9TSUdOQUxfTUFDUk8pCmNoZWNrX3N5bWJvbF9leGlzdHModW5hbWUgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVU5BTUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RydG9sbCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSVE9MTCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhfc3RydG9pNjQgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9fU1RSVE9JNjQpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyZXJyb3JfciAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSRVJST1JfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWdpbnRlcnJ1cHQgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TSUdJTlRFUlJVUFQpCmNoZWNrX3N5bWJvbF9leGlzdHMocGVycm9yICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUEVSUk9SKQpjaGVja19zeW1ib2xfZXhpc3RzKGZvcmsgICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZPUkspCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0YWRkcmluZm8gICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUQUREUklORk8pCmNoZWNrX3N5bWJvbF9leGlzdHMoZnJlZWFkZHJpbmZvICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRlJFRUFERFJJTkZPKQpjaGVja19zeW1ib2xfZXhpc3RzKGZyZWVpZmFkZHJzICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZSRUVJRkFERFJTKQpjaGVja19zeW1ib2xfZXhpc3RzKHBpcGUgICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1BJUEUpCmNoZWNrX3N5bWJvbF9leGlzdHMoZnRydW5jYXRlICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRlRSVU5DQVRFKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHByb3RvYnluYW1lICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVFBST1RPQllOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHJsaW1pdCAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVFJMSU1JVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhpZG5fZnJlZSAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JRE5fRlJFRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhpZG5hX3N0cmVycm9yICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JRE5BX1NUUkVSUk9SKQpjaGVja19zeW1ib2xfZXhpc3RzKHRsZF9zdHJlcnJvciAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1RMRF9TVFJFUlJPUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZXRsb2NhbGUgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TRVRMT0NBTEUpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2V0cmxpbWl0ICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VUUkxJTUlUKQpjaGVja19zeW1ib2xfZXhpc3RzKGZjbnRsICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZDTlRMKQpjaGVja19zeW1ib2xfZXhpc3RzKGlvY3RsICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0lPQ1RMKQpjaGVja19zeW1ib2xfZXhpc3RzKHNldHNvY2tvcHQgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFVFNPQ0tPUFQpCgojIHN5bWJvbCBleGlzdHMgaW4gd2luMzIsIGJ1dCBmdW5jdGlvbiBkb2VzIG5vdC4KY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGluZXRfcHRvbiBIQVZFX0lORVRfUFRPTikKCiMgc2lnYWN0aW9uIGFuZCBzaWdzZXRqbXAgYXJlIHNwZWNpYWwuIFVzZSBzcGVjaWFsIG1lY2hhbmlzbSBmb3IKIyBkZXRlY3RpbmcgdGhvc2UsIGJ1dCBvbmx5IGlmIHByZXZpb3VzIGF0dGVtcHQgZmFpbGVkLgppZihIQVZFX1NJR05BTF9IKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoc2lnYWN0aW9uICJzaWduYWwuaCIgSEFWRV9TSUdBQ1RJT04pCmVuZGlmKEhBVkVfU0lHTkFMX0gpCgppZihOT1QgSEFWRV9TSUdTRVRKTVApCiAgaWYoSEFWRV9TRVRKTVBfSCkKICAgIGNoZWNrX3N5bWJvbF9leGlzdHMoc2lnc2V0am1wICJzZXRqbXAuaCIgSEFWRV9NQUNST19TSUdTRVRKTVApCiAgICBpZihIQVZFX01BQ1JPX1NJR1NFVEpNUCkKICAgICAgc2V0KEhBVkVfU0lHU0VUSk1QIDEpCiAgICBlbmRpZihIQVZFX01BQ1JPX1NJR1NFVEpNUCkKICBlbmRpZihIQVZFX1NFVEpNUF9IKQplbmRpZihOT1QgSEFWRV9TSUdTRVRKTVApCgojIElmIHRoZXJlIGlzIG5vIHN0cmljbXAoKSwgZG8gbm90IGFsbG93IExEQVAgdG8gcGFyc2UgVVJMcwppZihOT1QgSEFWRV9TVFJJQ01QKQogIHNldChIQVZFX0xEQVBfVVJMX1BBUlNFIDEpCmVuZGlmKE5PVCBIQVZFX1NUUklDTVApCgojIERvIGN1cmwgc3BlY2lmaWMgdGVzdHMKZm9yZWFjaChDVVJMX1RFU1QKICAgIEhBVkVfRkNOVExfT19OT05CTE9DSwogICAgSEFWRV9JT0NUTFNPQ0tFVAogICAgSEFWRV9JT0NUTFNPQ0tFVF9DQU1FTAogICAgSEFWRV9JT0NUTFNPQ0tFVF9DQU1FTF9GSU9OQklPCiAgICBIQVZFX0lPQ1RMU09DS0VUX0ZJT05CSU8KICAgIEhBVkVfSU9DVExfRklPTkJJTwogICAgSEFWRV9JT0NUTF9TSU9DR0lGQUREUgogICAgSEFWRV9TRVRTT0NLT1BUX1NPX05PTkJMT0NLCiAgICBIQVZFX1NPQ0tBRERSX0lONl9TSU42X1NDT1BFX0lECiAgICBUSU1FX1dJVEhfU1lTX1RJTUUKICAgIEhBVkVfT19OT05CTE9DSwogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNQogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNwogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfOAogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNV9SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzdfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl84X1JFRU5UUkFOVAogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfMwogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNQogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNgogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfM19SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzVfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl82X1JFRU5UUkFOVAogICAgSEFWRV9TT0NLTEVOX1QKICAgIEhBVkVfSU5fQUREUl9UCiAgICBIQVZFX0JPT0xfVAogICAgU1REQ19IRUFERVJTCiAgICBSRVRTSUdUWVBFX1RFU1QKICAgIEhBVkVfSU5FVF9OVE9BX1JfREVDTAogICAgSEFWRV9JTkVUX05UT0FfUl9ERUNMX1JFRU5UUkFOVAogICAgSEFWRV9HRVRBRERSSU5GTwogICAgSEFWRV9GSUxFX09GRlNFVF9CSVRTCiAgICApCiAgY3VybF9pbnRlcm5hbF90ZXN0KCR7Q1VSTF9URVNUfSkKZW5kZm9yZWFjaChDVVJMX1RFU1QpCmlmKEhBVkVfRklMRV9PRkZTRVRfQklUUykKICBzZXQoX0ZJTEVfT0ZGU0VUX0JJVFMgNjQpCmVuZGlmKEhBVkVfRklMRV9PRkZTRVRfQklUUykKZm9yZWFjaChDVVJMX1RFU1QKICAgIEhBVkVfR0xJQkNfU1RSRVJST1JfUgogICAgSEFWRV9QT1NJWF9TVFJFUlJPUl9SCiAgICApCiAgY3VybF9pbnRlcm5hbF90ZXN0X3J1bigke0NVUkxfVEVTVH0pCmVuZGZvcmVhY2goQ1VSTF9URVNUKQoKIyBDaGVjayBmb3IgcmVlbnRyYW50CmZvcmVhY2goQ1VSTF9URVNUCiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl81CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl83CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl84CiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl81CiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl82CiAgICBIQVZFX0lORVRfTlRPQV9SX0RFQ0xfUkVFTlRSQU5UKQogIGlmKE5PVCAke0NVUkxfVEVTVH0pCiAgICBpZigke0NVUkxfVEVTVH1fUkVFTlRSQU5UKQogICAgICBzZXQoTkVFRF9SRUVOVFJBTlQgMSkKICAgIGVuZGlmKCR7Q1VSTF9URVNUfV9SRUVOVFJBTlQpCiAgZW5kaWYoTk9UICR7Q1VSTF9URVNUfSkKZW5kZm9yZWFjaChDVVJMX1RFU1QpCgppZihORUVEX1JFRU5UUkFOVCkKICBmb3JlYWNoKENVUkxfVEVTVAogICAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl81CiAgICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzcKICAgICAgSEFWRV9HRVRIT1NUQllBRERSX1JfOAogICAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zCiAgICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzUKICAgICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNikKICAgIHNldCgke0NVUkxfVEVTVH0gMCkKICAgIGlmKCR7Q1VSTF9URVNUfV9SRUVOVFJBTlQpCiAgICAgIHNldCgke0NVUkxfVEVTVH0gMSkKICAgIGVuZGlmKCR7Q1VSTF9URVNUfV9SRUVOVFJBTlQpCiAgZW5kZm9yZWFjaChDVVJMX1RFU1QpCmVuZGlmKE5FRURfUkVFTlRSQU5UKQoKaWYoSEFWRV9JTkVUX05UT0FfUl9ERUNMX1JFRU5UUkFOVCkKICBzZXQoSEFWRV9JTkVUX05UT0FfUl9ERUNMIDEpCiAgc2V0KE5FRURfUkVFTlRSQU5UIDEpCmVuZGlmKEhBVkVfSU5FVF9OVE9BX1JfREVDTF9SRUVOVFJBTlQpCgojIFNvbWUgb3RoZXIgbWlub3IgdGVzdHMKCmlmKE5PVCBIQVZFX0lOX0FERFJfVCkKICBzZXQoaW5fYWRkcl90ICJ1bnNpZ25lZCBsb25nIikKZW5kaWYoTk9UIEhBVkVfSU5fQUREUl9UKQoKIyBGaXggbGlieiAvIHpsaWIuaAoKaWYoTk9UIENVUkxfU1BFQ0lBTF9MSUJaKQogIGlmKE5PVCBIQVZFX0xJQlopCiAgICBzZXQoSEFWRV9aTElCX0ggMCkKICBlbmRpZihOT1QgSEFWRV9MSUJaKQoKICBpZihOT1QgSEFWRV9aTElCX0gpCiAgICBzZXQoSEFWRV9MSUJaIDApCiAgZW5kaWYoTk9UIEhBVkVfWkxJQl9IKQplbmRpZihOT1QgQ1VSTF9TUEVDSUFMX0xJQlopCgppZihfRklMRV9PRkZTRVRfQklUUykKICBzZXQoX0ZJTEVfT0ZGU0VUX0JJVFMgNjQpCmVuZGlmKF9GSUxFX09GRlNFVF9CSVRTKQpzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgIi1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiKQpzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUyAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2N1cmwvY3VybC5oIikKY2hlY2tfdHlwZV9zaXplKCJjdXJsX29mZl90IiBTSVpFT0ZfQ1VSTF9PRkZfVCkKc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMpCnNldChDTUFLRV9SRVFVSVJFRF9GTEFHUykKCgojIENoZWNrIGZvciBub25ibG9ja2luZwpzZXQoSEFWRV9ESVNBQkxFRF9OT05CTE9DS0lORyAxKQppZihIQVZFX0ZJT05CSU8gT1IKICAgIEhBVkVfSU9DVExTT0NLRVQgT1IKICAgIEhBVkVfSU9DVExTT0NLRVRfQ0FTRSBPUgogICAgSEFWRV9PX05PTkJMT0NLKQogIHNldChIQVZFX0RJU0FCTEVEX05PTkJMT0NLSU5HKQplbmRpZihIQVZFX0ZJT05CSU8gT1IKICBIQVZFX0lPQ1RMU09DS0VUIE9SCiAgSEFWRV9JT0NUTFNPQ0tFVF9DQVNFIE9SCiAgSEFWRV9PX05PTkJMT0NLKQoKaWYoUkVUU0lHVFlQRV9URVNUKQogIHNldChSRVRTSUdUWVBFIHZvaWQpCmVsc2UoUkVUU0lHVFlQRV9URVNUKQogIHNldChSRVRTSUdUWVBFIGludCkKZW5kaWYoUkVUU0lHVFlQRV9URVNUKQoKaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ0MgQU5EIEFQUExFKQogIGluY2x1ZGUoQ2hlY2tDQ29tcGlsZXJGbGFnKQogIGNoZWNrX2NfY29tcGlsZXJfZmxhZygtV25vLWxvbmctZG91YmxlIEhBVkVfQ19GTEFHX1dub19sb25nX2RvdWJsZSkKICBpZihIQVZFX0NfRkxBR19Xbm9fbG9uZ19kb3VibGUpCiAgICAjIFRoZSBNYWMgdmVyc2lvbiBvZiBHQ0Mgd2FybnMgYWJvdXQgdXNlIG9mIGxvbmcgZG91YmxlLiAgRGlzYWJsZSBpdC4KICAgIGdldF9zb3VyY2VfZmlsZV9wcm9wZXJ0eShNUFJJTlRGX0NPTVBJTEVfRkxBR1MgbXByaW50Zi5jIENPTVBJTEVfRkxBR1MpCiAgICBpZihNUFJJTlRGX0NPTVBJTEVfRkxBR1MpCiAgICAgIHNldChNUFJJTlRGX0NPTVBJTEVfRkxBR1MgIiR7TVBSSU5URl9DT01QSUxFX0ZMQUdTfSAtV25vLWxvbmctZG91YmxlIikKICAgIGVsc2UoTVBSSU5URl9DT01QSUxFX0ZMQUdTKQogICAgICBzZXQoTVBSSU5URl9DT01QSUxFX0ZMQUdTICItV25vLWxvbmctZG91YmxlIikKICAgIGVuZGlmKE1QUklOVEZfQ09NUElMRV9GTEFHUykKICAgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcyhtcHJpbnRmLmMgUFJPUEVSVElFUwogICAgICBDT01QSUxFX0ZMQUdTICR7TVBSSU5URl9DT01QSUxFX0ZMQUdTfSkKICBlbmRpZihIQVZFX0NfRkxBR19Xbm9fbG9uZ19kb3VibGUpCmVuZGlmKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIEFORCBBUFBMRSkKCmlmKEhBVkVfU09DS0xFTl9UKQogIHNldChDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCAic29ja2xlbl90IikKICBpZihXSU4zMikKICAgIHNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTICJ3aW5zb2NrMi5oO3dzMnRjcGlwLmgiKQogIGVsc2VpZihIQVZFX1NZU19TT0NLRVRfSCkKICAgIHNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTICJzeXMvc29ja2V0LmgiKQogIGVuZGlmKCkKICBjaGVja190eXBlX3NpemUoInNvY2tsZW5fdCIgQ1VSTF9TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QpCiAgc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMpCiAgaWYoTk9UIEhBVkVfQ1VSTF9TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QpCiAgICBtZXNzYWdlKEZBVEFMX0VSUk9SCiAgICAgIkNoZWNrIGZvciBzaXplb2Ygc29ja2xlbl90IGZhaWxlZCwgc2VlIENNYWtlRmlsZXMvQ01ha2Vycm9yLmxvZyIpCiAgZW5kaWYoKQplbHNlKCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgaW50KQogIHNldChDVVJMX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCAke1NJWkVPRl9JTlR9KQplbmRpZigpCgojIFRPRE8gdGVzdCB3aGljaCBvZiB0aGVzZSBoZWFkZXJzIGFyZSByZXF1aXJlZCBmb3IgdGhlIHR5cGVkZWZzIHVzZWQgaW4gY3VybGJ1aWxkLmgKaWYoV0lOMzIpCiAgc2V0KENVUkxfUFVMTF9XUzJUQ1BJUF9IICR7SEFWRV9XUzJUQ1BJUF9IfSkKZWxzZSgpCiAgc2V0KENVUkxfUFVMTF9TWVNfVFlQRVNfSCAke0hBVkVfU1lTX1RZUEVTX0h9KQogIHNldChDVVJMX1BVTExfU1lTX1NPQ0tFVF9IICR7SEFWRV9TWVNfU09DS0VUX0h9KQogIHNldChDVVJMX1BVTExfU1lTX1BPTExfSCAke0hBVkVfU1lTX1BPTExfSH0pCmVuZGlmKCkKc2V0KENVUkxfUFVMTF9TVERJTlRfSCAke0hBVkVfU1RESU5UX0h9KQpzZXQoQ1VSTF9QVUxMX0lOVFRZUEVTX0ggJHtIQVZFX0lOVFRZUEVTX0h9KQoKaW5jbHVkZShDTWFrZS9PdGhlclRlc3RzLmNtYWtlKQoKYWRkX2RlZmluaXRpb25zKC1ESEFWRV9DT05GSUdfSCkKCiMgRm9yIHdpbmRvd3MsIGRvIG5vdCBhbGxvdyB0aGUgY29tcGlsZXIgdG8gdXNlIGRlZmF1bHQgdGFyZ2V0IChWaXN0YSkuCmlmKFdJTjMyKQogIGFkZF9kZWZpbml0aW9ucygtRF9XSU4zMl9XSU5OVD0weDA1MDEpCmVuZGlmKFdJTjMyKQoKaWYoTVNWQykKICBhZGRfZGVmaW5pdGlvbnMoLURfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgLURfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFKQplbmRpZihNU1ZDKQoKIyBVZ2x5IChidXQgZnVuY3Rpb25hbCkgd2F5IHRvIGluY2x1ZGUgIk1ha2VmaWxlLmluYyIgYnkgdHJhbnNmb3JtaW5nIGl0ICg9IHJlZ2VuZXJhdGUgaXQpLgpmdW5jdGlvbihUUkFOU0ZPUk1fTUFLRUZJTEVfSU5DIElOUFVUX0ZJTEUgT1VUUFVUX0ZJTEUpCiAgZmlsZShSRUFEICR7SU5QVVRfRklMRX0gTUFLRUZJTEVfSU5DX1RFWFQpCiAgc3RyaW5nKFJFUExBQ0UgIiQodG9wX3NyY2RpcikiICAgIlwke0NVUkxfU09VUkNFX0RJUn0iIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KQogIHN0cmluZyhSRVBMQUNFICIkKHRvcF9idWlsZGRpcikiICJcJHtDVVJMX0JJTkFSWV9ESVJ9IiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkKCiAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlxcXFxcbiIgIqchpyIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pCiAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIihbYS16QS1aX11bYS16QS1aMC05X10qKVtcdCBdKj1bXHQgXSooW15cbl0qKSIgIlNFVChcXDEgXFwyKSIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pCiAgc3RyaW5nKFJFUExBQ0UgIqchpyIgIlxuIiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkKCiAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlxcJFxcKChbYS16QS1aX11bYS16QS1aMC05X10qKVxcKSIgIlwke1xcMX0iIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KSAgICAjIFJlcGxhY2UgJCgpIHdpdGggJHt9CiAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIkAoW2EtekEtWl9dW2EtekEtWjAtOV9dKilAIiAiXCR7XFwxfSIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pICAgICMgUmVwbGFjZSBAQCB3aXRoICR7fSwgZXZlbiBpZiB0aGF0IG1heSBub3QgYmUgcmVhZCBieSBDTWFrZSBzY3JpcHRzLgogIGZpbGUoV1JJVEUgJHtPVVRQVVRfRklMRX0gJHtNQUtFRklMRV9JTkNfVEVYVH0pCgplbmRmdW5jdGlvbigpCgphZGRfc3ViZGlyZWN0b3J5KGxpYikKaWYoQlVJTERfQ1VSTF9FWEUpCiAgYWRkX3N1YmRpcmVjdG9yeShzcmMpCmVuZGlmKCkKaWYoQlVJTERfQ1VSTF9URVNUUykKICBhZGRfc3ViZGlyZWN0b3J5KHRlc3RzKQplbmRpZigpCgojIFRPRE8gc3VwcG9ydCBHTlVUTFMsIE5TUywgUE9MQVJTU0wsIEFYVExTLCBDWUFTU0wsIFdJTlNTTCwgREFSV0lOU1NMCmlmKFVTRV9PUEVOU1NMKQogIHNldChTU0xfRU5BQkxFRCAxKQplbmRpZigpCgojIEhlbHBlciB0byBwb3B1bGF0ZSBhIGxpc3QgKF9pdGVtcykgd2l0aCBhIGxhYmVsIHdoZW4gY29uZGl0aW9ucyAodGhlIHJlbWFpbmluZwojIGFyZ3MpIGFyZSBzYXRpc2ZpZWQKZnVuY3Rpb24oX2FkZF9pZiBsYWJlbCkKICAjIFRPRE8gbmVlZCB0byBkaXNhYmxlIHBvbGljeSBDTVAwMDU0IChDTWFrZSAzLjEpIHRvIGFsbG93IHRoaXMgaW5kaXJlY3Rpb24KICBpZigke0FSR059KQogICAgc2V0KF9pdGVtcyAke19pdGVtc30gIiR7bGFiZWx9IiBQQVJFTlRfU0NPUEUpCiAgZW5kaWYoKQplbmRmdW5jdGlvbigpCgojIENsZWFyIGxpc3QgYW5kIHRyeSB0byBkZXRlY3QgYXZhaWxhYmxlIGZlYXR1cmVzCnNldChfaXRlbXMpCl9hZGRfaWYoIlNTTCIgICAgICAgICAgIFNTTF9FTkFCTEVEKQpfYWRkX2lmKCJJUHY2IiAgICAgICAgICBFTkFCTEVfSVBWNikKX2FkZF9pZigidW5peC1zb2NrZXRzIiAgVVNFX1VOSVhfU09DS0VUUykKX2FkZF9pZigibGlieiIgICAgICAgICAgSEFWRV9MSUJaKQpfYWRkX2lmKCJBc3luY2hETlMiICAgICBVU0VfQVJFUyBPUiBVU0VfVEhSRUFEU19QT1NJWCkKX2FkZF9pZigiSUROIiAgICAgICAgICAgSEFWRV9MSUJJRE4pCiMgVE9ETyBTU1AxIChXaW5TU0wpIGNoZWNrIGlzIG1pc3NpbmcKX2FkZF9pZigiU1NQSSIgICAgICAgICAgVVNFX1dJTkRPV1NfU1NQSSkKX2FkZF9pZigiR1NTLUFQSSIgICAgICAgSEFWRV9HU1NBUEkpCiMgVE9ETyBTU1AxIG1pc3NpbmcgZm9yIFNQTkVHTwpfYWRkX2lmKCJTUE5FR08iICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0NSWVBUT19BVVRIIEFORAogICAgICAgICAgICAgICAgICAgICAgICAoSEFWRV9HU1NBUEkgT1IgVVNFX1dJTkRPV1NfU1NQSSkpCl9hZGRfaWYoIktlcmJlcm9zIiAgICAgIE5PVCBDVVJMX0RJU0FCTEVfQ1JZUFRPX0FVVEggQU5ECiAgICAgICAgICAgICAgICAgICAgICAgIChIQVZFX0dTU0FQSSBPUiBVU0VfV0lORE9XU19TU1BJKSkKIyBOVExNIHN1cHBvcnQgcmVxdWlyZXMgY3J5cHRvIGZ1bmN0aW9uIGFkYXB0aW9ucyBmcm9tIHZhcmlvdXMgU1NMIGxpYnMKIyBUT0RPIGFsdGVybmF0aXZlIFNTTCBsaWJzIHRlc3RzIGZvciBTU1AxLCBHTlVUTFMsIE5TUywgREFSV0lOU1NMCmlmKE5PVCBDVVJMX0RJU0FCTEVfQ1JZUFRPX0FVVEggQU5EIChVU0VfT1BFTlNTTCBPUgogICBVU0VfV0lORE9XU19TU1BJIE9SIEdOVVRMU19FTkFCTEVEIE9SIE5TU19FTkFCTEVEIE9SIERBUldJTlNTTF9FTkFCTEVEKSkKICBfYWRkX2lmKCJOVExNIiAgICAgICAgMSkKICAjIFRPRE8gbWlzc2luZyBvcHRpb24gKGF1dG9jb25mOiAtLWVuYWJsZS1udGxtLXdiKQogIF9hZGRfaWYoIk5UTE1fV0IiICAgICBOT1QgQ1VSTF9ESVNBQkxFX0hUVFAgQU5EIE5UTE1fV0JfRU5BQkxFRCkKZW5kaWYoKQojIFRPRE8gbWlzc2luZyBvcHRpb24gKC0tZW5hYmxlLXRscy1zcnApLCBkZXBlbmRzIG9uIEdOVVRMU19TUlAvT1BFTlNTTF9TUlAKX2FkZF9pZigiVExTLVNSUCIgICAgICAgVVNFX1RMU19TUlApCiMgVE9ETyBvcHRpb24gLS13aXRoLW5naHR0cDIgdGVzdHMgZm9yIG5naHR0cDIgbGliIGFuZCBuZ2h0dHAyL25naHR0cDIuaCBoZWFkZXIKX2FkZF9pZigiSFRUUDIiICAgICAgICAgVVNFX05HSFRUUDIpCnN0cmluZyhSRVBMQUNFICI7IiAiICIgU1VQUE9SVF9GRUFUVVJFUyAiJHtfaXRlbXN9IikKbWVzc2FnZShTVEFUVVMgIkVuYWJsZWQgZmVhdHVyZXM6ICR7U1VQUE9SVF9GRUFUVVJFU30iKQoKIyBDbGVhciBsaXN0IGFuZCB0cnkgdG8gZGV0ZWN0IGF2YWlsYWJsZSBwcm90b2NvbHMKc2V0KF9pdGVtcykKX2FkZF9pZigiSFRUUCIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9IVFRQKQpfYWRkX2lmKCJIVFRQUyIgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0hUVFAgQU5EIFNTTF9FTkFCTEVEKQpfYWRkX2lmKCJGVFAiICAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0ZUUCkKX2FkZF9pZigiRlRQUyIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9GVFAgQU5EIFNTTF9FTkFCTEVEKQpfYWRkX2lmKCJGSUxFIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0ZJTEUpCl9hZGRfaWYoIlRFTE5FVCIgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfVEVMTkVUKQpfYWRkX2lmKCJMREFQIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0xEQVApCiMgQ1VSTF9ESVNBQkxFX0xEQVAgaW1wbGllcyBDVVJMX0RJU0FCTEVfTERBUFMKIyBUT0RPIGNoZWNrIEhBVkVfTERBUF9TU0wgKGluIGF1dG9jb25mIHRoaXMgaXMgZW5hYmxlZCB3aXRoIC0tZW5hYmxlLWxkYXBzKQpfYWRkX2lmKCJMREFQUyIgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0xEQVBTIEFORAogICAgICAgICAgICAgICAgICAgICAgICAoKFVTRV9PUEVOTERBUCBBTkQgU1NMX0VOQUJMRUQpIE9SCiAgICAgICAgICAgICAgICAgICAgICAgIChOT1QgVVNFX09QRU5MREFQIEFORCBIQVZFX0xEQVBfU1NMKSkpCl9hZGRfaWYoIkRJQ1QiICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfRElDVCkKX2FkZF9pZigiVEZUUCIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9URlRQKQpfYWRkX2lmKCJHT1BIRVIiICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0dPUEhFUikKX2FkZF9pZigiUE9QMyIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9QT1AzKQpfYWRkX2lmKCJQT1AzUyIgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX1BPUDMgQU5EIFNTTF9FTkFCTEVEKQpfYWRkX2lmKCJJTUFQIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0lNQVApCl9hZGRfaWYoIklNQVBTIiAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfSU1BUCBBTkQgU1NMX0VOQUJMRUQpCl9hZGRfaWYoIlNNVFAiICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfU01UUCkKX2FkZF9pZigiU01UUFMiICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9TTVRQIEFORCBTU0xfRU5BQkxFRCkKX2FkZF9pZigiU0NQIiAgICAgICAgICAgVVNFX0xJQlNTSDIpCl9hZGRfaWYoIlNGVFAiICAgICAgICAgIFVTRV9MSUJTU0gyKQpfYWRkX2lmKCJSVFNQIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX1JUU1ApCl9hZGRfaWYoIlJUTVAiICAgICAgICAgIFVTRV9MSUJSVE1QKQpsaXN0KFNPUlQgX2l0ZW1zKQpzdHJpbmcoUkVQTEFDRSAiOyIgIiAiIFNVUFBPUlRfUFJPVE9DT0xTICIke19pdGVtc30iKQptZXNzYWdlKFNUQVRVUyAiRW5hYmxlZCBwcm90b2NvbHM6ICR7U1VQUE9SVF9QUk9UT0NPTFN9IikKCiMgY3VybC1jb25maWcgbmVlZHMgdGhlIGZvbGxvd2luZyBvcHRpb25zIHRvIGJlIHNldC4Kc2V0KENDICAgICAgICAgICAgICAgICAgICAgICIke0NNQUtFX0NfQ09NUElMRVJ9IikKIyBUT0RPIHByb2JhYmx5IHB1dCBhIC1ELi4uIG9wdGlvbnMgaGVyZT8Kc2V0KENPTkZJR1VSRV9PUFRJT05TICAgICAgICIiKQojIFRPRE8gd2hlbiB0byBzZXQgIi1EQ1VSTF9TVEFUSUNMSUIiIGZvciBDUFBGTEFHX0NVUkxfU1RBVElDTElCPwpzZXQoQ1BQRkxBR19DVVJMX1NUQVRJQ0xJQiAgIiIpCiMgVE9ETyBuZWVkIHRvIHNldCB0aGlzIChzZWUgQ1VSTF9DSEVDS19DQV9CVU5ETEUgaW4gYWNpbmNsdWRlLm00KQpzZXQoQ1VSTF9DQV9CVU5ETEUgICAgICAgICAgIiIpCnNldChDVVJMVkVSU0lPTiAgICAgICAgICAgICAiJHtDVVJMX1ZFUlNJT059IikKc2V0KEVOQUJMRV9TSEFSRUQgICAgICAgICAgICJ5ZXMiKQppZihDVVJMX1NUQVRJQ0xJQikKICAjIEJyb2tlbjogTElCQ1VSTF9MSUJTIGJlbG93OyAuYSBsaWIgaXMgbm90IGJ1aWx0CiAgbWVzc2FnZShXQVJOSU5HICJTdGF0aWMgbGlua2luZyBpcyBicm9rZW4hIikKICBzZXQoRU5BQkxFX1NUQVRJQyAgICAgICAgICJubyIpCmVsc2UoKQogIHNldChFTkFCTEVfU1RBVElDICAgICAgICAgIm5vIikKZW5kaWYoKQpzZXQoZXhlY19wcmVmaXggICAgICAgICAgICAgIlwke3ByZWZpeH0iKQpzZXQoaW5jbHVkZWRpciAgICAgICAgICAgICAgIlwke3ByZWZpeH0vaW5jbHVkZSIpCnNldChMREZMQUdTICAgICAgICAgICAgICAgICAiJHtDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTfSIpCnNldChMSUJDVVJMX0xJQlMgICAgICAgICAgICAiIikKc2V0KGxpYmRpciAgICAgICAgICAgICAgICAgICIke0NNQUtFX0lOU1RBTExfUFJFRklYfS9saWIiKQojIFRPRE8gQ1VSTF9MSUJTIGFsc28gY29udGFpbnMgYWJzb2x1dGUgcGF0aHMgd2hpY2ggZG9uJ3Qgd29yayB3aXRoIHN0YXRpYyAtbC4uLgpmb3JlYWNoKF9saWIgJHtDTUFLRV9DX0lNUExJQ0lUX0xJTktfTElCUkFSSUVTfSAke0NVUkxfTElCU30pCiAgc2V0KExJQkNVUkxfTElCUyAgICAgICAgICAiJHtMSUJDVVJMX0xJQlN9IC1sJHtfbGlifSIpCmVuZGZvcmVhY2goKQojICJhIiAoTGludXgpIG9yICJsaWIiIChXaW5kb3dzKQpzdHJpbmcoUkVQTEFDRSAiLiIgIiIgbGliZXh0ICIke0NNQUtFX1NUQVRJQ19MSUJSQVJZX1NVRkZJWH0iKQpzZXQocHJlZml4ICAgICAgICAgICAgICAgICAgIiR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9IikKIyBTZXQgdGhpcyB0byAieWVzIiB0byBhcHBlbmQgYWxsIGxpYnJhcmllcyBvbiB3aGljaCAtbGN1cmwgaXMgZGVwZW5kZW50CnNldChSRVFVSVJFX0xJQl9ERVBTICAgICAgICAibm8iKQojIFNVUFBPUlRfRkVBVFVSRVMKIyBTVVBQT1JUX1BST1RPQ09MUwpzZXQoVkVSU0lPTk5VTSAgICAgICAgICAgICAgIiR7Q1VSTF9WRVJTSU9OX05VTX0iKQoKIyBGaW5hbGx5IGdlbmVyYXRlIGEgImN1cmwtY29uZmlnIiBtYXRjaGluZyB0aGlzIGNvbmZpZwpjb25maWd1cmVfZmlsZSgiJHtDVVJMX1NPVVJDRV9ESVJ9L2N1cmwtY29uZmlnLmluIgogICAgICAgICAgICAgICAiJHtDVVJMX0JJTkFSWV9ESVJ9L2N1cmwtY29uZmlnIiBAT05MWSkKaW5zdGFsbChGSUxFUyAiJHtDVVJMX0JJTkFSWV9ESVJ9L2N1cmwtY29uZmlnIgogICAgICAgIERFU1RJTkFUSU9OIGJpbgogICAgICAgIFBFUk1JU1NJT05TCiAgICAgICAgICBPV05FUl9SRUFEIE9XTkVSX1dSSVRFIE9XTkVSX0VYRUNVVEUKICAgICAgICAgIEdST1VQX1JFQUQgR1JPVVBfRVhFQ1VURQogICAgICAgICAgV09STERfUkVBRCBXT1JMRF9FWEVDVVRFKQoKIyBGaW5hbGx5IGdlbmVyYXRlIGEgcGtnLWNvbmZpZyBmaWxlIG1hdGNoaW5nIHRoaXMgY29uZmlnCmNvbmZpZ3VyZV9maWxlKCIke0NVUkxfU09VUkNFX0RJUn0vbGliY3VybC5wYy5pbiIKICAgICAgICAgICAgICAgIiR7Q1VSTF9CSU5BUllfRElSfS9saWJjdXJsLnBjIiBAT05MWSkKaW5zdGFsbChGSUxFUyAiJHtDVVJMX0JJTkFSWV9ESVJ9L2xpYmN1cmwucGMiCiAgICAgICAgREVTVElOQVRJT04gbGliL3BrZ2NvbmZpZykKCiMgVGhpcyBuZWVkcyB0byBiZSBydW4gdmVyeSBsYXN0IHNvIG90aGVyIHBhcnRzIG9mIHRoZSBzY3JpcHRzIGNhbiB0YWtlIGFkdmFudGFnZSBvZiB0aGlzLgppZihOT1QgQ1VSTF9DT05GSUdfSEFTX0JFRU5fUlVOX0JFRk9SRSkKICBzZXQoQ1VSTF9DT05GSUdfSEFTX0JFRU5fUlVOX0JFRk9SRSAxIENBQ0hFIElOVEVSTkFMICJGbGFnIHRvIHRyYWNrIHdoZXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSBydW5uaW5nIENNYWtlIG9yIGlmIENNYWtlIGhhcyBiZWVuIGNvbmZpZ3VyZWQgYmVmb3JlIikKZW5kaWYoKQoKIyBJbnN0YWxsYXRpb24uCiMgRmlyc3QsIGluc3RhbGwgZ2VuZXJhdGVkIGN1cmxidWlsZC5oCmluc3RhbGwoRklMRVMgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9pbmNsdWRlL2N1cmwvY3VybGJ1aWxkLmgiCiAgICBERVNUSU5BVElPTiBpbmNsdWRlL2N1cmwgKQojIE5leHQsIGluc3RhbGwgb3RoZXIgaGVhZGVycyBleGNsdWRpbmcgY3VybGJ1aWxkLmgKaW5zdGFsbChESVJFQ1RPUlkgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pbmNsdWRlL2N1cmwiCiAgICBERVNUSU5BVElPTiBpbmNsdWRlCiAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICIqLmgiCiAgICBQQVRURVJOICJjdXJsYnVpbGQuaCIgRVhDTFVERSkKCgojIFdvcmthcm91bmQgZm9yIE1TVlMxMCB0byBhdm9pZCB0aGUgRGlhbG9nIEhlbGwKIyBGSVhNRTogVGhpcyBjb3VsZCBiZSByZW1vdmVkIHdpdGggZnV0dXJlIHZlcnNpb24gb2YgQ01ha2UuCmlmKE1TVkNfVkVSU0lPTiBFUVVBTCAxNjAwKQogIHNldChDVVJMX1NMTl9GSUxFTkFNRSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L0NVUkwuc2xuIikKICBpZihFWElTVFMgIiR7Q1VSTF9TTE5fRklMRU5BTUV9IikKICAgIGZpbGUoQVBQRU5EICIke0NVUkxfU0xOX0ZJTEVOQU1FfSIgIlxuIyBUaGlzIHNob3VsZCBiZSByZWdlbmVyYXRlZCFcbiIpCiAgZW5kaWYoKQplbmRpZigpCg==