IyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KIyAgUHJvamVjdCAgICAgICAgICAgICAgICAgICAgIF9fX3wgfCB8IHwgIF8gXHwgfAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKIwojIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTUsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAojIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKIyBhcmUgYWxzbyBhdmFpbGFibGUgYXQgaHR0cHM6Ly9jdXJsLmhheHguc2UvZG9jcy9jb3B5cmlnaHQuaHRtbC4KIwojIFlvdSBtYXkgb3B0IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSBhbmQvb3Igc2VsbAojIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwojIGZ1cm5pc2hlZCB0byBkbyBzbywgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDT1BZSU5HIGZpbGUuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCiMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBjVVJML2xpYmN1cmwgQ01ha2Ugc2NyaXB0CiMgYnkgVGV0ZXRlc3QgYW5kIFN1a2VuZGVyIChCZW5vaXQgTmVpbCkKCiMgVE9ETzoKIyBUaGUgb3V0cHV0IC5zbyBmaWxlIGxhY2tzIHRoZSBzb25hbWUgbnVtYmVyIHdoaWNoIHdlIGN1cnJlbnRseSBoYXZlIHdpdGhpbiB0aGUgbGliL01ha2VmaWxlLmFtIGZpbGUKIyBBZGQgZnVsbCAoNCBvciA1IGxpYnMpIFNTTCBzdXBwb3J0CiMgQWRkIElOU1RBTEwgdGFyZ2V0IChFWFRSQV9ESVNUIHZhcmlhYmxlcyBpbiBNYWtlZmlsZS5hbSBtYXkgYmUgbW92ZWQgdG8gTWFrZWZpbGUuaW5jIHNvIHRoYXQgQ01ha2UvQ1BhY2sgaXMgYXdhcmUgb2Ygd2hhdCdzIHRvIGluY2x1ZGUpLgojIEFkZCBDVGVzdHMoPykKIyBDaGVjayBvbiBhbGwgcG9zc2libGUgcGxhdGZvcm1zCiMgVGVzdCB3aXRoIGFzIG1hbnkgY29uZmlndXJhdGlvbnMgcG9zc2libGUgKFdpdGggb3Igd2l0aG91dCBhbnkgb3B0aW9uKQojIENyZWF0ZSBzY3JpcHRzIHRoYXQgaGVscCBrZWVwaW5nIHRoZSBDTWFrZSBidWlsZCBzeXN0ZW0gdXAgdG8gZGF0ZSAodG8gcmVkdWNlIG1haW50ZW5hbmNlKS4gQWNjb3JkaW5nIHRvIFRldGV0ZXN0OgojICAtIGxpc3RzIG9mIGhlYWRlcnMgdGhhdCAnY29uZmlndXJlJyBjaGVja3MgZm9yOwojICAtIGN1cmwtc3BlY2lmaWMgdGVzdHMgKHRoZSBvbmVzIHRoYXQgYXJlIGluIG00L2N1cmwtKi5tNCBmaWxlcyk7CiMgIC0gKG1vc3Qgb2J2aW91cyB0aGluZzopIGN1cmwgdmVyc2lvbiBudW1iZXJzLgojIEFkZCBkb2N1bWVudGF0aW9uIHN1YnByb2plY3QKIwojIFRvIGNoZWNrOgojIChGcm9tIERhbmllbCBTdGVuYmVyZykgVGhlIGNtYWtlIGJ1aWxkIHNlbGVjdGVkIHRvIHJ1biBnY2Mgd2l0aCAtZlBJQyBvbiBteSBib3ggd2hpbGUgdGhlIHBsYWluIGNvbmZpZ3VyZSBzY3JpcHQgZGlkIG5vdC4KIyAoRnJvbSBEYW5pZWwgU3RlbmJlcmcpIFRoZSBnY2MgY29tbWFuZCBsaW5lIHVzZSBuZWl0aGVyIC1nIG5vciBhbnkgLU8gb3B0aW9ucy4gQXMgYSBkZXZlbG9wZXIsIEkgYWxzbyB0cmVhc3VyZSBvdXIgY29uZmlndXJlIHNjcmlwdHMncyAtLWVuYWJsZS1kZWJ1ZyBvcHRpb24gdGhhdCBzZXRzIGEgbG9uZyByYW5nZSBvZiAicGlja3kiIGNvbXBpbGVyIG9wdGlvbnMuCmNtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjggRkFUQUxfRVJST1IpCnNldChDTUFLRV9NT0RVTEVfUEFUSCAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0NNYWtlOyR7Q01BS0VfTU9EVUxFX1BBVEh9IikKaW5jbHVkZShVdGlsaXRpZXMpCmluY2x1ZGUoTWFjcm9zKQoKcHJvamVjdCggQ1VSTCBDICkKCm1lc3NhZ2UoV0FSTklORyAidGhlIGN1cmwgY21ha2UgYnVpbGQgc3lzdGVtIGlzIHBvb3JseSBtYWludGFpbmVkLiBCZSBhd2FyZSIpCgpmaWxlIChSRUFEICR7Q1VSTF9TT1VSQ0VfRElSfS9pbmNsdWRlL2N1cmwvY3VybHZlci5oIENVUkxfVkVSU0lPTl9IX0NPTlRFTlRTKQpzdHJpbmcgKFJFR0VYIE1BVENIICIjZGVmaW5lIExJQkNVUkxfVkVSU0lPTiBcIlteXCJdKiIKICBDVVJMX1ZFUlNJT04gJHtDVVJMX1ZFUlNJT05fSF9DT05URU5UU30pCnN0cmluZyAoUkVHRVggUkVQTEFDRSAiW15cIl0rXCIiICIiIENVUkxfVkVSU0lPTiAke0NVUkxfVkVSU0lPTn0pCnN0cmluZyAoUkVHRVggTUFUQ0ggIiNkZWZpbmUgTElCQ1VSTF9WRVJTSU9OX05VTSAweFswLTlhLWZBLUZdKyIKICBDVVJMX1ZFUlNJT05fTlVNICR7Q1VSTF9WRVJTSU9OX0hfQ09OVEVOVFN9KQpzdHJpbmcgKFJFR0VYIFJFUExBQ0UgIlteMF0rMHgiICIiIENVUkxfVkVSU0lPTl9OVU0gJHtDVVJMX1ZFUlNJT05fTlVNfSkKCmluY2x1ZGVfcmVndWxhcl9leHByZXNzaW9uKCJeLiokIikgICAgIyBTdWtlbmRlcjogSXMgaXQgbmVjZXNzYXJ5PwoKIyBTZXR1cCBwYWNrYWdlIG1ldGEtZGF0YQojIFNFVChQQUNLQUdFICJjdXJsIikKbWVzc2FnZShTVEFUVVMgImN1cmwgdmVyc2lvbj1bJHtDVVJMX1ZFUlNJT059XSIpCiMgU0VUKFBBQ0tBR0VfVEFSTkFNRSAiY3VybCIpCiMgU0VUKFBBQ0tBR0VfTkFNRSAiY3VybCIpCiMgU0VUKFBBQ0tBR0VfVkVSU0lPTiAiLSIpCiMgU0VUKFBBQ0tBR0VfU1RSSU5HICJjdXJsLSIpCiMgU0VUKFBBQ0tBR0VfQlVHUkVQT1JUICJhIHN1aXRhYmxlIGN1cmwgbWFpbGluZyBsaXN0ID0+IGh0dHBzOi8vY3VybC5oYXh4LnNlL21haWwvIikKc2V0KE9QRVJBVElOR19TWVNURU0gIiR7Q01BS0VfU1lTVEVNX05BTUV9IikKc2V0KE9TICJcIiR7Q01BS0VfU1lTVEVNX05BTUV9XCIiKQoKaW5jbHVkZV9kaXJlY3Rvcmllcygke1BST0pFQ1RfQklOQVJZX0RJUn0vaW5jbHVkZS9jdXJsKQppbmNsdWRlX2RpcmVjdG9yaWVzKCAke0NVUkxfU09VUkNFX0RJUn0vaW5jbHVkZSApCgpvcHRpb24oQlVJTERfQ1VSTF9FWEUgIlNldCB0byBPTiB0byBidWlsZCBjVVJMIGV4ZWN1dGFibGUuIiBPTikKb3B0aW9uKENVUkxfU1RBVElDTElCICJTZXQgdG8gT04gdG8gYnVpbGQgbGliY3VybCB3aXRoIHN0YXRpYyBsaW5raW5nLiIgT0ZGKQpvcHRpb24oRU5BQkxFX0FSRVMgIlNldCB0byBPTiB0byBlbmFibGUgYy1hcmVzIHN1cHBvcnQiIE9GRikKb3B0aW9uKEVOQUJMRV9USFJFQURFRF9SRVNPTFZFUiAiU2V0IHRvIE9OIHRvIGVuYWJsZSBQT1NJWCB0aHJlYWRlZCBETlMgbG9va3VwIiBPRkYpCgpvcHRpb24oRU5BQkxFX0RFQlVHICJTZXQgdG8gT04gdG8gZW5hYmxlIGN1cmwgZGVidWcgZmVhdHVyZXMiIE9GRikKb3B0aW9uKEVOQUJMRV9DVVJMREVCVUcgIlNldCB0byBPTiB0byBidWlsZCB3aXRoIFRyYWNrTWVtb3J5IGZlYXR1cmUgZW5hYmxlZCIgT0ZGKQoKaWYgKEVOQUJMRV9ERUJVRykKICAjIERFQlVHQlVJTEQgd2lsbCBiZSBkZWZpbmVkIG9ubHkgZm9yIERlYnVnIGJ1aWxkcwogIGlmKE5PVCBDTUFLRV9WRVJTSU9OIFZFUlNJT05fTEVTUyAzLjApCiAgICBzZXRfcHJvcGVydHkoRElSRUNUT1JZIEFQUEVORCBQUk9QRVJUWSBDT01QSUxFX0RFRklOSVRJT05TICQ8JDxDT05GSUc6RGVidWc+OkRFQlVHQlVJTEQ+KQogIGVsc2UoKQogICAgc2V0X3Byb3BlcnR5KERJUkVDVE9SWSBBUFBFTkQgUFJPUEVSVFkgQ09NUElMRV9ERUZJTklUSU9OU19ERUJVRyBERUJVR0JVSUxEKQogIGVuZGlmKCkKICBzZXQoRU5BQkxFX0NVUkxERUJVRyBPTikKZW5kaWYoKQoKaWYgKEVOQUJMRV9DVVJMREVCVUcpCiAgc2V0X3Byb3BlcnR5KERJUkVDVE9SWSBBUFBFTkQgUFJPUEVSVFkgQ09NUElMRV9ERUZJTklUSU9OUyBDVVJMREVCVUcpCmVuZGlmKCkKCiMgaW5pdGlhbGl6ZSBDVVJMX0xJQlMKc2V0KENVUkxfTElCUyAiIikKCmlmKEVOQUJMRV9USFJFQURFRF9SRVNPTFZFUiBBTkQgRU5BQkxFX0FSRVMpCiAgbWVzc2FnZShGQVRBTF9FUlJPUiAiT3B0aW9ucyBFTkFCTEVfVEhSRUFERURfUkVTT0xWRVIgYW5kIEVOQUJMRV9BUkVTIGFyZSBtdXR1YWxseSBleGNsdXNpdmUiKQplbmRpZigpCgppZihFTkFCTEVfQVJFUykKICBzZXQoVVNFX0FSRVMgMSkKICBmaW5kX3BhY2thZ2UoQ0FSRVMgUkVRVUlSRUQpCiAgbGlzdChBUFBFTkQgQ1VSTF9MSUJTICR7Q0FSRVNfTElCUkFSWX0gKQogIHNldChDVVJMX0xJQlMgJHtDVVJMX0xJQlN9ICR7Q0FSRVNfTElCUkFSWX0pCmVuZGlmKCkKCmlmKE1TVkMpCiAgb3B0aW9uKEJVSUxEX1JFTEVBU0VfREVCVUdfRElSUyAiU2V0IE9GRiB0byBidWlsZCBlYWNoIGNvbmZpZ3VyYXRpb24gdG8gYSBzZXBhcmF0ZSBkaXJlY3RvcnkiIE9GRikKICBtYXJrX2FzX2FkdmFuY2VkKEJVSUxEX1JFTEVBU0VfREVCVUdfRElSUykKZW5kaWYoKQoKb3B0aW9uKENVUkxfSElEREVOX1NZTUJPTFMgIlNldCB0byBPTiB0byBoaWRlIGxpYmN1cmwgaW50ZXJuYWwgc3ltYm9scyAoPWhpZGUgYWxsIHN5bWJvbHMgdGhhdCBhcmVuJ3Qgb2ZmaWNpYWxseSBleHRlcm5hbCkuIiBPTikKbWFya19hc19hZHZhbmNlZChDVVJMX0hJRERFTl9TWU1CT0xTKQoKb3B0aW9uKEhUVFBfT05MWSAiZGlzYWJsZXMgYWxsIHByb3RvY29scyBleGNlcHQgSFRUUCAoVGhpcyBvdmVycmlkZXMgYWxsIENVUkxfRElTQUJMRV8qIG9wdGlvbnMpIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoSFRUUF9PTkxZKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0ZUUCAiZGlzYWJsZXMgRlRQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0ZUUCkKb3B0aW9uKENVUkxfRElTQUJMRV9MREFQICJkaXNhYmxlcyBMREFQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0xEQVApCm9wdGlvbihDVVJMX0RJU0FCTEVfVEVMTkVUICJkaXNhYmxlcyBUZWxuZXQiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfVEVMTkVUKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0RJQ1QgImRpc2FibGVzIERJQ1QiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfRElDVCkKb3B0aW9uKENVUkxfRElTQUJMRV9GSUxFICJkaXNhYmxlcyBGSUxFIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0ZJTEUpCm9wdGlvbihDVVJMX0RJU0FCTEVfVEZUUCAiZGlzYWJsZXMgVEZUUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9URlRQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0hUVFAgImRpc2FibGVzIEhUVFAiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfSFRUUCkKCm9wdGlvbihDVVJMX0RJU0FCTEVfTERBUFMgInRvIGRpc2FibGUgTERBUFMiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfTERBUFMpCgpvcHRpb24oQ1VSTF9ESVNBQkxFX1JUU1AgInRvIGRpc2FibGUgUlRTUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9SVFNQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1BST1hZICJ0byBkaXNhYmxlIHByb3h5IiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX1BST1hZKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1BPUDMgInRvIGRpc2FibGUgUE9QMyIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9QT1AzKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0lNQVAgInRvIGRpc2FibGUgSU1BUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9JTUFQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1NNVFAgInRvIGRpc2FibGUgU01UUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9TTVRQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0dPUEhFUiAidG8gZGlzYWJsZSBHb3BoZXIiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfR09QSEVSKQoKaWYoSFRUUF9PTkxZKQogIHNldChDVVJMX0RJU0FCTEVfRlRQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfTERBUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0xEQVBTIE9OKQogIHNldChDVVJMX0RJU0FCTEVfVEVMTkVUIE9OKQogIHNldChDVVJMX0RJU0FCTEVfRElDVCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0ZJTEUgT04pCiAgc2V0KENVUkxfRElTQUJMRV9URlRQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfUlRTUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX1BPUDMgT04pCiAgc2V0KENVUkxfRElTQUJMRV9JTUFQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfU01UUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0dPUEhFUiBPTikKZW5kaWYoKQoKb3B0aW9uKENVUkxfRElTQUJMRV9DT09LSUVTICJ0byBkaXNhYmxlIGNvb2tpZXMgc3VwcG9ydCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9DT09LSUVTKQoKb3B0aW9uKENVUkxfRElTQUJMRV9DUllQVE9fQVVUSCAidG8gZGlzYWJsZSBjcnlwdG9ncmFwaGljIGF1dGhlbnRpY2F0aW9uIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0NSWVBUT19BVVRIKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1ZFUkJPU0VfU1RSSU5HUyAidG8gZGlzYWJsZSB2ZXJib3NlIHN0cmluZ3MiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfVkVSQk9TRV9TVFJJTkdTKQpvcHRpb24oRElTQUJMRURfVEhSRUFEU0FGRSAiU2V0IHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aHJlYWQtc2FmZSBmdW5jdGlvbnMiIE9GRikKbWFya19hc19hZHZhbmNlZChESVNBQkxFRF9USFJFQURTQUZFKQpvcHRpb24oRU5BQkxFX0lQVjYgIkRlZmluZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgSVB2NiBzdXBwb3J0IiBPTikKbWFya19hc19hZHZhbmNlZChFTkFCTEVfSVBWNikKaWYoRU5BQkxFX0lQVjYgQU5EIE5PVCBXSU4zMikKICBpbmNsdWRlKENoZWNrU3RydWN0SGFzTWVtYmVyKQogIGNoZWNrX3N0cnVjdF9oYXNfbWVtYmVyKCJzdHJ1Y3Qgc29ja2FkZHJfaW42IiBzaW42X2FkZHIgIm5ldGluZXQvaW4uaCIKICAgICAgICAgICAgICAgICAgICAgICAgICBIQVZFX1NPQ0tBRERSX0lONl9TSU42X0FERFIpCiAgY2hlY2tfc3RydWN0X2hhc19tZW1iZXIoInN0cnVjdCBzb2NrYWRkcl9pbjYiIHNpbjZfc2NvcGVfaWQgIm5ldGluZXQvaW4uaCIKICAgICAgICAgICAgICAgICAgICAgICAgICBIQVZFX1NPQ0tBRERSX0lONl9TSU42X1NDT1BFX0lEKQogIGlmKE5PVCBIQVZFX1NPQ0tBRERSX0lONl9TSU42X0FERFIpCiAgICBtZXNzYWdlKFdBUk5JTkcgInN0cnVjdCBzb2NrYWRkcl9pbjYgbm90IGF2YWlsYWJsZSwgZGlzYWJsaW5nIElQdjYgc3VwcG9ydCIpCiAgICAjIEZvcmNlIHRoZSBmZWF0dXJlIG9mZiBhcyB0aGlzIG5hbWUgaXMgdXNlZCBhcyBndWFyZCBtYWNyby4uLgogICAgc2V0KEVOQUJMRV9JUFY2IE9GRgogICAgICAgIENBQ0hFIEJPT0wgIkRlZmluZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgSVB2NiBzdXBwb3J0IiBGT1JDRSkKICBlbmRpZigpCmVuZGlmKCkKCm9wdGlvbihFTkFCTEVfTUFOVUFMICJ0byBwcm92aWRlIHRoZSBidWlsdC1pbiBtYW51YWwiIE9OKQp1bnNldChVU0VfTUFOVUFMIENBQ0hFKSAjIFRPRE86IGNhY2hlIE5ST0ZGL05ST0ZGX01BTk9QVC9VU0VfTUFOVUFMIHZhcnM/CmlmKEVOQUJMRV9NQU5VQUwpCiAgZmluZF9wcm9ncmFtKE5ST0ZGIE5BTUVTIGducm9mZiBucm9mZikKICBpZihOUk9GRikKICAgICMgTmVlZCBhIHdheSB0byB3cml0ZSB0byBzdGRpbiwgdGhpcyB3aWxsIGRvCiAgICBmaWxlKFdSSVRFICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbnJvZmYtaW5wdXQudHh0IiAidGVzdCIpCiAgICAjIFRlc3RzIGZvciBhIHZhbGlkIG5yb2ZmIG9wdGlvbiB0byBnZW5lcmF0ZSBhIG1hbnBhZ2UKICAgIGZvcmVhY2goX01BTk9QVCAiLW1hbiIgIi1tYW5kb2MiKQogICAgICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAiJHtOUk9GRn0iICR7X01BTk9QVH0KICAgICAgICBPVVRQVVRfVkFSSUFCTEUgTlJPRkZfTUFOT1BUX09VVFBVVAogICAgICAgIElOUFVUX0ZJTEUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9ucm9mZi1pbnB1dC50eHQiCiAgICAgICAgRVJST1JfUVVJRVQpCiAgICAgICMgU2F2ZSB0aGUgb3B0aW9uIGlmIGl0IHdhcyB2YWxpZAogICAgICBpZihOUk9GRl9NQU5PUFRfT1VUUFVUKQogICAgICAgIG1lc3NhZ2UoIkZvdW5kICpucm9mZiBvcHRpb246IC0tICR7X01BTk9QVH0iKQogICAgICAgIHNldChOUk9GRl9NQU5PUFQgJHtfTUFOT1BUfSkKICAgICAgICBzZXQoVVNFX01BTlVBTCAxKQogICAgICAgIGJyZWFrKCkKICAgICAgZW5kaWYoKQogICAgZW5kZm9yZWFjaCgpCiAgICAjIE5vIG5lZWQgZm9yIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgZmlsZShSRU1PVkUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9ucm9mZi1pbnB1dC50eHQiKQogICAgaWYoTk9UIFVTRV9NQU5VQUwpCiAgICAgIG1lc3NhZ2UoV0FSTklORyAiRm91bmQgbm8gKm5yb2ZmIG9wdGlvbiB0byBnZXQgcGxhaW50ZXh0IGZyb20gbWFuIHBhZ2VzIikKICAgIGVuZGlmKCkKICBlbHNlKCkKICAgIG1lc3NhZ2UoV0FSTklORyAiRm91bmQgbm8gKm5yb2ZmIHByb2dyYW0iKQogIGVuZGlmKCkKZW5kaWYoKQoKIyBXZSBuZWVkIGFuc2kgYy1mbGFncywgZXNwZWNpYWxseSBvbiBIUApzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9BTlNJX0NGTEFHU30gJHtDTUFLRV9DX0ZMQUdTfSIpCnNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAke0NNQUtFX0FOU0lfQ0ZMQUdTfSkKCiMgRGlzYWJsZSB3YXJuaW5ncyBvbiBCb3JsYW5kIHRvIGF2b2lkIGNoYW5naW5nIDNyZCBwYXJ0eSBjb2RlLgppZihCT1JMQU5EKQogIHNldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9IC13LSIpCmVuZGlmKEJPUkxBTkQpCgojIElmIHdlIGFyZSBvbiBBSVgsIGRvIHRoZSBfQUxMX1NPVVJDRSBtYWdpYwppZigke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTIEFJWCkKICBzZXQoX0FMTF9TT1VSQ0UgMSkKZW5kaWYoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyBBSVgpCgojIEluY2x1ZGUgYWxsIHRoZSBuZWNlc3NhcnkgZmlsZXMgZm9yIG1hY3JvcwppbmNsdWRlIChDaGVja0Z1bmN0aW9uRXhpc3RzKQppbmNsdWRlIChDaGVja0luY2x1ZGVGaWxlKQppbmNsdWRlIChDaGVja0luY2x1ZGVGaWxlcykKaW5jbHVkZSAoQ2hlY2tMaWJyYXJ5RXhpc3RzKQppbmNsdWRlIChDaGVja1N5bWJvbEV4aXN0cykKaW5jbHVkZSAoQ2hlY2tUeXBlU2l6ZSkKaW5jbHVkZSAoQ2hlY2tDU291cmNlQ29tcGlsZXMpCmluY2x1ZGUgKENNYWtlRGVwZW5kZW50T3B0aW9uKQoKIyBPbiB3aW5kb3dzIHByZWxvYWQgc2V0dGluZ3MKaWYoV0lOMzIpCiAgc2V0KENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TICIke0NNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TfSAtRF9XSU5TT0NLQVBJXyIpCiAgaW5jbHVkZSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vQ01ha2UvUGxhdGZvcm1zL1dpbmRvd3NDYWNoZS5jbWFrZSkKZW5kaWYoV0lOMzIpCgppZihFTkFCTEVfVEhSRUFERURfUkVTT0xWRVIpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicHRocmVhZC5oIiBIQVZFX1BUSFJFQURfSCkKICBpZihIQVZFX1BUSFJFQURfSCkKICAgIHNldChDTUFLRV9USFJFQURfUFJFRkVSX1BUSFJFQUQgMSkKICAgIGZpbmRfcGFja2FnZShUaHJlYWRzKQogICAgaWYoQ01BS0VfVVNFX1BUSFJFQURTX0lOSVQpCiAgICAgIHNldChDVVJMX0xJQlMgJHtDVVJMX0xJQlN9ICR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0pCiAgICAgIHNldChVU0VfVEhSRUFEU19QT1NJWCAxKQogICAgZW5kaWYoKQogIGVuZGlmKCkKZW5kaWYoKQoKIyBDaGVjayBmb3IgYWxsIG5lZWRlZCBsaWJyYXJpZXMKY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJkbCIgICAgIGRsb3BlbiAgICAgICBIQVZFX0xJQkRMKQpjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoInNvY2tldCIgY29ubmVjdCAgICAgIEhBVkVfTElCU09DS0VUKQpjaGVja19saWJyYXJ5X2V4aXN0cygiYyIgZ2V0aG9zdGJ5bmFtZSAiIiBOT1RfTkVFRF9MSUJOU0wpCgojIFllbGxvd3RhYiBaZXRhIG5lZWRzIGRpZmZlcmVudCBsaWJyYXJpZXMgdGhhbiBCZU9TIDUuCmlmKEJFT1MpCiAgc2V0KE5PVF9ORUVEX0xJQk5TTCAxKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiYmluZCIgZ2V0aG9zdGJ5bmFtZSBIQVZFX0xJQkJJTkQpCiAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJibmV0YXBpIiBjbG9zZXNvY2tldCBIQVZFX0xJQkJORVRBUEkpCmVuZGlmKEJFT1MpCgppZihOT1QgTk9UX05FRURfTElCTlNMKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgibnNsIiAgICBnZXRob3N0YnluYW1lICBIQVZFX0xJQk5TTCkKZW5kaWYoTk9UIE5PVF9ORUVEX0xJQk5TTCkKCmNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhnZXRob3N0bmFtZSBIQVZFX0dFVEhPU1ROQU1FKQoKc2V0KE9QRU5TU0xfREVGQVVMVCBPTikKaWYoV0lOMzIpCiAgc2V0KE9QRU5TU0xfREVGQVVMVCBPRkYpCiAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJ3czJfMzIiIGdldGNoICAgICAgICBIQVZFX0xJQldTMl8zMikKICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoIndpbm1tIiAgZ2V0Y2ggICAgICAgIEhBVkVfTElCV0lOTU0pCmVuZGlmKCkKCm9wdGlvbihDTUFLRV9VU0VfT1BFTlNTTCAiVXNlIE9wZW5TU0wgY29kZS4gRXhwZXJpbWVudGFsIiAke09QRU5TU0xfREVGQVVMVH0pCm1hcmtfYXNfYWR2YW5jZWQoQ01BS0VfVVNFX09QRU5TU0wpCgppZihXSU4zMikKICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKENVUkxfV0lORE9XU19TU1BJICJVc2Ugd2luZG93cyBsaWJyYXJpZXMgdG8gYWxsb3cgTlRMTSBhdXRoZW50aWNhdGlvbiB3aXRob3V0IG9wZW5zc2wiIE9OCiAgICAiTk9UIENNQUtFX1VTRV9PUEVOU1NMIiBPRkYpCiAgbWFya19hc19hZHZhbmNlZChDVVJMX1dJTkRPV1NfU1NQSSkKZW5kaWYoKQoKc2V0KFVTRV9PUEVOU1NMIE9GRikKc2V0KEhBVkVfTElCQ1JZUFRPIE9GRikKc2V0KEhBVkVfTElCU1NMIE9GRikKCmlmKENNQUtFX1VTRV9PUEVOU1NMKQogIGZpbmRfcGFja2FnZShPcGVuU1NMKQogIGlmKE9QRU5TU0xfRk9VTkQpCiAgICBsaXN0KEFQUEVORCBDVVJMX0xJQlMgJHtPUEVOU1NMX0xJQlJBUklFU30pCiAgICBzZXQoVVNFX09QRU5TU0wgT04pCiAgICBzZXQoSEFWRV9MSUJDUllQVE8gT04pCiAgICBzZXQoSEFWRV9MSUJTU0wgT04pCiAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7T1BFTlNTTF9JTkNMVURFX0RJUn0pCiAgICBzZXQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtPUEVOU1NMX0lOQ0xVREVfRElSfSkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC9jcnlwdG8uaCIgSEFWRV9PUEVOU1NMX0NSWVBUT19IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlKCJvcGVuc3NsL2VuZ2luZS5oIiBIQVZFX09QRU5TU0xfRU5HSU5FX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wvZXJyLmgiICAgIEhBVkVfT1BFTlNTTF9FUlJfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC9wZW0uaCIgICAgSEFWRV9PUEVOU1NMX1BFTV9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlKCJvcGVuc3NsL3BrY3MxMi5oIiBIQVZFX09QRU5TU0xfUEtDUzEyX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wvcnNhLmgiICAgIEhBVkVfT1BFTlNTTF9SU0FfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC9zc2wuaCIgICAgSEFWRV9PUEVOU1NMX1NTTF9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlKCJvcGVuc3NsL3g1MDkuaCIgICBIQVZFX09QRU5TU0xfWDUwOV9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlKCJvcGVuc3NsL3JhbmQuaCIgICBIQVZFX09QRU5TU0xfUkFORF9IKQogIGVsc2VpZihXSU4zMikKICAgIHNldChDVVJMX1dJTkRPV1NfU1NQSSBPTikKICBlbmRpZigpCmVuZGlmKCkKCmlmKE5PVCBDVVJMX0RJU0FCTEVfTERBUCkKICBpZihXSU4zMikKICAgIG9wdGlvbihVU0VfV0lOMzJfTERBUCAiVXNlIFdpbmRvd3MgTERBUCBpbXBsZW1lbnRhdGlvbiIgT04pCiAgICBpZihVU0VfV0lOMzJfTERBUCkKICAgICAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJ3bGRhcDMyIiBjbGRhcF9vcGVuIEhBVkVfV0xEQVAzMikKICAgICAgaWYoTk9UIEhBVkVfV0xEQVAzMikKICAgICAgICBzZXQoVVNFX1dJTjMyX0xEQVAgT0ZGKQogICAgICBlbmRpZigpCiAgICBlbmRpZigpCiAgZW5kaWYoKQoKICBvcHRpb24oQ01BS0VfVVNFX09QRU5MREFQICJVc2UgT3BlbkxEQVAgY29kZS4iIE9GRikKICBtYXJrX2FzX2FkdmFuY2VkKENNQUtFX1VTRV9PUEVOTERBUCkKICBzZXQoQ01BS0VfTERBUF9MSUIgImxkYXAiIENBQ0hFIFNUUklORyAiTmFtZSBvciBmdWxsIHBhdGggdG8gbGRhcCBsaWJyYXJ5IikKICBzZXQoQ01BS0VfTEJFUl9MSUIgImxiZXIiIENBQ0hFIFNUUklORyAiTmFtZSBvciBmdWxsIHBhdGggdG8gbGJlciBsaWJyYXJ5IikKCiAgaWYoQ01BS0VfVVNFX09QRU5MREFQIEFORCBVU0VfV0lOMzJfTERBUCkKICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkNhbm5vdCB1c2UgVVNFX1dJTjMyX0xEQVAgYW5kIENNQUtFX1VTRV9PUEVOTERBUCBhdCB0aGUgc2FtZSB0aW1lIikKICBlbmRpZigpCgogICMgTm93IHRoYXQgd2Uga25vdywgd2UncmUgbm90IHVzaW5nIHdpbmRvd3MgTERBUC4uLgogIGlmKFVTRV9XSU4zMl9MREFQKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgid2lubGRhcC5oIiBIQVZFX1dJTkxEQVBfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbmJlci5oIiAgSEFWRV9XSU5CRVJfSCkKICBlbHNlKCkKICAgICMgQ2hlY2sgZm9yIExEQVAKICAgIHNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgJHtPUEVOU1NMX0xJQlJBUklFU30pCiAgICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoJHtDTUFLRV9MREFQX0xJQn0gbGRhcF9pbml0IEhBVkVfTElCTERBUCkKICAgIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgke0NNQUtFX0xCRVJfTElCfSBiZXJfaW5pdCBIQVZFX0xJQkxCRVIpCgogICAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTX0JBSyAke0NNQUtFX1JFUVVJUkVEX0lOQ0xVREVTfSkKICAgIHNldChDTUFLRV9MREFQX0lOQ0xVREVfRElSICIiIENBQ0hFIFNUUklORyAiUGF0aCB0byBMREFQIGluY2x1ZGUgZGlyZWN0b3J5IikKICAgIGlmKENNQUtFX0xEQVBfSU5DTFVERV9ESVIpCiAgICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7Q01BS0VfTERBUF9JTkNMVURFX0RJUn0pCiAgICBlbmRpZigpCiAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsZGFwLmgiICAgICAgICAgICBIQVZFX0xEQVBfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImxiZXIuaCIgICAgICAgICAgIEhBVkVfTEJFUl9IKQoKICAgIGlmKE5PVCBIQVZFX0xEQVBfSCkKICAgICAgbWVzc2FnZShTVEFUVVMgIkxEQVBfSCBub3QgZm91bmQgQ1VSTF9ESVNBQkxFX0xEQVAgc2V0IE9OIikKICAgICAgc2V0KENVUkxfRElTQUJMRV9MREFQIE9OIENBQ0hFIEJPT0wgIiIgRk9SQ0UpCiAgICAgIHNldChDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke0NNQUtFX1JFUVVJUkVEX0lOQ0xVREVTX0JBS30pICNMREFQIGluY2x1ZGVzIHdvbid0IGJlIHVzZWQKICAgIGVsc2VpZihOT1QgSEFWRV9MSUJMREFQKQogICAgICBtZXNzYWdlKFNUQVRVUyAiTERBUCBsaWJyYXJ5ICcke0NNQUtFX0xEQVBfTElCfScgbm90IGZvdW5kIENVUkxfRElTQUJMRV9MREFQIHNldCBPTiIpCiAgICAgIHNldChDVVJMX0RJU0FCTEVfTERBUCBPTiBDQUNIRSBCT09MICIiIEZPUkNFKQogICAgICBzZXQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtDTUFLRV9SRVFVSVJFRF9JTkNMVURFU19CQUt9KSAjTERBUCBpbmNsdWRlcyB3b24ndCBiZSB1c2VkCiAgICBlbHNlKCkKICAgICAgaWYoQ01BS0VfVVNFX09QRU5MREFQKQogICAgICAgIHNldChVU0VfT1BFTkxEQVAgT04pCiAgICAgIGVuZGlmKCkKICAgICAgaWYoQ01BS0VfTERBUF9JTkNMVURFX0RJUikKICAgICAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfTERBUF9JTkNMVURFX0RJUn0pCiAgICAgIGVuZGlmKCkKICAgICAgc2V0KE5FRURfTEJFUl9IIE9OKQogICAgICBzZXQoX0hFQURFUl9MSVNUKQogICAgICBpZihIQVZFX1dJTkRPV1NfSCkKICAgICAgICBsaXN0KEFQUEVORCBfSEVBREVSX0xJU1QgIndpbmRvd3MuaCIpCiAgICAgIGVuZGlmKCkKICAgICAgaWYoSEFWRV9TWVNfVFlQRVNfSCkKICAgICAgICBsaXN0KEFQUEVORCBfSEVBREVSX0xJU1QgInN5cy90eXBlcy5oIikKICAgICAgZW5kaWYoKQogICAgICBsaXN0KEFQUEVORCBfSEVBREVSX0xJU1QgImxkYXAuaCIpCgogICAgICBzZXQoX1NSQ19TVFJJTkcgIiIpCiAgICAgIGZvcmVhY2goX0hFQURFUiAke19IRUFERVJfTElTVH0pCiAgICAgICAgc2V0KF9JTkNMVURFX1NUUklORyAiJHtfSU5DTFVERV9TVFJJTkd9I2luY2x1ZGUgPCR7X0hFQURFUn0+XG4iKQogICAgICBlbmRmb3JlYWNoKCkKCiAgICAgIHNldChfU1JDX1NUUklORwogICAgICAgICIKICAgICAgICAke19JTkNMVURFX1NUUklOR30KICAgICAgICBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KQogICAgICAgIHsKICAgICAgICAgIEJlclZhbHVlICpidnAgPSBOVUxMOwogICAgICAgICAgQmVyRWxlbWVudCAqYmVwID0gYmVyX2luaXQoYnZwKTsKICAgICAgICAgIGJlcl9mcmVlKGJlcCwgMSk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9IgogICAgICApCiAgICAgIHNldChDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OUyAiJHtDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OU30gLURMREFQX0RFUFJFQ0FURUQ9MSIpCiAgICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAke0NNQUtFX0xEQVBfTElCfSkKICAgICAgaWYoSEFWRV9MSUJMQkVSKQogICAgICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAke0NNQUtFX0xCRVJfTElCfSkKICAgICAgZW5kaWYoKQogICAgICBjaGVja19jX3NvdXJjZV9jb21waWxlcygiJHtfU1JDX1NUUklOR30iIE5PVF9ORUVEX0xCRVJfSCkKCiAgICAgIGlmKE5PVF9ORUVEX0xCRVJfSCkKICAgICAgICBzZXQoTkVFRF9MQkVSX0ggT0ZGKQogICAgICBlbHNlKCkKICAgICAgICBzZXQoQ1VSTF9URVNUX0RFRklORVMgIiR7Q1VSTF9URVNUX0RFRklORVN9IC1ETkVFRF9MQkVSX0giKQogICAgICBlbmRpZigpCiAgICBlbmRpZigpCiAgZW5kaWYoKQoKZW5kaWYoKQoKIyBObyBsZGFwLCBubyBsZGFwcy4KaWYoQ1VSTF9ESVNBQkxFX0xEQVApCiAgaWYoTk9UIENVUkxfRElTQUJMRV9MREFQUykKICAgIG1lc3NhZ2UoU1RBVFVTICJMREFQIG5lZWRzIHRvIGJlIGVuYWJsZWQgdG8gc3VwcG9ydCBMREFQUyIpCiAgICBzZXQoQ1VSTF9ESVNBQkxFX0xEQVBTIE9OIENBQ0hFIEJPT0wgIiIgRk9SQ0UpCiAgZW5kaWYoKQplbmRpZigpCgppZihOT1QgQ1VSTF9ESVNBQkxFX0xEQVBTKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImxkYXBfc3NsLmgiIEhBVkVfTERBUF9TU0xfSCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsZGFwc3NsLmgiICBIQVZFX0xEQVBTU0xfSCkKZW5kaWYoKQoKIyBDaGVjayBmb3IgaWRuCmNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiaWRuIiBpZG5hX3RvX2FzY2lpX2x6IEhBVkVfTElCSUROKQoKIyBDaGVjayBmb3Igc3ltYm9sIGRsb3BlbiAoc2FtZSBhcyBIQVZFX0xJQkRMKQpjaGVja19saWJyYXJ5X2V4aXN0cygiJHtDVVJMX0xJQlN9IiBkbG9wZW4gIiIgSEFWRV9ETE9QRU4pCgpvcHRpb24oQ1VSTF9aTElCICJTZXQgdG8gT04gdG8gZW5hYmxlIGJ1aWxkaW5nIGNVUkwgd2l0aCB6bGliIHN1cHBvcnQuIiBPTikKc2V0KEhBVkVfTElCWiBPRkYpCnNldChIQVZFX1pMSUJfSCBPRkYpCnNldChIQVZFX1pMSUIgT0ZGKQppZihDVVJMX1pMSUIpCiAgZmluZF9wYWNrYWdlKFpMSUIgUVVJRVQpCiAgaWYoWkxJQl9GT1VORCkKICAgIHNldChIQVZFX1pMSUJfSCBPTikKICAgIHNldChIQVZFX1pMSUIgT04pCiAgICBzZXQoSEFWRV9MSUJaIE9OKQogICAgbGlzdChBUFBFTkQgQ1VSTF9MSUJTICR7WkxJQl9MSUJSQVJJRVN9KQogICAgaW5jbHVkZV9kaXJlY3Rvcmllcygke1pMSUJfSU5DTFVERV9ESVJTfSkKICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7WkxJQl9JTkNMVURFX0RJUlN9KQogIGVuZGlmKCkKZW5kaWYoKQoKI2xpYlNTSDIKb3B0aW9uKENNQUtFX1VTRV9MSUJTU0gyICJVc2UgbGliU1NIMiIgT04pCm1hcmtfYXNfYWR2YW5jZWQoQ01BS0VfVVNFX0xJQlNTSDIpCnNldChVU0VfTElCU1NIMiBPRkYpCnNldChIQVZFX0xJQlNTSDIgT0ZGKQpzZXQoSEFWRV9MSUJTU0gyX0ggT0ZGKQoKaWYoQ01BS0VfVVNFX0xJQlNTSDIpCiAgZmluZF9wYWNrYWdlKExpYlNTSDIpCiAgaWYoTElCU1NIMl9GT1VORCkKICAgIGxpc3QoQVBQRU5EIENVUkxfTElCUyAke0xJQlNTSDJfTElCUkFSWX0pCiAgICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICR7TElCU1NIMl9MSUJSQVJZfSkKICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICIke0xJQlNTSDJfSU5DTFVERV9ESVJ9IikKICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoIiR7TElCU1NIMl9JTkNMVURFX0RJUn0iKQogICAgc2V0KEhBVkVfTElCU1NIMiBPTikKICAgIHNldChVU0VfTElCU1NIMiBPTikKCiAgICAjIGZpbmRfcGFja2FnZSBoYXMgYWxyZWFkeSBmb3VuZCB0aGUgaGVhZGVycwogICAgc2V0KEhBVkVfTElCU1NIMl9IIE9OKQogICAgc2V0KENVUkxfSU5DTFVERVMgJHtDVVJMX0lOQ0xVREVTfSAiJHtMSUJTU0gyX0lOQ0xVREVfRElSfS9saWJzc2gyLmgiKQogICAgc2V0KENVUkxfVEVTVF9ERUZJTkVTICIke0NVUkxfVEVTVF9ERUZJTkVTfSAtREhBVkVfTElCU1NIMl9IIikKCiAgICAjIG5vdyBjaGVjayBmb3Igc3BlY2lmaWMgbGlic3NoMiBzeW1ib2xzIGFzIHRoZXkgd2VyZSBhZGRlZCBpbiBkaWZmZXJlbnQgdmVyc2lvbnMKICAgIHNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTICJsaWJzc2gyLmgiKQogICAgY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGxpYnNzaDJfdmVyc2lvbiAgICAgICAgICAgSEFWRV9MSUJTU0gyX1ZFUlNJT04pCiAgICBjaGVja19mdW5jdGlvbl9leGlzdHMobGlic3NoMl9pbml0ICAgICAgICAgICAgICBIQVZFX0xJQlNTSDJfSU5JVCkKICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhsaWJzc2gyX2V4aXQgICAgICAgICAgICAgIEhBVkVfTElCU1NIMl9FWElUKQogICAgY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGxpYnNzaDJfc2NwX3NlbmQ2NCAgICAgICAgSEFWRV9MSUJTU0gyX1NDUF9TRU5ENjQpCiAgICBjaGVja19mdW5jdGlvbl9leGlzdHMobGlic3NoMl9zZXNzaW9uX2hhbmRzaGFrZSBIQVZFX0xJQlNTSDJfU0VTU0lPTl9IQU5EU0hBS0UpCiAgICBzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUyAiIikKCiAgZW5kaWYoTElCU1NIMl9GT1VORCkKZW5kaWYoQ01BS0VfVVNFX0xJQlNTSDIpCgpvcHRpb24oQ01BS0VfVVNFX0dTU0FQSSAiVXNlIEdTU0FQSSBpbXBsZW1lbnRhdGlvbiAocmlnaHQgbm93IG9ubHkgSGVpbWRhbCBpcyBzdXBwb3J0ZWQgd2l0aCBDTWFrZSBidWlsZCkiIE9GRikKbWFya19hc19hZHZhbmNlZChDTUFLRV9VU0VfR1NTQVBJKQoKaWYoQ01BS0VfVVNFX0dTU0FQSSkKICBmaW5kX3BhY2thZ2UoR1NTKQoKICBzZXQoSEFWRV9HU1NBUEkgJHtHU1NfRk9VTkR9KQogIGlmKEdTU19GT1VORCkKCiAgICBtZXNzYWdlKFNUQVRVUyAiRm91bmQgJHtHU1NfRkxBVk9VUn0gR1NTQVBJIHZlcnNpb246IFwiJHtHU1NfVkVSU0lPTn1cIiIpCgogICAgbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtHU1NfSU5DTFVERV9ESVJFQ1RPUklFU30pCiAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJnc3NhcGkvZ3NzYXBpLmgiICBIQVZFX0dTU0FQSV9HU1NBUElfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImdzc2FwaS9nc3NhcGlfZ2VuZXJpYy5oIiBIQVZFX0dTU0FQSV9HU1NBUElfR0VORVJJQ19IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZ3NzYXBpL2dzc2FwaV9rcmI1LmgiIEhBVkVfR1NTQVBJX0dTU0FQSV9LUkI1X0gpCgogICAgaWYoR1NTX0ZMQVZPVVIgU1RSRVFVQUwgIkhlaW1kYWwiKQogICAgICBzZXQoSEFWRV9HU1NIRUlNREFMIE9OKQogICAgZWxzZSgpICMgTUlUCiAgICAgIHNldChIQVZFX0dTU01JVCBPTikKICAgICAgc2V0KF9JTkNMVURFX0xJU1QgIiIpCiAgICAgIGlmKEhBVkVfR1NTQVBJX0dTU0FQSV9IKQogICAgICAgIGxpc3QoQVBQRU5EIF9JTkNMVURFX0xJU1QgImdzc2FwaS9nc3NhcGkuaCIpCiAgICAgIGVuZGlmKCkKICAgICAgaWYoSEFWRV9HU1NBUElfR1NTQVBJX0dFTkVSSUNfSCkKICAgICAgICBsaXN0KEFQUEVORCBfSU5DTFVERV9MSVNUICJnc3NhcGkvZ3NzYXBpX2dlbmVyaWMuaCIpCiAgICAgIGVuZGlmKCkKICAgICAgaWYoSEFWRV9HU1NBUElfR1NTQVBJX0tSQjVfSCkKICAgICAgICBsaXN0KEFQUEVORCBfSU5DTFVERV9MSVNUICJnc3NhcGkvZ3NzYXBpX2tyYjUuaCIpCiAgICAgIGVuZGlmKCkKCiAgICAgIHN0cmluZyhSRVBMQUNFICI7IiAiICIgX0NPTVBJTEVSX0ZMQUdTX1NUUiAiJHtHU1NfQ09NUElMRVJfRkxBR1N9IikKICAgICAgc3RyaW5nKFJFUExBQ0UgIjsiICIgIiBfTElOS0VSX0ZMQUdTX1NUUiAiJHtHU1NfTElOS0VSX0ZMQUdTfSIpCgogICAgICBmb3JlYWNoKF9kaXIgJHtHU1NfTElOS19ESVJFQ1RPUklFU30pCiAgICAgICAgc2V0KF9MSU5LRVJfRkxBR1NfU1RSICIke19MSU5LRVJfRkxBR1NfU1RSfSAtTFwiJHtfZGlyfVwiIikKICAgICAgZW5kZm9yZWFjaCgpCgogICAgICBzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgIiR7X0NPTVBJTEVSX0ZMQUdTX1NUUn0gJHtfTElOS0VSX0ZMQUdTX1NUUn0iKQogICAgICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICR7R1NTX0xJQlJBUklFU30pCiAgICAgIGNoZWNrX3N5bWJvbF9leGlzdHMoIkdTU19DX05UX0hPU1RCQVNFRF9TRVJWSUNFIiAke19JTkNMVURFX0xJU1R9IEhBVkVfR1NTX0NfTlRfSE9TVEJBU0VEX1NFUlZJQ0UpCiAgICAgIGlmKE5PVCBIQVZFX0dTU19DX05UX0hPU1RCQVNFRF9TRVJWSUNFKQogICAgICAgIHNldChIQVZFX09MRF9HU1NNSVQgT04pCiAgICAgIGVuZGlmKCkKCiAgICBlbmRpZigpCgogICAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0dTU19JTkNMVURFX0RJUkVDVE9SSUVTfSkKICAgIGxpbmtfZGlyZWN0b3JpZXMoJHtHU1NfTElOS19ESVJFQ1RPUklFU30pCiAgICBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAke0dTU19DT01QSUxFUl9GTEFHU30iKQogICAgc2V0KENNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1MgIiR7Q01BS0VfU0hBUkVEX0xJTktFUl9GTEFHU30gJHtHU1NfTElOS0VSX0ZMQUdTfSIpCiAgICBzZXQoQ01BS0VfRVhFX0xJTktFUl9GTEFHUyAiJHtDTUFLRV9FWEVfTElOS0VSX0ZMQUdTfSAke0dTU19MSU5LRVJfRkxBR1N9IikKICAgIGxpc3QoQVBQRU5EIENVUkxfTElCUyAke0dTU19MSUJSQVJJRVN9KQoKICBlbHNlKCkKICAgIG1lc3NhZ2UoV0FSTklORyAiR1NTQVBJIHN1cHBvcnQgaGFzIGJlZW4gcmVxdWVzdGVkIGJ1dCBubyBzdXBwb3J0aW5nIGxpYnJhcmllcyBmb3VuZC4gU2tpcHBpbmcuIikKICBlbmRpZigpCmVuZGlmKCkKCm9wdGlvbihFTkFCTEVfVU5JWF9TT0NLRVRTICJEZWZpbmUgaWYgeW91IHdhbnQgVW5peCBkb21haW4gc29ja2V0cyBzdXBwb3J0IiBPTikKaWYoRU5BQkxFX1VOSVhfU09DS0VUUykKICBpbmNsdWRlKENoZWNrU3RydWN0SGFzTWVtYmVyKQogIGNoZWNrX3N0cnVjdF9oYXNfbWVtYmVyKCJzdHJ1Y3Qgc29ja2FkZHJfdW4iIHN1bl9wYXRoICJzeXMvdW4uaCIgVVNFX1VOSVhfU09DS0VUUykKZWxzZSgpCiAgdW5zZXQoVVNFX1VOSVhfU09DS0VUUyBDQUNIRSkKZW5kaWYoKQoKCiMgQ2hlY2sgZm9yIGhlYWRlciBmaWxlcwppZihOT1QgVU5JWCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ3aW5kb3dzLmgiICAgICAgSEFWRV9XSU5ET1dTX0gpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgid2luc29jay5oIiAgICAgIEhBVkVfV0lOU09DS19IKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndzMnRjcGlwLmgiICAgICBIQVZFX1dTMlRDUElQX0gpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgid2luc29jazIuaCIgICAgIEhBVkVfV0lOU09DSzJfSCkKICBpZihDVVJMX1dJTkRPV1NfU1NQSSkKICAgIHNldChDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OUyAiJHtDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OU30gLURTRUNVUklUWV9XSU4zMiIpCiAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzc3BpLmgiICAgICAgIEhBVkVfU1NQSV9IKQogICAgaWYoSEFWRV9TU1BJX0gpCiAgICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNjaGFubmVsLmgiIEhBVkVfU0NIQU5ORUxfSCkKICAgICAgc2V0KFVTRV9XSU5ET1dTX1NTUEkgT04pCiAgICAgIGlmKEhBVkVfU0NIQU5ORUxfSCkKICAgICAgICBzZXQoVVNFX1NDSEFOTkVMIE9OKQogICAgICAgIHNldChTU0xfRU5BQkxFRCBPTikKICAgICAgICBzZXQoQ1VSTF9MSUJTICR7Q1VSTF9MSUJTfSAiY3J5cHQzMiIpCiAgICAgIGVuZGlmKCkKICAgIGVuZGlmKCkKICBlbmRpZigpCmVuZGlmKE5PVCBVTklYKQoKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkaW8uaCIgICAgICAgICAgSEFWRV9TVERJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJpbnR0eXBlcy5oIiAgICAgICBIQVZFX0lOVFRZUEVTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9maWxpby5oIiAgICAgIEhBVkVfU1lTX0ZJTElPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9pb2N0bC5oIiAgICAgIEhBVkVfU1lTX0lPQ1RMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9wYXJhbS5oIiAgICAgIEhBVkVfU1lTX1BBUkFNX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9wb2xsLmgiICAgICAgIEhBVkVfU1lTX1BPTExfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3Jlc291cmNlLmgiICAgSEFWRV9TWVNfUkVTT1VSQ0VfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3NlbGVjdC5oIiAgICAgSEFWRV9TWVNfU0VMRUNUX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9zb2NrZXQuaCIgICAgIEhBVkVfU1lTX1NPQ0tFVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvc29ja2lvLmgiICAgICBIQVZFX1NZU19TT0NLSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3N0YXQuaCIgICAgICAgSEFWRV9TWVNfU1RBVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdGltZS5oIiAgICAgICBIQVZFX1NZU19USU1FX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy90eXBlcy5oIiAgICAgIEhBVkVfU1lTX1RZUEVTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy91aW8uaCIgICAgICAgIEhBVkVfU1lTX1VJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdW4uaCIgICAgICAgICBIQVZFX1NZU19VTl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdXRpbWUuaCIgICAgICBIQVZFX1NZU19VVElNRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhbGxvY2EuaCIgICAgICAgICBIQVZFX0FMTE9DQV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhcnBhL2luZXQuaCIgICAgICBIQVZFX0FSUEFfSU5FVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhcnBhL3RmdHAuaCIgICAgICBIQVZFX0FSUEFfVEZUUF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhc3NlcnQuaCIgICAgICAgICBIQVZFX0FTU0VSVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJjcnlwdG8uaCIgICAgICAgICBIQVZFX0NSWVBUT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJkZXMuaCIgICAgICAgICAgICBIQVZFX0RFU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJlcnIuaCIgICAgICAgICAgICBIQVZFX0VSUl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJlcnJuby5oIiAgICAgICAgICBIQVZFX0VSUk5PX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImZjbnRsLmgiICAgICAgICAgIEhBVkVfRkNOVExfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaWRuLWZyZWUuaCIgICAgICAgSEFWRV9JRE5fRlJFRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJpZmFkZHJzLmgiICAgICAgICBIQVZFX0lGQUREUlNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaW8uaCIgICAgICAgICAgICAgSEFWRV9JT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJrcmIuaCIgICAgICAgICAgICBIQVZFX0tSQl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsaWJnZW4uaCIgICAgICAgICBIQVZFX0xJQkdFTl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsaW1pdHMuaCIgICAgICAgICBIQVZFX0xJTUlUU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsb2NhbGUuaCIgICAgICAgICBIQVZFX0xPQ0FMRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJuZXQvaWYuaCIgICAgICAgICBIQVZFX05FVF9JRl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJuZXRkYi5oIiAgICAgICAgICBIQVZFX05FVERCX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm5ldGluZXQvaW4uaCIgICAgIEhBVkVfTkVUSU5FVF9JTl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJuZXRpbmV0L3RjcC5oIiAgICBIQVZFX05FVElORVRfVENQX0gpCgpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJwZW0uaCIgICAgICAgICAgICBIQVZFX1BFTV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJwb2xsLmgiICAgICAgICAgICBIQVZFX1BPTExfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicHdkLmgiICAgICAgICAgICAgSEFWRV9QV0RfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicnNhLmgiICAgICAgICAgICAgSEFWRV9SU0FfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic2V0am1wLmgiICAgICAgICAgSEFWRV9TRVRKTVBfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic2d0dHkuaCIgICAgICAgICAgSEFWRV9TR1RUWV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzaWduYWwuaCIgICAgICAgICBIQVZFX1NJR05BTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzc2wuaCIgICAgICAgICAgICBIQVZFX1NTTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRib29sLmgiICAgICAgICBIQVZFX1NUREJPT0xfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkaW50LmgiICAgICAgICAgSEFWRV9TVERJTlRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkaW8uaCIgICAgICAgICAgSEFWRV9TVERJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRsaWIuaCIgICAgICAgICBIQVZFX1NURExJQl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdHJpbmcuaCIgICAgICAgICBIQVZFX1NUUklOR19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdHJpbmdzLmgiICAgICAgICBIQVZFX1NUUklOR1NfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3Ryb3B0cy5oIiAgICAgICAgSEFWRV9TVFJPUFRTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInRlcm1pby5oIiAgICAgICAgIEhBVkVfVEVSTUlPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInRlcm1pb3MuaCIgICAgICAgIEhBVkVfVEVSTUlPU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ0aW1lLmgiICAgICAgICAgICBIQVZFX1RJTUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidGxkLmgiICAgICAgICAgICAgSEFWRV9UTERfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidW5pc3RkLmgiICAgICAgICAgSEFWRV9VTklTVERfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidXRpbWUuaCIgICAgICAgICAgSEFWRV9VVElNRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ4NTA5LmgiICAgICAgICAgICBIQVZFX1g1MDlfSCkKCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInByb2Nlc3MuaCIgICAgICAgIEhBVkVfUFJPQ0VTU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRkZWYuaCIgICAgICAgICBIQVZFX1NURERFRl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJkbGZjbi5oIiAgICAgICAgICBIQVZFX0RMRkNOX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm1hbGxvYy5oIiAgICAgICAgIEhBVkVfTUFMTE9DX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm1lbW9yeS5oIiAgICAgICAgIEhBVkVfTUVNT1JZX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm5ldGluZXQvaWZfZXRoZXIuaCIgSEFWRV9ORVRJTkVUX0lGX0VUSEVSX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGludC5oIiAgICAgICAgSEFWRV9TVERJTlRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic29ja2lvLmgiICAgICAgICBIQVZFX1NPQ0tJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdXRzbmFtZS5oIiAgIEhBVkVfU1lTX1VUU05BTUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaWRuYS5oIiAgICAgICAgICBIQVZFX0lETkFfSCkKCgoKY2hlY2tfdHlwZV9zaXplKHNpemVfdCAgU0laRU9GX1NJWkVfVCkKY2hlY2tfdHlwZV9zaXplKHNzaXplX3QgIFNJWkVPRl9TU0laRV9UKQpjaGVja190eXBlX3NpemUoImxvbmcgbG9uZyIgIFNJWkVPRl9MT05HX0xPTkcpCmNoZWNrX3R5cGVfc2l6ZSgibG9uZyIgIFNJWkVPRl9MT05HKQpjaGVja190eXBlX3NpemUoInNob3J0IiAgU0laRU9GX1NIT1JUKQpjaGVja190eXBlX3NpemUoImludCIgIFNJWkVPRl9JTlQpCmNoZWNrX3R5cGVfc2l6ZSgiX19pbnQ2NCIgIFNJWkVPRl9fX0lOVDY0KQpjaGVja190eXBlX3NpemUoImxvbmcgZG91YmxlIiAgU0laRU9GX0xPTkdfRE9VQkxFKQpjaGVja190eXBlX3NpemUoInRpbWVfdCIgIFNJWkVPRl9USU1FX1QpCmlmKE5PVCBIQVZFX1NJWkVPRl9TU0laRV9UKQogIGlmKFNJWkVPRl9MT05HIEVRVUFMIFNJWkVPRl9TSVpFX1QpCiAgICBzZXQoc3NpemVfdCBsb25nKQogIGVuZGlmKFNJWkVPRl9MT05HIEVRVUFMIFNJWkVPRl9TSVpFX1QpCiAgaWYoTk9UIHNzaXplX3QgQU5EIFNJWkVPRl9fX0lOVDY0IEVRVUFMIFNJWkVPRl9TSVpFX1QpCiAgICBzZXQoc3NpemVfdCBfX2ludDY0KQogIGVuZGlmKE5PVCBzc2l6ZV90IEFORCBTSVpFT0ZfX19JTlQ2NCBFUVVBTCBTSVpFT0ZfU0laRV9UKQplbmRpZihOT1QgSEFWRV9TSVpFT0ZfU1NJWkVfVCkKCiMgRGlmZmVyZW50IHNpemVvZnMsIGV0Yy4KCiMgICAgZGVmaW5lIENVUkxfU0laRU9GX0xPTkcgICAgICAgIDQKIyAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgbG9uZyBsb25nCiMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICJsbGQiCiMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICJsbHUiCiMgICAgZGVmaW5lIENVUkxfRk9STUFUX09GRl9UICAgICAgICIlbGxkIgojICAgIGRlZmluZSBDVVJMX1NJWkVPRl9DVVJMX09GRl9UICA4CiMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgIExMCiMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVIFVMTAoKc2V0KENVUkxfU0laRU9GX0xPTkcgJHtTSVpFT0ZfTE9OR30pCgppZihTSVpFT0ZfTE9ORyBFUVVBTCA4KQogIHNldChDVVJMX1RZUEVPRl9DVVJMX09GRl9UIGxvbmcpCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgOCkKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAibGQiKQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibHUiKQogIHNldChDVVJMX0ZPUk1BVF9PRkZfVCAiJWxkIikKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCBMKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBVTCkKZW5kaWYoU0laRU9GX0xPTkcgRVFVQUwgOCkKCmlmKFNJWkVPRl9MT05HX0xPTkcgRVFVQUwgOCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAibG9uZyBsb25nIikKICBzZXQoQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCA4KQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICJsbGQiKQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibGx1IikKICBzZXQoQ1VSTF9GT1JNQVRfT0ZGX1QgIiVsbGQiKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UIExMKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBVTEwpCmVuZGlmKFNJWkVPRl9MT05HX0xPTkcgRVFVQUwgOCkKCmlmKE5PVCBDVVJMX1RZUEVPRl9DVVJMX09GRl9UKQogIHNldChDVVJMX1RZUEVPRl9DVVJMX09GRl9UICR7c3NpemVfdH0pCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgJHtTSVpFT0ZfU1NJWkVfVH0pCiAgIyBUT0RPOiBuZWVkIGFkanVzdG1lbnQgaGVyZS4KICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAibGQiKQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibHUiKQogIHNldChDVVJMX0ZPUk1BVF9PRkZfVCAiJWxkIikKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCBMKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBMVSkKZW5kaWYoTk9UIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QpCgppZihIQVZFX1NJWkVPRl9MT05HX0xPTkcpCiAgc2V0KEhBVkVfTE9OR0xPTkcgMSkKICBzZXQoSEFWRV9MTCAxKQplbmRpZihIQVZFX1NJWkVPRl9MT05HX0xPTkcpCgpmaW5kX2ZpbGUoUkFORE9NX0ZJTEUgdXJhbmRvbSAvZGV2KQptYXJrX2FzX2FkdmFuY2VkKFJBTkRPTV9GSUxFKQoKIyBDaGVjayBmb3Igc29tZSBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZAppZihIQVZFX0xJQldTMl8zMikKICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTIHdzMl8zMikKZWxzZWlmKEhBVkVfTElCU09DS0VUKQogIHNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgc29ja2V0KQplbmRpZigpCgpjaGVja19zeW1ib2xfZXhpc3RzKGJhc2VuYW1lICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfQkFTRU5BTUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoc29ja2V0ICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TT0NLRVQpCmNoZWNrX3N5bWJvbF9leGlzdHMocG9sbCAgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9QT0xMKQpjaGVja19zeW1ib2xfZXhpc3RzKHNlbGVjdCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VMRUNUKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmR1cCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSRFVQKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cnN0ciAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSU1RSKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cnRva19yICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSVE9LX1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyZnRpbWUgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJGVElNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyh1bmFtZSAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1VOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmNhc2VjbXAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSQ0FTRUNNUCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJpY21wICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUklDTVApCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyY21waSAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJDTVBJKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cm5jbXBpICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSTkNNUEkpCmNoZWNrX3N5bWJvbF9leGlzdHMoYWxhcm0gICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9BTEFSTSkKaWYoTk9UIEhBVkVfU1RSTkNNUEkpCiAgc2V0KEhBVkVfU1RSQ01QSSkKZW5kaWYoTk9UIEhBVkVfU1RSTkNNUEkpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0aG9zdGJ5YWRkciAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRIT1NUQllBRERSKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldGhvc3RieWFkZHJfciAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRIT1NUQllBRERSX1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0dGltZW9mZGF5ICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRUSU1FT0ZEQVkpCmNoZWNrX3N5bWJvbF9leGlzdHMoaW5ldF9hZGRyICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JTkVUX0FERFIpCmNoZWNrX3N5bWJvbF9leGlzdHMoaW5ldF9udG9hICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JTkVUX05UT0EpCmNoZWNrX3N5bWJvbF9leGlzdHMoaW5ldF9udG9hX3IgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JTkVUX05UT0FfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyh0Y3NldGF0dHIgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1RDU0VUQVRUUikKY2hlY2tfc3ltYm9sX2V4aXN0cyh0Y2dldGF0dHIgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1RDR0VUQVRUUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhwZXJyb3IgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1BFUlJPUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhjbG9zZXNvY2tldCAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0NMT1NFU09DS0VUKQpjaGVja19zeW1ib2xfZXhpc3RzKHNldHZidWYgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VUVkJVRikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWdzZXRqbXAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NJR1NFVEpNUCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRwYXNzX3IgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVFBBU1NfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJsY2F0ICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkxDQVQpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0cHd1aWQgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRQV1VJRCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRldWlkICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVEVVSUQpCmNoZWNrX3N5bWJvbF9leGlzdHModXRpbWUgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9VVElNRSkKaWYoQ01BS0VfVVNFX09QRU5TU0wpCiAgY2hlY2tfc3ltYm9sX2V4aXN0cyhSQU5EX3N0YXR1cyAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1JBTkRfU1RBVFVTKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoUkFORF9zY3JlZW4gICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9SQU5EX1NDUkVFTikKICBjaGVja19zeW1ib2xfZXhpc3RzKFJBTkRfZWdkICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUkFORF9FR0QpCiAgY2hlY2tfc3ltYm9sX2V4aXN0cyhDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSAiJHtDVVJMX0lOQ0xVREVTfSIKICAgIEhBVkVfQ1JZUFRPX0NMRUFOVVBfQUxMX0VYX0RBVEEpCiAgaWYoSEFWRV9MSUJDUllQVE8gQU5EIEhBVkVfTElCU1NMKQogICAgc2V0KFVTRV9PUEVOU1NMIDEpCiAgZW5kaWYoSEFWRV9MSUJDUllQVE8gQU5EIEhBVkVfTElCU1NMKQplbmRpZihDTUFLRV9VU0VfT1BFTlNTTCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnbXRpbWVfciAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dNVElNRV9SKQpjaGVja19zeW1ib2xfZXhpc3RzKGxvY2FsdGltZV9yICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfTE9DQUxUSU1FX1IpCgpjaGVja19zeW1ib2xfZXhpc3RzKGdldGhvc3RieW5hbWUgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRIT1NUQllOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldGhvc3RieW5hbWVfciAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRIT1NUQllOQU1FX1IpCgpjaGVja19zeW1ib2xfZXhpc3RzKHNpZ25hbCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0lHTkFMX0ZVTkMpCmNoZWNrX3N5bWJvbF9leGlzdHMoU0lHQUxSTSAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TSUdOQUxfTUFDUk8pCmlmKEhBVkVfU0lHTkFMX0ZVTkMgQU5EIEhBVkVfU0lHTkFMX01BQ1JPKQogIHNldChIQVZFX1NJR05BTCAxKQplbmRpZihIQVZFX1NJR05BTF9GVU5DIEFORCBIQVZFX1NJR05BTF9NQUNSTykKY2hlY2tfc3ltYm9sX2V4aXN0cyh1bmFtZSAgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9VTkFNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJ0b2xsICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJUT0xMKQpjaGVja19zeW1ib2xfZXhpc3RzKF9zdHJ0b2k2NCAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX19TVFJUT0k2NCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJlcnJvcl9yICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJFUlJPUl9SKQpjaGVja19zeW1ib2xfZXhpc3RzKHNpZ2ludGVycnVwdCAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NJR0lOVEVSUlVQVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhwZXJyb3IgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9QRVJST1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoZm9yayAgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRk9SSykKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRhZGRyaW5mbyAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRBRERSSU5GTykKY2hlY2tfc3ltYm9sX2V4aXN0cyhmcmVlYWRkcmluZm8gICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9GUkVFQUREUklORk8pCmNoZWNrX3N5bWJvbF9leGlzdHMoZnJlZWlmYWRkcnMgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRlJFRUlGQUREUlMpCmNoZWNrX3N5bWJvbF9leGlzdHMocGlwZSAgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUElQRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhmdHJ1bmNhdGUgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9GVFJVTkNBVEUpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0cHJvdG9ieW5hbWUgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUUFJPVE9CWU5BTUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0cmxpbWl0ICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUUkxJTUlUKQpjaGVja19zeW1ib2xfZXhpc3RzKGlkbl9mcmVlICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0lETl9GUkVFKQpjaGVja19zeW1ib2xfZXhpc3RzKGlkbmFfc3RyZXJyb3IgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0lETkFfU1RSRVJST1IpCmNoZWNrX3N5bWJvbF9leGlzdHModGxkX3N0cmVycm9yICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVExEX1NUUkVSUk9SKQpjaGVja19zeW1ib2xfZXhpc3RzKHNldGxvY2FsZSAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFVExPQ0FMRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZXRybGltaXQgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TRVRSTElNSVQpCmNoZWNrX3N5bWJvbF9leGlzdHMoZmNudGwgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRkNOVEwpCmNoZWNrX3N5bWJvbF9leGlzdHMoaW9jdGwgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU9DVEwpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2V0c29ja29wdCAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VUU09DS09QVCkKCiMgc3ltYm9sIGV4aXN0cyBpbiB3aW4zMiwgYnV0IGZ1bmN0aW9uIGRvZXMgbm90LgpjaGVja19mdW5jdGlvbl9leGlzdHMoaW5ldF9wdG9uIEhBVkVfSU5FVF9QVE9OKQoKIyBzaWdhY3Rpb24gYW5kIHNpZ3NldGptcCBhcmUgc3BlY2lhbC4gVXNlIHNwZWNpYWwgbWVjaGFuaXNtIGZvcgojIGRldGVjdGluZyB0aG9zZSwgYnV0IG9ubHkgaWYgcHJldmlvdXMgYXR0ZW1wdCBmYWlsZWQuCmlmKEhBVkVfU0lHTkFMX0gpCiAgY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWdhY3Rpb24gInNpZ25hbC5oIiBIQVZFX1NJR0FDVElPTikKZW5kaWYoSEFWRV9TSUdOQUxfSCkKCmlmKE5PVCBIQVZFX1NJR1NFVEpNUCkKICBpZihIQVZFX1NFVEpNUF9IKQogICAgY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWdzZXRqbXAgInNldGptcC5oIiBIQVZFX01BQ1JPX1NJR1NFVEpNUCkKICAgIGlmKEhBVkVfTUFDUk9fU0lHU0VUSk1QKQogICAgICBzZXQoSEFWRV9TSUdTRVRKTVAgMSkKICAgIGVuZGlmKEhBVkVfTUFDUk9fU0lHU0VUSk1QKQogIGVuZGlmKEhBVkVfU0VUSk1QX0gpCmVuZGlmKE5PVCBIQVZFX1NJR1NFVEpNUCkKCiMgSWYgdGhlcmUgaXMgbm8gc3RyaWNtcCgpLCBkbyBub3QgYWxsb3cgTERBUCB0byBwYXJzZSBVUkxzCmlmKE5PVCBIQVZFX1NUUklDTVApCiAgc2V0KEhBVkVfTERBUF9VUkxfUEFSU0UgMSkKZW5kaWYoTk9UIEhBVkVfU1RSSUNNUCkKCiMgRG8gY3VybCBzcGVjaWZpYyB0ZXN0cwpmb3JlYWNoKENVUkxfVEVTVAogICAgSEFWRV9GQ05UTF9PX05PTkJMT0NLCiAgICBIQVZFX0lPQ1RMU09DS0VUCiAgICBIQVZFX0lPQ1RMU09DS0VUX0NBTUVMCiAgICBIQVZFX0lPQ1RMU09DS0VUX0NBTUVMX0ZJT05CSU8KICAgIEhBVkVfSU9DVExTT0NLRVRfRklPTkJJTwogICAgSEFWRV9JT0NUTF9GSU9OQklPCiAgICBIQVZFX0lPQ1RMX1NJT0NHSUZBRERSCiAgICBIQVZFX1NFVFNPQ0tPUFRfU09fTk9OQkxPQ0sKICAgIEhBVkVfU09DS0FERFJfSU42X1NJTjZfU0NPUEVfSUQKICAgIFRJTUVfV0lUSF9TWVNfVElNRQogICAgSEFWRV9PX05PTkJMT0NLCiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl81CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl83CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl84CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl81X1JFRU5UUkFOVAogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfN19SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzhfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl81CiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl82CiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zX1JFRU5UUkFOVAogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNV9SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzZfUkVFTlRSQU5UCiAgICBIQVZFX1NPQ0tMRU5fVAogICAgSEFWRV9JTl9BRERSX1QKICAgIEhBVkVfQk9PTF9UCiAgICBTVERDX0hFQURFUlMKICAgIFJFVFNJR1RZUEVfVEVTVAogICAgSEFWRV9JTkVUX05UT0FfUl9ERUNMCiAgICBIQVZFX0lORVRfTlRPQV9SX0RFQ0xfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEFERFJJTkZPCiAgICBIQVZFX0ZJTEVfT0ZGU0VUX0JJVFMKICAgICkKICBjdXJsX2ludGVybmFsX3Rlc3QoJHtDVVJMX1RFU1R9KQplbmRmb3JlYWNoKENVUkxfVEVTVCkKaWYoSEFWRV9GSUxFX09GRlNFVF9CSVRTKQogIHNldChfRklMRV9PRkZTRVRfQklUUyA2NCkKZW5kaWYoSEFWRV9GSUxFX09GRlNFVF9CSVRTKQpmb3JlYWNoKENVUkxfVEVTVAogICAgSEFWRV9HTElCQ19TVFJFUlJPUl9SCiAgICBIQVZFX1BPU0lYX1NUUkVSUk9SX1IKICAgICkKICBjdXJsX2ludGVybmFsX3Rlc3RfcnVuKCR7Q1VSTF9URVNUfSkKZW5kZm9yZWFjaChDVVJMX1RFU1QpCgojIENoZWNrIGZvciByZWVudHJhbnQKZm9yZWFjaChDVVJMX1RFU1QKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzUKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzcKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzgKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzMKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzUKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzYKICAgIEhBVkVfSU5FVF9OVE9BX1JfREVDTF9SRUVOVFJBTlQpCiAgaWYoTk9UICR7Q1VSTF9URVNUfSkKICAgIGlmKCR7Q1VSTF9URVNUfV9SRUVOVFJBTlQpCiAgICAgIHNldChORUVEX1JFRU5UUkFOVCAxKQogICAgZW5kaWYoJHtDVVJMX1RFU1R9X1JFRU5UUkFOVCkKICBlbmRpZihOT1QgJHtDVVJMX1RFU1R9KQplbmRmb3JlYWNoKENVUkxfVEVTVCkKCmlmKE5FRURfUkVFTlRSQU5UKQogIGZvcmVhY2goQ1VSTF9URVNUCiAgICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzUKICAgICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNwogICAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl84CiAgICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzMKICAgICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNQogICAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl82KQogICAgc2V0KCR7Q1VSTF9URVNUfSAwKQogICAgaWYoJHtDVVJMX1RFU1R9X1JFRU5UUkFOVCkKICAgICAgc2V0KCR7Q1VSTF9URVNUfSAxKQogICAgZW5kaWYoJHtDVVJMX1RFU1R9X1JFRU5UUkFOVCkKICBlbmRmb3JlYWNoKENVUkxfVEVTVCkKZW5kaWYoTkVFRF9SRUVOVFJBTlQpCgppZihIQVZFX0lORVRfTlRPQV9SX0RFQ0xfUkVFTlRSQU5UKQogIHNldChIQVZFX0lORVRfTlRPQV9SX0RFQ0wgMSkKICBzZXQoTkVFRF9SRUVOVFJBTlQgMSkKZW5kaWYoSEFWRV9JTkVUX05UT0FfUl9ERUNMX1JFRU5UUkFOVCkKCiMgU29tZSBvdGhlciBtaW5vciB0ZXN0cwoKaWYoTk9UIEhBVkVfSU5fQUREUl9UKQogIHNldChpbl9hZGRyX3QgInVuc2lnbmVkIGxvbmciKQplbmRpZihOT1QgSEFWRV9JTl9BRERSX1QpCgojIEZpeCBsaWJ6IC8gemxpYi5oCgppZihOT1QgQ1VSTF9TUEVDSUFMX0xJQlopCiAgaWYoTk9UIEhBVkVfTElCWikKICAgIHNldChIQVZFX1pMSUJfSCAwKQogIGVuZGlmKE5PVCBIQVZFX0xJQlopCgogIGlmKE5PVCBIQVZFX1pMSUJfSCkKICAgIHNldChIQVZFX0xJQlogMCkKICBlbmRpZihOT1QgSEFWRV9aTElCX0gpCmVuZGlmKE5PVCBDVVJMX1NQRUNJQUxfTElCWikKCmlmKF9GSUxFX09GRlNFVF9CSVRTKQogIHNldChfRklMRV9PRkZTRVRfQklUUyA2NCkKZW5kaWYoX0ZJTEVfT0ZGU0VUX0JJVFMpCnNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAiLURfRklMRV9PRkZTRVRfQklUUz02NCIpCnNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY3VybC9jdXJsLmgiKQpjaGVja190eXBlX3NpemUoImN1cmxfb2ZmX3QiIFNJWkVPRl9DVVJMX09GRl9UKQpzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUykKc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTKQoKCiMgQ2hlY2sgZm9yIG5vbmJsb2NraW5nCnNldChIQVZFX0RJU0FCTEVEX05PTkJMT0NLSU5HIDEpCmlmKEhBVkVfRklPTkJJTyBPUgogICAgSEFWRV9JT0NUTFNPQ0tFVCBPUgogICAgSEFWRV9JT0NUTFNPQ0tFVF9DQVNFIE9SCiAgICBIQVZFX09fTk9OQkxPQ0spCiAgc2V0KEhBVkVfRElTQUJMRURfTk9OQkxPQ0tJTkcpCmVuZGlmKEhBVkVfRklPTkJJTyBPUgogIEhBVkVfSU9DVExTT0NLRVQgT1IKICBIQVZFX0lPQ1RMU09DS0VUX0NBU0UgT1IKICBIQVZFX09fTk9OQkxPQ0spCgppZihSRVRTSUdUWVBFX1RFU1QpCiAgc2V0KFJFVFNJR1RZUEUgdm9pZCkKZWxzZShSRVRTSUdUWVBFX1RFU1QpCiAgc2V0KFJFVFNJR1RZUEUgaW50KQplbmRpZihSRVRTSUdUWVBFX1RFU1QpCgppZihDTUFLRV9DT01QSUxFUl9JU19HTlVDQyBBTkQgQVBQTEUpCiAgaW5jbHVkZShDaGVja0NDb21waWxlckZsYWcpCiAgY2hlY2tfY19jb21waWxlcl9mbGFnKC1Xbm8tbG9uZy1kb3VibGUgSEFWRV9DX0ZMQUdfV25vX2xvbmdfZG91YmxlKQogIGlmKEhBVkVfQ19GTEFHX1dub19sb25nX2RvdWJsZSkKICAgICMgVGhlIE1hYyB2ZXJzaW9uIG9mIEdDQyB3YXJucyBhYm91dCB1c2Ugb2YgbG9uZyBkb3VibGUuICBEaXNhYmxlIGl0LgogICAgZ2V0X3NvdXJjZV9maWxlX3Byb3BlcnR5KE1QUklOVEZfQ09NUElMRV9GTEFHUyBtcHJpbnRmLmMgQ09NUElMRV9GTEFHUykKICAgIGlmKE1QUklOVEZfQ09NUElMRV9GTEFHUykKICAgICAgc2V0KE1QUklOVEZfQ09NUElMRV9GTEFHUyAiJHtNUFJJTlRGX0NPTVBJTEVfRkxBR1N9IC1Xbm8tbG9uZy1kb3VibGUiKQogICAgZWxzZShNUFJJTlRGX0NPTVBJTEVfRkxBR1MpCiAgICAgIHNldChNUFJJTlRGX0NPTVBJTEVfRkxBR1MgIi1Xbm8tbG9uZy1kb3VibGUiKQogICAgZW5kaWYoTVBSSU5URl9DT01QSUxFX0ZMQUdTKQogICAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKG1wcmludGYuYyBQUk9QRVJUSUVTCiAgICAgIENPTVBJTEVfRkxBR1MgJHtNUFJJTlRGX0NPTVBJTEVfRkxBR1N9KQogIGVuZGlmKEhBVkVfQ19GTEFHX1dub19sb25nX2RvdWJsZSkKZW5kaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ0MgQU5EIEFQUExFKQoKaWYoSEFWRV9TT0NLTEVOX1QpCiAgc2V0KENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UICJzb2NrbGVuX3QiKQogIGlmKFdJTjMyKQogICAgc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMgIndpbnNvY2syLmg7d3MydGNwaXAuaCIpCiAgZWxzZWlmKEhBVkVfU1lTX1NPQ0tFVF9IKQogICAgc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMgInN5cy9zb2NrZXQuaCIpCiAgZW5kaWYoKQogIGNoZWNrX3R5cGVfc2l6ZSgic29ja2xlbl90IiBDVVJMX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCkKICBzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUykKICBpZihOT1QgSEFWRV9DVVJMX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCkKICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IKICAgICAiQ2hlY2sgZm9yIHNpemVvZiBzb2NrbGVuX3QgZmFpbGVkLCBzZWUgQ01ha2VGaWxlcy9DTWFrZXJyb3IubG9nIikKICBlbmRpZigpCmVsc2UoKQogIHNldChDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQpCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfU09DS0xFTl9UICR7U0laRU9GX0lOVH0pCmVuZGlmKCkKCiMgVE9ETyB0ZXN0IHdoaWNoIG9mIHRoZXNlIGhlYWRlcnMgYXJlIHJlcXVpcmVkIGZvciB0aGUgdHlwZWRlZnMgdXNlZCBpbiBjdXJsYnVpbGQuaAppZihXSU4zMikKICBzZXQoQ1VSTF9QVUxMX1dTMlRDUElQX0ggJHtIQVZFX1dTMlRDUElQX0h9KQplbHNlKCkKICBzZXQoQ1VSTF9QVUxMX1NZU19UWVBFU19IICR7SEFWRV9TWVNfVFlQRVNfSH0pCiAgc2V0KENVUkxfUFVMTF9TWVNfU09DS0VUX0ggJHtIQVZFX1NZU19TT0NLRVRfSH0pCiAgc2V0KENVUkxfUFVMTF9TWVNfUE9MTF9IICR7SEFWRV9TWVNfUE9MTF9IfSkKZW5kaWYoKQpzZXQoQ1VSTF9QVUxMX1NURElOVF9IICR7SEFWRV9TVERJTlRfSH0pCnNldChDVVJMX1BVTExfSU5UVFlQRVNfSCAke0hBVkVfSU5UVFlQRVNfSH0pCgppbmNsdWRlKENNYWtlL090aGVyVGVzdHMuY21ha2UpCgphZGRfZGVmaW5pdGlvbnMoLURIQVZFX0NPTkZJR19IKQoKIyBGb3Igd2luZG93cywgZG8gbm90IGFsbG93IHRoZSBjb21waWxlciB0byB1c2UgZGVmYXVsdCB0YXJnZXQgKFZpc3RhKS4KaWYoV0lOMzIpCiAgYWRkX2RlZmluaXRpb25zKC1EX1dJTjMyX1dJTk5UPTB4MDUwMSkKZW5kaWYoV0lOMzIpCgppZihNU1ZDKQogIGFkZF9kZWZpbml0aW9ucygtRF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAtRF9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEUpCmVuZGlmKE1TVkMpCgojIFVnbHkgKGJ1dCBmdW5jdGlvbmFsKSB3YXkgdG8gaW5jbHVkZSAiTWFrZWZpbGUuaW5jIiBieSB0cmFuc2Zvcm1pbmcgaXQgKD0gcmVnZW5lcmF0ZSBpdCkuCmZ1bmN0aW9uKFRSQU5TRk9STV9NQUtFRklMRV9JTkMgSU5QVVRfRklMRSBPVVRQVVRfRklMRSkKICBmaWxlKFJFQUQgJHtJTlBVVF9GSUxFfSBNQUtFRklMRV9JTkNfVEVYVCkKICBzdHJpbmcoUkVQTEFDRSAiJCh0b3Bfc3JjZGlyKSIgICAiXCR7Q1VSTF9TT1VSQ0VfRElSfSIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pCiAgc3RyaW5nKFJFUExBQ0UgIiQodG9wX2J1aWxkZGlyKSIgIlwke0NVUkxfQklOQVJZX0RJUn0iIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KQoKICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiXFxcXFxuIiAipyGnIiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkKICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiKFthLXpBLVpfXVthLXpBLVowLTlfXSopW1x0IF0qPVtcdCBdKihbXlxuXSopIiAiU0VUKFxcMSBcXDIpIiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkKICBzdHJpbmcoUkVQTEFDRSAipyGnIiAiXG4iIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KQoKICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiXFwkXFwoKFthLXpBLVpfXVthLXpBLVowLTlfXSopXFwpIiAiXCR7XFwxfSIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pICAgICMgUmVwbGFjZSAkKCkgd2l0aCAke30KICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiQChbYS16QS1aX11bYS16QS1aMC05X10qKUAiICJcJHtcXDF9IiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkgICAgIyBSZXBsYWNlIEBAIHdpdGggJHt9LCBldmVuIGlmIHRoYXQgbWF5IG5vdCBiZSByZWFkIGJ5IENNYWtlIHNjcmlwdHMuCiAgZmlsZShXUklURSAke09VVFBVVF9GSUxFfSAke01BS0VGSUxFX0lOQ19URVhUfSkKCmVuZGZ1bmN0aW9uKCkKCmFkZF9zdWJkaXJlY3RvcnkobGliKQppZihCVUlMRF9DVVJMX0VYRSkKICBhZGRfc3ViZGlyZWN0b3J5KHNyYykKZW5kaWYoKQoKaW5jbHVkZShDVGVzdCkKaWYoQlVJTERfVEVTVElORykKICBhZGRfc3ViZGlyZWN0b3J5KHRlc3RzKQplbmRpZigpCgojIFRPRE8gc3VwcG9ydCBHTlVUTFMsIE5TUywgUE9MQVJTU0wsIEFYVExTLCBDWUFTU0wsIFdJTlNTTCwgREFSV0lOU1NMCmlmKFVTRV9PUEVOU1NMKQogIHNldChTU0xfRU5BQkxFRCAxKQplbmRpZigpCgojIEhlbHBlciB0byBwb3B1bGF0ZSBhIGxpc3QgKF9pdGVtcykgd2l0aCBhIGxhYmVsIHdoZW4gY29uZGl0aW9ucyAodGhlIHJlbWFpbmluZwojIGFyZ3MpIGFyZSBzYXRpc2ZpZWQKZnVuY3Rpb24oX2FkZF9pZiBsYWJlbCkKICAjIFRPRE8gbmVlZCB0byBkaXNhYmxlIHBvbGljeSBDTVAwMDU0IChDTWFrZSAzLjEpIHRvIGFsbG93IHRoaXMgaW5kaXJlY3Rpb24KICBpZigke0FSR059KQogICAgc2V0KF9pdGVtcyAke19pdGVtc30gIiR7bGFiZWx9IiBQQVJFTlRfU0NPUEUpCiAgZW5kaWYoKQplbmRmdW5jdGlvbigpCgojIENsZWFyIGxpc3QgYW5kIHRyeSB0byBkZXRlY3QgYXZhaWxhYmxlIGZlYXR1cmVzCnNldChfaXRlbXMpCl9hZGRfaWYoIldpblNTTCIgICAgICAgIFNTTF9FTkFCTEVEIEFORCBVU0VfV0lORE9XU19TU1BJKQpfYWRkX2lmKCJPcGVuU1NMIiAgICAgICBTU0xfRU5BQkxFRCBBTkQgVVNFX09QRU5TU0wpCl9hZGRfaWYoIklQdjYiICAgICAgICAgIEVOQUJMRV9JUFY2KQpfYWRkX2lmKCJ1bml4LXNvY2tldHMiICBVU0VfVU5JWF9TT0NLRVRTKQpfYWRkX2lmKCJsaWJ6IiAgICAgICAgICBIQVZFX0xJQlopCl9hZGRfaWYoIkFzeW5jaEROUyIgICAgIFVTRV9BUkVTIE9SIFVTRV9USFJFQURTX1BPU0lYKQpfYWRkX2lmKCJJRE4iICAgICAgICAgICBIQVZFX0xJQklETikKIyBUT0RPIFNTUDEgKFdpblNTTCkgY2hlY2sgaXMgbWlzc2luZwpfYWRkX2lmKCJTU1BJIiAgICAgICAgICBVU0VfV0lORE9XU19TU1BJKQpfYWRkX2lmKCJHU1MtQVBJIiAgICAgICBIQVZFX0dTU0FQSSkKIyBUT0RPIFNTUDEgbWlzc2luZyBmb3IgU1BORUdPCl9hZGRfaWYoIlNQTkVHTyIgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfQ1JZUFRPX0FVVEggQU5ECiAgICAgICAgICAgICAgICAgICAgICAgIChIQVZFX0dTU0FQSSBPUiBVU0VfV0lORE9XU19TU1BJKSkKX2FkZF9pZigiS2VyYmVyb3MiICAgICAgTk9UIENVUkxfRElTQUJMRV9DUllQVE9fQVVUSCBBTkQKICAgICAgICAgICAgICAgICAgICAgICAgKEhBVkVfR1NTQVBJIE9SIFVTRV9XSU5ET1dTX1NTUEkpKQojIE5UTE0gc3VwcG9ydCByZXF1aXJlcyBjcnlwdG8gZnVuY3Rpb24gYWRhcHRpb25zIGZyb20gdmFyaW91cyBTU0wgbGlicwojIFRPRE8gYWx0ZXJuYXRpdmUgU1NMIGxpYnMgdGVzdHMgZm9yIFNTUDEsIEdOVVRMUywgTlNTLCBEQVJXSU5TU0wKaWYoTk9UIENVUkxfRElTQUJMRV9DUllQVE9fQVVUSCBBTkQgKFVTRV9PUEVOU1NMIE9SCiAgIFVTRV9XSU5ET1dTX1NTUEkgT1IgR05VVExTX0VOQUJMRUQgT1IgTlNTX0VOQUJMRUQgT1IgREFSV0lOU1NMX0VOQUJMRUQpKQogIF9hZGRfaWYoIk5UTE0iICAgICAgICAxKQogICMgVE9ETyBtaXNzaW5nIG9wdGlvbiAoYXV0b2NvbmY6IC0tZW5hYmxlLW50bG0td2IpCiAgX2FkZF9pZigiTlRMTV9XQiIgICAgIE5PVCBDVVJMX0RJU0FCTEVfSFRUUCBBTkQgTlRMTV9XQl9FTkFCTEVEKQplbmRpZigpCiMgVE9ETyBtaXNzaW5nIG9wdGlvbiAoLS1lbmFibGUtdGxzLXNycCksIGRlcGVuZHMgb24gR05VVExTX1NSUC9PUEVOU1NMX1NSUApfYWRkX2lmKCJUTFMtU1JQIiAgICAgICBVU0VfVExTX1NSUCkKIyBUT0RPIG9wdGlvbiAtLXdpdGgtbmdodHRwMiB0ZXN0cyBmb3IgbmdodHRwMiBsaWIgYW5kIG5naHR0cDIvbmdodHRwMi5oIGhlYWRlcgpfYWRkX2lmKCJIVFRQMiIgICAgICAgICBVU0VfTkdIVFRQMikKc3RyaW5nKFJFUExBQ0UgIjsiICIgIiBTVVBQT1JUX0ZFQVRVUkVTICIke19pdGVtc30iKQptZXNzYWdlKFNUQVRVUyAiRW5hYmxlZCBmZWF0dXJlczogJHtTVVBQT1JUX0ZFQVRVUkVTfSIpCgojIENsZWFyIGxpc3QgYW5kIHRyeSB0byBkZXRlY3QgYXZhaWxhYmxlIHByb3RvY29scwpzZXQoX2l0ZW1zKQpfYWRkX2lmKCJIVFRQIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0hUVFApCl9hZGRfaWYoIkhUVFBTIiAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfSFRUUCBBTkQgU1NMX0VOQUJMRUQpCl9hZGRfaWYoIkZUUCIgICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfRlRQKQpfYWRkX2lmKCJGVFBTIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0ZUUCBBTkQgU1NMX0VOQUJMRUQpCl9hZGRfaWYoIkZJTEUiICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfRklMRSkKX2FkZF9pZigiVEVMTkVUIiAgICAgICAgTk9UIENVUkxfRElTQUJMRV9URUxORVQpCl9hZGRfaWYoIkxEQVAiICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfTERBUCkKIyBDVVJMX0RJU0FCTEVfTERBUCBpbXBsaWVzIENVUkxfRElTQUJMRV9MREFQUwojIFRPRE8gY2hlY2sgSEFWRV9MREFQX1NTTCAoaW4gYXV0b2NvbmYgdGhpcyBpcyBlbmFibGVkIHdpdGggLS1lbmFibGUtbGRhcHMpCl9hZGRfaWYoIkxEQVBTIiAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfTERBUFMgQU5ECiAgICAgICAgICAgICAgICAgICAgICAgICgoVVNFX09QRU5MREFQIEFORCBTU0xfRU5BQkxFRCkgT1IKICAgICAgICAgICAgICAgICAgICAgICAgKE5PVCBVU0VfT1BFTkxEQVAgQU5EIEhBVkVfTERBUF9TU0wpKSkKX2FkZF9pZigiRElDVCIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9ESUNUKQpfYWRkX2lmKCJURlRQIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX1RGVFApCl9hZGRfaWYoIkdPUEhFUiIgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfR09QSEVSKQpfYWRkX2lmKCJQT1AzIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX1BPUDMpCl9hZGRfaWYoIlBPUDNTIiAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfUE9QMyBBTkQgU1NMX0VOQUJMRUQpCl9hZGRfaWYoIklNQVAiICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfSU1BUCkKX2FkZF9pZigiSU1BUFMiICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9JTUFQIEFORCBTU0xfRU5BQkxFRCkKX2FkZF9pZigiU01UUCIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9TTVRQKQpfYWRkX2lmKCJTTVRQUyIgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX1NNVFAgQU5EIFNTTF9FTkFCTEVEKQpfYWRkX2lmKCJTQ1AiICAgICAgICAgICBVU0VfTElCU1NIMikKX2FkZF9pZigiU0ZUUCIgICAgICAgICAgVVNFX0xJQlNTSDIpCl9hZGRfaWYoIlJUU1AiICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfUlRTUCkKX2FkZF9pZigiUlRNUCIgICAgICAgICAgVVNFX0xJQlJUTVApCmxpc3QoU09SVCBfaXRlbXMpCnN0cmluZyhSRVBMQUNFICI7IiAiICIgU1VQUE9SVF9QUk9UT0NPTFMgIiR7X2l0ZW1zfSIpCm1lc3NhZ2UoU1RBVFVTICJFbmFibGVkIHByb3RvY29sczogJHtTVVBQT1JUX1BST1RPQ09MU30iKQoKIyBjdXJsLWNvbmZpZyBuZWVkcyB0aGUgZm9sbG93aW5nIG9wdGlvbnMgdG8gYmUgc2V0LgpzZXQoQ0MgICAgICAgICAgICAgICAgICAgICAgIiR7Q01BS0VfQ19DT01QSUxFUn0iKQojIFRPRE8gcHJvYmFibHkgcHV0IGEgLUQuLi4gb3B0aW9ucyBoZXJlPwpzZXQoQ09ORklHVVJFX09QVElPTlMgICAgICAgIiIpCiMgVE9ETyB3aGVuIHRvIHNldCAiLURDVVJMX1NUQVRJQ0xJQiIgZm9yIENQUEZMQUdfQ1VSTF9TVEFUSUNMSUI/CnNldChDUFBGTEFHX0NVUkxfU1RBVElDTElCICAiIikKIyBUT0RPIG5lZWQgdG8gc2V0IHRoaXMgKHNlZSBDVVJMX0NIRUNLX0NBX0JVTkRMRSBpbiBhY2luY2x1ZGUubTQpCnNldChDVVJMX0NBX0JVTkRMRSAgICAgICAgICAiIikKc2V0KENVUkxWRVJTSU9OICAgICAgICAgICAgICIke0NVUkxfVkVSU0lPTn0iKQpzZXQoRU5BQkxFX1NIQVJFRCAgICAgICAgICAgInllcyIpCmlmKENVUkxfU1RBVElDTElCKQogICMgQnJva2VuOiBMSUJDVVJMX0xJQlMgYmVsb3c7IC5hIGxpYiBpcyBub3QgYnVpbHQKICBtZXNzYWdlKFdBUk5JTkcgIlN0YXRpYyBsaW5raW5nIGlzIGJyb2tlbiEiKQogIHNldChFTkFCTEVfU1RBVElDICAgICAgICAgIm5vIikKZWxzZSgpCiAgc2V0KEVOQUJMRV9TVEFUSUMgICAgICAgICAibm8iKQplbmRpZigpCnNldChleGVjX3ByZWZpeCAgICAgICAgICAgICAiXCR7cHJlZml4fSIpCnNldChpbmNsdWRlZGlyICAgICAgICAgICAgICAiXCR7cHJlZml4fS9pbmNsdWRlIikKc2V0KExERkxBR1MgICAgICAgICAgICAgICAgICIke0NNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1N9IikKc2V0KExJQkNVUkxfTElCUyAgICAgICAgICAgICIiKQpzZXQobGliZGlyICAgICAgICAgICAgICAgICAgIiR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9L2xpYiIpCiMgVE9ETyBDVVJMX0xJQlMgYWxzbyBjb250YWlucyBhYnNvbHV0ZSBwYXRocyB3aGljaCBkb24ndCB3b3JrIHdpdGggc3RhdGljIC1sLi4uCmZvcmVhY2goX2xpYiAke0NNQUtFX0NfSU1QTElDSVRfTElOS19MSUJSQVJJRVN9ICR7Q1VSTF9MSUJTfSkKICBzZXQoTElCQ1VSTF9MSUJTICAgICAgICAgICIke0xJQkNVUkxfTElCU30gLWwke19saWJ9IikKZW5kZm9yZWFjaCgpCiMgImEiIChMaW51eCkgb3IgImxpYiIgKFdpbmRvd3MpCnN0cmluZyhSRVBMQUNFICIuIiAiIiBsaWJleHQgIiR7Q01BS0VfU1RBVElDX0xJQlJBUllfU1VGRklYfSIpCnNldChwcmVmaXggICAgICAgICAgICAgICAgICAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0iKQojIFNldCB0aGlzIHRvICJ5ZXMiIHRvIGFwcGVuZCBhbGwgbGlicmFyaWVzIG9uIHdoaWNoIC1sY3VybCBpcyBkZXBlbmRlbnQKc2V0KFJFUVVJUkVfTElCX0RFUFMgICAgICAgICJubyIpCiMgU1VQUE9SVF9GRUFUVVJFUwojIFNVUFBPUlRfUFJPVE9DT0xTCnNldChWRVJTSU9OTlVNICAgICAgICAgICAgICAiJHtDVVJMX1ZFUlNJT05fTlVNfSIpCgojIEZpbmFsbHkgZ2VuZXJhdGUgYSAiY3VybC1jb25maWciIG1hdGNoaW5nIHRoaXMgY29uZmlnCmNvbmZpZ3VyZV9maWxlKCIke0NVUkxfU09VUkNFX0RJUn0vY3VybC1jb25maWcuaW4iCiAgICAgICAgICAgICAgICIke0NVUkxfQklOQVJZX0RJUn0vY3VybC1jb25maWciIEBPTkxZKQppbnN0YWxsKEZJTEVTICIke0NVUkxfQklOQVJZX0RJUn0vY3VybC1jb25maWciCiAgICAgICAgREVTVElOQVRJT04gYmluCiAgICAgICAgUEVSTUlTU0lPTlMKICAgICAgICAgIE9XTkVSX1JFQUQgT1dORVJfV1JJVEUgT1dORVJfRVhFQ1VURQogICAgICAgICAgR1JPVVBfUkVBRCBHUk9VUF9FWEVDVVRFCiAgICAgICAgICBXT1JMRF9SRUFEIFdPUkxEX0VYRUNVVEUpCgojIEZpbmFsbHkgZ2VuZXJhdGUgYSBwa2ctY29uZmlnIGZpbGUgbWF0Y2hpbmcgdGhpcyBjb25maWcKY29uZmlndXJlX2ZpbGUoIiR7Q1VSTF9TT1VSQ0VfRElSfS9saWJjdXJsLnBjLmluIgogICAgICAgICAgICAgICAiJHtDVVJMX0JJTkFSWV9ESVJ9L2xpYmN1cmwucGMiIEBPTkxZKQppbnN0YWxsKEZJTEVTICIke0NVUkxfQklOQVJZX0RJUn0vbGliY3VybC5wYyIKICAgICAgICBERVNUSU5BVElPTiBsaWIvcGtnY29uZmlnKQoKIyBUaGlzIG5lZWRzIHRvIGJlIHJ1biB2ZXJ5IGxhc3Qgc28gb3RoZXIgcGFydHMgb2YgdGhlIHNjcmlwdHMgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoaXMuCmlmKE5PVCBDVVJMX0NPTkZJR19IQVNfQkVFTl9SVU5fQkVGT1JFKQogIHNldChDVVJMX0NPTkZJR19IQVNfQkVFTl9SVU5fQkVGT1JFIDEgQ0FDSEUgSU5URVJOQUwgIkZsYWcgdG8gdHJhY2sgd2hldGhlciB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHJ1bm5pbmcgQ01ha2Ugb3IgaWYgQ01ha2UgaGFzIGJlZW4gY29uZmlndXJlZCBiZWZvcmUiKQplbmRpZigpCgojIEluc3RhbGxhdGlvbi4KIyBGaXJzdCwgaW5zdGFsbCBnZW5lcmF0ZWQgY3VybGJ1aWxkLmgKaW5zdGFsbChGSUxFUyAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2luY2x1ZGUvY3VybC9jdXJsYnVpbGQuaCIKICAgIERFU1RJTkFUSU9OIGluY2x1ZGUvY3VybCApCiMgTmV4dCwgaW5zdGFsbCBvdGhlciBoZWFkZXJzIGV4Y2x1ZGluZyBjdXJsYnVpbGQuaAppbnN0YWxsKERJUkVDVE9SWSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2luY2x1ZGUvY3VybCIKICAgIERFU1RJTkFUSU9OIGluY2x1ZGUKICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouaCIKICAgIFBBVFRFUk4gImN1cmxidWlsZC5oIiBFWENMVURFKQoKCiMgV29ya2Fyb3VuZCBmb3IgTVNWUzEwIHRvIGF2b2lkIHRoZSBEaWFsb2cgSGVsbAojIEZJWE1FOiBUaGlzIGNvdWxkIGJlIHJlbW92ZWQgd2l0aCBmdXR1cmUgdmVyc2lvbiBvZiBDTWFrZS4KaWYoTVNWQ19WRVJTSU9OIEVRVUFMIDE2MDApCiAgc2V0KENVUkxfU0xOX0ZJTEVOQU1FICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vQ1VSTC5zbG4iKQogIGlmKEVYSVNUUyAiJHtDVVJMX1NMTl9GSUxFTkFNRX0iKQogICAgZmlsZShBUFBFTkQgIiR7Q1VSTF9TTE5fRklMRU5BTUV9IiAiXG4jIFRoaXMgc2hvdWxkIGJlIHJlZ2VuZXJhdGVkIVxuIikKICBlbmRpZigpCmVuZGlmKCkK